<?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; HTML</title>
	<atom:link href="http://valera.ws/tag/html/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>CSS-кнопка с реакцией на наведение</title>
		<link>http://valera.ws/2009.10.25~css-button-sprite/</link>
		<comments>http://valera.ws/2009.10.25~css-button-sprite/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 15:35:10 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[верстка]]></category>

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

		<guid isPermaLink="false">http://valera.ws/?p=311</guid>
		<description><![CDATA[Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа. Первым длом полез в гугл. Зачем делать &#8230; <a href="http://valera.ws/2009.04.26~php-interview/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Компания, в которой я работаю, собирается искать хорошего <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.</p>
<p><span id="more-311"></span></p>
<p>Первым длом полез в гугл. Зачем делать работу, которую уже наверняка кто-то сделал? Так и оказалось, сразу нашел довольно неплохой план собеседования (ссылки внизу). Взял из него большуючасть вопросов и добавил свои.</p>
<p>Естественно, что вопросов программисту PHP можно задать море. Особенно учитвая, что знать надо связанные области (БД, сети, HTML и иже с ним, Linux). Смысла задать все вопросы, какие только можно, конечно нету. Задача — определить уровень специалиста, чтобы принять решение: подходит он нам или нет. По-этому выбрал наиболее подходящие на мой взгляд вопросы, по которым я смогу оценить уровень кандидата.</p>
<p>Кроме того, конечно не одиними вопросами можно обойтись. Следует предложить пройти небольшие тесты по практическим моментам. Об этом ниже.</p>
<h1>Вопросы</h1>
<p><strong>1. PHP и основы программирования</strong><br />
1.1. Почему PHP?<br />
1.2. Что такое ООП, основные принципы ООП.<br />
1.3. Понятие абстракции, наследования, инкапсуляции и полиморфизма.<br />
1.4. Что такое MVC?<br />
1.5. Какие паттерны проектирования вам известны?<br />
1.6. Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?<br />
1.7. Какими сторонними библиотеками пользовались?<br />
1.8. Опыт работы с различными Frameworks/CMS?<br />
1.9. Типы данных в PHP? (string, int, float, object, resource, null, bool, array)<br />
1.10. Назовите по памяти функции для работы с массивами, строками и объектами в PHP (хотя бы по 5 штук).<br />
1.11. Что такое сериализация?<br />
1.12. Чем отличается абстрактный класс от интерфейса?<br />
1.13. В каких случаях лучше использовать статические методы и классы?<br />
1.14. Можно ли создать приватный конструктор? Зачем?<br />
1.15. Как сказывается большое количество объектов в коде на производительность?<br />
1.16. Что такое хэш?<br />
1.17. Что такое область видимости переменной?<br />
1.18. Что такое PDO? Что такое ORM?<br />
1.19. Что такое PEAR?<br />
1.20. Когда лучше использовать <em>mysql_pconnect</em>?<br />
1.21. Обязательно ли писать ?&gt; в конце скрипта?<br />
1.22. Как вы отлаживаете PHP-код?<br />
1.23. Проводили когда-нибудь оптимизацию сайтов?<br />
1.24. Какую IDE используете? Какие использовали ранее?<br />
1.25. Что такое unit-test? Использовали?<br />
<strong>2. Tools</strong><br />
2.1. Что такое Apache? mod_rewrite? nginx?<br />
2.2. Аббревиатуры SVN и CVS о чем-нить говорят? А Git и Mercurial?<br />
2.3. Багтрекинг системы? BugZilla? Mantis? Redmine? JIRA?<br />
2.4 .Моделирование, UML использовали?<br />
2.5. Что такое SSH? Какие есть варианты авторизации при входе по SSH?<br />
<strong>3. D</strong><strong>ata Bases</strong><br />
3.1. Что такое реляционная база данных? Какие есть типы БД?<br />
3.2. Нормализация, денормализация.<br />
3.3. SQL. Join&#8217;ы, Union. Подзапросы.<br />
3.4. Процедуры, тригеры.<br />
3.5. Вьюшки.<br />
3.6. InnoDB vs MyISAM.<br />
3.7. Какие бывают индексы в MySQL?<br />
3.8. В чем отличие MySQL от PostgreSQL?<br />
3.9. Что такое SQL-инъекция? Приведите пример.<br />
<strong>4. HTML + <a href="http://valera.ws/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  css">CSS</a></strong><br />
4.1. Нарисуйте простенькую форму для отправки файла.<br />
4.2. Что такое CSS? В чем разница между записью <em>#my</em> и <em>.my</em>? Для каких атрибутов можно указать :hover?<br />
4.3. Расшифруй вот такую запись в CSS <em>table#a tbody td.odd {text-decoration:inherit}</em>?<br />
4.4. Что такое стандарты W3C?<br />
<strong>5. JavaScript</strong><br />
5.1. Как работает наследование в JS?<br />
5.2. Чем отличается хэш от объекта? (провокационный)<br />
5.3. А хэш от массива?<br />
5.4. Если ли опыт работы с Jquery, ExtJS? Какие фреймворки использовались?<br />
5.5. Что такое Ajax? Есть ли опыт работы с ним?<br />
5.6. Использовали ли FireBug? Drag-on-fly?<br />
5.7. Что такое замыкания и как они работают?<br />
<strong>6. Linux</strong><br />
6.1. С *nix знаком? Какие дистрибутивы? Почему?<br />
6.2. Apache, PHP и СУБД устанавливали под *nix? Настраивали? Оптимизировали?<br />
<strong>7. Networking</strong><br />
7.1. Что такое уровни модели OSI? Сколько их?<br />
7.2. По какому протоколу осуществляется передача данных в сети Интернет?<br />
7.3. Какие вообще есть сетевые протоколы?<br />
7.4. Расскажите, что происходит, когда в строке браузера набираешь адрес и нажимаешь Enter?<br />
7.5. Что такое WSDL &amp; web-services? Есть опыт работы?<br />
7.6. Что такое SSL? Как работает HTTPS? Какой принцип работы HTTPS? Какие есть варианты авторизации HTTP?<br />
<strong>8. Что такое XSLT, XML? Есть ли опыт работы с ними?</strong></p>
<h2>Как отработает код?</h2>
<p><strong>1)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = &#8216;true&#8217;;<br />
if( 0 == $a || $a )<br />
{<br />
echo &#8216;yes&#8217;;<br />
}</p>
<p><strong>2)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = 10;<br />
echo $a&#8211; &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211;$a;</p>
<p><strong>3)</strong></p>
<p>&lt;?php<br />
class A {private function __construct(){throw new Exception(&raquo;);} public function A(){return array(&#8216;a&#8217;,'b&#8217;,'c&#8217;);} public static function I(){return new A();}}<br />
/*<br />
Как вывести на экран именно то &#8216;b&#8217;, которое определено в массиве выше, используя одну команду (одну строку кода)?<br />
*/</p>
<p><strong>4)</strong><br />
&lt;?php</p>
<p>/*<br />
Какая строчка выведется при исполнении скрипта?<br />
Почему исполняется или не исполняется каждое из условий?<br />
*/<br />
$x = 1;<br />
if ($x == &#8217;1&#8242;) {<br />
echo &#8216;a&#8217;;<br />
}<br />
if ($x == true) {<br />
echo &#8216;b&#8217;;<br />
}<br />
if((bool)$x === true){<br />
echo &#8216;e&#8217;;<br />
}<br />
if ($x === true) {<br />
echo &#8216;c&#8217;;<br />
}<br />
if((int)$x === true){<br />
echo &#8216;d&#8217;;<br />
}</p>
<p><strong>5)</strong><br />
&lt;?php<br />
/*<br />
Что выведет скрипт? (запускается непосредственно)<br />
*/<br />
error_reporting(E_ALL);<br />
ini_set(&#8216;display_errors&#8217;,&#8217;0&#8242;);</p>
<p>print $x[0];<br />
dddxxxx();</p>
<p><strong>6)</strong><br />
&lt;?php<br />
/*<br />
Для какой версии PHP будет работать этот скрипт?<br />
Что выведет этот скрипт?<br />
*/<br />
class Test{</p>
<p>private $var;</p>
<p>function setMe($value){<br />
$this-&gt;var = $value;<br />
}<br />
}</p>
<p>class More extends Test{<br />
public $var;<br />
}</p>
<p>$oTest = new Test;<br />
$oMore = new More;</p>
<p>echo $oTest-&gt;setMe(&#8216;foo&#8217;);</p>
<p>echo $oMore-&gt;setMe(&#8216;foo&#8217;);</p>
<p>echo $oMore-&gt;var;</p>
<p>echo $oTest-&gt;var;</p>
<h2>Тест на corp.mamba.ru</h2>
<p><a href="http://www.corp.mamba.ru/test/promo.phtml" target="_blank">http://www.corp.mamba.ru/test/promo.phtml</a></p>
<h2>Ссылки</h2>
<p>А вот и те ссылки, которые помогли мне в составлении списка.</p>
<p><a href="http://habrahabr.ru/blogs/php/21681/" target="_blank">http://habrahabr.ru/blogs/php/21681/</a></p>
<p><a href="http://habrahabr.ru/blogs/webdev/19964/" target="_blank">http://habrahabr.ru/blogs/webdev/19964/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.26~php-interview/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Фокусы с nginx</title>
		<link>http://valera.ws/2009.01.26~nginx-magic/</link>
		<comments>http://valera.ws/2009.01.26~nginx-magic/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 14:23:05 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=276</guid>
		<description><![CDATA[Вчерашний вечер я посвятил возне с http-сервером nginx в качестве фронтэнда к apache. Как известно, nginx — легковесный надежный HTTP-сервер, написанный Игорем Сысоевым (сотрудником Rambler). Он отлично подходит для выдачи статических страниц, особенно под нагрузкой. Обычно настраивается связка nginx+apache, в &#8230; <a href="http://valera.ws/2009.01.26~nginx-magic/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Вчерашний вечер я посвятил возне с http-сервером <a href="http://valera.ws/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> в качестве фронтэнда к apache. Как известно, <a href="http://nginx.net/" target="_blank">nginx</a> — легковесный надежный HTTP-сервер, написанный <a href="http://sysoev.ru" target="_blank">Игорем Сысоевым</a> (сотрудником <a href="http://rambler.ru" target="_blank">Rambler</a>). Он отлично подходит для выдачи статических страниц, особенно под нагрузкой. Обычно настраивается связка nginx+apache, в которой nginx  обслуживает все входящие на сервер запросы, статические файлы отдает своими силами, а запросы на динамическое содержимое проксирует на apache.</p>
<p>Так вот, по настройке работы данной пары в связке в Интернете есть море статей, в том числе на русском, и об этом писать смысла нет. А расскажу я вам лучше о тех нюансах, с которыми вчера столкнулся при настройке nginx на работу в нужном ладе, и заодно покажу и прокомментирую свою конфигурацию этого сервера.</p>
<p><span id="more-276"></span></p>
<h2>Моя конфигурация</h2>
<p>Для начала, что собственно требовалось сделать? Сервер настраивался для <a href="http://habrometr.ru" target="_blank">Хаброметра</a>. Он должен был выдавать статику (лого и <a href="http://valera.ws/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  css">css</a>) и динамику (собственно страницы сайта и png-хаброметры). При этом, надо было учесть, что хаброметр создается на лету в том случае, если не лежит в кэше (а кэш чистится каждые 2 часа при запросе новых данных). Страницы сайта также необходимо кэшировать. Вот такая была задача.</p>
<p>Реализацию решено было сделать следующим образом. nginx при обработке запроса должен следовать следующим правилам:</p>
<ol>
<li>Если  запрошена статика, то просто вернуть ее (вся статика в папочке stuff).</li>
<li>Если запрошена страница сайта, нужно проверить кэш; если в кэше файл не найден, передать запрос бэкэнду apache. Кэш страниц должен чиститься с заданной частотой (для разных страниц частота разная).</li>
<li>Если запрошен информер, то нужно проверить кэш на наличие файла. Если файла там нет, передать  запрос бэкэнду.</li>
</ol>
<p>Для кэширования хаброметров выбрана файловая система. Все сгенерированные информеры складываются в каталог /image_cache/ и он чистится каждые 2 часа при обновлении исходных данных. Рисуются информеры и кладутся в этот каталог <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>-скриптом при  соответствующем запросе.</p>
<p>Для кэширования  страниц сайта выбран memcache, т.к. с ним легко и удобно работать (как из nginx, так и из PHP) и он сам может чистить кэшированные странички через заданный интервал времени, что ФС делать не может без дополнительных скриптов. Да и работать memcache будет побыстрее, т.к. все добро складируется в оперативке.</p>
<p>Получилась следующая конфигурация сервера:</p>
<p># cat /etc/nginx/nginx.conf</p>
<pre>user www-data;
worker_processes 2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;</pre>
<pre>events {
    worker_connections  2048;
}</pre>
<pre>http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  65;
    tcp_nodelay        on;
    gzip  on;
    add_header Habrometr "hacker_mode_enabled;)";</pre>
<pre>    server {
        listen       80;
        server_name  habrometr.server.valera.ws habrometr.ru www.habrometr.ru;
        access_log  /var/log/nginx/habrometr.access.log;
<pre>        location / {
            root   /home/habrometr/public_html;
            index  index.html index.htm;
            if (-f $document_root/image_cache${uri}) {
                rewrite ^.*$ /image_cache/$uri last;
                break;
            }

            set $memcached_key "habrometr$uri";
            memcached_pass localhost:11211;
            # если в memcached не найден ресурс, передаем запрос на апач
            error_page 404 502 504 = @backend;
            add_header Content-Type "text/html; charset=UTF-8";
            gzip on;
            gzip_proxied any;
            gzip_types application/octet-stream;
    }</pre>
</pre>
<pre>    location @backend {
        set $proxy_uri http://habrometr.ru:99999$request_uri;
        proxy_pass $proxy_uri;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X_Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 20;
    }</pre>
<pre>    location /image_cache/ {
        root   /home/habrometr/public_html;
        expires modified +2h; # кэш истекает через 2 часа после модификации файла
    }</pre>
<pre>    location /stuff/ {
        root   /home/habrometr/public_html;
        expires 30d;
    }</pre>
<pre>    location ~ /\.ht {
        deny  all;
    }</pre>
<pre>}</pre>
<p>Учитывая приведенный выше сценарий, вся конфигурация должна быть понятна. Замечу лишь, что http://habrometr.ru:99999 — это apache, которому будут перенаправляться запросы. Порт я, конечно, изменил, в реальности обычно используют 8080 или что-то типо того.</p>
<h2>Фокусы</h2>
<p>А теперь о том, что нетривиального в этой конфигурации (во всяком случае для новичка в этой области).</p>
<h3>Версия</h3>
<p>Во-первых, сервер у меня работает на Debian 4.0. Весь софт я естественно ставил из  стандартных репозиториев. Поставил оттуда и nginx. Установленный nginx оказался версии 0.4 при наличии последней версии 0.7 со значительным <a href="http://sysoev.ru/nginx/changes.html" target="_blank">списком изменений</a>.</p>
<p>Выяснилось, что версия 0.4 не умеет делать много из того, что было нужно. В частности:</p>
<ol>
<li>флаг modified не сузествует для директивы expire, а мне это необходимо было для указания времени устаревания кэша информеров (2 часа после создания: expire modified +2h);</li>
<li>proxy_pass не умел использовать переменные, а мне требовалась эта возможность;</li>
<li>memcached не использовал переменную $memcached_key для определения ключа, т.е. нельзя было задать ключ нужного формата.</li>
</ol>
<p>В принципе, все эти проблемы можно было решить обходными извращенскими путями, но делать этого совсем не хотелось, по этому я просто поставил свежую версию nginx из сырцов. Благо, делается это очень просто.</p>
<p>Перед тем, как описать процесс установки, замечу, что по умолчанию при сборке из исходников все файлы nginx складывает в каталог /usr/local/nginx. Его, конечно, можно изменить (&#8211;prefix=). Но обратите внимание, что установленных из пакетов nginx раскидывает свои файлы по соответствующим каталогам системы (/etc, /var/log, /var/run и т.д.), что лично мне определенно нравится больше, чем /usr/local/nginx/*. По этому я откомпилировал nginx из сырцов с  настройками на системные каталоги, а потом вместо make install просто вручную заменил старый бинарный файл сервера в каталоге /usr/sbin на новый (/usr/sbin/nginx). Больше значимых файлов после сборки для сервера нет. Конфиг, естественно, остается тот же самый.</p>
<p>Итак, установка nginx на Debian etch из исходников поверх установленного пакета старой версии.</p>
<pre># wget http://sysoev.ru/nginx/nginx-0.7.31.tar.gz
# tar xzf nginx-0.7.31.tar.gz
# cd nginx-0.7.31
# apt-get install libpcre3 libpcre3-dev libpcrecpp0
# /etc/init.d/nginx stop;
# ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module
--without-mail_pop3_module --without-mail_imap_module
--without-mail_smtp_module --prefix=/var/lib/nginx
--sbin-path=/usr/sbin --conf-path=/etc/nginx/
--error-log-path=/var/log/nginx --http-log-path=/var/log/nginx
--pid-path=/var/run --lock-path=/var/lock
# make
# cd objs
# cp -f ./nginx /usr/sbin
# /etc/init.d/nginx start;</pre>
<p>После этого уже должен быть запущен и обслуживать запросы свежий сервер nginx, который умеет все нужные нам штуки.</p>
<h3>Документы из memcached</h3>
<p>Когда nginx отдает напрямую файлы, он передает заголовок Content-type в соответствии с типом данного файла. Когда nginx проксирует apache, Content-type приходит от apache. Но когда nginx забирает документа из memcached, то Content-type не устанавливается. А значит, используется дефалтный. А дефалтный у нас по конфигу   default_type  application/octet-stream;, и это правильно. В этом случае при отдаче документа из кэша будет неправильно передаваться тип и некоторые браузеры предложат сохранить бинарный файл, вместо того чтобы открыть HTML-страницу. Чтобы ситуацию исправить, в случае отдачи из memcached устанавливаем заголовки (и, кстати, сжатие тоже) дополнительно:</p>
<pre>set $memcached_key "habrometr$uri";
memcached_pass localhost:11211;
error_page 404 502 504 = @backend;
add_header Content-Type "text/html; charset=UTF-8";
gzip on;
gzip_proxied any;
gzip_types application/octet-stream;</pre>
<p>При этом из memcached мы получаем только HTML в UTF-8.</p>
<h3>Мухи отдельно, котлеты отдельно.</h3>
<p>В  качестве отдельной магии хотелось бы выделить сам способ выделения хаброметров по имени файла и обслуживания их по-особому. В секции location / выделяем эти файлы:</p>
<pre>if (-f $document_root/image_cache${uri}) {
    rewrite ^.*$ /image_cache/$uri last;
    break;
}</pre>
<p>Если файл находим в кэше, то просто возвращаем его пользователю, сообщая что файл можно закешировать до времени следующего обновления (модификация файла + 2 часа):</p>
<pre>location /image_cache/ {
    root   /home/habrometr/public_html;
    expires modified +2h;
}</pre>
<p>Обратите внимание на наличие флага last у rewrite и директивы break; за ней. Без использования этих двух директив мне не удалось заставить nginx 0.4 (на 0.7 я не проверял) сразу перейти в секцию location /image_cache/, т.е. после обнаружения файла он переходил к проскированию, что неверно.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.01.26~nginx-magic/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Рейтинг языков программирования: поиски в Яндексе и вакансии в Беларуси</title>
		<link>http://valera.ws/2008.03.28~programming-languages-ratings/</link>
		<comments>http://valera.ws/2008.03.28~programming-languages-ratings/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 09:42:18 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[рейтинг]]></category>
		<category><![CDATA[языки программирования]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.03.28~programming-languages-ratings/</guid>
		<description><![CDATA[Решил подойти к вопросу рейтинга языков еще с одной стороны. Собрал небольшую статистику по размещенным вакансиям/резюме на белорусском сайте работы, и статистику количества запросов по данным языкам в Яндексе. На сайте Praca.by провел поиск вакансий и резюме по ключевым словам. Поиск на jobs.tut.by выдавал какие-то нереально малые цифры, потому пишлось &#8230; <a href="http://valera.ws/2008.03.28~programming-languages-ratings/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Решил подойти к вопросу рейтинга языков еще с одной стороны. Собрал небольшую статистику по размещенным вакансиям/резюме на белорусском сайте работы, и статистику количества запросов по данным языкам в Яндексе.<br />
<span id="more-34"></span><br />
На сайте <a href="http://praca.by/" target="_blank">Praca.by</a> провел поиск вакансий и резюме по ключевым словам. Поиск на <a href="http://jobs.tut.by" target="_blank">jobs.tut.by</a> выдавал какие-то нереально малые цифры, потому пишлось ограничится статистикой с працы. Результаты представлены в таблице.</p>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<th bgcolor="#f1f4f8"></th>
<th bgcolor="#f1f4f8">Вакансии</th>
<th bgcolor="#f1f4f8"></th>
<th bgcolor="#f1f4f8"></th>
<th bgcolor="#f1f4f8">Резюме</th>
<th bgcolor="#f1f4f8"></th>
</tr>
<tr>
<th bgcolor="#f1f4f8">№</th>
<th bgcolor="#f1f4f8">Ключевое слово</th>
<th bgcolor="#f1f4f8">Количетсво</th>
<th bgcolor="#f1f4f8">№</th>
<th bgcolor="#f1f4f8">Ключевое слово</th>
<th bgcolor="#f1f4f8">Количество</th>
</tr>
<tr>
<td align="right">1</td>
<td>программист</td>
<td align="center">166</td>
<td align="right">1</td>
<td>программист</td>
<td align="center">53</td>
</tr>
<tr>
<td align="right">2</td>
<td><a href="http://valera.ws/tag/java/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Java">Java</a></td>
<td align="center">95</td>
<td align="right">2</td>
<td><a href="http://valera.ws/tag/sql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL">SQL</a></td>
<td align="center">37</td>
</tr>
<tr>
<td align="right">3</td>
<td>SQL</td>
<td align="center">94</td>
<td align="right">3</td>
<td>C++</td>
<td align="center">36</td>
</tr>
<tr>
<td align="right">4</td>
<td>HTML</td>
<td align="center">85</td>
<td align="right">4</td>
<td><a href="http://valera.ws/tag/delphi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Delphi">Delphi</a></td>
<td align="center">34</td>
</tr>
<tr>
<td align="right">5</td>
<td>JavaScript и JS</td>
<td align="center">68</td>
<td align="right">5</td>
<td>Java</td>
<td align="center">29</td>
</tr>
<tr>
<td align="right">6</td>
<td><a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a></td>
<td align="center">48</td>
<td align="right">6</td>
<td>PHP</td>
<td align="center">22</td>
</tr>
<tr>
<td align="right">7</td>
<td>C#</td>
<td align="center">37</td>
<td align="right">7</td>
<td>C#</td>
<td align="center">12</td>
</tr>
<tr>
<td align="right">8</td>
<td>C++</td>
<td align="center">33</td>
<td align="right">8</td>
<td>JavaScript и JS</td>
<td align="center">12</td>
</tr>
<tr>
<td align="right">9</td>
<td>Delphi</td>
<td align="center">13</td>
<td align="right">9</td>
<td>HTML</td>
<td align="center">9</td>
</tr>
<tr>
<td align="right">10</td>
<td>Python</td>
<td align="center">5</td>
<td align="right">10</td>
<td><a href="http://valera.ws/tag/ruby/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ruby">Ruby</a></td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">11</td>
<td>Ruby</td>
<td align="center">4</td>
<td align="right">11</td>
<td>Python</td>
<td align="center">0</td>
</tr>
</table>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<th colspan="3" bgcolor="#f1f4f8" colspan="3">Сравнительная таблица</th>
<th bgcolor="#f1f4f8"></th>
</tr>
<tr>
<th bgcolor="#f1f4f8">№</th>
<th bgcolor="#f1f4f8">Ключевое слово</th>
<th bgcolor="#f1f4f8">Количество вакансий</th>
<th bgcolor="#f1f4f8">Количество резюме</th>
</tr>
<tr>
<td align="right">1</td>
<td>C#</td>
<td align="center">37</td>
<td align="center">12</td>
</tr>
<tr>
<td align="right">2</td>
<td>C++</td>
<td align="center">33</td>
<td align="center">36</td>
</tr>
<tr>
<td align="right">3</td>
<td>Delphi</td>
<td align="center">13</td>
<td align="center">34</td>
</tr>
<tr>
<td align="right">4</td>
<td>HTML</td>
<td align="center">85</td>
<td align="center">9</td>
</tr>
<tr>
<td align="right">5</td>
<td>Java</td>
<td align="center">95</td>
<td align="center">29</td>
</tr>
<tr>
<td align="right">6</td>
<td>JavaScript и JS</td>
<td align="center">68</td>
<td align="center">12</td>
</tr>
<tr>
<td align="right">7</td>
<td>PHP</td>
<td align="center">48</td>
<td align="center">22</td>
</tr>
<tr>
<td align="right">8</td>
<td>Python</td>
<td align="center">5</td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">9</td>
<td>Ruby</td>
<td align="center">4</td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">10</td>
<td>SQL</td>
<td align="center">94</td>
<td align="center">37</td>
</tr>
<tr>
<td align="right">11</td>
<td>программист</td>
<td align="center">166</td>
<td align="center">53</td>
</tr>
</table>
<p><strong>А вот таблица по количеству поисковых запросан на <a href="http://ya.ru/" target="_blank">Яндексе</a> за месяц:</strong></p>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<th bgcolor="#f1f4f8">Ключевое слово</th>
<th bgcolor="#f1f4f8">Количество<br />
запросов</th>
</tr>
<tr>
<td>php</td>
<td align="center">5 758 454</td>
</tr>
<tr>
<td>html</td>
<td align="center">1 892 564</td>
</tr>
<tr>
<td>C++</td>
<td align="center">427 059</td>
</tr>
<tr>
<td>C#</td>
<td align="center">427 059</td>
</tr>
<tr>
<td>Java</td>
<td align="center">376 318</td>
</tr>
<tr>
<td>Delphi</td>
<td align="center">190 121</td>
</tr>
<tr>
<td>sql</td>
<td align="center">101 706</td>
</tr>
<tr>
<td>javascript</td>
<td align="center">71 217</td>
</tr>
<tr>
<td>программист</td>
<td align="center">43 701</td>
</tr>
<tr>
<td>js</td>
<td align="center">11 826</td>
</tr>
<tr>
<td>Python</td>
<td align="center">7 758</td>
</tr>
<tr>
<td>Ruby</td>
<td align="center">5 570</td>
</tr>
</table>
<p><strong>Выводы (кратко). </strong>Не забывайте, что статистика рабочих мест касается только Беларуси, а поиска — только рунета.</p>
<ol>
<li>PHP все еще актуален и в лидерах. В то же врмемя, раз много ищут в яндексе, значит много новичков и чайников им интерисуются.</li>
<li>C# жжот.</li>
<li>HTML ищут много. Профессионалам по HTML искать <em>почти</em> нечего, вывод — студенты, новички все еще атакуют :)</li>
<li>Java-программеры давно поняли, что помощь надо просить у гугла. Тех, кто еще не понял, осталось мало :)</li>
<li>JavaScript солидно отстает по популярности от того же PHP.</li>
</ol>
<p>Теперь выводы из поиска вакансий/резюме.</p>
<ol>
<li>Ищут в основном Java-девелоперов. Причем, как спрос, так и предложение (относительно других языков) велики. Специалисты могут выбирать, имеют возможность менять работу в поиске лучших условий и з/п.</li>
<li>С#: спрос в 3 раза превышает предложение. Ищут много, большенство уже нашли себе теплые места и сидят там :) <font size="1"><strike>Ждем лета-осени, когда работу начнут искать выпущенные студенты&#8230;</strike> (тут сказали, что нихера не ждем, потому что распределение и все дела. Ну и ладно, значит не ждем :)</font></li>
<li>Delphi: мест мало, резюме много. Дельфи знают многие, это популярный язык у чайников. Но серьезные конторы не работают с этой средой.</li>
<li>C++: все хорошо, все на своих местах&#8230;</li>
<li>PHP-программистов не хватает. Всех хороших разобрали, плохие никому не нужны. Однако, и спрос, и предложение, меньше традиционных системных языков. Сайт-бум прошел.</li>
<li>Python и Ruby: есть мизерный спрос, предложение нулевое. Эти языки у нас не популярны. Больше как хобби расматриваются.</li>
<li>SQL жив. Правда программировать на нем довольно грустно и сложно (имеется в виду программирование бизнес-логики в хранимых процедурах), потому предложение в 3 раза меньше спроса. Но при этом, в большенстве вакансий ищут не SQL-разработчика, а c++, php, c#, а SQL только прилагается. Это объясняет второе место после Java. А вообще, банки атакуют :)</li>
<li>JavaScript и HTML получили 3-е и 4-е места только потому, что они вечно к чему то прилагаются. В основном к PHP и C#.</li>
</ol>
<p>Короче говоря, лучше всех живется джаверам: огромный спрос, относительно спроса малое предложение :)</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.03.28~programming-languages-ratings/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Мартовский рейтинг языков программирования от TIOBE</title>
		<link>http://valera.ws/2008.03.27~tiobe-march08/</link>
		<comments>http://valera.ws/2008.03.27~tiobe-march08/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 21:02:58 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[TIOBE]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[рейтинг]]></category>
		<category><![CDATA[С++]]></category>
		<category><![CDATA[языки программирования]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.03.27~tiobe-march08/</guid>
		<description><![CDATA[Оказывается, есть такая компания TIOBE Software, которая ежемесячно рассчитывает глобальный рейтинг языков программирования. Называется этот рейтинг &#171;TIOBE Programming Community Index&#187;. А вот версия этой штуки за март 2008 года. Рейтинг основан на количестве разработчиков на данных языках по всему миру, количеству различных курсов и производителей, использующих те или иные &#8230; <a href="http://valera.ws/2008.03.27~tiobe-march08/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img align="left" height="82" width="215" vspace="4" hspace="4" border="0" src="http://www.tiobe.com/content/general/images/tiobe_software.gif" />Оказывается, есть такая компания <a target="_blank" href="http://www.tiobe.com/index.php">TIOBE Software</a>, которая ежемесячно рассчитывает глобальный рейтинг языков программирования. Называется этот рейтинг &laquo;<a href="http://valera.ws/tag/tiobe/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  TIOBE">TIOBE</a> Programming Community Index&raquo;. А <a target="_blank" href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">вот версия</a> этой штуки за март 2008 года.</p>
<p><span id="more-33"></span></p>
<p>Рейтинг основан на количестве разработчиков на данных языках по всему миру, количеству различных курсов и производителей, использующих те или иные языки. Для рассчета рейтинга используются популярные западные поисковики Google, MSN, Yahoo!, и YouTube. По-этому, не стоит понимать данный рейтинг, как выбор лучшего языка программирования, или показателя количетсва написанных строк кода на предствеленных языках.</p>
<p><strong>Итак, предствим 20-ку лучших. Позиции с 21 по 50  представлены на <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" target="_blank">сайте-источнике</a>.</strong></p>
<table id="Table2" class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" cellpadding="3" align="center" border="1">
<tr>
<th align="center" nowrap="nowrap"><strong>Position<br />
Mar 2008</strong></th>
<th align="center" nowrap="nowrap">Position<br />
Mar 2007</th>
<th align="center" nowrap="nowrap">Delta in Position</th>
<th align="center" nowrap="nowrap">Programming Language</th>
<th align="center" nowrap="nowrap">Ratings Mar 2008</th>
<th align="center" nowrap="nowrap">Delta Mar 2007</th>
<th align="center" nowrap="nowrap">Status</th>
</tr>
</table>
<p>Status обозначает принадлежность языка программирования к группе основных используемых (A) или второстевенных (B). A- означает сдвиг в сторону второстепенных.</p>
<p>Как видно, Java лидирует и за год набрал 2,6% пользователей. За ним идет Си, который не поменял позиции. А вдвоем они держат 35% рынка (если так можно выразиться).</p>
<p>Не совсем понятно поднятие на 2 позиции Visual Basic. Он обогнал <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>, который сумел удержаться. Зато 2 позиции сдал  	C++. Это падение как раз объеснимо: +1 позиция <a href="http://valera.ws/tag/c/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  C#">C#</a> и +3 позиции Delphi немного потеснили C++. Эти 3 языка можно включить в одну группу взаимозаменяемости.</p>
<p>JavaScript, который сейчас, казалось бы, на пике популярности, сдал 3 позиции. Почему? Рискну предположить, что пользователи стали меньше искать по JS в поисковиках за счет появления фрейморков. Программировать на нем стало проще, он стал меньше обсуждаться.</p>
<p>6-ю и 7-ю позиции Perl&#8217;а и Python&#8217;а мне честно говоря вообще сложно объяснить. Казалось, что первый давно забыт, а второй используется довольно редко. Возможно Python удерживается и за счет того, что до сих под активно используется в Google.</p>
<p>Интересно так же то, что в 20-ку нагло ворвались Pascal и  Lua (+5 позиций). Неужели на Pascal еще пишут софт?</p>
<p>Вообще, рейтинг довольно спорный, но интересный :)</p>
<p>Источник: <a target="_blank" href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.03.27~tiobe-march08/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

