<?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>Антон Шевчук: блог web-разработчика</title>
	
	<link>http://anton.shevchuk.name</link>
	<description>Всё о web-разработке и продвижении сайтов</description>
	<lastBuildDate>Tue, 07 Sep 2010 07:18:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</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>Facing refucktoring</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/Tjfo37KhWVo/</link>
		<comments>http://anton.shevchuk.name/php/facing-refucktoring/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 08:48:30 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1364</guid>
		<description><![CDATA[История одного рефакторинга, или о сказ о том как не надо разрабатывать на PHP&#8230; Началось все как всегда, откуда-то появляется заказчик весь в слезах и трансе, орет не своим голосом: &#171;Спасите, помогите, мой проект тормозит, от меня пользователи бегут. У вас неделя&#8230;&#187; Развернули проект на нашем сервере &#8212; н-да уж&#8230; Дальше был анализ сего творения [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/08/Mission-Impossible.jpg"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/08/Mission-Impossible.jpg" alt="" title="Mission Impossible" width="451" height="323" class="aligncenter size-full wp-image-1375" /></a></p>
<p>История одного рефакторинга, или о сказ о том как не надо разрабатывать на PHP&#8230;<br />
<span id="more-1364"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p>Началось все как всегда, откуда-то появляется заказчик весь в слезах и трансе, орет не своим голосом: &laquo;Спасите, помогите, мой проект тормозит, от меня пользователи бегут. У вас неделя&#8230;&raquo;</p>
<p>Развернули проект на нашем сервере &mdash; н-да уж&#8230; Дальше был анализ сего творения фирмы &laquo;Q&raquo; (кто <a href="http://twitter.com/AntonShevchuk">следит за мной</a>, знает о какой украинской фирме речь), смех сквозь слезы, и истерика в течении недели. Ну для начала был взят XDEBUG и посмотрели профайлером что там и как (кликабельно):<br />
<a href="http://anton.shevchuk.name/wp-content/uploads/2010/08/splash-rev-0.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/08/splash-rev-0-720x375.png" alt="" title="Splash Screen" width="720" height="375" class="aligncenter size-medium wp-image-1427" /></a></p>
<blockquote><p>Такую клевую штуку рисует <a href="http://code.google.com/p/webgrind/">Webgrind</a>, удобно и наглядно</p></blockquote>
<p>Т.е. у нас страница, которая выводит приветствие + выбор языка + выбор категории для просмотра (захардкоденных кстати) генерировалась за 4,6 секунды на сервере с Core2 Quad CPU Q6600@2.40GHz/16Gb (истерика и лучи ненависти конторе &laquo;Q&raquo;).</p>
<p>Куда более жутка картина ожидала нас на главной странице:<br />
<a href="http://anton.shevchuk.name/wp-content/uploads/2010/08/main-rev-0.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/08/main-rev-0-720x155.png" alt="" title="Main Page" width="720" height="155" class="aligncenter size-medium wp-image-1426" /></a></p>
<p>До применения Zend Framework&#8217;a нас отделяло еще несколько недель оптимизации г..кода&#8230;</p>
<h3>FastTemplate такой &laquo;Fast&raquo;</h3>
<p>Если присмотреться, то на предыдущем скрине видно, что очень дорого нам обходится некая функция <em>parse_body</em>:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/08/main-parse-rev-0.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/08/main-parse-rev-0-720x458.png" alt="" title="Main Page and FastTemplate" width="720" height="458" class="aligncenter size-medium wp-image-1425" /></a></p>
<p>Внутри нас ждет:</p>
<ul>
<li>вызов strtoupper &mdash; 56560 раз</li>
<li>вызов str_replace &mdash; 56560 раз</li>
</ul>
<p>Смотрим на код:</p>
<pre class="brush: php;">
// $content - шаблон
// $rec - переменные
$content = preg_replace(&quot;/\\$([A-Z][A-Z0-9_]+)/&quot;, &quot;@\\1@&quot;, $content);
if (is_array($rec)) {
    foreach ($rec as $key =&gt; $value) {
        $name = strtoupper($key);
        $content = str_replace(&quot;@$name@&quot;, &quot;$value&quot;, &quot;$content&quot;);
    }
}
return $content;
</pre>
<p>Т.е. в самом начале мы ищем в шаблонах что-то вроде $HTTP_PATH, заменяем это на @HTTP_PATH@, потом перебором пытаемся заменить все известные переменные. Есть одна проблема &mdash; шаблонов у нас много, в них используется совсем чуть-чуть из пары сотен переменных. Простая замена str_replace на preg_replace_callback дала прирост в пару секунд (т.е. около 10%).</p>
<h3>Примеры кода</h3>
<p>Слабонервным лучше пропустить данный абзац.</p>
<p>Классика плохого PHP кода, встречается у индусов и наших студентов:</p>
<pre class="brush: php;">
function n() {
   global $db, $CONSTANTS, $user, ...; // много одним словом

   echo $CONSTANTS[HOMEPAGE_BANNER1_ID];  // думаете это константа?
   echo $CONSTANTS[HOMEPAGE_BANNER2_ID];  // а знаете, что внутри?
   echo $CONSTANTS[HOMEPAGE_BANNER3_ID];  // 1, 2, 3, которые меняются совсем не там где объявляются О_о
}
</pre>
<p>Использование файловой системы вместо системы контроля версий:</p>
<pre>
tpl
|-- index.tpl
|-- index2.tpl
|-- index3.tpl
|-- index__.tpl
`-- index.44.tpl
</pre>
<p>С базой данных тот же номер &mdash; таблицы categories_old, items_1 и т.д.</p>
<blockquote><p>Если мальчик любит труд<br />
тычет в книжку пальчик,<br />
про такого пишут тут:<br />
он хороший мальчик.</p></blockquote>
<p>Это, как вы понимаете, не про наших &laquo;мальчиков&raquo;, у наших 9 000 notices на главной. Да и manual&#8217;ами пользуются только слабаки:</p>
<pre class="brush: php;">
// мы не читаем мануалов
while ($row = mysql_fetch_array($res)) {
      if ($row) {
            foreach ($row AS $key =&gt; $field) {
                if (ereg(&quot;^[0-9]+&quot;, $key)) {
                    unset($row[$key]);
                }
            }
      }
      $rows[] = $row;
}
// если чуть-чуть допилить
// мелочь, конечно, но прирост ~0,1 сек т.к. имеет место 23162 вызовов
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
      $rows[] = $row;
}
</pre>
<p>Далее просто гениальное решение, тайный смысл этого творения я не осилил:</p>
<pre class="brush: php;">
$sqls[] = $sql;
if (is_array($sqls)) {
    foreach ($sqls AS $ssql) {
        if ($ssql) {
            $res = mysql_db_query($db['name'], $ssql, $db['id']);
            if (!$res) {
                return 0;
            }
        }
    }
} else {
    return 0;
}
</pre>
<p>Подсчет результатов поиска, что может быть проще:</p>
<pre class="brush: php;">
// перед выполнением запроса можно подсчитать кол-во результатов
// воспользовавшись функцией db_count (вызывается в 96 разных местах)
function db_count($sql) {
    global $db;
    $res = mysql_db_query($db['name'], $sql, $db['id']);
    $result = mysql_num_rows($res);
    return $result;
}
</pre>
<p>Постраничная навигация, и это тоже можем:</p>
<pre class="brush: php;">
// пошел запрос к БД
$res = mysql_db_query($db['name'], $sql, $db['id']);
// подсчитали итого (хотя до этого уже был вызван db_count)
$row_count = mysql_num_rows($res);
// подсчитали сколько у нас страниц получается
$page_count = floor($row_count / $pager['per_page'] + 1);

// это offset
$bi = ($pos - 1) * $pager['per_page'];

// теперь выбираем только нужные записи
for ($i = $bi; $i &lt; $bi + $pager[&quot;per_page&quot;]; $i++) {
    if ($i &gt;= $row_count) {
        break;
    }

    if (!mysql_data_seek($res, $i)) {
        break;
    }

    if (!($row = mysql_fetch_assoc($res))) {
        break;
    }
    // складируем результат
    $new_rows[] = $row;
}
</pre>
<p>Повторение строк &mdash; мы не ищем легких путей (str_repeat):</p>
<pre class="brush: php;">
// в файле categories.sql.php
// функция которая строит select для HTML
$offset_string  = '';
for ($i = 1; $i &lt; $rec['level']; $i++) {
    $offset_string .= '&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;';
}
</pre>
<p>Если нам надо обрезать строку на 100 символов, и при этом не кромсать слова то вот оно решение:</p>
<pre class="brush: php;">
$data['row']['description'] = substr($description, 0, 100);

$i = 100;
while (!($description[$i] == &quot; &quot; || $description[$i] == &quot;_&quot;) &amp;&amp; $i &lt; strlen($description)):
    $data['row']['description'] .= $description[$i];
    $i++;
endwhile;

if ($i &lt; strlen($description)) {
    $data['row']['description'] .= &quot;...&quot;;
}
</pre>
<p>У нас так много глобальных переменных, там есть конечно $db, и она же передается во все функции которые работают с БД:</p>
<pre class="brush: php;">
function db_query($db, $sql) {}
function db_sql_query($db, $sql) {}
function db_count($db, $sql) {}
// и т.д.
// но почему не так, ведь у нас одна БД
function db_query($sql) {
    global $db;
}
</pre>
<p>Пусть на море качка, но мы всегда прибережем обходные пути:</p>
<pre class="brush: php;">
$sql = &quot;SELECT id, name, pasw from users where name = '$_POST[username]'&quot;;
</pre>
<p>Про агрегирование в SQL мы не знаем:</p>
<pre class="brush: php;">
// $rows - записи из БД
foreach ($rows as $value) {
      $total += $value[&quot;price&quot;];
}
</pre>
<p>Необходимо SEO URL? Не проблема:</p>
<pre class="brush: php;">
switch ($params[1]):
       case &quot;usageagreement&quot;:
            $page_id = 13;
       break;
       case &quot;privacypolicy&quot;:
            $page_id = 14;
       break;
       case &quot;termsandconditions&quot;:
            $page_id = 15;
       break;
       case &quot;affiliates&quot;:
            $page_id = 22;
       break;
       case &quot;aboutus&quot;:
            $page_id = 19;
       break;
endswitch;
</pre>
<p>Ладно с PHP, но HTML то можно было подучить:</p>
<pre class="brush: xml;">
&lt;!-- id такой id --&gt;
&lt;div id=&quot;banner&quot;&gt;...&lt;/div&gt;
&lt;div id=&quot;banner&quot;&gt;...&lt;/div&gt;
&lt;div id=&quot;banner&quot;&gt;...&lt;/div&gt;
&lt;div id=&quot;banner&quot;&gt;...&lt;/div&gt;

&lt;!-- class это почти style --&gt;
&lt;li class=&quot;padding-left:15px;&quot;&gt;...&lt;/li&gt;

&lt;!-- табличная верстка --&gt;
&lt;!-- хотя не стоит 10 вложенных таблиц расписывать --&gt;

&lt;!-- margin, что такое margin? --&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
</pre>
<h3>Применение Zend_Cache</h3>
<p>Кеш спасет мир, подумали мы и прикрутили его для всех SQL запросов (благо кто-то догадался написать единую функцию <em>db_sql_query</em>) и всех вызовов <em>parse_body</em>. Для начала попробовали кешировать в файлы, на тестовом сервере это помогло, на живом &mdash; нет. Причина &mdash; у нас так много мелких шаблонов (~200 для главной), что операции с файловой системой свели на нет прирост кеширования.</p>
<p>Вторая попытка оказалась более удачной, решили применить memcache &mdash; прирост скорости ~180%. Какой клевый показатель, но верен лишь в 100% попадании в кеш, таким образом перед нами вырисовывалась перспектива полного рефакторинга системы.</p>
<h3>Немного клиентской оптимизации</h3>
<p>Ну что тут можно рассказать, простое добавление следующих правил в .htaccess сильно облегчило навигацию пользователям, которые хоть раз заходили на сайт:</p>
<pre class="brush: bash;">
FileETag MTime Size

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>А далее все по порядку:</p>
<ul>
<li>Оптимизация изображений для web (есть такой пункт в Photoshop) &mdash; 40% на всех JPEG фалах</li>
<li>Спрайты &mdash; кропотливая работа, десятки обращений к серверу можно свести к единицам</li>
<li>Жмем JavaScript и CSS &mdash; ~50%</li>
<li>И последним пунктом &mdash; nginx для всего этого добра</li>
</ul>
<h3>Zend Framework</h3>
<p>А теперь расскажу о том, как проект медленно переезжает на Zend Framework. Начинается всё с простой проверки в index.php (о да в нашей системе одна точка входа):</p>
<pre class="brush: php;">
// список модулей, которые уже отрефакторили
$modules = array (
    '/search/',
    '/about/'
);

$path = $_SERVER['REQUEST_URI'];

// нас устроила такая простая проверка,
// но запрос вида /search/?... уже не будет обрабатываться
if(in_array($path, $modules)) {
    // подключаем ZF (внутри стандартный код из сгенерированного public/index.php)
    require 'loader.php';
    exit();
}

// а эта будет
foreach ($modules as $module) {
    if (strpos($path, $module) === 0) {
        require 'loader.php';
        exit();
    }
}
</pre>
<p>Если у нас не одна точка входа, то в каждом файле, которые были затронуты делаем простую вставку:</p>
<pre class="brush: php;">
$_SERVER['REQUEST_URI'] = str_replace($_SERVER['PHP_SELF'], '/admin/', $_SERVER['REQUEST_URI']);
require 'loader.php';
exit();
</pre>
<p>Что-бы забыть &laquo;глобальный&raquo; ужас, жизненно-необходимые переменный были закинуты в Zend_Registry (а в дальнейшем закинуты в конфигурационный файл application.ini, где им самое место).</p>
<p>Так же Zend_Translate была скормлена таблица с переводами (см. адаптер array)</p>
<h3>Результат</h3>
<p>Сложно судить о результате, проект находится в разработке, но вот несколько сравнительных замеров:</p>
<table cellspacing="1" class="inline">
<tr>
<th></th>
<th>Время генерации</th>
<th>Время генерации (re)</th>
<th>Время генерации (ZF)</th>
<th>Объем страницы</th>
<th>Объем страницы (ZF)</th>
</tr>
<tr>
<th>Главная страница</th>
<td align="right">4 663ms</td>
<td align="right">2 759ms</td>
<td align="right">&mdash;</td>
<td align="right">699.5Kb</td>
<td align="right">288.0Kb</td>
</tr>
<tr>
<th>Статические страницы</th>
<td align="right">3 115ms</td>
<td align="right">2 008ms</td>
<td align="right">&nbsp;295ms</td>
<td align="right">263.3Kb</td>
<td align="right">166.2Kb</td>
</tr>
<tr>
<th>Cтраница айтема</th>
<td align="right">3 082ms</td>
<td align="right">1 745ms</td>
<td align="right">&nbsp;180ms</td>
<td align="right">589.1Kb</td>
<td align="right">260.8Kb</td>
</tr>
</table>
<p>Еще наглядный скриншот среднего/максимального времени генерации страниц по датам: <a href="http://screencast.com/t/NDY1NGE5">http://screencast.com/t/NDY1NGE5</a></p>
<p><!--c5246b3f2eff43858fc1dea4d499898d--></p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/php/zfconf-feedback/" title="Под впечатлением от ZFConf">Под впечатлением от ZFConf</a></li><li><a href="http://anton.shevchuk.name/php/write-custom-provider-for-zend_tool/" title="Пишем свой провайдер для Zend_Tool">Пишем свой провайдер для Zend_Tool</a></li><li><a href="http://anton.shevchuk.name/php/zfcore-cmf-based-o-zend-framework/" title="ZFCore &#8211; CMF на Zend Frameworkе">ZFCore &#8211; CMF на Zend Frameworkе</a></li><li><a href="http://anton.shevchuk.name/php/zend-framework-conference/" title="Первая в России конференция по Zend Framework">Первая в России конференция по Zend Framework</a></li><li><a href="http://anton.shevchuk.name/php/write-php-framework/" title="Пишем свой PHP Framework">Пишем свой PHP Framework</a></li><li><a href="http://anton.shevchuk.name/php/unit-tests-zend-framework-application/" title="Юнит тестирование приложений на Zend Framework&#8217;е">Юнит тестирование приложений на Zend Framework&#8217;е</a></li><li><a href="http://anton.shevchuk.name/php/zend-framework-hacks/" title="Zend Framework hacks">Zend Framework hacks</a></li><li><a href="http://anton.shevchuk.name/php/zend_dojo-first-steps/" title="Zend_Dojo: первые шаги">Zend_Dojo: первые шаги</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=Tjfo37KhWVo:b6s9YvhfYtU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=Tjfo37KhWVo:b6s9YvhfYtU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/Tjfo37KhWVo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/facing-refucktoring/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/facing-refucktoring/</feedburner:origLink></item>
		<item>
		<title>Обзор Nook от Barnes &amp; Noble</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/4apxVZu2t7M/</link>
		<comments>http://anton.shevchuk.name/my-life/nook-barnes-noble-review/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 16:02:05 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[My Life]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[nook]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1331</guid>
		<description><![CDATA[Стал счастливым обладателем Nook от Barnes &#038; Noble. И дальше буду делиться впечатлениями&#8230; Дабы не было непоняток &#8212; nook я уже перепрошил прошивкой от mynook.ru и было бы правильно отблагодарить их за старания Обзор железки Тут много можно рассказывать, лучше приведу ссылку на техническую спецификацию на официальном сайте, лучше чем они никто не расскажет. От [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/barnes-and-noble-nook-300x300.jpg" alt="" title="Barnes and Noble Nook" width="300" height="300" class="aligncenter size-thumbnail wp-image-1334" /><br />
Стал счастливым обладателем Nook от Barnes &#038; Noble. И дальше буду делиться впечатлениями&#8230;<br />
<span id="more-1331"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<blockquote><p>Дабы не было непоняток &mdash; nook я уже перепрошил <a href="http://mynook.ru/rusificirovannaya-proshivka-dlya-nook/">прошивкой от mynook.ru</a> и было бы правильно <a href="http://mynook.ru/donate/">отблагодарить их за старания</a></p></blockquote>
<h3>Обзор железки</h3>
<p>Тут много можно рассказывать, лучше приведу ссылку на <a href="http://www.barnesandnoble.com/nook/features/techspecs/?cds2Pid=30195">техническую спецификацию</a> на официальном сайте, лучше чем они никто не расскажет.</p>
<p>От себя добавлю:</p>
<ul>
<li>девайс очень приятно держать в руках, тяжеленький, но не в напряг (не так как iPad)</li>
<li>сборка на отлично &mdash; не люфтит, не скрипит</li>
<li>кнопки для перелистывания таки надо нажимать, что очень радует</li>
<li>сенсорный экран нормально реагирует на нажатия, с клавиатурой проблем не возникало</li>
</ul>
<p>Из недостатков:</p>
<ul>
<li>бедная комплектация</li>
<li>свой формат mini-USB &mdash; дежавю</li>
<li>не со всеми micro-SD карточками все гладко, могут быть проблемы (отформатируйте их в FAT32 в обязательном порядке)</li>
<li>SIM карточку просто так не вытащить (но ее и не часто будете менять)</li>
<li>при включенном 3G достаточно быстро разряжается девайс (по крайней мере вне зоны покрытия оператором), но его можно легко выключить (авиарежим)</li>
</ul>
<h3>Поддержка 3G</h3>
<p>Есть и работает, пробовал с UTel. Вот только надо поддержку операторов добавлять ручками.</p>
<p>Инструкция проста:</p>
<ol>
<li>Устанавливаем <a href="http://developer.android.com/sdk/index.html">Android SDK 1.5</a></li>
<li>Подключаем nook по wi-fi к сети и запоминаем IP</li>
<li>Включаем ADB в программах на nook&#8217;е</li>
<li>Используя adb утилиту из SDK выполняем следующее</li>
</ol>
<pre class="brush: bash;">
# соединяемся с nook'ом
adb connect %IP%:5555
# it's shell cap
adb shell
# база данных с настройками
sqlite3 /data/data/com.android.providers.telephony/databases/telephony.db
# просматриваем текущий список
SELECT * FROM carriers;
# добавляем UTel
INSERT INTO carriers (name, numeric, mcc, mnc, apn, current) VALUES ('Ukrtelecom', '25507', '255', '07', '3g.utel.ua', 1);
# проверяем
SELECT * FROM carriers;
</pre>
<p>Если у вас другой другой оператор, то необходимо посмотреть <a href="http://en.wikipedia.org/wiki/Mobile_Network_Code">MCC и MCN код оператора</a>, а так же его APN (точку доступа можно найти на сайте оператора):</p>
<pre class="brush: sql;">
# Beeline
INSERT INTO carriers (name, numeric, mcc, mnc, apn, current) VALUES ('Beeline', '25502', '255', '02', 'internet.beeline.ua', 1);
# Kyivstar
INSERT INTO carriers (name, numeric, mcc, mnc, apn, current) VALUES ('Kyivstar', '25503', '255', '03', '3g.kyivstar.net', 1);
# UTel
INSERT INTO carriers (name, numeric, mcc, mnc, apn, current) VALUES ('Ukrtelecom', '25507', '255', '07', '3g.utel.ua', 1);
</pre>
<blockquote><p>В новой версии прошивки от <a href="http://mynook.ru/anons-obnovleniya-nashej-proshivki-dlya-nook/">mynook.ru обещают программу для настройки 3G</a></p></blockquote>
<h3>Nook и его софт</h3>
<p>Скорость работы не вызывает с моей стороны нареканий, не моментально, но и не утомляет ожиданием. Открывал журнал Фотомастерскую на 50 метров, достаточно быстро.<br />
О форматах:</p>
<ul>
<li>Родной формат &#8211; epub (есть много софта, который перегонит в epub всю вашу библиотеку)</li>
<li>Fb2 читается FBReader&#8217;ом &mdash; в следующей версии еще меньше багов</li>
<li>PDF поддерживается &mdash; вот только журналы особо не почитаешь &mdash; не позумишь</li>
<li>MP3 &mdash; это хорошо, аудиокниги тоже</li>
<li>Картинки это тоже хорошо: JPG, GIF, PNG</li>
</ul>
<p>Хотелось бы:</p>
<ul>
<li>Приложение для заметок</li>
<li>Калькулятор</li>
<li>Twitter клиент</li>
<li>Нормальную RSS читалку, или лучше отдельного клиента для Google Reader&#8217;a</li>
<li>Shell (о да)</li>
</ul>
<p>Поскольку девайс на android&#8217;e то в скором времени появится очень много различного полезного софта.</p>
<blockquote><p>Есть конечно нарекания на прошивку, но дождемся обновления. И да, с кнопок в меню я бы убрал глянец, хватает блеска экрана, зачем еще этот псевдо-объем.</p></blockquote>
<h3>Работа с магазином</h3>
<p>Тут у меня возникло две проблемы:</p>
<ol>
<li>Они не принимают к оплате мою карточку, не с США</li>
<li>Gift Card тоже не получилось использовать</li>
</ol>
<p>Итог &mdash; я огорчен&#8230;</p>
<h3>Немного о цене</h3>
<p>Мне nook+обложка обошелся в 314 долларов, без доставки (девайс привезли знакомые). Сейчас цена упала на $50 и появилась более дешевая Wi-Fi версия. Таким образом можно заполучить хорошую читалку меньше чем за $200 (так что меня жабо то давит, не смотря на Gift Card на $50, которой я не могу воспользоваться):</p>
<ul>
<li>Nook Wi-Fi &mdash; $149</li>
<li>Налог штата Калифорния 9.75% &mdash; $14.5</li>
<li>Доставка через <a href="http://anton.shevchuk.name/internet/my-internet-shopping-and-shipping-with-shipito/">shipito</a> &mdash; ~$22</li>
</ul>
<h3>Обложка Tupper Quote Cover in Leaf</h3>
<p>Чуть-чуть расскажу еще о обложке <a href="http://gifts.barnesandnoble.com/Tupper-Quote-Cover-in-Leaf/e/9781615598762/?cds2Pid=30253">Tupper Quote Cover in Leaf</a>. Книжка покупалась для супруги, для нее же выбрал зелёненькую обложку, и вот что я получил:</p>
<ul>
<li>Качественная кожа молодого дермантина (пережила купание в вине)</li>
<li>На ощупь просто прелесть</li>
<li>Предусмотрены кармашки</li>
<li>Таки не лучший способ крепления</li>
<li>Никак нельзя зафиксировать в закрытом состоянии &#8211; ни веревочки, ни резиночки, ни магнитика</li>
<li>Слишком мягкий &laquo;переплет&raquo; выглядит не очень эстетично</li>
</ul>
<div class="fancy gallery" id="gallery_1331"><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover.jpg" title="Nook and Cover"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook and Cover" title="Nook and Cover" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-2.jpg" title="Nook and Cover 2"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-2-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook and Cover 2" title="Nook and Cover 2" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-side-1.jpg" title="Nook and Cover Front"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-side-1-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook and Cover Front" title="Nook and Cover Front" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-side-2.jpg" title="Nook and Cover Back"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-and-cover-side-2-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook and Cover Back" title="Nook and Cover Back" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-web.jpg" title="Nook Blog"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-web-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook Blog" title="Nook Blog" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-home.jpg" title="Nook Web Home"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-home-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook Web Home" title="Nook Web Home" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-books.jpg" title="Nook Library"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-books-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook Library" title="Nook Library" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-pdf-zend-in-action.jpg" title="Nook PDF Zend Framework in Action"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-pdf-zend-in-action-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook PDF Zend Framework in Action" title="Nook PDF Zend Framework in Action" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-pdf-schema.jpg" title="Nook PDF Schema"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/nook-pdf-schema-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Nook PDF Schema" title="Nook PDF Schema" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/07/barnes-and-noble-nook.jpg" title="Barnes and Noble Nook"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/07/barnes-and-noble-nook-300x300.jpg" width="300" height="300" class="attachment-thumbnail" alt="Barnes and Noble Nook" title="Barnes and Noble Nook" /></a></div>
<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=4apxVZu2t7M:wioCBzWxDm8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=4apxVZu2t7M:wioCBzWxDm8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4apxVZu2t7M:wioCBzWxDm8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4apxVZu2t7M:wioCBzWxDm8:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4apxVZu2t7M:wioCBzWxDm8:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4apxVZu2t7M:wioCBzWxDm8:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4apxVZu2t7M:wioCBzWxDm8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/4apxVZu2t7M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/my-life/nook-barnes-noble-review/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/my-life/nook-barnes-noble-review/</feedburner:origLink></item>
		<item>
		<title>Определение битности ОС из PHP</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/bjUHZLsJWTI/</link>
		<comments>http://anton.shevchuk.name/php/check-os-bits/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 09:59:40 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1317</guid>
		<description><![CDATA[Иногда бывают и такие задачи, мое решение под катом, возможно кто знает более простой способ? switch (true) { case (0x7FFF &#62; (int)(0x7FFF+1)): // 2^15-1 define('PHP_OS_BIT', 16); break; case (0x7FFFFFFF &#62; (int)(0x7FFFFFFF+1)): // 2^31-1 define('PHP_OS_BIT', 32); break; case (0x7FFFFFFFFFFFFFFF &#62; (int)(0x7FFFFFFFFFFFFFFF+1)): // 2^63-1 define('PHP_OS_BIT', 64); break; case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &#62; (int)(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1)): // 2^127-1 define('PHP_OS_BIT', 128); break; default: [...]]]></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" /><br />
Иногда бывают и такие задачи, мое решение под катом, возможно кто знает более простой способ?<br />
<span id="more-1317"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<pre class="brush: php;">
switch (true) {
    case (0x7FFF &gt; (int)(0x7FFF+1)): // 2^15-1
        define('PHP_OS_BIT', 16);
        break;
    case (0x7FFFFFFF &gt; (int)(0x7FFFFFFF+1)): // 2^31-1
        define('PHP_OS_BIT', 32);
        break;
    case (0x7FFFFFFFFFFFFFFF &gt; (int)(0x7FFFFFFFFFFFFFFF+1)): // 2^63-1
        define('PHP_OS_BIT', 64);
        break;
    case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &gt; (int)(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1)): // 2^127-1
        define('PHP_OS_BIT', 128);
        break;
    default:
        define('PHP_OS_BIT', 8);
        break;
}
var_dump(PHP_OS);
var_dump(PHP_OS_BIT);
</pre>
<p>Можно использовать константу <a href="http://php.net/manual/en/reserved.constants.php">PHP_INT_MAX</a>, но есть зависимость от версии PHP:</p>
<pre class="brush: php;">
switch (PHP_INT_MAX) {
    case (0x7FFF): // 2^15-1
        define('PHP_OS_BIT', 16);
        break;
    case (0x7FFFFFFF): // 2^31-1
        define('PHP_OS_BIT', 32);
        break;
    case (0x7FFFFFFFFFFFFFFF): // 2^63-1
        define('PHP_OS_BIT', 64);
        break;
    case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF): // 2^127-1
        define('PHP_OS_BIT', 128);
        break;
    default:
        define('PHP_OS_BIT', 8);
        break;
}
</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=bjUHZLsJWTI:wX8hiRL4NHA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=bjUHZLsJWTI:wX8hiRL4NHA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bjUHZLsJWTI:wX8hiRL4NHA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bjUHZLsJWTI:wX8hiRL4NHA:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bjUHZLsJWTI:wX8hiRL4NHA:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bjUHZLsJWTI:wX8hiRL4NHA:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bjUHZLsJWTI:wX8hiRL4NHA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/bjUHZLsJWTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/check-os-bits/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/check-os-bits/</feedburner:origLink></item>
		<item>
		<title>Мастер-классы по JavaScript’у</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/F0Ktj1rjtDA/</link>
		<comments>http://anton.shevchuk.name/javascript/javascript-master-class/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 07:59:47 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1296</guid>
		<description><![CDATA[В ближайшем времени, в Харькове и Киеве, а также Екатеринбурге и Москве пройдут мастер-классы по JavaScript&#8217;у. Ведущий &#8212; Илья Кантор, создатель http://javascript.ru и http://algolist.manual.ru, в прошлом один из разработчиков фреймворка Dojo Toolkit, человек с большим опытом в создании сложных javascript-приложений. Темы Профессиональное javascript-программирование Сложный AJAX и COMET: тонкости Web 2.0 Мастер-класс по клиентской оптимизации Секреты [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/06/javascript.jpg" alt="" title="JavaScript" width="400" height="400" class="aligncenter size-full wp-image-1302" /></p>
<p>В ближайшем времени, в Харькове и Киеве, а также Екатеринбурге и Москве пройдут мастер-классы по JavaScript&#8217;у. Ведущий &mdash; Илья Кантор, создатель <a href="http://javascript.ru">http://javascript.ru</a> и <a href="http://algolist.manual.ru">http://algolist.manual.ru</a>, в прошлом один из разработчиков фреймворка Dojo Toolkit, человек с большим опытом в создании сложных javascript-приложений.<br />
<span id="more-1296"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<h3>Темы</h3>
<ul>
<li>Профессиональное javascript-программирование</li>
<li>Сложный AJAX и COMET: тонкости Web 2.0</li>
<li>Мастер-класс по клиентской оптимизации</li>
<li>Секреты jQuery</li>
</ul>
<h3>Расписание</h3>
<ul>
<li>Харьков &mdash; 19 и 20 июня</li>
<li>Екатеринбург &mdash; 26 и 27 июня</li>
<li>Москва &mdash; 17 и 18 июля</li>
<li>Киев &mdash; 24 и 25 июля</li>
</ul>
<p>Мероприятия платные, но стоимость не кусается. Узнать больше можете на странице <a href="http://javascript.ru/mk">http://javascript.ru/mk</a>. И да, коль накладок не будет &mdash; встретимся в Харькове ;)</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=F0Ktj1rjtDA:lMUGf13ct00:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=F0Ktj1rjtDA:lMUGf13ct00:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=F0Ktj1rjtDA:lMUGf13ct00:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=F0Ktj1rjtDA:lMUGf13ct00:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=F0Ktj1rjtDA:lMUGf13ct00:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=F0Ktj1rjtDA:lMUGf13ct00:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=F0Ktj1rjtDA:lMUGf13ct00:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/F0Ktj1rjtDA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/javascript/javascript-master-class/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/javascript/javascript-master-class/</feedburner:origLink></item>
		<item>
		<title>jQuery для начинающих. Часть 6. События</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/8u6Sgooil1I/</link>
		<comments>http://anton.shevchuk.name/javascript/jquery-for-beginners-events/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 14:54:03 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=552</guid>
		<description><![CDATA[Прежде чем приступить к прочтению данной статьи, стоит определиться, что из себя представляют события &#8212; для web-странички, событиями будут являться любые действия пользователя &#8211; это и ввод данных с клавиатуры, и передвижения мышки, и конечно же &#8220;клики&#8221; &#8211; всё это и есть события. К событиям можно еще отнести события создаваемые скриптами, т.н. триггеры. Базовые события [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2008/03/jquery-logo.gif" alt="" title="jQuery Logo" width="168" height="146" class="aligncenter size-medium wp-image-167" /></p>
<p>Прежде чем приступить к прочтению данной статьи, стоит определиться, что из себя представляют события &mdash; для web-странички, событиями будут являться любые действия пользователя &#8211; это и ввод данных с клавиатуры, и передвижения мышки, и конечно же &#8220;клики&#8221; &#8211; всё это и есть события. К событиям можно еще отнести события создаваемые скриптами, т.н. триггеры.<br />
<span id="more-552"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<h3>Базовые события</h3>
<p>Начнем с азов. <a href="http://docs.jquery.com/Events">jQuery работает</a> практически со всеми событиями в JavaScript&#8217;е, приведу список функции с небольшими пояснениями:</p>
<ul>
<li><strong>change</strong> &mdash; измение значения элемента (значение, при потери фокуса, элемента отличается от изначального, при получении фокуса) </li>
<li><strong>click</strong> &mdash; клик по элементу (порядок событий &mdash; mousedown, mouseup, click) </li>
<li><strong>dblclick</strong> &mdash; двойной клик по элементу </li>
<li><strong>resize</strong> &mdash; изменение размеров элементов </li>
<li><strong>scroll</strong> &#8211; скроллинг элемента </li>
<li><strong>select</strong> &mdash; выбор текста (актуален только для input[type=text] и textarea)</li>
<li><strong>submit</strong> &mdash; отправка формы </li>
<li><strong>focus</strong> &mdash; фокус на элементе &#8211; актуально для input[type=text], но в современных браузерах работает и с другими элементами </li>
<li><strong>blur</strong> &mdash; фокус ушел с элемента &#8211; актуально для input[type=text] &mdash; срабатывает при клике по другому элементу на странице или по событию клавиатуры (к примеру переключение по tab&#8217;у) </li>
<li><strong>focusin</strong> &mdash; фокус на элементе, данное событие срабатывает на предке элемента, для которого произошло событие focus </li>
<li><strong>focusout</strong> &mdash; фокус ушел с элемента, данное событие срабатывает на предке элемента, для которого произошло событие blur </li>
<li><strong>keydown</strong> &mdash; нажатие клавиши на клавиатуре </li>
<li><strong>keypress</strong> &mdash; нажатие клавиши на клавиатуре (порядок событий &mdash; keydown, keypress, keyup) </li>
<li><strong>keyup</strong> &mdash; отжатие клавиши на клавиатуре </li>
<li><strong>load</strong> &mdash; загрузка элемента (img) </li>
<li><strong>unload</strong> &mdash; выгрузка элемента (window) </li>
<li><strong>mousedown</strong> &mdash; нажатие клавиши мыши </li>
<li><strong>mouseup</strong> &mdash; отжатие клавиши мыши </li>
<li><strong>mousemove</strong> &mdash; движение курсора </li>
<li><strong>mouseenter</strong> &mdash; наведение курсора на элемент, не срабатывает при переходе фокуса на дочерние элементы </li>
<li><strong>mouseleave</strong> &mdash; вывод курсора из элемента, не срабатывает при переходе фокуса на дочерние элементы </li>
<li><strong>mouseover</strong> &mdash; наведение курсора на элемент </li>
<li><strong>mouseout</strong> &mdash; вывод курсора из элемента</li>
</ul>
<p>Опробовать события можно на примере с <a href="http://anton.shevchuk.name/wp-demo/jquery-tutorials-6/mouse.html">событиями мышки</a> и <a href="http://anton.shevchuk.name/wp-demo/jquery-tutorials-6/form.html">элементами формы</a>.</p>
<p>Большинство из перечисленных событий можно имитировать непосредственно из самого скрипта: </p>
<pre class="brush: xml;">
&lt;script lang=&quot;javascript&quot;&gt; $('#menu li').click(); &lt;/script&gt;
</pre>
<h3>Триггеры</h3>
<p>Для работы с триггерами в jQuery предопределены следующие функции: </p>
<ul>
<li><strong>bind</strong> (type, data, fnc) &mdash; добавляет обработчик событий</li>
<li><strong>one</strong> (type, data, fnc) &mdash; добавляет обработчик событий, который сработает лишь раз</li>
<li><strong>trigger</strong> (event, data) &mdash; вызывает обработчики событий</li>
<li><strong>triggerHandler</strong>( event, data) &mdash; вызывает обработчики событий, без вызова события браузера</li>
<li><strong>unbind</strong> (type, fnc) &mdash; удаляет все обработчики событий с элемента</li>
</ul>
<pre class="brush: jscript;">
$('.class').bind('click', function(){
    // что-то делаем
});

// вызываем обработчик
$('.class').trigger('click');

// отключаем обработчик
$('.class').unbind('click');
</pre>
<p>Можно повесить триггер почти на любой объект: </p>
<pre class="brush: jscript;">
var obj = {
    test:function() {
        console.log('obj.test');
    }
}

$(obj).bind('someEvent', function(){
   console.log('obj.someEvent');
   this.test();
});

$(obj).trigger('someEvent');
</pre>
<h3>Пространство имен</h3>
<p>Обычно, когда мы хотим создать/удалить свой обработчик событий, мы пишем следующий код (чуть выше я об этом уже писал): </p>
<pre class="brush: jscript;">
// создаем свой обработчик
$('.class').bind('click', function(){
    // что-то делаем
});
// удаляем все обработчики
$('.class').unbind();
</pre>
<p>Но как всегда, есть ситуации когда нам необходимо отключить не все обработчики (как пример, надо отключить обработку какого-то контрола определенным плагином), в этом случае нам на помощь приходят пространства имен, использовать их достаточно легко: </p>
<pre class="brush: jscript;">
// создаем обработчик
$('.class').bind('click.namespace', function(){
    // что-то делаем
});

// вызываем обработчик
$('.class').trigger('click.namespace');

// удаляем все обработчики в данном пространстве имен
$('.class').unbind('click.namespace');
</pre>
<p>Еще примерчик, вешаем обработчик, который выводит текст в консоль. </p>
<pre class="brush: jscript;">
$('.class').bind('click.namespace', function(){
    console.log('bang');
});
$('.class').trigger('click.namespace'); // вызываем событие, наш обработчик сработает
$('.class').trigger('click');           // тоже работает
$('.class').trigger('click.other');     // событие из другого пространства имен, наш обработчик не будет вызван
</pre>
<p>Так же, есть поддержка нескольких пространств имен (с версии 1.3, если быть точным): </p>
<pre class="brush: jscript;">
$('.class').bind('click.a.b', function(){
    // для пространств a и b
});
$('.class').trigger('click.a'); // вызываем обработчик из пространства a
$('.class').unbind('click.b');  // отменяем обработчик для пространства b
</pre>
<p>Можно одним махом удалить все обработчики с определенного пространства имен: </p>
<pre class="brush: jscript;">
$('.class').bind('click.namespace', function(){}); // обработчик клика
$('.class').bind('blur.namespace', function(){});  // обработчик фокус
$('.class').unbind('.namespace'); // передумали, и все отменили
</pre>
<ul>
<li><a href="http://anton.shevchuk.name/wp-demo/jquery-tutorials-6/triggers.html">Пример использование триггеров и пространства имен</a></li>
<li><a href="http://docs.jquery.com/Namespaced_Events">Официальная документация по пространствам имен</a></li>
</ul>
<h3>Работа с live</h3>
<p>Очень часто при генерации страниц AJAXом возникает необходимость повесить обработчики событий на новые элементы в DOMе, для этой цели служит метод <a href="http://docs.jquery.com/Events/live">live</a> (первый параметр &mdash; имя события, второй &mdash; обработчик). </p>
<p>Приведу пример &mdash; есть следующая задача:</p>
<ol>
<li>все внутренние ссылки на страницы должны подгружать контент AJAXом в элемент с id=content </li>
<li>правило №1 верно для ссылок из подгруженного контента</li>
</ol>
<p>Реализовать первое требование достаточно просто: </p>
<pre class="brush: jscript;">
$('a[href^=/]').click(function(event){
    $('#content').load($(this).attr('href'));
    return false; // эквивалентно вызову event.preventDefault(); и event.stopPropagation();
});
</pre>
<p>Выполнить второе правило тоже легко, достаточно слегка модифицировать предыдущий пример: </p>
<pre class="brush: jscript;">
$('a[href^=/]').live('click', function(event){
    $('#content').load($(this).attr('href'));
    event.preventDefault(); // отменяем действие по умолчанию, но не трогаем bubbling - чтобы не мешать другим обработчикам
});
</pre>
<blockquote><p>
<strong>Поддерживаемые события</strong>: click, dblclick,  mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup, change (1.4), submit (1.4), focusin (1.4), focusout (1.4), mouseenter (1.4),  mouseleave (1.4)<br />
<strong>Нет поддержки</strong>: blur, focus, change, submit
</p></blockquote>
<p>В противовес функции <a href="http://docs.jquery.com/Events/live">live</a> существует функция <a href="http://docs.jquery.com/Events/die">die</a> &mdash; она убирает отслеживание событий для вновь появившихся элементов.</p>
<h3>Touch события</h3>
<p>Смартфоны с большим сенсорным экраном &mdash; это уже не редкость, вот и web-индустрия начинает адаптироваться под пользователей того же iPhone, если же вам понадобилось подобная адаптация, то вам пригодится следующая информация: </p>
<p>События в JavaScript&#8217;е: </p>
<ul>
<li><strong>touchstart</strong> &#038;mdash аналогично mousedown</li>
<li><strong>touchmove</strong> &#038;mdash mousemove </li>
<li><strong>touchend</strong> &#038;mdash mouseup </li>
<li><strong>touchcancel</strong> &#038;mdash аналогии нет</li>
</ul>
<p>О том как с ними работать, можно подчерпнуть из статей <a href="http://rossboucher.com/2008/08/19/iphone-touch-events-in-javascript/">iPhone Touch Events in JavaScript</a> и <a href="http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone/">Touching and Gesturing on the iPhone</a></p>
<p>Если же вернутся к CSS, то для того же iPhone подключение внешнего CSS файла будет выглядеть следующим образом: </p>
<pre class="brush: xml;">
&lt;link rel=&quot;stylesheet&quot; href=&quot;iphone.css&quot; type='text/css' media='only screen and (max-device-width: 480px)' /&gt;
</pre>
<p>Или в самом CSS: </p>
<pre class="brush: css;">
@media only screen and (max-device-width: 480px) {
  .sidebar {
    display: none;
  }
}
</pre>
<p>Подробнее читайте в статье <a href="http://www.sitepoint.com/article/iphone-development-12-tips/">iPhone Development: 12 Tips To Get You Started</a> (<a href="http://interpretor.ru/iphone_dev">перевод был тут</a>)</p>
<h3>Цикл статей</h3>
<ol>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners/">jQuery для начинающих</a></li>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-2/">jQuery для начинающих. Часть 2. JavaScript Меню</a></li>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-ajax/">jQuery для начинающих. Часть 3. AJAX</a></li>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-selectors/">jQuery для начинающих. Часть 4. Селекторы</a></li>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-effects/">jQuery для начинающих. Часть 5. Эффекты</a></li>
<li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-events/">jQuery для начинающих. Часть 6. События</a></li>
</ol>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/javascript/a-sexy-images-jquery-plugin/" title="(a) Sexy Images jQuery плагин">(a) Sexy Images jQuery плагин</a></li><li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-effects/" title="jQuery для начинающих. Часть 5. Эффекты">jQuery для начинающих. Часть 5. Эффекты</a></li><li><a href="http://anton.shevchuk.name/javascript/jquery-iphone-ui/" title="jQuery iPhone UI">jQuery iPhone UI</a></li><li><a href="http://anton.shevchuk.name/javascript/jquery-datagrid-plugins/" title="10 jQuery Datagrid плагинов">10 jQuery Datagrid плагинов</a></li><li><a href="http://anton.shevchuk.name/javascript/jquery-for-beginners-selectors/" title="jQuery для начинающих. Часть 4. Селекторы">jQuery для начинающих. Часть 4. Селекторы</a></li><li><a href="http://anton.shevchuk.name/javascript/a-slideshow-plugin-for-wordpress/" title="(a) Slideshow плагин для Wordpress">(a) Slideshow плагин для Wordpress</a></li><li><a href="http://anton.shevchuk.name/javascript/a-slideshow-jquery-plugin/" title="(a) Slideshow &#8211; jQuery плагин для организации слайд-шоу">(a) Slideshow &#8211; jQuery плагин для организации слайд-шоу</a></li><li><a href="http://anton.shevchuk.name/php/jquery-php-update-to-08-version/" title="jQuery-PHP обновление до версии 0.8">jQuery-PHP обновление до версии 0.8</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=8u6Sgooil1I:_iQKpEpX5u8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=8u6Sgooil1I:_iQKpEpX5u8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/8u6Sgooil1I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/javascript/jquery-for-beginners-events/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/javascript/jquery-for-beginners-events/</feedburner:origLink></item>
		<item>
		<title>Конференция Symfony Camp UA 2010</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/HQWAr_FRYt8/</link>
		<comments>http://anton.shevchuk.name/php/symfony-camp-ua-2010/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 15:57:22 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1276</guid>
		<description><![CDATA[Анонс конференции по Symfony PHP Framework, которая состоится 3 июля 2010 года в г.Киев. Участие в конференции – бесплатное. Конференция ориентирована как на профессиональных веб-разработчиков, так и начинающих. Мероприятие будет интересным местом для общения программистов и руководителей интернет-проектов, которые используют или планируют использовать фреймворк Symfony, где можно будет пообщаться, поделиться своим опытом, получить новые знакомства. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/06/symfonycamp-ua-2010-300x168.png" alt="" title="Конференция Symfony Camp UA 2010" width="300" height="168" class="aligncenter size-full wp-image-1277" /></p>
<p>Анонс конференции по <a href="http://www.symfony-project.org/" target="_blank">Symfony PHP Framework</a>, которая состоится 3 июля 2010 года в г.Киев. Участие в конференции – бесплатное.<br />
<span id="more-1276"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p>Конференция ориентирована как на профессиональных веб-разработчиков, так и начинающих. Мероприятие будет интересным местом для общения программистов и руководителей интернет-проектов, которые используют или планируют использовать фреймворк Symfony, где можно будет пообщаться, поделиться своим опытом, получить новые знакомства. <a href="http://symfonycamp.org.ua/register/" target="_blank">Зарегистрироваться</a> на мероприятие.</p>
<h3>Планируемые доклады</h3>
<ul>
<li>Перевод боевого сайта с ветки 1.0 на ветку 1.4 &mdash; Руслан Ханов (Россия, Новосибирск)</li>
<li>Как мы делали langwhich.com и unique-shopper.com? &mdash; Денис Пищенко, Дмитрий Одуло (Украина, Харьков)</li>
<li>Symfony как платформа для open-source проектов (Sympal, Apostrophe, Diem) &mdash; Александр Демченко (Украина, Харьков)</li>
<li>Многоязычные сайты на Symfony. Проблемы и их решения  &mdash; Игорь Бровченко (Украина, Киев)</li>
<li>Сontinuous Integration для Symfony &mdash; Игорь Бровченко (Украина, Киев)</li>
<li>LESS, SASS, HAML: 4 буквы, изменившие frontend development &mdash; Константин Кудряшов (Белоруссия, Минск)</li>
<li>Symfony Task – задачи батча (пакетной обработки). Как использовать, как улучшить &mdash; Александр Безрученко (Россия, Таганрог)</li>
<li>Кастомизация генераторов в Symfony 1.3/1.4. Эффективное управление функционалом и структурой плагинов &mdash; Николай Зык (Украина, Киев)</li>
<li>Философия сервисов. Практическое применение в Symfony 1.3/1.4 &mdash; Николай Зык (Украина, Киев)</li>
<li>Symfony 2 – перезагрузка? &mdash; Александр Демченко (Украина, Харьков)</li>
<li>Этапы разработки реального проекта на Symfony 2 + Doctrine 2 &mdash; Александр Скорней (Украина, Киев)</li>
<li>Внедрение компонента templating в существующий проект &mdash; Станислав Сметанин (Россия, Ижевск)</li>
</ul>
<h3>Подробности и новости</h3>
<ul>
<li>Сайт конференции: <a href="http://symfonycamp.org.ua/" target="_blank">symfonycamp.org.ua</a></li>
<li>Twitter: <a href="http://twitter.com/symfonycampua" target="_blank">@SymfonyCampUa</a></li>
</ul>
<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=HQWAr_FRYt8:XrXjXKLs8dc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=HQWAr_FRYt8:XrXjXKLs8dc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=HQWAr_FRYt8:XrXjXKLs8dc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=HQWAr_FRYt8:XrXjXKLs8dc:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=HQWAr_FRYt8:XrXjXKLs8dc:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=HQWAr_FRYt8:XrXjXKLs8dc:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=HQWAr_FRYt8:XrXjXKLs8dc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/HQWAr_FRYt8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/php/symfony-camp-ua-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/php/symfony-camp-ua-2010/</feedburner:origLink></item>
		<item>
		<title>Сравниваем производительность JavaScript фреймворков</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/4BFyZv-BAdc/</link>
		<comments>http://anton.shevchuk.name/javascript/compare-perfomance-javascript-frameworks/#comments</comments>
		<pubDate>Mon, 31 May 2010 09:06:05 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Perfomance]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1252</guid>
		<description><![CDATA[Давненько я не сравнивал производительность JavaScript фреймворков, пора это исправить, и обновить данные двухгодичной давности. В качестве инструмента я взял тест SlickSpeed и установил на свой хостинг, в списке испытуемых оказались следующие фреймворки: Dojo 1.4.3 JQuery 1.4.2 MooTools 1.2.4 Prototype 1.6.1 и 1.7.2 ExtJS Core 3.1 YUI 3.1.1 А так же браузеры, установленные на моей [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2008/11/speedometer.jpg" alt="" title="Speedometer" width="350" height="284" class="aligncenter size-full wp-image-648" /><br />
Давненько я не сравнивал производительность JavaScript фреймворков, пора это исправить, и обновить <a href="http://anton.shevchuk.name/javascript/perfomance-javascript-frameworks/">данные двухгодичной давности</a>.<br />
<span id="more-1252"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p>В качестве инструмента я взял тест SlickSpeed и <a href="http://slickspeed.hohli.com/">установил на свой хостинг</a>, в списке испытуемых оказались следующие фреймворки:</p>
<ul>
<li><a href="http://dojotoolkit.org/">Dojo 1.4.3</a></li>
<li><a href="http://jquery.com/">JQuery 1.4.2</a></li>
<li><a href="http://mootools.net/">MooTools 1.2.4</a></li>
<li><a href="http://www.prototypejs.org/">Prototype 1.6.1 и 1.7.2</a></li>
<li><a href="http://www.extjs.com/products/core/">ExtJS Core 3.1</a></li>
<li><a href="http://developer.yahoo.com/yui/3/">YUI 3.1.1</a></li>
</ul>
<p>А так же браузеры, установленные на моей системе:</p>
<ul>
<li>Mozilla Firefox 3.6.3</li>
<li>Opera 10.53</li>
<li>Google Chrome 5.0.375.55 beta</li>
<li>Safari 4.0.3</li>
<li>Internet Explorer 8.0</li>
</ul>
<h3>Результаты тестирования</h3>
<p>Все тесты проводил 5 раз &mdash; для достоверности (т.е. с учетом алгоритма тестирование, результат &mdash; среднее значение от 30 запусков). Все расширения браузеров были отключены. Результаты приведены в миллисекундах.</p>
<table cellspacing="1" class="inline">
<tr>
<th width="160px"></th>
<th width="80px">Dojo 1.4.3</th>
<th width="80px">jQuery 1.4.2</th>
<th width="80px">MooTools 1.2.4</th>
<th width="80px">Prototype 1.6.1</th>
<th width="80px">Prototype 1.7.2</th>
<th width="80px">ExtJS Core 3.1</th>
<th width="80px">YUI 3.1.1</th>
<th width="80px">Avg</th>
</tr>
<tr>
<th>Firefox 3.6.3</th>
<td align="center">62,6</td>
<td align="center">52,6</td>
<td align="center">89,4</td>
<td align="center">68,4</td>
<td align="center">42,8</td>
<td align="center">109,2</td>
<td align="center">54,6</td>
<th>68,51</th>
</tr>
<tr>
<th>Opera 10.53</th>
<td align="center">37,2</td>
<td align="center">33,2</td>
<td align="center">61,6</td>
<td align="center">45,2</td>
<td align="center">34,2</td>
<td align="center">70,2</td>
<td align="center">35,6</td>
<th>45,31</th>
</tr>
<tr>
<th>Google Chrome 5.0</th>
<td align="center">18,20</td>
<td align="center">13,60</td>
<td align="center">59,40</td>
<td align="center">24,60</td>
<td align="center">13,60</td>
<td align="center">45,00</td>
<td align="center">19,60</td>
<th>27,71</th>
</tr>
<tr>
<th>Safari 4.0.3</th>
<td align="center">19,00</td>
<td align="center">14,80</td>
<td align="center">56,40</td>
<td align="center">20,20</td>
<td align="center">13,00</td>
<td align="center">64,80</td>
<td align="center">18,40</td>
<th>29,51</th>
</tr>
<tr>
<th>Internet Explorer 8.0</th>
<td align="center">106,40</td>
<td align="center">97,00</td>
<td align="center">371,80</td>
<td align="center">559,40</td>
<td align="center">135,80</td>
<td align="center">276,60</td>
<td align="center">518,40</td>
<th>295,06</th>
</tr>
<tr>
<th>Avg</th>
<th>48,68</th>
<th>42,24</th>
<th>127,72</th>
<th>143,56</th>
<th>47,88</th>
<th>113,16</th>
<th>129,32</th>
<th></th>
</tr>
</table>
<p>Сводный график полученных данных:<br />
<img src="http://chart.apis.google.com/chart?cht=bvg&#038;chs=700x400&#038;chd=s:EDGFDHE,CBGCBFC,GFJHELF,LKm5Oc1,CBGCBHC&#038;chdl=Opera%2010.53|Google%20Chrome%205.0|Firefox%203.6.3|IE%208.0|Safari%204.0.3&#038;chco=fa0000,7a7aff,ff9900,0000ff,8a8a8a,CCFFFF,CCFF00,CCCCCC&#038;chxt=y,x&#038;chxl=1:|Dojo|jQuery|MooTools|Prototype%201.6.1|Prototype%201.7.2|ExtJS%20Core|YUI&#038;chxs=0,00066e,10,-1|1,001c69,10,0&#038;chxr=0,0,600&#038;chf=bg,ls,90,FFFFFF,0.1,FFFFFF,0.1|c,s,FFFFFF&#038;chbh=10,2,20&#038;chg=14.3,10,6,2,0,0&#038;chtt=JavaScript%20Framework%20Perfomance&#038;chts=000000,12&#038;max=600&#038;agent=hohli.com" alt="Chart build on http://charts.hohli.com" class="aligncenter"/></p>
<p>Отбросим IE, а то он сильно портит картину:<br />
<img src="http://chart.apis.google.com/chart?cht=bvg&#038;chs=700x400&#038;chd=s:WRhbRmW,LGhLGbL,hbxmW8b,LGhLGmL&#038;chdl=Opera%2010.53|Google%20Chrome%205.0|Firefox%203.6.3|Safari%204.0.3&#038;chco=fa0000,7a7aff,ff9900,8a8a8a,CCFFFF,CCFF00,CCCCCC&#038;chxt=y,x&#038;chxl=1:|Dojo|jQuery|MooTools|Prototype%201.6.1|Prototype%201.7.2|ExtJS%20Core|YUI&#038;chxs=0,00066e,10,-1|1,001c69,10,0&#038;chxr=0,0,600&#038;chf=bg,ls,90,FFFFFF,0.1,FFFFFF,0.1|c,s,FFFFFF&#038;chbh=14,1,20&#038;chg=14.3,10,6,2,0,0&#038;chtt=JavaScript%20Framework%20Perfomance&#038;chts=000000,12&#038;max=110&#038;agent=hohli.com" alt="Chart build on http://charts.hohli.com" class="aligncenter" /></p>
<h3>Выводы</h3>
<p>Самым быстрым фреймворком оказывается jQuery:</p>
<ol>
<li>jQuery 1.4.2 &mdash; 42,24 мс</li>
<li>Prototype 1.7.2 &mdash; 47,88 мс</li>
<li>Dojo 1.4.3 &mdash; 48,68 мс</li>
<li>ExtJs Core 3.1.0 &mdash; 113,16 мс</li>
<li>MooTools 1.2.4 &mdash; 127,72 мс</li>
<li>YUI 3.1.1 &mdash; 129,32 мс</li>
<li>Prototype 1.6.1 &mdash; 143,56 мс</li>
</ol>
<p>И в &laquo;медальном зачете&raquo; картина та же &mdash; Prototype совсем чуть-чуть отстает:</p>
<table cellspacing="1" class="inline">
<tr>
<th width="160px"></th>
<th width="80px">Dojo 1.4.3</th>
<th width="80px">jQuery 1.4.2</th>
<th width="80px">MooTools 1.2.4</th>
<th width="80px">Prototype 1.6.1</th>
<th width="80px">Prototype 1.7.2</th>
<th width="80px">ExtJS Core 3.1</th>
<th width="80px">YUI 3.1.1</th>
</tr>
<tr>
<th>Firefox 3.6.3</th>
<td align="center">4</td>
<td align="center">2</td>
<td align="center">6</td>
<td align="center">5</td>
<td align="center">1</td>
<td align="center">7</td>
<td align="center">3</td>
</tr>
<tr>
<th>Opera 10.53</th>
<td align="center">4</td>
<td align="center">1</td>
<td align="center">6</td>
<td align="center">5</td>
<td align="center">2</td>
<td align="center">7</td>
<td align="center">3</td>
</tr>
<tr>
<th>Chrome 5.0</th>
<td align="center">3</td>
<td align="center">1</td>
<td align="center">7</td>
<td align="center">5</td>
<td align="center">1</td>
<td align="center">6</td>
<td align="center">4</td>
</tr>
<tr>
<th>Safari 4.0.3</th>
<td align="center">4</td>
<td align="center">2</td>
<td align="center">6</td>
<td align="center">5</td>
<td align="center">1</td>
<td align="center">7</td>
<td align="center">3</td>
</tr>
<tr>
<th>IE 8.0</th>
<td align="center">2</td>
<td align="center">1</td>
<td align="center">5</td>
<td align="center">7</td>
<td align="center">3</td>
<td align="center">4</td>
<td align="center">6</td>
</tr>
<tr>
<th>Total</th>
<th>17</th>
<th>7</th>
<th>30</th>
<th>27</th>
<th>8</th>
<th>31</th>
<th>19</th>
</tr>
</table>
<p>А среди самых быстрых браузеров &mdash; Google Chrome, на пятки наступает Safari:</p>
<ol>
<li>Google Chrome 5.0 &mdash; 27,71 мс</li>
<li>Safari 4.0.3 &mdash; 29,51 мс</li>
<li>Opera 10.53 &mdash; 45,31 мс</li>
<li>Mozilla Firefox 3.6.3 &mdash; 68,51 мс</li>
<li>Internet Explorer 8.0 &mdash; 295,06 мс</li>
</ol>
<p>А в &laquo;медальном зачете&raquo; они обменялись местами:</p>
<table cellspacing="1" class="inline">
<tr>
<th width="160px"></th>
<th width="80px">Dojo</th>
<th width="80px">jQuery</th>
<th width="80px">MooTools</th>
<th width="80px">Prototype</th>
<th width="80px">Prototype</th>
<th width="80px">ExtJS Core</th>
<th width="80px">YUI</th>
<th width="80px">Total</th>
</tr>
<tr>
<th>Firefox 3.6.3</th>
<td align="center">4</td>
<td align="center">4</td>
<td align="center">4</td>
<td align="center">4</td>
<td align="center">4</td>
<td align="center">4</td>
<td align="center">4</td>
<th>28</th>
</tr>
<tr>
<th>Opera 10.53</th>
<td align="center">3</td>
<td align="center">3</td>
<td align="center">3</td>
<td align="center">3</td>
<td align="center">3</td>
<td align="center">3</td>
<td align="center">3</td>
<th>21</th>
</tr>
<tr>
<th>Chrome 5.0</th>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">2</td>
<td align="center">2</td>
<td align="center">2</td>
<td align="center">1</td>
<td align="center">2</td>
<th>11</th>
</tr>
<tr>
<th>Safari 4.0.3</th>
<td align="center">2</td>
<td align="center">2</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">2</td>
<td align="center">1</td>
<th>10</th>
</tr>
<tr>
<th>IE 8.0</th>
<td align="center">5</td>
<td align="center">5</td>
<td align="center">5</td>
<td align="center">5</td>
<td align="center">5</td>
<td align="center">5</td>
<td align="center">5</td>
<th>35</th>
</tr>
<tr>
</table>
<p>P.S. Если хотите &#8211; добавлю еще фреймворки для сравнения, оставляйте ссылку и название функции для тестирования&#8230;</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/javascript/perfomance-javascript-frameworks/" title="Производительность JavaScript фреймворков">Производительность JavaScript фреймворков</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=4BFyZv-BAdc:pGGqtLqwvFY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=4BFyZv-BAdc:pGGqtLqwvFY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/4BFyZv-BAdc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/javascript/compare-perfomance-javascript-frameworks/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/javascript/compare-perfomance-javascript-frameworks/</feedburner:origLink></item>
		<item>
		<title>Схема Харьковского метро</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/42rT6z1fNsY/</link>
		<comments>http://anton.shevchuk.name/my-life/kharkiv-metro/#comments</comments>
		<pubDate>Thu, 13 May 2010 14:46:56 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[My Life]]></category>
		<category><![CDATA[ukraine]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1237</guid>
		<description><![CDATA[Когда ездишь в метро и читаешь &#171;Ководство&#187;, то в голову лезут интересные мысли&#8230; Начинаешь всматриваться в окружающих людей, в дизайн рекламных объявлений, и конечно же обращаешь внимание на схему метрополитена. Схема Текущая схема меня немного удручает, к сожалению, я тоже не могу похвастаться на поприще дизайна, но несколько замечание таки будет: необходимо убрать &#171;строящийся и [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/botanichniy-sad.jpg" alt="" title="Ботанический сад" width="400" height="236" class="aligncenter size-full wp-image-1249" /></p>
<p>Когда ездишь в метро и читаешь &laquo;<a href="http://store.artlebedev.ru/books/design/kovodstvo2/">Ководство</a>&raquo;, то в голову лезут интересные мысли&#8230;<br />
<span id="more-1237"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p>Начинаешь всматриваться в окружающих людей, в дизайн рекламных объявлений, и конечно же обращаешь внимание на схему метрополитена.</p>
<h2>Схема</h2>
<p><a href="http://www.metro.kharkov.ua/uk/map/index">Текущая схема</a> меня немного удручает, к сожалению, я тоже не могу похвастаться на поприще дизайна, но несколько замечание таки будет:</p>
<ul>
<li>необходимо убрать &laquo;строящийся и перспективные станции&raquo; &#8211; не стоит себе льстить &#8211; маловато в Харькове станций</li>
<li>хватит привязываться к географии города, я 10 лет живу в Харькове и мне она не помогает ориентироваться</li>
<li>надо тщательней выбирать носитель &#8211; прозрачная пленка на стекле не фонтан</li>
<li>убрать подписи транслитом &#8211; шума от них больше чем толку, да и каждый турист использует путеводитель, а не пытается изучать схемы в вагоне (это касается схем конкретных линий метрополитена)</li>
</ul>
<p>От слов к делу &#8211; у меня получилась следующая схема (на <a href="http://www.artlebedev.ru/kovodstvo/business-lynch/">линч</a> лучше не отправлять :):</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/schema.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/schema-720x480.png" alt="" title="Схема Харьковского Метро" width="720" height="480" class="aligncenter size-medium wp-image-1239" /></a></p>
<p>Еще один вариант с иконками:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/schema-2.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/schema-2-720x540.png" alt="" title="Схема Харьковского Метро" width="720" height="540" class="aligncenter size-medium wp-image-1250" /></a></p>
<h2>Иконки</h2>
<p>Как дополнение к названиям станций предлагаю добавить иконки, благо станций у нас не так уж и много, и рядовому горожанину не составит труда их запомнить. Приведу несколько примеров, постарайтесь угадать станции:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-botanicnhiy-sad.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-botanicnhiy-sad-300x300.png" alt="" title="Ботанический сад" width="300" height="300" class="alignleft size-thumbnail wp-image-1240" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-naukova.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-naukova-300x300.png" alt="" title="Научная" width="300" height="300" class="alignleft size-thumbnail wp-image-1242" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-holodna-gora.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-holodna-gora-300x300.png" alt="" title="Холодная Гора" width="300" height="300" class="alignleft size-thumbnail wp-image-1241" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-pivdenny-vokzal.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-pivdenny-vokzal-300x300.png" alt="" title="Южный Вокзал" width="300" height="300" class="alignleft size-thumbnail wp-image-1243" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-radyanskya.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-radyanskya-300x300.png" alt="" title="Пролетарская" width="300" height="300" class="alignleft size-thumbnail wp-image-1245" /></a><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-radyanskoi-armii.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-radyanskoi-armii-300x300.png" alt="" title="Советской Армии" width="300" height="300" class="alignleft size-thumbnail wp-image-1244" /></a></p>
<p><br class="clearing"/><br />
Если носитель позволяет &#8211; то предыдущую схему можно совместить с иконками&#8230;</p>
<h2>Нумерация выходов</h2>
<p>Это улучшение просто жизненно необходимо, т.к. наверное каждый житель города ошибался с выходами из метро, и это с учетом того, что к ним есть указатели с именами улиц и районов. Пора этот бедлам остановить, давайте просто пронумеруем выходы &mdash; так легко и главное &mdash; однозначно:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/numbers.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/numbers-720x420.png" alt="" title="Нумерация выходов из метро" width="720" height="420" class="aligncenter size-medium wp-image-1246" /></a></p>
<p>Если же есть какие-либо еще выходы:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/numbers-adv.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/numbers-adv-720x562.png" alt="" title="Нумерация выходов из метро" width="720" height="562" class="aligncenter size-medium wp-image-1247" /></a></p>
<p>Совмещаем это с иконками:</p>
<p><a href="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-naukova-exit-3.png"><img src="http://anton.shevchuk.name/wp-content/uploads/2010/05/icon-naukova-exit-3-720x360.png" alt="" title="Научная - 3-ий выход" width="720" height="360" class="aligncenter size-medium wp-image-1248" /></a></p>
<p>Такую иконку можно использовать на схемах <strike>проезда</strike> подхода к чему-либо &mdash; очень удобно.</p>
<h2>Информационное табло</h2>
<p>Не знаю как у вас, но у нас в метро над туннелем висит табло, на котором отображается текущее время, и сколько времени прошло с предыдущей электрички, как по мне &mdash; там должно отображаться время до следующей электрички, да и само табло лучше повесить (продублировать) не в начале платформы, а в конце &mdash; ведь все ожидающие все время заглядывают в туннель &mdash; &laquo;Ах, не видать, а сколько там времени то&raquo; &mdash; вот так стоит толпа и крутит головой туда-обратно&#8230;</p>
<p>P.S. Фотография позаимствована с официального сайта КП &laquo;<a href="http://www.metro.kharkov.ua/">Харьковский метрополитен</a>&raquo;</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/underground/down-by-law/" title="Законы, которые мы нарушаем">Законы, которые мы нарушаем</a></li><li><a href="http://anton.shevchuk.name/underground/clean-up-the-world/" title="Мой город будет чистым!">Мой город будет чистым!</a></li><li><a href="http://anton.shevchuk.name/underground/931-ukraine/" title="9/31 Ukraine">9/31 Ukraine</a></li><li><a href="http://anton.shevchuk.name/underground/ukraine-today/" title="Украина сегодня">Украина сегодня</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=42rT6z1fNsY:bBtPX1k_EuY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=42rT6z1fNsY:bBtPX1k_EuY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/42rT6z1fNsY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/my-life/kharkiv-metro/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/my-life/kharkiv-metro/</feedburner:origLink></item>
		<item>
		<title>uBooks — читалка книг для iPhone</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/3iNRHU43E3c/</link>
		<comments>http://anton.shevchuk.name/company/ubooks-reader-for-iphone/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 15:38:42 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1229</guid>
		<description><![CDATA[Материальчик на моём блоге от родной компании &#8211; обзор приложения uBooks&#8230; Анонс бесплатной версии я уже давненько публиковал на Хабре, с тех пор прошло уже много времени &#8211; много чего изменилось внутри приложения, да и выход нового SDK подбросил новых задач&#8230; Пока обновленная бесплатная версия ждет своего часа, эта версия без рекламы и ограничений уже [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/banner_512x180.jpg" alt="" title="uBooks" width="512" height="180" class="aligncenter size-full wp-image-1230" /></p>
<p>Материальчик на моём блоге от <a href="http://nixsolutions.com">родной компании</a> &#8211; обзор приложения <a href="http://itunes.apple.com/us/app/ubooks-xl/id336355303?mt=8">uBooks</a>&#8230;<br />
<span id="more-1229"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p>Анонс бесплатной версии я уже давненько <a href="http://habrahabr.ru/blogs/iphone/71183/">публиковал на Хабре</a>, с тех пор прошло уже много времени &#8211; много чего изменилось внутри приложения, да и выход нового SDK подбросил новых задач&#8230;</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/ubooks_day.jpg" alt="" title="uBooks Day" width="320" height="480" class="alignnone size-full wp-image-1234" /><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/ubooks_night.jpg" alt="" title="uBooks Night" width="320" height="480" class="alignnone size-full wp-image-1235" /></p>
<blockquote><p>Пока обновленная бесплатная версия ждет своего часа, эта версия без рекламы и ограничений <a href="http://itunes.apple.com/us/app/ubooks-xl/id336355303?mt=8">уже продается за $4.99</a></p></blockquote>
<p>Но все-же о изменениях &#8211; основная задача, поставленная перед командой разработчиков &#8211; это поддержка как можно большего числа форматов в рамках публичного фреймворка, сейчас это: <strong>epub</strong>, <strong>fb2</strong>, <strong>html</strong>, <strong>txt</strong>, <strong>fb2 in zip</strong>.</p>
<p>Поскольку у нас читалка &#8211; то много внимания уделено настройке текста:</p>
<ul>
<li>дневной/ночной режим</li>
<li>размер шрифта</li>
<li>тип шрифта</li>
<li>цвет шрифта/фона</li>
<li>кодировка</li>
</ul>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/ubooks_text_options.jpg" alt="" title="uBooks Text Options" width="320" height="480" class="aligncenter size-full wp-image-1232" /></p>
<p>Еще чуть-чуть настроек и фич приложения:</p>
<ul>
<li>плавная автопрокрутка</li>
<li>анимация при листании</li>
<li>язык приложения</li>
<li>настраиваимые тап зоны</li>
<li>поиск по книге</li>
<li>ручной поврот экрана</li>
<li>книжная полка</li>
<li>поиск по книжной полке</li>
<li>папки</li>
<li>перемещение в книге по проценту</li>
</ul>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/ubooks_settings.jpg" alt="" title="uBooks Settings" width="320" height="480" class="aligncenter size-full wp-image-1233" /></p>
<p>Книги можно заливать одним из следующих способов:</p>
<ul>
<li>http сервер</li>
<li>ftp сервер</li>
<li>web browser</li>
<li>public storage</li>
</ul>
<p>Для тех, кто забыл пополнить свой аккаунт на AppStore прилагаются промокоды (отпишитесь, если взяли какой):</p>
<blockquote><p>
<strike>M33RY7FYA4LF</strike><br />
<strike>7J7RE9RXAW97</strike><br />
<strike>MYFELA4RY4L3</strike><br />
YTRELYEJEMKT<br />
<strike>76YJMKJYEPR6</strike><br />
<strike>TM79EHFJW7PE</strike><br />
<strike>EMFHW3YFWYF6</strike><br />
<strike>LYFJLAPPXY6E</strike><br />
NRFFKRTFLX43<br />
HTA3KEN4PT6K
</p></blockquote>
<p>P.S. Коль вам понравилось данное приложение, то оставьте свой отзыв в AppStore.</p>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/javascript/jquery-iphone-ui/" title="jQuery iPhone UI">jQuery iPhone UI</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=3iNRHU43E3c:BR-oNhm-bD8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=3iNRHU43E3c:BR-oNhm-bD8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/3iNRHU43E3c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/company/ubooks-reader-for-iphone/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/company/ubooks-reader-for-iphone/</feedburner:origLink></item>
		<item>
		<title>Создаем тему для WordPress за 10 минут…</title>
		<link>http://feedproxy.google.com/~r/AntonShevchuk/~3/bj-p19r_m4w/</link>
		<comments>http://anton.shevchuk.name/wordpress/create-wordpress-theme-with-constructor/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 08:06:19 +0000</pubDate>
		<dc:creator>Anton Shevchuk</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[constructor]]></category>

		<guid isPermaLink="false">http://anton.shevchuk.name/?p=1204</guid>
		<description><![CDATA[Это промо-пост своего же продукта &#8211; темы Конструктор для WordPress&#8230; Спонсор поста: LTD-студия &#8211; разработка сайтов На этот раз я не буду просто перечислять все фичи темы, я расскажу о том, как быстро создать свою уникальную тему. Для начала я бы посоветовал все же определится с тематикой сайта, а так же желательно с палитрой цветов. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://anton.shevchuk.name/wp-content/uploads/2009/02/article.png" alt="" title="Wordpress Constructor Theme" width="400" height="334" class="aligncenter size-full wp-image-965" /><br />
Это промо-пост своего же продукта &#8211; <a href="http://wordpress.org/extend/themes/constructor">темы Конструктор для WordPress</a>&#8230;<br />
<span id="more-1204"></span><!-- Banner --></p>
<p align="center" class="ads">
<script type="text/javascript"><!--
google_ad_client = "pub-3214048546347572";
//468x60, создано 29.01.08
google_ad_slot = "3765869732";
google_ad_width = 468;
google_ad_height = 60;
//--></script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<blockquote><p>Спонсор поста: LTD-студия &#8211; <a href="http://ltd-studio.com.ua" title="Разработка сайтов">разработка сайтов</a></p></blockquote>
<p>На этот раз я не буду просто перечислять <a href="http://code.google.com/p/wp-constructor/wiki/ConstructorFeature">все фичи темы</a>, я расскажу о том, как быстро создать свою уникальную тему. Для начала я бы посоветовал все же определится с тематикой сайта, а так же желательно с палитрой цветов. С тематикой &#8211; выберу что-то нейтральное &#8211; ведь лучше гор могут быть только горы&#8230;</p>
<p>Затем следует заняться поиском клипарта для сайта, но поскольку наш бюджет ограничен $0.00, то будем использовать свободные источники &#8211; предпочитаю <a href="http://www.flickr.com/">flickr</a> &#8211; т.к. есть возможность поиска картинок под CC лицензией:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/search_options-598x640.png" alt="" title="Flickr Search Options" width="598" height="640" class="aligncenter size-medium wp-image-1219" /></p>
<p>Из всего многообразия выбрал следующую картинку (слегка ее причесал, по-полам разделил, но особо не заморачивался):<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/preview.jpg" alt="" title="Theme Background" width="700" height="424" class="aligncenter size-full wp-image-1220" /></p>
<p>Разрезав &#8211; залил в тему:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/settings-images.jpg" alt="" title="Settings: images" width="700" height="518" class="aligncenter size-full wp-image-1223" /></p>
<p>Для формировании палитры можно использовать один из следующих сайтов (за основу палитры брал картинку выше):</p>
<ul>
<li><a href="http://www.degraeve.com/color-palette/">http://www.degraeve.com/color-palette/</a></li>
<li><a href="http://www.colorhunter.com/">http://www.colorhunter.com/</a></li>
</ul>
<p>У меня получилась следующая:<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/palette.png" alt="" title="Theme Palette" width="464" height="108" class="aligncenter size-full wp-image-1221" /></p>
<p>Переносим ее в настройки темы:<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/settings-colors.jpg" alt="" title="Settings: colors" width="700" height="365" class="aligncenter size-full wp-image-1222" /></p>
<p>Немного шаманим с CSS:</p>
<pre class="brush: css;">
/* увеличиваем шрифт в заголовке, и чуть-чуть смещаем вниз */
#name {
    margin-top:40px !important;
    font-size:112px !important;
    text-shadow: 0px 0px 4px #777;
}
#description {
    font-size:24px !important;
    font-weight:900;
    text-indent:24px;
}
/* добавляем к ссылкам навигации по паре полосок */
.navigation div {
    margin:0 0 8px;
}
.navigation div a {
    height:24px;
}
.navigation .alignright a {
    border-left: 4px solid #147dbe;
    margin:0 16px 0 0;
    padding-left:8px;
}
.navigation .alignleft a {
    border-right: 4px solid #147dbe;
    margin:0 0 0 16px;
    padding-right:8px;
}
/* изменяем шрифт в футере, чтобы не терялся текст на цветном фоне */
#footer .widget h3,
#footer .widget a {
    color:#fff;
    font-weight:900;
    text-shadow: 0px 0px 1px #333;
}
</pre>
<p>Применяем изменения. После получения удовлетворения от проделанной работы, лучше сохранить тему под своим именем:<br />
<img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/settings-save.jpg" alt="" title="Settings: save" width="700" height="383" class="aligncenter size-full wp-image-1224" /></p>
<p>Всё. У вас своя <a href="http://code.google.com/p/wp-constructor/downloads/list?can=3&#038;q=mountains">уникальная тема</a>:</p>
<p><img src="http://anton.shevchuk.name/wp-content/uploads/2010/04/screenshot.jpg" alt="" title="Screenshot" width="700" height="497" class="aligncenter size-full wp-image-1226" /></p>
<p>Еще полезные сайты &#8211; тут можно скачать текстуры и шаблоны:</p>
<ul>
<li><a href="http://www.w3avenue.com/2009/07/14/free-pattern-and-texture-resources-for-web-designers/">Free Pattern and Texture Resources For Web Designers</a> &#8211; список ресурсов</li>
<li><a href="http://ru-ru.colourlovers.com/patterns/add">COLOURlovers</a> &#8211; генератор текстурок</li>
</ul>
<h3  class="related_post_title">Другие посты на эту тему</h3><ul class="related_post"><li><a href="http://anton.shevchuk.name/wordpress/theme-constructor-for-wordpress-updated/" title="Тема-Конструктор для Wordpress (обновление)">Тема-Конструктор для Wordpress (обновление)</a></li><li><a href="http://anton.shevchuk.name/wordpress/theme-constructor-for-wordpress/" title="Тема-Конструктор для Wordpress">Тема-Конструктор для Wordpress</a></li></ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?i=bj-p19r_m4w:Hdj0l6719Cs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:OFK2qQWC5z4"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=OFK2qQWC5z4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:8IpfsO_AZK8"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=8IpfsO_AZK8" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:NNhfYXXEg9w"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=NNhfYXXEg9w" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/AntonShevchuk?a=bj-p19r_m4w:Hdj0l6719Cs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/AntonShevchuk?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/AntonShevchuk/~4/bj-p19r_m4w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://anton.shevchuk.name/wordpress/create-wordpress-theme-with-constructor/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://anton.shevchuk.name/wordpress/create-wordpress-theme-with-constructor/</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
