<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Персональный блог Валерия Леонтьева &#187; Web</title>
	<atom:link href="http://valera.ws/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://valera.ws</link>
	<description>Блог для публикации интересных личных заметок о работе, жизни, событиях... Digital lifestyle, веб-программирование, администрирование серверов и другое</description>
	<lastBuildDate>Sat, 31 Dec 2011 11:52:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Как стать хорошим программистом и хорошим php-программистом в частности?</title>
		<link>http://valera.ws/2011.12.31~how-to-be-a-good-programmer/</link>
		<comments>http://valera.ws/2011.12.31~how-to-be-a-good-programmer/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 11:35:09 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[алгоритмы]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=628</guid>
		<description><![CDATA[Хочу поделиться ссылкой, по которой можно найти много полезной информации для развития себя как настоящего программиста. Ссылка на пост в белорусском сообществе программистов — dev.by. Написана человеком, который попросил дать ему совет, а потом свёл в статье резюме полученных советов. &#8230; <a href="http://valera.ws/2011.12.31~how-to-be-a-good-programmer/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-631" title="programmer at work" src="http://valera.ws/wp-content/uploads/2011/12/programmer.png" alt="" width="200" height="130" />Хочу поделиться ссылкой, по которой можно найти много полезной информации для развития себя как <strong>настоящего</strong> программиста. Ссылка на пост в белорусском сообществе программистов — dev.by. Написана человеком, который попросил дать ему совет, а потом свёл в статье резюме полученных советов. Ни автор, ни комментаторы не имеют ко мне никакого отношения. Но я готов подписаться под большинством полученный советов.</p>
<p><span id="more-628"></span></p>
<p>Ценность материала в том, что:</p>
<p>1) это хороший способ взглянуть на себя со стороны огромному числу программистов <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>, так как общая средняя квалификация этого класса программистов значительно ниже среднего по другим более серьезным языкам; взгляд со стороны поможет понять свои проблемы и найти способы их преодоления;</p>
<p>2) конкретные советы о том, что следует почитать/посмотреть.</p>
<p>Ссылка на материал: <a title="Как стать хорошим программистом и хорошим php-программистом в частности?" href="http://dev.by/blog/37028" target="_blank"><strong>Как стать хорошим программистом и хорошим php-программистом в частности?</strong></a></p>
<p><strong>А ниже позволю себе сделать частичный копипаст предложенных решений.</strong></p>
<h2>Мастерство программирования (или скорее можно назвать Основы)</h2>
<ul>
<li><a href="http://oz.by/books/more1015206.html" target="_blank">Совершенный код</a>,</li>
<li><a href="http://oz.by/books/more10109592.html" target="_blank">Чистый код</a>,</li>
<li><a href="http://oz.by/books/more105087.html" target="_blank">Рефакторинг</a>,</li>
<li><a href="http://oz.by/books/more1031721.html" target="_blank">Программист-прагматик</a>,</li>
<li><a href="http://oz.by/books/more1010353.html" target="_blank">Архитектура корпоративных программных приложений</a>,</li>
<li><a href="http://oz.by/books/more10182848.html" target="_blank">Кодеры за работой</a>.</li>
</ul>
<p>Нашел очень хорошую и исчерпывающую статью на английском: <a href="http://samizdat.mines.edu/howto/HowToBeAProgrammer.html" target="_blank">How to be a Programmer: A Short, Comprehensive, and Personal Summary</a></p>
<p>Курсы, выложенные по <a href="http://ru.wikipedia.org/wiki/MIT_OpenCourseWare" target="_blank">MIT OCW</a>:</p>
<ul>
<li><a href="http://ocw.mit.edu/courses/audio-video-courses/#electrical-engineering-and-computer-science" target="_blank">MIT Electrical Engineering and Computer Science</a></li>
</ul>
<p>Курсы Стэнфорда:</p>
<ul>
<li><a href="http://www.ml-class.org/" target="_blank">Mashine learning</a></li>
<li><a href="http://www.nlp-class.org/" target="_blank">Natural Language Processing class</a></li>
<li><a href="http://www.saas-class.org/" target="_blank">Software Engineering for Software as a Service class</a></li>
</ul>
<p>На каждом сайте внизу есть ссылки на другие курсы Стэнфорда.</p>
<h2>Алгоритмы.</h2>
<p>Как развивать:</p>
<p><a href="http://oz.by/books/more1034722.html" target="_blank">Искусство программирования</a> Кнутта — читать и выполнять задания.</p>
<p><a href="http://projecteuler.net/" target="_blank">Project Euer</a> — задания по алгоритмам, можно писать на PHP.</p>
<h2>ООП и Шаблоны проектирования</h2>
<p><a href="http://oz.by/books/more1074794.html" target="_blank">PHP: объекты, шаблоны и методики программирования</a> М. Зандстра сейчас, наверное, лучшая книга для введения в шаблоны проектирвания для PHP.</p>
<p><a href="http://shop.oreilly.com/product/9780596007126.do" target="_blank">Head First Design Patterns</a>, на русском <a href="http://oz.by/books/more10182766.html" target="_blank">Паттерны проектирования</a> — очень рекоммендуют, как очень хорошо разъясняющую книгу.</p>
<p>какие книги, методы обучения, задачи порекоммендуете?</p>
<h2>PHP основы</h2>
<p>Как развивать:</p>
<p>собственно работа по профессии и набор опыта,</p>
<p><a href="http://oz.by/books/more102159.html" target="_blank">Профессиональное PHP программирование</a> — вроде как лучшая книга по основам PHP (читать, чтобы заполнить пробелы по основам языка, начиная с типов и далее. Посмотреть, что есть из того, чего я не казался в работе, чтобы расширять кругозор.</p>
<p>Потом есть stackoverflow, там введи в поиск ~php~ и читай вопрос, давай свой ответ (про себя), потом смотри, что другие написали. Будешь по тегам смотреть заодно, что пхп-ники изучают.</p>
<h2>Javascript Основы</h2>
<p>Как развивать:</p>
<p>собственно работа по профессии и набор опыта,</p>
<p><a href="http://oz.by/books/more1011147.html" target="_blank">JavaScript. Подробное руководство. Д. Флэнаган</a> (читать и разбираться в пропущенных основах &#8211; типы, обьектная модель и др.)</p>
<p><a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742" target="_blank">JavaScript: The Good Parts</a></p>
<p><a href="http://oz.by/books/more10193164.html" target="_blank">JavaScript. Шаблоны</a></p>
<p>Источник: <a title="Как стать хорошим программистом и хорошим php-программистом в частности?" href="http://dev.by/blog/37028" target="_blank">Как стать хорошим программистом и хорошим php-программистом в частности?</a> Ни автор, ни комментаторы не имеют ко мне никакого отношения.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.12.31~how-to-be-a-good-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Идея наглядного сравнения видов хостинга</title>
		<link>http://valera.ws/2011.09.18~hosting-types-comparison/</link>
		<comments>http://valera.ws/2011.09.18~hosting-types-comparison/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 18:41:44 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Cloud]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=618</guid>
		<description><![CDATA[Пришла в голову мысль провести аналогию между присутствующими на рынке видами хостинга и чем-то бытовым. Все предложения хостинга можно разделить на 4 группы: Shared hosting (общий сервер), VPS (virtual private server — частный виртуальный сервер), Dedicated (выделенный сервер) и Cloud &#8230; <a href="http://valera.ws/2011.09.18~hosting-types-comparison/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Пришла в голову мысль провести аналогию между присутствующими на рынке видами хостинга и чем-то бытовым.</p>
<p>Все предложения хостинга можно разделить на 4 группы: Shared hosting (общий сервер), VPS (virtual private server — частный виртуальный сервер), Dedicated (выделенный сервер) и Cloud (облачный хостинг). Colocation (размещение сервера) в расчет не берется, так как это просто аренда места в стойке, а не хостинг.</p>
<p>Итак, с чем же можно провести аналогию?</p>
<p><span id="more-618"></span>Первое, что пришло в голову — ресторан. Shared — небольшой стол, заполненный едой, а вокруг стоя тянет руки толпа студентов. VPS — типичный ресторанный стол, у каждого своя еда на тарелке, присутствует малая группа людей. Dedicated — один за столом. Cloud — вот тут самое интересное. Толком придумать идею не получилось. Если у кого получится, велкам в комменты.</p>
<p>Чтобы восстановить пробел с Cloud, решил перенести фокус со стола на одну емкость — стакан. Shared — стакан с жидкостью забит трубочками. VPS — стакан перегородками поделен на 4 равные части, в каждой части своя трубочка. Dedicated — одна трубочка в стакане. Cloud — система стаканов, соединенных трубочками. К этой системе равномерно подключаются трубочки &laquo;клиентов&raquo;.</p>
<p>Всё сходится, аналогия получается хорошая. Но нормально изобразить ее графически у меня не вышло. Выкладываю то, что получилось :) Если кто-то сможет нормально нарисовать эту красоту, буду весьма признателен :)</p>
<p><a href="http://valera.ws/wp-content/uploads/2011/09/hosting.jpg"><img class="aligncenter size-full wp-image-619" title="hosting" src="http://valera.ws/wp-content/uploads/2011/09/hosting.jpg" alt="Хостинг" width="600" height="450" /></a></p>
<p>Если я не первый, кто провел такую аналогию, было бы также интересно об этом узнать.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.09.18~hosting-types-comparison/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Бэкап личных данных в облаках</title>
		<link>http://valera.ws/2011.07.11~cloud-backup/</link>
		<comments>http://valera.ws/2011.07.11~cloud-backup/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 18:32:17 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[облака]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=610</guid>
		<description><![CDATA[Мой архив фотографий на данный момент занимает 32 Гб. Видео-архив — 43 Гб. Если сложить, будет 75 Гб. Если прикинуть на перспективу, то будет 100—150 Гб. Именно столько места надо мне, чтобы бэкапить эти данные где-то еще, кроме собственного домашнего &#8230; <a href="http://valera.ws/2011.07.11~cloud-backup/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-612" title="cloud-backup" src="http://valera.ws/wp-content/uploads/2011/07/cloud-backup1.png" alt="" width="200" height="146" />Мой архив фотографий на данный момент занимает 32 Гб. Видео-архив — 43 Гб. Если сложить, будет 75 Гб. Если прикинуть на перспективу, то будет 100—150 Гб. Именно столько места надо мне, чтобы бэкапить эти данные где-то еще, кроме собственного домашнего сервера.</p>
<p><span id="more-610"></span></p>
<p>Если взять одного из ведущих российских облачных хостеров — <a href="http://selectel.ru/cloud/">selectel.ru</a>, у которого самая низкая стоимость за Гб/час хранения данных (0,005 р), то месяц хранения бэкапов будет стоить 360—540 рублей в месяц. Это около $15. Много. При этом, платить надо еще за трафик и работу виртуальной машины во время синхронизации.</p>
<p>Рассмотрим <a href="http://aws.amazon.com/s3/">сервис хранения файлов от Amazon</a>. До терабайта там цена от $0.093 за Гб. Для хранения моих бэкапов понадобится от $9,3—14. Это поменьше, но там нет виртуальной машины, а значит сложнее синхронизация.</p>
<p>Для сравнения посмотрим на <a href="https://www.dropbox.com/pricing">Dropbox</a>. Мы знаем, что он хранит пользовательские данные на Amazon S3. Значит, не должно быть дешевле, чем в расчетах Амазона. Аккаунт Pro (100 Гб) стоит $20 в месяц. Да, дороже более чем в 2 раза.</p>
<p>Может <a href="https://one.ubuntu.com/plans/">Ubuntu One</a>? 20 Гб у них стоят $3. Значит я заплачу примерно $14—22. Тоже дорого&#8230;</p>
<p>Стоимость внешних HDD от 250 Гб начинается от $55. Хоть надежность такого бэкапа будет гораздо ниже, чем в случае облаков, да и возни больше (ведь нельзя хранить винчестер в той же локации, где и сервер; а значит нужно либо носить его туда-сюда, либо договариваться с кем-то о бэкапах через интернет). Зато цена приятная: даже по Амазону наш HDD окупится через 6 месяцев.</p>
<p>Во всех расчетах не учитывались затраты на трафик. При первой синхронизации они будут велики ($10—20 для облаков), но при последующих синхронизациях они будут относительно небольшими (трудно подсчитать, ну пусть будет $1—2 в мес.). Для внешнего HDD затрат на первый слив не будет.</p>
<p>Есть также сервис, специализирующиеся на бэкапе в облака. Гуглятся по запросу «<a href="http://www.google.com/search?&amp;q=cloud+backup">cloud backup</a>». Я несколько штук посмотрел, но цен ниже $15 в месяц за 100 Гб не видел. Только больше.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.07.11~cloud-backup/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Maps Labs</title>
		<link>http://valera.ws/2011.07.08~google-maps-labs/</link>
		<comments>http://valera.ws/2011.07.08~google-maps-labs/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 20:15:05 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[карты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=602</guid>
		<description><![CDATA[Сегодня почти случайно узнал, что для Google Maps есть такой же раздел Labs, как в Gmail. Правда он намного скромнее по количеству эксперементальных фич. Чтобы попасть в список Labs, нужно зайти в Google Maps и нажать на шестеренку в правом &#8230; <a href="http://valera.ws/2011.07.08~google-maps-labs/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://valera.ws/wp-content/uploads/2011/07/glabs.png"><img class="alignleft size-full wp-image-606" title="glabs" src="http://valera.ws/wp-content/uploads/2011/07/glabs.png" alt="" width="150" height="83" /></a>Сегодня почти случайно узнал, что для <a href="http://valera.ws/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a> Maps есть такой же раздел Labs, как в Gmail. Правда он намного скромнее по количеству эксперементальных фич.</p>
<p>Чтобы попасть в список Labs, нужно зайти в Google Maps и нажать на шестеренку в правом верхнем углу. В выпадающем меню выбрать &laquo;Maps Labs&raquo;.</p>
<p><span id="more-602"></span></p>
<p><img class="alignnone" src="http://feedbee.server.valera.ws/pictures/gmaps/screen-1.png" alt="" width="672" height="320" /></p>
<p>Откроется окно со списком, где можно включить/отключить ту или иную фичу.</p>
<p><img class="alignnone" src="http://feedbee.server.valera.ws/pictures/gmaps/screen-2.png" alt="" width="637" height="500" /></p>
<p>Полезными я бы назвал только две первых: измерение расстояний и быстрый зум. Причем, расстояния — это то, чего мне больше всего не хватало в гуглокартах. В принципе, я считаю наличие измерителя расстояний в стандартной морде <a href="http://valera.ws/tag/yandeks/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Яндекс">Яндекс</a>.Карт самым весомым их преимуществом.</p>
<p><img class="alignnone" src="http://feedbee.server.valera.ws/pictures/gmaps/screen-3.png" alt="" width="640" height="563" /></p>
<p>Измерение расстояний включается нажатием на кнопку с линейкой, которая появится в левом нижнем углу карты после включения фичи. Правда работает функционал пока немного глюкаво. В частности, кнопка пропадает после обновления страницы и не появляется, пока не выключишь/включишь ее заново.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.07.08~google-maps-labs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Хорошее резюме</title>
		<link>http://valera.ws/2011.05.02~good-resume/</link>
		<comments>http://valera.ws/2011.05.02~good-resume/#comments</comments>
		<pubDate>Mon, 02 May 2011 14:11:23 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=573</guid>
		<description><![CDATA[Работодателю нужно оценить соответствие соискателя работы своим требованиям до собеседования, чтобы определиться, тратить ли время и свое, и соискателя, на личную встречу. Это можно сделать за счет просмотра резюме и выполнения тестового задания. Тестовое задание сходу дают не все, а &#8230; <a href="http://valera.ws/2011.05.02~good-resume/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p><img class="alignleft size-full wp-image-589" title="resume" src="http://valera.ws/wp-content/uploads/2011/05/resume.png" alt="" width="150" height="119" />Работодателю нужно оценить соответствие соискателя работы своим требованиям до собеседования, чтобы определиться, тратить ли время и свое, и соискателя, на личную встречу. Это можно сделать за счет просмотра резюме и выполнения тестового задания.</p>
<p><span id="more-573"></span></p>
<p>Тестовое задание сходу дают не все, а вот резюме читают, пожалуй, все работодатели. В зависимости от конъюнктуры рынка (отношения спроса к предложению) на этапе просмотра резюме отсеиваются до 90 % соискателей. У меня нет точных среднестатистических данных, но эмпирически рискну предположить, что в среднем отсеиваются 60—70% соискателей.</p>
<p>Это значит, что резюме играет очень весомую роль в процессе поиска персонала и поиска работы. Работодателю очень важно получить максимально качественное резюме, чтобы не отсеять хорошего кандидата из-за плохого резюме. Соискателю важно максимально качественно составить резюме, чтобы не упустить хорошую работу, где плохие резюме обязательно отложат в пачку «fail», т.к. ценят свое время.</p>
<p>Выходит, что всем выгодно, когда резюме составлено хорошо. А что значит хорошо? Это значит, что соискатель хорошо подаст все свои навыки, опыт и преимущества перед конкурентами, а работодатель получить всю первичную интересующую его информацию о кандидате.</p>
<p>Стандартное резюме на все случаи жизни никогда не решит эти задачи. В каждой отрасли есть свои особенности и акценты, для каждой специальности есть своя специфика подачи информации. По этому резюме нужно составлять по-разному для разных специальностей, причем один человек может составить несколько разных резюме, если претендует на разные позиции (хотя это не обязательно, если позиции схожи).</p>
<p>Я постоянно участвую в поиске веб-разработчиков и за последнее время видел много разных резюме. Что особенно важно, приглашая людей на собеседование практически всегда связь между стилем написания резюме и результатами оценки кандидата прослеживается очень хорошо. Хорошее, подробное резюме с информацией по делу — кандидат хороший. Куча воды, названий технологий, но отсутствие четкой информации по опыту работы — кандидат «ниочем».</p>
<p>Именно по этой причине я всегда буду сторонником того, что свое резюме надо писать самостоятельно, хоть и по шаблону. Т.е. не стоит копировать стандарные резюме, заменяя отдельные слова и цифры. В него нужно вложить каплю своей индивидуальности. Лучше написать пару абзацев текста, где будет написано про опыт работы соискателя. Перечислить использованные технологии. Рассказать о том, как соискатель оценивает свои навыки и опыт работы с технологиями, которые используются в работе по данной специальности. При этом не стоит вообще писать про то, что соискатель не умеет, либо умеет плохо, и про то, что не имеет отношения к делу.</p>
<p>С позиции работодателя расскажу о своем видении резюме веб-разработчика. Язык программирования при этом значения не имеет.</p>
<p>От соискателя в резюме важно получить следующую информацию:</p>
<ol>
<li>минимальную информацию о себе, как о личности;</li>
<li>краткую информацию об образовании;</li>
<li>подробную информацию о предыдущих местах работы;</li>
<li>подробную информацию о навыках и опыте соискателя в контексте вакансии (позиции, должности).</li>
</ol>
<p>Эти четыре пункта обычно содержит любое резюме по любой специальности. И на этом уровне оно стандартное. А вот какую информацию нужно писать по этим пунктам и как ее преподнести? Это уже позиционно-уникально.</p>
<p><strong>1) Коротко о себе</strong><br />
 Таблица или список со следующими строками. Все строки обязательны. Приложенная фотография является плюсом, т.к. психологически предполагает более серьезное восприятие резюме работодателем.</p>
<p style="padding-left: 30px;">1.1) ФИО (отсюда станет ясен пол, так что писать нужно полностью)<br />
 1.2) Год рождения (или возраст, если резюме рассчитано на короткий период)<br />
 1.3) Город (место жительства, адрес не нужен)<br />
 1.4) Семья (брак, дети)<br />
 1.5) Образование (высшее/среднее/базовое или др.)<br />
 1.6) Отношение с армией (не обязательно писать, но все равно об этом спросят)<br />
 1.7) Иностранные языки (перечислить языки с указанием уровня влядения; не стоит тут писать русский, украинский или белорусский)<br />
 1.8) Позиция (должность; в одной организации может быть несколько вакансий, к которым подойдет ваше резюме, поэтому указать позицию или позиции, на которые претендует соискатель, нужно обязательно)<br />
 1.10) Желаемая заработная плата (реальная заработная плата, на которую нацелен соискатель в настоящее время; это очень важная для работодателя информация, и если соискатель знает, что он хочет, нужно обязательно указать, если не знает — на это укажет отсутствие данной информации; можно писать в стиле «от Х»)</p>
