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

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

		<guid isPermaLink="false">http://valera.ws/?p=622</guid>
		<description><![CDATA[С возрастом я начал задумываться о том, как проходит моя жизнь и из чего она состоит. Долгое время я наблюдал за собой, отмечал возникающие внутренние желания и потребности, старался смотреть на себя со стороны. Со временем в голове собралась некоторая &#8230; <a href="http://valera.ws/2011.12.04~myself-wishes/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-625" title="Устройство меня: желания" src="http://valera.ws/wp-content/uploads/2011/12/mozg-1.png" alt="" width="200" height="130" />С возрастом я начал задумываться о том, как проходит моя жизнь и из чего она состоит. Долгое время я наблюдал за собой, отмечал возникающие внутренние желания и потребности, старался смотреть на себя со стороны. Со временем в голове собралась некоторая картина, которую можно было анализировать, после чего делать выводы. Мне кажется, что относительно недавно я пришел к пониманию того, как формируются мои желания. Об этом я и постараюсь сегодня рассказать. Возможно, многим эти мысли покажутся близкими.</p>
<p><span id="more-622"></span></p>
<p>Речь здесь пойдет не о желании съесть бутерброд или пойти сегодня на работу в рубашке. Речь пойдет о больших активных действиях, которые съедают заметную часть своего времени. Например, чтение книги, написание программы, глобальная уборка в квартире, поездка в магазин или на рынок с целью глобальной закупки.</p>
<p>Все свои активные действия я делю на две группы: созидание и потребление. Созидание приводит к появлению чего-либо нового в физическом мире или моей собственности. Потребление может приводить к появлению только новых знаний и опыта в моей голове. В принципе, к потреблению относятся все формы обучения и познания и ничего более.</p>
<p>Хочется поехать на рынок и купить новой одежды? Значит, хочется созидать. Хочется программировать? Это также желание созидания. А вот если появилось желание почитать книгу или какие0нибудь статьи, «полистать» интернет, пообщаться с друзьями, то можно говорить о желаниях потребления.</p>
<p>Почему это так важно? Здесь как раз следует обратить внимание на результаты моего анализа своих желаний. Я заметил, что можно выделить периоды, когда доминируют желания только одной из этих групп.</p>
<p>В периоды созидания хочется программировать, создавать новые архитектуры и системы, эскизы; хочется навести порядок в квартире, починить какой-нибудь прибор; наконец-то поменять масло в машине; собрать строение из конструктора дочери; написать статью в блог и так далее.</p>
<p>В периоды потребления хочется в первую очередь читать и слушать других людей. Хочется изучать что-то новое, расширять свой кругозор, рассматривать красивые фотографии, смотреть фильмы. В эти периоды не хочется ничего делать, создавать, хочется только получать готовое.</p>
<p>Обычно периоды потребления и созидания примерно равны по времени между собой и следуют один за другим попеременно, как полоски на зебре. Длина периодов зависит от разных обстоятельств, в том числе разнится во время разных жизненных этапов. Сейчас у меня эти периоды могут измеряться неделями, но, как правило, не больше 2-3 месяцев. Мне кажется, что раньше (в юности) они измерялись днями.</p>
<p>Между этими периодами есть короткий срок, который представляет собой неопределенность. В это время нет явных желаний ни на потребление, ни на созидание. Либо не хочется вообще ничего, либо всего, но понемногу. Состояние в это время может становиться депрессивным. Этот период можно назвать «ломкой».</p>
<p>Все это напоминает всем известные биоритмы. Я никогда не вникал в эту тему и для меня слово «биоритм» ассоциируется только с графиком (ко)синусоиды, и все. Есть подозрение, что я для себя как раз и открыл биоритмы. Пока не знаю.</p>
<p>Все описанное выше можно изобразить на графике:</p>
<p><a href="http://valera.ws/wp-content/uploads/2011/12/lifeline.jpg"><img class="aligncenter size-full wp-image-623" title="lifeline" src="http://valera.ws/wp-content/uploads/2011/12/lifeline.jpg" alt="" width="650" height="503" /></a></p>
<p>На основании полученных данных можно сделать некоторые выводы о том, как лучше организовать свое время, чтобы вписываться в эти периоды максимально легко; составить такой план дел, при котором не нужно будет заставлять себя делать те или иные действия, когда этого не хочется. Ведь в другое время можно сделать то же самое, но уже с удовольствием, что намного приятнее.</p>
<p>Очевидно, что периоды не сменяют друг друга моментально: вчера хочу одно, сегодня совсем другое. Их смена происходит плавно. Сначала желание постепенно усиливается, доходя до максимума (пика), потом постепенно угасает. Время перехода тоже растягивается на некоторый отрезок времени.</p>
<p>Во время смены периодов наступает некоторая апатия. Не хочется делать ничего, либо всего понемногу (что не сильно отличается от «ничего»). Поэтому в это время лучше отдыхать. Не нужно заставлять себя сконцентрироваться на чем-то одном. Лучше откинуть в сторону все и просто отдыхать.</p>
<p>Во время явно выраженных периодов созидания и потребления лучше заняться делом – производством или самообучением в профессиональном плане; наведением порядка в жилище, починкой и обслуживанием личного транспорта или изучением/просмотром интересных материалов (статей, фотографий, фильмов) в плане свободного времени.</p>
<p>Во время переходов лучше максимально отдыхать и расслабляться, дарить большую часть времени семье.</p>
<p>Конечно, это не значит, что нужно строго следовать описанное схеме. Например, отдыхать и уделять время семье нужно всегда. При этом легче определить, каким делам следует отдать предпочтение.</p>
<p>Напоследок подчеркну еще раз: все выводы сделаны на основании анализа жизни одного человека, т.е. меня. Подозреваю, что найдутся люди, которые могут спроецировать описанное на себя. Но на то, что описанная схема годится для всех и является чем-то универсальным, даже не намекаю.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2011.12.04~myself-wishes/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>После обновления ubuntu до 11.04, которое я все откладывал аж до сегодняшнего дня, перестал работать скрол на боковой области тачпада, который прекрасно работал из коробки ранее. Решение было нагуглено довольно быстро, но сам факт наличия таких проблем (у многих пользователей) печалит&#8230; Куда-то не туда двигается Ubuntu в последнее время.</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.07.11~cloud-backup/</link>
		<comments>http://valera.ws/2011.07.11~cloud-backup/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 18:32:17 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[облака]]></category>

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

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

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

		<guid isPermaLink="false">http://valera.ws/?p=521</guid>
		<description><![CDATA[Так выходит, что человеку в жизни на длинных отрезках (расстояния, времени) удобно ориентироваться по их частям. На дороге есть километровые знаки, в лифте — дисплей текущего этажа, в году — дни, а в жизни — годы. Именно на прожитые годы делится &#8230; <a href="http://valera.ws/2010.12.31~2010-2011/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-522 alignleft" title="Екатерина Валерьевна" src="http://valera.ws/wp-content/uploads/2010/12/Kalpakchi-405-150x150.jpg" alt="" width="150" height="150" /></p>
<p>Так выходит, что человеку в жизни на длинных отрезках (расстояния, времени) удобно ориентироваться по их частям. На дороге есть километровые знаки, в лифте — дисплей текущего этажа, в году — дни, а в жизни — годы. Именно на прожитые годы делится отрезок всей жизни человека.</p>
<p>Наверное именно по этому в конце года принято подводить его итоги, начинать планировать следующий. Это касается и бизнеса, и личных вопросов. Поэтому сейчас, за 2 часа и 50 минут до начала нового 2011 года, я решил кратко подвести итоги «своего» 2010-го.</p>
<p><span id="more-521"></span></p>
<p>Этот год стал переломным в моей жизни и насыщеным самыми важными событиями моей послевоенной истории (взрослой жизни).</p>
<ol>
<li>В феврале 2010 я женился.</li>
<li>В июне 2010 я закончил заочное обучение в университете и получил диплом программиста.</li>
<li>В июле 2010 у меня родилась дочь.</li>
<li>В октябле 2010 на работе наконец-то был запущен проект, на которым я работал последние пару лет (с перерывами).</li>
<li>В ноябре 2010 я начал читать книги.</li>
<li>Тогда же я начал ценить и планировать свое время.</li>
<li>В декабре 2010 мой блог стал приносить прибыль.</li>
<li>Тогда же скорость моего анлима (интернет без учета трафика) достигла 2 МБит/с.</li>
</ol>
<p>Кроме этого, в 2010-м я значительно повысил свой профессиональный уровень и научился получать б<strong>о</strong>льшее удовольствие от повседневности.</p>
<div class="mceTemp">
<dl id="attachment_522" class="wp-caption alignleft" style="width: 650px;">
<dt class="wp-caption-dt"><a href="http://valera.ws/wp-content/uploads/2010/12/Kalpakchi-405.jpg"><img class="size-large wp-image-522" title="Екатерина Валерьевна" src="http://valera.ws/wp-content/uploads/2010/12/Kalpakchi-405-1024x680.jpg" alt="" width="640" height="425" /></a><br />
<em>Екатерина Валерьевна</em> </dt>
</dl>
</div>
<p>Этот год для меня был длинным, запоминающимся, интересным и счастливым.</p>
<p>Всех читателей с Новым годом! Не распыляйтесь по мелочам, цените главное и стремитесь к собственному счастью, тогда и чужое подтянется. Удачи!</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.12.31~2010-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

