<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Антон Шевчук</title>
	
	<link>http://anton.shevchuk.name</link>
	<description>Web-разработчик</description>
	<lastBuildDate>Tue, 22 May 2012 17:25:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AntonShevchuk" /><feedburner:info uri="antonshevchuk" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Tech News</media:category><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FAntonShevchuk" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FAntonShevchuk" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FAntonShevchuk" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FAntonShevchuk" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Встреча ThinkPHP в Харькове</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/Pw9g4MDHUuo/</link>
		<comments>http://anton.shevchuk.name/php/meetup-thinkphp-in-kharkov/#comments</comments>
		<pubDate>Tue, 22 May 2012 14:06:14 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[announcement]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=2168</guid>
		<description><![CDATA[30-го мая сего года на 19:00 запланирована встреча PHP разработчиков в 1-м конференц-зале бизнес-центра &#171;SUN CITY 2&#187; (это тот, что в 5-ти минутах от метро Московский проспект). Формат мероприятия довольно стихийный (кстати, как и его организация), но 2 технических доклада там будут. Кроме того попробуем обсудить перспективы сообщества. Стратегически &#8212; есть желание организовать реально действующее [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2012/05/cloud.png" alt="" title="Think PHP" width="575" height="171" class="aligncenter size-full wp-image-2169" /></p>
<p>30-го мая сего года на 19:00 запланирована встреча PHP разработчиков в 1-м конференц-зале бизнес-центра &laquo;SUN CITY 2&raquo; (это тот, что в 5-ти минутах от метро Московский проспект). </p>
<p>Формат мероприятия довольно стихийный (кстати, как и его организация), но 2 технических доклада там будут. Кроме того попробуем обсудить перспективы сообщества.<br />
<span id="more-2168"></span></p>
<p>Стратегически &mdash; есть желание организовать реально действующее PHP-сообщество города Харькова. И это мероприятие &#8211; первый кирпичик в основание этого сообщества. </p>
<p>Очень хочется устраивать подобные встречи регулярно, по поводу и без такового, в разных местах и в разное время. Потому что главное не место и время, главное — <del>печеньки</del> люди, которые живут с мыслью о РНР.</p>
<p>Регистрация свободная, прошу &mdash; <a href="http://thinkphp.com.ua/">http://thinkphp.com.ua/</a></p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/php/zend-framework-day/" title="Zend Framework Day">Zend Framework Day</a></li><li><a href="http://anton.shevchuk.name/html-and-css/master-klass-yuriy-akella-artyukh/" title="Мастер-класс Юры Артюха">Мастер-класс Юры Артюха</a></li><li><a href="http://anton.shevchuk.name/internet/sphinx-master-class/" title="Мастер-класс по Sphinx">Мастер-класс по Sphinx</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-2011-piter/" title="Конференция ZFConf 2011">Конференция ZFConf 2011</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-ukraine/" title="ZFConf Ukraine">ZFConf Ukraine</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class-feedback/" title="Анонс мастер-классов по JavaScript&#8217;у">Анонс мастер-классов по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class/" title="Мастер-классы по JavaScript&#8217;у">Мастер-классы по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/internet/pdfeed-rss-to-pdf-generator/" title="PDFEED &#8211; или RSS2PDF в новом обличье">PDFEED &#8211; или RSS2PDF в новом обличье</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Pw9g4MDHUuo:0Owv242knKQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=Pw9g4MDHUuo:0Owv242knKQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Pw9g4MDHUuo:0Owv242knKQ:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/Pw9g4MDHUuo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/meetup-thinkphp-in-kharkov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/meetup-thinkphp-in-kharkov/</feedburner:origLink></item>
		<item>
		<title>Задачка для разработчика</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/r71Ss_C-_AE/</link>
		<comments>http://anton.shevchuk.name/company/task-for-developer/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 10:20:42 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[Company]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=2139</guid>
		<description><![CDATA[Возвращаясь к теме задачек для ума, решим-ка еще одну, она достаточно простая, но имеет как минимум два три решения. Необходимо провести реверс-инжениринг простой функции, мы знаем, что функция возвращает true либо false в зависимости от единственного входного параметра. Мы провели ряд тестов, и теперь знаем, что данная функция возвращает true для следующего набора данных: И [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/09/question.png" alt="" title="Question" width="320" height="320" class="aligncenter size-full wp-image-1502" /><br />
Возвращаясь к теме задачек для ума, решим-ка еще одну, она достаточно простая, но имеет как минимум <del>два</del> три решения.</p>
<p><span id="more-2139"></span><br />
Необходимо провести реверс-инжениринг простой функции, мы знаем, что функция возвращает <code>true</code> либо <code>false</code> в зависимости от единственного входного параметра.</p>
<p>Мы провели ряд тестов, и теперь знаем, что данная функция возвращает <code>true</code> для следующего набора данных: </p>
<pre class="brush: plain; title: ; notranslate">
09 june
14 JULY
6 march
09 may
</pre>
<p>И <code>false</code> для следующего:</p>
<pre class="brush: plain; title: ; notranslate">
8 september
1 April
2 january
</pre>
<p>Подумайте, что должно быть внутри такой функции? Вот вам заготовка для такой функции:</p>
<pre class="brush: php; title: ; notranslate">
/**
 * @return boolean
 */
function checkDay ($day) {
    /* проверка должны быть тут */
}
</pre>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=r71Ss_C-_AE:UJyxlL3Du1s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=r71Ss_C-_AE:UJyxlL3Du1s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=r71Ss_C-_AE:UJyxlL3Du1s:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/r71Ss_C-_AE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/company/task-for-developer/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/company/task-for-developer/</feedburner:origLink></item>
		<item>
		<title>Usability кода</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/3wE7UZZMV6Q/</link>
		<comments>http://anton.shevchuk.name/php/usability-of-source-code/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 09:37:21 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=2061</guid>
		<description><![CDATA[Первый раз когда я заговорил о юзабилити кода на меня посмотрели косо, когда же я начал объяснять, то встретил понимание у коллег по цеху. Теперь попробую и вам донести до чего я тут дошел с жизнью такой. &#171;Usability кода&#187; звучит хорошо, название притягивает, еще мне нравится &#171;эргономика кода&#187;, тоже отлично Ну что же, в понятие [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2012/02/face_on_keyboard-460x258.jpg" alt="" title="Face On Keyboard" width="460" height="258" class="aligncenter size-medium wp-image-2067" /></p>
<p>Первый раз когда я заговорил о юзабилити кода на меня посмотрели косо, когда же я начал объяснять, то встретил понимание у коллег по цеху. Теперь попробую и вам донести до чего я тут дошел с жизнью такой.<br />
<span id="more-2061"></span></p>
<blockquote><p>&laquo;Usability кода&raquo; звучит хорошо, название притягивает, еще мне нравится &laquo;эргономика кода&raquo;, тоже отлично</p></blockquote>
<p>Ну что же, в понятие юзабилити кода я вкладываю несколько вещей:</p>
<ul>
<li>Соблюдение стандартов кодирования</li>
<li>Отсутствие избыточности в коде и комментариях</li>
<li>Предсказуемость кода</li>
<li>Поддержка читаемости кода на уровне &laquo;понятно и чайнику&raquo;</li>
<li>Время необходимое для изучение кода до уровня &laquo;понимаю где баг глядя на скриншот&raquo;</li>
<li>Скорость разработки при повторном использовании кода и соблюдении принятых норм и стандартов</li>
</ul>
<p>Думаю, стоит по чуть-чуть остановиться на каждом.</p>
<h3>Стандарты кодирования</h3>
<p>Тут обсуждать нечего, ты либо их соблюдаешь (хотя бы свои, но лучше принятые в своей среде), либо ты тут временно, и никому не будешь нужен.</p>
<h3>Избыточность кода</h3>
<p>Иногда, гоняясь за красотой ООП мы приходим к очень громоздким решениям:</p>
<pre class="brush: php; title: ; notranslate">
$file = Application::getInstance()-&gt;getRequest()-&gt;getFiles()-&gt;get($filename);
</pre>
<p>По сути &mdash; думаю каждому понятно что делает данная строчка кода, но почему же не заменить ее на простую функцию? Чего боитесь?</p>
<pre class="brush: php; title: ; notranslate">
$file = getRequestFile($filename);
// процедурное программирование отстой, бла-бла-бла
$file = Request::getFile($filename);
// выучи еще патерны
// ...
</pre>
<h3>Баланс на грани</h3>
<p>Бытует мнение, что комментировать хорошо читаемый код не стоит, и так всем всё понятно, но мне в это слабо верится, так что я тут несколько тезисов написал:</p>
<ul>
<li>Отсутствие комментариев в коде &mdash; плохо</li>
<li>Правильное именование переменных в коде &mdash; хорошо</li>
<li>Много комментариев с прогнозом погоды &mdash; плохо</li>
</ul>
<p>Что же хорошо? Вот тут вроде бы баланс удалось соблюсти:</p>
<pre class="brush: php; title: ; notranslate">
/**
 * Check-in user location to DB
 *
 * &lt;code&gt;Location::checkinUser($User, 2.123654, 0.456321)&lt;/code&gt;
 *
 * @param User $User
 * @param float $lat latitude
 * @param float $long longitude
 * @return bool
 */
function checkinUser(User $User, $lat, $long) {
    return Db::insert(&quot;checkin&quot;, array(
        'userId' =&gt; $User-&gt;id,
        'lat' =&gt; $lat,
        'long' =&gt; $long
    ));
}
</pre>
<p>В данном примере постарался уместить все, что нужно: однозначные имена методов и переменных, минимум комментариев, которых хватает для создания документации по проекту, да подсказок в IDE (что немаловажно!).</p>
<h3>Быть провидцем</h3>
<p>Если вам приходится работать с незнакомым кодом и мысли &laquo;я бы на месте предыдущего разработчика сделал это так-то&raquo; совпадают с реальность &mdash; поздравляю, у вас совместимость с предыдущим автором, и вы сможете легко работать с текущим кодом. Так что пишите код &laquo;предсказуемо&raquo;, и это не только соблюдение правил использования глаголов в именах методов, но и простая, читаемая структуру кода.</p>
<h3>Читаемость кода</h3>
<p>Чего хочу я от читаемого кода? Это чтобы любой разработчик &laquo;со словариком&raquo; мог прочитать любой участок вашего кода. Я могу не знать JAVA, Python, или еще с десяток языков, но у меня есть знание о PHP и JavaScript, я и должен взяв на вооружение что-то типа &laquo;RoR для чайников&raquo; в качестве словарика и начать работать в проекте спустя день (ну уж лучше &laquo;<a href="http://railsforphp.com/" title="Rails for PHP Developers">Rails for PHP Developers</a>&raquo;, но это придирки).</p>
<p>Не должно быть магии по шпаргалкам &mdash; &laquo;достать объект не знаю где, вызвать метод не знаю как&raquo;:</p>
<pre class="brush: php; title: ; notranslate">
// привет ZF
public function errorAction()
{
    // магия тут
    $errors = $this-&gt;_getParam('error_handler');

    // а тут правдоподобно
    $this-&gt;getResponse()-&gt;setHttpResponseCode(404);

    // ни шатко, ни валко, но все в курсе
    $this-&gt;view-&gt;message = 'Page not found';
}
</pre>
<p>В идеале, читаемость кода должна быть на уровне псевдокода.</p>
<p>Еще есть такая болезнь &mdash; когда из шаблонов проектирования знаешь лишь singleton, конечно же это плохо, но вот юзабельность кода, если оный применять с умом, очень даже ничего:</p>
<pre class="brush: php; title: ; notranslate">
// тут без комментариев понятно что происходит
$id = Application::getRequest()-&gt;getParam('id');
// и тут
$User = UserManager::getById($id);
</pre>
<h3>Где баг?</h3>
<p>MVC очень правильный патерн для web приложения, он удобен и всё такое прочее &mdash; имхо, вполне юзабельный. Но вот беда, в большом приложении контроллеров много, и по этой причине появилась тенденция объединять их в модули (что вполне логично), а сами контроллеры бить на экшены (что возможно избыточно). Таким образом контроллер стал составным, и знаком нам по многим фреймворкам &mdash; модуль/контроллер/экшен. Всё хорошо, и URL к такому контроллеру выглядит адекватно и читается легко, но пришли требования, и нам приходится писать правила-роуты, и теперь URL запрошенной страницы стал совсем неоднозначным для нас. Следовательно надо просмотреть все эти роуты, которые, возможно, расфасованы по модулям, иль еще куда, да елки ж палки&#8230;</p>
<p>К чему я тут это всё рассказываю? Да к тому, что чем больше действий мне надо выполнить для локализации ошибки в приложении, тем меньше мне такой код нравится. Вижу баг, знаю до файла и даже строчки где искать &mdash; отличный результат.</p>
<h3>Время &mdash; деньги</h3>
<p>Время потраченное непосредственно на сам кодинг оценивают в 30%, но это при проектировании &laquo;до запятой&raquo;, но как-то усидчивости у нас не хватает, не наш метод. По этой причине стоит писать удобный код:</p>
<pre class="brush: php; title: ; notranslate">
// можем же, мляяяять
$bootstrap = $application-&gt;getBootstrap();
$bootstrap-&gt;bootstrap('db');
$dbAdapter = $bootstrap-&gt;getResource('db');
$dbAdapter-&gt;getConnection()-&gt;exec($dataSql);

// но как-то сподручнее
$application-&gt;getDb()-&gt;exec($dataSql);
</pre>
<p>Если расширение функционала приводит к копи-пасту &mdash; WTF man?</p>
<h3>Вместо выводов</h3>
<p>Если бы разработчики фреймворков думали не о красоте ООП, а о эргономике кода, то таких популярных и удобных фреймворков как jQuery было бы больше :)</p>
<p><strong>P.S.</strong> В обязательном порядке, продумать юзабилити кода необходимо всем, кто собирается разрабатывать иль модифицировать очередной фреймворк, ведь удобный инструмент всегда найдет своего мастера.</p>
<p><strong>P.P.S.</strong> По теме нашел лишь одну статью &mdash; <a href="http://totalusability.posterous.com/introducing-code-usability" title="Introducing Code Usability">Introducing Code Usability</a>, возможно кто подскажет еще?</p>
<p><strong>P.P.P.S.</strong> Поругал ZF, похвалил jQuery &mdash; OK</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3wE7UZZMV6Q:MmMOaYHiNNw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=3wE7UZZMV6Q:MmMOaYHiNNw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3wE7UZZMV6Q:MmMOaYHiNNw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/3wE7UZZMV6Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/usability-of-source-code/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/usability-of-source-code/</feedburner:origLink></item>
		<item>
		<title>“Highload” оптимизация для самых маленьких</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/8L_kzvy8aKY/</link>
		<comments>http://anton.shevchuk.name/php/highload-optimization-for-children/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 09:53:08 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=2047</guid>
		<description><![CDATA[Это скорее не статья, а так заметка, на которую следует ссылаться, если кто-то не думает о том что в проекте может быть записей больше, нежели в тестовой базе данных, а скорость интернета меньше нежели доступ по локальной сети в 100мбит. Исходя из моего опыта разработки (да и не только моего), зачастую, &#171;бутылочным горлышком&#187; вашего приложения [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2012/02/captain-obvious.jpg" alt="" title="Captain Obvious" width="333" height="450" class="aligncenter size-full wp-image-2048" /></p>
<p>Это скорее не статья, а так заметка, на которую следует ссылаться, если кто-то не думает о том что в проекте может быть записей больше, нежели в тестовой базе данных, а скорость интернета меньше нежели доступ по локальной сети в 100мбит.<br />
<span id="more-2047"></span></p>
<p>Исходя из моего опыта разработки (да и не только моего), зачастую, &laquo;бутылочным горлышком&raquo; вашего приложения является база данных, таким образом перво-наперво включаем <a href="https://www.google.com/search?q=slow+query+log">slow query log</a> (&larr; это ссылка на гугло-поиск) и смотрим какой запрос у нас самый медленный, и думаем что с ним делать, если не можем вкурить проблему &mdash; зовём старших, пусть тоже повтыкают в <a href="http://dev.mysql.com/doc/refman/5.6/en/explain.html">EXPLAIN</a> (&larr; ссылка на документацию &rarr; на <a href="http://habrahabr.ru/blogs/mysql/31129/">хабр</a>)  вашего чудо-запроса.</p>
<p>Но, опять же ссылаясь к моему опыту, большинство проблем с БД решают правильные <a href="http://xpoint.ru/know-how/MySQL/Optimizatsiya/Indeksyi">индексы</a>. Легко запомнить, что индексировать следует внешние ключи, и всё что у вас в WHERE, ORDER BY, GROUP BY (список не полон, для начала &#8211; самое оно). </p>
<p>Не следует пихать много индексов в таблицу которая часто обновляется, иначе накладные расходы на обновление индекса будут перекрывать ваш профит от оных в разы. Советую внимательно почитать <a href="http://www.mysql.ru/docs/man/MySQL_Optimisation.html">об оптимизации в MySQL</a>.</p>
<p>Поиск с использованием LIKE это плохо. Полнотекстовый с MyISAM уже лучше. Внешний аля <a href="http://sphinxsearch.com/">Sphinx</a> &mdash; рулит и бибикает для MySQL и PostgreSQL, инфа достоверная 100%.</p>
<p>Но это полбеды, проблем в БД может подкинуть и само приложение &mdash; обращение к БД в цикле/рекурсии или еще каким извращенным способом могут привносить удивительные поправки в результаты нагрузочного тестирования. Сделайте простой профайлер ваших запрос и проследите на каких страницах количество запросов начинает зашкаливать (особенно это касается типа-ORM и почти-Active Record, когда один объект = один запрос, или даже не один). Всем кто уповает на магию фреймворков, иль каких-нить gem-ов &mdash; не надейтесь, всё о чём я написал в равной степени относится к большинству языков web-программирования, г..код есть везде, он вездесущ.</p>
<p>Ну, а теперь о главном, нет о главной странице в 1,5 метра &mdash; дождется ли её загрузки пользователь со скоростью доступа в 256кбит? Клиентская оптимизация должна проводиться в обязательном порядке: <a href="https://addons.mozilla.org/en-US/firefox/addon/yslow/">YSlow</a> да <a href="http://code.google.com/speed/page-speed/">Page Speed</a> вам в зубы. Да если погуглить, то даже небольшая правка htaccess для apache улучшит ситуацию:</p>
<pre class="brush: bash; title: ; notranslate">
# Enable ETag
FileETag MTime Size

# Enable Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript

&lt;ifModule mod_expires.c&gt;
  ExpiresActive On
  ExpiresDefault &quot;access plus 1 seconds&quot;
  ExpiresByType text/html &quot;access plus 1 seconds&quot;
  ExpiresByType image/x-icon &quot;access plus 2592000 seconds&quot;
  ExpiresByType image/gif &quot;access plus 2592000 seconds&quot;
  ExpiresByType image/jpeg &quot;access plus 2592000 seconds&quot;
  ExpiresByType image/png &quot;access plus 2592000 seconds&quot;
  ExpiresByType text/css &quot;access plus 604800 seconds&quot;
  ExpiresByType text/javascript &quot;access plus 216000 seconds&quot;
  ExpiresByType application/x-javascript &quot;access plus 216000 seconds&quot;
&lt;/ifModule&gt;
</pre>
<p>Пожмите <a href="http://closure-compiler.appspot.com/home">JavaScript</a> и <a href="http://tools.w3clubs.com/cssmin/">CSS</a>, да переключите jQuery на <a href="http://code.google.com/apis/libraries/devguide.html">Google CDN</a>. И я это уже постил, между прочим&#8230;</p>
<p>С уважением, ваш КО</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8L_kzvy8aKY:uP6BR87R55E:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=8L_kzvy8aKY:uP6BR87R55E:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8L_kzvy8aKY:uP6BR87R55E:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/8L_kzvy8aKY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/highload-optimization-for-children/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/highload-optimization-for-children/</feedburner:origLink></item>
		<item>
		<title>Определяем количество онлайн пользователей из Google Analytics</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/ljshCEb9Rr0/</link>
		<comments>http://anton.shevchuk.name/google/check-online-users-from-google-analytics/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 12:54:21 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=2029</guid>
		<description><![CDATA[Очень часто при обсуждении нагрузки на сайт упоминаются мистические &#171;онлайн-пользователи&#187;, кто это и как их считать? Я не буду вдаваться в детали, особенно коли в оных не силен, но термин &#171;онлайн-пользователи&#187; зачастую используют для измерения производительности системы которая, по идее, должна что-то говорить заказчику о потенциальных возможностях расширения системы. Для начала, стоит определиться со средним [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/02/tips_and_tricks.png" alt="" title="Заметки на полях" width="200" height="200" class="aligncenter size-full wp-image-1164" /></p>
<p>Очень часто при обсуждении нагрузки на сайт упоминаются мистические &laquo;онлайн-пользователи&raquo;, кто это и как их считать?</p>
<p><span id="more-2029"></span></p>
<p>Я не буду вдаваться в детали, особенно коли в оных не силен, но термин &laquo;онлайн-пользователи&raquo; зачастую используют для измерения производительности системы которая, по идее, должна что-то говорить заказчику о потенциальных возможностях расширения системы. Для начала, стоит определиться со средним пользователем системы, для этого нам потребуется залезть в Google Analytics и взять пару параметров:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2012/02/average-user.png" alt="" title="Средне статистический" width="578" height="321" class="aligncenter size-full wp-image-2031" /></p>
<p>Таким образом, среднестатистический посетитель моего блога просматривает две страницы за две минуты, т.е. 1 обращение в минуту эмулирует одного пользователя. Идём дальше &mdash; очередь за контентом. Выбираем самый популярный &mdash; &laquo;Content&raquo; &rarr; &laquo;Site Content&raquo; &rarr; &laquo;Pages&raquo; &mdash; и чем больше охват тем лучше:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2012/02/top-10-content.png" alt="" title="Top 10 Pages" width="559" height="453" class="aligncenter size-full wp-image-2035" /></p>
<p>Таким образом 10 страниц охватывает 60% посещений, лучше этот показатель довести до разумного максимума используя минимумом страниц &mdash; это будет наш список подопытных.</p>
<p>Ну на этом всё &mdash; мы теперь готовы настроить тестовое окружения для получения правдивых цифр, но что у нас сейчас?</p>
<p>Определить текущую нагрузку на сайт в данной единице измерения можно используя пункт &laquo;Audience&raquo; &rarr; &laquo;Overview&raquo; (кликаем и смотрим):</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2012/02/visitors-per-hour.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2012/02/visitors-per-hour-460x153.png" alt="" title="Visitors per hour" width="460" height="153" class="aligncenter size-medium wp-image-2037" /></a></p>
<p>Таким образом &laquo;онлайн&raquo; у меня составляет:</p>
<pre class="brush: xml; title: ; notranslate">
    пользователей в час              ~200
  -------------------------     =  ---------  =   6,66
 60 минут / время пребывания        60 / ~2
</pre>
<p>Предположим, что проведя нагрузочное тестирование, и получив точку отказа в 100 пользователей я могу сказать, что мой сервер выдержит нагрузку в 15 раз большую нынешней, вот только осталось собрать аудиторию в 45 000 :)</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=ljshCEb9Rr0:qyAnTYJKgJI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=ljshCEb9Rr0:qyAnTYJKgJI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=ljshCEb9Rr0:qyAnTYJKgJI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/ljshCEb9Rr0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/google/check-online-users-from-google-analytics/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/google/check-online-users-from-google-analytics/</feedburner:origLink></item>
		<item>
		<title>Поговорим о PHP</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/B_3bafhc4aM/</link>
		<comments>http://anton.shevchuk.name/php/about-php/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 10:59:50 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1987</guid>
		<description><![CDATA[Хотел было назвать статью &#171;профессиональное PHP программирование&#187;, но по факту &#8212; это лишь &#171;заметки бывалого&#187;, которые будут полезны начинающим разработчикам, хотя, возможно, привлеку внимание и &#171;старшего&#187; поколения ;) Инструментарий Хороший мастер работает лишь со своим инструментом, и сильно расстраивается когда оного нет под рукой, так и я &#8212; всё своё ношу с собой: IDE &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/tools.jpg" alt="" title="tools" width="420" height="351" class="aligncenter size-full wp-image-2006" /><br />
Хотел было назвать статью &laquo;профессиональное PHP программирование&raquo;, но по факту &mdash; это лишь &laquo;заметки бывалого&raquo;, которые будут полезны начинающим разработчикам, хотя, возможно, привлеку внимание и &laquo;старшего&raquo; поколения ;)<br />
<span id="more-1987"></span></p>
<h2>Инструментарий</h2>
<p>Хороший мастер работает лишь со своим инструментом, и сильно расстраивается когда оного нет под рукой, так и я &mdash; всё своё ношу с собой:</p>
<ul>
<li>IDE &mdash; PHP Storm</li>
<li>Менеджер БД &mdash; SQLYog</li>
<li>Всяко-разно &mdash; notepad++, putty, winscp&#8230;</li>
</ul>
<h3>PHP Storm</h3>
<p>IDE решает многие задачи и проблемы, которые постоянно возникают перед разработчиком. Мой выбор остановился на <a href="http://www.jetbrains.com/phpstorm/">PHP Storm</a>, а до того я успел попробовать Zend Studio, Eclipse, Aptana, NetBeans и еще несколько о которых и не вспомню. Что же хорошего в данной IDE:</p>
<ul>
<li>java &mdash; т.е. нам практически любая платформа по плечу</li>
<li>автодополнение &mdash; очень адекватное, и приучает к документированию кода</li>
<li>автосохранение &mdash; забудьте про ctrl+s</li>
<li>автозаливка (FTP/SFTP)</li>
<li>автозаливка после комита</li>
<li>исправление ошибок</li>
<li>поддержка VCS</li>
<li>рефакторинг</li>
<li>поиск и замена по файлам &#8211; работает просто отлично, и частенько меня выручала</li>
<li>отличная поддержка HTML/CSS/JS</li>
<li><a href="http://code.google.com/p/zen-coding/">Zen coding</a> из коробки (советую таки узнать что это ;)</li>
</ul>
<p>Но без недостатков не бывает:</p>
<ul>
<li>java &mdash; т.е. любит память, и IDE приходится время от времени перезапускать &mdash; где-то раз в неделю</li>
<li>цена &mdash; сейчас, со скидкой, это <a href="http://www.jetbrains.com/phpstorm/buy/">$50 (до 27-го ноября)</a></li>
</ul>
<p>Отдельно оговорюсь насчет цены &mdash; у меня купленная версия, но так же есть Open Source лицензия, ее тоже можно получить, но только надо запастись терпением (как можно догадаться &mdash; у меня терпения не хватило). Насчет же NetBeans &mdash; задолбал он своей нестабильной работой и такими же обновлениями.</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/phpstorm.jpg" alt="" title="phpstorm" width="400" height="300" class="aligncenter size-full wp-image-2000" /></p>
<p>В качестве заключения: мои слова ничего не значат, верьте своим глазам &mdash; попробуйте триал, благо целого месяца хватит на распробовать ;)</p>
<p>Кстати, если кому нравится <a href="http://dl.dropbox.com/u/27453635/PHPStorm/screen-php.png">моя</a> <a href="http://dl.dropbox.com/u/27453635/PHPStorm/screen-js.png">тёмная</a> <a href="http://dl.dropbox.com/u/27453635/PHPStorm/screen-php.png">схема</a> для PHP Storm, то её можно забрать с <a href="http://dl.dropbox.com/u/27453635/PHPStorm/config.zip">dropbox&#8217;a</a></p>
<h2>SQLYog</h2>
<p>Для работы с MySQL использую <a href="http://www.webyog.com/en/downloads.php">SQLYog</a>, что же в нём такого хорошего:</p>
<ul>
<li>автодополнение</li>
<li>профайлер</li>
<li>автоформатирование запросов</li>
<li>синхронизация структуры БД и данных при необходимости</li>
<li>SSH туннель &mdash; если у вас есть SSH, то SQLYog в игре</li>
<li>HTTP туннель &mdash; хотя хватит доступа и к FTP</li>
<li>отлично работает под wine (по правде говоря есть огрехи, но совсем мелкие)</li>
</ul>
<p>Ну не без ложки дёгтя:</p>
<ul>
<li>цена &mdash; от <a href="http://www.webyog.com/en/buy.php">$69</a>, но есть триальная и урезанная фришная версия</li>
</ul>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/sqlyog.png" alt="" title="sqlyog" width="113" height="90" class="alignleft size-full wp-image-2001" /></p>
<p>Опять же, есть триал &mdash; пробуйте, и забудьте про phpMyAdmin как про страшный сон.</p>
<h2>Ещё чуть-чуть</h2>
<p>Ой, ну дальше дело вкуса:</p>
<ul>
<li><a href="http://notepad-plus-plus.org/">Notepad++</a> &mdash; всегда на подхвате, открывает большие файлы, понимает все кодировки, с плагином hex-редактор</li>
<li><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a> &mdash; без него никак, (<a href="http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter8.html#pubkey-puttygen">puttygen</a> рулит кстати)</li>
<li><a href="http://www.ghisler.com/">TotalCmd</a> &#8211; файловый менеджер + FTP клиентб недавно вышла 8-ая версия (beta), не купил, жмакаю раз в неделю кнопку с циферкой</li>
<li><a href="http://winscp.net/eng/index.php">WinScp</a> &#8211; SFTP клиент (файловый менеджер over SSH)</li>
</ul>
<p>Да, я работаю на винде, набор инструментов для Linux и Мас отличается лишь набором дополнительных тулзов&#8230;</p>
<h2>Фишки PHP и 5.3 в частности</h2>
<h3>phpDocumentor</h3>
<p>Я уже упоминал о крутом автодополнение в IDE, тук вот, чтобы этого добиться необходимо описывать классы, методы и функции используя doc comment&#8217;ы:</p>
<pre class="brush: php; title: ; notranslate">
/**
 * @property integer $id
 * @property string $login
 * ...
 */
class Row
{

}
</pre>
<p>В результате IDE будет подсказывать нам всё что нужно:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/phpDocumentor-1.png" alt="" title="phpDocumentor" width="348" height="110" class="aligncenter size-full wp-image-1988" /></p>
<p>Еще примерчик:</p>
<pre class="brush: php; title: ; notranslate">
/**
 * @return Users\Row
 */
function getUser()
{
     return Registry::get(&quot;user&quot;);
}

/* @var Users\Row $user */
$user = Registry::get(&quot;user&quot;);
</pre>
<p>В IDE похожий результат:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/phpDocumentor-2.png" alt="" title="phpDocumentor" width="348" height="88" class="aligncenter size-full wp-image-1989" /></p>
<p>Кроме бенефитов для IDE есть еще возможность сгенерировать техническую документацию используя PHPDocumentor:</p>
<pre class="brush: php; title: ; notranslate">
/**
 * &lt;code&gt;
 * $this-&gt;getByLoginOrPasswordAndEmail(
 *      'vasya', md5(123456), 'vasya@mail.ru'
 *  )
 * &lt;/code&gt;
 */
function getByColumnsFinder()
{
    /*...*/
}
</pre>
<p>Обернётся в:<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/phpDocumentor-3.png" alt="" title="phpDocumentor-3" width="526" height="186" class="aligncenter size-full wp-image-1990" /></p>
<h3>Tips &#038; Tricks: Fixme Comment</h3>
<p><a href="http://c2.com/cgi/wiki?FixmeComment">Заметки</a> на будущее прям в коде:</p>
<pre class="brush: php; title: ; notranslate">
// TODO: do something with some function
// FIXME: hands
// XXX: may be broken
</pre>
<p>IDE нынче умные пошли, и все такие заметки соберут до кучи:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/TODO.png" alt="" title="TODO" width="526" height="186" class="aligncenter size-full wp-image-1993" /></p>
<h3>Tips &#038; Tricks: о include и require</h3>
<p>А вы смотрели что возвращают функции include и require? А если в подключаемом файле используется return?</p>
<pre class="brush: php; title: ; notranslate">
$config = require 'config.php';

&lt;? // config.php
    return array(
        'DB' =&gt; array(...)
    );
</pre>
<p>Достаточно универсальный способ для подключения конфигурационных файлов.</p>
<h3>Tips &#038; Tricks: о фильтрации данных</h3>
<p>На дворе уже закат PHP 5.2, а фильтры не используем:</p>
<pre class="brush: php; title: ; notranslate">
// return string or false
filter_var('bob@example', FILTER_VALIDATE_EMAIL);
filter_var('bob@example.com', FILTER_VALIDATE_EMAIL);

// return string or false
filter_var('http://example.com', FILTER_VALIDATE_URL);
</pre>
<p>По теме:</p>
<ul>
<li><a href="http://www.php.net/manual/en/function.filter-var.php">http://www.php.net/manual/en/function.filter-var.php</a></li>
<li><a href="http://www.php.net/manual/en/filter.filters.validate.php">http://www.php.net/manual/en/filter.filters.validate.php</a></li>
<li><a href="http://www.php.net/manual/en/function.filter-var-array.php">http://www.php.net/manual/en/function.filter-var-array.php</a></li>
</ul>
<p>Иногда обработку массива превращают в что-то невообразимое, можно же проще:</p>
<pre class="brush: php; title: ; notranslate">
  // array of ids
$ids = $Request-&gt;getParam(&quot;ids&quot;);

  // to integer
$ids = array_map(&quot;intval&quot;, $ids);

  // without zero
$ids = array_filter($ids);

  // unique
$ids = array_unique($ids);

  // prepare for SQL
$idsStr = join(&quot;,&quot;, $ids);
</pre>
<p>А бывают ситуации, когда в форме есть несколько submit кнопок, и надо понимать что же было нажато (о да, это плохие формы)</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form&gt;
    ...
    &lt;input type=&quot;submit&quot; name=&quot;disable&quot; value=&quot;Disable selected&quot; /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;enable&quot; value=&quot;Enable selected&quot; /&gt;
&lt;/form&gt;
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php  // gets current action
$action = current(array_intersect(array_keys(
    $_REQUEST), array('disable', 'enable')
));
</pre>
<h3>Tips &#038; Tricks: glob</h3>
<p>Уже везде упоминали функцию <a href="http://www.php.net/manual/en/function.glob.php">glob</a>, но мы всё так же её игнорируем, так что я решил её опять вспомнить:</p>
<pre class="brush: php; title: ; notranslate">
$controllers = glob('/modules/*/controllers/*.php');

$modules = glob('/modules/*', GLOB_ONLYDIR);
</pre>
<h3>Tips &#038; Tricks: mysqlnd</h3>
<p>Если у вас высокопроизводительное приложение, если вам знакомо понятие master и slave, если разруливаете это ручками, то вот оно &mdash; прозрение:</p>
<pre class="brush: php; title: ; notranslate">
// in config
[myapp]
master[]=localhost:/tmp/mysql.sock
slave[]=192.168.2.27:3306

// in sources
$mysqli = new mysqli(&quot;myapp&quot;, &quot;username&quot;, &quot;password&quot;, &quot;database&quot;);
$pdo = new PDO(&quot;mysql:host=myapp;dbname=database&quot;, &quot;username&quot;, &quot;password&quot;);
</pre>
<p>По теме:</p>
<ul>
<li><a href="http://www.php.net/manual/en/book.mysqlnd.php">http://www.php.net/manual/en/book.mysqlnd.php</a></li>
<li><a href="http://blog.ulf-wendel.de/?p=307">Replication and load balancing mysqlnd plugin for all PHP MySQL extensions released</a></li>
</ul>
<p>P.S. О, это уже было в &#8230; <a href="https://twitter.com/AntonShevchuk">твитере</a> ;)</p>
<h3>Reflection</h3>
<p>Посмотри на себя в <a href="http://php.net/manual/en/book.reflection.php">зеркало</a>, в нём ты увидишь и имена <a href="http://www.php.net/manual/en/reflectionclass.getmethods.php">методов</a>, и приватные <a href="http://www.php.net/manual/en/reflectionclass.getproperties.php">данные</a>, и даже <a href="http://www.php.net/manual/en/reflectionclass.getdoccomment.php">комментарии</a>. Знай и используй с умом!</p>
<h2>PHP 5.3</h2>
<p>Приведу краткие тезисы по теме новшеств в PHP 5.3 (да, да, жевано-пережевано, но повторить то стоит)</p>
<h3>Анонимные функции</h3>
<p>Используете jQuery, значит ничего нового тут не увидите:</p>
<pre class="brush: php; title: ; notranslate">
$ids = array_map(function($el){
    return intval($el);
}, $ids);
  // or
$toInt = function($el){
    return intval($el);
};
$ids = array_map($toInt, $ids);
  // or
$int = $toInt($el);
</pre>
<h3>Замыкания</h3>
<p>Смотреть в код до наступления понимания происходящего:</p>
<pre class="brush: php; title: ; notranslate">
function getTimeout() {
    $el = &quot;15 minutes&quot;;

    return function() use ($el){
        return intval($el);
    };
}

$timeOut = getTimeout();
echo $timeOut(); // &gt;&gt; 15
</pre>
<h3>Магический метод __invoke()</h3>
<p>Вместо слов, лишь код:</p>
<pre class="brush: php; title: ; notranslate">
class Row
{
    function __invoke()
    {
        return $this-&gt;login;
    }
}

$user = new Users\Row();
$var = $user(); // &gt;&gt; return user login
</pre>
<h3>Namespaces</h3>
<p>Про пространство имён не писал лишь ленивый, но я предлагаю простую ассоциацию c файловой системой (спасибо за бэкслеш, ассоциация будет с Windows):</p>
<pre class="brush: plain; title: ; notranslate">
\              &lt;&lt; Default namespace - root
\Exception
\StdClass
\Application   &lt;&lt; Our namespace - Application
            \Model
                  \User
                  \Group
            \Controller
                  \User
</pre>
<ul>
<li>объявляя namespace &mdash; мы добавляем новый класс в иерархию &laquo;папок&raquo; &mdash; cd &#038;&#038; mkdir</li>
<li>говоря use &mdash; используем директорию из иерархии (1 или более) &mdash; как команда cd</li>
<li>говоря use as &mdash; используем под определенным именем &mdash; ln</li>
<li>всегда можно обращаться идя от корня (абсолютный путь: \Application\Model\Group)</li>
</ul>
<h3>Позднее статическое связывание</h3>
<p>Эта непонятная фигня означает, что когда вы наследуете класс от статического, то у вас возникнут проблемы с доступом к статическим методам наследуемого класса, приведу наглядный (я надеюсь) пример:</p>
<pre class="brush: php; title: ; notranslate">
class Latin
{
     const CHARS = 'abc...';
     static function getChars() {
         return self::CHARS;
     }
}
class French extends Latin
{
    const CHARS = 'aàábc...';
}

echo French::getChars(); // &gt;&gt; abc...
</pre>
<p>В PHP 5.3 решается просто:</p>
<pre class="brush: php; title: ; notranslate">
class Latin
{
     const CHARS = 'abc...';
     static function getChars() {
         return static::CHARS; // &lt;&lt; static
     }
}
class French extends Latin
{
    const CHARS = 'aàábc...';
}

echo French::getChars(); // &gt;&gt; aàábc...
</pre>
<h3>Почти фреймворк</h3>
<p>Ой, велосипед, да на &laquo;новых&raquo; технологиях, нямочка, зацените-ка контроллер:</p>
<pre class="brush: php; title: ; notranslate">
namespace Bluz;
return
/**
 * @acl View User Profile
 * @cache 5 minutes
 * @param integer $id
 * @return closure
 */
function($id) use ($bootstrap, $app, $view) {
    /**
     * @var closure $bootstrap
     * @var Application $app
     * @var View $view
     */
     $view-&gt;user = $app-&gt;getDb()-&gt;getRow(&quot;...&quot;, array($id));
};
</pre>
<ul>
<li>Контроллер &mdash; анонимная функция возвращаемая при подключении файла</li>
<li>Может вернуть что угодно, лишь бы было callable</li>
<li>Принимает параметры с реквеста, уже отфильтрованнные (описали же в doccomment&#8217;e правила)</li>
<li>Кеширует результат выполнения на 5 минут (опять reflection)</li>
<li>Acl тут тоже не просто так ;)</li>
</ul>
<p>Возможно выложим на общее обозрение сие творение, ну когда отшлифуем его ;)</p>
<h3>Если что-то позабыл</h3>
<p>Позабыл я о небольшом изменении в поведении тернарного оператора &laquo;(statement)?(then):(else)&raquo;, у него появилось мини-сокращение:</p>
<pre class="brush: php; title: ; notranslate">
echo $var?$var:'nil';
// ? : improvements
echo $var?:'nil';
</pre>
<p>Что-то оно не очень, можно было сделать лучше (эти примеры не работают!):</p>
<pre class="brush: php; title: ; notranslate">
echo $var?;
// or
echo isset($var['elem'])?$var['elem'];
</pre>
<p>Еще &laquo;незаслужено&raquo; обошёл стороной метки:</p>
<pre class="brush: php; title: ; notranslate">
// labels
start: echo &quot;start&quot;; goto finish;

echo &quot;never&quot;;

finish: echo &quot;finish&quot;;
</pre>
<p>Но наверное вы в курсе:<br />
<a href="http://xkcd.com/292/"><img src="http://anton.shevchuk.name/wp-content/uploads/2011/11/xkcd-goto.png" alt="" title="xkcd-goto" width="620" class="aligncenter size-full wp-image-1994" /></a></p>
<p>P.S. Всё это и еще немного больше я обычно рассказываю на лекциях в <a href="http://anton.shevchuk.name/php/team-life/" title="Жизнь в PHP отделе">своём отделе</a> ;)</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=B_3bafhc4aM:y4MjTYP9ETc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=B_3bafhc4aM:y4MjTYP9ETc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=B_3bafhc4aM:y4MjTYP9ETc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/B_3bafhc4aM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/about-php/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		<media:content url="http://feedproxy.google.com/~r/AntonShevchuk/~5/pb_3Zs7d3t0/config.zip" fileSize="6390" type="application/zip" /><feedburner:origLink>http://anton.shevchuk.name/php/about-php/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/AntonShevchuk/~5/pb_3Zs7d3t0/config.zip" length="6390" type="application/zip" /><feedburner:origEnclosureLink>http://dl.dropbox.com/u/27453635/PHPStorm/config.zip</feedburner:origEnclosureLink></item>
		<item>
		<title>Zend Framework Day</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/y9VOgk-cF28/</link>
		<comments>http://anton.shevchuk.name/php/zend-framework-day/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 15:20:11 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[announcement]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1982</guid>
		<description><![CDATA[12 ноября, в Киеве, пройдет конференция &#8220;Zend Framework Day&#8221;, посвященная популярному PHP фреймворку Zend Framework. Среди докладчиков &#8211; непосредственные разработчики компонент Zend Framework. Событие соберет лучших PHP и Zend Framework специалистов из Украины, России, Белоруссии и других стран СНГ. С текущим списком тем и докладчиков можно ознакомиться на странице. Событие будет интересно не только тем, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://frameworksdays.com/uploads/events/zend-framework-day.png" alt="Zend Framework Day" align="left" style="margin-right: 20px;" />12 ноября, в Киеве, пройдет конференция &#8220;Zend Framework Day&#8221;, посвященная популярному PHP фреймворку Zend Framework. <br/><br />
Среди докладчиков &#8211; непосредственные разработчики компонент Zend Framework. Событие соберет лучших PHP и Zend Framework специалистов из Украины, России, Белоруссии и других стран СНГ.</p>
<p><span id="more-1982"></span></p>
<p>С текущим списком тем и докладчиков можно ознакомиться на <a href="http://frameworksdays.com/event/zend-framework-day-2011/speakers">странице</a>.</p>
<p>Событие будет интересно не только тем, кто использует Zend Framework, но и всем веб-разработчикам и PHP программистам в частности.</p>
<p>Место проведения — отель &#8220;Казацкий&#8221;, г. Киев, ул. Михайловская 1/3 (Площадь Независимости).</p>
<p>Стоимость участия и другая необходимая информация доступна на <a href="http://frameworksdays.com/event/zend-framework-day-2011">странице</a>.</p>
<p>Для участия в конференции необходимо пройти регистрацию на <a href="http://frameworksdays.com/register">странице</a>, а затем произвести оплату из личного кабинета.</p>
<p>
Сайт конференции &#8211; <a href="http://frameworksdays.com/event/zend-framework-day-2011">http://frameworksdays.com/event/zend-framework-day-2011</a><br />
Наши новости в twitter &#8211; <a href="http://twitter.com/fwdays">http://twitter.com/fwdays</a><br />
Наша страница в facebook – <a href="http://facebook.com/fwdays">http://facebook.com/fwdays</a></p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/php/meetup-thinkphp-in-kharkov/" title="Встреча ThinkPHP в Харькове">Встреча ThinkPHP в Харькове</a></li><li><a href="http://anton.shevchuk.name/html-and-css/master-klass-yuriy-akella-artyukh/" title="Мастер-класс Юры Артюха">Мастер-класс Юры Артюха</a></li><li><a href="http://anton.shevchuk.name/internet/sphinx-master-class/" title="Мастер-класс по Sphinx">Мастер-класс по Sphinx</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-2011-piter/" title="Конференция ZFConf 2011">Конференция ZFConf 2011</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-ukraine/" title="ZFConf Ukraine">ZFConf Ukraine</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class-feedback/" title="Анонс мастер-классов по JavaScript&#8217;у">Анонс мастер-классов по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class/" title="Мастер-классы по JavaScript&#8217;у">Мастер-классы по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/internet/pdfeed-rss-to-pdf-generator/" title="PDFEED &#8211; или RSS2PDF в новом обличье">PDFEED &#8211; или RSS2PDF в новом обличье</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=y9VOgk-cF28:514ejhGyJ9s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=y9VOgk-cF28:514ejhGyJ9s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=y9VOgk-cF28:514ejhGyJ9s:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/y9VOgk-cF28" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/zend-framework-day/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/zend-framework-day/</feedburner:origLink></item>
		<item>
		<title>Мастер-класс Юры Артюха</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/g6vqnLPb2D4/</link>
		<comments>http://anton.shevchuk.name/html-and-css/master-klass-yuriy-akella-artyukh/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 11:51:59 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[HTML and CSS]]></category>
		<category><![CDATA[announcement]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1972</guid>
		<description><![CDATA[8-го октября (в Киеве) и 15-го октября (в Харькове) пройдет мастер-класс Юры Артюха &#171;Современные подходы в вёрстке 2&#187; Юрий Артюх — специалист по верстке с многолетним стажем. Принимал участие в разработке нескольких сотен проектов среди которых такие как kremlin.ru, groupon.ru, subscribe.ru, sports.ru, ukr.net, zn.ua, delo.ua, pravda.com.ua. Мастер-класс может быть интересен и полезен всем, кто работает [...]]]></description>
			<content:encoded><![CDATA[<p><strong>8-го октября (в Киеве)</strong> и <strong>15-го октября (в Харькове)</strong> пройдет мастер-класс Юры Артюха &laquo;<strong>Современные подходы в вёрстке 2</strong>&raquo;</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/10/yuriy-akella-artyukh.jpg" alt="" title="Юрий Артюх" width="285" height="200" class="aligncenter size-full wp-image-1975" /></p>
<p><strong>Юрий Артюх</strong> — специалист по верстке с многолетним стажем. Принимал участие в разработке нескольких сотен проектов среди которых такие как <a href="http://kremlin.ru" target="_blank">kremlin.ru</a>, <a href="http://groupon.ru" target="_blank">groupon.ru</a>, <a href="http://subscribe.ru" target="_blank">subscribe.ru</a>, <a href="http://sports.ru" target="_blank">sports.ru</a>, <a href="http://ukr.net" target="_blank">ukr.net</a>, <a href="http://zn.ua" target="_blank">zn.ua</a>, <a href="http://delo.ua" target="_blank">delo.ua</a>, <a href="http://pravda.com.ua" target="_blank">pravda.com.ua</a>.</p>
<p><span id="more-1972"></span><br />
Мастер-класс может быть интересен и полезен всем, кто работает с фронт-эндом.</p>
<p>Уже более 7 лет Юрий ведет популярный блог посвященный проблемам верстки <a href="http://cssing.org.ua" target="_blank">CSSing.org.ua</a>. Также является активным участником сообщества русского крыла веб-стандартистов, и организатором первой украинской конференции веб-разработчиков UA WEB.</p>
<p>В конце мастер-класса у нас будет возможность задать любые вопросы.</p>
<p>После занятий самые стойкие смогут продолжить общение в пабе.</p>
<p>Дополнительная информация и <a href="http://www.smartme.com.ua/master-klassy-o-verstke-v-xarkove-i-kieve/" target="_blank">подробный план мастер-класса можна посмотреть на сайте</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/php/meetup-thinkphp-in-kharkov/" title="Встреча ThinkPHP в Харькове">Встреча ThinkPHP в Харькове</a></li><li><a href="http://anton.shevchuk.name/php/zend-framework-day/" title="Zend Framework Day">Zend Framework Day</a></li><li><a href="http://anton.shevchuk.name/internet/sphinx-master-class/" title="Мастер-класс по Sphinx">Мастер-класс по Sphinx</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-2011-piter/" title="Конференция ZFConf 2011">Конференция ZFConf 2011</a></li><li><a href="http://anton.shevchuk.name/php/zfconf-ukraine/" title="ZFConf Ukraine">ZFConf Ukraine</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class-feedback/" title="Анонс мастер-классов по JavaScript&#8217;у">Анонс мастер-классов по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/javascript/javascript-master-class/" title="Мастер-классы по JavaScript&#8217;у">Мастер-классы по JavaScript&#8217;у</a></li><li><a href="http://anton.shevchuk.name/internet/pdfeed-rss-to-pdf-generator/" title="PDFEED &#8211; или RSS2PDF в новом обличье">PDFEED &#8211; или RSS2PDF в новом обличье</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=g6vqnLPb2D4:JuqSDIGrz3Y:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=g6vqnLPb2D4:JuqSDIGrz3Y:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=g6vqnLPb2D4:JuqSDIGrz3Y:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/g6vqnLPb2D4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/html-and-css/master-klass-yuriy-akella-artyukh/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/html-and-css/master-klass-yuriy-akella-artyukh/</feedburner:origLink></item>
		<item>
		<title>Обзор Boogie Board</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/1X2m6pHfJU0/</link>
		<comments>http://anton.shevchuk.name/my-life/review-boogie-board/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 13:57:54 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[My Life]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1946</guid>
		<description><![CDATA[Прикупил занятный девайс для рисования &#8211; Boogie Board. Небольшой horror-обзор далее (хотя картинка выше такая спойлерная)&#8230; Для начала о грустном &#8211; о цене &#8211; заказывал на Amazon Boogie Board Bundle за $44.95, пересылка через Shipito обошлась бы еще в $12.75, но объединение посылок съело эту сумму. В Bundle входит &#8211; собственно Boogie Board 8.5&#8243;, стилус, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie_board_anim.gif" alt="" title="Boogie Board" width="400" height="438" class="aligncenter size-full wp-image-1947" /></p>
<p>Прикупил занятный девайс для рисования &#8211; <a href="http://www.improvelectronics.com/us/en/boogie-board-LCD-writing-tablet/boogie-board-8-LCD-writing-tablet.html">Boogie Board</a>. Небольшой horror-обзор далее (хотя картинка выше такая спойлерная)&#8230;<br />
<span id="more-1946"></span></p>
<p>Для начала о грустном &#8211; о цене &#8211; заказывал на Amazon <a href="http://amzn.to/pHftC5">Boogie Board Bundle</a> за $44.95, пересылка через <a href="http://anton.shevchuk.name/internet/my-internet-shopping-and-shipping-with-shipito/" title="Мой опыт работы с Shipito">Shipito</a> обошлась бы еще в $12.75, но объединение посылок съело эту сумму. В Bundle входит &#8211; собственно Boogie Board 8.5&#8243;, стилус, чехол, клипса для стилуса, набор магнитов на скотче (которые я сразу и приклеял):</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-bundle.jpg" alt="" title="Boogie Board Bundle" width="640" height="430" class="aligncenter size-full wp-image-1948" /><br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-bundle-2.jpg" alt="" title="Boogie Board Bundle" width="640" height="494" class="aligncenter size-full wp-image-1949" /></p>
<h3>Описание</h3>
<p>Размером планшетик с лист формата А5 &mdash; 222х140 мм, LCD экран &mdash; 183х125 мм. Толщина от 3мм до 6мм, правда магниты и клипса еще добавляет габаритов, но не значительно. Стилус &laquo;дебелый&raquo;, так просто не сломать, в разложеном состоянии можно использовать как указку. Стилус можно закрепить либо на клипсе, либо положить в специальный кармашек чехла.</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-4.jpg" alt="" title="Boogie Board" width="640" height="455" class="aligncenter size-full wp-image-1952" /></p>
<h3>Использование</h3>
<p>Держать удобно, рисовать не напряжно &mdash; чем-то напоминает рисование карандашом по бумаге (даже с характерным звуком). Можно повесить на холодильник или на доску в офисе &mdash; магнитные ножки держат надежно (хотя в таком положении рисовать не удобно). </p>
<p>Экран чувствителен к силе нажатия &mdash; под собственным весом стилус оставляет точку радиусом ~2-3мм; при усилии ~4-5мм. И да &mdash; он матовый!</p>
<p>На девайсе всего одна кнопка &mdash; очистить экран &mdash; выглядит это как перелистывание страниц на e-ink. Производитель же обещает 50 000 очисток на одной батарейке &mdash; а потом будем думать (через 6 лет, если стирать по 20 раз на дню).</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-5.jpg" alt="" title="Boogie Board" width="640" height="444" class="aligncenter size-full wp-image-1953" /></p>
<p>Насчет внутренностей чудо-блокнота &mdash; походу, с заменой батарейки, проблем не возникнет (найдено на amazon):<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-inside.jpg" alt="" title="boogie-board-inside" width="500" height="200" class="aligncenter size-full wp-image-1955" /></p>
<h3>Выводы</h3>
<p>Девайс прикольный, конечно не хватает функции сохранения картинок на комп, да и режим ластика для стилуса &mdash; а то я его постоянно переворачиваю пытаясь стереть что-то. Покупал планшет, в первую очередь, для ребенка, но пока он он у бабушки стресс-тестирование еще не проводилось :)</p>
<p>Еще раз о грустном (ссылки реферальные, о ужас):</p>
<ul>
<li><a href="http://amzn.to/oHauRl">Boogie Board 8.5&#8243;</a> &mdash; чёрная версия &mdash; $29.95 </li>
<li><a href="http://amzn.to/pHftC5">Boogie Board 8.5&#8243; Bundle</a> &mdash; тот что на скринах выше &mdash; $44.95</li>
<li><a href="http://amzn.to/reVYaZ ">Boogie Board 10.5&#8243;</a> &mdash; новый и большой, пока чехла к нему не найти &mdash; $59.95</li>
</ul>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/07/boogie-board-6.jpg" alt="" title="Boogie Board Evil Win" width="640" height="319" class="aligncenter size-full wp-image-1950" /></p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/my-life/review-corsair-graphite-series-600t/" title="Обзор корпуса Corsair Graphite Series 600T">Обзор корпуса Corsair Graphite Series 600T</a></li><li><a href="http://anton.shevchuk.name/my-life/nook-barnes-noble-review/" title="Обзор Nook от Barnes &#038; Noble">Обзор Nook от Barnes &#038; Noble</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=1X2m6pHfJU0:JcuPTzS3JQA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=1X2m6pHfJU0:JcuPTzS3JQA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=1X2m6pHfJU0:JcuPTzS3JQA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/1X2m6pHfJU0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/my-life/review-boogie-board/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/my-life/review-boogie-board/</feedburner:origLink></item>
		<item>
		<title>Интеграция форума Vanilla</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/mEjRnqgq1D4/</link>
		<comments>http://anton.shevchuk.name/php/embed-migration-integration-vanilla/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 06:57:18 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Vanilla]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1932</guid>
		<description><![CDATA[Если перед вами стоит задача подключения форума к готовой системе, то советую вам обратить внимание на Vanilla Forum. А дальше &#8212; скучноватый пошаговый мануал =\ Для начала нам потребуется скачать последнюю версию форума с официального сайта, а поскольку я тут успел наступить на одни грабли &#8212; то качаем последнюю бету &#8212; vanilla-core-2.0.18b2. Встраиваем По умолчанию, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2011/06/vanilla_sticker-460x207.png" alt="" title="Vanilla Forum" width="460" height="207" class="aligncenter size-medium wp-image-1933" /><br />
Если перед вами стоит задача подключения форума к готовой системе, то советую вам обратить внимание на <a href="http://vanillaforums.org/">Vanilla Forum</a>. А дальше &mdash; скучноватый пошаговый мануал =\<br />
<span id="more-1932"></span></p>
<blockquote><p>Для начала нам потребуется скачать последнюю версию форума с официального сайта, а поскольку я тут успел наступить на одни грабли &mdash; то качаем последнюю бету &mdash; <a href="http://vanillaforums.org/addon/vanilla-core-2.0.18b2">vanilla-core-2.0.18b2</a>.</p></blockquote>
<h3>Встраиваем</h3>
<p>По умолчанию, Vanilla форум имеет прекрасную возможность &mdash; встраиваться в любую HTML страничку посредством JavaScript&#8217;a, для этого нам понадобится активировать плагин &lt;Embed&gt; Vanilla (идет в стандартной поставке) и получить код скрипта:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://forum.your-domain.com/plugins/embedvanilla/remote.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Так же советую использовать дефолтную тему &laquo;Embed-Friendly&raquo; для встроенного форума &mdash; она достаточно простая и удобная для кастомизации. </p>
<p>Единственная проблема которая у меня возникла при подобном подключении форума &mdash; это ошибки JavaScript&#8217;a &mdash; разработчики форума не в курсе о методе <code>jQuery().delegate()</code> и используют <code>jQuery('a').live('click')</code>, чем вызывают не очень адекватное поведение ссылок на странице без атрибута href. </p>
<h3>Интеграция с использованием ProxyConnect</h3>
<p>Как понятно из подзаголовка, нам потребуется скачать плагин <a href="http://vanillaforums.org/addon/proxyconnect-plugin">Vanilla ProxyConnect</a>. Устанавливаем и идем настраивать (Users &gt; Authentication):</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2011/06/ProxyConnect.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2011/06/ProxyConnect-460x300.png" alt="" title="ProxyConnect" width="460" height="300" class="aligncenter size-medium wp-image-1936" /></a></p>
<p>Тут всё просто, по пунктам (пути в примере полные, могут быть относительные):</p>
<ol>
<li>Ваш сайт</li>
<li>Страничка для получения данных о вашем пользователе (о ней чуть далее)</li>
<li>Страница регистрации</li>
<li>Страница входа</li>
<li>Страница выхода</li>
</ol>
<p>Теперь займемся пунктом 2 &mdash; Authenticate URL. Это страничка, где у вас должны выводиться данные вашего текущего пользователя в простом формате:</p>
<blockquote><pre>
UniqueID=1279
Name=Bob
Email=bob@gmail.com
TransientKey=qwerty
DateOfBirth=1970-01-01
Gender=Male
Roles=Member,Admin
</pre>
</blockquote>
<ul>
<li><strong>UniqueID</strong> &mdash; обязательное поле, UID пользователя в вашей системе</li>
<li><strong>Name </strong> &mdash; обязательное поле, username, или как он у вас обзывается</li>
<li><strong>Email</strong> &mdash; обязательное поле, email вашего пользователя</li>
<li><strong>TransientKey</strong> &mdash; ключ, для предотвращения CSRF атак (вам скорей всего не понадобится, для wordpress обязательно)</li>
<li><strong>DateOfBirth</strong> &mdash; дата рождения</li>
<li><strong>Gender</strong> &mdash; мальчик/девочка, Male/Female</li>
<li><strong>Roles</strong> &mdash; роли пользователя на Vanilla форуме, через запятую, можно IDшниками</li>
</ul>
<p>Если у вас Zend Framework, то action будет выглядеть как-то так:</p>
<pre class="brush: php; title: ; notranslate">
// disable View
$this-&gt;_helper-&gt;layout()-&gt;disableLayout();
$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender(true);

// get current User
$user = Zend_Auth::getInstance()-&gt;getIdentity();
if ($user) {
echo &quot;UniqueID={$user-&gt;id}\n&quot;
     . &quot;Name={$user-&gt;username}\n&quot;
     . &quot;Email={$user-&gt;email}\n&quot;
     . &quot;Roles={$user-&gt;role}\n&quot;;
} else {
echo &quot;UniqueID=\n&quot;
     . &quot;Name=\n&quot;
     . &quot;Email=\n&quot;;
}
</pre>
<p>Как это работает &mdash; когда пользователь заходит на форум, то Vanilla незаметно так стучится на нашу страничку с текущей сессией пользователя, и пытается получить о нем информацию. Если это удалось, то движок пытается найти соответсвующую запись у себя в БД &mdash; если нашел, то мы авторизированы, если не нашел соответсвия &mdash; регистриует нового пользователя с указанными данными и так же авторизирует. Если наша страничка не вернула данных о пользователе, то он либо будет послан на страницу Sign In указанную в настройках ProxyConnect, либо отобразит страницу авторизации форума (зависит, от того, что разрешено пользователю guest).</p>
<p>Из замеченного: для разлогинивания на форуме следует чистить куки:</p>
<pre class="brush: php; title: ; notranslate">
// vanilla forum logout
setcookie('Vanilla', ' ', time() - 3600, '/', '.domain.com');
unset($_COOKIE['Vanilla']);
</pre>
<p>Если пользователь авторизирован в вашей системе, а при входе на форум требуется логинится (банально клацнуть на кнопку, для запуска процесса авторизации), то это тоже поправимо &mdash; следует в вашем методе логина добавить следующую очистку куков (я их еще и в логаут добавил, так на всяк случай):</p>
<pre class="brush: php; title: ; notranslate">
setcookie(&quot;Vanilla&quot;, &quot;deleted&quot;, time() - 1,'/', &quot;.domain.com&quot;, false);
setcookie(&quot;Vanilla-Volatile&quot;, &quot;deleted&quot;, time() - 1, '/', &quot;.domain.com&quot;, false);
</pre>
<p><a href="http://vanillaforums.org/page/ProxyConnect_SSO">Официальная документация по ProxyConnect</a></p>
<h3>Портирование с phpBB, vBulletin и т.д.</h3>
<p>На случай если вы решили сменить движок форума, то это тоже предусмотрено ;) Качаем <a href="http://vanillaforums.org/addon/porter-core">Vanilla Porter</a> и заливаем его в корень вашего текущего форума (phpBB или что там у вас). Далее следуем простой инструкции по переносу данных:</p>
<ol>
<li>Экспорт форума в TXT файл хитрого формата</li>
<li>Импорт этого самого файла</li>
</ol>
<p>Как просто-то :) Ну для наглядности приведу еще скриншот самой тулзы:<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2011/06/VanillaPorter-356x460.png" alt="" title="VanillaPorter" width="356" height="460" class="aligncenter size-medium wp-image-1934" /></p>
<p>Но без нюансов тоже не обошлось &mdash; первое с чем столкнулся это непонимание формата файла в архиве, пришлось распаковывать и заливать. Второе &mdash; во время импорта все текущие пользователи Vanilla будут удалены, включая вашу учетную запись, так что в определенный момент вам надо будет указать email нового админа из портированных данных, после чего вы получите ошибку авторизации, без паники, логинимся заново под новым админом и продолжаем импорт данных (будет такая кнопочка). Следующий шаг &mdash; вам потребуется назначить права для всех ролей пользователей, которые были перенесены со старого движка. И напоследок, когда пользователи со старой системы попробуют зайти на новый форум им высветится следующий диалог (это верно для Vanilla + ProxyConnect):</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2011/06/linking.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2011/06/linking.png" alt="" title="Vanilla Linking Accounts" width="600" height="287" class="aligncenter size-full wp-image-1938" /></a></p>
<p>Подготовьте пользователей к правильным действиям заранее.</p>
<p>Еще такой момент, умные дядьки часто изменяют алгоритм хэшированя паролей, на этот случай прийдется выполнить следующие действия:</p>
<ol>
<li>Заменить имя метода хэширования на некоторый произвольный</li>
<li>Добавить его поддержку в файле <code>vanilla/library/core/class.passwordhash.php</code></li>
</ol>
<p>С первым всё совсем просто:</p>
<pre class="brush: sql; title: ; notranslate">
UPDATE GDN_User SET HashMethod = 'myHash' WHERE HashMethod = 'phpBB';
</pre>
<p>Второй пункт тоже не сложен &mdash; нам потребуется найти <code>switch</code> в методе <code>CheckPassword()</code> и добавить туда новый <code>case</code>:</p>
<pre class="brush: php; title: ; notranslate">
switch(strtolower($Method)) {
/* ... */
    case 'myhash':
        $Result = myMegaHashFunction($Password, $StoredHash);
        break;
/* ... */
}
</pre>
<p><a href="http://vanillaforums.com/blog/help/importing-data/">Документация по Vanilla Porter</a></p>
<h3>Вместо вывода</h3>
<p>Форум действительно стоит того, чтобы его установить и опробовать: много локализаций (включая русский и арабский) и полезных плагинов; простые для адаптации темы (хоть и Smarty используется); и таки удобная система интеграции.</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li>No Related Post</li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=mEjRnqgq1D4:jIuVbUlC4WA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=mEjRnqgq1D4:jIuVbUlC4WA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=mEjRnqgq1D4:jIuVbUlC4WA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/mEjRnqgq1D4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/embed-migration-integration-vanilla/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/embed-migration-integration-vanilla/</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss>