<p><strong>2) Образование</strong><br />
 Работодателю часто нужно знать, где проходил обучение соискатель и по какой специальности. Даже если образование не рассматривается как требование и важный фактор при выборе среди кандидатов, указание этой информации необходимо даже для справки. Обычно обучение на определенных факультетах определенных вузов дает хорошее преимущество кандидату в рамках специальности. Указывать нужно все места обучения, выше школьного уровня образования.</p>
<p style="padding-left: 30px;">2.1) Учебное заведение<br />
 2.2) Факультет<br />
 2.3) Специальность<br />
 2.4) Годы обучения (лучше указать время начала и окончания обучения, т.к. иногда возникают непонятные ситуации, когда указан только один год)<br />
 2.5) Окончен ли успешно? (если обучение прервано, об этом обязательно нужно написать отдельно)</p>
<p><strong>3) Места работы</strong><br />
 Работодателю важно знать предыдущий опыт работы соискателя. Этот опыт с разных точек зрения характеризует соискателя как профессионала. Важно не только, где работал соискатель, но и чем занимался, за что отвечал, чего добился, чем пользовался. Здесь лучше всего подходит таблица, но можно оформить и списком.</p>
<p style="padding-left: 30px;">3.1) Название компании (так, как оно пишется «в миру»)<br />
 3.2) Сколько человек в организации/подразделении (опционально, если компания неизвестная, просто поможет оценить ее масштаб)<br />
 3.3) Должность (позиция, так, как она называлась в компании; можно дополнить общепринятым названием позиции, если оно отличается от принятого в компании)<br />
 3.4) Время работы (лучше всего в формате мм.гггг — мм.гггг / н.в.)<br />
 3.5) Обязанности (тезисно: что реально входило в круг обязанностей, пояснения и комментарии будут уместны)<br />
 3.6) Сколько человек в подчинении (если были люди в подчинении, об этом обязательно стоит упомянуть, иначе — пропускается пункт — 0 писать не нужно)<br />
 3.7) Проекты (это отдельный список проектов, в которых соискатель принимал участие в компании; если подход не проектный или если нет желания все расписывать, можно просто описать в текстовом виде, что соискатель <strong>с</strong>делал, работая в компании)<br />
 3.7.1) Название проекта с кратким описанием (из этого должно быть понятно, какие разработки велись в рамках проекта)<br />
 3.7.2) Временные рамки участия в проекте<br />
 3.7.3) Результаты (как личные, так и общие)<br />
 3.8) Причина ухода (если указывать желания нет, не надо, но все равно скорее всего на собеседовании спросят)</p>
<p><strong>4) Технологии</strong><br />
 Очень важный блок. Из него должно стать понятно, каким навыками соискатель владеет, с какими технологиями имел опыт работы и какой этот опыт, как соискатель оценивает свои знания. Информация обычно подается в табличном виде с колонками: <em>название технологии</em>, <em>оценка своего уровня</em> (по любой шкале, но не менее чем из 3-х уровней: начальный, средний, продвинутый), <em>сколько лет опыта</em>.<br />
 Здесь нужно писать только то, что уместно в контексте позиции. Не стоит указывать технологии, по которым уровень соискателя такой, который не позволит применение технологии на практике без дополнительного обучения. Информация разбивается на отдельные группы:</p>
<p style="padding-left: 30px;">4.1) Языки программирования, разметки, запросов и т.д. (т.е. все, что является языком чего-либо или близко к этому)<br />
 4.2) Фрэймворки и библиотеки (стоит указывать только общеизвестные; нет смысла указывать самостоятельно разработанные библиотеки и фрэймворки, если ими пользуется только сам соискатель или его [бывшие] коллеги)<br />
 4.3) Технологии (то, что не является языком или библиотекой, но существует как стандартизированная и/или общеизвестная технология: AJAX, Web Services (SOAP), COM/OLE и т.д.)<br />
 4.4) Операционные системы (если у соискателя в арсенале опыт работы только с несколькими версиями Windows, этот пункт лучше вообще опустить; он имеет смысл, когда есть опыт работы с 2-мя и более разными ОС; версии одной и той же ОС лучше объединить в одну строку; разные дистрибутивы <a href="http://valera.ws/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>/BSD/UNIX = разные ОС; необходимо указание уровня: администрирование сервера, либо использование в качестве десктопа)<br />
 4.5) Прикладное программное обеспечение (IDE, ПО для проектирования, разработки, тестирования, специфичное для специальности; не стоит сюда писать программы общего назначения, такие как Total Commander, FAR,  MS Office, gedit и т.д.)<br />
 4.7) Другое (если есть еще что-то важное, о чем соискателю хочется рассказать, следует это сделать)</p>
