<?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>by Romul &#187; Development</title>
	<atom:link href="http://byromul.ru/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://byromul.ru</link>
	<description>То, что интересно мне</description>
	<lastBuildDate>Wed, 25 Jan 2012 21:28:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>500 ошибка в nginx</title>
		<link>http://byromul.ru/2011/08/14/500-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-nginx/</link>
		<comments>http://byromul.ru/2011/08/14/500-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-nginx/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 08:35:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=647</guid>
		<description><![CDATA[Скверная ошибка попалась... в логах php пусто, в логах apache пусто - ошибок нет Посмотреть, что творится в логах nginx сразу мысль не пришла, а зря. В логе следующая ошибка: 2011/08/09 12:41:56 [error] 1271#0: *1469 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: core.my, request: "GET /index/sync/ HTTP/1.1", upstream: [...]]]></description>
			<content:encoded><![CDATA[<p>Скверная ошибка попалась... в логах php пусто, в логах apache пусто - ошибок нет<br />
Посмотреть, что творится в логах nginx сразу мысль не пришла, а зря.<br />
<span id="more-647"></span></p>
<p>В логе следующая ошибка:<br />
<code>2011/08/09 12:41:56 [error] 1271#0: *1469 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: core.my, request: "GET /index/sync/ HTTP/1.1", upstream: "http://127.0.0.1:8080/index/sync/", host: "core.my"</code></p>
<p>Понятно, что ошибка в слишком большом заголовке ответа... но откуда?<br />
Вспоминаю, что у меня стоит плагин в Mozilla FirePHP, в который из Zend Framework скидывается список выполненных запросов через те самые заголовки ответа:<br />
<code>X-Wf-Protocol-1	http://meta.wildfirehq.org/Protocol/JsonStream/0.2<br />
X-Wf-1-Structure-1	http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1<br />
X-Wf-1-Plugin-1	http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2<br />
X-Wf-1-1-1-1	390|[{"Type":"TABLE","Label":"DB query log (3 @ 0.0006 sec)"},[["Time","Event","Parameters"],["0.00025","SELECT `table`.* FROM `table` WHERE (client_id = '1') AND (token = '9349ed2bd5d16c77f3b33e770db8a194')",null],["0.0002","SELECT `table2`.* FROM `table2` WHERE (((`table2`.`id` = 1)))",null],["0.00015","SELECT `table3`.* FROM `table3` WHERE (id = 1)",null]]]|</code></p>
<p>Решается проблема расширением буфера ответа в nginx<br />
<code>proxy_buffers 8 16k;<br />
proxy_buffer_size 32k;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2011/08/14/500-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASUS WL-500gP V2 &#8211; настройка php и cron</title>
		<link>http://byromul.ru/2011/03/31/asus-wl-500gp-v2-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-php-%d0%b8-cron/</link>
		<comments>http://byromul.ru/2011/03/31/asus-wl-500gp-v2-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-php-%d0%b8-cron/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 19:19:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[ASUS]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=612</guid>
		<description><![CDATA[Встала интересная задача по настройки php скриптов выполняемых в cron. Давно написал программку, которая автоматически ухаживает за моим питомцем на фотостране. Мне приятно заходить и смотреть, как мой котенок растет и развивается. Не так давно, меня уличили в хитрости и ip сервера, с которого раз в минуту шустренько я творил чудеса с питомцем, заблокировали. Появилась [...]]]></description>
			<content:encoded><![CDATA[<p>Встала интересная задача по настройки php скриптов выполняемых в cron. Давно написал программку, которая автоматически ухаживает за моим питомцем на фотостране. Мне приятно заходить и смотреть, как мой котенок растет и развивается. Не так давно, меня уличили в хитрости и ip сервера, с которого раз в минуту шустренько я творил чудеса с питомцем, заблокировали. Появилась идейка, поднять все на роутере, т.к. переподключение к Интернет дает новый ip адрес <img src='http://byromul.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-612"></span><br />
Всю информацию я почерпнул с сайта: wl500g.info</p>
<p>Первая попытка все настроить не увенчалась успехом, т.к. флэш память у роутера 32 Mb... увы.<br />
Подключил жесткий диск и проделал следующее:</p>
<p><code>mount<br />
mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1<br />
mke2fs -j /dev/discs/disc0/part1<br />
mount /dev/discs/disc0/part1 /tmp/mnt/disc0_1<br />
mkdir /tmp/mnt/disc0_1/opt<br />
mount -obind /tmp/mnt/disc0_1/opt /opt<br />
mkdir -p /opt/tmp/ipkg<br />
ipkg.sh update<br />
ipkg.sh install ipkg-opt<br />
ipkg update<br />
ipkg install mc<br />
ipkg install php<br />
ipkg install php_curl<br />
ipkg install cron</code></p>
<p>Этим набором команд было проделано:<br />
1. отформатирован<br />
2. смонтирован, как директория /opt<br />
3. обновлен ipkg (утилита для работы с библиотекой программ)<br />
4. установлены: mc, cron, php и php_curl</p>
<p>Далее чудесная манипуляция, набор команд для записи на флэшку данных (иначе после ребута все потеряется)</p>
<p><code>flashfs save<br />
flashfs commit<br />
flashfs enable</code></p>
<p>После перезагрузки у нас должен монтироваться диск в /opt и запускаться деамон cron:</p>
<p><code>mkdir -p /usr/local/sbin/<br />
vi /usr/local/sbin/post-mount</code></p>
<p>Вставляем:</p>
<p><code>#!/bin/sh<br />
mount -o bind,sync,noatime,rw /tmp/mnt/disc0_1/opt /opt<br />
/opt/etc/init.d/S10cron start</code></p>
<p>Далее для самого даем права на запуск для этого файла и редактируем скрипт запуска:</p>
<p><code>chmod +x /usr/local/sbin/post-mount<br />
vi /opt/etc/init.d/S10cron</code></p>
<p>Вставляем:</p>
<p><code>#!/bin/sh<br />
#<br />
# Startup script for cron<br />
PIDFILE=/opt/var/run/cron.pid<br />
case $1 in<br />
start)<br />
/opt/sbin/cron ;;<br />
stop)<br />
[ -f ${PIDFILE} ] &#038;& kill `cat ${PIDFILE}` ;;<br />
*)<br />
echo "usage: $0 (start|stop)"<br />
exit 1<br />
esac</code></p>
<p>...и добавляем команды в крон:</p>
<p><code>vi /opt/etc/crontab</code></p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2011/03/31/asus-wl-500gp-v2-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-php-%d0%b8-cron/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Снижение трафика на сервере</title>
		<link>http://byromul.ru/2010/03/18/%d1%82%d1%80%d0%b0%d1%84%d0%b8%d0%ba-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80/</link>
		<comments>http://byromul.ru/2010/03/18/%d1%82%d1%80%d0%b0%d1%84%d0%b8%d0%ba-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 21:52:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[трафик]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=364</guid>
		<description><![CDATA[Столкнулся с проблемой нового хостинга, где ограничение по трафику - 2Tb. Сайт, с просмотром/скачиванием видео ~20.000 за сутки, кушает 120Gb. Пришлось принять меры: - ограничил скачивание видео для пользователей - 3 видео в сутки (пока элементарно, если применить мозг - ломается мгновенно) - в nginx сделал элементарное ограничение по скорости и коннектам в зоне http: [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с проблемой нового хостинга, где ограничение по трафику - 2Tb.<br />
Сайт, с просмотром/скачиванием видео ~20.000 за сутки, кушает 120Gb.</p>
<p>Пришлось принять меры:<br />
- ограничил скачивание видео для пользователей - 3 видео в сутки (пока элементарно, если применить мозг - ломается мгновенно)<br />
- в nginx сделал элементарное ограничение по скорости и коннектам</p>
<p>в зоне http:<br />
<code>limit_zone download $binary_remote_addr 10m;<br />
</code></p>
<p>в location:<br />
<code>limit_conn download 2;<br />
limit_rate_after 2048k;<br />
limit_rate 128k;<br />
</code></p>
<p>restart nginx в debian:<br />
<code>/etc/init.d/nginx restart</code></p>
<p>просмотр трафика в realtime утилитой <code>ifstatus</code></p>
<p>Количество одновременное воспроизводимых видео - 2<br />
После скачки 2Mb скорость падает до 128Kb</p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/03/18/%d1%82%d1%80%d0%b0%d1%84%d0%b8%d0%ba-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Улучшил свой блог</title>
		<link>http://byromul.ru/2010/03/09/%d1%83%d0%bb%d1%83%d1%87%d1%88%d0%b8%d0%bb-%d1%81%d0%b2%d0%be%d0%b9-%d0%b1%d0%bb%d0%be%d0%b3/</link>
		<comments>http://byromul.ru/2010/03/09/%d1%83%d0%bb%d1%83%d1%87%d1%88%d0%b8%d0%bb-%d1%81%d0%b2%d0%be%d0%b9-%d0%b1%d0%bb%d0%be%d0%b3/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 19:37:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=345</guid>
		<description><![CDATA[1. Замучил спам и поставил рекапчу на все комментарии, даже зарегистрированных пользователей: http://wordpress.org/extend/plugins/wp-recaptcha/installation/ В инструкции перешел на сайте mailhide.recaptcha.net и получил ключ для своего блога. 2. Изменил тему, т.к. предыдущая не использовала новый функционал wordpress http://wordpress.org/extend/themes/ Частично ее пофиксил: убрал аляповатую ссылку на rss, вернул ссылку more, поменял ссылки rss на гугловый feedburner.google.com 3. Сделал [...]]]></description>
			<content:encoded><![CDATA[<p>1. Замучил спам и поставил рекапчу на все комментарии, даже зарегистрированных пользователей:</p>
<p>http://wordpress.org/extend/plugins/wp-recaptcha/installation/</p>
<p>В инструкции перешел на сайте mailhide.recaptcha.net и получил ключ для своего блога.<br />
2. Изменил тему, т.к. предыдущая не использовала новый функционал wordpress</p>
<p>http://wordpress.org/extend/themes/</p>
<p>Частично ее пофиксил: убрал аляповатую ссылку на rss, вернул ссылку more, поменял ссылки rss на гугловый feedburner.google.com<br />
3. Сделал подписку на email<br />
4. Поставил счетчики тИЦ и кол-во подписок</p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/03/09/%d1%83%d0%bb%d1%83%d1%87%d1%88%d0%b8%d0%bb-%d1%81%d0%b2%d0%be%d0%b9-%d0%b1%d0%bb%d0%be%d0%b3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка простой онлайн игры. Часть 1</title>
		<link>http://byromul.ru/2010/02/24/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%be%d0%bd%d0%bb%d0%b0%d0%b9%d0%bd-%d0%b8%d0%b3%d1%80%d1%8b/</link>
		<comments>http://byromul.ru/2010/02/24/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%be%d0%bd%d0%bb%d0%b0%d0%b9%d0%bd-%d0%b8%d0%b3%d1%80%d1%8b/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 20:04:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Игры]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[игры]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=310</guid>
		<description><![CDATA[Простая игра, на подобии комбатс.ру с первым пришедшим на ум названием "Маги 2.0" С детства мечтаю создать какую-нибудь игру. В свое время уже пробовал сделать, но это не в счет, т.к. планы были грандиозны, а я один... и было это ~6 лет назад, и знал я мало. Хотел сделать стратегию на подобии Front Mission 3. [...]]]></description>
			<content:encoded><![CDATA[<p>Простая игра, на подобии комбатс.ру с первым пришедшим на ум названием "Маги 2.0" <img src='http://byromul.ru/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
С детства мечтаю создать какую-нибудь игру. В свое время уже пробовал сделать, но это не в счет, т.к. планы были грандиозны, а я один... и было это ~6 лет назад, и знал я мало. Хотел сделать стратегию на подобии Front Mission 3. Т.к. опыт программирования был почти ни какой, осилил за месяц сделать обсчет выстрелов из нескольких видов оружия и на этом успокоился <img src='http://byromul.ru/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />
Тем временем, прогресс нас забросил на просторы интернета, а вместе с тем и онлайн игр. По этому моя первая игра будет онлайн. Ни сколько не претендую на интересность самой задумки игры (она банальна и стара) и на гениальность реализации. Просто хочется создать <em>свою</em> маленькую игру. Реализация будет без красивого дизайна - самое главное функционал. Пока начну с мини ТЗ. По мере желания, времени и остальных факторов буду разрабатывать само приложение и описывать в рубрике "Игры".</p>
<p><span id="more-310"></span></p>
<p>Понятия:</p>
<p>Персонаж - генерируемый мифический герой со случайным именем<br />
Игрок - зашедший пользователь, создавший персонажа<br />
HP - очки здоровья<br />
Магия - один из вариантов магии: огонь, вода, воздух, земля<br />
Взаимодействие магий - результат взаимодействия магий, т.е. та из пары, которая выигрывает. Слева направо: земля-огонь-вода-воздух-земля<br />
Атака - выбранный тип атакующей магии<br />
Защита - два выбранных типа защитных магий<br />
Шаг - выбранные варианты зашиты и атак каждого из пары игроков<br />
Битва - пара игроков, которые сражаются между собой, пока у одного или обоих не закончится HP<br />
История битвы - последовательность шагов конкретной битвы<br />
Истрия битв - история хранящая победы и поражения играков<br />
Топ 10 - первых 10 игроков, которые одержали наибольшее число побед в порядке убывания</p>
<p>Сущности:</p>
<p>Игрок, Битва, Шаг, Магия</p>
<p>Возможности:</p>
<p>1. Регистрация / авторизация игрока.<br />
Заход посетителя на сайт - нажатие кнопки "получить игрока" - ввод email - генерация игрока - присвоение ID сессии (авторизация)<br />
2. Просмотр игроков ожидающих битвы<br />
3. Битва. Каждый шаг содержит обязательные два дейтсвия:<br />
- выбор 1-ой атаки<br />
- выбор 2-ух уникальных защит<br />
4. Профиль. Просмотр имени игрока, кол-во проведенных боев, сколько побед/поражений<br />
5. Просмотр топ 10 игроков</p>
<p>Используемые технологии: php, mysql и немного javascript... + пара капель терпения, 2 миллиметра мозга и 10 причин это сделать, которые я еще не придумал</p>
<p><em>The end of the first iteration</em></p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/02/24/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%be%d0%bd%d0%bb%d0%b0%d0%b9%d0%bd-%d0%b8%d0%b3%d1%80%d1%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Юзабилити. Ссылка скачать</title>
		<link>http://byromul.ru/2010/02/16/%d1%81%d0%ba%d0%b0%d1%87%d0%b0%d1%82%d1%8c/</link>
		<comments>http://byromul.ru/2010/02/16/%d1%81%d0%ba%d0%b0%d1%87%d0%b0%d1%82%d1%8c/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 20:41:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[скачать]]></category>
		<category><![CDATA[юзабилити]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=253</guid>
		<description><![CDATA[Всем знакома ситуация, когда для скачивания что-либо с сайта, требуется регистрация. Обычно, прям тут же, или что хуже, где-то еще, есть ссылка на регистрацию. Мы проходим нудную процедуру заполнения формы. Очень часто переходим по ссылке с почты обратно на сайт, подтверждая существования своей почты. Далее вспоминаем, что хотели скачать... ура, скачали! Для начала хочется отсечь [...]]]></description>
			<content:encoded><![CDATA[<p>Всем знакома ситуация, когда для скачивания что-либо с сайта, требуется регистрация. Обычно, прям тут же, или что хуже, где-то еще, есть ссылка на регистрацию. Мы проходим нудную процедуру заполнения формы. Очень часто переходим по ссылке с почты обратно на сайт, подтверждая существования своей почты. Далее вспоминаем, что хотели скачать... ура, скачали!</p>
<p><span id="more-253"></span></p>
<p>Для начала хочется отсечь большинство возражений о целесообразности регистрации для скачивания.</p>
<ul>
<li><em>Это все "левые" люди</em> - даже эти "левые", получив интересную, !тематическую рассылку, с большой долей вероятности вернуться на сайт.</li>
<li><em>Зачем мучить пользователя?</em> - прежде всего, регистрация нужна самому пользователю. Иначе как подстроиться под его индивидуальность? Как организовать связь его с функционалом ресурса? Как другие участники сайта идентифицируют друг друга? Как анализировать активность (потребности) посетителей? и т.д.</li>
</ul>
<p>Убедившись в необходимости регистрации (как минимум для сервисных и информационных ресурсов) перейдем к самому интересному.</p>
<p>Идея улучшения юзабилити регистрации при скачивании состоит в частичном скрытии регистрации.</p>
<p>1. Пользователь видит ссылку "скачать" - нажимает<br />
2. Всплывает окошко, с приветствием и простейшей формой:<br />
<code><br />
Привет!<br />
Ты хочешь скачать файл "лучшие обои 2009 года".<br />
Укажи свой email, что бы мы могли отправить ссылку для скачивания<br />
С радостью, Обои.ру<br />
</code><br />
3. Пользователь вводит email (желательно регистрацию пользователя ограничить одним email-ом, но возможно потребуется еще login, а для безопасности капча) и нажимает "отправить"<br />
4. На почту отправляется позитивное письмо с ссылкой, а на стороне сайта фиксируется: user_key, страница с которой отправлено письмо, email, что хотел скачать. Соответственно ссылка пришедшая на почту содержит user_key.<br />
5. После возврата на сайт, по пришедшей ссылке, пользователь автоматически регистрируется с указанным email-ом и автоматически авторизуется.<br />
6. На почту уходит второе письмо, в котором содержатся данные необходимые для авторизация (email:password) и, что важно, описание самого сайта, с перечислением все плюшек... вобщем, замануха.<br />
7. Далее, для удобства, можно javascript-ом автоматически инициализировать скачку или же как-то особо выделить саму ссылку "скачать"</p>
<p>Большинство пользователей будет довольно. Все что требуется для скачивания, это ввести email и перейти по ссылке из почты.<br />
А мы получаем +1 аккаунт с "живым" email-ом <img src='http://byromul.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/02/16/%d1%81%d0%ba%d0%b0%d1%87%d0%b0%d1%82%d1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL. Извращение над группировкой</title>
		<link>http://byromul.ru/2010/02/11/sql-%d0%b3%d1%80%d0%b0%d1%83%d0%bf%d0%bf%d0%b8%d1%80%d0%be%d0%b2%d0%ba/</link>
		<comments>http://byromul.ru/2010/02/11/sql-%d0%b3%d1%80%d0%b0%d1%83%d0%bf%d0%bf%d0%b8%d1%80%d0%be%d0%b2%d0%ba/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 20:39:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[оптимизация]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=244</guid>
		<description><![CDATA[Требуется получить последние темы для каждого рубрики форума. На ум сразу приходит запрос вида: Вариант 1. SELECT id AS rubric_id, ( SELECT id FROM `forum_topic` WHERE rubric_id = `forum_rubric`.id ORDER BY updated DESC LIMIT 1 ) AS last_topic_id FROM `forum_rubric` ; Структуры таблиц. CREATE TABLE `forum_rubric` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID [...]]]></description>
			<content:encoded><![CDATA[<p>Требуется получить последние темы для каждого рубрики форума. На ум сразу приходит запрос вида:</p>
<p><strong>Вариант 1</strong>.<br />
<code><br />
SELECT id AS rubric_id, (<br />
   SELECT id<br />
   FROM `forum_topic`<br />
   WHERE rubric_id = `forum_rubric`.id<br />
   ORDER BY updated DESC<br />
   LIMIT 1<br />
) AS last_topic_id<br />
FROM `forum_rubric` ;<br />
</code></p>
<p><strong>Структуры таблиц</strong>.<br />
<code><br />
CREATE TABLE `forum_rubric` (<br />
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID рубрики форума',<br />
  `status_id` tinyint(3) unsigned NOT NULL COMMENT 'ID статуса',<br />
  `name` varchar(255) DEFAULT NULL COMMENT 'Название',<br />
  PRIMARY KEY (`id`)<br />
) ;<br />
</code><code><br />
CREATE TABLE `forum_topic` (<br />
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID темы',<br />
  `status_id` tinyint(3) unsigned NOT NULL COMMENT 'ID статуса',<br />
  `rubric_id` int(10) unsigned NOT NULL COMMENT 'ID рубрики',<br />
  `title` varchar(255) NOT NULL COMMENT 'Заголовок',<br />
  `added` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Создан',<br />
  `updated` timestamp NULL COMMENT 'Обновлен',<br />
  PRIMARY KEY (`id`),<br />
  KEY `rubric_id` (`rubric_id`,`updated`),<br />
) ;<br />
</code></p>
<p>А вот как можно извратиться и сделать одним запросом:</p>
<p><span id="more-244"></span></p>
<p><strong>Вариант 2</strong>.<br />
<code><br />
SELECT rubric_id, SUBSTRING_INDEX( GROUP_CONCAT( id ORDER BY updated DESC ) , ',', 1 ) AS last_topic_id<br />
FROM `forum_topic`<br />
GROUP BY rubric_id ;<br />
</code></p>
<p>1. группируем по рубрики<br />
2. собираем ID в строку, сортируя в обратном порядке по дате<br />
3. обрезаем до первой запятой</p>
<p>Результате на данных:<br />
- 50 рубрик<br />
- 100.000 тем</p>
<p>Вариант 1:<br />
1.0464 сек, обход ~10.000 записий<br />
Вариант 2:<br />
0.0629 сек, обход всех 100.000 записей</p>
<p>Если в запросе участвует WHERE,<br />
добавим к примеру <code>status_id = 3</code></p>
<p><strong>Вариант 3</strong>.<br />
<code><br />
SELECT id AS rubric_id, (<br />
   SELECT id<br />
   FROM `forum_topic`<br />
   WHERE rubric_id = `forum_rubric`.id AND status_id = 3<br />
   ORDER BY updated DESC<br />
   LIMIT 1<br />
) AS last_topic_id<br />
FROM `bank_forum_rubric` ;<br />
</code></p>
<p>1.0136 сек, обход ~2.000 записей</p>
<p>если добавить ключ на <code>rubric_id + status_id</code>:<br />
0.2013 сек, обход ~450 записей</p>
<p><strong>Вариант 4</strong>.<br />
<code><br />
SELECT rubric_id, SUBSTRING_INDEX( GROUP_CONCAT( id ORDER BY updated DESC ) , ',', 1 ) AS last_topic_id<br />
FROM `forum_topic`<br />
WHERE status_id = 3<br />
GROUP BY rubric_id ;<br />
</code></p>
<p>0.2059 сек, обход ~20.000 записей</p>
<p><strong>Итог</strong>.</p>
<p>Запросы варианта 2 и 4 не используют ключа, проходят по всем записям, они выполняется быстрее или так же, как с вложенным подзапросом (в случае доп. условий).</p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/02/11/sql-%d0%b3%d1%80%d0%b0%d1%83%d0%bf%d0%bf%d0%b8%d1%80%d0%be%d0%b2%d0%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Три истории из жизни Стива Джобса</title>
		<link>http://byromul.ru/2010/01/28/%d1%81%d1%82%d0%b8%d0%b2-%d0%b4%d0%b6%d0%be%d0%b1%d1%81/</link>
		<comments>http://byromul.ru/2010/01/28/%d1%81%d1%82%d0%b8%d0%b2-%d0%b4%d0%b6%d0%be%d0%b1%d1%81/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:26:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[Стив Джобс]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=189</guid>
		<description><![CDATA[Сегодня читая rss в Google Reader наткнулся на два интересных поста 1. Выступление Стива Джобса перед стэнфордскими выпускниками в 2005 году 2. Плагин для WordPress, с постраничной навигацией. Начну с менее интригующего 2. Постраничная навигация в WordPress – плагин Seo Pager Как видите на моем блоге, это уже совсем не те пресловутые "назад", "вперед"... Как [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня читая rss в Google Reader наткнулся на два интересных поста<br />
1. Выступление Стива Джобса перед стэнфордскими выпускниками в 2005 году<br />
2. Плагин для WordPress, с постраничной навигацией.</p>
<p><span id="more-189"></span></p>
<p>Начну с менее интригующего<br />
2. Постраничная навигация в WordPress – плагин Seo Pager<br />
Как видите на моем блоге, это уже совсем не те пресловутые "назад", "вперед"... Как ни крути, а постраничка рулит<br />
<a href="http://cyber-promo.ru/archives/1261">via</a></p>
<p>2. Заставляющее задумать выступление Стива Джобса.<br />
Хотя видео и 2005 года, но звучащие слова не потеряют актуальны и через тысячелетие.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/SLBsGIP6NTg&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ru_RU&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/SLBsGIP6NTg&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ru_RU&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/GzI6jkY2F0A&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ru_RU&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/GzI6jkY2F0A&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ru_RU&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
<p>Особенно запомнившееся:<br />
- Всегда стоит оценивать ту ситуацию в которой оказался. Кажущиеся на первый взгляд лишения, могут обернуться приобретениями - не стоит их бояться. Главное, уметь найти то, что заполнит освободившееся пространство.<br />
- "Если вы живете каждый день, как будто он последний, когда-нибудь вы окажетесь правы" - респект 1<br />
- "Если сегодняшний день был последним в моей жизни, захотел бы я делать то, что собираюсь делать сегодня? И как только ответом было "нет" на протяжении нескольких дней подряд, я понимал, что надо что-то менять" - респект 2<br />
- и про голод... другими словами, что бы жизнь не пресытилась.</p>
<p><a href="http://cyber-promo.ru/archives/1239">via</a></p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2010/01/28/%d1%81%d1%82%d0%b8%d0%b2-%d0%b4%d0%b6%d0%be%d0%b1%d1%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unix. Количество файлов в директории</title>
		<link>http://byromul.ru/2009/12/30/unix-%d0%ba%d0%be%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2-%d0%b2-%d0%b4%d0%b8%d1%80%d0%b5%d0%ba%d1%82%d0%be%d1%80%d0%b8%d0%b8/</link>
		<comments>http://byromul.ru/2009/12/30/unix-%d0%ba%d0%be%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2-%d0%b2-%d0%b4%d0%b8%d1%80%d0%b5%d0%ba%d1%82%d0%be%d1%80%d0%b8%d0%b8/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 16:44:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[*nix]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=6</guid>
		<description><![CDATA[Столкнулся с проблемой подсчета количества файлов в директории в ОС unix, а именно freebsd. Специальной утилиты для этого не нашел, пришлось извращаться. Решается задача при помощи двух стандартных утилит find и wc find . -type f выводит все найденные файлы в текущий директории wc -l выводит количество строк соединяем: find . -type f &#124; wc [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с проблемой подсчета количества файлов в директории в ОС unix, а именно freebsd. Специальной утилиты для этого не нашел, пришлось извращаться.<br />
Решается задача при помощи двух стандартных утилит find и wc</p>
<p><code>find . -type f</code></p>
<p>выводит все найденные файлы в текущий директории</p>
<p><code>wc -l</code></p>
<p>выводит количество строк<br />
соединяем:</p>
<p><code>find . -type f | wc -l</code></p>
<p>получаем к примеру такой результат:</p>
<p><code>%find . -type f | wc -l<br />
1997</code></p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2009/12/30/unix-%d0%ba%d0%be%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2-%d0%b2-%d0%b4%d0%b8%d1%80%d0%b5%d0%ba%d1%82%d0%be%d1%80%d0%b8%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx – логические операторы &#171;И&#187;, &#171;ИЛИ&#187;</title>
		<link>http://byromul.ru/2009/12/30/nginx-%e2%80%93-%d0%bb%d0%be%d0%b3%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d1%8b-%d0%b8-%d0%b8%d0%bb%d0%b8/</link>
		<comments>http://byromul.ru/2009/12/30/nginx-%e2%80%93-%d0%bb%d0%be%d0%b3%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d1%8b-%d0%b8-%d0%b8%d0%bb%d0%b8/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 16:43:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://byromul.ru/?p=4</guid>
		<description><![CDATA[Как написать location в nginx, который срабатывает, если два условия должны выполняться. Логично было бы написать так: if ($http_user_agent ~* "Opera" AND $http_referer ~* "yandex.ru") { bla bla bla } nginx не предусматривает в условиях логические операторы Решение есть в виде хака: set $a ""; if ($http_user_agent ~* "Opera" ) { set $a 1; } [...]]]></description>
			<content:encoded><![CDATA[<p>Как написать location в nginx, который срабатывает, если два условия должны выполняться. Логично было бы написать так:</p>
<p><code>if ($http_user_agent ~* "Opera" AND $http_referer ~* "yandex.ru") {<br />
    bla bla bla<br />
}</code></p>
<p>nginx не предусматривает в условиях логические операторы<br />
Решение есть в виде хака:</p>
<p><code>set $a "";<br />
if ($http_user_agent ~* "Opera" ) {<br />
    set $a 1;<br />
}<br />
if ($http_referer ~* "yandex.ru") {<br />
    set $a 1$a;<br />
}<br />
if ($a = 11) {<br />
    bla bla bla<br />
}</code></p>
<p>Идея очень проста, создается переменная, в которую по мере срабатывания условий накапливается строка. Далее срабатывает какое-либо условие с учетом этой строки.</p>
<p>Может man читал не внимательно и кто-то подскажет более красивое решение этой проблемы?</p>
]]></content:encoded>
			<wfw:commentRss>http://byromul.ru/2009/12/30/nginx-%e2%80%93-%d0%bb%d0%be%d0%b3%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d1%8b-%d0%b8-%d0%b8%d0%bb%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

