<?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; IT</title>
	<atom:link href="http://valera.ws/category/it/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><a href="http://valera.ws/tag/algoritmy/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  алгоритмы">Алгоритмы</a>.</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>Не работает скрол на тачпаде после обновления ubuntu?</title>
		<link>http://valera.ws/2011.09.17~touchpad-not-works-after-ubuntu-update/</link>
		<comments>http://valera.ws/2011.09.17~touchpad-not-works-after-ubuntu-update/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 13:27:02 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=615</guid>
		<description><![CDATA[После обновления ubuntu до 11.04, которое я все откладывал аж до сегодняшнего дня, перестал работать скрол на боковой области тачпада, который прекрасно работал из коробки ранее. Решение было нагуглено довольно быстро, но сам факт наличия таких проблем (у многих пользователей) &#8230; <a href="http://valera.ws/2011.09.17~touchpad-not-works-after-ubuntu-update/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>После обновления <a href="http://valera.ws/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">ubuntu</a> до 11.04, которое я все откладывал аж до сегодняшнего дня, перестал работать скрол на боковой области тачпада, который прекрасно работал из коробки ранее. Решение было нагуглено довольно быстро, но сам факт наличия таких проблем (у многих пользователей) печалит&#8230; Куда-то не туда двигается <a href="http://valera.ws/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">Ubuntu</a> в последнее время.</p>
<p><span id="more-615"></span>Решение. В консоли выполняем следующие команды:</p>
<pre><code>$ sudo modprobe -r psmouse
$ sudo modprobe psmouse proto=imps</code></pre>
<p>Заработал скрол? У меня — да. Если у вас тоже, по результат надо закрепить. Для этого открываем <em>/etc/modprobe.d/options</em> и добавляем туда строку.</p>
<pre><code>sudo gedit /etc/modprobe.d/options</code></pre>
<p>Строка:</p>
<pre><code>options psmouse proto=imps</code></pre>
<p>Теперь и после ребута скрол останется работать.</p>
<p>P.S. Печальные последствия такого способа заключаются в том, что из настроек мыши пропадает вкладка Touchpad.</p>
<p>Решение отсюда: <a href="http://superuser.com/questions/136568/get-back-the-touchpad-scrolling-missing-in-kubuntu-10-04">http://superuser.com/questions/136568/get-back-the-touchpad-scrolling-missing-in-kubuntu-10-04</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.09.17~touchpad-not-works-after-ubuntu-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Факторный анализ места работы</title>
		<link>http://valera.ws/2011.05.02~employee-factor-analysis/</link>
		<comments>http://valera.ws/2011.05.02~employee-factor-analysis/#comments</comments>
		<pubDate>Mon, 02 May 2011 11:07:25 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=570</guid>
		<description><![CDATA[Иногда могут возникать ситуации, когда надо оценить место работы. Если вы ищите работу, нужно как-то сравнить предложения от разных компаний между собой и/или с текущим местом работы. Если не ищите, возможно вы захотите сравнить свои условия работы с условиями в &#8230; <a href="http://valera.ws/2011.05.02~employee-factor-analysis/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-579" title="workpalce" src="http://valera.ws/wp-content/uploads/2011/05/workpalce.png" alt="" width="200" height="176" />Иногда могут возникать ситуации, когда надо оценить место работы. Если вы ищите работу, нужно как-то сравнить предложения от разных компаний между собой и/или с текущим местом работы. Если не ищите, возможно вы захотите сравнить свои условия работы с условиями в организациях у друзей. Сравнивать можно по-разному: «на глаз», когда мысленно прикидываешь преимущества и недостатки одной и другой стороны, а затем решаешь, что лучше; по конкретным позициям — график, з/п, интерес и т.д. с конкретной оценкой по каждой позиции.</p>
<p>Второй вариант, конечно, будет точнее с точки зрения логики, но первый может оказаться ближе к реальности, т.к. выбор места работы зачастую делается сердцем, а не умом.</p>
<p>Но все же, если мы хотим умом сравнить несколько мест работы, удобно делать это с помощью некоторой модели факторов, по которым будет вестись точное сравнение. Вообще, понятие факторной модели имеет четкое математическое значение, но я его сильно упрощу и буду использовать у себя по своей схеме без сложной математики.</p>
<p><span id="more-570"></span></p>
<p>Факторную модель можно составить для любой специальности, но она должна быть специализирована. Делать универсальную модель для всех сразу нет смысла — ее точность будет очень плохая. Я составил модель для своей специальности — разработчик ПО.</p>
<h2>Факторный анализ места работы для разработчика ПО</h2>
<ol>
<li>Интерес
<ul>
<li>Проект
<ul>
<li>тематика</li>
<li>технологии</li>
<li>уровень сложности</li>
<li>нагрузки в продакшане</li>
</ul>
</li>
<li>Зона ответственности
<ul>
<li>разброс обязанностей</li>
<li>принятие решений</li>
</ul>
</li>
<li>Подчиненные
<ul>
<li>количество</li>
<li>качество</li>
</ul>
</li>
<li>Заказчик
<ul>
<li>локальность</li>
<li>культурные различия</li>
<li>требовательность</li>
</ul>
</li>
</ul>
</li>
<li>Условия труда
<ul>
<li>Офис
<ul>
<li>эстетика</li>
<li>расположение</li>
<li>размер, оформление  комнаты и ключевых узлов</li>
<li>вентиляция и кондиционирование</li>
<li>ремонт (состояние)</li>
<li>стоянка</li>
</ul>
</li>
<li>Рабочее место
<ul>
<li>компьютер</li>
<li>монитор</li>
<li>админские права и ограничения по ОС/ПО</li>
<li>интернет и ограничения</li>
<li>стол, стул</li>
<li>освещение</li>
</ul>
</li>
<li>Коллеги и руководство
<ul>
<li>размер команды</li>
<li>адекватность руководителя</li>
<li>простота административной структуры</li>
<li>постановка работы команды</li>
</ul>
</li>
<li>График
<ul>
<li>время работы</li>
<li>гибкость графика</li>
<li>отработки</li>
</ul>
</li>
</ul>
</li>
<li>Оплата
<ul>
<li>Зарплата
<ul>
<li>сумма</li>
<li>валюта</li>
<li>рост</li>
</ul>
</li>
<li>Социальные вопросы
<ul>
<li>социальный пакет</li>
<li>корпоративы</li>
</ul>
</li>
<li>Проблемы
<ul>
<li>задержки зарплаты</li>
<li>штрафы</li>
<li>ограничения контракта</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>Оценка по каждому фактору:</p>
<ul>
<li>0 — нейтрально, нормально,</li>
<li>­­−1 — плохо,</li>
<li>+1 — хорошо.</li>
</ul>
<p>Проставляется оценка по каждому фактору 3-го порядка. Важно понимать, что оценка +1 всегда обозначает, что по данному вопросу обстоятельства в вашу пользу. Не важно как называется фактор: «уровень зарплаты» или «штрафы», +1 всегда будет обозначать, что по этому фактору вы в положении «хорошо» для себя. Соответственно −1 — значит «плохо» для вас.</p>
<p>Оценки суммируются по группам — факторам 1-го порядка. Каждому фактору 1-го порядка выставляется субъективный вес, который приводится к коэффициентам. Например, устанавливаются веса: «Интерес» — 10, «Условия труда» — 7, «Оплата» — 8. Тогда коэффициенты будут: «Интерес» — 40% (10/(10+7+8)=0,4), «Условия труда» — 28% (0,28), «Оплата» — 32% (0,32).</p>
<p>Коэффициент при факторе 1-го порядка покажет, какую долю в оценке займет этот фактор. Такой подход позволяет сильно влиять на результат в зависимости от предпочтений разных людей не меняя модели: кому-то уровень заработной платы в 2 раза (условно) важнее интереса в работе, а кому-то наоборот. В первом случае «Интерес» может получить 20%, «Оплата» — 40%, во втором соответственно наоборот.</p>
<p>Полученная сумма по каждому фактору 1-го порядка умножается на коэффициент этого фактора и делится на количество его факторов 3-го порядка. Затем полученные числа суммируются.</p>
<p>В итоге получается число в процентах, определяющее общую оценку данного места работы относительно идеала.</p>
<p>Факторную модель можно и нужно дополнять факторами, наиболее важными в каждом конкретном случае. Но модель должна быть одинаковой для всех сравниваемых между собой организаций.</p>
<p>Самый лучший способ заполнить факторную модель — наличие «своего» человека в организации. Это особенно актуально, когда работу предлагают по рекомендации.</p>
<p>Если инсайдера нет, то необходимо на собеседовании максимально рассмотреть офис, попросить показать будущее рабочее место и задать максимум вопросов из списка факторов. Ответы на многие вопросы можно получить косвенно.</p>
<p>В модели нельзя проставлять нули в случае отсутствия информации о факторе, т.к. это исказит результат. Если информации по какому-либо фактору нет для большинства сравниваемых организаций, то лучше этот фактор исключить. Иначе — ставьте оценку на основании предположений.</p>
<p>Модель должна быть сбалансирована по факторам 2-го порядка. Если фактор 2-го подяка имеет важное и широкое значение, то факторов 3-го порядка в нем должно быть много. Если значение слабое — мало. В остальных случаях количество факторов 3-го порядка должно быть примерно равным и относительно небольшим.</p>
<p>Три порядка факторов нужны именно для того, чтобы придать модели сбалансированность и взвешенность.</p>
<p>На базе своей можели я создал простейшее веб-приложение, позволяющее <a href="http://valera.ws/extraz/factor/factor.php" target="_blank">считать оценку места работы для разработчика ПО</a>. <a href="http://valera.ws/extraz/factor/factor.tar.gz">Исходники</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.05.02~employee-factor-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Устройство дисковой подсистемы</title>
		<link>http://valera.ws/2011.03.21~disk-subsystem/</link>
		<comments>http://valera.ws/2011.03.21~disk-subsystem/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 19:30:42 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[ОС]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=558</guid>
		<description><![CDATA[Хочу немного поделиться своими познаниями в области дисковой подсистемы операционных систем, файловых систем и работы с ними в ОС Linux. Практическая ценность этой информации заключается в алгоритме простых и быстрых бэкапов разделов, а так же подвод к следующему посту про &#8230; <a href="http://valera.ws/2011.03.21~disk-subsystem/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p lang="ru-RU"><img class="alignleft size-full wp-image-560" title="disk" src="http://valera.ws/wp-content/uploads/2011/03/disk.png" alt="" width="200" height="123" />Хочу немного поделиться своими познаниями в области дисковой подсистемы операционных систем, файловых систем и работы с ними в ОС Linux. Практическая ценность этой информации заключается в алгоритме простых и быстрых бэкапов разделов, а так же подвод к следующему посту про мультизагрузочную флэшку. Можно использовать этот материал как первую попытку разобраться принципе работы дисковой подсистемы. Ничего углубленного, все описано очень поверхностно и популярно.</p>
<p lang="ru-RU"><span id="more-558"></span></p>
<p lang="ru-RU">Материал разделен на три части: А — теория, Б — практика, В — создание мультизагрузочной флэшки.</p>
<p lang="ru-RU">А. Общая теория (популярно).</p>
<p lang="ru-RU">1. Железо.</p>
<p lang="ru-RU">Все физические устройства, которые используются нами повседневно для хранения информации (HDD, CD-ROM, флэшка, и даже флопик) — это блочные устройства ввода/вывода (block I/O device). Они могут подключаться к компьютеру через различные интерфейсы: IDE, SATA, eSATA, USB. Операционная система предоставляет единый прозрачный для пользователя и программиста прикладного ПО способ чтения/записи информации с/на эти носители.</p>
<p lang="ru-RU">С железом напрямую общаются драйвера. Драйвер — это программа, загруженная в операционную систему. Он является прослойкой между ОС и устройствами, представляя для ОС стандартный программный интерфейс блочных устройств I/O.</p>
<p lang="ru-RU">2. Данные на физическом диске.</p>
<p lang="ru-RU">Блочными эти устройства называются потому, что информация на них записывается и считывается блоками (секторами, кластерами) фиксированного размера. Размер блока кратен 512 байт. Блочный подход необходим для обеспечения высокой скорости работы дисковой подсистемы.</p>
<p lang="ru-RU">Сам диск форматируется (размечается) на низком уровне (на заводе). Диск состоит из цилиндров. Цилиндр — это окружность на пластине диска. Первые цилиндры расположена в центре пластины диска, последние — на внешнем краю. Каждый цилиндр делиться на секторы. В пределах секторов организуются блоки на диске. Помимо самих данных в блоках записывается информация для контроля ошибок. С этой информацией работает контроллер внутри жесткого диска и она не видна снаружи. Драйвер посылает команды контроллеру диска на уровне «считать 10 блоков 10 цилиндра 20 сектора».</p>
<p lang="ru-RU">Все полезные данные, записанные на носитель, организованы в разделы. В Windows каждый раздел обычно представлен в виде логического диска (C, D, E, …). На сменных носителях (флэшка, компакт-диск, флопик) как правило создан один единственный раздел, на внутренних жестких дисках — наоборот — обычно несколько разделов. Данные в разделе организованы в файловой системе.</p>
<p lang="ru-RU">Для каждого раздела может независимо устанавливаться свой размер блока — размер кластера. Он регулирует баланс скорость/экономичность. Блок — это минимальная адресуемая единица разметки на диске. Кластер объединяет несколько блоков — это минимальная адресуемая единица в разделе.</p>
<p lang="ru-RU">Таким образом устанавливается следующая логическая иерархия (от внизу вверх): блок, сектор, цилиндр — кластер — раздел — файл, каталог.</p>
<p lang="ru-RU">В большинстве файловых систем файл может занимать один или несколько кластеров. Таким образом, если размер файла меньше размера кластера, то файл займет целый кластер. Для любого файла на диске будет выделено количество байт, кратное размеру кластера. Некоторые файловые системы умеют делить один кластер на несколько файлов (упаковка), но это скорей исключение (пока). Таким образом, чем больше размер кластера, тем выше скорость и больше места теряется на полузаполненных кластерах.</p>
<p lang="ru-RU">3. Разметка физического диска.</p>
<p lang="ru-RU">Размер раздела также измеряется в блоках. Именно по этому при разбивке диска на разделы размер, выраженный в байтах, может быть немного подкорректирован программой.</p>
<p>Так как на диске может быть несколько разделов, их нужно где-то перечислить с указанием пределов и свойств каждого раздела. Для этого служит таблица разделов, которая находится в начале физического диска (начало диска — это его первый блок в соответствии с адресацией). В классическом случае она входит в состав MBR (master boot record), которая целиком занимает первый блок. На всю таблицу разделов выделено 64 байта. Каждая запись таблицы состоит из адресов начала и конца раздела, типа раздела, количества секторов в разделе и флага «загруженности» раздела и занимает 16 байт. Таким образом максимальное количество разделов на диске ограничено четырьмя (16 × 4 = 64).</p>
<p lang="ru-RU">Так сложилось исторически, но со временем стало очевидно, что 4 раздела не всегда достаточно. Решение проблемы было найдено. Те разделы, которые размечены в заголовке диска (в MBR), назвали Primary (первичные). Их по прежнему должно быть до 4-х включительно. Дополнительно ввели понятие Extended (расширенных) разделов. Расширенный раздел включает один или более подраздел и не содержит файловой системы. Сам он является полноценным первичным разделом.</p>
<p lang="ru-RU">Так как подразделы расширенного раздела не перечислены в таблице разделов диска, их невозможно пометить как загрузочные. Загрузочный (bootable) раздел — это тот раздел, с которого начинает загружаться операционная система. Он отмечается флагом в своей записи таблицы разделов. Таким образом отметить можно только один из 4-х первичных разделов. Расширенный раздел загрузочным быть не может, так как на нем нет файловой системы.</p>
<p>Разметка расширенного раздела описана в в его начале. По аналогии с MBR существует EBR (Extended boot record), расположенная в первом секторе. В ней описывается разметка логических дисков данного расширенного раздела.</p>
<p lang="ru-RU">На оптическом диске и флэшке обычно размещается только один раздел, так как более мелкое деление там не имеет смысла. Обычно при записи компакт-диска применяется файловая система ISO 9660. Образ диска с этой файловой системой называется ISO-образ. Он часто используется в отрыве от физического диска в качестве контейнера для передачи данных, т. к. любой образ — это побитовая точная копия физического носителя.</p>
<p lang="ru-RU">4. Файловая система.</p>
<p lang="ru-RU">Каждый раздел диска, предназначенный для хранения данных (т. е. все разделы, кроме расширенного) форматируется в соответствии с некоторой файловой системой. Форматирование — это процесс создания структуры файловой системы в некотором пространстве на диске — в разделе. Файловая система организует пользовательские данные в виде файлов, расположенные в некоторой иерархии каталогов (папок, директорий).</p>
<p lang="ru-RU">Структура каталогов и файлов в разделе в классическом случае описана в таблице файлов. Как правило таблица занимает некоторое место в начале раздела. После таблицы пишутся сами данные. Таким образом создается система, где структура описана отдельно, а данные (файлы) хранятся отдельно.</p>
<p lang="ru-RU">В случае удаления файла с диска он удаляется из таблицы файлов. Место, которое он занимал на диске, помечается как свободное. Но физической зачистки этого места не происходит. Когда на диск производится запись, данные записываются в свободное место. Поэтому если после удаления файла создать новый, существует вероятность записи его на место удаленного. При быстром форматировании (используются в подавляющем большинстве случаев) раздела также перезаписывается только таблица. На этих особенностях основана процедура восстановления файлов после удаления или форматирования.</p>
<p lang="ru-RU">В процессе работы на диске могут возникать физические повреждения. Некоторые блоки могут становиться недоступными для чтения. Эти блоки называют «бэдами» (bad sector). Если в процессе чтения диска попадает бэд, происходит ошибка ввода/вывода (I/O error). В зависимости от того, в каком месте появился бэд-блок и сколько их появилось, может потеряеться либо часть содержимого файлов, либо в часть таблицы файлов.</p>
<p lang="ru-RU">При попытке записи в бэд-блок контроллер диска должен определить проблему и выделить для этого блока новое место на поверхности диска, а старое место из использования изъять (relocate bad block). Он делает это незаметно для ОС и драйверов, самостоятельно. Происходит это до тех пор, пока есть резерв места для переноса.</p>
<p lang="ru-RU">5. Работа с диском.</p>
<p lang="ru-RU">Операционная система представляет возможность работы с дисками на уровне файлов, разделов и устройства. Конкретная реализация доступа на каждый уровень зависит от конкретной ОС. Но в любом случае, общим является то, что к физическому диску и к любому его разделу можно обратиться точно так же, как к обычному бинарному файлу. Т. е. в него можно писать данные, из него можно данные считывать. Такие возможности особенно полезны для создания и восстановления образов дисков, клонирования дисков.</p>
<p lang="ru-RU">В ОС семейства UNIX все устройства хранения данных представлены в виде файлов в каталоге /dev:</p>
<ul>
<li>
<p lang="ru-RU">sda, sdb, sdc, … — 	физические диски (HDD, включая внешние, 	флэшки, IDE-сидиромы);</p>
</li>
<li>
<p lang="ru-RU">fd0, fd1 — флопики.</p>
</li>
</ul>
<p lang="ru-RU">Разделы на каждом из дисков доступны в виде sda1, sda2, sd3, …</p>
<p lang="ru-RU">Нумерация дисков происходит в том порядке, в котором их видит BIOS. Нумерация разделов — в порядке создания разделов на диске.</p>
<p lang="ru-RU">Чтобы сделать образ (образ — это побитовая копия информации, размещенной на диске или в разделе) диска целиком (например первого по BIOS — sda), нужно вычитать данные из /dev/sda в любой другой специально созданный для образа файл, используя программу последовательного копирования содержимого файла. Чтобы записать образ в файл, нужно при помощи той же программы вычитать данные из образа в /dev/sda. По аналогии можно создать/восстановить образ раздела (например, первого на первом диске — sda1), обращаясь к /dev/sda1 вместо /dev/sda.</p>
<p lang="ru-RU">6. Монтирование.</p>
<p lang="ru-RU">Чтобы «превратить» дисковое устройство в набор файлов и каталогов, к которым можно получить доступ, его необходимо примонтировать. В Windows как такового монтирования не существует. Там разделы просто подключаются к логическим дискам (C:, D:, E, …). Информация о том, какую букву присвоить какому диску, хранится в самой ОС.</p>
<p>В UNIX понятие монтирования является основоположным в работе с дисками и дает значительно больше гибкости, чем есть в Windows. Монтирование — это процесс привязки некоторого источника образа диска (это либо сам диск, либо файл с его образом) к некоторому каталогу в файловой системе UNIX. Файловая система в UNIX начинается из одной точки — от корневого каталога (/), и никаких логических дисков C, D, E не существует.</p>
<p>В начале загрузки ОС семейства UNIX в корневой каталог / монтируется раздел диска, помеченный как root (корневой). На разделе диска должны быть созданы служебные каталоги ОС, находящиеся в корне файловой системы. К ним могут монтироваться другие разделы, либо файлы могут записываться прямо в основной раздел (примонтрированный к /).</p>
<p>Ключевой момент заключается в том, что источник образа диска (блочное устройство, файл с образом или каталог уже примонтированной файловой системы) можно монтировать к любому каталогу на любом уровне вложенности файловой системы, которая начинается с /. Таким образом, разные логические разделы физического диска представляются каталогами в единой файловой системе в противоположность отдельным файловым системам разных логических дисков в Windows (там каждый диск рассматривается как автономная файловая система, имеющая свой корень).</p>
<p>Для монтирования необходимо указать файловую систему образа, опции монтирования и каталог, к которому будет привязка.</p>
<p>За счет этой гибкости можно привязать один каталог в несколько разных мест в файловой системе, сделать образ диска и примонтировать его не записывая на диск, раскрыть ISO-образ. И все это делается без использования сторонних утилит.</p>
<p>7. MBR — загрузочная область.</p>
<p>В начале физического диска обычно расположена MBR (master boot record). Это загрузочная область диска. При загрузке компьютера BIOS определяет какой диск является первичным (primary) и ищет на нем MBR. Если она найдена, то ей передается управление. Если нет, выводится ошибка о том, что загрузочный диск не найден.</p>
<p>В MBR, кроме таблицы разделов (описано выше), располагается код программы, которая загружается в память и выполняется. Именно эта программа должна определить загрузочный раздел на диске и передать ему управление. Передача управления происходит аналогично: первый блок (512 байт) загрузочного раздела помещается в оперативную память и выполняется. Он содержит программный код, который инициирует загрузку ОС.</p>
<p lang="ru-RU">За счет того, что управление от BIOS при загрузке компьютера передается программе, записанной на диске, есть возможность сделать выбор загрузочного раздела более гибким. Это и делают загрузчики GRUB и LILO, широко применяемые в мире UNIX. Последний загрузчик в настоящее время использовать на современных компьютерах смысла нет. С помощью GRUB можно предоставить пользователю выбор, какой раздел загружать и каким образом.</p>
<p>Код GRUB слишком большой, чтобы поместиться в MBR. Поэтому он устанавливается на отдельном разделе (обычно в том разделе, который монтируется в /boot) с файловой системой FAT, FFS или Ext2. В MBR записывается код, который загружает код GRUB с определенного раздела и передает ему управление.</p>
<p>GRUB самостоятельно или с помощью пользователя определяет с какого раздела должна происходить загрузка. В случае Winsows-раздела ему просто передается управление точно так же, как это было бы из обычной MBR. В случае Linux-а загрузчик выполняет более сложные действия. Он загружает в память ядро ОС и передает ему управление.</p>
<p>Сделать бэкап загрузочной области диска так же легко, как бэкап всего диска или отдельного раздела. Суть в том, что MBR занимает первые 512 байт диска /dev/sda. Следовательно, для бэкапа MBR необходимо вычитать первые 512 байт /dev/sda в файл, а для восстановления — наоборот — файл вычитать в /dev/sda.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.03.21~disk-subsystem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Почему Debian живее всех живых?</title>
		<link>http://valera.ws/2011.02.06~debian-6-released/</link>
		<comments>http://valera.ws/2011.02.06~debian-6-released/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 09:17:43 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=549</guid>
		<description><![CDATA[Копипаст с Хабрахабра из комментариев пользователей к теме выхода Debian 6.0. Мне понравился ответ. Вопрос: Озадаченно смотрю на версии «свежего софта»… На моей бубунте уже как минимум Гном, офис и ядро более новых версий. Подозреваю, если посмотрю на прочий установленный &#8230; <a href="http://valera.ws/2011.02.06~debian-6-released/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-552" title="debian-6-0-rgp-460" src="http://valera.ws/wp-content/uploads/2011/02/debian-6-0-rgp-460.png" alt="" width="118" height="141" />Копипаст с Хабрахабра из комментариев пользователей к <a href="http://habrahabr.ru/blogs/debian/113229/" target="_blank">теме выхода Debian 6.0</a>. Мне понравился ответ. Вопрос:</p>
<blockquote><p>Озадаченно смотрю на версии «свежего софта»…</p>
<p>На моей бубунте уже как минимум Гном, офис и ядро более новых версий. Подозреваю, если посмотрю на прочий установленный или доступный в репозиториях софт — ситуация будет аналогичной.</p>
<p>Объясните — в чем смысл? Только в «проверенности» и стабильности этих версий?</p>
</blockquote>
<p><span id="more-549"></span></p>
<p>Ответ:</p>
<blockquote><p>Да. И это «только» весьма дорогого стоит. Более того, в рамках политики дебиана обновляться версии будут только на security fix&#8217;ы, то есть никаких новых фич до момента явного dist-upgrade&#8217;а. Сравните с убунтой, в которой каждые N дней пачка обновляемых пакетов.</p>
<p>Для десктопа это, может быть и нормально, но для сервера — неприемлимо. Я лично несколько раз сталкивался с дурацкими проблемами при обновлении версий (к счастью, только на декстопе). В списке лидеров — evolution (похерил архив почту), krusader (похерил половину настроек), deluge (криво подцепил старые настройки).</p>
<p>Если такой же сюрприз произойдёт на продакт-сервере, это будет очень не смешно. Особенно, если учесть сложность отката некоторых изменений в распределённых системах, даже при наличии бэкапа.</p>
<p>Таким образом, stable — это идеальное решение для сервера. А sid/<a href="http://valera.ws/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">ubuntu</a> — вполне хорошо для _своего_ десктопа (решать проблемы похерившейся почты у себя неприятно, но решать их же у главбуха — куда грустнее).</p>
<p>Кстати, ровно той же политики придерживается и RHEL (CentOS) — у них в пятой версии до сих пор 2.6.18, хоть и с кучей бэкпортов.</p>
</blockquote>
<p>© <a href="http://amarao.habrahabr.ru/" target="_blank">amarao</a>, <a href="http://habrahabr.ru/blogs/debian/113229/#comment_3634204" target="_blank">Хабрахабр</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.02.06~debian-6-released/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>Легкое монтирование USB-флешки (NTFS) на сервер</title>
		<link>http://valera.ws/2011.01.18~mount-ntfs3g-usbflash/</link>
		<comments>http://valera.ws/2011.01.18~mount-ntfs3g-usbflash/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 11:52:59 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=537</guid>
		<description><![CDATA[Дано: Домашний сервер на Debian 5. Физический доступ к нему. Доступ по SSH (не root). USB-флешка с разделом NTFS. Необходимо: быстро монтировать и размонтировать флешку для чтения/записи. Вся проблема сводится к тому, что автомантирование флешек в Дебиане по дефолту делается &#8230; <a href="http://valera.ws/2011.01.18~mount-ntfs3g-usbflash/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-540" title="usb-flash" src="http://valera.ws/wp-content/uploads/2011/01/usb-flash.png" alt="" width="100" height="64" />Дано:</p>
<ol>
<li>Домашний сервер на Debian 5.</li>
<li>Физический доступ к нему.</li>
<li>Доступ по SSH (не root).</li>
<li>USB-флешка с разделом NTFS.</li>
</ol>
<p>Необходимо: быстро монтировать и размонтировать флешку для чтения/записи.</p>
<p><span id="more-537"></span>Вся проблема сводится к тому, что автомантирование флешек в Дебиане по дефолту делается штатными драйверами (read-only) и только с правами на монтирование. А мне необходимо было периодически скидывать инфу на флешку или с нее. Захотелось процесс оптимизировать.</p>
<p>Для достижения цели необходимо решить 2 задачи:</p>
<ol>
<li>дать доступ к монтированию флешек (не всего, что попало, а именно USB NTFS флешек) рядовому пользователю без пароля,</li>
<li>избавить от необходимости полностью писать команду монтирования каждый раз.</li>
</ol>
<p>Делается все очень просто. Я создал shell-скрипт /root/flash следующего содержания:</p>
<pre><code>#!/bin/bash

case "$1" in
	1)
		mount -t ntfs-3g /dev/sdc /media/flash/
		;;
	0)
		umount /media/flash/
		;;
	*)
		echo $"Usage: $0 {1|0}"
		exit 1
esac
</code></pre>
<p>При передаче скрипту 1 происходит монтирование, при передаче 0 — размонтирование флешки (если точнее, то усройства /dev/sdc).</p>
<p>Ссылку на скрипт размещаем в /usr/bin для удобного доступа к нему:</p>
<p><code># ln -s /root/flash /usr/bin/flash</code></p>
<p>Теперь надо разрешить выполнение этого скрипта без пароля от имени root с помощью <a href="http://en.wikipedia.org/wiki/Sudo">sudoers</a>. Выполните:</p>
<p><code># sudoedit</code></p>
<p>И в файл добавьте следующие строки (замените feedbee на имя вашего пользователя):</p>
<p><code> Cmnd_Alias FLASH_CMD = /usr/bin/flash<br />
 <span style="background-color: #ffff00;"> feedbee</span> ALL=(ALL) NOPASSWD: FLASH_CMD</code></p>
<p>Собственно, всё. Теперь из под вашего пользователя можно просто выполнить:</p>
<p><code>$ sudo flash 1</code></p>
<p>для монтирования флешки, и</p>
<p><code>$ sudo<span style="font-family: Georgia, 'Bitstream Charter', serif;"> </span>flash 0</code></p>
<p>для размонтирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.01.18~mount-ntfs3g-usbflash/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>MobiOp — виджет для Android — название и лого оператора связи</title>
		<link>http://valera.ws/2011.01.03~mobiop/</link>
		<comments>http://valera.ws/2011.01.03~mobiop/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 11:02:05 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[MobiOp]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=524</guid>
		<description><![CDATA[MobiOp — моя первая программа для мобильной ОС Android. Это виджет на рабочий стол, который показывает логотип и название оператора мобильной сети, в которой в данный момент обслуживается телефон. Виджет очень пока простой, содержит самый базовый функционал. Размер виджета минимальный &#8230; <a href="http://valera.ws/2011.01.03~mobiop/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="MobiOp" src="http://valera.ws/mobiop/images/mobiop-72.png" alt="" width="72" height="72" /><a href="http://valera.ws/mobiop/">MobiOp</a> — моя первая программа для мобильной ОС <a href="http://valera.ws/tag/android/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Android">Android</a>. Это виджет на рабочий стол, который показывает логотип и название оператора мобильной сети, в которой в данный момент обслуживается телефон.</p>
<p><span id="more-524"></span>Виджет очень пока простой, содержит самый базовый функционал. Размер виджета минимальный — 1×1. При нажатии на его видимую обалсть выполняется USSD-запрос на получение баланса лицевого счета: *100#. Такой запрос используется в Беларуси всеми тремя GSM операторами.</p>
<p>База логотипов в программу встроена. На данный момент поддерживается только 4 оператора: МТС (Беларусь), Velcom, Life:) и Dialog. Распознавание оператора произыодится по <a href="http://en.wikipedia.org/wiki/Mobile_Network_Code">коду сети</a>. Название оператора в любом случае отображается так, как его отдает сеть.</p>
<p>Отображается логотип того оператора, в зоне действия сети которого вы сейчас находитесь. В случае роуминга он не будет совпадать с оператором, который выпустил SIM-карту.</p>
<p>В данный момент доработана первая публичная версия. Статус — бета.</p>
<p><a href="http://valera.ws/mobiop/">Сайт программы</a>.</p>
<p>Скачать:</p>
<p><img src="http://valera.ws/mobiop/pictures/qrcode.png" alt="MobiOp download QR-Code" /></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.01.03~mobiop/feed/</wfw:commentRss>
		<slash:comments>0</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://valera.ws/tag/yandeks/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Яндекс">Яндекс</a> поменял формат кода информера, который он выдает на странице <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>Реальная скрость Wi-Fi N</title>
		<link>http://valera.ws/2010.12.15~real-speed-wi-fi-n/</link>
		<comments>http://valera.ws/2010.12.15~real-speed-wi-fi-n/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 21:07:45 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[стандарты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=507</guid>
		<description><![CDATA[Как и большинство пользователей Wi-FI, я наивно полагал, что при использовании Wi-Fi последней ревизии N (IEEE 802.11n) можно достигнуть реальной скорости обмена данными около 150 МБит/с. Как это было наивно :) На самом деле стандарт IEEE 802.11n действительно предусматривает теоретический &#8230; <a href="http://valera.ws/2010.12.15~real-speed-wi-fi-n/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://content1.onliner.by/catalog/devices/dlink_dir615.jpg" alt="" width="110" height="61" /> Как и большинство пользователей Wi-FI, я наивно полагал, что при использовании Wi-Fi последней ревизии N (IEEE 802.11n) можно достигнуть реальной скорости обмена данными около 150 МБит/с. Как это было наивно :)<span id="more-507"></span></p>
<p>На самом деле стандарт IEEE 802.11n действительно предусматривает теоретический предел скорости соединения в 150 МБит/с. На английской страничке Википедии, посвященной стандарту IEEE 802.11, есть <a href="http://en.wikipedia.org/wiki/IEEE_802.11n-2009#Comparison">сравнительная таблица скоростей</a>. По ней видно, что предел скорости для протокола 802.11n при условии наличия канала в 40 МГц — 150 Мбит/с.</p>
<p>Не хочу показаться экспертом в этом вопросе. Вообще по поводу Wi-Fi N информации в сети очень мало. Все, описанное тут, — собственный небольшой опыт и результат прочтения пары тем на форумах.</p>
<p>Если на роутере указана скорость свыше 150 МБит/с — 300, то это значит, что будет использоваться два потока по 150 МБит/с. А это в свою очередь требуется поддержки двухпотоковой передачи не только со стороны роутера, но и со стороны клиента — т.е. особое оборудование, способное работать в связке. Получить скорость 300 МБит/с у меня не удавалось ни разу.</p>
<p>Так вот, покупаем мы, значит, беспроводной роутер, на котором красуется надпись 300 МБит/с, например <a href="http://catalog.onliner.by/dlink/dir615/">D-Link DIR-615</a>. Включаем, делаем минимальные настройки и подключаем к нему ноутбук, поддерживающий 802.11n. И видим скорость соединения 65 МБит/с. Лезем в настройки. Меняем дофолтное значение полосы пропускания с 20 до 20/40 МГц. Скорость соединения поднимается до 150 МБит/с.</p>
<p>Далее пробуем что-нибудь скачать. Максимальная реальная скорость передачи данных на ноутбук у меня составляла не более 5,5 МБайт/с, от ноутбука — 6,5 МБит/с. Средняя скорость была на 100—200 КБайт/с ниже максимальной.</p>
<p>Эти цифры были на статистике сетевого интерфейса. Реальная скорость передачи самих файлов была и того ниже. Она немного зависила от включения/выключения шифрования. Точно определить ее не вышло, похоже было что-то около 4,5 МБайт/с на ноут.</p>
<p>Такие же результаты были достигнуты ранее с роутером Netgear.</p>
<p>Как ни крути, а все эти скорости в 150 и тем более 300 МБит/с — маркетинговая чушь. Если реальная скорость у вас колеблется около 7 МБайт/с (56 МБит/с) — это очень хорошо. Если около 6 — нормально. А вот если ниже, чините роутер :)</p>
<div><span style="line-height: 24px; font-size: 16px;"><br />
 </span></div>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.12.15~real-speed-wi-fi-n/feed/</wfw:commentRss>
		<slash:comments>3</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 и PHP mail() на примере <a href="http://valera.ws/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> <a href="http://valera.ws/tag/debian/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Debian">Debian</a></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, т.е. будет видно получателям вашей почты. Лучше всего, чтобы это имя совпадало с доменом, с которого шлется почта. Например, 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><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> для домена</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> в пользу Gmail, <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://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(), то можно сталкнуться с тем. что много писем будут попадать пользователям в спам. Это связано с настройкой агента и локального <a href="http://valera.ws/tag/smtp/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  smtp">SMTP</a>-сервера, через которого агент шлет письма.</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>
	</channel>
</rss>