<p>Резюме лучше всего распространять в формате PDF. Если в качестве формата все же выбран Microsoft Word, то это должен быть формат DOC не выше версии Word 2003. Категорически не рекомендуется размещать резюме прямо в письме или в текстовом файле. Лучше сделать вложение к письму (не стоит размещать ссылку на скачивание резюме). Невыполнение этих требований говорит о неуважении к работодателю и вызывает аналогичное отношение к соискателю.</p>
<p>В моей практике был случай, когда в ответ на вакансию я получил письмо следующего содержания: «Здравствуйте. Слать резюме надоело, поэтому не буду. Если у вас действительно есть сложные задачи и хорошо поставлен рабочий процесс, звоните +37529&#8230;..». Сомневаюсь, что с таким подходом человеку удастся найти работу. Естественно, это письмо я проигнорировал. Через несколько дней этот человек перезвонил по телефону. Конечно, стоило сразу сообщить ему, что даже разговаривать с ним нет желания. Но я этого не сделал, и постарался более-менее вежливо с ним поговорить. Через пару минут разговор был закончен по смыслу тем, что он нам не подходит.</p>
<p>Уважайте работодателя. Уважайте его вопросы на собеседовании, даже если они кажутся вам глупыми, несерьезными, легкими/сложными и т.д. На собеседовании представитель работодателя задает такие вопросы, которые нужны лично ему для вашей оценки. Постарайтесь из любого собеседования получить для себя некий опыт.</p>
<p>И помните, что вы делаете такой же выбор среди работодателей, как и работодатели среди соискателей. Так что активно задавайте вопросы, анализируйте адресованные вам вопросы — за ними скрывается дополнительная информация о работодателе. Для сравнения работодателей можно использовать <a href="http://valera.ws/2011.05.02~employee-factor-analysis/">факторную модель</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.05.02~good-resume/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL-авторизация на сайте</title>
		<link>http://valera.ws/2011.02.05~ssl-auth/</link>
		<comments>http://valera.ws/2011.02.05~ssl-auth/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 20:24:03 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[байнет]]></category>
		<category><![CDATA[браузеры]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=546</guid>
		<description><![CDATA[Возникла задача: дать пользователю возможность авторизации на сайте в защищенном режиме. Т.е. так, чтобы его пароль не могли перехватить через канал связи. Какие есть варианты решения задачи, как решают эту задачу другие? Об этом чуть подробнее. Полностью защитить протокол общения &#8230; <a href="http://valera.ws/2011.02.05~ssl-auth/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-547" title="https-background" src="http://valera.ws/wp-content/uploads/2011/02/https-background-150x150.jpg" alt="" width="150" height="150" />Возникла задача: дать пользователю возможность авторизации на сайте в защищенном режиме. Т.е. так, чтобы его пароль не могли перехватить через канал связи. Какие есть варианты решения задачи, как решают эту задачу другие? Об этом чуть подробнее.</p>
<p><span id="more-546"></span>Полностью защитить протокол общения пользователя с сервером можно только одним способом — шифрование трафика. Экзотические способы шифрования, а также создание различного вида тоннелей мы не рассматриваем. Только обычное SSL-шифрование протокола HTTP, которое поддерживает любой современный браузер — HTTPS.</p>
<p>Причем, работает нормально HTTPS только в том случае, если для пользователя не произошло незаметной подмены сертификата (как это делает софт на подобии <a href="http://falcongaze.ru" target="_blank">SecureTower</a>). В случае, если сертификат подменяется незаметно или пользователя в открытую заставляют принять невалидный сертификат (т.к. иначе ничего не будет вообще) HTTPS работать перестает.</p>
<p>И вот, учитывая это, возникает вопрос: если полностью защитить трафик мы не можем, то можем ли мы защитить хотябы самое важное? Например, пароль. В принципе, можем, но тоже не на 100%. Пароль можно хэшировать до передачи на сервер JavaScript-ом. Тогда перехватчик получить хэш. Он сможет по нему авторизоваться, но сам пароль не увидит. Правда, его можно подобрать брутфорсом. С шифрованием самого пароля (вместо хэширования) картина примерно та же, только реализация гораздо сложнее.</p>
<p>Давать возможность пользователю работать с сайтом по HTTPS можно, но заставлять нужно только тогда, когда шифрование реально необходимо: например, в интернет-банкинге. Дело в том, что у некоторых компаний могут быть закрыты исходящие соединения на 443-й порт, либо запрещен бинарный трафик.</p>
<p>HTTPS-трафик создает дополнительную нагрузку на сервер, прежде всего на процессор, а так же замедляет передачу информации пользователю. Этот еще два камня в его огород. Вывод: если нет острой необходимости, не нужно заставлять и, возможно, даже рекомендовать пользователю пользоваться HTTPS.</p>
<p>Как вариант, можно проводить по защищенному протоколу только авторизацию. Обычно пользователю дают возможность выбрать способ авторизации: защищенный или обычный. Тот, кому важна безопасноть, выберет защищенный способ при условии, что он для него технически доступен.</p>
<p>Но в этом случае большинству пользователей эта защита может оказаться непонятной и ненужной. Если мы хотим им помочь, то следует определить, доступен ли клиенту HTTPS автоматически и, в зависимости от результата, установить обычную авторизацию, либо защищенную. Только пользовалею надо сообщить о том, какой способ выбран (можно графически).</p>
<p>Именно так поступили в Яндексе. У них я подсмотрел способ определения доступности HTTPS. Подгружается JS с https://, который устанавливает флаг в DOM-модели страницы. Форма авторизации ведет себя по разному в зависимости от этого флага.</p>
<p>Хэшировать ли пароль? Это может иметь значение только в одном случае: если у пользователя один пароль на несколько сервисов. Тогда перехватчик не увидит пароля в открытом виде, чтобы использовать его на других сервисах. Но подобрать брутфорсом пароль все равно возможно. Только это уже не так тривиально, как подсмотреть в открытом виде. Так что если вы на стороне пользователя, постарайтесь пароль хэшировать до передачи.</p>
<p><strong>А как делают другие?</strong></p>
<p>Про Яндекс я уже рассказал. Добавлю, что пароль он передает в открытом виде и не пускает на главную страницу портала по HTTPS.</p>
<p>Mail.ru ведет себя как Яндекс, только их способа определения поддержки HTTPS я не нашел (хотя и не глубоко искал).</p>
<p>Google работает по HTTPS нормально. Пароль передает в открытом виде. Авторизацию по умолчанию предлагает защищенную. Способов определения, поддерживает  ли клиент HTTPS, я не нашел.</p>
<p>Facebook, как и Google, прекрассно работает по HTTPS. Авторизация по умолчанию защищенная. Пароль в открытом виде.</p>
<p>Вконтакте, Одноклассники, TUT.BY и Onliner.by по HTTPS не отвечают, защищенную авторизацию не предлагают, пароль идет в открытом виде.</p>
<p>oz.by по HTTPS предлагает принять самоподписанный сертификат, чтобы потом произвести редирект на HTTP. Пароль в открытом виде.</p>
<p>Вот такая статистика. Западные ресурсы и пользователи давно освоили основы безопасности в сети. Ведущие российские ресурсы защищают хотябы авторизацию пользователя. Ведущие белорусские ресурсы безопасность пользователей игнорируют полностью.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.02.05~ssl-auth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Передача имени сайта скрипту через cron (crontab)</title>
		<link>http://valera.ws/2011.01.13~sitename-php-from-cron/</link>
		<comments>http://valera.ws/2011.01.13~sitename-php-from-cron/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 20:32:58 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=530</guid>
		<description><![CDATA[Вчера на stackoverflow заметил вопрос о том, как передать скрипту через крон адрес сайта, если скрипт может выполняться «под разными сайтами». Это довольно интересный вопрос, и есть много вариантов решения. Сам решал его не так давно, а раз тема интерисует &#8230; <a href="http://valera.ws/2011.01.13~sitename-php-from-cron/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="width: 107px; height: 65px;" title="PHP-скрипт" src="http://valera.ws/images/php.png" border="0" alt="PHP-скрипт" hspace="3" vspace="3" width="107" height="65" align="left" />Вчера на stackoverflow заметил <a href="http://stackoverflow.com/questions/4673255/get-identifying-server-information-when-running-php-scripts-with-cron/4673387#4673387">вопрос</a> о том, как передать скрипту через крон адрес сайта, если скрипт может выполняться «под разными сайтами». Это довольно интересный вопрос, и есть много вариантов решения. Сам решал его не так давно, а раз тема интерисует и других, решил об этом написать.</p>
<p><span id="more-530"></span>Немного подробнее о самом вопросе. Зачастую встречаются сайты, работающие на одной кодовой базе на одном сервере, но, при этом, на разных доменах. При схожем внешнем виде на этих сайтах содержится разная информация в разном дизайне.</p>
<p>Самый простой пример таких сайтов — это локализованные версии одного сайта на разных языках. У меня в практике — это тематические форумы для разных групп.</p>
<p>Разделение этих сайтов обычно происходит через конфиги. Именно конфиг определяет все детали, уникальные для каждого сайта.</p>
<p>При запуске обработки пользовательского HTTP-запроса скриптам необходимо определить, какому именно домену предназначен запрос, и выбрать соответствующий конфиг. В <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> это довольно просто сделать: заглянуть в переменную <a href="http://php.net/manual/en/reserved.variables.server.php">$_SERVER</a>['SERVER_NAME']. В других языках программирования под веб, думаю, примерно так же просто.</p>
<p>По имени серевера определяется нужный конфиг и оттуда берутся все необходимые настройки. Все просто.</p>
<p>Но когда дело доходит до вызова скриптов из cron-а (или другого планировщика), то переменная $_SERVER['SERVER_NAME'] будет пуста. Оно-то и понятно: никакого сервера нет, скрипт запускается напрямую через <a href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8">CLI</a>. И узнать, для какого сайта вызывается скрипт, без явной передачи домена скрипту невозможно.</p>
<p>Самый простой способ указать домен — это прописать его аргументом командной строки. При вызове из cron-а после имени скрипта просто пишем домен, а в коде получаем его из переменной <a href="http://www.php.net/manual/en/features.commandline.usage.php">$argv</a> глобальной области видимости.</p>
<p>Но этот способ не отличается элегантностью, т.к. придется определять, как запускался сайт: через веб или CLI, и в зависимости от этого искать адрес сайта в разных местах.</p>
<p>Второй большой минус такого способа в том, что привязка происходит непосредственно по домену, т.е. нет гибкости. Если одинаковый сайт крутится на разных доменах, то придется мутить некую систему алиасов. А это еще уменьшает элегантность.</p>
<p>Таким образом ищем более удобный способ передать «указатель» на сайт. И находим: это <a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%8B">переменные окружения</a>. Среду окружения интерпретатор PHP получает оттуда, откуда он был запущен. Если скрипт запущен веб-сервером, то переменные будут получены от сервера. Если запускается скрипт через CLI, то среда будет получена от shell-а, в котором производился запуск. Повторю: запуск скриптов из cron-а — это обыкновенный запуск исполнимого файла в режиме CLI.</p>
<p>Теперь к конкретике. Чтобы переменная среды окружения попала из веб-сервера в PHP-скрипт (или скрипт/программу, написанную на других языках), ее надо установить (прописать). Для Апача установить переменную можно в файле .htaccess, либо в конфигах сервера (httpd.conf или конфиги виртуальных хостов). В идеале предпочтительно последнее. Но достаточно и минимального уровня доступа к .htaccess. Добивим в соответствующий конфиг строку:</p>
<p><code>SetEnv SITE_NAME site1</code></p>
<p>Чтобы определить переменную среды при запуске в режиме CLI (php /filename), нужно ее объявить и экпортировать:</p>
<p><code>export SITE_NAME=site1;</code></p>
<p>При запуске скрипта вручную следующей командой можно запускать сам PHP. Если запуск производится cron-ом, то стоит создать скрипт, на который ссылаться из crontab:</p>
<p><code>#!/bin/bash<br />
 export SITE_NAME=site1;<br />
 php /path</code></p>
<p>Для других сайтов вместо site1 подставляются другие имена.</p>
<p>Остается прочитать переменную в скрипте:</p>
<p><code>echo getenv('SITE_NAME');</code></p>
<p>Ну а дальше, в зависимости от значения переменной, подгружать нужный конфиг.</p>
<p>* Стоит отметить, что в случае разных «установок»<sup>1</sup> одного и того же сайта (development, testing, production) принято это значение передавать сайту в виде тоже же переменной окружения. Как правило, конфиг в этом случае содержит очень много информации, одинаковой для всех «установок», а отличаться, например, могут только параметры доступа к БД. Тогда имеет смысл все установки считать за один сайт (хоть домены и разные), а отличающиеся параметры вынести в отдельный конфиг, зависимый от «установки».</p>
<p><sup>1</sup> — Я намеряно в последнем абзаце заменил термин «окружение приложения» (application environment: тестовое, рабочее) на «установку», чтобы не было путаницы с тем окружением, где устанавливаюся переменные.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.01.13~sitename-php-from-cron/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Информер погоды от Яндекса с определение города по IP (обновление 2)</title>
		<link>http://valera.ws/2010.12.26~weather-informer-3/</link>
		<comments>http://valera.ws/2010.12.26~weather-informer-3/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 18:02:35 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[CNGeoip]]></category>
		<category><![CDATA[GeoIP]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=518</guid>
		<description><![CDATA[Вчера я вновь обновил свой старый сервис, который позволяет показывать пользователям сайта информер погоды в том городе, где они находятся. Все подробности по этому поводу в старой записи. Недавно Яндекс поменял формат кода информера, который он выдает на странице http://weather.yandex.ru/informer.xml. После этого &#8230; <a href="http://valera.ws/2010.12.26~weather-informer-3/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://valera.ws/images/ya.w.gif" alt="" width="216" height="144" />Вчера я вновь обновил свой старый сервис, который позволяет показывать пользователям сайта информер погоды в том городе, где они находятся. Все подробности по этому поводу в <a href="http://valera.ws/2008.04.05~weather-informer/comment-page-1/">старой записи</a>.</p>
<p>Недавно Яндекс поменял формат кода информера, который он выдает на странице <a href="http://weather.yandex.ru/informer.xml" target="_blank">http://weather.yandex.ru/informer.xml</a>. После этого сервис перестал обрабатывать новые коды. И вот сейчас все вновь работает в штатном режиме.<span id="more-518"></span></p>
<p>Полученные ранее информеры продолжают работать без перебоев.</p>
<p>А вот в файле настроек, который нужно размещать на том сервере, где размещается информер, исправлена ошибка в JS коде. В связи с этим, файл настроек необходимо <a href="http://ru.commontools.net/geoip/ya.weather.options.txt">обновить</a>.</p>
<p>Спасибо всем, кто писал свои замечания по поводу работы сервиса. Именно благодаря одному из пользователей удалось заметить, что Яндекс обновил формат кода.</p>
<p>Обо всех замечаниях по работе проекта просьба писать мне на e-mail: feedbee@gmail.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.12.26~weather-informer-3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Getting Real — книга, которую стоит прочесть!</title>
		<link>http://valera.ws/2010.12.12~getting-real/</link>
		<comments>http://valera.ws/2010.12.12~getting-real/#comments</comments>
		<pubDate>Sun, 12 Dec 2010 15:13:53 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[книги]]></category>
		<category><![CDATA[сайты]]></category>
		<category><![CDATA[управление проектами]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=489</guid>
		<description><![CDATA[На днях дочитал книгу &#171;Getting Real&#187; от 37signals (известные люди в определенной среде). Читал на русском языке прямо на сайте, бесплатно. Книга оказалась очень познавательной, полезной и интересной. Перевод очень хороший (если не считать несколько ошибок и пару разрушающих мозг фраз). Getting &#8230; <a href="http://valera.ws/2010.12.12~getting-real/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Getting Real" src="http://valera.ws/files/pictures/blackbook.gif" alt="" width="80" height="120" />На днях дочитал книгу &laquo;<a href="http://gettingreal.37signals.com/GR_rus.php">Getting Real</a>&raquo; от <a href="http://www.37signals.com/">37signals</a> (известные люди в определенной среде). Читал на русском языке прямо на сайте, бесплатно. Книга оказалась очень познавательной, полезной и интересной. Перевод очень хороший (если не считать несколько ошибок и пару разрушающих мозг фраз). <span id="more-489"></span></p>
<p>Getting Real — это своеобразный подход к разработке, запуску и сопровождению веб-приложений. По своей сути близок к методологии <a href="http://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8">Agile</a>. Основные тезисы: минимальные вложения, минимальный функционал (ничего лишнего) максимальное качество, тесное и открытое взаимодействие с пользователем (клиентом).</p>
<p>Подробнее о подходе и принципах Getting Real написано <strong>в главе 1</strong> «<a href="http://gettingreal.37signals.com/GR_rus.php#ch01">Введение</a>».</p>
<p>Вся книга представляет собой набор советов о том, как правильно делать всё в процессе разработки и выпуска веб-приложения. Покрываются практически все вопросы: от технических, до управленческих и маркетинговых.</p>
<p>Но авторы несколько раз обращают внимание на то, что Getting Real легко проецируется на другие области работы и жизни:</p>
<blockquote><p>«Хоть внимание и акцентируется на разработке веб-приложений, идеи применимы к действиям вне этой сферы. Предложения маленьких групп, быстром создании макетов, ожидание итераций и многие другие могут служить руководством, запускаете ли вы бизнес, пишете ли книгу, проектируете ли веб-сайт, записываете ли альбом или делаете что-то другое. Как только вы начнёте следовать принципам Getting Real в одной области жизни, вы поймёте, как это можно использовать в других областях».</p>
</blockquote>
<p>Стиль написания свободный. Настроения авторов революционные.</p>
<blockquote><p>«Потерпите нас. Мы считаем — лучше представить идеи резко, чем тихо шептать об этом на ухо. Если это кажется дерзким и высокомерным, пусть так и будет. Мы предпочитаем быть «провокаторами», чем постоянно ныть «может быть, если…». Конечно, будут времена, когда эти правила должны будут измениться или исчезнуть. И некоторые из этих тактик, возможно, не подходят к вашей ситуации. У вас есть своя голова на плечах, решайте сами».</p>
</blockquote>
<p>Авторы обращают внимание на реальные проблемы, с которыми разработчики и менеджеры сталкиваются изо дня в день, но при этом порой их даже не замечают (не принимают за проблемы), или пытаются закрыть на них глаза. В то же время книга призывает откинуть ряд надуманных проблем, которые возникают из-за чрезмерной бюрократизации процессов разработки, попыток сделать всё и сразу, неправильного подхода к планам и срокам. Этих проблем может вовсе не стать, если применять подход Getting Real.</p>
<p>В книге повсеместно присутствуют вставки из других книг, блогов и статей известных авторов. Это добавляет уверенности в том, что время читателя не тратится впустую, и показывает, как описанные подходы применяются в разных компаниях.</p>
<p>Далее просто перечислю ключевые идеи по главам с цитатами из книги. С одной стороны, это — краткий пересказ, и если вы надумали прочитать книгу, то лучше сначала прочтите ее, а потом вернитесь к моей выжимке для закрепления. Если читать книгу не решились, то стоит хотябы прочитать выдержки.</p>
<p><strong>Глава 2</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch02">Начало</a>»</p>
<blockquote><p>«Сделайте меньше чем ваши конкуренты, чтобы ударить по ним. Решайте простые проблемы и оставьте сложные, противные проблемы всем остальным. Вместо превосходства попробуйте делать недостаточно».</p>
</blockquote>
<p>Пишите программы для себя.</p>
<blockquote><p>«Если вы решаете собственную проблему, вы создаёте инструмент с душой. И это является ключевым. Это означает, что вы сделаете всё отлично. И это является лучшим вариантом».</p>
</blockquote>
<p>Финансируйте себя сами.</p>
<blockquote><p>«Сейчас, чтобы начать, не требуется многого. Аппаратные средства дешевы и большое количество ПО бесплатно и имеет открытые исходные коды. И страсть не приходит с ценником».</p>
</blockquote>
<p>Фиксируйте время и бюджет.</p>
<blockquote><p><span style="font-style: normal;">«Бытует миф: мы можем начать вовремя, уложившись в бюджет и реализуя всё предполагаемое. Это практически никогда не выходит, но когда так происходит, от этого страдает качество. </span></p>
</blockquote>
<blockquote><p>Если вы не укладываетесь в отведённые время и бюджет, не увеличивайте их. Вместо этого сократите возможности. Время добавить их чуть позже будет всегда.</p>
<p>В начале пусть лучше будет меньше запланированных возможностей, чем потом будет посредственный, громоздкий и с кучей дыр безопасности результат. Оставьте волшебство Копперфильду. У вас реальный бизнес и реальный продукт».</p>
</blockquote>
<p>Заведите себе врага.</p>
<blockquote><p>«Иногда лучший способ узнать, каким должно быть ваше приложение — это узнать, каким оно не должно быть. Пусть это будет врагом вашего приложения, и вы будете видеть свет, на который вы должны идти».</p>
</blockquote>
<p>Меньше рутины.</p>
<blockquote><p>«Чем меньше в вашем приложении рутины — тем лучше.</p>
<p>Если рутинной работы немного и она управляема — вы можете наслаждаться».</p>
</blockquote>
<p><strong>Глава 3</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch03">Оставайтесь небольшими</a>».</p>
<p>Меньше размеры.</p>
<blockquote><p>«Ловкие, проворные и легковесные компании могут быстро менять свою бизнес-модель, продукт, его функции и маркетинг. Они могут делать ошибки и быстро их исправлять. Они могут менять приоритеты, и что самое важное — у них есть право передумать».</p>
</blockquote>
<p>Снизьте стоимость перемен.</p>
<blockquote><p>«Перемены — ваш лучший друг. Чем выше их цена, тем меньше их вероятность. И если ваши конкуренты могут меняться быстрее вас, вы в крайне невыгодном положении. Если цена перемен становится слишком высока — вам конец».</p>
</blockquote>
<p>Начните с троих.</p>
<blockquote><p>«Чтобы выпустить первую версию вашего продукта, можно начать только с тремя людьми. Это магическая число, которое обеспечит вам достаточный человеческий ресурс и в то же время позволит оставаться быстрым и проворным. Начните с разработчиком, дизайнером, и человеком, — который разбирается в том и другом».</p>
</blockquote>
<p>Принимайте ограничения.</p>
<blockquote><p>«Пусть ограничения ведут вас к творческим решениям».</p>
</blockquote>
<p>Будьте собой.</p>
<blockquote><p>«Много маленьких компаний делают ошибку в попытках действовать как большие. Как будто бы они не замечают свой размер. Это как слабость, комплекс, который нужно скрывать, и это слишком плохо. Быть маленьким фактически обладать огромным преимуществом, особенно, когда это касается коммуникации».</p>
</blockquote>
<p><strong>Глава 4</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch04">Приоритеты</a>».</p>
<p>В чем идея?</p>
<blockquote><p>«Найдите свою большую идею и примите решение о видении, все маленькие решения в будущем станут проще и легче».</p>
</blockquote>
<p>Пренебрегайте деталями в начале.</p>
<blockquote><p>«Успех и удовлетворение находится в деталях.</p>
<p>Однако, успех не единственная вещь, которую вы найдете в деталях. Вы также найдете — застой, разногласие, встречи, и задержки. Эти вещи могут убить моральное состояние и снизить вероятность успеха».</p>
</blockquote>
<p>Проблема тогда, когда это проблема.</p>
<blockquote><p>«Вам действительно нужно волноваться о вычислениях для 100 000 потребителей сегодня, если это будет у вас через два года?</p>
<p>[...]</p>
<p>Принимайте решения вовремя, когда у вас есть доступ к реальной информации, которая необходима. Тем временем, вы сможете сосредоточить внимание на вещах, которые требуют непосредственной заботы».</p>
</blockquote>
<p>Сосредоточтесь на <em>своих</em> клиентах.</p>
<blockquote><p>«Клиент не всегда прав. Правда в том, что вам придется определять кто прав, а кто ошибается — в рамках вашего приложения. Хорошая новость в том, что интернет делает поиск правильных людей легче, чем когда-либо.</p>
<p>Если вы ориентируетесь на всех, вы не удовлетворите никого».</p>
</blockquote>
<p>Расширяйтесь и оптимизируйтесь позже.</p>
<blockquote><p>«В начале, сделайте основу продукта, вместо масштабируемости. Создайте большое приложение, а затем тревожьтесь о том, что делать, как только оно стало успешным. Иначе вы, возможно, расточаете энергию, время, и деньги, фокусируетесь на том, что может никогда не случиться».</p>
</blockquote>
<p>Делайте идейное ПО.</p>
<blockquote><p>«Лучшее программное обеспечение имеет свое виденье. Лучшее программное обеспечение лавирует между потребностями. Когда кто-нибудь использует программное обеспечение, они не только, ищут особенности, они ищут подход. Они ищут видение для решения своих задач. Решите, что такое — ваше виденье и идите с этим».</p>
</blockquote>
<p>Глава 5. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch05">Выбор функций</a>».</p>
<p>Лучше хорошая половина, чем плохое целое.</p>
<blockquote><p>«Остерегайтесь подхода в развитии сетевого приложения, в котором все готово, но вот что-то не работает и это что-то очень важное.</p>
<p>[...]</p>
<p>Начните быстро создавать приложение и позвольте ему приобретать инерцию. Затем вы можете начать добавлять функции и возможности твердой основе, которую вы построили».</p>
</blockquote>
<p>Это не имеет значения.</p>
<blockquote><p>«Наш любимый ответ на вопрос «Почему вы не сделали это или почему вы не сделали то?». Всегда такой: «Поскольку это не имеет значения».</p>
</blockquote>
<p>Меньше функций.</p>
<blockquote><p>«Сделайте добавление функций, трудно осуществимой задачей. Пусть каждая функция и особенность доказывает, что ее надо оставить в живых. Подобно «Бойцовскому клубу». Вы должны рассматривать только те функции и особенности, которые были протестированы в течение трех дней и за это время были востребованы максимально.</p>
<p>[...]</p>
<p>Для каждой новой функции от вас потребуется:</p>
<ul>
<li>1. Сказать «нет».</li>
<li>2. Вынудить функцию доказать свое значение.</li>
<li>3. Если снова «нет», уже конец. Если, «да», продолжайте…»</li>
</ul>
</blockquote>
<p>Можете ли управлять этим?</p>
<blockquote><p>«Создавайте конструкции и услуги, которыми вы можете управлять. Легко давать обещания. Намного сложнее сдержать их. Сделайте то, что вы можете подтвердить фактически, организационно, стратегически, и материально».</p>
</blockquote>
<p>Решение задач пользователей.</p>
<blockquote><p>«Не навязывайте людям решения. Вместо этого пусть каждый будет генералом над программным обеспечением и сможет найти собственное решение проблемы. Предоставьте людям то, с помощью чего достаточно просто разрешить их собственные проблемы и найти собственный путь».</p>
</blockquote>
<p>Забудьте о запросах функций.</p>
<blockquote><p>«А что вы делаете со всеми этими запросами, которые к вам поступают? Где вы их храните? Как вы управляете ими? Вы этого не делаете. Просто читаете их, а затем отбрасываете.</p>
<p>[...] Пусть ваши клиенты будут вашей памятью. Если это действительно стоящая функция, они будут напоминать вам, пока вы не сможете не забыть».</p>
</blockquote>
<p><strong>Глава 6</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch06">Процесс</a>».</p>
<p>Запустите программу быстрее.</p>
<blockquote><p>«С запуском программы в реальную работу, вы добирается до истинного понимания того, как она должна работать. Вы избегаете бурных разговоров, эскизов и длинных текстов, которые отдаляют вас от сути. Вы осознаете, какие мысли были тривиальны, а какие критически неприемлемы».</p>
</blockquote>
<p>Не всё с первого раза.</p>
<blockquote><p>«Не ожидайте того, что будете все понимать и делать правильно с первого раза. Пусть приложение растет и общается с вами. Позвольте ему трансформироваться и эволюционировать».</p>
</blockquote>
<p>От идеи до реализации.</p>
<blockquote><p>«Перейдите от мозговых штурмов — к эскизам — к HTML — к кодированию».</p>
</blockquote>
<p>Избегайте настроек.</p>
<blockquote><p>«Настройки — зло, потому что они раздувают программное обеспечение и требуют больше кода. А в реальности очень часто настройками никто даже не пользуется. Настройки подразумевают, что вы мало знаете о том, как должны быть расположены блоки на странице, сколько сообщений должно быть выведено на страницу и т.п.</p>
<p>[...]</p>
<p>Вы сталкиваетесь с ограничением: сколько сообщений должно быть на странице? Ваша первая мысль сделать выбор 25, 50 или 100. Это легкий выход. Просто примите решение, как сделать лучше. И выберите одно число».</p>
</blockquote>
<p>Сделано!</p>
<blockquote><p>«Сделано! Это волшебное слово. Когда вы уже сделали — вы получили опыт и можете идти дальше.</p>
<p>Но подождите, а что если вы сделали что-то неправильно? Это плохо. Но это не нейрохирургия, это — сетевое приложение. Нет ничего страшного. Не нужно только замедлять процесс анализом ошибок. Вместо этого оцените важность и идите дальше».</p>
</blockquote>
<p>Тестируйте в реальных условиях.</p>
<blockquote><p>«Нет никакой замены реальных людей, использующих ваше приложение в действительности. Получите реальные данные. Получите реальную обратную связь. Затем улучшайте, основываясь на этой информации».</p>
</blockquote>
<p><strong>Глава 7</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch07">Организация</a>».</p>
<p>Не разделяйте лишний раз.</p>
<blockquote><p>«У многих компаний такие направления как проектирование, развитие, копирайтинг, поддержка, маркетинг разделены на отделы. Такая специализация по отделам, конечно, имеет свои преимущества, но также создает ситуацию, когда сотрудники видят только свой маленький мир, а не полный контекст веб-приложения».</p>
</blockquote>
<p>Единое время.</p>
<blockquote><p>«Известно, что многие люди предпочитают работать рано утром или поздно вечером — это время когда их не беспокоят, это время самое продуктивное для них. Это время становится таким, потому что никто не прерывает работу, и никто не отвлекает.</p>
<p>Поэтому можно установить правило: сделать половину рабочего дня единым временем для работы. В это время не отвлекаться на телефонные звонки, чтение почты, ненужное общение с коллегами и т.д».</p>
</blockquote>
<p>Встречи ядовиты.</p>
<blockquote><p>«Вам действительно нужны встречи? Встречи обычно возникают, когда что-то не достаточно ясно. Вместо встречи, попытайтесь упростить обсуждение и воспользуйтесь мессенджером или Campfire. Минута встречи крадет минуту реальной работы. Поставьте себе цель — избегать встреч».</p>
</blockquote>
<p>Маленькие победы.</p>
<blockquote><p>«Долгие, затянутые циклы разработки — убийцы мотивации. Это слишком долгое время между празднованием побед. Быстрые победы — факторы мотивации. Если вы допускаете длинные циклы разработки — вы убиваете мотивацию. И это может убить ваш продукт».</p>
</blockquote>
<p><strong>Глава 8</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch08">Персонал</a>».</p>
<p>Нанимайте меньше, нанимайте позже.</p>
<blockquote><p>«Так что не нанимайте. Серъезно, не нанимайте никого. Взгляните на это с другой стороны — действительно ли работа, которая вас отягощает, так необходима? Что случиться, если вы просто её не сделаете? Можете ли вы решить проблему с данной частью системы другим способом?»</p>
</blockquote>
<p>Проверяйте.</p>
<blockquote><p>«Прежде чем мы нанимаем кого-либо, мы даем ему на пробу небольшой проект. Мы смотрим, как он ведёт проект, как общается, как работает и т.д. Наблюдение за тем, как человек проектирует или кодирует несколько страниц, даст вам множество информации для понимания того, подходит он вам или нет».</p>
</blockquote>
<p>Не по словам, а по делам.</p>
<blockquote><p>«Проекты с открытым кодом — находка для того, кто ищет техперсонал. Они дают вам возможность следить длительное время за работой того или иного специалиста.</p>
<p>Это значит, вы можете оценивать людей по-сделанному, а не по-сказанному».</p>
</blockquote>
<p>Нанимайте эрудитов.</p>
<blockquote><p>«Мы никогда не наймем кого-либо, чья профессия называется «разработчик структуры системы программного обеспечения». Это уж слишком. В маленьких командах, таких как наша, нет смысла в подобного рода узких специалистах.</p>
<p>В маленьких командах нужны мастера «на все руки».</p>
</blockquote>
<p>Неподдельный энтузиазм.</p>
<blockquote><p>«Энтузиазм. Свойство, не передающееся даже самым умелым притворством. Пришло время нанять кого-то в команду? Не думайте, что нам нужен гуру или хорошо известный (в тесных кругах) специалист. Такие всё равно чаще всего выступают в роли «свадебных генералов». Счастливый специалист средней руки лучше раздражённого эксперта».</p>
</blockquote>
<p>Нанимайте хороших писателей.</p>
<blockquote><p>«Если вы задумываетесь над тем, какого рода специалиста можно еще пригласить на не занятое место, — наймите того, кто лучше других умеет вести документацию».</p>
</blockquote>
<p><strong>Глава 9</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch09">Создание интерфейса</a>».</p>
<p>Сначала — интерфейс.</p>
<blockquote><p>«Слишком много приложений создаются с подходом &laquo;сначала программируем&raquo;. Это неудачная идея. Программирование &#8211; самое сложное в создании приложения, а это значит, что и самая дорогая. И создав код, вам будет сложно его изменить. Вместо этого начинайте с дизайна интерфейса.</p>
<p>[...]</p>
</blockquote>
<blockquote><p>Другая причина для того, чтобы начинать с дизайна в том, что интерфейс и есть продукт. Вы продаете людям то, что они видят. И если вы оставите интерфейс &laquo;на потом&raquo;, огрехи будут заметны».</p>
</blockquote>
<p>Дизайн от эпицентра.</p>
<blockquote><p>«Без чего страница аобсолютно не может быть &#8211; это без эпицентра. К примеру, если вы разрабатываете страницу, которая показывает пост в блоге, пост &#8211; это и есть эпицентр. Не категории в сайдбаре, не заголовок страницы, не форма комментариев внизу, а именно пост. Без поста эта страница бессмысленна».</p>
</blockquote>
<p>Три состояния программы.</p>
<blockquote><p>«Для каждого экрана вы должны рассмотреть три состояния:</p>
<ul>
<li>Обычное<br />
 Экран, который люди видят каждый день при работе с приложением, заполненным данными.</li>
<li>Пустое<br />
 Экран, который люди видят при первом запуске, и ещё не успели ввести данные.</li>
<li>Ошибка!<br />
 Экран, который люди видят, когда что-то идёт не так».</li>
</ul>
</blockquote>
<p>С самого начала.</p>
<blockquote><p>«Создавайте ожидания, продумав то, какой опыт получит пользователь при первом запуске».</p>
</blockquote>
<p>Защищайтесь.</p>
<blockquote><p>«Посмотрим правде в глаза: неполадки обязательно будут происходить. Как бы тщательно вы не проектировали приложение, сколько бы времени не посвятили тестированию, у клиентов все равно будут случаться проблемы. Так как вы будете обрабатывать эти поломки? С помощью оборонительного дизайна.</p>
<p>[...]</p>
<p>Помните: ваше приложение может работать отлично в 90% случаев. Но если вы бросаете пользователей на произвол судьбы там, где ваша помощь им нужна – они вряд ли это забудут».</p>
</blockquote>
<p>Содержание важнее целостности.</p>
<blockquote><p>«Это нормально — сделать дизайн непоследовательным, если в этом есть смысл. Давайте людям то, что имеет смысл. Давайте то, что им нужно, и избавте от того, что лишнее. Уместность лучше последовательности».</p>
</blockquote>
<p>Дизайн интерфейсов — это копирайтинг.</p>
<blockquote><p>«Если вы думаете что каждый пиксель, каждая иконка, каждый шрифт имеет значение, вы поверите и в значимость каждой буквы. Когда вы описываете свой интерфейс, всегда смотрите на него глазами пользователей. Что они должны знать? Как это объяснить лаконично и доходчиво?»</p>
</blockquote>
<p>Единый интерфейс.</p>
<blockquote><p>«Cтраницы, содержащие системные настройки, списки пользователей и т.п., зачастую крайне неудобны и ужасно выглядят. Всё потому, что большая часть времени тратится на разработку основного интерфейса.</p>
</blockquote>
<blockquote><p>Не создавайте отдельного интерфейса для настроек, просто встройте его функции в основной».</p>
</blockquote>
<p><strong>Глава 10</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch10">Код</a>».</p>
<p>Меньший объем программы.</p>
<blockquote><p>«Вам кажется, что имея в два раза больше кода, ваша программа будет только вдвое сложнее. На самом деле, каждый раз, когда вы увеличиваете объем кода, сложность программы возрастает экспоненциально».</p>
</blockquote>
<p>Оптимизируйте для счастья.</p>
<blockquote><p>«Счастливый программист — продуктивный программист. Вот почему мы оптимизируем удовлетворенность работой, и вам тоже стоит это делать. Выбирайте инструменты, базируясь не только на стандартах отрасли или производительности. Смотрите на неосязаемые факторы: чувствуется ли в инструменте страсть, гордость и мастерство? Будете ли вы по-настоящему счастливы, работая в этой среде восемь часов в день?</p>
<p>[...]</p>
<p>Вопреки общему мнению, языки программирования не равноценны. В то время как на любом языке можно написать практически любую программу, хороший язык сделает вашу задачу не просто возможной и терпимой, а радостной и дающей силы».</p>
</blockquote>
<p>Говорит код.</p>
<blockquote><p>«Прислушивайтесь к своему коду. Он будет высказывать предложения. Он будет сопротивляться. Он расскажет, где стоят ловушки. Он предложит новые пути решений. Он поможет вам держаться модели меньшего объема программы».</p>
</blockquote>
<p>Разберитесь с долгами.</p>
<blockquote><p>«Наваяли блок кода, который функционален, но все еще неопрятен – вот вы и набрали долгов. Набросали дизайн по принципу “и так сойдет” – ваши долги выросли опять.</p>
<p>Время от времени так поступать можно. Часто такая техника помогает поскорее довести проект в стиле Get Real до конца. Но все равно нужно признать эти долги и рано или поздно расплатиться с ними – вычистить неопрятный код, переделать ту страницу, которая была сделана так себе».</p>
</blockquote>
<p>Открытые двери.</p>
<blockquote><p>«Не пытайтесь запереть ваших клиентов. Позвольте им получить принадлежащую им информацию когда они хотят и как они хотят. Для этого вам придется отказаться от идеи запечатать данные. Выпустите их. Дайте людям доступ к их информации через RSS. Обеспечьте API, позволяющие другим разработчикам подсоединяться к вашей программе. Поступая так, вы облегчаете жизнь клиентам и расширяете возможности своей программы».</p>
</blockquote>
<p><strong>Глава 11</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch11">Слова</a>».</p>
<p>В функциональной спецификации нет ни грамма функциональности.</p>
<blockquote><p>«Забудьте о спецификациях, подписанных раз и навсегда. Они заставляют вас принимать крупные, ключевые решения слишком рано в процессе разработки. Обойдите стороной стадию спецификации, и вам удастся быть гибкими и сделать изменения дешевле».</p>
</blockquote>
<p>Не рождайте мертвых документов.</p>
<blockquote><p>«Избегать функциональных спецификаций хорошо, но этого мало. Предотвращайте ненужное бумаготворчество везде, где можете. Если только документ не собирается воплотиться во что-то реальное — не создавайте его».</p>
</blockquote>
<p>Расскажите короткую историю.</p>
<blockquote><p>«Если вам нужны слова, чтобы описать новую функцию или изложить идею – напишите об этом короткий рассказ. Не углубляйтесь в технические или архитектурные детали, просто расскажите историю. Сделайте это на человеческом языке, как бы вы это сделали в разговоре».</p>
</blockquote>
<p>Пользуйтесь обычными словами.</p>
<blockquote><p>«Вставьте настоящий текст вместо lorem ipsum».</p>
</blockquote>
<p>Очеловечьте ваш продукт.</p>
<blockquote><p>«Подумайте о своем продукте как о человеке. Каким человеком вы бы хотели его видеть? Вежливым? Неумолимым? Прощающим? Требовательным? Веселым? Бесстрастным? Серьезным? Разболтанным? Хотите, чтобы он выглядел параноидальным или доверяющим? Всезнайкой? Или скромным и обаятельным?»</p>
</blockquote>
<p><strong>Глава 12</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch12">Цена и регистрация</a>».</p>
<p>Бесплатные образцы.</p>
<blockquote><p>«Раздавайте что-нибудь бесплатно</p>
<p>Мир полон шума и суеты. Чтобы вас заметили среди всего этого, раздавайте что-нибудь бесплатно».</p>
</blockquote>
<p>Легко войти, легко выйти</p>
<blockquote><p>«Сделайте начало использования вашей программы — и окончание использования — как можно проще».</p>
</blockquote>
<p>Раскраски.</p>
<blockquote><p>«Все эти &laquo;Растишки&raquo;, зайчишки и прочие завлекушки с наклейками и раскрасками — уловки для детей».</p>
</blockquote>
<p>Подсластите пилюлю.</p>
<blockquote><p>«Вам приходится объявлять плохие новости, такие как увеличение цены? Сделайте это как можно более безболезненным, сообщив об этом заранее. Также подумайте о том, чтобы освободить существующих пользователей от повышения цены на какое-то время. Эти люди обеспечивают вам хлеб с маслом, и вы хотите, чтобы они чувствовали себя уважаемыми, а не жертвами вымогательства».</p>
</blockquote>
<p><strong>Глава 13</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch13">Продвижение</a>».</p>
<p>Выпуск в голливудском стиле.</p>
<blockquote><p>«Если выпустить программу в лесу, где ее некому использовать, произведет ли она фурор? Мы о том, что если выпустить программу без предварительной подготовки, то, скорее всего, никто о ней не узнает».</p>
</blockquote>
<p>Мощный сайт для продвижения.</p>
<blockquote><p>«Лучшее средство для продвижения продукта – сам продукт. Если вы создали приложение, которое действительно нужно клиентам, об этом непременно узнают.</p>
<p>Тем не менее, вам все равно нужен мощный сайт для продвижения. Что туда можно поместить?»</p>
</blockquote>
<p>На волне блогов.</p>
<blockquote><p>«Реклама стоит дорого. А оценка эффективности различных типов рекламы может оказаться дороже самой рекламы. Когда у вас нет времени или денег, чтобы пойти по традиционному рекламному пути, подумайте о другом пути: рекламируйте через блоги.</p>
<p>Начните с создания блога, который не только хвалит ваш продукт, но еще и предлагает полезные советы, решения, ссылки и т.д.»</p>
</blockquote>
<p>Начинайте рекламировать как можно раньше.</p>
<p>Продвижение через обучение.</p>
<blockquote><p>«Как технология продвижения, обучение – мягкий путь к тому, чтобы ваше имя – равно как и название вашего продукта – появилось перед множеством людей. И вместо того, чтобы заниматься навязыванием продукта, вы получаете внимание за предоставление ценной услуги».</p>
</blockquote>
<p>Пища функциональности.</p>
<blockquote><p>«Добавление новых или интересных функций — хороший способ усилить разговоры о вашем приложении. Группы по интересам очень любят пережевывать “пищу функциональности” и выплевывать ее обратно в сообщество. Ладно, аналогия не слишком аппетитная, но смысл вы поняли.</p>
<p>[...]</p>
<p>Небольшие команды идут на шаг вперед, когда дело касается воплощения новых идей в программы. Там, где более крупным компаниям приходится преодолевать бюрократические препоны, вы можете быстро воплотить новые идеи и снискать внимание за их использование».</p>
</blockquote>
<p>Следите за логами.</p>
<blockquote><p>«Вам полезно знать, кто о вас говорит. Проверьте свои логи и узнайте, что откуда берется. Кто на вас ссылается? Кто ругается? Какие из блогов, попавшие в списки на Technorati, Blogdex, Feedster, Del.icio.us и Daypop, говорят о вас?»</p>
</blockquote>
<p>Продажи в процессе.</p>
<blockquote><p>«Существующие клиенты – ваш наиболее перспективный рынок для дальнейших продаж. Не стесняйтесь развивать бизнес с теми, кто уже знает и использует ваш продукт».</p>
</blockquote>
<p>На крючке названия.</p>
<blockquote><p>«Многие совершают большую ошибку, когда считают, что название продукта должно быть сверхинформативным. Не стоит выбирать название, которое содержит детальное описание продукта. Обычно в результате выходит немудреное и легко забывающееся название. Название Basecamр лучше, чем что-то типа Project Management Center или ProjectExpress. Writeboard – лучше, чем CollaborEdit».</p>
</blockquote>
<p><strong>Глава 14</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch14">Поддержка</a>».</p>
<p>Почувствуйте эту боль.</p>
<blockquote><p>«Избегайте постройки стен между вашими клиентами и командой разработчиков. Не передавайте техподдержки телефонному центру или сторонней организации. Осуществляйте ее сами. Вы, вся ваша команда, должны знать, что говорят ваши клиенты. Когда они недовольны, вы должны знать об этом. Вы должны слышать их отзывы. И вы тоже должны быть недовольны».</p>
</blockquote>
<p>Нулевое обучение.</p>
<blockquote><p>«Чтобы пользоваться сайтами Яндекса, Гугла или Озона, вам не нужны учебники или справочники. Почему бы вам не создать продукт, которому они тоже не нужны? Стремитесь создать продукт, не требующий обучения».</p>
</blockquote>
<p>Отвечайте быстро.</p>
<blockquote><p>«Пользователям нравится прямота, и часто их недовольство на глазах превращаются в вежливость, когда вы отвечаете быстро и прямо».</p>
</blockquote>
<p>Трудная любовь.</p>
<blockquote><p>«Будьте готовы сказать “нет” своим пользователям</p>
<p>Когда дело касается запросов и пожеланий о добавлении новых функций к программе, клиент не всегда прав. Если бы мы добавили каждую функцию, когда-либо предложенную нашими пользователями, наши продукты были бы никому не нужны.</p>
<p>[...]</p>
<p>Добавим к вышесказанному: крайне важно, чтобы вы, как компания-разработчик, любили свой продукт. А вы не сможете его любить, если он наполнен кучей вещей, с которыми вы не согласны. И это еще один довод в пользу того, чтобы отказать пользователям в выполнении запросов, в необходимость которых вы не верите».</p>
</blockquote>
<p>В хорошей компании.</p>
<blockquote><p>«Форумы и сетевые групповые чаты – хороший способ дать пользователям возможность задавать вопросы и помогать друг другу. Путем убирания посредника — то бишь вас — вы обеспечиваете открытый поток общения и экономите свое время».</p>
</blockquote>
<p>Публикуйте ваши неудачи.</p>
<blockquote><p>«Выпустите плохие новости и уберите их с дороги</p>
<p>Если что-либо пошло не так, расскажите людям. Даже если они не заметили».</p>
</blockquote>
<p><strong>Глава 15</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch15">После выпуска</a>».</p>
<p>Быстрое обновление.</p>
<blockquote><p>«Выпустите обновление через 30 дней после выпуска</p>
<p>Быстрое обновление показывает движение. Показывает, что вы прислушиваетесь к советам пользователей. Показывает, что у вас еще есть &laquo;порох в пороховницах&raquo;. Оно дает вторую волну разговорам. Оно подкрепляет первоначальные положительные эмоции, связанные с вашим продуктом. Оно дает пищу для обсуждения и сообщений в блогах».</p>
</blockquote>
<p>Продолжайте выпуск сообщений.</p>
<blockquote><p>«Покажите, что ваш продукт живет – продолжайте блог продукта после выпуска».</p>
</blockquote>
<p>Не бета, а лучше.</p>
<blockquote><p>«В наши дни кажется, что все постоянно находится в бета-версии. Неумирающая бета-версия говорит пользователям, что вы не так уж и хотите выпускать завершенный продукт. Она говорит: “Пользуйтесь вот этим, но если оно несовершенно – это не наша вина”».</p>
</blockquote>
<p>Не все ошибки в программе созданы равными.</p>
<blockquote><p>«Если вы нашли ошибку в вашем продукте – это не повод впадать в панику. Все программы содержат ошибки, это просто неоспоримый факт.</p>
<p>Не нужно сразу же исправлять каждую ошибку. Большинство ошибок надоедливы, но не смертельны. Те, которые надоедливы, могут быть отложены. Ошибки типа “что-то тут выглядит не так” и подобные можно без ущерба отложить на некоторое время. А уж если ошибка ломает вашу базу данных – тогда, конечно, она должна быть исправлена немедленно».</p>
</blockquote>
<p>Переждите шторм.</p>
<blockquote><p>«Если раскачивать лодку, появляются волны. Когда вы добавляете новую функцию, изменяете правила или удаляете что-нибудь – реакции будут разными, и часто отрицательными.</p>
<p>Избегайте паники и желания быстро все поменять в ответ».</p>
</blockquote>
<p>Не отставайте от соседей.</p>
<blockquote><p>«Подпишитесь на новости и о своих продуктах, и о продуктах конкурентов (это всегда мудро – следить за передвижениями противника)».</p>
</blockquote>
<p>Остерегайтесь монстра разбухания.</p>
<blockquote><p>«С развитием событий не бойтесь противостоять разбуханию. Всегда будет соблазн расширять продукт в объеме. Но это делать не обязательно. То, что продукт растет и становится более зрелым – не должно значить, что и более сложным».</p>
</blockquote>
<p>Двигайтесь по течению.</p>
<blockquote><p>«То, что придает красоту сетевым приложениям – это их изменяемость. Вы не упаковываете программу в коробочку, поставляете пользователю, а потом ждете новой версии в течение многих лет. Напротив, вы можете вносить изменения по пути. Примите мысль, что ваша первоначальная идея могла быть не самой лучшей».</p>
</blockquote>
<p><strong>Глава 16</strong>. «<a href="http://gettingreal.37signals.com/GR_rus.php#ch16">Заключение</a>».</p>
<p>Готово!</p>
<blockquote><p>«Ну хорошо, вы это сделали! Надеемся, вы с нетерпением ждете момента, чтобы начать применять Getting Real в своих программах. Сейчас самое лучшее время, чтобы создавать отличные программы, используя минимум ресурсов. При наличии хорошей идеи, страсти, времени и навыков – выше только небо».</p>
</blockquote>
<p>Воплощение.</p>
<blockquote><p>«Каждый может прочесть книгу. Каждый может придумать идею. У каждого есть родственник, работающий веб-дизайнером. Каждый может завести блог. Каждый может нанять кого-то еще, чтобы вместе наваять какой-то код.</p>
<p>Разница между вами и всеми остальными в том, как хорошо вы воплощаете. Успех достигается именно безупречным воплощением».</p>
</blockquote>
<p>Люди.</p>
<blockquote><p>«Стоит еще раз повторить, что главный элемент построения успешного сетевого приложения — это люди, работающие над ним. Мантры, проектирование от эпицентра, меньшее количество кода и все остальные замечательные идеи ничего не значат, если у вас нет людей, способных воплотить эти идеи».</p>
</blockquote>
<p>***</p>
<p>Мой вердикт после прочтения книги: <em>читать стоит всем</em>. Всем, кто в процессе работы или хобби что-то создает. Всем, кто работает в командах. Всем, кто работает с людьми. Хотя интересно читать эту книгу будет, пожалуй, все таки только тем людям, которые работают в области разработки ПО.</p>
<blockquote>
<ul>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.12.12~getting-real/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Делегирование обслуживания почтового домена: часть 2. Отправка почты через localhost (настройка Exim4 в Debian)</title>
		<link>http://valera.ws/2010.11.28~exim-mail-localhost/</link>
		<comments>http://valera.ws/2010.11.28~exim-mail-localhost/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 19:18:55 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Exim]]></category>
		<category><![CDATA[GMail]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[почта]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[сайты]]></category>
		<category><![CDATA[Яндекс]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=455</guid>
		<description><![CDATA[Настройка Exim и PHP mail() на примере Linux Debian Чтобы решить проблему отказа серверов Gmail от обслуживания  при отправке большого числа писем на несуществующие адреса, используем для отправки почты из скриптов сайта локальный почтовый SMTP-сервер (MTA). Локальный сервер будет выступать &#8230; <a href="http://valera.ws/2010.11.28~exim-mail-localhost/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Настройка Exim и <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> mail() на примере Linux Debian</h2>
<p>Чтобы решить проблему отказа серверов Gmail от обслуживания  при отправке большого числа писем на несуществующие адреса, используем для отправки почты из скриптов сайта локальный почтовый SMTP-сервер (<a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80">MTA</a>). Локальный сервер будет выступать в качестве <a href="http://en.wikipedia.org/wiki/Open_mail_relay">mail relay</a>. В дополнение мы откажемся от подключения из скрипта к удаленному серверу, что может быть медленно. Локальные подключения всегда должны быть быстрее и стабильнее.<span id="more-455"></span></p>
<p>Локальный сервер мы будем использовать только для отправки писем. Причем, не важно, как будет происходить отправка: непосредственно через SMTP, или с помощью <a href="http://en.wikipedia.org/wiki/Mail_user_agent">MUA</a>. Получение почты по-прежнему будет происходить с серверов Gmail.</p>
<p>В дистрибутиве Debian 5 по умолчанию устанавливается MTA <a href="http://ru.wikipedia.org/wiki/Exim">Exim4</a>. Он отлично подойдет для наших задач. Причем его настройка производится с помощью мастера и невероятно проста. Настроить сервер требуется на прием соединений исключительно с локального соединения. При этом не нужно поручать ему обслуживание доменов, кроме дефолтного локального (localhost).</p>
<p>Итак, если Exim у вас не установлен, то установим его:</p>
<p class="console"># aptitude install exim4</p>
<p>Далее запускаем его конфигурацию:</p>
<p class="console"># dpkg-reconfigure exim4-config</p>
<p>1. На первом шаге необходимо выбрать конфигурацию сервера. В Exim есть несколько стандартных конфигураций, предназначенных для разных случаев. Подробнее о них в мануале. Нам нужна конфигурация “internet site; mail is sent and received directly using SMTP”.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-1.png"></a><a href="http://valera.ws/wp-content/uploads/2010/11/exim-1.png"><img class="alignnone size-full wp-image-461" title="exim-1" src="http://valera.ws/wp-content/uploads/2010/11/exim-1.png" alt="" width="721" height="393" /></a></p>
<p>2. Далее укажите имя сервера. Оно будет передаваться в SMTP-протоколе в команде HELLO, т.е. будет видно получателям вашей почты. Лучше всего, чтобы это имя совпадало с доменом, с которого шлется <a href="http://valera.ws/tag/%d0%bf%d0%be%d1%87%d1%82%d0%b0/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  почта">почта</a>. Например, valera.ws.</p>
<p>Если у вас на сервере несколько сайтов с разными доменами (см. ниже), то лучше это имя сделать нейтральным, чтобы «не палиться». Например, можно выбрать local-mail-agent.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-2.png"><img class="alignnone size-full wp-image-462" title="exim-2" src="http://valera.ws/wp-content/uploads/2010/11/exim-2.png" alt="" width="776" height="442" /></a></p>
<p>3. Далее требуется указать, какие интерфейсы должен слушать Exim. В нашем случае удаленные подключения мало того, что не нужны, так еще и опасны: кто угодно сможет рассылать почту через ваш сервер. Указываем только 127.0.0.1.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-3.png"><img class="alignnone size-full wp-image-463" title="exim-3" src="http://valera.ws/wp-content/uploads/2010/11/exim-3.png" alt="" width="776" height="442" /></a></p>
<p>4. Далее спрашивается, какие домены должен обслуживать сервер. Т.е. для каких доменов не нужно пересылать письма на удаленные SMTP-сервера, пользователь заберет их с этого сервера. Нам не нужно обслуживание наших доменов. Можно указать только localhost, т.к. его больше обслужить некому.</p>
<p>Не указывайте здесь адрес вашего сервера (подставляется по умолчанию), т.к. его обслуживание делегировано Gmail. Если его указать, то письма, отправленные на ящики вашего домена, в Gmail не попадут и останутся на сервере. Это не нужно.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-4.png"><img class="alignnone size-full wp-image-464" title="exim-4" src="http://valera.ws/wp-content/uploads/2010/11/exim-4.png" alt="" width="776" height="442" /></a></p>
<p>5. Далее можно указать, для каких доменов сервер должен служить релеем (список через точку с запятой). Здесь не указываем ничего, так как на следующем шаге мы разрешим себе релей для всех доменов. Можете указать список ваших доменов.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-5.png"><img class="alignnone size-full wp-image-465" title="exim-5" src="http://valera.ws/wp-content/uploads/2010/11/exim-5.png" alt="" width="776" height="442" /></a></p>
<p>6. Здесь укажем 127.0.0.1, чтобы раз-решить релей для всех запросов с локального <a href="http://valera.ws/tag/ip/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IP">IP</a>.</p>
<p>При этой конфигурации есть один негативный момент. Если ваш сайт поломают, то злоумышленники смогут слать почту с любых доменов через ваш сервер. Если на сервере 1—2 сайта, то лучше на этом шаге оставить поле пустым, а на предыдущем шаге внести список этих доменов (для возврата на шаг назад нажмите кнопку “Cancel”). При появлении новых доменов не забывайте их заносить в конфиг. Если вы считаете свои сайты надежными, то проще всего указывать здесь 127.0.0.1.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-6.png"><img class="alignnone size-full wp-image-466" title="exim-6" src="http://valera.ws/wp-content/uploads/2010/11/exim-6.png" alt="" width="776" height="442" /></a></p>
<p>7. Дале уточняется, является ли для нас проблемой постоянные DNS-запросы при отправке каждого письма. В 99,9% это не проблема, так что выбираем ответ на вопрос “Keep number of DNS-queries minimal (Dial-on-Demand)?” “No”.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-7.png"><img class="alignnone size-full wp-image-467" title="exim-7" src="http://valera.ws/wp-content/uploads/2010/11/exim-7.png" alt="" width="776" height="442" /></a></p>
<p>8. Где хранить локальную почту (помните, мы указали серверу обслуживать домен localhost?) нам по сути не важно, так как этим как правило никто не пользуется. Можно выбрать вариант по умолчанию: складывать все в /var/mail.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-8.png"><img class="alignnone size-full wp-image-468" title="exim-8" src="http://valera.ws/wp-content/uploads/2010/11/exim-8.png" alt="" width="776" height="442" /></a></p>
<p>9. Предпоследний шаг — выбор конфигурации. Хранить все в одном файле, или раскидать по множеству мелких файлов. В большой файл проще вносить большие изменения, а с мелкими проще работать в случае мелких правок. Выберите вариант на свой вкус. Я выбрал “unsplit configuration” (ответ “No”).</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-9.png"><img class="alignnone size-full wp-image-469" title="exim-9" src="http://valera.ws/wp-content/uploads/2010/11/exim-9.png" alt="" width="776" height="442" /></a></p>
<p>10. На последнем шаге укажем на какой аккаунт реального пользователя системы пересылать сообщения, отправленные на служебные аккаунты postmaster, root и т.д. Здесь имеет смысл указать ваше имя пользователя в системе.</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/exim-10.png"><img class="alignnone size-full wp-image-470" title="exim-10" src="http://valera.ws/wp-content/uploads/2010/11/exim-10.png" alt="" width="776" height="442" /></a></p>
<p>Переконфигурировать Exim в любой момент можно тем же способом. Мастер подставит в значения по умолчанию текущие значения вашей конфигурации.</p>
<h2>Правильная настройка SPF</h2>
<p>Если кратко, то <a href="http://ru.wikipedia.org/wiki/Sender_Policy_Framework">SPF</a> — это способ борьбы со спамом.</p>
<p>Мы собираемся отправлять почту с сервера, <a href="http://en.wikipedia.org/wiki/PTR_record#PTR">PTR</a> IP которого не равен одной из MX-записей сервера, а так же в большинстве случаев <a href="http://en.wikipedia.org/wiki/PTR_record#PTR">PTR</a> IP не равен самому нашему домену (не всегда хостеры соглашаются менять PTR). В этом случае вероятность попадания писем в спам повышается. Но есть хороший способ ее понизить: указать правильно запись SPF нашего домена.</p>
<p>SPF-запись — это обыкновенная запись доменной зоны, имеющая тип TXT. Узнать текущее ее значение для домена можно с помощью команды host в Linux:</p>
<p class="console">$ host -t TXT valera.ws<br />
 valera.ws TXT record currently not present</p>
<p>В данном примере SPF-запись не задана. Зададим ее. С моего домена почта может отправляться с серверов Gmail и с моего сервера. Для начала узнаем, какой PTR моего сайта (valera.ws):</p>
<p class="console">$ nslookup valera.ws<br />
 Server:      194.224.52.4<br />
 Address:     194.224.52.4#53</p>
<p class="console">Non-authoritative answer:<br />
 Name:     valera.ws<br />
 Address:  93.174.6.118</p>
<p>IP-адрес моего сервера 93.174.6.118. Узнаем PTR:</p>
<p class="console">$ nslookup 93.174.6.118<br />
 Server:      194.224.52.4<br />
 Address:     194.224.52.4#53</p>
<p class="console">Non-authoritative answer:<br />
 118.6.174.93.in-addr.arpa	name = server.valera.ws.</p>
<p>Видно, что PTR IP, к которому привязан мой домен (IP моего сервера) — server.valera.ws.</p>
<p class="console">v=spf1 a mx ptr include:_spf.<a href="http://valera.ws/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">google</a>.com ~all</p>
<p>По порядку:</p>
<ul>
<li>v=spf1 — версия SPF (первая);</li>
<li>a — разрешение отправлять почту с IP, указанного в A-записи домена (собственно с сервера, на который ваш домен ссылается);</li>
<li>mx — разрешение отправлять почту с IP, указанных в MX-записях домена (в нашем случае сервера Gmail);</li>
<li>ptr — разрешение отправлять почту с IP, PTR-запись которых содержит ваш домен (т.е. сам домен и поддомены);</li>
<li>include:_spf.google.com — подключение разрешений для серверов отправки почту Gmail (совсем не обязательно почта будет слаться с серверов, указанных в MX-записи);</li>
<li>~all — нейтральная реакция на всю остальную почту; здесь можно указать -all, что будет значить, что почта, не попадающая под эти правила, — спам.</li>
</ul>
<p>Если вы хотите отправлять почту с сервера, не попадающего под все эти правила, его можно указать по IP или домену PTR, например:</p>
<p class="console">v=spf1 a mx ptr ptr:example.com include:_spf.google.com ~all</p>
<p>Запись указывается для вашего домена соответствующим образом, который определяет владелец DNS-сервера. Обычно сервером заведует хостер и предоставляет возможность вносить изменения в DNS-зоны через панель хостинга. Либо сам по запросу в саппорт меняет запись. В зональном файле должна появиться запись вида:</p>
<p class="console">valera.ws.      TXT      v=spf1 a mx ptr include:_spf.google.com ~all</p>
<p>После обновления зоны host выдаст следующее:</p>
<p class="console">$ host -t TXT valera.ws<br />
 valera.ws      TXT      &raquo;v=spf1 a mx ptr include:_spf.google.com ~all&raquo;</p>
<h2>PHP mail()</h2>
<p>После всей этой настройки функция <a href="http://php.net/manual/en/function.mail.php">mail()</a> в PHP начнет слать почту через ваш локальный сервер на законных основаниях для антиспам-ботов. Но косяк будет в том, что в поле отправителя будет фигурировать адрес системного пользователя www-data@localdomain. Нас это не устраивает. Чтобы почта правильно слалась из mail(), необходимо использовать ее дополнительный параметр.</p>
<p class="console">bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )</p>
<p>Именно $additional_parameters нас и интерисует. В него надо передавать реального отправителя:</p>
<p class="console">mail($to, $subject, $message, $additional_headers, $additional_parameters.&raquo; -frealsender@valera.ws&raquo;);</p>
<p>Указывается отправитель слитно с параметром -f.</p>
<p>Теперь отправленные через mail() письма будут абсолютно адекватны (при условии, что вы указываете все нужные SMTP-заголовки, вроде “FROM:”, “TO:” и т.д.).</p>
<h2>А если несколько сайтов с разными IP (настройка Exim для отправки писем с разных IP)?</h2>
<p>Мы хотим использовать локальный SMTP-сервер для отправки почты со всех сайтов на сервере. Никаких проблем нет, если настроен Exim правильно (см. выше). Но проблема появляется, если разные сайты работают на разных IP. Мы не хотим в почте «палить» то, что все наши сайты живут на одном сервере. Но Exim по умолчанию шлет всю почту с основного (первого) IP сетевого интерфейса, а этот IP всем получателям в SMTP-заголовках “Received:” письма. Кроме того, там указывается и имя сервера, которые мы в случае с разными сайтами на сервере выбрали нейтральными.</p>
<p>Чтобы не «палить» IP сервера, нужно отсылать письмо на удаленный сервер с IP, равного A-записи домена сайта. Делается это несложно путем изменения конфига Exim. Внесем изменения в настройки транспорта SMTP Exim. Если вы выбрали монолитный конфиг, то нужно отредактировать файл:</p>
<p class="console"># nano /etc/exim4/exim4.conf.template</p>
<p>Находим в файле строку “remote_smtp:” (поиск в nano — F6). Добавляем в конец этого блока:</p>
<p class="console">interface = &laquo;${lookup{$sender_address_domain}lsearch{/usr/share/exim4/domain2ip}{$value}}&raquo;<br />
 helo_data = &laquo;$sender_address_domain&raquo;</p>
<p>Это значит, что при отправке письма нужно определить домен отправителя почты (для sender@valera.ws это valera.ws) и отправить почту с IP, к которому этот домен привязан. Само собой разумеется, что домен должен быть привязан к серверу, где установлен Exim.</p>
<p>Так же нужно создать файл в любом месте файл привязки доменов к IP (у домена может быть несколько IP, так что просто lookup-ить его не прокатит). Я выбрал для файла место: /usr/share/exim4/domain2ip</p>
<p class="console"># nano /usr/share/exim4/domain2ip</p>
<p>Туда вводим наши домены по шаблону:</p>
<p class="console">valera.ws: 123.123.123.123<br />
 vasya.ws: 123.123.123.124</p>
<p>Не забудьте дописать домен в файл в случае появления нового сайта.<br />
 Кстати, строку helo_data = &laquo;$sender_address_domain&raquo; можно добавить в файл даже если у вас один IP на все сайты. Тогда в команде HELLO SMTP-протокола (а, следовательно, и в заголовках писем) будет фигурировать ваш домен.</p>
<p>Идея с указанием интерфейса взята отсюда: <a href="http://www.directadmin.com/forum/showthread.php?t=36468">http://www.directadmin.com/forum/showthread.php?t=36468</a></p>
<h2>Проверка</h2>
<p>Остается проверить, чтобы все ваши настройки работали верно. Для этого просто отправим письмо с локального сервера через консоль.</p>
<p class="console">$ mail -a &laquo;From:feedbee@valera.ws&raquo; -s Test feedbee@gmail.com &#8212; -ffeedbee@valera.ws<br />
 Test &lt;Ctrl-D&gt;<br />
 Cc:</p>
<p>Проверяем отосланное письмо в ящике получателя:</p>
<p><a href="http://valera.ws/wp-content/uploads/2010/11/check.png"><img class="alignnone size-full wp-image-471" title="check" src="http://valera.ws/wp-content/uploads/2010/11/check.png" alt="" width="689" height="337" /></a></p>
<p>А вот текст SMTP-протокола:</p>
<p class="console">Delivered-To: feedbee@gmail.com<br />
 Received: by 10.236.109.139 with SMTP id s11cs13826yhg;<br />
 Wed, 24 Nov 2010 02:18:14 -0800 (PST)<br />
 Received: by 10.227.145.134 with SMTP id d6mr9025492wbv.195.1290593893066;<br />
 Wed, 24 Nov 2010 02:18:13 -0800 (PST)<br />
 Return-Path: feedbee@valera.ws<br />
 Received: from valera.ws (server.valera.ws [93.174.6.118])<br />
 by mx.google.com with ESMTP id b7si11085685wer.164.2010.11.24.02.18.12;<br />
 Wed, 24 Nov 2010 02:18:12 -0800 (PST)<br />
 Received-SPF: pass (google.com: domain of feedbee@valera.ws designates 93.174.6.118 as permitted sender) client-ip=93.174.6.118;<br />
 Authentication-Results: mx.google.com; spf=pass (google.com: domain of feedbee@valera.ws designates 93.174.6.118 as permitted sender) smtp.mail=feedbee@valera.ws<br />
 Received: from root by server.valera.ws with local (Exim 4.69)<br />
 (envelope-from &lt;feedbee@valera.ws&gt;)<br />
 id 1PLCQW-0006KD-Pc<br />
 for feedbee@gmail.com; Wed, 24 Nov 2010 10:18:12 +0000<br />
 To: feedbee@gmail.com<br />
 Subject: Test<br />
 From:feedbee@valera.ws<br />
 Message-Id: E1PLCQW-0006KD-Pc@server.valera.ws<br />
 Date: Wed, 24 Nov 2010 10:18:12 +0000</p>
<p class="console">Test</p>
<p>P.S. Чтобы отправленная почта не попадала в спам, отправляйте письма только от имени реально существующих на серверах Gmail адресов на ваших доменах. Туда же повалятся уведомления о недоставках.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.11.28~exim-mail-localhost/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Делегирование обслуживания почтового домена: часть 1. Почта для домена</title>
		<link>http://valera.ws/2010.11.28~mail-service-delegation/</link>
		<comments>http://valera.ws/2010.11.28~mail-service-delegation/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 17:46:27 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[GMail]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[почта]]></category>
		<category><![CDATA[сайты]]></category>
		<category><![CDATA[Яндекс]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=452</guid>
		<description><![CDATA[Почта для домена Уже давно стандартом агента электронной почты (MTA) стали веб-приложения типа Gmail. Такие сервисы предоставляют удобный, стабильный быстрый доступ к почте из любого места, хороший поиск писем в ящике, много места для их хранения, отличную защиту от спама. &#8230; <a href="http://valera.ws/2010.11.28~mail-service-delegation/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Почта для домена</h2>
<p>Уже давно стандартом агента электронной почты (<a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80">MTA</a>) стали веб-приложения типа <a href="http://gmail.com/">Gmail</a>. Такие сервисы предоставляют удобный, стабильный быстрый доступ к почте из любого места, хороший поиск писем в ящике, много места для их хранения, отличную защиту от спама. Постепенно все больше и больше людей отказывались от <a href="http://www.ritlabs.com/ru/products/thebat/">The Bat!</a> и <a href="http://office.microsoft.com/ru-ru/outlook/">Outlook</a> в пользу <a href="http://valera.ws/tag/gmail/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  GMail">Gmail</a>, <a href="http://mail.yahoo.com/">Yahoo! Mail</a>, <a href="http://www.hotmail.com/">Hotmail</a>, <a href="http://mail.yandex.ru/">Яндекс.Почты</a>.<span id="more-452"></span></p>
<p>Но многим хотелось иметь почту на своем домене. Еще несколько лет назад, пользуясь почтой на своем домене, приходилось прибегать к хитростям пересылки и сбора почты, которые были доступны как минимум в Gmail и почте Яндекса. Это вызывало некоторые неудобства.</p>
<p>Первыми догадались бесплатно предлагать полное обслуживание почты на домене Google. В рамках проекта <a href="https://www.google.com/a/">Google for domains</a> (первое название) они предлагали указать MX-записи вашего домена на сервера Google и полностью возложить на себя обслуживание вашей почты, тем самым объединяя качественный сервис и красивое имя ящика.</p>
<p>Постепенно проект Google for domains влился в Google Apps, были введены некоторые ограничения и платный сервис. После этого на ту же тропу вступил <a href="http://valera.ws/tag/yandeks/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Яндекс">Яндекс</a>, открыв сервис ПДД — «<a href="http://pdd.yandex.ru/">Почта для домена</a>». Политика Яндекса была значительно демократичнее Google. Пользователь получил возможность выбрать наиболее подходящий для себя сервис.</p>
<p>В настоящее время оба сервиса развиты достаточно хорошо и конкурентов у них на горизонте не видно.</p>
<h2>Зачем это нужно?</h2>
<p>Как уже было отмечено выше, Google и Яндекс предлагают стабильную, удобную, гибкую систему обработки почты и доступа к ней с помощью веб-интерфейса, а так же лучшую в мире защиту от спама. Никто другой пока не может предложить даже платно услуги такого уровня. Говорить о почтовых сервисах хостеров, или, тем более, интернет-провайдеров, уже давно не имеет смысла. А содержание своей почтовой системы на своем сервере со временем гарантированно приведет к тоннам спама в ваших ящиках. Ну и скорее всего, за год выдастся хотя бы пару дней, когда ваша почта будет «лежать».</p>
<p>Очевидно, что для организации или частного лица делегирование обслуживания почты на своем домене — самый эффективный и экономичный способ решения проблем надежности, чистоты и удобства доступа к почте.</p>
<h2>Google или Яндекс?</h2>
<p>Выбирать, кому отдать почту для обслуживания, русскоговорящие пользователи могут среди двух конкурентов: Google и Яндекс. Оба предоставляют достойный сервис и похожи друг на друга. Но есть пару важных отличий.</p>
<p>В пользу Google:</p>
<ul>
<li>список дополнительных сервисов для домена от Google значительно шире, чем у Яндекса;</li>
<li>есть поддержка других языков, кроме русского.</li>
</ul>
<p>В пользу Яндекс.Почты:</p>
<ul>
<li>нет ограничения на 50 аккаунтов, как у Google в бесплатной подписке;</li>
<li>есть возможность бесплатно прикрутить систему самостоятельной регистрации пользователя.</li>
</ul>
<p>Каждый для себя сам может решить, что для него важнее. Я пробовал подключать и один сервис, и другой. От обоих остался удовлетворенным. Но для своей организации я выбрал Gmail, так как ограничение 50-ти ящиков не существенно, работать с Google я стал раньше, чем появилась «Почта для доменов» Яндекса, интерфейс Gmail мне и моим коллегам субъективно нравится больше, чем Яндекс.Почты.</p>
<h2>Проблемы делегирования почты</h2>
<p>При делегировании обслуживания почты на сервера Google или Яндекса, возникают некоторые вопросы с отправкой почты из скриптов. Если рассылать письма с помощью агента (<a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80">MTA</a>), «встроенного» в операционную систему, например функцией mail(), то можно сталкнуться с тем. что много писем будут попадать пользователям в спам. Это связано с настройкой агента и локального SMTP-сервера, через которого агент шлет письма.</p>
<p>Если рассылать почту по SMTP через сервера Google или Яндекса, то почта попадет в спам только при реально спамерском содержимом писем. Но, Google поддерживает подключения только с SSL-шифрованием. Следовательно ваш клиент должен уметь SSL. Кроме того, с целью защиты от спама Google блокирует отправку писем, если в течение некоторого малого времени не удается отправить большое число писем (приходят возвраты). Как дела с этим у Яндекса, я не проверял, но думаю, что у них тоже есть защита.</p>
<p>Плюс при рассылке по SMTP приходиться делать подключения к удаленному серверу по сети, что всегда более затратно, чем работа с localhost.</p>
<p>Короче говоря, рассылать почту с сайта нужно через локальный сервер, но его нужно настроить так, чтобы письма выглядели как положено и не отсеивались антиспам-фильтрами. Об этом и будет <a href="http://valera.ws/2010.11.28~exim-mail-localhost/">вторая часть</a> статьи.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.11.28~mail-service-delegation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Базовые станции WiMax в Минске</title>
		<link>http://valera.ws/2010.04.19~wimax-minsk/</link>
		<comments>http://valera.ws/2010.04.19~wimax-minsk/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 12:27:35 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Жизнь]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=400</guid>
		<description><![CDATA[ByFly (Белтелеком) стал первым оператором связи, который запустил в Беларуси сеть 4G WiMax в коммерческую эксплуатацию. На даменный момент сеть работает только в городе Минске По состоянию на 19 апреля 2010 года в городе работают 22 вышки. В данном посте &#8230; <a href="http://valera.ws/2010.04.19~wimax-minsk/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://byfly.by/">ByFly</a> (Белтелеком) стал первым оператором связи, который запустил в Беларуси сеть 4G <a href="http://www.byfly.by/wimax/">WiMax</a> в коммерческую эксплуатацию. На даменный момент сеть работает только в городе Минске По состоянию на 19 апреля 2010 года в городе <a href="http://maps.yandex.ru/?um=t5s0v8Rb_PvbHQcgya2Cv2N6Ku6et6p8&#038;l=map">работают 22 вышки</a>. В данном посте представлена карта расположения вышек в Минске.</p>
<p><span id="more-400"></span></p>
<p>Учитывайте, что <a href="http://www.byfly.by/wimax/">по информации ByFly</a> радиус действия базовой станции в условиях городской застройки составляет около 1 км.</p>
<p><!-- Этот блок кода нужно вставить в ту часть страницы, где вы хотите разместить карту  (начало) --><br />
<script src="http://bit.ly/dl84WB" type="text/javascript"></script> <script type="text/javascript">// <![CDATA[
    YMaps.jQuery(function () {
        var map = new YMaps.Map(YMaps.jQuery("#YMapsID-1756")[0]);
        map.setCenter(new YMaps.GeoPoint(27.547054,53.905068), 11, YMaps.MapType.MAP);
        map.addControl(new YMaps.Zoom());
        map.addControl(new YMaps.ToolBar());
        map.addControl(new YMaps.TypeControl());
        map.addControl(new YMaps.SearchControl());
        map.addControl(new YMaps.ScaleLine());
        var ml = new YMaps.YMapsML("http://feedbee.server.valera.ws/wimax.xml");
        //http://maps.yandex.ru/export/usermaps/t5s0v8Rb_PvbHQcgya2Cv2N6Ku6et6p8/
        map.addOverlay(ml);
        map.enableScrollZoom();
        map.enableHotKeys();
        map.enableRightButtonMagnifier();
        function createObject (type, point, style, description) {
            var allowObjects = ["Placemark", "Polyline", "Polygon"],
                index = YMaps.jQuery.inArray( type, allowObjects),
                constructor = allowObjects[(index == -1) ? 0 : index];
                description = description || "";
            var object = new YMaps[constructor](point, {style: style, hasBalloon : !!description});
            object.description = description;
            return object;
        }
    });
// ]]&gt;</script></p>
<div id="YMapsID-1756" style="width:700px;height:500px"></div>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.04.19~wimax-minsk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Я.Субботник в Минске</title>
		<link>http://valera.ws/2010.04.15~yandex-subbotnik-minsk/</link>
		<comments>http://valera.ws/2010.04.15~yandex-subbotnik-minsk/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 16:12:45 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Мероприятия]]></category>
		<category><![CDATA[Яндекс]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=383</guid>
		<description><![CDATA[Сегодня (15 апреля 2010 года) прошел первый в Беларуси Яндекс.Субботник. Было просто супер и проведено на высочайшем уровне. Интересные и полезные доклады, интересные докладчики (руководители направлений Яндекса), активная аудитория, отличные условия (Кроун Плазе зачет). Updated 21:10 15.04.2010 по Минску. Причем, &#8230; <a href="http://valera.ws/2010.04.15~yandex-subbotnik-minsk/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-386" style="margin: 5px;" title="Яндекс" src="http://valera.ws/wp-content/uploads/2010/04/b-head-logo.png" alt="Яндекс" width="95" height="37" />Сегодня (15 апреля 2010 года) прошел первый в Беларуси <a href="http://company.yandex.ru/public/subbotnik/schedule.xml" target="_blank">Яндекс.Субботник</a>. Было просто супер и проведено на высочайшем уровне. Интересные и полезные доклады, интересные докладчики (руководители направлений Яндекса), активная аудитория, отличные условия (Кроун Плазе зачет).</p>
<p>Updated 21:10 15.04.2010 по Минску.</p>
<p><span id="more-383"></span>Причем, мероприятие было (как и все Субботники Яндекса) бесплатное. Но это не помешало организаторам снять отличное помещение, заказать кучу еды и кофе (было больше, чем нужно), раздать сувениры и подарки активным вопросозадавателям (среди которых был и я).</p>
<p>Докладчики очень приятные и профессиональные. Их было интересно слушать, с ними было интересно общаться. Все были максимально открыты.</p>
<p>Первым выступал <a href="http://asebrant.ya.ru/" target="_blank">Андрей Себрант</a> — директор по маркетингу Яндекса. Общий доклад, ответы на общие вопросы. Убедительный рассказ о том, что время изобретения своих велосипедов с нуля прошло. Сейчас время сбора из комплектующих. Как раз поставой комплектующих и занимается Яндекс: ядро всех докладов — интеграция API сервисов Яндекса и партнерская поставка контента Яндексу в обмен на трафик.</p>
<p>Затем <a href="http://funsad.ya.ru/">Александр Садовский</a> рассказал о поиске и особенностях белорусской версии. Яндекс стремится к региональности. Результаты поиска в разных регионах существенно разнятся. Кроме того, теперь в поиске учитывается морфология белорусского языка (правда пока в зачаточной стадии). В идеале целью Яндекса является полная персонификация выдачи под клиента. Поисковые подсказки тоже региональные.</p>
<p>Александр заметил, что надо обращать внимание на такие вещи, как карта сайта и robots.txt для повышения позиции в выдаче. Кроме того, существует множество настроек и корректировок в интерфейсе <a href="http://webmaster.yandex.ru/" target="_blank">Яндекс.Вебмастер</a>, которые необходимо использовать.</p>
<p>Михаил Сенин кратко поведал о серверисе Яндекс.Сайт. Самый скромный доклад и практически ничего нового.</p>
<p>Если я не ошибся, то <a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%B3%D0%B0%D0%BB%D0%BE%D0%B2%D0%B8%D1%87,_%D0%98%D0%BB%D1%8C%D1%8F_%D0%92%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%B8%D0%BD%D0%BE%D0%B2%D0%B8%D1%87" target="_blank">Илья Сегалович</a> довольно интересно рассказал о юзкейсах API Яндекс.Карт и о перспективах сервиса. API сервиса постоянно совершенствуется, и уже сейчас доступны довольно мощные инструменты для интеграции. Например, практически неограниченное количество меток на карте (смотрите <a href="http://bankomator.ru/#lat=55.816895&amp;lng=37.567844&amp;z=11&amp;banks=1" target="_blank">пример</a> с терминалами Киви в Москве). Так же отмечу возможность в API поиска координат по адресу, точек в заданном радиусе от точки, расчет оптимальных маршрутов. Правда последнее для Минска пока не поддерживается из-за отсутствия хорошего графа дорог. По словам представителей Яндекса, купить такую информацию нее у кого, а собирать ее самим им пока не интересно.</p>
<p>В перспективе развития сервиса карт для Беларуси создание подробных карт областных центров.</p>
<p>Сообщили и то, что Народные карты скоро тоже можно будет вставлять на сайт через API. Кстати, очень полезная вещь на практике (пример, для рисования схемы проезда или создания карты велогонки).</p>
<p><a href="http://kukutz.ya.ru/" target="_blank">Роман Иванов</a>, руководитель отдела коммуникационных сервисов, рассказал про пользовательские виджеты в <a href="http://bar.yandex.ru/" target="_blank">Яндекс.Баре</a>. Бар сейчас существует для IE и Firefox. Виджеты могут быть динамическими (например, отображать количество писем в ящике). Создание виджетов — процесс не сложный. Уж точно не сравнится с процессом создания целого тулбара.</p>
<p><a href="http://aaz.moikrug.ru/" target="_blank">Антон Забанных</a>, довольно эпотажная личность, поведал о возможностях <a href="http://pdd.yandex.ru/" target="_blank">Яндекс.Почты для доменов</a>. Кстати, он руководитель группы сервисов персонального общения (почты). Самое интересное то, что сейчас для сайта действует ограничение в 1000 почтовых ящиков, но оно может быть без проблем и бесплатно повышено для конкретного сайта после контакта с саппортом сервиса. А через API сервиса можно создавать и удалять ящики без участия оператора. Довольно заманчивая возможность для серсвисов, которые хотят предоставить пользователям почту в своем домене.</p>
<p>Антон обозначил, что сервис не предназначен для использования в качестве релея (рассылка писем роботом через SMTP). В этом случае домен могут заблокировать до выяснения обстоятельств. Правда решить проблему можно с помощью прямых рассылок <a href="http://www.google.com/support/a/bin/answer.py?hl=ru&amp;answer=33786" target="_blank">с помощью SPF</a>.</p>
<p><a href="http://tigran.moikrug.ru/" target="_blank">Тигран Худавердян</a>, руководитель отдела портальных сервисов, рассказал о пользе пользовательских виджетов для главной страницы Яндекса. <a href="http://veraleyzerovich.moikrug.ru/" target="_blank">Вера Лейзерович</a> продемонстрировала процесс создания простейших виджетов. Кстати, на создание самого простого виджета ушло примерно 50 секунд.</p>
<p>Смысл создания виджетов в том, что у многих пользователей (в том числе из Беларуси) Яндекс установлен в качестве домашней страницы. Размещают виджеты около 15% этой аудитории. В итоге создатель виджета получает некислый трафик с главной Яндекса на свой сайт, Яндекс — качественный контент, а пользователь — то, что искал. Все счастливы.</p>
<p>Самые простые виджеты на базе RSS создавать очень легко и быстро. Кстати, большинство крупных российских интернет-СМИ именно так и сделали.</p>
<p><a href="http://isaevat.moikrug.ru/" target="_blank">Татьяна Исаева</a> (руководитель группы контент-менеджеров Яндекс.Новостей) озвучила, пожалуй, самый тяжелый для прослушивания доклад про Яндекс.Новости. Длинный и монотонный.</p>
<p>В заключении <a href="http://anton.moikrug.ru/" target="_blank">Антон Волнухин</a> рассказал про сервис Яндекс.Блоги и API, которое он предоставляет. Он собственно и является руководителем этого сервиса.</p>
<p>Все с удовольствие отвечали на вопросы в кулуарах. Особенно интересно было пообщаться с <a href="http://cfirf.ya.ru/">Larry Novsky</a> (имя в миру не запомнил). Не знаю, кто он в Яндексе, но он отвечал на все вопросы, и больше всех знал про &laquo;телодвижения&raquo; Яндекса в Беларуси.</p>
<p>На мероприятии снимали видео и обещали его выложить. Также обещали выложить все презентации в открытый доступ. Ждем пополнения <a href="http://company.yandex.ru/public/subbotnik/" target="_blank">в разделе Яндекс.Субботников</a>.</p>
<p>Обещали повторять Субботник примерно раз в год.</p>
<p>Яндекс молодцы! Спасибо!</p>
<div id="attachment_385" class="wp-caption alignnone" style="width: 235px"><a href="http://twitpic.com/1fs1ov"><img class="size-medium wp-image-385" title="Отзывы с Я.Субботника" src="http://valera.ws/wp-content/uploads/2010/04/869689751-225x300.jpg" alt="Отзывы с Я.Субботника" width="225" height="300" /></a><p class="wp-caption-text">Отзывы с Я.Субботника</p></div>
<p>&#8212;</p>
<p><a href="http://twitter.com/search?q=%23yandexminsk" target="_blank">Твитер</a>. <a href="http://fotki.yandex.ru/users/asebrant/album/96350?p=0" target="_blank">Фотографии</a>. <a href="http://picasaweb.google.com/flash.log/qbkUDE#" target="_blank">Еще фото</a>.</p>
<p><a href="http://blog.webdev.by/internet-v-belarusi/yandex-belarus-online/" target="_blank">Яндекс в Беларуси (конспект Я.Субботника)</a> | <a href="http://amatik.ru/yandekssubbotnik.html" target="_blank">Яндекс.Субботник в Минске. День 1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.04.15~yandex-subbotnik-minsk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSS-кнопка с реакцией на наведение</title>
		<link>http://valera.ws/2009.10.25~css-button-sprite/</link>
		<comments>http://valera.ws/2009.10.25~css-button-sprite/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 15:35:10 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[верстка]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=366</guid>
		<description><![CDATA[Верстка кнопки для HTML-страницы, которая работает через тег &#60;a&#62; (т.е. с нее можно, например, скопировать адресс ссылки по правому клику в браузере), собранной из CSS-спрайта. Все картинки: края, фон, края и те же элементы при наведении собраны в один CSS-спрайт. &#8230; <a href="http://valera.ws/2009.10.25~css-button-sprite/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://valera.ws/tag/verstka/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  верстка">Верстка</a> кнопки для HTML-страницы, которая работает через тег &lt;a&gt; (т.е. с нее можно, например, скопировать адресс ссылки по правому клику в браузере), собранной из <a href="http://valera.ws/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  css">CSS</a>-спрайта. Все картинки: края, фон, края и те же элементы при наведении собраны в один <a href="http://valera.ws/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  css">CSS</a>-спрайт.<br />
<span id="more-366"></span><br />
Итак, HTML-код кнопки такой:<br />
<script src="http://pastie.org/668995.js"></script><br />
CSS-спрайт для нее выглядит так:</p>
<p><img class="alignnone" title="CSS-спрайт кнопки" src="http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png" alt="" width="35" height="186" /></p>
<p>Кратко суть верстки: внешний элемент a поставляет картинку начала кнопки (левая часть) и делать отступ слева на ширину это картинки, первый вложенный span добавляет конец кнопки и отступ справа, второй вложенный span заливает фон кнопки и объявляет ее высоту.  Последний вложенный span нужен для размещения текста кнопки по-середине.</p>
<p>Т.к. элементы спрайта прозрачные, необходимо избегать наложения одного элемента на другой. Именно поэтому нижний элемент обрезан слева.</p>
<p>Тестировалась и работает правильно в IE 7, Opera 10, Firefox 3.5, Safari 3.1.2, Chrome 3.0.195.27.</p>
<style type="text/css">
.link {font: 11px Arial, Helvetica, sans-serif;}
.link a {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) top left no-repeat; display: block; float: left; color: #fff; text-decoration: none; margin-top: 14px; padding-left: 35px;}
.link a span {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) right -62px no-repeat; display: block; padding-right: 10px;}
.link a span span {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) 0 -31px repeat-x; display: block; height: 31px;}
.link a span span span {background: none; padding: 8px 0; margin: 0; height: auto; cursor: pointer;}
.link a:hover {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) left -93px no-repeat;}
.link a:hover span {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) right -155px no-repeat;}
.link a:hover span span {background: url(http://feedbee.server.valera.ws/files/button-demo/button-1-sprite.png) 0 -124px repeat-x;}
</style>
<p><span class="link"><a href="http://feedbee.server.valera.ws/files/button-demo/button.html"><span><span><span>Демонстрация&#8230;</span></span></span></a></span></p>
<div style="clear:both">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.10.25~css-button-sprite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пакетная обработка изображений с помощью ImageMagick</title>
		<link>http://valera.ws/2009.10.19~imagemagick-batch-processing/</link>
		<comments>http://valera.ws/2009.10.19~imagemagick-batch-processing/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 07:19:53 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=358</guid>
		<description><![CDATA[Иногда возникает необходимость пакетной обработки изображений: изменить размеры, цветовые характеристики, наложить водяной знак или копирайт. Для проведения таких операций для Windows существует куча софта, с которым надо разбираться. В Linux-е все намного проще. Достаточно установить* пакеты ImageMagick-а и написать небольшой &#8230; <a href="http://valera.ws/2009.10.19~imagemagick-batch-processing/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Иногда возникает необходимость пакетной обработки изображений: изменить размеры, цветовые характеристики, наложить водяной знак или копирайт. Для проведения таких операций для Windows существует куча софта, с которым надо разбираться. В Linux-е все намного проще. Достаточно установить* пакеты ImageMagick-а и написать небольшой скрипт.<br />
<span id="more-358"></span><br />
Моя задача была в том, чтобы проставить копирайты и уменьшить размеры изображений для вставки на сайт. Учесть было необходимо тот факт, что есть изображения горизонтальные и вертикальные. После некоторого времени вспоминания синтаксиса shell-скриптов для bash и чтения очень добротного <a href="http://www.imagemagick.org/script/command-line-tools.php" target="_blank">мануала по ImageMagick Console Tools</a> родился на свет следующий скрипт:</p>
<p><script src="http://pastie.org/660242.js"></script></p>
<p>Пакетная обработка фотографий на Линуксе — это просто!</p>
<p>* — apt-get install imagemagick</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.10.19~imagemagick-batch-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

