<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8221830139710606339</id><updated>2012-01-21T22:10:56.692+04:00</updated><category term='браузеры'/><category term='Gmail'/><category term='Яндекс.Почта'/><category term='Performance'/><category term='XSL'/><category term='JavaScript'/><category term='CSS'/><category term='домашка'/><category term='книги'/><category term='HTML'/><category term='верстка'/><title type='text'>Степан Резников</title><subtitle type='html'>Заметки о веб-разработке</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sreznikov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>78</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5350707633784008417</id><published>2011-08-04T20:26:00.003+04:00</published><updated>2011-08-04T20:29:03.888+04:00</updated><title type='text'>Hunting for geeks</title><content type='html'>&lt;p&gt;Помню в&amp;nbsp;Яндекс.Почте мы прикололись и&amp;nbsp;вывели в&amp;nbsp;консоль браузера сообщение:&lt;br/&gt;&amp;laquo;Любишь заглядывать в&amp;nbsp;консоль? А&amp;nbsp;может и&amp;nbsp;js умеешь писать? http://company.yandex.ru/job/vacancies/interface_dev_mail.xml&amp;raquo;.&lt;/p&gt;

&lt;p&gt;А&amp;nbsp;сегодня случайно заметил на&amp;nbsp;TechCrunch в&amp;nbsp;response headers:&lt;br/&gt;&lt;strong&gt;X-hacker:&lt;/strong&gt; If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.&lt;/p&gt;

&lt;p&gt;Nice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5350707633784008417?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5350707633784008417' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5350707633784008417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5350707633784008417'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2011/08/hunting-for-geeks.html' title='Hunting for geeks'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6626149093219703769</id><published>2011-07-21T01:17:00.005+04:00</published><updated>2011-07-21T02:24:22.080+04:00</updated><title type='text'>Что мне не хватает в Гугл+, Твиттере, Фейсбуке и многих других сервисах</title><content type='html'>&lt;p&gt;Слишком много шума.&lt;/p&gt;
&lt;p&gt;В&amp;nbsp;основную ленту попадают все посты от&amp;nbsp;всех людей, которых я&amp;nbsp;зафрендил/зафоловил. Я&amp;nbsp;же хочу видеть там посты только от&amp;nbsp;близких друзей и&amp;nbsp;супер-интересных мне людей. Все остальное, менее важное, я&amp;nbsp;посмотрю потом, когда поеду на&amp;nbsp;метро и&amp;nbsp;вдруг забуду дома книжку.&lt;/p&gt;
&lt;p&gt;Покажите &lt;em&gt;главное&lt;/em&gt; сначала. Дайте мне возможность контролировать что важно для меня.&lt;/p&gt;
&lt;p&gt;Нет, все сервисы устроены наоборот&amp;nbsp;&amp;mdash; сначала вываливают тебе все говно на&amp;nbsp;которое ты&amp;nbsp;подписался, а&amp;nbsp;ты&amp;nbsp;продираешься сквозь него к&amp;nbsp;важным для тебя постам. Почему ни&amp;nbsp;один сервис не&amp;nbsp;дает возможность начеррипикать важные для меня источники, сформировать must-read-ленту и&amp;nbsp;поставить ее как основную?&lt;/p&gt;
&lt;p&gt;Да, в&amp;nbsp;Гугл+ можно сделать круг &amp;laquo;Супер&amp;raquo;, а в&amp;nbsp;Твиттере&amp;nbsp;&amp;mdash; список &amp;laquo;Пупер&amp;raquo;. Дайте мне поставить это по-дефолту, чтобы я&amp;nbsp;видел это сразу, заходя в&amp;nbsp;сервис с&amp;nbsp;любого компа и&amp;nbsp;любого устройства.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6626149093219703769?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6626149093219703769' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6626149093219703769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6626149093219703769'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2011/07/blog-post.html' title='Что мне не хватает в Гугл+, Твиттере, Фейсбуке и многих других сервисах'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3066420239363385876</id><published>2011-07-14T17:16:00.004+04:00</published><updated>2011-08-03T16:09:15.596+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Неблокирующая загрузка кнопки +1</title><content type='html'>&lt;p&gt;Хотите установить на свой сайт гугловую кнопку +1? Имейте в виду, что она может &lt;a href="http://www.aaronpeters.nl/blog/google-plus1-button-performance-review"&gt;негативно повлиять на скорость загрузки страниц&lt;/a&gt;. В частности, оригинальный сниппет содержит тег &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, который блокирует рендеринг и загрузку последующих ресурсов на странице. К счастью, эта проблема легко решается.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;g:plusone&amp;gt;&amp;lt;/g:plusone&amp;gt;&lt;/code&gt; остается в том месте где должна появиться кнопка. Код неблокирующей загрузки лучше поместить перед закрывающим тегом &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;script&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&amp;gt;&lt;/span&gt;
(&lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;(d, t) {
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;var&lt;/span&gt; g = d.createElement(t),
        s = d.getElementsByTagName(t)[0];
    g.async = &lt;span style='color:#7f0055; font-weight:bold;'&gt;true&lt;/span&gt;;
    g.src = &lt;span style='color:#2a00ff;'&gt;'https://apis.google.com/js/plusone.js'&lt;/span&gt;;
    g.text = &lt;span style='color:#2a00ff;'&gt;'{lang:"nl"}'&lt;/span&gt;;
    s.parentNode.insertBefore(g, s);
}(document, &lt;span style='color:#2a00ff;'&gt;'script'&lt;/span&gt;));
&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;script&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;small&gt;Код неблокирующей загрузки написан &lt;a href="http://mathiasbynens.be/"&gt;Матиасом&lt;/a&gt;, пофиксен для IE мной.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; &lt;a href="http://googlewebmastercentral.blogspot.com/2011/07/1-button-now-faster.html"&gt;Гугл выпустил неблокирующую версию кнопки +1&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3066420239363385876?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3066420239363385876' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3066420239363385876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3066420239363385876'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2011/07/1.html' title='Неблокирующая загрузка кнопки +1'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8266519772511681902</id><published>2010-02-25T02:04:00.002+03:00</published><updated>2010-02-25T02:06:51.726+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='книги'/><title type='text'>Книги по клиентской оптимизации</title><content type='html'>&lt;p&gt;Эти две книги &lt;a href="http://stevesouders.com/"&gt;Стива Содерса&lt;/a&gt; я&amp;nbsp;прочитал еще осенью прошлого года. Вообще для меня вопросы клиентской оптимизации вышли на&amp;nbsp;передний план в&amp;nbsp;прошлом году, что отчасти связано с&amp;nbsp;переходом в&amp;nbsp;Яндекс, где степень повернутости на&amp;nbsp;оптимизации гораздо выше, чем в&amp;nbsp;Студии, отчасти с&amp;nbsp;тем, что сейчас это в&amp;nbsp;целом мощный тренд, и&amp;nbsp;все сообщество веб-разработчиков повернуто на&amp;nbsp;этой теме.&lt;/p&gt;


&lt;h4&gt;&lt;a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/"&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/high-performance-web-sites.png" width="90" height="118" alt="High Performance Web Sites: Essential Knowledge for Front-End Engineers by Steve Souders" border="1" align="right" style="margin: 0 20px 1.2em 20px; border-width: 1px;"/&gt;&lt;/a&gt;Steve Souders - High Performance Web Sites: Essential Knowledge for Front-End Engineers&lt;/h4&gt;

&lt;p&gt;Думаю, что эта книга обязательна к&amp;nbsp;прочтению всеми фронтэндерами. Она небольшая и&amp;nbsp;содержит 14&amp;nbsp;правил, которые помогут сделать ваш сайт быстрее. Конечно, многие правила вы наверняка уже знаете или хотя бы слышали о&amp;nbsp;них, однако после прочтения этой книги все обрывки знаний уложатся в&amp;nbsp;систему, восполнятся какие-то пробелы. Скажем, для меня новыми стали знания про CDN (Content Delivery Networks) и&amp;nbsp;ETags. В&amp;nbsp;завершение Стив устраивает своеобразную &amp;laquo;порку&amp;raquo; десяти крупнейших сайтов и&amp;nbsp;на&amp;nbsp;примере показывает, как определять требующие улучшения места, и&amp;nbsp;каких результатов можно добиться, применив описанные в&amp;nbsp;книге правила.&lt;/p&gt;

&lt;h4 style="clear: both;"&gt;&lt;a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304/"&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/even-faster-web-sites.png" width="90" height="118" alt="Even Faster Web Sites by Steve Souders" border="1" align="right" style="margin: 0 20px 1.2em 20px; border-width: 1px;"/&gt;&lt;/a&gt;Steve Souders - Even Faster Web Sites&lt;/h4&gt;

&lt;p&gt;Хотите выжать из&amp;nbsp;своих сайтов еще больше производительности и&amp;nbsp;каждая миллисекунда у&amp;nbsp;вас на&amp;nbsp;счету? Вторая книга Содерса предлагает нам самые передовые идеи по&amp;nbsp;убыстрению сайтов. В&amp;nbsp;первую очередь она понравится тем, &lt;del&gt;у&amp;nbsp;кого шило в&amp;nbsp;одном месте&lt;/del&gt; кто любит экспериментировать. Зачастую в&amp;nbsp;книге предлагается проблема, возможные подходы к&amp;nbsp;ее решению, за и&amp;nbsp;против каждого подхода, потенциальные засады и&amp;nbsp;пути обхода, и&amp;nbsp;под конец Стив суммирует все свои тесты в&amp;nbsp;дерево решений, которое позволяет выбрать подходящий подход в&amp;nbsp;зависимости от&amp;nbsp;обстоятельств. Несмотря на&amp;nbsp;то, что Содерс сам умеет увлекательно излагать материал, шесть глав написаны приглашенными экспертами (Крокфорд, Закас, Стефанов), что, несомненно, бодрит.&lt;/p&gt;

&lt;p&gt;***&lt;/p&gt;

&lt;p style="clear: both;"&gt;Тем временем загрузил в&amp;nbsp;свою читалку две книги Николая Мациевского&amp;nbsp;&amp;mdash; &amp;laquo;&lt;a href="http://speedupyourwebsite.ru/books/speed-up-your-website/"&gt;Разгони свой сайт&lt;/a&gt;&amp;raquo; и&amp;nbsp;&amp;laquo;&lt;a href="http://speedupyourwebsite.ru/books/reactive-websites/"&gt;Реактивные веб-сайты&lt;/a&gt;&amp;raquo;. Плюс очень жду новую книгу Николаса Закаса &lt;a href="http://www.amazon.com/High-Performance-JavaScript-Nicholas-Zakas/dp/059680279X/"&gt;High Performance JavaScript&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8266519772511681902?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8266519772511681902' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8266519772511681902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8266519772511681902'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2010/02/performance-books.html' title='Книги по клиентской оптимизации'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-9201765216322842424</id><published>2010-02-12T10:20:00.002+03:00</published><updated>2010-02-17T12:51:53.917+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Cоздание элементов из HTML-строк в jQuery 1.4</title><content type='html'>&lt;p&gt;&lt;small&gt;Еще немного на&amp;nbsp;тему &lt;a href="http://sreznikov.blogspot.com/2010/01/supplant.html"&gt;простого шаблонирования в&amp;nbsp;JavaScript&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Используя jQuery, я&amp;nbsp;довольно часто создаю элементы из&amp;nbsp;HTML-строк с&amp;nbsp;последующим добавлением атрибутов и&amp;nbsp;навешиванием обработчиков событий. Примерно так:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"&amp;lt;input/&gt;"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;
    &lt;span style='color:#808030;'&gt;.&lt;/span&gt;attr&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        type&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"text"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
        name&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"city"&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;
    &lt;span style='color:#808030;'&gt;.&lt;/span&gt;val&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"Moscow"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;
    &lt;span style='color:#808030;'&gt;.&lt;/span&gt;focusin&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        $&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;this&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;addClass&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"active"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;
    &lt;span style='color:#808030;'&gt;.&lt;/span&gt;focusout&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        $&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;this&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;removeClass&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"active"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;
    &lt;span style='color:#808030;'&gt;.&lt;/span&gt;appendTo&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"form"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;В jQuery 1.4 есть приятное нововведение:&lt;/strong&gt; вторым аргументом можно передать объект со&amp;nbsp;свойствами создаваемого элемента. Код становится проще и&amp;nbsp;аккуратнее:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"&amp;lt;input/&gt;"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
    type&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"text"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    name&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"city"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    val&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"Moscow"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    focusin&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        $&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;this&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;addClass&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"active"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    focusout&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        $&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;this&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;removeClass&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"active"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;appendTo&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"form"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Этот объект может содержать любые свойства понимаемые методом &lt;code&gt;attr()&lt;/code&gt;, там&amp;nbsp;же можно навесить обработчики событий, а&amp;nbsp;также, не&amp;nbsp;отходя от&amp;nbsp;кассы, можно задать значения для методов &lt;code&gt;val, css, html, text, data, width, height&lt;/code&gt; и&amp;nbsp;&lt;code&gt;offset&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Кроме того, в&amp;nbsp;такой записи неплохо смотрится и&amp;nbsp;более сложный шаблон с&amp;nbsp;вложенным элементом:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"&amp;lt;a/&gt;"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
    href&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"/test/"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    &lt;span style='color:#0000e6;'&gt;"class"&lt;/span&gt;&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"my_link"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    html&lt;span style='color:#800080;'&gt;:&lt;/span&gt; $&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"&amp;lt;img/&gt;"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        src&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;"test.gif"&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
        width&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#008c00;'&gt;60&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
        height&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#008c00;'&gt;30&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    click&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        doSomething&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#808030;'&gt;.&lt;/span&gt;appendTo&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"body"&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-9201765216322842424?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=9201765216322842424' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9201765216322842424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9201765216322842424'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2010/02/creating-elements-from-html-in-jquery.html' title='Cоздание элементов из HTML-строк в jQuery 1.4'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1268304382892494865</id><published>2010-01-27T17:57:00.007+03:00</published><updated>2010-07-27T16:19:53.655+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript Shortcuts Library</title><content type='html'>&lt;p&gt;Выложил библиотеку для создания клавиатурных шорткатов &lt;a href="http://www.stepanreznikov.com/js-shortcuts/"&gt;JavaScript Shortcuts Library&lt;/a&gt; (jQuery plugin). Пригодится при разработке больших веб-приложений, а&amp;nbsp;также написании игр на&amp;nbsp;JavaScript.&lt;/p&gt;

&lt;p&gt;Библиотека приятна и&amp;nbsp;проста в&amp;nbsp;использовании. Добавляем шорткат:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.add({
    type: &lt;span style='color:#2a00ff;'&gt;'down'&lt;/span&gt;,
    mask: &lt;span style='color:#2a00ff;'&gt;'Ctrl+A'&lt;/span&gt;,
    handler: &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;() {
        debug(&lt;span style='color:#2a00ff;'&gt;'Ctrl+A'&lt;/span&gt;);
    }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Добавляем еще один:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.add({
    type: &lt;span style='color:#2a00ff;'&gt;'up'&lt;/span&gt;,
    mask: &lt;span style='color:#2a00ff;'&gt;'Shift+B'&lt;/span&gt;,
    handler: &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;() {
        debug(&lt;span style='color:#2a00ff;'&gt;'Shift+B'&lt;/span&gt;);
    }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Начинаем реагировать на&amp;nbsp;шорткаты:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.start();&lt;/code&gt;&lt;/pre&gt;

&lt;p class="before_list"&gt;Поддерживаются три типа событий, по&amp;nbsp;которым могут срабатывать обработчики:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;down&lt;/code&gt;&amp;nbsp;&amp;mdash; на&amp;nbsp;нажатие клавиши или сочетания клавиш&lt;/li&gt;
&lt;li&gt;&lt;code&gt;up&lt;/code&gt;&amp;nbsp;&amp;mdash; на&amp;nbsp;отпускание&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hold&lt;/code&gt;&amp;nbsp;&amp;mdash; на&amp;nbsp;нажатие и&amp;nbsp;удержание (обработчик будет вызван сразу после нажатия и&amp;nbsp;потом будет вызываться с&amp;nbsp;некоторой периодичностью пока нажата клавиша)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Строка задающая сочетание клавиш должна состоять из&amp;nbsp;имен клавиш разделенных плюсами. Может быть не&amp;nbsp;более одной клавиши отличной от&amp;nbsp;Ctrl, Shift или Alt. Строка нечувствительна к&amp;nbsp;регистру. Примеры: "Esc", "Shift+Up", "ctrl+a".&lt;/p&gt;

&lt;p&gt;Кроме того, можно создавать несколько списков шорткатов, а&amp;nbsp;затем, в&amp;nbsp;зависимости от&amp;nbsp;ситуации на&amp;nbsp;странице, активизировать определенный список.&lt;/p&gt;

&lt;p&gt;Добавляем шорткат в&amp;nbsp;список "another":&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.add({
    type: &lt;span style='color:#2a00ff;'&gt;'hold'&lt;/span&gt;,
    mask: &lt;span style='color:#2a00ff;'&gt;'Shift+Up'&lt;/span&gt;,
    handler: &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;() {
        debug(&lt;span style='color:#2a00ff;'&gt;'Shift+Up'&lt;/span&gt;);
    },
    list: &lt;span style='color:#2a00ff;'&gt;'another'&lt;/span&gt;
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Переключаемся на&amp;nbsp;список шорткатов "another":&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.start(&lt;span style='color:#2a00ff;'&gt;'another'&lt;/span&gt;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Также можно удалять шорткаты:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.remove({
    type: &lt;span style='color:#2a00ff;'&gt;'hold'&lt;/span&gt;,
    mask: &lt;span style='color:#2a00ff;'&gt;'Shift+Up'&lt;/span&gt;,
    list: &lt;span style='color:#2a00ff;'&gt;'another'&lt;/span&gt;
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Останавливаем работу шорткатов (делается unbind навешенных обработчиков событий):&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;$.Shortcuts.stop();&lt;/code&gt;&lt;/pre&gt;

&lt;p class="before_list"&gt;Поддерживаемые клавиши:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Модификаторы: &lt;em&gt;Ctrl, Shift, Alt&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Цифры: &lt;em&gt;0&amp;mdash;9&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Буквы: &lt;em&gt;A&amp;mdash;Z (case-insensitive)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Специальные клавиши: &lt;em&gt;Backspace, Tab, Enter, Pause, CapsLock, Esc, Space, PageUp, PageDown, End, Home, Left, Up, Right, Down, Insert, Delete, F1&amp;mdash;F12, ? (знак вопроса), минус, плюс&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Буду рад замечаниям и&amp;nbsp;предложениям по&amp;nbsp;улучшению.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1268304382892494865?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1268304382892494865' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1268304382892494865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1268304382892494865'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2010/01/js-shortcuts.html' title='JavaScript Shortcuts Library'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1086381717907692788</id><published>2010-01-22T14:44:00.003+03:00</published><updated>2010-01-22T14:45:09.747+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Простое шаблонирование в JavaScript</title><content type='html'>&lt;p&gt;&lt;em&gt;Задача:&lt;/em&gt; в&amp;nbsp;JS на&amp;nbsp;основе имеющихся данных сгенерить блок (кусок хтмл), заполнить его этими данными и&amp;nbsp;вставить в&amp;nbsp;DOM.&lt;/p&gt;

&lt;p&gt;Например, нам нужно создать простой блок с&amp;nbsp;превьюшкой и&amp;nbsp;подписью. Для него мы каким-то образом получили вот такие данные:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; data &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
    url&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'/test/'&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    thumb_src&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'test.gif'&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    thumb_width&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#008c00;'&gt;60&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    thumb_height&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#008c00;'&gt;30&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    caption&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'Трам-парам!'&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В&amp;nbsp;итоге для этих данных хотим получить вот такой хтмл:&lt;/p&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;class&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"preview"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;p&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;class&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"image"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;a&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;href&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"/test/"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;img&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;src&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"test.gif"&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;width&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"60"&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;height&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"30"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;/&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;a&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;p&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;p&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;class&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"caption"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;Трам-парам!&lt;span style='color:#a65700;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;p&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#a65700;'&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Встают вопросы: &lt;strong&gt;в&amp;nbsp;каком виде хранить шаблон и&amp;nbsp;как впердолить в&amp;nbsp;этот шаблон наши данные?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Вручную создавать элементы (createElement) и&amp;nbsp;аппендить их (appendChild) довольно муторно. Получается громоздко и&amp;nbsp;шаблон размазывается тонким слоем по&amp;nbsp;JS-коду.&lt;/p&gt;

&lt;p&gt;Часто делают конкатенацию кусочков шаблона вперемешку с&amp;nbsp;данными:&lt;/p&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; result &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'&amp;lt;div class="preview"&gt;&amp;lt;p class="image"&gt;&amp;lt;a href="'&lt;/span&gt; &lt;span style='color:#808030;'&gt;+&lt;/span&gt; data&lt;span style='color:#808030;'&gt;.&lt;/span&gt;url &lt;span style='color:#808030;'&gt;+&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'"&gt;&amp;lt;img src="'&lt;/span&gt; &lt;span style='color:#808030;'&gt;+&lt;/span&gt; data&lt;span style='color:#808030;'&gt;.&lt;/span&gt;thumb_src &lt;span style='color:#808030;'&gt;+&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'" width="'&lt;/span&gt; &lt;span style='color:#808030;'&gt;+&lt;/span&gt; data&lt;span style='color:#808030;'&gt;.&lt;/span&gt;thumb_width &lt;span style='color:#808030;'&gt;+&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'" height="'&lt;/span&gt; &lt;span style='color:#808030;'&gt;+&lt;/span&gt; data&lt;span style='color:#808030;'&gt;.&lt;/span&gt;thumb_height &lt;span style='color:#808030;'&gt;+&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'"/&gt;&amp;lt;/a&gt;&amp;lt;/p&gt;&amp;lt;p class="caption"&gt;'&lt;/span&gt; &lt;span style='color:#808030;'&gt;+&lt;/span&gt; data&lt;span style='color:#808030;'&gt;.&lt;/span&gt;caption &lt;span style='color:#808030;'&gt;+&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'&amp;lt;/p&gt;&amp;lt;/div&gt;'&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Тоже не&amp;nbsp;ахти&amp;nbsp;&amp;mdash; постоянно путаешься в&amp;nbsp;этом нагромождении одинарных и&amp;nbsp;двойных кавычек, к&amp;nbsp;тому&amp;nbsp;же хочется все-таки иметь шаблон в&amp;nbsp;чистом виде.&lt;/p&gt;

&lt;p&gt;Я&amp;nbsp;использую способ, который подсмотрел в&amp;nbsp;&lt;a href="http://video.yahoo.com/watch/111595/1710607"&gt;лекциях Дугласа Крокфорда&lt;/a&gt;. Добавляем в&amp;nbsp;прототипы объекта &lt;code&gt;String&lt;/code&gt; метод &lt;code&gt;supplant&lt;/code&gt;, который в&amp;nbsp;строке ищет выражения заключенные в&amp;nbsp;фигурные скобки {}. Каждое найденное выражение используется как ключ к&amp;nbsp;переданному объекту, и, если по&amp;nbsp;этому ключу лежит строковое или числовое значение, то&amp;nbsp;выражение в&amp;nbsp;фигурных скобках заменяется этим значением.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#3f7f59;'&gt;/**&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;* supplant() does variable substitution on the string. It scans&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;* through the string looking for expressions enclosed in {} braces.&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;* If an expression is found, use it as a key on the object,&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;* and if the key has a string value or number value, it is&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;* substituted for the bracket expression and it repeats. &lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;&amp;#xa0;*/&lt;/span&gt;
String.prototype.supplant = &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;(o) {
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#7f0055; font-weight:bold;'&gt;this&lt;/span&gt;.&lt;span style='color:#7f0055; font-weight:bold;'&gt;replace&lt;/span&gt;(&lt;span style='color:#2a00ff;'&gt;/&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;{&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;(&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;[&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;^&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;{}&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;]&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;*&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;)&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;}&lt;/span&gt;&lt;span style='color:#2a00ff;'&gt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;g&lt;/span&gt;,
        &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt;(a, b) {
            &lt;span style='color:#7f0055; font-weight:bold;'&gt;var&lt;/span&gt; r = o[b];
            &lt;span style='color:#7f0055; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; r === &lt;span style='color:#2a00ff;'&gt;'string'&lt;/span&gt; || &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; r === &lt;span style='color:#2a00ff;'&gt;'number'&lt;/span&gt; ? r : a;
        }
    );
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь мы можем сделать так:&lt;/p&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; template &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'&amp;lt;div class="preview"&gt;&amp;lt;p class="image"&gt;&amp;lt;a href="{url}"&gt;&amp;lt;img src="{thumb_src}" width="{thumb_width}" height="{thumb_height}"/&gt;&amp;lt;/a&gt;&amp;lt;/p&gt;&amp;lt;p class="caption"&gt;{caption}&amp;lt;/p&gt;&amp;lt;/div&gt;'&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; result &lt;span style='color:#808030;'&gt;=&lt;/span&gt; template&lt;span style='color:#808030;'&gt;.&lt;/span&gt;supplant&lt;span style='color:#808030;'&gt;(&lt;/span&gt;data&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Еще один пример (подстановка данных в&amp;nbsp;сообщение пользователю):&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; template &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'Take train {number} from {from} to {to}.'&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; data &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
    from&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'Madrid'&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    to&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'Barcelona'&lt;/span&gt;&lt;span style='color:#808030;'&gt;,&lt;/span&gt;
    number&lt;span style='color:#800080;'&gt;:&lt;/span&gt; &lt;span style='color:#0000e6;'&gt;'78A'&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; result &lt;span style='color:#808030;'&gt;=&lt;/span&gt; template&lt;span style='color:#808030;'&gt;.&lt;/span&gt;supplant&lt;span style='color:#808030;'&gt;(&lt;/span&gt;data&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1086381717907692788?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1086381717907692788' title='Комментарии: 13'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1086381717907692788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1086381717907692788'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2010/01/supplant.html' title='Простое шаблонирование в JavaScript'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-70060859122899260</id><published>2010-01-05T14:18:00.008+03:00</published><updated>2010-02-14T20:06:34.492+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='книги'/><title type='text'>Coders at Work</title><content type='html'>&lt;p&gt;&lt;a href="http://www.amazon.com/Coders-at-Work-Peter-Seibel/dp/1430219483/"&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/coders-at-work.png" width="150" height="225" alt="Coders at Work by Peter Seibel" border="0" align="right" style="margin: 0 20px 10px 20px;"/&gt;&lt;/a&gt;Этот сборник интервью с&amp;nbsp;известными программистами я&amp;nbsp;решил прочитать по&amp;nbsp;&lt;a href="http://www.codinghorror.com/blog/archives/001305.html"&gt;совету Джеффа Атвуда&lt;/a&gt;, автора клевого блога Coding Horror. Умение Питера Сибела задавать животрепещущие вопросы, помноженное на&amp;nbsp;15&amp;nbsp;самых влиятельных программистов, дало на&amp;nbsp;выходе захватывающую книгу, от&amp;nbsp;которой с&amp;nbsp;трудом отрываешься только в&amp;nbsp;четыре часа ночи.&lt;/p&gt;

&lt;p&gt;Какие скиллы важны для программистов, и&amp;nbsp;как их улучшить? Насколько важно образование, полученное в&amp;nbsp;учебном заведении? На&amp;nbsp;что собеседники Сибела обращают внимание при поиске и&amp;nbsp;найме программистов? Как разобраться в&amp;nbsp;чужом коде? Как улучшить совместную работу с&amp;nbsp;коллегами? Эти и&amp;nbsp;многие другие темы затронуты в&amp;nbsp;книге. Помимо обсуждения общих вопросов, чуваки рассказывают увлекательные истории о&amp;nbsp;проектах, благодаря которым они стали известными.&lt;/p&gt;

&lt;p&gt;Чуть&amp;nbsp;ли не&amp;nbsp;всю книгу хочется цитировать. Я&amp;nbsp;понавыписывал целую кучу цитат, и&amp;nbsp;несколькими из&amp;nbsp;них хочу поделиться с&amp;nbsp;вами (из&amp;nbsp;первых трех интервью с&amp;nbsp;Завински, Фитцпатриком и&amp;nbsp;Крокфордом).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sreznikov.blogspot.com/2010/01/coders-at-work.html#more"&gt;Читать цитаты&lt;/a&gt;&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;h4&gt;Jamie Zawinski&lt;/h4&gt;

&lt;p&gt;&lt;small&gt;Author of XEmacs and early Netscape/Mozilla hacker&lt;/small&gt;&lt;/p&gt;

&lt;h5&gt;О работе в компании Netscape&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;It was really a great environment. I really enjoyed it. Because everyone was so sure they were right, we fought constantly but it allowed us to communicate fast. Someone would lean over your cubicle and say, “What the fuck did you check in; that’s complete bullshit—you can’t do it that way. You’re an idiot.” And you’d say, “Fuck off!” and go look at it and fix it and check it in. We were very abrasive but we communicated fast because you didn’t have to go blow sunshine up someone’s ass and explain to them what you thought was wrong—you could say, “Hey, that’s a load of shit! I can’t use that.” And you’d hash it out very quickly. It was stressful but we got it done pretty quickly.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;О запуске первой версии Netscape&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;That first night when we put up the .96 beta, we were all sitting around the room watching the downloads with sound triggers hooked up to it—that was amazing. A month later two million people were running software I’d written. It was unbelievable. That definitely made it all worthwhile—that we’d had an impact on people’s lives; that their day was more fun or more pleasant or easier because of the work we’d done.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Overengineering и запуск проектов&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; [...] They were being extremely academic about their project. They were trying to approach it from the DOM/DTD side of things. “Oh, well, what we need to do is add another abstraction layer here and have a delegate for this delegate for this delegate. And eventually a character will show up on the screen.”&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Overengineering seems to be a pet peeve of yours.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; Yeah. At the end of the day, ship the fucking thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Folks engaged in overengineering usually say, “Well, once I’ve got this framework in place everything will be easy after that. So I’ll actually save time by doing this.”&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; That is always the theory.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; And there are times when that theory is true, when someone has good sense and the framework isn’t too elaborate, and it does save time. Is there any way you can tell which side of the line you’re on?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; [...] If you spend the time to build the perfect framework that’s going to do what you want and that’s going to carry you from release 1.0 through release 5.0 and everything’s going to be great; well guess what: release 1.0 is going to take you three years to ship and your competitor is going to ship their 1.0 in six months and now you’re out of the game. You never shipped your 1.0 because someone else ate your lunch.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;Your competitor’s six-month 1.0 has crap code and they’re going to have to rewrite it in two years but, guess what: they can rewrite it because you don’t have a job anymore.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;О сходстве программирования и писательства&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Do you find that programming and writing are similar intellectual exercises?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; In some ways, yeah. Programming is obviously much more rigid. But as far as the overall ability to express a thought, they’re very similar. Not rambling, having an idea in your head of what you’re trying to say, and then being concise about it. I think that kind of thinking is the overlap between programming and writing prose.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;О комментариях в коде&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;I always wish people would comment more, though the thing that
makes me cringe is when the comment is the name of the function
rephrased. Function’s called push_stack and the comment says, “This
pushes to the stack.” Thank you.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;You’ve got to say in the comment something that’s not there already.
What’s it for? Either a higher-level or a lower-level description,
depending on what’s most important. Sometimes the most important
thing is, what is this for? Why would I use it? And sometimes the most
important thing is, what’s the range of inputs that this expects?&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Не нужно стесняться собственного незнания чего-либо (моя любимая цитата)&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;[...] I think one thing that’s really important is to not
be afraid of your ignorance. If you don’t understand how something
works, ask someone who does. A lot of people are skittish about that.
And that doesn’t help anybody. Not knowing something doesn’t mean
you’re dumb—it just means you don’t know it yet.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;О самом главном навыке программистов&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Is there a key skill programmers must have?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; Well, curiosity—taking things apart. Wanting to know
what’s going on under the hood. I think that’s really the basis of it.
Without that I don’t think you get very far. That’s your primary way of
acquiring knowledge. Taking something apart and looking at it is how
you learn to build your own. At least for me. I’ve read very few books
about computers. My experience has been digging through source
code or reference manuals. I’ve got a goal and, alright, to do this I
need to know what this thing does and what this thing does. And I’ll
just sort of random-walk through that until I find where I’m going.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Снова о сходстве программирования и писательства&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; [...] So math was never really my forte.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;But I wouldn’t go so far as to say you don’t need that to be a
programmer. There’s obviously different kinds of programming.
Without people who are not like me none of this would exist. But I’ve
always seen much more in common with writing prose than math. It
feels like you’re writing a story and you’re trying to express a concept
to a very dumb person—the computer—who has a limited vocabulary.
You’ve got this concept you want to express and limited tools to
express it with. What words do you use and what does your
introductory and summary statement look like? That sort of thing.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;The issue of taste really fits in there. You can have a piece of text
describing something that describes it correctly or it can describe it
well, with some flair. And the same thing’s true of programs. It can get
the job done or it can also make sense, be put together well.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; And why does that matter? Is that just for the satisfaction of it
or is tasteful code also better in some practical way?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Zawinski:&lt;/strong&gt; To a large degree, tasteful and maintainable are similar. Or
very closely related. One of the things that makes a piece of writing
tasteful is if it’s structured in a way that’s easy to grasp. Are the facts
loaded up at the front or are they scattered around? If you’re referring
back—if you’re flipping through a book, can you figure out where in
the book is the thing you kind of remember? “This was somewhere
near the middle because that’s where he talked about this thing.” Or is
it just scattered all through. And that’s the same sort of thing that
goes on with programming a lot.&lt;/p&gt;&lt;/blockquote&gt;


&lt;h4&gt;Brad Fitzpatrick&lt;/h4&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;small&gt;Writer of LiveJournal, OpenID, memcached, and Perlbal&lt;/small&gt;&lt;/p&gt;

&lt;h5&gt;Отличный совет программистам&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Do you have any advice for self-taught programmers?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; Always try to do something a little harder, that’s outside your
reach. Read code. I heard this a lot, but it didn’t really sink in until later.
There were a number of years when I wrote a lot of code and never read
anyone else’s. Then I get on the Internet and there’s all this open source
code I could contribute to but I was just scared shitless that if it wasn’t my
code and the whole design wasn’t in my head, that I couldn’t dive in and
understand it.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;О соглашениях по стилю написания кода&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; [...] What are the first warning signs of bad code?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; Well, I’m particularly snooty now, having worked at Google
with really strict style guidelines in all languages. On our top six or seven
languages, there’s a really strict style guide that says, “This is how we lay out
our code. This is how we name variables. This is how we do spacing and
indentation, and these patterns and conventions you use, and this is how
you declare a static field.”&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;We’ve started putting these online too, just as a reference for external
contributors contributing to our projects. We wanted to have a
documented policy so we don’t just say, “We don’t like your style.”&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;Now when I work on projects in C, the first thing I do is add a style guide.
Once a project is mature and has a lot of people hacking on it, they’ll have a
style guide. It’s not even always written, but the programmer just respect
the style of code written already. Maybe they don’t like the brace style, but
fuck it, it’s more important to have it consistent within a file, within a
project, than to do it your favorite way.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Как устроен процесс рецензирования кода в Гугле&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; What about code ownership? Is it important for people to own
code individually or is it better for a team to share ownership?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; I don’t think code should be owned. I don’t think anyone
really thinks that. The way it works within Google is that it’s one massive
source tree, one root, and one unified build system across all of it. And so
anyone can go and change anything. But there are code reviews, and
directories have owners, always at least two people, just in case some quits
or is on vacation.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;To check in you need three conditions met: You need someone to review it
and say it looks good. You need to be certified in the language—basically
you’ve proven you know the style of this language—called “readability.” And
then you also need the approval above from somebody in the owner’s file in
that directory. So in the case that you already are an owner of that
directory and you have readability in that language, you just need someone
to say, “Yeah, it looks good.” And it’s a pretty good system, because there
tends to be a minimum of two, up to twenty, thirty owners. Once you work
on a code base for a while, someone just adds you to owners. I think it’s a
great system.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Быть энтузиастом и иметь свои проекты&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; So you’ve hired for your own company, and I assume you’ve been
involved in hiring at Google. How do you recognize a great programmer?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; I often look for people that have done, like, a lot of stuff on
their own that wasn’t asked of them. Not just their school project or just
what their previous employer had them do. Somebody who was passionate
about something and had some side project. How did they maintain it and
how serious did they get with it? Or do they do a lot of quick hacks and
abandon them?&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Все приложения уйдут в веб&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Do you have any interest in writing better desktop software?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; The problem is, no one uses it. You want to write stuff people
use, which comes down to web apps. I lost my laptop the other day and
people were like, “Oh, my God, did you lose stuff?” I had no files on there.
It was an Internet terminal. And it was an encrypted disk so I’m not worried
about my password or cookies or anything like that. People won’t download
programs, I don’t think.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Быть общительным&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; And are there skills apart from programming itself that you think
would-be programmers should develop?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Fitzpatrick:&lt;/strong&gt; There’s communication, but I’m not sure that’s something you
can really practice. Deal with people on mailing lists a lot. Written
communication style goes a long way. But that’s a general life thing, right?
There was some study about who was successful after high school. Was it
the smart kids or the social kids? It turned out that it was the social kids
who ended up making all the money in life, not the people with the good
grades. I thought that was interesting.&lt;/p&gt;&lt;/blockquote&gt;



&lt;h4&gt;Douglas Crockford&lt;/h4&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;small&gt;JSON founder, JavaScript architect at Yahoo!&lt;/small&gt;&lt;/p&gt;

&lt;h5&gt;Читаем код (очень понравилось, предложу ребятам в Яндексе)&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; These days you’re a JavaScript architect and evangelist here at
Yahoo!, so part of your job, presumably, is to tell Yahoo! JavaScript
programmers, “Here’s how you should do it.” Does your job also cover
general good design practice and good coding practice?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; One of the things I’ve been pushing is code reading. I think that
is the most useful thing that a community of programmers can do for each
other—spend time on a regular basis reading each other’s code. There’s a
tendency in project management just to let the programmers go off
independently and then we have the big merge and if it builds then we ship
it and we’re done and we forget about it.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;One of the consequences of that is that if you have weak or confused
programmers you’re not aware of their actual situation until much too late.
And so the risks to the project, that you’re going to have to build with stuff
that’s bad and the delays that that causes, that’s unacceptable. The other
thing is that you may have brilliant programmers on the project who are not
adequately mentoring the other people on the team. Code reading solves
both of those problems.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Can you talk a bit about how you conduct a code reading?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; At each meeting, someone’s responsible for reading their code,
and they’ll walk us through everything, and the rest of us will observe. It’s a
really good chance for the rest of the team to understand how their stuff is
going to have to fit with that stuff.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;We get everybody around the table; everybody gets a stack of paper. We
also blow it up on the screen. And we all read through it together. And
we’re all commenting on the code as we go along. People say, “I don’t
understand this comment,” or, “This comment doesn’t seem to describe the
code.” That kind of stuff can be so valuable because as a programmer you
stop reading your own comments and you’re not aware that you’re
misdirecting the reader. Having the people you work with helping to keep
your code clean is a huge service—you find defects that you never would’ve
found on your own.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;I think an hour of code reading is worth two weeks of QA. It’s just a really
effective way of removing errors. If you have someone who is strong
reading, then the novices around them are going to learn a lot that they
wouldn’t be learning otherwise, and if you have a novice reading, he’s going
to get a lot of really good advice.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;And it shouldn’t be something that we save for the end. Back in the old
days, we would schedule a code reading just as we were finishing a project
and usually it would be canceled because we were late. I now believe that
code reading should be happening all the time throughout the life of the
project. That’s something that took me a while to figure out but there are
so many benefits that come from that.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;For one thing it makes it easier to track the project, because we can actually
see what progress people are making. And we can see much sooner if
they’re going off the rails or not.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;I’ve managed projects where we’re up against a deadline and we had people
saying, “Yeah, I’m almost done,” and then you get the code, and there’s
nothing there, or it’s crap, or whatever, and they’re nowhere close to done.
In management, those are the experiences you hate the most and I think
code reading is the best way of not getting trapped like that.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; So say we’re doing a code reading of some of my code. I bring
printouts and we put it up on the screen. Then what? Do I literally read it
out loud?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; Yeah, go through it line by line, and you’ll be doing
commentary on it. This is what’s supposed to be happening here. If we have
time, we’ll go line by line.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; Do you find that you have to teach people how to do code
readings? I can imagine it’d be hard to find the right balance of being critical
enough to be worthwhile without making the code’s author feel personally
attacked.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; Yeah, it requires a lot of trust on the part of the team
members so there have to be clear rules as to what’s in bounds and what’s
not. If you had a dysfunctional team, you don’t want to be doing this,
because they’ll tear themselves apart. And if you have a dysfunctional team
and you’re not aware of it, this will reveal it pretty quickly. There’s a lot that
you can learn, a lot that’s revealed by this process. It feels unnatural at first,
although once you get into the rhythm of it, it feels extremely natural.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;Another aspect is writing your code such that it can be read. Neatness
counts, as it turns out, and style is important. And all of those things will
increase the quality of the code base going forward and increase the
competence of the programming community.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Читабельность прежде всего&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;[...] I think it’s really difficult to write
good code in a sloppy manner. By good code, I mean it’s going to be
readable. At one level, it doesn’t matter what it does to a machine if I can’t
figure out what it does, so it might turn out that the code is amazing in
terms of its efficiency, or its compactness, or some other metric which I
don’t care about.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;Readability of code is now my first priority. It’s more important than being
fast, almost as important as being correct, but I think being readable is
actually the most likely way of making it correct. So I think it’s probably not
good code and they probably made the wrong trade-offs if the code turned
out to be in the state that it’s not easily readable.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Собираем программы из готовых блоков&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;I think the next leap, we don’t know what the name of it is yet, but I think
it’s something related to mash-ups where we can casually take bits of
program and put them together and immediately make new programs.
We’ve been talking for decades about a model of programming in which we
snapped programs together like LEGO and make stuff. That hasn’t happened
yet. But I think it is starting to happen now and the place it’s happening is in
JavaScript, which is the least likely place.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h5&gt;Снова о том, что надо быть общительным&lt;/h5&gt;
&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; When you’re hiring programmers, how do you recognize the good
ones?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; The approach I’ve taken now is to do a code reading. I invite
the candidate to bring in a piece of code he’s really proud of and walk us
through it.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; And what are you looking for?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; I’m looking for quality of presentation. I want to see what he
thinks is something he’s proud of. I want to see evidence that in fact he is
the author of the thing that he’s defending. I find that is much more effective
than asking them to solve puzzles or trivia questions. I see all that kind of
stuff as useless. But how effectively they can communicate, that’s a skill that
I’m hiring for.&lt;/p&gt;&lt;/blockquote&gt;


&lt;blockquote style="padding: 0.6em 0.6em 1px 0.6em; background-color: #ededd5;"&gt;&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Seibel:&lt;/strong&gt; What about advice for someone who’s actually getting a C.S.
degree who wants to work as a programmer?&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;&lt;strong&gt;Crockford:&lt;/strong&gt; I would focus on the communication aspect. Learn to write;
learn to read.&lt;/p&gt;

&lt;p style="margin: 0 0 0.6em 0;"&gt;My advice to everybody is pretty much the same, to read and write. I
generally don’t hire for specific skills. Until very recently, you couldn’t hire
good JavaScript programmers. They were extremely rare. There are a lot of
really good ones out there now, but that’s a fairly recent thing. So until that
happened, I would just hire for quality. Are you a good Java programmer, a
good C programmer, or whatever? I don’t care. I just want to know that
you know how to put an algorithm together, you understand data
structures, and you know how to document it. If you can do that, you
should be able to figure out JavaScript.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-70060859122899260?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=70060859122899260' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/70060859122899260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/70060859122899260'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2010/01/coders-at-work.html' title='Coders at Work'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7676445338899314581</id><published>2009-12-21T16:16:00.005+03:00</published><updated>2009-12-21T16:22:07.233+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>input type="file" multiple</title><content type='html'>&lt;p&gt;Оказывается, &lt;strong&gt;Safari&amp;nbsp;4, Chrome&amp;nbsp;3 и&amp;nbsp;Firefox&amp;nbsp;3.6 Beta&amp;nbsp;4&lt;/strong&gt; поддерживают выбор сразу нескольких файлов с&amp;nbsp;помощью атрибута &lt;code&gt;multiple&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;input&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;name&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"att"&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;type&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"file"&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;multiple&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"true"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;/&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Сафари рядом с&amp;nbsp;кнопкой показывает количество выбранных файлов, плюс при поднесении мышки вылезает тултип с&amp;nbsp;названиями файлов:&lt;br/&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/multiple-files-safari.png" width="162" height="81" alt="" border="0"/&gt;&lt;/p&gt;

&lt;p&gt;Еще более удивительно то, что &lt;strong&gt;Opera&lt;/strong&gt; уже давно поддерживает multiple-файлы с&amp;nbsp;помощью атрибутов &lt;code&gt;min&lt;/code&gt; и&amp;nbsp;&lt;code&gt;max&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;input&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;name&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"att"&lt;/span&gt;&lt;span style='color:#274796;'&gt; &lt;/span&gt;&lt;span style='color:#074726;'&gt;type&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"file"&lt;/span&gt;&lt;span style='color:#274796;'&gt; min&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"1"&lt;/span&gt;&lt;span style='color:#274796;'&gt; max&lt;/span&gt;&lt;span style='color:#808030;'&gt;=&lt;/span&gt;&lt;span style='color:#0000e6;'&gt;"99"&lt;/span&gt;&lt;span style='color:#a65700;'&gt;/&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;При этом в&amp;nbsp;Опере меняется название кнопки.&lt;/p&gt;

&lt;table border="0" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;Обычный инпут:&lt;br/&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/multiple-files-opera-1.png" width="216" height="32" alt="" border="0"/&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td width="10"&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;С&amp;nbsp;атрибутами &lt;code&gt;min&lt;/code&gt; и&amp;nbsp;&lt;code&gt;max&lt;/code&gt;:&lt;br/&gt;&lt;img src="http://www.stepanreznikov.com/pics/blog/multiple-files-opera-2.png" width="210" height="32" alt="" border="0"/&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Очень хочется верить, что &lt;code&gt;multiple&lt;/code&gt; заимплементируют в&amp;nbsp;IE&amp;nbsp;9. Тогда можно будет, наконец, полностью отказаться от&amp;nbsp;дурацкой флешки.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7676445338899314581?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7676445338899314581' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7676445338899314581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7676445338899314581'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/12/input-type-file-multiple.html' title='input type=&quot;file&quot; multiple'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6825799687671262698</id><published>2009-11-02T00:50:00.006+03:00</published><updated>2009-11-03T11:49:19.321+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='домашка'/><title type='text'>Результаты домашки №1</title><content type='html'>&lt;p&gt;Ну что&amp;nbsp;же, давайте подведем итоги &lt;a href="http://sreznikov.blogspot.com/2009/10/homework-1.html"&gt;первой домашки&lt;/a&gt; :)&lt;/p&gt;

&lt;h4&gt;Задача 1&lt;/h4&gt;

&lt;p&gt;Эта задача вызвала некоторые затруднения почти у&amp;nbsp;всех принявших участие. Я&amp;nbsp;заметил несколько типичных проблем:&lt;/p&gt;

&lt;p&gt;1. &lt;strong&gt;Велосипедизм.&lt;/strong&gt; Как верно заметил nop, задача сводится к&amp;nbsp;классической задаче поиска подстроки в&amp;nbsp;строке. Многие это почувствовали, однако поленились погуглить и&amp;nbsp;решили изобрести свой велосипед. Существует огромное количество &lt;a href="http://www-igm.univ-mlv.fr/~lecroq/string/"&gt;алгоритмов поиска подстроки&lt;/a&gt;, самый простейший (brute force algorithm) можно закодить так:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; subArrayIndex &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;haystack&lt;span style='color:#808030;'&gt;,&lt;/span&gt; needle&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
   &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; i&lt;span style='color:#808030;'&gt;,&lt;/span&gt; j&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
   &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; m &lt;span style='color:#808030;'&gt;=&lt;/span&gt; haystack&lt;span style='color:#808030;'&gt;.&lt;/span&gt;length&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
   &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; n &lt;span style='color:#808030;'&gt;=&lt;/span&gt; needle&lt;span style='color:#808030;'&gt;.&lt;/span&gt;length&lt;span style='color:#800080;'&gt;;&lt;/span&gt;

   &lt;span style='color:#800000; font-weight:bold;'&gt;for&lt;/span&gt; &lt;span style='color:#808030;'&gt;(&lt;/span&gt;i &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;0&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt; i &lt;span style='color:#808030;'&gt;&amp;lt;=&lt;/span&gt; m &lt;span style='color:#808030;'&gt;-&lt;/span&gt; n&lt;span style='color:#800080;'&gt;;&lt;/span&gt; i &lt;span style='color:#808030;'&gt;+=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;1&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
      &lt;span style='color:#800000; font-weight:bold;'&gt;for&lt;/span&gt; &lt;span style='color:#808030;'&gt;(&lt;/span&gt;j &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;0&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt; j &lt;span style='color:#808030;'&gt;&amp;lt;&lt;/span&gt; n &lt;span style='color:#808030;'&gt;&amp;amp;&amp;amp;&lt;/span&gt; needle&lt;span style='color:#808030;'&gt;[&lt;/span&gt;j&lt;span style='color:#808030;'&gt;]&lt;/span&gt; &lt;span style='color:#808030;'&gt;===&lt;/span&gt; haystack&lt;span style='color:#808030;'&gt;[&lt;/span&gt;i &lt;span style='color:#808030;'&gt;+&lt;/span&gt; j&lt;span style='color:#808030;'&gt;]&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt; j &lt;span style='color:#808030;'&gt;+=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;1&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
      &lt;span style='color:#800000; font-weight:bold;'&gt;if&lt;/span&gt; &lt;span style='color:#808030;'&gt;(&lt;/span&gt;j &lt;span style='color:#808030;'&gt;&gt;=&lt;/span&gt; n&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
          &lt;span style='color:#800000; font-weight:bold;'&gt;return&lt;/span&gt; i&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
      &lt;span style='color:#800080;'&gt;}&lt;/span&gt;
   &lt;span style='color:#800080;'&gt;}&lt;/span&gt;

   &lt;span style='color:#800000; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#808030;'&gt;-&lt;/span&gt;&lt;span style='color:#008c00;'&gt;1&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2. &lt;strong&gt;Проверка написанного кода только на&amp;nbsp;входных данных приведенных в&amp;nbsp;задании.&lt;/strong&gt; Каждое второе решение выдавало правильный результат для массивов приведенных в&amp;nbsp;задании в&amp;nbsp;качестве примера, но&amp;nbsp;оказывалось неработающим при небольшой модификации входных данных. Никогда не&amp;nbsp;стоит сразу успокаиваться, получив верный результат для одного набора входных данных. Нужно подумать, в&amp;nbsp;чем в&amp;nbsp;задаче может быть засада и&amp;nbsp;проверить всякие &amp;laquo;дерьмовые&amp;raquo; случаи&amp;nbsp;&amp;mdash; не&amp;nbsp;сломают&amp;nbsp;ли они ваш алгоритм.&lt;/p&gt;

&lt;p&gt;3. &lt;strong&gt;Сравнение с&amp;nbsp;приведением типов.&lt;/strong&gt; Практически все для сравнения элементов массивов использовали &lt;code&gt;==&lt;/code&gt; и&amp;nbsp;&lt;code&gt;!=&lt;/code&gt;.
 Ребята, если вы еще не&amp;nbsp;знаете, знайте: в&amp;nbsp;яваскрипте &lt;code&gt;==&lt;/code&gt; и &lt;code&gt;!=&lt;/code&gt; делает приведение типов. Это означает, например, что &lt;code&gt;1 == '1'&lt;/code&gt; выдаст &lt;code&gt;true&lt;/code&gt;. Для сравнения без приведения типов используйте &lt;code&gt;===&lt;/code&gt; и&amp;nbsp;&lt;code&gt;!==&lt;/code&gt;.&lt;/p&gt;


&lt;h4&gt;Задача 2&lt;/h4&gt;

&lt;p&gt;Вторая задача была на&amp;nbsp;замыкание и&amp;nbsp;проблем не&amp;nbsp;вызвала. Просто приведу свое решение:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; toArrayOfFunctions &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;array&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; makeFunction &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold;'&gt;item&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;function&lt;/span&gt;&lt;span style='color:#808030;'&gt;(&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
            &lt;span style='color:#800000; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold;'&gt;item&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
        &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; i&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; len &lt;span style='color:#808030;'&gt;=&lt;/span&gt; array&lt;span style='color:#808030;'&gt;.&lt;/span&gt;length&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;var&lt;/span&gt; functions &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#808030;'&gt;[]&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;for&lt;/span&gt; &lt;span style='color:#808030;'&gt;(&lt;/span&gt;i &lt;span style='color:#808030;'&gt;=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;0&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt; i &lt;span style='color:#808030;'&gt;&amp;lt;&lt;/span&gt; len&lt;span style='color:#800080;'&gt;;&lt;/span&gt; i &lt;span style='color:#808030;'&gt;+=&lt;/span&gt; &lt;span style='color:#008c00;'&gt;1&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt; &lt;span style='color:#800080;'&gt;{&lt;/span&gt;
        functions&lt;span style='color:#808030;'&gt;[&lt;/span&gt;i&lt;span style='color:#808030;'&gt;]&lt;/span&gt; &lt;span style='color:#808030;'&gt;=&lt;/span&gt; makeFunction&lt;span style='color:#808030;'&gt;(&lt;/span&gt;array&lt;span style='color:#808030;'&gt;[&lt;/span&gt;i&lt;span style='color:#808030;'&gt;]&lt;/span&gt;&lt;span style='color:#808030;'&gt;)&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
    &lt;span style='color:#800080;'&gt;}&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold;'&gt;return&lt;/span&gt; functions&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
&lt;span style='color:#800080;'&gt;}&lt;/span&gt;&lt;span style='color:#800080;'&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; В&amp;nbsp;одном из&amp;nbsp;решений второй задачи заметил еще проблему, которую назовем &lt;strong&gt;&amp;laquo;порча входных данных&amp;raquo;&lt;/strong&gt;. Нужно помнить, что объекты (массивы в&amp;nbsp;том числе) передаются по&amp;nbsp;ссылке, а&amp;nbsp;не&amp;nbsp;по&amp;nbsp;значению. Если в&amp;nbsp;функции вы делаете какие-то хирургические операции с&amp;nbsp;принятым в&amp;nbsp;аргументах объектом, то&amp;nbsp;вы меняете непосредственно переданный объект.&lt;/p&gt;

&lt;p&gt;Пример:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;var&lt;/span&gt; add1 &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;array&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;var&lt;/span&gt; i &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; i &lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt; array&lt;span style='color:#808030; '&gt;.&lt;/span&gt;length&lt;span style='color:#800080; '&gt;;&lt;/span&gt; i &lt;span style='color:#808030; '&gt;+=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        &lt;span style='color:#696969; '&gt;// Трах-бабах-хуяк - портим переданный массив&lt;/span&gt;
        array&lt;span style='color:#808030; '&gt;[&lt;/span&gt;i&lt;span style='color:#808030; '&gt;]&lt;/span&gt; &lt;span style='color:#808030; '&gt;=&lt;/span&gt; array&lt;span style='color:#808030; '&gt;[&lt;/span&gt;i&lt;span style='color:#808030; '&gt;]&lt;/span&gt; &lt;span style='color:#808030; '&gt;+&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; array&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;var&lt;/span&gt; a &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;2&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;3&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;var&lt;/span&gt; b &lt;span style='color:#808030; '&gt;=&lt;/span&gt; add1&lt;span style='color:#808030; '&gt;(&lt;/span&gt;a&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#696969; '&gt;// a и b теперь один и тот же массив [2, 3, 4]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6825799687671262698?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6825799687671262698' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6825799687671262698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6825799687671262698'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/11/homework-1-results.html' title='Результаты домашки №1'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5812930916482149255</id><published>2009-10-23T20:41:00.002+04:00</published><updated>2009-10-25T23:03:03.337+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='домашка'/><title type='text'>Домашка №2</title><content type='html'>&lt;p&gt;Уважаемые яваскриптеры и&amp;nbsp;яваскриптизерши, держите новую домашку на&amp;nbsp;выходные. На&amp;nbsp;этот раз кодить ничего не&amp;nbsp;нужно. Предлагаю ответить вам на&amp;nbsp;один вопрос. Что вам нравится и&amp;nbsp;не&amp;nbsp;нравится в&amp;nbsp;яваскрипте? Пожалуйста, похвалите и&amp;nbsp;поругайте яваскрипт. Вознесите его к&amp;nbsp;небесам и&amp;nbsp;опустите в&amp;nbsp;низины кала.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5812930916482149255?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5812930916482149255' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5812930916482149255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5812930916482149255'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/10/homework-2.html' title='Домашка №2'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-221059167562005149</id><published>2009-10-20T22:36:00.004+04:00</published><updated>2009-10-20T22:56:42.054+04:00</updated><title type='text'>Нет отрицательной логике</title><content type='html'>&lt;p&gt;Что общего у&amp;nbsp;этого кусочка яваскрипта (время от&amp;nbsp;времени встречаю такое в&amp;nbsp;чужом коде):&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;function&lt;/span&gt; init(noLoginForm) {
    &lt;span style='color:#7f0055; font-weight:bold; '&gt;if&lt;/span&gt; (!noLoginForm) {
        ...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;и&amp;nbsp;этого фрагмента формы (постоянно сталкиваюсь на&amp;nbsp;сайтах):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh5.ggpht.com/_dN6tHnouWi8/St4Hr13PKmI/AAAAAAAACvs/j3rrpzEySBM/negative2.png" width="371" height="26" border="0" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Как вы уже, конечно, догадались, это отрицательная логика переменной и&amp;nbsp;чекбокса. Не&amp;nbsp;знаю как вы, а&amp;nbsp;я&amp;nbsp;иногда подвисаю, пытаясь разобраться, как это работает. Во&amp;nbsp;всяком случае, чтобы врубиться в&amp;nbsp;отрицательную логику, мне приходится затратить немного больше мозгового процессорного времени, поэтому я&amp;nbsp;всегда предпочитаю положительную логику:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;function&lt;/span&gt; init(showLoginForm) {
    &lt;span style='color:#7f0055; font-weight:bold; '&gt;if&lt;/span&gt; (showLoginForm) {
        ...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/St4Hr0KKu3I/AAAAAAAACvo/a5OrOxE_3S4/positive2.png" width="316" height="26" border="0" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;(Не&amp;nbsp;вижу ничего плохого в&amp;nbsp;том, чтобы по&amp;nbsp;умолчанию чекбокс был зажженным.)&lt;/p&gt;

&lt;p&gt;Кстати, думаю, именно по&amp;nbsp;этой причине в&amp;nbsp;Гугл Ридире чекбокс &lt;em&gt;Mark as&amp;nbsp;unread&lt;/em&gt; переделали в&amp;nbsp;&lt;em&gt;Mark as&amp;nbsp;read&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-221059167562005149?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=221059167562005149' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/221059167562005149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/221059167562005149'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/10/no-to-negative-logic.html' title='Нет отрицательной логике'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_dN6tHnouWi8/St4Hr13PKmI/AAAAAAAACvs/j3rrpzEySBM/s72-c/negative2.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8100182252688158246</id><published>2009-10-15T16:37:00.003+04:00</published><updated>2009-10-15T20:57:01.919+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='домашка'/><title type='text'>Домашка №1</title><content type='html'>&lt;p&gt;По&amp;nbsp;&lt;a href="http://chikuyonok.ru/category/Домашка/"&gt;примеру Сергея&lt;/a&gt; тоже хочу загрузить вас домашкой :) Не&amp;nbsp;пугайтесь, задания не&amp;nbsp;сложные (пока). Итак, сегодня две задачки по&amp;nbsp;яваскрипту.&lt;/p&gt;

&lt;h4&gt;Задача 1&lt;/h4&gt;
&lt;p&gt;Написать метод, который принимает два массива в&amp;nbsp;качестве параметров и&amp;nbsp;возвращает позицию, начиная с&amp;nbsp;которой второй параметр входит как подмассив в&amp;nbsp;первый параметр.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Пример.&lt;/em&gt; Первый массив: [4, 8, 15, 16, 23, 42], второй массив: [15, 16], результат: 2&lt;/p&gt;


&lt;h4&gt;Задача 2&lt;/h4&gt;
&lt;p&gt;Есть массив с&amp;nbsp;числами. Нужно написать метод, который трансформирует исходный массив в&amp;nbsp;массив функций, которые возвращают исходные числа.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Пример.&lt;/em&gt; На входе: [4, 8, 15], на выходе: [function() {return 4;}, function() {return 8;}, function() {return 15;}]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8100182252688158246?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8100182252688158246' title='Комментарии: 22'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8100182252688158246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8100182252688158246'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/10/homework-1.html' title='Домашка №1'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8260738693086278904</id><published>2009-10-10T17:42:00.000+04:00</published><updated>2009-10-10T17:42:23.487+04:00</updated><title type='text'>Откуда берутся веб-разработчики?</title><content type='html'>&lt;p&gt;&lt;img src="http://lh5.ggpht.com/_dN6tHnouWi8/StCLzk9eH-I/AAAAAAAACuc/6PPAM8y7GD4/P1020037sm.jpg" width="640" height="480" alt="" border="0"/&gt;&lt;/p&gt;

&lt;p&gt;Думаете это обычный гимнастический мяч валяется возле моего рабочего стола? А&amp;nbsp;вот и&amp;nbsp;нет! Это яйцо, из&amp;nbsp;которого скоро вылупится новый веб-разработчик.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8260738693086278904?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8260738693086278904' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8260738693086278904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8260738693086278904'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/10/blog-post.html' title='Откуда берутся веб-разработчики?'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_dN6tHnouWi8/StCLzk9eH-I/AAAAAAAACuc/6PPAM8y7GD4/s72-c/P1020037sm.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4309772898185204001</id><published>2009-09-10T19:03:00.004+04:00</published><updated>2009-09-10T19:08:44.999+04:00</updated><title type='text'>Ajax со вкусом апельсина</title><content type='html'>&lt;p&gt;Купил на днях в калифорнийском магазине вот такое средство для мытья посуды :)&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/SqkU99Q__pI/AAAAAAAACcM/lvjXpgcrYgw/SDC12937.JPG" width="384" height="512" border="0" alt=""/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4309772898185204001?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4309772898185204001' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4309772898185204001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4309772898185204001'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/09/ajaz.html' title='Ajax со вкусом апельсина'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/SqkU99Q__pI/AAAAAAAACcM/lvjXpgcrYgw/s72-c/SDC12937.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6546240082258661160</id><published>2009-08-28T01:05:00.004+04:00</published><updated>2009-08-28T16:21:28.079+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Яндекс.Почта'/><title type='text'>Улыбаемся и машем</title><content type='html'>&lt;p&gt;На&amp;nbsp;мотив Yellow Submarine: &amp;laquo;Запустили мы видеописьмо, видеописьмо, видеописьмо. Вместе дружно пробуем его, тестируем его, о-го-го-го-го!&amp;raquo;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/SpZqMMaBG0I/AAAAAAAABXk/LBWTGvwcBTk/videoletter.jpg" width="500" height="300" border="0" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Теперь прямо в&amp;nbsp;Яндекс.Почте можно записать видеоролик, который выложится на&amp;nbsp;Яндекс.Видео, а&amp;nbsp;секретная ссылка на&amp;nbsp;этот ролик вставится в&amp;nbsp;письмо. Все вместе это называется &amp;laquo;видеописьмо&amp;raquo;.&lt;/p&gt;

&lt;p&gt;&lt;object width="450" height="396"&gt;&lt;param name="video" value="http://flv.video.yandex.ru/lite/mail-blog/l7y7oeeqnj.1303/"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="scale" value="noscale"&gt;&lt;/param&gt;&lt;embed src="http://flv.video.yandex.ru/lite/mail-blog/l7y7oeeqnj.1303/" type="application/x-shockwave-flash" width="450" height="396" allowFullScreen="true" scale="noscale" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6546240082258661160?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6546240082258661160' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6546240082258661160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6546240082258661160'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/08/videoletter.html' title='Улыбаемся и машем'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/SpZqMMaBG0I/AAAAAAAABXk/LBWTGvwcBTk/s72-c/videoletter.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7621893577850855154</id><published>2009-08-06T15:12:00.003+04:00</published><updated>2009-09-23T17:00:07.415+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Однопиксельные прозрачные уголки</title><content type='html'>&lt;div style="background-color: #80aaff; margin: 0 1px 1.2em 1px; padding: 1px 0;"&gt;&lt;div style="background-color: #80aaff; margin: 0 -1px; padding: 0.25em 0.5em;"&gt;Часто (особенно для небольших блоков) достаточно лишь обозначить скругления. Сделать это можно однопиксельными уголками, которые обычно реализуют с&amp;nbsp;помощью четырех элементов абсолютно спозиционированных по&amp;nbsp;углам блока.&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Есть более крутой способ, суть его в&amp;nbsp;следующем:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/Snq4aDw9XuI/AAAAAAAABWA/Fs_7FGUQiaM/1px-rounded-corners.png" width="150" height="72" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Упрощенный код для понимания идеи:&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000; background:#ffffff;'&gt;.corners {
    background-color: #80aaff;
    margin: 0 1px;
    padding: 1px 0;
}

.corners-i {
    background-color: #80aaff;
    margin: 0 -1px;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Чтобы применить этот подход к&amp;nbsp;инлайновым и&amp;nbsp;флоатным элементам и&amp;nbsp;добиться кроссбраузерности, нужно написать еще немного CSS. Я&amp;nbsp;подготовил &lt;a href="http://stepan-reznikov.appspot.com/static/1px-rounded-corners/index.html"&gt;страничку&lt;/a&gt;, где можно посмотреть детали реализации.&lt;/p&gt;

&lt;p class="before_list"&gt;Достоинства способа:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Всего лишь один доп. элемент.&lt;/li&gt;
&lt;li&gt;Уголки получаются прозрачные, а&amp;nbsp;значит не&amp;nbsp;нужно их &amp;laquo;красить&amp;raquo; в&amp;nbsp;цвет фона.&lt;/li&gt;
&lt;li&gt;Нет JS, экспрешенов, спрайтов.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Недостатком, конечно, является ограничение радиуса скругления в&amp;nbsp;1&amp;nbsp;пиксель :)&lt;/p&gt;

&lt;p&gt;Рассмотренный способ отлично сочетается с&amp;nbsp;&lt;a href="http://sreznikov.blogspot.com/2009/06/border-radius.html"&gt;бордер-радиусом&lt;/a&gt;, то&amp;nbsp;есть, в&amp;nbsp;браузерах поддерживающих &lt;code&gt;border-radius&lt;/code&gt; используем &lt;code&gt;border-radius&lt;/code&gt;, в&amp;nbsp;остальных браузерах задействуем доп. элемент &lt;code&gt;.corners-i&lt;/code&gt; и&amp;nbsp;делаем однопиксельные уголки.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7621893577850855154?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7621893577850855154' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7621893577850855154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7621893577850855154'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/08/1px-rounded-corners.html' title='Однопиксельные прозрачные уголки'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/Snq4aDw9XuI/AAAAAAAABWA/Fs_7FGUQiaM/s72-c/1px-rounded-corners.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2236945324117405998</id><published>2009-06-24T22:30:00.015+04:00</published><updated>2009-12-23T13:54:18.472+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>border-radius спешит на помощь</title><content type='html'>&lt;p&gt;&lt;small&gt;В соавторстве с &lt;a href="http://makishvili.com/"&gt;Вадимом Макишвили&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Для реализации скругленных уголков мы&amp;nbsp;искали максимально легкое решение&amp;nbsp;&amp;mdash; отсутствие дополнительной разметки, минимум CSS и&amp;nbsp;JS. Конечно, есть очень мощные средства, например, &lt;a href="http://code.google.com/p/rocon/"&gt;rocon&lt;/a&gt;, но&amp;nbsp;нам они показались избыточными и&amp;nbsp;громоздкими.&lt;/p&gt;

&lt;p class="before_list"&gt;Идея была в&amp;nbsp;том, чтобы использовать CSS-свойство &lt;code&gt;border-radius&lt;/code&gt;, которое поддерживают некоторые прогрессивные браузеры:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firefox начиная с&amp;nbsp;версии 1.0 (~24% пользователей)&lt;/li&gt;
&lt;li&gt;Safari начиная с&amp;nbsp;3.0 + Chrome (~2%)&lt;/li&gt;
&lt;li&gt;Konquerer (~0,05%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Итого, для ~25% пользователей уголки можно рисовать средствами браузера&amp;nbsp;&amp;mdash; уже неплохо.&lt;/p&gt;

&lt;p&gt;Смешно, но&amp;nbsp;свойство &lt;code&gt;border-radius&lt;/code&gt;, которое есть в&amp;nbsp;CSS3, пока не&amp;nbsp;поддерживается ни&amp;nbsp;одним браузером. Однако, некоторые браузеры поддерживают аналогичные проприетарные свойства, например, &lt;code&gt;-moz-border-radius&lt;/code&gt; в&amp;nbsp;Firefox.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000; background:#ffffff;'&gt;.corners {
    &lt;span style='color:#3f7f59;'&gt;/* Возможно какой-нибудь браузер в будущем, будем надеяться IE */&lt;/span&gt;
    border-radius: 4px;
    &lt;span style='color:#3f7f59;'&gt;/* WebKit (Safari/Chrome) */&lt;/span&gt;
    -webkit-border-radius: 4px;
    &lt;span style='color:#3f7f59;'&gt;/* KHTML (Konquerer) */&lt;/span&gt;
    -khtml-border-radius: 4px;
    &lt;span style='color:#3f7f59;'&gt;/* Возможно Opera в будущем */&lt;/span&gt;
    -opera-border-radius: 4px;
    &lt;span style='color:#3f7f59;'&gt;/* Gecko (Firefox) */&lt;/span&gt;
    -moz-border-radius: 4px;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Для остальных браузеров, не&amp;nbsp;поддерживающих &lt;code&gt;border-radius&lt;/code&gt;, будем яваскриптом вставлять доп. элементы для реализации уголков.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000; background:#ffffff;'&gt;
&lt;span style='color:#3f7f59;'&gt;// Проверяет, поддерживает ли элемент elem CSS-свойство border-radius.&lt;/span&gt;
&lt;span style='color:#7f0055; font-weight:bold; '&gt;var&lt;/span&gt; isBorderRadiusSupported = &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; (elem) {
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;var&lt;/span&gt; s = elem.style;
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.borderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.WebkitBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.KhtmlBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.OperaBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.MozBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt;;
};

&lt;span style='color:#3f7f59;'&gt;// Добавляет внутрь элемента elem доп. элементы реализующие уголки.&lt;/span&gt;
&lt;span style='color:#7f0055; font-weight:bold; '&gt;var&lt;/span&gt; wrapInCorners = &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; (elem) {
    &lt;span style='color:#3f7f59;'&gt;// Реализуем уголки любым известным способом&lt;/span&gt;
    $(elem).prepend(&lt;span style='color:#2a00ff;'&gt;'&amp;lt;i class="lt"/&amp;gt;&amp;lt;i class="rt"/&amp;gt;&amp;lt;i class="lb"/&amp;gt;&amp;lt;i class="rb"/&amp;gt;'&lt;/span&gt;);
};

&lt;span style='color:#3f7f59;'&gt;// Реализует закругленные уголки с помощью доп. элементов&lt;/span&gt;
&lt;span style='color:#3f7f59;'&gt;// для браузеров не поддерживающих CSS-свойство border-radius.&lt;/span&gt;
&lt;span style='color:#7f0055; font-weight:bold; '&gt;var&lt;/span&gt; checkCorners = &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; () {
    &lt;span style='color:#3f7f59;'&gt;// Ищем все элементы с классом corners&lt;/span&gt;
    $(&lt;span style='color:#2a00ff;'&gt;'.corners'&lt;/span&gt;).each(&lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; () {
        &lt;span style='color:#3f7f59;'&gt;// Если для данного элемента браузер не поддерживает border-radius&lt;/span&gt;
        &lt;span style='color:#7f0055; font-weight:bold;'&gt;if&lt;/span&gt; (!isBorderRadiusSupported(&lt;span style='color:#7f0055; font-weight:bold;'&gt;this&lt;/span&gt;)) {
            &lt;span style='color:#3f7f59;'&gt;// Добавляем внутрь элемента доп. элементы реализующие уголки&lt;/span&gt;
            wrapInCorners(&lt;span style='color:#7f0055; font-weight:bold;'&gt;this&lt;/span&gt;);
        }
    });
};

&lt;span style='color:#3f7f59;'&gt;// DOM загрузился и готов к обходу и манипуляциям&lt;/span&gt;
$(&lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; () {
    checkCorners();
});&lt;/code&gt;&lt;/pre&gt;


&lt;p class="before_list"&gt;Плюсы решения:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML льется чистый, без доп. элементов, и,&amp;nbsp;соответственно, лишняя разметка не&amp;nbsp;мозолит глаз ни&amp;nbsp;в&amp;nbsp;статической верстке, ни&amp;nbsp;в&amp;nbsp;XSL-шаблонах.&lt;/li&gt;
&lt;li&gt;В прогрессивных браузерах (примерно у&amp;nbsp;четверти пользователей) уголки рисуются средствами браузера (максимально быстро).&lt;/li&gt;
&lt;li&gt;Есть задел на&amp;nbsp;будущее&amp;nbsp;&amp;mdash; если IE&amp;nbsp;или Opera надумают реализовать &lt;code&gt;border-radius&lt;/code&gt;, то&amp;nbsp;наше решение готово к&amp;nbsp;этому радостному событию.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; В&amp;nbsp;комментариях указали на&amp;nbsp;слабые стороны этого решения. Также откликнулись мои коллеги и&amp;nbsp;помогли улучшить решение по&amp;nbsp;производительности. Спасибо всем! Для этого мне и&amp;nbsp;нужен блог&amp;nbsp;&amp;mdash; поделиться решением, собрать фидбек и&amp;nbsp;найти более удачный вариант.&lt;/p&gt;

&lt;p&gt;1. Не&amp;nbsp;нужно проверять поддержку &lt;code&gt;border-radius&lt;/code&gt; для каждого элемента. Сделаем эту проверку один раз в&amp;nbsp;теге &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; до&amp;nbsp;загрузки контента и&amp;nbsp;добавим соответствующий класс у&amp;nbsp;элемента &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000; background:#ffffff;'&gt;&lt;span style='color:#3f7f59;'&gt;// Проверяет, поддерживает ли браузер CSS-свойство border-radius.&lt;/span&gt;
&lt;span style='color:#7f0055; font-weight:bold;'&gt;var&lt;/span&gt; isBorderRadiusSupported = &lt;span style='color:#7f0055; font-weight:bold;'&gt;function&lt;/span&gt; () {
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;var&lt;/span&gt; s = document.documentElement.style;
    &lt;span style='color:#7f0055; font-weight:bold;'&gt;return&lt;/span&gt; &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.borderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.WebkitBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.KhtmlBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt; ||
           &lt;span style='color:#7f0055; font-weight:bold;'&gt;typeof&lt;/span&gt; s.MozBorderRadius === &lt;span style='color:#2a00ff;'&gt;"string"&lt;/span&gt;;
};

document.documentElement.className += isBorderRadiusSupported() ?
        &lt;span style='color:#2a00ff;'&gt;" border-radius"&lt;/span&gt; : &lt;span style='color:#2a00ff; '&gt;" no-border-radius"&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2. Создавать из&amp;nbsp;строки ноды под каждый уголок недешево, а&amp;nbsp;зааппендить их в&amp;nbsp;DOM еще дороже. Вставка каждого уголка это рефлоу блока, в&amp;nbsp;который он&amp;nbsp;вставляется. Выгоднее просто отдавать доп. разметку сразу в&amp;nbsp;HTML. Задействовать доп. разметку будем в&amp;nbsp;зависимости от&amp;nbsp;класса, который мы выставили у&amp;nbsp;элемента &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code style='color:#000000; background:#ffffff;'&gt;.no-border-radius .corners .lt {
    &lt;span style='color:#3f7f59;'&gt;// Стили для уголков&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;3. На&amp;nbsp;текущий момент в&amp;nbsp;Опере нет поддержки &lt;code&gt;border-radius&lt;/code&gt;. Не&amp;nbsp;стоит гонять балластный код ради неизвестного будущего. Поэтому отрываем &lt;code&gt;-opera-border-radius: 4px;&lt;/code&gt; и&amp;nbsp;соответствующую проверку в&amp;nbsp;JS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPD2:&lt;/strong&gt; Opera 10.50 pre-alpha поддерживает &lt;code&gt;border-radius&lt;/code&gt;, причем &lt;strong&gt;без префикса&lt;/strong&gt;. Ура!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2236945324117405998?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2236945324117405998' title='Комментарии: 19'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2236945324117405998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2236945324117405998'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/06/border-radius.html' title='border-radius спешит на помощь'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-9056713652792773338</id><published>2009-06-16T21:11:00.009+04:00</published><updated>2009-08-06T15:28:15.385+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Яндекс.Почта'/><title type='text'>Не хватает слов? Нарисуй письмо!</title><content type='html'>&lt;p&gt;Выкатили сегодня пакет обновлений Яндекс.Почты. В&amp;nbsp;нем есть киллер-фича&amp;nbsp;&amp;mdash; рисовалка! Не&amp;nbsp;отходя от&amp;nbsp;&lt;del&gt;кассы&lt;/del&gt; формы нового письма, теперь можно нарисовать картинку и&amp;nbsp;приложить ее к&amp;nbsp;письму.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/SjfRyGGEimI/AAAAAAAABF0/QzMSj84ipQ4/yandex-mail-painter.png"/&gt;&lt;/p&gt;

&lt;p&gt;Подробности в&amp;nbsp;&lt;a href="http://mail-blog.ya.ru/replies.xml?item_no=9"&gt;блоге новой Яндекс.Почты&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;object width="450" height="330"&gt;&lt;param name="video" value="http://flv.video.yandex.ru/lite/mail-blog/iendowfapq.912/"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="scale" value="noscale"&gt;&lt;/param&gt;&lt;embed src="http://flv.video.yandex.ru/lite/mail-blog/iendowfapq.912/" type="application/x-shockwave-flash" width="450" height="330" allowFullScreen="true" scale="noscale" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;P.S. Кстати, по-украински &amp;laquo;Рисовалка&amp;raquo; будет &amp;laquo;Малювалка&amp;raquo; :) Можете включить украинский язык интерфейса и&amp;nbsp;проверить :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-9056713652792773338?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=9056713652792773338' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9056713652792773338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9056713652792773338'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/06/yandex-mail-painter.html' title='Не хватает слов? Нарисуй письмо!'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/SjfRyGGEimI/AAAAAAAABF0/QzMSj84ipQ4/s72-c/yandex-mail-painter.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-918253152231004207</id><published>2009-06-11T00:49:00.003+04:00</published><updated>2009-06-11T01:01:14.699+04:00</updated><title type='text'>Комментарии</title><content type='html'>&lt;pre&gt;&lt;code&gt;/**
 * По-хорошему, объем комментариев должен быть не меньше
 * объема самого кода или даже больше. Я вообще стараюсь
 * сначала комментарий написать, а потом уже кусок кода.
 * Если русским языком не можешь сформулировать, что хочешь
 * чтобы код делал, значит рано еще сам код писать. Скажу
 * больше, акт написания комментария заставляет мозг
 * напрячься и обрести ясность мысли, что способствует
 * написанию стройного и четкого кода. Вы не замечали
 * за собой такого?
 */&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-918253152231004207?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=918253152231004207' title='Комментарии: 17'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/918253152231004207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/918253152231004207'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/06/comments.html' title='Комментарии'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2100251342934831692</id><published>2009-06-03T12:51:00.006+04:00</published><updated>2009-06-03T13:56:42.899+04:00</updated><title type='text'>Сайт «Музея советских игровых автоматов»</title><content type='html'>&lt;p&gt;&lt;a href="http://www.artlebedev.ru/everything/15kop/"&gt;http://www.artlebedev.ru/everything/15kop/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Уже три с&amp;nbsp;половиной месяца не&amp;nbsp;работаю в&amp;nbsp;Студии, а&amp;nbsp;проекты с&amp;nbsp;моим участием продолжают выходить :)&lt;/p&gt;

&lt;p&gt;В&amp;nbsp;детстве больше всего мне нравился автомат &amp;laquo;Магистраль&amp;raquo;. Помню, когда мы жили в&amp;nbsp;Витебске, постоянно бегал на&amp;nbsp;вокзал и&amp;nbsp;спускал в&amp;nbsp;этот автомат все карманные деньги. Сначала я&amp;nbsp;всегда выбирал учебный режим, зарабатывал на&amp;nbsp;нем призовую игру, и&amp;nbsp;уже призовую игру ехал на&amp;nbsp;сложном режиме :)&lt;/p&gt;

&lt;p&gt;В&amp;nbsp;процессе работы над сайтом особый кайф я&amp;nbsp;получил от&amp;nbsp;создания страницы &amp;laquo;&lt;a href="http://magistral.15kop.ru/night/"&gt;Ночной рейс&lt;/a&gt;&amp;raquo;. Мега-крутая фишка получилась!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2100251342934831692?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2100251342934831692' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2100251342934831692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2100251342934831692'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/06/blog-post.html' title='Сайт «Музея советских игровых автоматов»'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-720003786418003132</id><published>2009-05-28T12:21:00.009+04:00</published><updated>2009-08-06T15:27:50.021+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Яндекс.Почта'/><title type='text'>Новая Яндекс.Почта</title><content type='html'>&lt;p&gt;Та-дам! Дорогие друзья, свершилось знаменательное событие! Команда Яндекс.Почты запустила &lt;a href="http://mail.yandex.ru/promo/neo/welcome/"&gt;новый интерфейс&lt;/a&gt; (Нео). Всем срочно бежать смотреть и&amp;nbsp;тестировать.&lt;/p&gt;

&lt;p&gt;Обо всех проблемах сообщайте нам через &lt;a href="http://feedback.yandex.ru/?from=mail"&gt;форму обратной связи&lt;/a&gt;, а&amp;nbsp;также не&amp;nbsp;забудьте отправить нам &lt;a href="http://feedback.yandex.ru/neomail.xml"&gt;бочку меда или ложку дегтя&lt;/a&gt;. Спасибо :)&lt;/p&gt;

&lt;p&gt;Поздравляю вас/нас с&amp;nbsp;этим волнующим событием! Ура!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-720003786418003132?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=720003786418003132' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/720003786418003132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/720003786418003132'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/05/new-yandex-mail-neo.html' title='Новая Яндекс.Почта'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-412055925345000379</id><published>2009-05-22T13:30:00.006+04:00</published><updated>2009-05-22T13:52:21.351+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Будущее яваскрипта: ECMAScript 5</title><content type='html'>&lt;p&gt;Очень впечатлился выступлением товарищей из&amp;nbsp;ECMAScript о&amp;nbsp;грядущих изменениях в&amp;nbsp;языке. Рекомендую посмотреть всем яваскриптерам.&lt;/p&gt;

&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Kq4FpMe6cRs&amp;hl=ru&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Kq4FpMe6cRs&amp;hl=ru&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://google-caja.googlecode.com/svn/trunk/doc/html/es5-talk/es5-talk.html"&gt;Слайды презентации&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-412055925345000379?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=412055925345000379' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/412055925345000379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/412055925345000379'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/05/ecmascript-5.html' title='Будущее яваскрипта: ECMAScript 5'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6103049628922515715</id><published>2009-05-20T21:23:00.007+04:00</published><updated>2009-05-20T21:52:56.333+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='книги'/><title type='text'>Гигапедия</title><content type='html'>&lt;p&gt;Открыл для себя &lt;a href="http://gigapedia.com/"&gt;Гигапедию&lt;/a&gt;&amp;nbsp;&amp;mdash; сайт, где можно найти любую книгу в&amp;nbsp;электронном виде и&amp;nbsp;бесплатно ее&amp;nbsp;скачать. Есть всё&amp;nbsp;&amp;mdash; техническая литература, художественная, аудиокниги, даже ноты. Это просто счастье какое-то! Нужно зарегистрироваться, тогда у&amp;nbsp;вас появится поиск по&amp;nbsp;Гигапедии.&lt;/p&gt;

&lt;p&gt;Накачал новых книг по&amp;nbsp;яваскрипту (Стефанова, Закаса), Набокова на&amp;nbsp;английском, нот для бас-гитары. Где&amp;nbsp;бы теперь еще время взять, чтобы всем этим насладиться? :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6103049628922515715?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6103049628922515715' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6103049628922515715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6103049628922515715'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/05/gigapedia.html' title='Гигапедия'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8150003689928482050</id><published>2009-05-15T20:15:00.004+04:00</published><updated>2009-09-23T17:10:43.764+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Трабл с попапом с закругленными уголками поверх селекта в IE6</title><content type='html'>&lt;p&gt;Уважаемые читатели, помогите кто чем может. (Сами мы не местные.)&lt;/p&gt;

&lt;p&gt;Как известно, в&amp;nbsp;IE6 селекты (однострочные и&amp;nbsp;многострочные) всегда поверх любых других элементов на&amp;nbsp;странице. Чтобы это побороть, нужно в&amp;nbsp;вытаскиваемый наверх попап положить iframe, который в&amp;nbsp;IE6 как&amp;nbsp;бы &amp;laquo;убивает&amp;raquo; под собой селект.&lt;/p&gt;

&lt;p&gt;Однако, если у&amp;nbsp;попапа есть закругленные уголки и&amp;nbsp;фон страницы отличный от&amp;nbsp;белого, то&amp;nbsp;возникает проблема. Если закругленный уголок попапа находится над селектом, то&amp;nbsp;там просвечивает цвет фона страницы, а&amp;nbsp;не&amp;nbsp;белый от&amp;nbsp;селекта.&lt;/p&gt;

&lt;p&gt;Выглядит это так:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/Sg2V8zifj-I/AAAAAAAABEo/jD6VVh3dKkU/ie6-select-and-popup-2.png"/&gt;&lt;/p&gt;

&lt;p class="before_list"&gt;Что происходит:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iframe полностью прозрачный &lt;code&gt;{filter: alpha(opacity=0);}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;он&amp;nbsp;&amp;laquo;убивает&amp;raquo; под собой селект&lt;/li&gt;
&lt;li&gt;и&amp;nbsp;начинает просвечивать бекграунд (черный)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://stepan-reznikov.appspot.com/static/ie6-select-and-popup/index.html"&gt;Тестовая страница&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Кто найдет решение, тому респект и&amp;nbsp;уважуха :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; в&amp;nbsp;каментах есть решение.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8150003689928482050?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8150003689928482050' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8150003689928482050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8150003689928482050'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/05/ie6-select-and-popup.html' title='Трабл с попапом с закругленными уголками поверх селекта в IE6'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/Sg2V8zifj-I/AAAAAAAABEo/jD6VVh3dKkU/s72-c/ie6-select-and-popup-2.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1218466206075204139</id><published>2009-05-12T23:13:00.004+04:00</published><updated>2009-05-12T23:18:00.669+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><category scheme='http://www.blogger.com/atom/ns#' term='Gmail'/><title type='text'>Gmail: Двоеточие в id-шнике</title><content type='html'>&lt;p&gt;&lt;small&gt;Продолжение статьи &amp;laquo;&lt;a href="http://sreznikov.blogspot.com/2009/02/gmail.html"&gt;Особенности верстки Gmail&lt;/a&gt;&amp;raquo;.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Мой коллега Иван Широков &lt;a href="http://shirokoff.ya.ru/replies.xml?item_no=2512"&gt;заметил&lt;/a&gt;, что все id-шники в&amp;nbsp;верстке Gmail начинаются с&amp;nbsp;двоеточия.&lt;/p&gt;


&lt;p&gt;&lt;img src="http://lh5.ggpht.com/_dN6tHnouWi8/SgnKMQzy_xI/AAAAAAAABEg/j3atoKNFB0Y/gmail2.gif" width="304" height="202" alt="" style="padding: 10px; border: 2px solid #cccccc;" /&gt;&lt;/p&gt;

&lt;p&gt;Хочу поделиться с&amp;nbsp;вами своими соображениями, зачем это может быть сделано.&lt;/p&gt;

&lt;p&gt;Во-первых, чтобы нельзя было (даже по&amp;nbsp;ошибке) навесить стили для такого id-шника, потому что &lt;code&gt;#:my {color: red;}&lt;/code&gt; не&amp;nbsp;работает. Своеобразная защита, которая как&amp;nbsp;бы подчеркивает, что id-шник используется только в&amp;nbsp;яваскрипте.&lt;/p&gt;

&lt;p&gt;Во-вторых, и&amp;nbsp;в&amp;nbsp;главных, чтобы элемент не&amp;nbsp;был доступен по&amp;nbsp;идентификатору в&amp;nbsp;глобальной области видимости (global namespace). Когда мы&amp;nbsp;пишем &lt;code&gt;&amp;lt;div id="my"&amp;gt;test&amp;lt;/div&amp;gt;&lt;/code&gt;, этот дивчик становится доступен через идентификатор &lt;code&gt;my&lt;/code&gt; в&amp;nbsp;глобальной области видимости. То&amp;nbsp;есть &lt;code&gt;alert(my.tagName)&lt;/code&gt; выдаст &amp;laquo;DIV&amp;raquo; (сюрприз, сюрприз!). А&amp;nbsp;если писать с&amp;nbsp;двоеточием &lt;code&gt;&amp;lt;div id=":my"&amp;gt;test&amp;lt;/div&amp;gt;&lt;/code&gt;, то&amp;nbsp;уже хренушки&amp;nbsp;&amp;mdash; нет такого идентификатора в&amp;nbsp;глобальной области видимости. При этом элемент по-прежнему можно достать через &lt;code&gt;document.getElementById(':my')&lt;/code&gt;. На&amp;nbsp;самом деле это очень круто, так как уменьшается вероятность коллизии в&amp;nbsp;глобальной области видимости.&lt;/p&gt;

&lt;p&gt;Все это лишь мои догадки. А&amp;nbsp;вы что думаете?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1218466206075204139?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1218466206075204139' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1218466206075204139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1218466206075204139'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/05/gmail-id-colon.html' title='Gmail: Двоеточие в id-шнике'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_dN6tHnouWi8/SgnKMQzy_xI/AAAAAAAABEg/j3atoKNFB0Y/s72-c/gmail2.gif' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3053467726109977564</id><published>2009-04-08T12:39:00.002+04:00</published><updated>2009-04-08T12:40:15.328+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Дилемма о загрузке JS-файлов</title><content type='html'>&lt;p&gt;С&amp;nbsp;одной стороны, конечно, хочется накладывать JS сразу по&amp;nbsp;мере загрузки HTML. Иными словами, хорошо&amp;nbsp;бы делать инициализацию JS-кода компонента сразу после загрузки HTML-кода компонента:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id="something"&amp;gt;
    ...
&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
    Something.init();
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Понятно зачем&amp;nbsp;&amp;mdash; чтобы свести к&amp;nbsp;минимуму задержку между двумя событиями: 1)&amp;nbsp;HTML компонента отобразился и&amp;nbsp;2)&amp;nbsp;JS компонента загрузился и&amp;nbsp;инициализировался.&lt;/p&gt;

&lt;p&gt;Например, чтобы псевдоссылка сразу вела себя как порядочная псевдоссылка и&amp;nbsp;показывала спрятанный за&amp;nbsp;ней контент, а&amp;nbsp;форма сразу умела валидироваться в&amp;nbsp;тот самый момент, когда она полностью вывелась на&amp;nbsp;экран.&lt;/p&gt;

&lt;p&gt;Разумеется, для этого нужно грузить JS-код компонента вперед HTML-кода (обычно это делают в&amp;nbsp;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;***&lt;/p&gt;

&lt;p&gt;С&amp;nbsp;другой стороны, следуя &lt;a href="http://developer.yahoo.com/performance/rules.html#js_bottom"&gt;рекомендациям&lt;/a&gt; ведущих специалистов по&amp;nbsp;борьбе с&amp;nbsp;тормознутостью сайтов, хочется вынести загрузку всех JS-файлов в&amp;nbsp;конец страницы (перед закрывающим тегом &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Тоже понятно зачем&amp;nbsp;&amp;mdash; чтобы первым делом загрузился и&amp;nbsp;показался контент, и&amp;nbsp;у&amp;nbsp;пользователя возникло ощущение, что сайт грузится быстро.&lt;/p&gt;

&lt;p&gt;Однако, минус очевиден&amp;nbsp;&amp;mdash; увеличивается задержка между рассмотренными выше событиями 1) и&amp;nbsp;2). То&amp;nbsp;есть мы&amp;nbsp;получаем, что пользователь дольше видит HTML с&amp;nbsp;еще не&amp;nbsp;наложенным яваскриптом.&lt;/p&gt;

&lt;p&gt;***&lt;/p&gt;

&lt;p&gt;Что делать? Я&amp;nbsp;думаю, что правильный путь&amp;nbsp;&amp;mdash; это все-таки вынести загрузку всех JS-файлов в&amp;nbsp;конец страницы, при этом в&amp;nbsp;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; грузить один маленький легковесный скрипт, который при попытке пользователя взаимодействовать с&amp;nbsp;компонентом при еще не&amp;nbsp;наложенном JS, будет сигнализировать ему, что, мол, все окей, подожди чуть-чуть, JS грузится и&amp;nbsp;скоро наступит счастье.&lt;/p&gt;

&lt;p&gt;Вот и&amp;nbsp;Мэтт Снайдер &lt;a href="http://mattsnider.com/languages/javascript/architecture-best-practices-fast-nonobtrusive-way-to-capture-click-events-before-loading-js-library/"&gt;похожим путем&lt;/a&gt; идет. А&amp;nbsp;как вы&amp;nbsp;решаете эту дилемму?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3053467726109977564?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3053467726109977564' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3053467726109977564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3053467726109977564'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/04/js-load.html' title='Дилемма о&amp;nbsp;загрузке JS-файлов'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5316606195345102144</id><published>2009-04-05T02:00:00.005+04:00</published><updated>2009-05-04T13:56:12.821+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JSLint</title><content type='html'>&lt;div style="margin: 0 5% 2em 50%; font-size: 85%;"&gt;&lt;p&gt;Валидировали, валидировали, да&amp;nbsp;не&amp;nbsp;вывалидировали.&lt;/p&gt;&lt;/div&gt;


&lt;p&gt;Думаю, многие пробовали программу &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt;&amp;nbsp;&amp;mdash; валидатор для проверки корректности JavaScript-кода. Однако блиц-опрос знакомых разработчиков показал, что почти все пользуются им&amp;nbsp;лишь изредка, и&amp;nbsp;едва&amp;nbsp;ли кто задумывался о&amp;nbsp;том, чтобы сделать JSLint неотъемлемой частью процесса разработки.&lt;/p&gt;

&lt;p&gt;JSLint&amp;nbsp;&amp;mdash; сверхценный инструмент в&amp;nbsp;арсенале JavaScript-разработчика. Должен сказать, что с&amp;nbsp;тех пор, как я&amp;nbsp;стал систематически им&amp;nbsp;пользоваться, мой код стал значительно лучше. Ведь помимо отлова мелких багов и&amp;nbsp;опечаток, JSLint способствует написанию стройного, слаженного, читабельного кода.&lt;/p&gt;


&lt;h4&gt;Главное&amp;nbsp;&amp;mdash; не&amp;nbsp;перегибать палку&lt;/h4&gt;

&lt;p&gt;Не&amp;nbsp;стоит принимать отчет JSLint как истину в&amp;nbsp;последней инстанции и&amp;nbsp;сразу бросаться править код. Это всего лишь рекомендация, поэтому нужно включить у&amp;nbsp;себя в&amp;nbsp;голове &lt;em&gt;thinking mode&lt;/em&gt; и&amp;nbsp;по&amp;nbsp;каждой ошибке в&amp;nbsp;отчете решить самому&amp;nbsp;&amp;mdash; согласиться с&amp;nbsp;JSLint или нет. Благодаря тому, что у&amp;nbsp;JSLint есть множество опций, позволяющих указать какие ошибки искать, а&amp;nbsp;какие игнорировать, этот инструмент можно легко настроить на&amp;nbsp;свой вкус.&lt;/p&gt;


&lt;h4&gt;Варианты использования&lt;/h4&gt;

&lt;p&gt;1. Самый простой&amp;nbsp;&amp;mdash; пойти на&amp;nbsp;сайт &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; и&amp;nbsp;скопипейстить свой код в&amp;nbsp;форму валидации.&lt;/p&gt;

&lt;p&gt;2. &lt;strong&gt;Виджеты&lt;/strong&gt; &lt;a href="http://widgets.yahoo.com/widgets/jslint-1"&gt;JSLint Widget&lt;/a&gt;, &lt;a href="http://code.google.com/p/jslint-multi-widget/"&gt;JSLint Multi widget&lt;/a&gt;, &lt;a href="http://code.google.com/p/jslint-dashboard/"&gt;JSLint Dashboard widget for Mac OS&amp;nbsp;X&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Можно драгндропнуть JS-файл или целую папку в&amp;nbsp;окошко виджета, и&amp;nbsp;получить отчет JSLint. В&amp;nbsp;настройках виджета есть полный комплект опций JSLint.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/_dN6tHnouWi8/SdfY98sdDAI/AAAAAAAABEA/Qp-89TGDzkw/jslint-widget.gif" width="320" height="135" alt="JSLint Widget"/&gt;&lt;/p&gt;

&lt;p style="margin: 2em 0;"&gt;Чем больше объем JS-кода, тем больше хочется интеграции со&amp;nbsp;средой разработки (IDE). Также для крупных проектов желательно сделать валидацию рутинной операцией, выполняющейся автоматически, например, на&amp;nbsp;этапе сборки и&amp;nbsp;упаковки JS-кода.&lt;/p&gt;

&lt;p&gt;3. В &lt;strong&gt;Aptana&lt;/strong&gt; есть встроенный JSLint, который изначально выключен. Включить можно в&amp;nbsp;настройках: Preferences&amp;nbsp;&amp;rarr; Aptana&amp;nbsp;&amp;rarr; Editors&amp;nbsp;&amp;rarr; JavaScript&amp;nbsp;&amp;rarr; Validation. После этого код будет валидироваться по&amp;nbsp;мере того, как вы его печатаете.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh5.ggpht.com/_dN6tHnouWi8/SdfY9ovzpBI/AAAAAAAABD4/Lj1rIDmdSFA/jslint-aptana.gif" width="576" height="291" alt="JSLint в Аптане"/&gt;&lt;/p&gt;

&lt;p&gt;К&amp;nbsp;сожалению, у&amp;nbsp;JSLint в&amp;nbsp;Аптане нет опций.&lt;/p&gt;

&lt;p&gt;4. Плагин к&amp;nbsp;&lt;strong&gt;Eclipse&lt;/strong&gt;. В&amp;nbsp;начале этого года компания RockstarApps выпустила &lt;a href="http://www.rockstarapps.com/joomla-1.5.8/products/jslint-eclipse-plugin.html"&gt;JSLint Eclipse Plugin&lt;/a&gt;. Опции все есть, но&amp;nbsp;нет возможности указать predefined global variables, что, конечно, обломно.&lt;/p&gt;

&lt;p&gt;5. &lt;a href="http://www.jslint.com/rhino/index.html"&gt;Rhino&lt;/a&gt; и&amp;nbsp;&lt;a href="http://www.jslint.com/wsh/index.html"&gt;Windows Script Host&lt;/a&gt;. На&amp;nbsp;одном из&amp;nbsp;проектов мы&amp;nbsp;используем &lt;strong&gt;Rhino&lt;/strong&gt; для запуска JSLint. Написали скрипт, который обходит все проектные JS-файлы, для каждого из&amp;nbsp;них вызывает JSLint и&amp;nbsp;формирует общий отчет&amp;nbsp;&amp;mdash; очень удобно! Пожалуй, надо будет написать отдельный пост про это :-)&lt;/p&gt;

&lt;p style="margin: 2em 0;"&gt;JSLint продолжает развиваться. Следить за обновлениями можно в &lt;a href="http://tech.groups.yahoo.com/group/jslint_com/"&gt;группе JSLint&lt;/a&gt;, куда часто пишет сам Крокфорд, автор JSLint.&lt;/p&gt;

&lt;p&gt;А&amp;nbsp;вы&amp;nbsp;валидируете свой JavaScript-код?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5316606195345102144?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5316606195345102144' title='Комментарии: 23'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5316606195345102144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5316606195345102144'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/04/jslint.html' title='JSLint'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_dN6tHnouWi8/SdfY98sdDAI/AAAAAAAABEA/Qp-89TGDzkw/s72-c/jslint-widget.gif' height='72' width='72'/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-421958084567772560</id><published>2009-03-15T23:45:00.003+03:00</published><updated>2009-06-24T22:40:48.695+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gmail'/><title type='text'>Электропочта</title><content type='html'>&lt;h4&gt;Инбокс&lt;/h4&gt;

&lt;p&gt;Для меня инбокс&amp;nbsp;&amp;mdash; это фактически туду-лист. Пока я&amp;nbsp;не&amp;nbsp;решил затронутую в&amp;nbsp;письме проблему, письмо сидит в&amp;nbsp;инбоксе. Как только по&amp;nbsp;письму все сделано, оно немедленно отправляется в&amp;nbsp;папку (или в&amp;nbsp;Gmail навешивается метка и&amp;nbsp;архивируется). Я&amp;nbsp;часто сам себе пишу письма чтобы что-то не&amp;nbsp;забыть, потому что знаю&amp;nbsp;&amp;mdash; если есть в&amp;nbsp;инбоксе, то&amp;nbsp;задача не&amp;nbsp;промандится. Вообще не&amp;nbsp;понимаю, как живут и&amp;nbsp;работают люди, у&amp;nbsp;которых все письма хранятся в&amp;nbsp;инбоксе.&lt;/p&gt;

&lt;h4&gt;Фильтры&lt;/h4&gt;

&lt;p&gt;У&amp;nbsp;меня настроено множество фильтров, с&amp;nbsp;помощью которых все второстепенные, не&amp;nbsp;имеющие непосредственного отношения к&amp;nbsp;работе, письма минуют инбокс и&amp;nbsp;расфасовываются по&amp;nbsp;папкам, где они ждут, когда для них появится свободная минута. Прежде всего, это всевозможные рассылки и&amp;nbsp;уведомления.&lt;/p&gt;

&lt;h4&gt;Периодичность проверки почты&lt;/h4&gt;

&lt;p&gt;Часто почта отвлекает и&amp;nbsp;мешает плодотворной работе. Особенно, когда приходит новое письмо&amp;nbsp;&amp;mdash; так и&amp;nbsp;тянет пойти посмотреть что&amp;nbsp;же там пришло. Поэтому я&amp;nbsp;выставляю достаточно большой интервал проверки новых писем, минимум&amp;nbsp;&amp;mdash; 30&amp;nbsp;минут. А&amp;nbsp;когда требуется полное погружение в&amp;nbsp;решение задачи или я&amp;nbsp;чувствую, что работа спорится и&amp;nbsp;не&amp;nbsp;хочу отвлекаться, то&amp;nbsp;вообще вырубаю почту.&lt;/p&gt;

&lt;p&gt;Еще есть обратная болезнь&amp;nbsp;&amp;mdash; постоянно заходить в&amp;nbsp;почту и&amp;nbsp;нажимать на&amp;nbsp;кнопку &amp;laquo;Доставить почту&amp;raquo;. Эта зараза нападает, когда не&amp;nbsp;охота что-то делать, и&amp;nbsp;ищешь повод хоть немного отложить решение насущной проблемы. Лекарство&amp;nbsp;&amp;mdash; воспитывать силу воли.&lt;/p&gt;

&lt;h4&gt;Черновики&lt;/h4&gt;

&lt;p&gt;Активно пользуюсь черновиками. Помимо незаконченных писем, храню в&amp;nbsp;них заготовки писем, различные варианты подписей, а&amp;nbsp;также использую просто как записную книжку для записывания мыслей, идей, составления листа желаний.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;А у вас какие приемы работы с почтой для повышения собственной эффективности?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-421958084567772560?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=421958084567772560' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/421958084567772560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/421958084567772560'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/03/blog-post.html' title='Электропочта'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2716627488073168987</id><published>2009-03-15T19:26:00.007+03:00</published><updated>2009-03-16T10:02:51.835+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Передача параметров из HTML в JavaScript</title><content type='html'>&lt;p&gt;Часто при инициализации JS-компонента нужно найти определенный DOM-элемент с&amp;nbsp;которым компонент будет работать, а&amp;nbsp;также достать из&amp;nbsp;HTML параметры (настройки). О&amp;nbsp;способах хранения и&amp;nbsp;передачи в&amp;nbsp;JS этих параметров я&amp;nbsp;и&amp;nbsp;хотел&amp;nbsp;бы поговорить.&lt;/p&gt;

&lt;p&gt;Раньше я&amp;nbsp;решал эту задачу так: простые параметры передавал через классы, сложные&amp;nbsp;&amp;mdash; через дополнительные (не&amp;nbsp;всегда валидные) атрибуты или дочерние элементы.&lt;/p&gt;

&lt;p&gt;Предположим, у&amp;nbsp;нас есть DOM-элемент:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;span id="test"&amp;gt;тест&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;При клике на&amp;nbsp;этот элемент мы&amp;nbsp;хотим показывать некий попап. Для показа попапа нужно задать следующие параметры: ширина, высота, таскаемость попапа и&amp;nbsp;текст. Раньше я&amp;nbsp;написал&amp;nbsp;бы примерно следующее:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;span id="test" class="width_250 height_150 draggable"&amp;gt;&amp;lt;span class="text"&amp;gt;Трам-парам!&amp;lt;/span&amp;gt;тест&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Потом я&amp;nbsp;бы долго и&amp;nbsp;муторно получал значения этих параметров путем выпарсивания их из&amp;nbsp;классов и&amp;nbsp;доставания из&amp;nbsp;дочерних элементов.&lt;/p&gt;

&lt;p&gt;Так&amp;nbsp;бы и&amp;nbsp;мучился дальше, если&amp;nbsp;бы мой коллега &lt;a href="http://dfilatov.blogspot.com/"&gt;Дима Филатов&lt;/a&gt; не&amp;nbsp;подсказал гораздо более элегантное решение&amp;nbsp;&amp;mdash; прописать атрибут onclick в&amp;nbsp;котором возвращать объект с&amp;nbsp;настройками.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;span id="test" onclick="return {width: 250, height: 150, draggable: true, text: 'Трам-парам!'};"&amp;gt;тест&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Как достать этот объект:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var element = document.getElementById('test');

// Забираем параметры
var options = element.onclick instanceof Function ? element.onclick() : {};

// Заметаем следы - обнуляем onclick
element.onclick = null;
element.removeAttribute('onclick');

// Навешиваем обработчик onclick для показа попапа
element.onclick = function () {
    showPopup(options);
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;По&amp;nbsp;сути, для передачи настроек используется формат JSON в&amp;nbsp;котором есть шесть типов значений: объект, массив, строка, число, булевское значение и&amp;nbsp;null. Используя эти типы, можно передавать довольно сложную структуру данных, немыслимую для передачи через классы.&lt;/p&gt;

&lt;p&gt;По-моему, очень круто. Блин, почему я&amp;nbsp;сам не&amp;nbsp;додумался до&amp;nbsp;этого? :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2716627488073168987?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2716627488073168987' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2716627488073168987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2716627488073168987'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/03/params-from-html-to-js.html' title='Передача параметров из&amp;nbsp;HTML в&amp;nbsp;JavaScript'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5593450654760919816</id><published>2009-02-21T15:45:00.009+03:00</published><updated>2009-05-12T23:18:33.038+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><category scheme='http://www.blogger.com/atom/ns#' term='Gmail'/><title type='text'>Особенности верстки Gmail</title><content type='html'>&lt;p&gt;Изучал на&amp;nbsp;досуге верстку Gmail, и&amp;nbsp;хочу поделиться с&amp;nbsp;вами некоторыми наблюдениями.&lt;/p&gt;

&lt;h4&gt;1. Названия классов&lt;/h4&gt;

&lt;p&gt;Первое, что бросается в&amp;nbsp;глаза, это нечеловеческие названия классов у&amp;nbsp;элементов, например, &lt;code&gt;xN0XZb&lt;/code&gt; или &lt;code&gt;z1IiMc&lt;/code&gt;. Думаю, при выкладке в&amp;nbsp;продакшн по&amp;nbsp;названиям классов проходится обфускатор и&amp;nbsp;скукоживает их до&amp;nbsp;минимальной длины обеспечивающей уникальность.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh6.ggpht.com/_dN6tHnouWi8/SZ_31eN9T-I/AAAAAAAABCw/jmTbgYvAsrQ/gmail1.gif" width="506" height="217" alt="" style="padding: 10px; border: 2px solid #cccccc;" /&gt;&lt;/p&gt;


&lt;h4&gt;2. Несемантическая верстка&lt;/h4&gt;

&lt;p&gt;Например, список папок сделан не&amp;nbsp;&lt;code&gt;ul&gt;li&lt;/code&gt;, а&amp;nbsp;дивчиками (адепты семантической верстки содрогнулись от&amp;nbsp;ужаса). Однако, учитывая что все генерится яваскриптом, не&amp;nbsp;вижу в&amp;nbsp;этом большой проблемы.&lt;/p&gt;


&lt;h4&gt;3. Спрайт с&amp;nbsp;фоном&lt;/h4&gt;

&lt;p&gt;Картинка со&amp;nbsp;всеми иконками содержит фиолетово-голубой паттерн-бэкграунд.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh3.ggpht.com/_dN6tHnouWi8/SZ_31QA-mMI/AAAAAAAABC4/BtlwkLQMbCk/icons6.png" width="180" height="100" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Очевидно, сделано это для того, чтобы сразу заметить съехавшее на&amp;nbsp;пиксел позиционирование иконки. Такая самотестирующаяся верстка получается. Круто, но&amp;nbsp;я&amp;nbsp;бы не&amp;nbsp;решился отдавать в&amp;nbsp;продакшн такую картинку. Мало&amp;nbsp;ли что :)&lt;/p&gt;


&lt;h4&gt;4. Скругленные уголки&lt;/h4&gt;

&lt;p&gt;Думаю, в&amp;nbsp;какой-то момент (вероятно, когда делали Themes) чуваки заманались вырезать эти уголки и&amp;nbsp;сделали сервис, который генерит картинки на&amp;nbsp;лету.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://mail.google.com/mail/rc?a=af&amp;c=c3d9ff&amp;w=4&amp;h=4"&gt;http://mail.google.com/mail/rc?a=af&amp;c=c3d9ff&amp;w=4&amp;h=4&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://mail.google.com/mail/rc?a=af&amp;c=black&amp;w=32&amp;h=16"&gt;http://mail.google.com/mail/rc?a=af&amp;c=black&amp;w=32&amp;h=16&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Параметры: c&amp;nbsp;&amp;mdash; цвет в&amp;nbsp;RGB или словом, w&amp;nbsp;&amp;mdash; ширина (от&amp;nbsp;1 до&amp;nbsp;64), h&amp;nbsp;&amp;mdash; высота (от&amp;nbsp;1 до&amp;nbsp;64). Что означает параметр a=af я&amp;nbsp;не&amp;nbsp;осилил.&lt;/p&gt;

&lt;p&gt;Smart folks, those Google people :)&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5593450654760919816?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5593450654760919816' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5593450654760919816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5593450654760919816'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/02/gmail.html' title='Особенности верстки Gmail'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_dN6tHnouWi8/SZ_31eN9T-I/AAAAAAAABCw/jmTbgYvAsrQ/s72-c/gmail1.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5005633695975818603</id><published>2009-02-16T23:50:00.001+03:00</published><updated>2009-02-19T00:43:26.854+03:00</updated><title type='text'>Пока, Студия! Привет, Яндекс!</title><content type='html'>&lt;p&gt;Сегодня был мой первый рабочий день в&amp;nbsp;Яндексе.&lt;/p&gt;

&lt;p&gt;Некоторое время назад я&amp;nbsp;принял непростое решение покинуть Студию Лебедева. Мне нравилось в&amp;nbsp;Студии. Можно сказать, это был мой второй дом. Однако, после почти 7&amp;nbsp;лет настала пора двигаться дальше.&lt;/p&gt;

&lt;p&gt;Cпасибо Студии за&amp;nbsp;все, что между нами было. Мне будет вас не&amp;nbsp;хватать. Удачи!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5005633695975818603?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5005633695975818603' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5005633695975818603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5005633695975818603'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/02/blog-post.html' title='Пока, Студия! Привет, Яндекс!'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4958035919330385189</id><published>2009-02-14T00:33:00.002+03:00</published><updated>2009-03-16T00:26:12.914+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript!</title><content type='html'>&lt;p&gt;Не&amp;nbsp;перестаю удивляться сложности задач, которые можно решить с&amp;nbsp;помощью JavaScript.&lt;/p&gt;

&lt;p&gt;Один чувак написал &lt;a href="http://userscripts.org/scripts/show/38736"&gt;распознавалку капчей&lt;/a&gt; сайта Megaupload. Джон Ресиг &lt;a href="http://ejohn.org/blog/ocr-and-neural-nets-in-javascript/"&gt;разобрал как это сделано&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Другой чувак &lt;a href="http://joncom.be/code/excanvas-world-map"&gt;заебошил карту мира на&amp;nbsp;канвасе&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(Ну не&amp;nbsp;говоря уже про Gmail, Google Reader и&amp;nbsp;Google Docs.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4958035919330385189?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4958035919330385189' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4958035919330385189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4958035919330385189'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2009/02/javascript-oo.html' title='JavaScript!'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7866625975989365004</id><published>2008-12-29T18:22:00.005+03:00</published><updated>2009-03-16T00:26:27.888+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JS: image.onload</title><content type='html'>&lt;p&gt;Делал прелоадилку картинок и&amp;nbsp;столкнулся с&amp;nbsp;проблемой&amp;nbsp;&amp;mdash; в&amp;nbsp;Опере у&amp;nbsp;картинки иногда не&amp;nbsp;срабатывал обработчик события &lt;code&gt;onload&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Оказалось, проблема была в&amp;nbsp;том, что я&amp;nbsp;сначала задавал &lt;code&gt;src&lt;/code&gt; и&amp;nbsp;потом навешивал обработчик &lt;code&gt;onload&lt;/code&gt;, а&amp;nbsp;нужно делать наоборот. Причина проста: если картинка находится в&amp;nbsp;кэше, то&amp;nbsp;в&amp;nbsp;Опере после задания &lt;code&gt;src&lt;/code&gt; она загружается мгновенно, и&amp;nbsp;событие &lt;code&gt;onload&lt;/code&gt; срабатывает еще до&amp;nbsp;того, как мы&amp;nbsp;навесили обработчик &lt;code&gt;onload&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Я&amp;nbsp;наблюдал этот эффект только в&amp;nbsp;Опере, хотя не&amp;nbsp;исключаю, что может проявиться и&amp;nbsp;в&amp;nbsp;других браузерах.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Правильный код:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var image = document.createElement('img');
image.onload = function () {
    // вызывается всегда
    alert('image loaded');
};
image.src = 'test.jpg';&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В&amp;nbsp;общем, логика такая: сначала нужно задать обработчик события, и&amp;nbsp;только потом делать действия, которые могут привести к&amp;nbsp;возникновению этого события.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7866625975989365004?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7866625975989365004' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7866625975989365004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7866625975989365004'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/12/js-imageonload.html' title='JS: image.onload'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-204644293579647075</id><published>2008-11-11T13:55:00.008+03:00</published><updated>2009-05-25T11:55:19.971+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='книги'/><title type='text'>Книги по JavaScript</title><content type='html'>&lt;p&gt;За последние пару лет появилось много хороших книг по&amp;nbsp;яваскрипту, что не&amp;nbsp;может не&amp;nbsp;радовать. Еще совсем недавно можно было посоветовать только &amp;laquo;наименее плохую&amp;raquo; книгу (Флэнагана). Сегодня&amp;nbsp;же я&amp;nbsp;могу порекомендовать вам три отличные книги.&lt;/p&gt;

&lt;p style="position: relative; padding-left: 48px; margin-top: 2.4em;"&gt;John Resig&lt;br /&gt;&lt;a href="http://www.amazon.com/Pro-JavaScript-Techniques-John-Resig/dp/1590597273/"&gt;&lt;img src="http://lh3.ggpht.com/stepan.reznikov/SOxqhG1KyrI/AAAAAAAAAtQ/hNIImrksbx8/book-cover-resig.gif" width="38" height="50" border="0" alt="" style="position: absolute; top: -2px; left: 0;" /&gt;Pro JavaScript Techniques&lt;/a&gt;&lt;br /&gt;&lt;small&gt;Книга недавно вышла &lt;a href="http://www.ozon.ru/context/detail/id/3966286/"&gt;на&amp;nbsp;русском языке&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Джон Ресиг (JavaScript-евангелист в&amp;nbsp;Mozilla Corporation и&amp;nbsp;автор библиотеки jQuery) в&amp;nbsp;своей книге рассказывает об&amp;nbsp;объектно-ориентированном JavaScript, написании кода для повторного использования, тестировании и&amp;nbsp;отладке, DOM, Events, Ajax.&lt;/p&gt;

&lt;p&gt;К сожалению, в&amp;nbsp;книге невероятно много опечаток, в&amp;nbsp;том числе в&amp;nbsp;примерах кода, что особенно неприятно. Также не&amp;nbsp;понравилось, что иногда вместо подробного объяснения какой-либо темы, Ресиг приводит ссылки на&amp;nbsp;статьи в&amp;nbsp;интернете (на&amp;nbsp;того&amp;nbsp;же Крокфорда) где эта тема раскрыта. Я&amp;nbsp;люблю уютно устроиться долгим зимним вечером в&amp;nbsp;обнимку с&amp;nbsp;книгой, и&amp;nbsp;хочу чтобы книга была самодостаточна, чтобы не&amp;nbsp;нужно было ползти за&amp;nbsp;ноутбуком.&lt;/p&gt;

&lt;p&gt;Оценка: 4&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Не смотря на&amp;nbsp;эти недостатки, я&amp;nbsp;собираюсь заказать следующую книгу Ресига&amp;nbsp;&amp;mdash; &lt;a href="http://jsninja.com/"&gt;Secrets of&amp;nbsp;the JavaScript Ninja&lt;/a&gt;, выход которой запланирован на&amp;nbsp;конец 2008&amp;nbsp;года. &lt;a href="http://ejohn.org/blog/secrets-table-of-contents/"&gt;Оглавление&lt;/a&gt; выглядит впечатляюще и&amp;nbsp;многообещающе.&lt;/small&gt;&lt;/p&gt;

&lt;p style="position: relative; padding-left: 48px; margin-top: 2.4em;"&gt;Douglas Crockford&lt;br /&gt;&lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/"&gt;&lt;img src="http://lh6.ggpht.com/stepan.reznikov/SOxqhAt5XuI/AAAAAAAAAtA/A0wXF3L6jdM/book-cover-crockford.gif" width="38" height="50" border="0" alt="" style="position: absolute; top: -2px; left: 0;" /&gt;JavaScript: The Good Parts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Дуглас Крокфорд (главный по&amp;nbsp;JavaScript в&amp;nbsp;Yahoo!) хорошо известен как один из&amp;nbsp;самых крутых специалистов по&amp;nbsp;JavaScript. Дуглас&amp;nbsp;&amp;mdash; автор формата обмена данными &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; и&amp;nbsp;сервиса по&amp;nbsp;проверке корректности кода &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt;. Надо сказать, что его мегамощные &lt;a href="http://developer.yahoo.com/yui/theater/"&gt;лекции&lt;/a&gt; и&amp;nbsp;&lt;a href="http://javascript.crockford.com/"&gt;статьи&lt;/a&gt; меня реально торкнули, поэтому его книгу я&amp;nbsp;ждал с&amp;nbsp;особым нетерпением.&lt;/p&gt;

&lt;p&gt;Книга невелика по&amp;nbsp;объему (всего 145&amp;nbsp;страниц), но&amp;nbsp;насыщена информацией. Крокфорд пишет просто и&amp;nbsp;понятно, без многословных и&amp;nbsp;замысловатых выражений. Я&amp;nbsp;не&amp;nbsp;всегда стопроцентно с&amp;nbsp;ним согласен, тем не&amp;nbsp;менее, его аргументы весьма разумны, а&amp;nbsp;его мнение стоит того, чтобы к&amp;nbsp;нему прислушаться.&lt;/p&gt;

&lt;p&gt;Что мне особенно понравилось в&amp;nbsp;книге Крокфорда (а&amp;nbsp;также в&amp;nbsp;JSLint)&amp;nbsp;&amp;mdash; это внимание к&amp;nbsp;стилю написания кода, как сделать код максимально ясным, кратким, однозначным, как уменьшить шанс возникновения ошибок.&lt;/p&gt;

&lt;p&gt;Оценка: 5, must read&lt;/p&gt;

&lt;p style="position: relative; padding-left: 48px; margin-top: 2.4em;"&gt;Ross Harmes, Dustin Diaz&lt;br /&gt;&lt;a href="http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X/"&gt;&lt;img src="http://lh5.ggpht.com/stepan.reznikov/SOxqhJukS4I/AAAAAAAAAtI/THTpmOxqxR0/book-cover-diaz.gif" width="38" height="50" border="0" alt="" style="position: absolute; top: -2px; left: 0;" /&gt;Pro JavaScript Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Супермегаохуенная книга о&amp;nbsp;применении паттернов проектирования в&amp;nbsp;JavaScript. Я&amp;nbsp;давно мечтал прочитать такую. Организация кода, уменьшение зависимостей компонентов, как сделать код более гибким&amp;nbsp;&amp;mdash; вот главные темы книги.&lt;/p&gt;

&lt;p&gt;Очень понравилось как авторы четко расставляют все по&amp;nbsp;полочкам&amp;nbsp;&amp;mdash; для каждого паттерна приведены за&amp;nbsp;и&amp;nbsp;против его использования, какой выигрыш паттерн может дать, и&amp;nbsp;в&amp;nbsp;чем при этом можно потерять.&lt;/p&gt;

&lt;p&gt;Оценка: 5+, must read&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-204644293579647075?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=204644293579647075' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/204644293579647075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/204644293579647075'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/10/javascript.html' title='Книги по JavaScript'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/stepan.reznikov/SOxqhG1KyrI/AAAAAAAAAtQ/hNIImrksbx8/s72-c/book-cover-resig.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4466386602215186665</id><published>2008-11-01T17:00:00.008+03:00</published><updated>2010-01-18T14:37:35.073+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Типовой лейаут страницы</title><content type='html'>&lt;p class="before_list"&gt;Особенности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standards mode&lt;/li&gt;
&lt;li&gt;Минимальная и максимальная ширина&lt;/li&gt;
&lt;li&gt;При растяжении больше максимальной ширины макет центрируется&lt;/li&gt;
&lt;li&gt;Футер всегда прибит к низу страницы&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;&lt;a href="http://www.stepanreznikov.com/sample-layout/"&gt;Тестовая страница&lt;/a&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;a href="http://www.stepanreznikov.com/sample-layout/example.html"&gt;Простой пример использования&lt;/a&gt;&lt;/h4&gt;

&lt;h4&gt;index.html&lt;/h4&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#7f0055;'&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "&lt;/span&gt;&lt;span style='color:#3f3fbf;'&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;"&gt;&lt;/span&gt;&lt;br/&gt;
&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;html&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;head&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;title&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;Sample layout&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;title&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;link&lt;/span&gt; rel=&lt;span style='color:#2a00ff;'&gt;"stylesheet"&lt;/span&gt; type=&lt;span style='color:#2a00ff;'&gt;"text/css"&lt;/span&gt; href=&lt;span style='color:#2a00ff;'&gt;"main.css"&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;/&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#3f7f59;'&gt;&amp;lt;!--[if lte IE 6]&gt;&amp;lt;link rel="stylesheet" type="text/css" href="main-ie6.css"/&gt;&amp;lt;![endif]--&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;head&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;body&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt; id=&lt;span style='color:#2a00ff;'&gt;"outer"&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt; id=&lt;span style='color:#2a00ff;'&gt;"header"&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;header&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt; id=&lt;span style='color:#2a00ff;'&gt;"content"&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;content&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt; id=&lt;span style='color:#2a00ff;'&gt;"footer"&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;footer&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;div&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;body&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;br/&gt;
&lt;span style='color:#7f0055;'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;html&lt;/span&gt;&lt;span style='color:#7f0055;'&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;main.css&lt;/h4&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#7f0055; font-weight:bold;'&gt;html&lt;/span&gt;, &lt;span style='color:#7f0055; font-weight:bold;'&gt;body&lt;/span&gt; {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;margin&lt;/span&gt;: 0;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;padding&lt;/span&gt;: 0;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;height&lt;/span&gt;: 100%;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
&lt;span style='color:#7f0055; font-weight:bold;'&gt;body&lt;/span&gt; {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;color&lt;/span&gt;: #000;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;background-color&lt;/span&gt;: #fff;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;font-family&lt;/span&gt;: Arial, sans-serif;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;font-size&lt;/span&gt;: 0.8em;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;line-height&lt;/span&gt;: 1.4;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;text-align&lt;/span&gt;: center;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#outer {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;min-height&lt;/span&gt;: 100%;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#outer,&lt;br/&gt;
#footer {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;min-width&lt;/span&gt;: 700px;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;max-width&lt;/span&gt;: 1400px;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;margin&lt;/span&gt;: auto; &lt;span style='color:#3f7f59;'&gt;/* center it */&lt;/span&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;text-align&lt;/span&gt;: left;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#header {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;background-color&lt;/span&gt;: #66cc66;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#content {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;padding-bottom&lt;/span&gt;: 3.2em;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#footer {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;height&lt;/span&gt;: 2.6em;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;margin-top&lt;/span&gt;: -2.6em;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;background-color&lt;/span&gt;: #ff8080;&lt;br/&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;main-ie6.css&lt;/h4&gt;

&lt;p&gt;&lt;code style='color:#000000;background:#ffffff;'&gt;#outer {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;height&lt;/span&gt;: 100%;&lt;br/&gt;
}&lt;br/&gt;
&lt;br/&gt;
#outer,&lt;br/&gt;
#footer {&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='color:#7f0055; font-weight:bold;'&gt;width&lt;/span&gt;: &lt;span style='color:#7f0055; font-weight:bold;'&gt;expression&lt;/span&gt;(document.documentElement.clientWidth &amp;lt; 700 ? &lt;span style='color:#2a00ff;'&gt;'700px'&lt;/span&gt; : document.documentElement.clientWidth &amp;lt; 1400 ? &lt;span style='color:#2a00ff;'&gt;'100%'&lt;/span&gt; : &lt;span style='color:#2a00ff;'&gt;'1400px'&lt;/span&gt;);&lt;br/&gt;
}&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4466386602215186665?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4466386602215186665' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4466386602215186665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4466386602215186665'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/11/sample-layout.html' title='Типовой лейаут страницы'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6830371413609047136</id><published>2008-10-19T17:39:00.007+04:00</published><updated>2008-12-19T12:54:33.031+03:00</updated><title type='text'>Новый iepngfix.htc</title><content type='html'>&lt;p&gt;Наверняка многие из&amp;nbsp;вас пользовались популярным скриптом &lt;a href="http://www.twinhelix.com/css/iepngfix/"&gt;iepngfix.htc&lt;/a&gt;, который исправляет полупрозрачные PNG в&amp;nbsp;IE&amp;nbsp;6. Скрипт умеет фиксить как PNG-изображения &amp;lt;img&amp;gt;, так и&amp;nbsp;PNG заданные бекграундом. Основным недостатком этого инструмента было отсутствие поддержки background-position и&amp;nbsp;background-repeat&amp;nbsp;&amp;mdash; эти параметры игнорировались. К&amp;nbsp;счастью, Angus Turnbull, автор iepngfix, недавно выпустил новую версию v2.0 Alpha&amp;nbsp;3, лишенную этого недостатка. В&amp;nbsp;новой версии добавился еще один файл iepngfix_tilebg.js, в&amp;nbsp;котором находится метод IEPNGFix.tileBG.&lt;/p&gt;

&lt;p&gt;UPD. Коллега наткнулся на&amp;nbsp;еще одну JS-библиотеку для&amp;nbsp;исправления полупрозрачных PNG в&amp;nbsp;IE&amp;nbsp;6&amp;nbsp;&amp;mdash; &lt;a href="http://dillerdesign.com/experiment/DD_belatedPNG/"&gt;DD_belatedPNG&lt;/a&gt;. Также есть поддержка background-position и&amp;nbsp;background-repeat, но&amp;nbsp;подход принципиально другой: вообще отказ от&amp;nbsp;AlphaImageLoader и&amp;nbsp;вместо этого использование VML.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6830371413609047136?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6830371413609047136' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6830371413609047136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6830371413609047136'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/10/iepngfixhtc.html' title='Новый iepngfix.htc'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7357006075717449276</id><published>2008-10-12T12:03:00.001+04:00</published><updated>2009-03-16T00:28:02.458+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSL'/><title type='text'>XSL: применение шаблона с «внутренним» условием</title><content type='html'>&lt;p&gt;Часто бывает нужно применить шаблон для элемента только если этот элемент (или его содержимое) удовлетворяет некоторому условию. Простой пример: применить шаблон для элемента &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt; если внутри есть хотя&amp;nbsp;бы один элемент &lt;code&gt;&amp;lt;Brand&amp;gt;&lt;/code&gt;. Рассмотрим несколько вариантов как можно сделать эту проверку.&lt;/p&gt;

&lt;h4&gt;Вариант 1&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="Something"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="Brands/Brand"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brands"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Производители&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brand"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Неудачное решение, поскольку, написав проверку в&amp;nbsp;шаблоне для &lt;code&gt;&amp;lt;Something&amp;gt;&lt;/code&gt;, мы&amp;nbsp;поместили в&amp;nbsp;этот шаблон знание об&amp;nbsp;особенности трансформации &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt;.&lt;/p&gt;



&lt;h4&gt;Вариант 2&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="Something"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brands[Brand]"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Производители&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brand"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Немного компактнее, но&amp;nbsp;проблема первого варианта осталась.&lt;/p&gt;



&lt;h4&gt;Вариант 3&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="Something"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brands"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="Brand"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Производители&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brand"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Гораздо лучше. Шаблон для &lt;code&gt;&amp;lt;Something&amp;gt;&lt;/code&gt; просто вызывает шаблон для &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt;, не&amp;nbsp;заморачиваясь о&amp;nbsp;внутреннем устройстве &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt;. Шаблон для &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt; сам разбирается как трансформировать &lt;code&gt;&amp;lt;Brands&amp;gt;&lt;/code&gt;.&lt;/p&gt;



&lt;h4&gt;Вариант 4&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="Something"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brands"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands"/&amp;gt;&lt;br /&gt;
&amp;lt;xsl:template match="Brands[Brand]"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Производители&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brand"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Я предпочитаю этот вариант. Он&amp;nbsp;также хорошо работает и&amp;nbsp;в&amp;nbsp;случае с&amp;nbsp;несколькими условиями&amp;nbsp;&amp;mdash; вместо громоздкого &lt;code&gt;&amp;lt;xsl:choose&amp;gt;&lt;/code&gt; мы&amp;nbsp;получаем компактные шаблончики.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="Brands"/&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands[Brand]"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Производители&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select="Brand"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;xsl:template match="Brands[count(Brand) &amp;gt; 10]"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;Много производителей&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- Выводим бренды в три колонки --&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7357006075717449276?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7357006075717449276' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7357006075717449276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7357006075717449276'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/10/xsl.html' title='XSL: применение шаблона с&amp;nbsp;&amp;laquo;внутренним&amp;raquo; условием'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5191026028279816366</id><published>2008-09-24T23:27:00.003+04:00</published><updated>2009-03-16T00:29:10.980+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Ссылка цветом текста</title><content type='html'>&lt;p&gt;&lt;em&gt;Задача:&lt;/em&gt; сделать ссылки цветом текста. При этом в&amp;nbsp;разных блоках на&amp;nbsp;странице цвет текста может меняться.&lt;/p&gt;

&lt;p&gt;Сначала я&amp;nbsp;указал цвет ссылки отдельно для каждого блока.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;body {color: black;}&lt;br /&gt;
a.glossary {color: black;}&lt;br /&gt;
#shurum, #shurum a.glossary {color: red;}&lt;br /&gt;
#burum, #burum a.glossary {color: green;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Потом я&amp;nbsp;подумал, что ведь цвет ссылки можно наследовать от&amp;nbsp;блока.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;body {color: black;}&lt;br /&gt;
a.glossary {color: inherit;}&lt;br /&gt;
#shurum {color: red;}&lt;br /&gt;
#burum {color: green;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Радости моей не&amp;nbsp;было предела, пока я&amp;nbsp;не&amp;nbsp;открыл страницу в&amp;nbsp;IE. Фак! Оба осла (6 и&amp;nbsp;7) не&amp;nbsp;поддержали мою гениальную задумку и&amp;nbsp;ни&amp;nbsp;хрена не&amp;nbsp;пронаследовали цвет. Тогда я&amp;nbsp;&lt;del&gt;достал большую базуку и&amp;nbsp;замочил IE вдребезги пополам&lt;/del&gt; написал маленький экспрешн.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;a.glossary {color: expression(this.parentNode.currentStyle.color);}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Лучше, конечно, написать &lt;a href="http://cssing.org.ua/2007/12/06/expression-optimization/"&gt;одноразовый экспрешн&lt;/a&gt; (не&amp;nbsp;стал здесь так делать для наглядности).&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5191026028279816366?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5191026028279816366' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5191026028279816366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5191026028279816366'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/09/blog-post.html' title='Ссылка цветом текста'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3380013634444386645</id><published>2008-09-15T23:00:00.008+04:00</published><updated>2009-03-16T00:29:40.039+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='браузеры'/><title type='text'>IE 6 занял место Netscape 4</title><content type='html'>&lt;p&gt;Лет 6&amp;mdash;7 назад все ненавидели Netscape&amp;nbsp;4. Чтобы добиться нормального отображения страницы в&amp;nbsp;Netscape&amp;nbsp;4, верстали исключительно таблицами, делали распорки, а&amp;nbsp;о&amp;nbsp;семантической верстке не&amp;nbsp;шло и&amp;nbsp;речи. Как только его не&amp;nbsp;обзывали&amp;nbsp;&amp;mdash; Нетшкаф, Нетглюк, Нафигатор. Но&amp;nbsp;постепенно сайты отказывались от&amp;nbsp;A-grade поддержки Netscape&amp;nbsp;4. Я&amp;nbsp;помню этот радостный момент, когда Студия объявила о&amp;nbsp;прекращении полноценной поддержки Netscape&amp;nbsp;4&amp;nbsp;&amp;mdash; все технологи со&amp;nbsp;слезами на&amp;nbsp;глазах обнялись и&amp;nbsp;поздравили друг друга.&lt;/p&gt;

&lt;p&gt;Сейчас место &amp;laquo;браузера-изгоя тормозящего развитие веба&amp;raquo; занял IE&amp;nbsp;6. Хотя говорить о&amp;nbsp;прекращении A-grade поддержки IE&amp;nbsp;6 еще рано (думаю, придется еще пару лет с&amp;nbsp;шестым ослом помучиться), тенденция к&amp;nbsp;этому уже наметилась&amp;nbsp;&amp;mdash; все чаще встречаются сайты где что-то отвалилось или разъехалось в&amp;nbsp;IE&amp;nbsp;6.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Ссылка по теме: &lt;a href="http://developer.yahoo.com/yui/articles/gbs/"&gt;Graded Browser Support&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3380013634444386645?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3380013634444386645' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3380013634444386645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3380013634444386645'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/09/ie-6-netscape-4.html' title='IE 6 занял место Netscape 4'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3983191569945160226</id><published>2008-09-01T22:10:00.005+04:00</published><updated>2009-03-16T00:29:59.089+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript: область видимости переменных</title><content type='html'>&lt;p&gt;В&amp;nbsp;JavaScript область видимости переменных не&amp;nbsp;ограничивается блоком &lt;code&gt;{}&lt;/code&gt;, а&amp;nbsp;ограничивается только функцией. Например, переменные объявленные внутри &lt;code&gt;for&lt;/code&gt; или &lt;code&gt;if&lt;/code&gt; продолжают жить после того, как эти &lt;code&gt;for&lt;/code&gt; и&amp;nbsp;&lt;code&gt;if&lt;/code&gt; отработали.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;for (var i = 0; i &lt; 10; i += 1) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var a = i * i;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// do something&lt;br /&gt;
}&lt;br /&gt;
document.writeln(i);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 10&lt;br /&gt;
document.writeln(a);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 81&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;if (true) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var b = "test";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// do something&lt;br /&gt;
}&lt;br /&gt;
document.writeln(b);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// test&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;Поэтому, лучше явно обозначить это в&amp;nbsp;коде.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var i, a;&lt;br /&gt;
for (i = 0; i &lt; 10; i += 1) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = i * i;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// do something&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var b;&lt;br /&gt;
if (true) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = "test";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// do something&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;Во&amp;nbsp;многих языках программирования рекомендуется объявлять переменные как можно ближе к&amp;nbsp;месту первого использования. В&amp;nbsp;JavaScript все используемые в&amp;nbsp;функции локальные переменные лучше объявлять в&amp;nbsp;самом начале функции.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var myFunction = function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Объявление всех локальных переменных, включая переменные циклов&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Код функции&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3983191569945160226?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3983191569945160226' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3983191569945160226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3983191569945160226'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/09/javascript.html' title='JavaScript: область видимости переменных'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8699463249899602748</id><published>2008-08-04T23:05:00.005+04:00</published><updated>2009-03-16T00:30:25.475+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Простое правило для маргинов</title><content type='html'>&lt;p&gt;При задании отступов у&amp;nbsp;блоков я&amp;nbsp;придерживаюсь простого правила&amp;nbsp;&amp;mdash; задаю отступы &lt;strong&gt;справа и&amp;nbsp;снизу&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh3.ggpht.com/stepan.reznikov/SJdPQJ2baKI/AAAAAAAAAqg/l_HhzBWCXXo/margins-simple-rule-1.gif" width="291" height="452" border="0" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Если первый блок будет вдруг отсутствовать, второй блок прижмется к&amp;nbsp;левой/верхней границе.&lt;/p&gt;

&lt;p&gt;Если задавать отступы наоборот, слева и&amp;nbsp;сверху, тогда второй блок не&amp;nbsp;прижмется к&amp;nbsp;границе как хотелось&amp;nbsp;бы.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/stepan.reznikov/SJdPQNCg-II/AAAAAAAAAqo/640ZOK6kUjM/margins-simple-rule-2.gif" width="176" height="161" border="0" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Это правило позволяет уменьшить зависимость блоков от&amp;nbsp;окружения, то&amp;nbsp;есть повышает универсальность верстки.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8699463249899602748?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8699463249899602748' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8699463249899602748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8699463249899602748'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/08/blog-post_04.html' title='Простое правило для маргинов'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/stepan.reznikov/SJdPQJ2baKI/AAAAAAAAAqg/l_HhzBWCXXo/s72-c/margins-simple-rule-1.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8188850756471620828</id><published>2008-08-02T12:27:00.005+04:00</published><updated>2009-03-16T00:30:53.372+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Элементы с id порождают глобальные переменные в JS</title><content type='html'>&lt;p&gt;Для всех элементов с&amp;nbsp;атрибутом &lt;code&gt;id&lt;/code&gt; в&amp;nbsp;джавасрипте создается глобальная переменная. Следующий пример во&amp;nbsp;всех браузерах выдаст алерт с&amp;nbsp;"DIV".&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.onload = function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(myDiv.tagName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="myDiv"&amp;gt;test&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p class="before_list"&gt;Это плохо, но в&amp;nbsp;принципе не&amp;nbsp;страшно, если&amp;nbsp;вы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Избегаете создавать свои глобальные переменные.&lt;/li&gt;
&lt;li&gt;Не&amp;nbsp;забываете объявлять свои переменные. Если вы&amp;nbsp;забыли объявить переменную (var myVar), то&amp;nbsp;джавасрипт считает, что это глобальная переменная (implied global variable).&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8188850756471620828?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8188850756471620828' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8188850756471620828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8188850756471620828'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/08/blog-post.html' title='Элементы с&amp;nbsp;id порождают глобальные переменные в&amp;nbsp;JS'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5753043460442870445</id><published>2008-07-04T22:18:00.003+04:00</published><updated>2008-07-04T23:07:22.169+04:00</updated><title type='text'>Названия картинок</title><content type='html'>&lt;p&gt;Советую не&amp;nbsp;использовать в&amp;nbsp;названии обычных картинок слова banner, promo и&amp;nbsp;ad. У&amp;nbsp;многих пользователей стоят блокировщики рекламы (например &lt;a href="http://adblockplus.org/"&gt;Adblock&lt;/a&gt;), которые не&amp;nbsp;показывают такие картинки. Кстати, веб-разработчику не&amp;nbsp;помешает проверять свои сайты в&amp;nbsp;браузере с&amp;nbsp;установленным блокировщиком рекламы.&lt;/p&gt;

&lt;p&gt;Названия баннеров, наоборот, нужно честно начинать со&amp;nbsp;слова banner, чтобы их&amp;nbsp;не&amp;nbsp;видели те, кто не&amp;nbsp;хочет их&amp;nbsp;видеть.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5753043460442870445?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5753043460442870445' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5753043460442870445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5753043460442870445'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/07/blog-post.html' title='Названия картинок'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3918325287032915346</id><published>2008-06-30T01:05:00.001+04:00</published><updated>2009-03-16T00:31:20.673+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>JavaScript + CSS</title><content type='html'>&lt;p&gt;&lt;em&gt;Задача:&lt;/em&gt; Подружить JavaScript и&amp;nbsp;CSS, чтобы при отсутствии JavaScript применялись немного другие стили.&lt;/p&gt;

&lt;p&gt;Предположим, что у&amp;nbsp;нас есть блок &lt;code&gt;&amp;lt;div id="block"&amp;gt;блок&amp;lt;/div&amp;gt;&lt;/code&gt;, который изначально должен быть скрыт и&amp;nbsp;появляться по&amp;nbsp;нажатию на&amp;nbsp;псевдоссылку &lt;code&gt;&amp;lt;span id="link"&amp;gt;псевдоссылка&amp;lt;/span&amp;gt;&lt;/code&gt;. Если&amp;nbsp;же джаваскрипта нет, то&amp;nbsp;блок должен показаться сразу, а&amp;nbsp;псевдоссылка спрятаться с&amp;nbsp;глаз долой.&lt;/p&gt;


&lt;h4&gt;Вариант 1. С&amp;nbsp;использованием тега &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; (олд скул)&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#block {display: none;}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;noscript&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#block {display: block;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#link {display: none;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/noscript&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Это работает, но&amp;nbsp;приходится создавать отдельный кусок стилей. К&amp;nbsp;тому&amp;nbsp;же валидатор ругается что есть сил, поскольку &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; запрещен внутри &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;, а&amp;nbsp;&lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; запрещен внутри &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Плохой способ, не&amp;nbsp;рекомендую так делать.&lt;/p&gt;


&lt;h4&gt;Вариант 2.&lt;/h4&gt;

&lt;p&gt;Гораздо лучше пойти по&amp;nbsp;пути последовательного улучшения (&lt;a href="http://en.wikipedia.org/wiki/Progressive_Enhancement"&gt;progressive enhancement&lt;/a&gt;), суть которого заключается в&amp;nbsp;том, что сначала мы&amp;nbsp;добиваемся корректной работы в&amp;nbsp;самом простом, доступном окружении (в&amp;nbsp;данном случае&amp;nbsp;&amp;mdash; в&amp;nbsp;браузере с&amp;nbsp;неработающим джаваскриптом), а&amp;nbsp;затем постепенно улучшаем наше решение, добавляя функционал для повышения удобства пользователей в&amp;nbsp;браузерах поддерживающих этот функционал.&lt;/p&gt;

&lt;p&gt;Это означает, что стили изначально должны быть настроены для случая отсутствия джаваскрипта. Далее загружается джаваскрипт, находит наш блок и&amp;nbsp;скрывает его, находит псевдоссылку и&amp;nbsp;показывает&amp;nbsp;ее. Недостаток такого решения в&amp;nbsp;том, что блок может &amp;laquo;моргать&amp;raquo;&amp;nbsp;&amp;mdash; пользователь может увидеть его на&amp;nbsp;какое-то короткое время (пока загружается и&amp;nbsp;выполняется джаваскрипт).&lt;/p&gt;


&lt;h4&gt;Вариант 3.&lt;/h4&gt;

&lt;p&gt;Как можно побороть моргание блока? Я&amp;nbsp;использую такое решение. В&amp;nbsp;теге &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; добавляем простую строчку:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;document.documentElement.className = "js";&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Если джаваскрипт включен, элементу &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; присвоится класс &lt;code&gt;js&lt;/code&gt;. Что важно, это произойдет до&amp;nbsp;загрузки контента. Теперь можно написать такие стили:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#link {display: none;}&lt;br /&gt;&lt;br /&gt;
.js #link {display: inline;}&lt;br /&gt;
.js #block {display: none;}&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3918325287032915346?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3918325287032915346' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3918325287032915346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3918325287032915346'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/javascript-css.html' title='JavaScript + CSS'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4161980881898024470</id><published>2008-06-16T12:18:00.003+04:00</published><updated>2008-09-19T19:36:25.702+04:00</updated><title type='text'>Ретрахинг кода (refucktoring)</title><content type='html'>&lt;p&gt;Выработал привычку: каждый рабочий день начинаю с&amp;nbsp;ревизии кода, написанного за&amp;nbsp;предыдущий день.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4161980881898024470?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4161980881898024470' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4161980881898024470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4161980881898024470'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/blog-post_257.html' title='Ретрахинг кода (refucktoring)'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6535564410968804300</id><published>2008-06-16T00:07:00.005+04:00</published><updated>2009-03-16T00:31:55.941+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Keyboard navigation</title><content type='html'>&lt;p&gt;Некоторым людям (особенно с&amp;nbsp;двигательными расстройствами) сложно пользоваться мышью для просмотра веб-страниц. Вместо мыши они используют предоставляемую браузерами клавиатурную навигацию при помощи клавиши Tab. Добавляя на&amp;nbsp;страницу JavaScript, нужно подумать об&amp;nbsp;этих людях и&amp;nbsp;предусмотреть навигацию с&amp;nbsp;помощью клавиатуры.&lt;/p&gt;

&lt;p&gt;По-хорошему, для каждого обработчика действия мышью должен быть соответствующий обработчик для клавиатуры. Например, если есть обработчик события &lt;code&gt;onclick&lt;/code&gt;, по&amp;nbsp;идее, нужен и&amp;nbsp;обработчик для &lt;code&gt;onkeydown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Код на&amp;nbsp;jQuery:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$("#test").click(function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doSomething();&lt;br /&gt;
});&lt;br /&gt;
$("#test").keydown(function (event) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Allow the Enter key to activate that element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return event.keyCode != 13 || doSomething();&lt;br /&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Далее, хорошо&amp;nbsp;бы прописать стили для псевдокласса &lt;code&gt;:focus&lt;/code&gt;. Хотя&amp;nbsp;бы такие же, как и&amp;nbsp;для &lt;code&gt;:hover&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#test:hover,&lt;br /&gt;
#test:focus {color: #cc0000;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Чтобы также ховерилось и&amp;nbsp;фокусировалось в&amp;nbsp;IE, нужно навесить обработчики для событий &lt;code&gt;onmouseover/onfocus&lt;/code&gt; и&amp;nbsp;&lt;code&gt;onmouseout/onblur&lt;/code&gt; в&amp;nbsp;которых, соответственно, нужно добавлять и&amp;nbsp;убирать какой-нибудь класс.&lt;/p&gt;

&lt;p&gt;Все круто, но&amp;nbsp;с&amp;nbsp;помощью таба можно пройтись только по&amp;nbsp;ссылкам и&amp;nbsp;элементам форм. Другие элементы по&amp;nbsp;умолчанию не&amp;nbsp;получают фокус. Что делать, если активный элемент, на&amp;nbsp;который мы&amp;nbsp;навесили &lt;code&gt;onclick&lt;/code&gt; и&amp;nbsp;&lt;code&gt;onkeydown&lt;/code&gt;, не&amp;nbsp;ссылка, а&amp;nbsp;&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Для этого существует атрибут &lt;code&gt;tabindex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tabindex="0"&lt;/code&gt;&amp;nbsp;&amp;mdash; разрешает элементу получать фокус в&amp;nbsp;порядке в&amp;nbsp;котором он&amp;nbsp;идет в&amp;nbsp;документе.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tabindex="5"&lt;/code&gt;&amp;nbsp;&amp;mdash; положительное значение позволяет изменить порядок получения фокуса элементом при навигации табом.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tabindex="-1"&lt;/code&gt;&amp;nbsp;&amp;mdash; отрицательное значение исключает элемент из&amp;nbsp;навигации табом.&lt;/p&gt;

&lt;p&gt;Проверил, работает в&amp;nbsp;IE и&amp;nbsp;Firefox. Опера и&amp;nbsp;Сафари, к&amp;nbsp;сожалению, вообще пока не&amp;nbsp;поддерживают навигацию табом.&lt;/p&gt;

&lt;p&gt;Пример клавиатурной навигации: &lt;a href="http://job.euroset.ru/candidates/benefits/"&gt;ездилка&lt;/a&gt; на&amp;nbsp;сайте вакансий Евросети.&lt;/p&gt;

&lt;p&gt;P.&amp;nbsp;S. Кстати, а&amp;nbsp;знаете&amp;nbsp;ли вы, что Shift + Tab перемещает фокус в&amp;nbsp;обратном порядке?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6535564410968804300?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6535564410968804300' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6535564410968804300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6535564410968804300'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/keyboard-navigation.html' title='Keyboard navigation'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2431390636121943740</id><published>2008-06-15T13:31:00.005+04:00</published><updated>2008-06-15T14:02:31.955+04:00</updated><title type='text'>Резюме в виде облака</title><content type='html'>&lt;p&gt;Наткнулся на&amp;nbsp;забавный онлайн-сервис: &lt;a href="http://wordle.net/"&gt;Wordle&lt;/a&gt;&amp;nbsp;&amp;mdash; генератор красивых облаков из&amp;nbsp;слов. Запостил в&amp;nbsp;эту штуку свое резюме:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh4.ggpht.com/stepan.reznikov/SFTdlQzKtpI/AAAAAAAAApo/gSkFKVuLaW8/resume-cloud.gif"&gt;&lt;img src="http://lh6.ggpht.com/stepan.reznikov/SFTjd8YeNRI/AAAAAAAAAp4/FVl2mAaXqL4/resume-cloud-thumb.gif" width="416" height="242" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2431390636121943740?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2431390636121943740' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2431390636121943740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2431390636121943740'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/blog-post_15.html' title='Резюме в&amp;nbsp;виде облака'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/stepan.reznikov/SFTjd8YeNRI/AAAAAAAAAp4/FVl2mAaXqL4/s72-c/resume-cloud-thumb.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5481582229880638703</id><published>2008-06-07T11:42:00.004+04:00</published><updated>2009-03-16T00:32:15.433+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Крокфорд жжет</title><content type='html'>&lt;p&gt;Как известно, многие врачи используют книги по&amp;nbsp;программированию как мощное средство при лечении тяжелых случаев нарушения сна. Люди, страдающие от&amp;nbsp;страшной бессонницы, засыпают после прочтения всего лишь нескольких страниц. Помимо сухих и&amp;nbsp;скучных теоретических выкладок, многие книги изобилуют занудными неживыми примерами.&lt;/p&gt;

&lt;p&gt;Другое дело&amp;nbsp;&amp;mdash; книга Дугласа Крокфорда &amp;laquo;JavaScript: The Good Parts&amp;raquo;. Душа радуется!&lt;/p&gt;

&lt;p&gt;Пример вложенного объекта:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var flight = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;airline: "Oceanic",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;number: 815,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;departure: {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IATA: "SYD",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time: "2004-09-22 14:55",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;city: "Sydney"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrival: {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IATA: "LAX",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time: "2004-09-23 10:42",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;city: "Los Angeles"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Пример добавления метода у&amp;nbsp;массива:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;span style="font-size: 85%;"&gt;Function.prototype.method = function (name, func) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.prototype[name] = func;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this;&lt;br /&gt;
};&lt;br /&gt;&lt;br /&gt;
Array.method('reduce', function (f, value) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i = 0; i &lt; this.length; i += 1) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value = f(this[i], value);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return value;&lt;br /&gt;
});&lt;br /&gt;&lt;br /&gt;
...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;
// Create an array of numbers.&lt;br /&gt;&lt;br /&gt;
var data = [4, 8, 15, 16, 23, 42];&lt;br /&gt;&lt;br /&gt;
// Define two simple functions. One will add two&lt;br /&gt;
// numbers. The other will multiply two numbers.&lt;br /&gt;&lt;br /&gt;
var add = function (a, b) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a + b;&lt;br /&gt;
};&lt;br /&gt;&lt;br /&gt;
var mult = function (a, b) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a * b;&lt;br /&gt;
};&lt;br /&gt;&lt;br /&gt;
// Invoke the data's reduce method, passing in the&lt;br /&gt;
// add function.&lt;br /&gt;&lt;br /&gt;
var sum = data.reduce(add, 0);  // sum is 108&lt;br /&gt;&lt;br /&gt;
// Invoke the reduce method again, this time passing&lt;br /&gt;
// in the multiply function.&lt;br /&gt;&lt;br /&gt;
var product = data.reduce(mult, 1);  // product is 7418880&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Только недавно досмотрел второй сезон. Я&amp;nbsp;не&amp;nbsp;тормоз, просто смакую :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5481582229880638703?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5481582229880638703' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5481582229880638703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5481582229880638703'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/blog-post.html' title='Крокфорд жжет'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1424221662996499700</id><published>2008-06-06T13:08:00.005+04:00</published><updated>2008-06-06T13:36:35.103+04:00</updated><title type='text'>Developers, developers, developers!</title><content type='html'>&lt;p&gt;В&amp;nbsp;IEBlog &lt;a href="http://blogs.msdn.com/ie/archive/2008/06/03/ie8-beta-2-coming-in-august.aspx"&gt;проскочило упоминание&lt;/a&gt;, что, начиная с&amp;nbsp;момента выпуска IE8 Beta&amp;nbsp;1, было сделано более двух миллионов скачиваний. Первая бета была &lt;a href="http://blogs.msdn.com/ie/archive/2008/03/05/internet-explorer-8-beta-1-for-developers-now-available.aspx"&gt;адресована
разработчикам&lt;/a&gt; и, я&amp;nbsp;уверен, что большинство скачавших так или иначе
занимаются сайтостроением. То&amp;nbsp;есть можно прикинуть, что в&amp;nbsp;мире порядка
двух миллионов веб-разработчиков!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1424221662996499700?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1424221662996499700' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1424221662996499700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1424221662996499700'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/06/developers-developers-developers.html' title='Developers, developers, developers!'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7158934881993607941</id><published>2008-05-31T02:06:00.002+04:00</published><updated>2009-03-16T00:32:41.946+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='браузеры'/><title type='text'>Браузеры на моем десктопе</title><content type='html'>&lt;p&gt;&lt;img src="http://lh4.ggpht.com/stepan.reznikov/SEB3HpjxScI/AAAAAAAAAow/2tiNrPxIC44/my-browsers.gif" width="498" height="378" border="0" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Еще в&amp;nbsp;виртуальной машине есть IE&amp;nbsp;8 Beta&amp;nbsp;1 и&amp;nbsp;Firefox&amp;nbsp;2, плюс в&amp;nbsp;стареньком G4&amp;nbsp;Cube живут маковские Safari и&amp;nbsp;Firefox.&lt;/p&gt;

&lt;p&gt;Третий Firefox пока не&amp;nbsp;ставил и&amp;nbsp;не&amp;nbsp;щупал (что-то я&amp;nbsp;туплю на&amp;nbsp;самом деле, надо поставить). И&amp;nbsp;для полного счастья еще не&amp;nbsp;хватает Konqueror (надо&amp;nbsp;бы тоже на&amp;nbsp;досуге поставить).&lt;/p&gt;

&lt;p&gt;Вообще я&amp;nbsp;стараюсь повседневно использовать более старые браузеры и&amp;nbsp;не&amp;nbsp;ставить последние версии как основные. Например, я&amp;nbsp;был последним из&amp;nbsp;могикан в&amp;nbsp;Студии у&amp;nbsp;которого дефолтный IE был версии 5.5.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7158934881993607941?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7158934881993607941' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7158934881993607941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7158934881993607941'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_31.html' title='Браузеры на&amp;nbsp;моем десктопе'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/stepan.reznikov/SEB3HpjxScI/AAAAAAAAAow/2tiNrPxIC44/s72-c/my-browsers.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4461735078770505813</id><published>2008-05-29T02:12:00.010+04:00</published><updated>2009-03-16T00:33:04.849+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='браузеры'/><title type='text'>Скажи мне, какой у тебя браузер</title><content type='html'>&lt;p&gt;Изучал тут статистику использования браузеров за&amp;nbsp;май 2008&amp;nbsp;года...&lt;/p&gt;

&lt;h4&gt;Сайт нашей Студии&lt;/h4&gt;

&lt;table cellpadding="5" class="data"&gt;
 &lt;tr&gt;
  &lt;td&gt;Firefox&lt;/td&gt;
  &lt;td align="right"&gt;43,58%&lt;/td&gt;
  &lt;td style="color: red;"&gt;тыдыщ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 6.0&lt;/td&gt;
  &lt;td align="right"&gt;17,56%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 7.0&lt;/td&gt;
  &lt;td align="right"&gt;14,37%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;Opera 9.x&lt;/td&gt;
  &lt;td align="right"&gt;18,36%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;...&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 5.0&lt;/td&gt;
  &lt;td align="right"&gt;0,55%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 5.5&lt;/td&gt;
  &lt;td align="right"&gt;0,07%&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;


&lt;h4&gt;Сайт банка&lt;/h4&gt;

&lt;table cellpadding="5" class="data"&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 6.0&lt;/td&gt;
  &lt;td align="right"&gt;47,37%&lt;/td&gt;
  &lt;td style="color: red;"&gt;тыдыщ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 7.0&lt;/td&gt;
  &lt;td align="right"&gt;30,72%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;Firefox&lt;/td&gt;
  &lt;td align="right"&gt;10,64%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;Opera 9.x&lt;/td&gt;
  &lt;td align="right"&gt;8,45%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;...&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 5.0&lt;/td&gt;
  &lt;td align="right"&gt;0,33%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 5.5&lt;/td&gt;
  &lt;td align="right"&gt;0,12%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 4.0&lt;/td&gt;
  &lt;td align="right"&gt;0,09%&lt;/td&gt;
  &lt;td style="color: red;"&gt;фигасе&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;


&lt;h4&gt;Интернет-магазин&lt;/h4&gt;

&lt;table cellpadding="5" class="data"&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 6.0&lt;/td&gt;
  &lt;td align="right"&gt;30,89%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;IE 7.0&lt;/td&gt;
  &lt;td align="right"&gt;25,61%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;Opera 9.x&lt;/td&gt;
  &lt;td align="right"&gt;25,46%&lt;/td&gt;
  &lt;td style="color: red;"&gt;тыдыщ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;Firefox&lt;/td&gt;
  &lt;td align="right"&gt;14,91%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;...&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="font-size: 70%;"&gt;
  &lt;td&gt;IE 5.5&lt;/td&gt;
  &lt;td align="right"&gt;0,07%&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Можно сделать несколько интересных выводов. Во-первых, видно, что статистика использования браузеров сильно зависит от&amp;nbsp;сайта. Статистику, которую обычно предлагают нам всякие &amp;laquo;исследования аудитории Рунета&amp;raquo; можно назвать средней температурой по&amp;nbsp;палате.&lt;/p&gt;

&lt;p&gt;На сайте Студии зашкаливает Firefox. Ну&amp;nbsp;оно и&amp;nbsp;понятно. Кто ходит на&amp;nbsp;сайт Студии? Веб-дизайнеры, веб-разработчики и&amp;nbsp;прочие веб-интересующиеся&amp;nbsp;&amp;mdash; &amp;laquo;продвинутые&amp;raquo; ребята, использующие &amp;laquo;правильный&amp;raquo; браузер.&lt;/p&gt;

&lt;p&gt;Банковский сайт&amp;nbsp;&amp;mdash; засилье Internet Explorer, причем с&amp;nbsp;уклоном в&amp;nbsp;сторону более старых версий. Кто ходит? Офисные работники на&amp;nbsp;старых, давно не&amp;nbsp;апгрейженных компах.&lt;/p&gt;

&lt;p&gt;25% Оперы в&amp;nbsp;интернет-магазине? Моя теория такая. Добросовестный человек занимается интернет-шоппингом в&amp;nbsp;свободное от&amp;nbsp;работы время с&amp;nbsp;домашнего компьютера. По&amp;nbsp;всей видимости, Опера&amp;nbsp;&amp;mdash; выбор многих рядовых пользователей для серфинга из&amp;nbsp;дома.&lt;/p&gt;

&lt;p&gt;Примерно от&amp;nbsp;трети до&amp;nbsp;половины пользователей IE проапгрейдились до&amp;nbsp;IE&amp;nbsp;7.0. И&amp;nbsp;это хорошо. Признаюсь, я&amp;nbsp;стал уже немного забивать на&amp;nbsp;IE&amp;nbsp;6.0. Скажем, на&amp;nbsp;неработающий в&amp;nbsp;IE&amp;nbsp;6.0 псевдокласс hover не&amp;nbsp;у&amp;nbsp;ссылок. Раньше писал джаваскриптик, который ловил onmouseover/onmouseout и&amp;nbsp;навешивал/убирал класс hover. А&amp;nbsp;сейчас забил.&lt;/p&gt;

&lt;p&gt;Тем не&amp;nbsp;менее, еще около полпроцента пользуются IE&amp;nbsp;5.0 и&amp;nbsp;IE&amp;nbsp;5.5. И&amp;nbsp;это до&amp;nbsp;хрена! При посещаемости 50&amp;nbsp;000 в&amp;nbsp;день, это 250 человек. Обязательно нужно проверять сайт в&amp;nbsp;этих браузерах. Контент должен читаться, навигация должна работать, человек должен мочь выполнить свою задачу с&amp;nbsp;которой он&amp;nbsp;пришел на&amp;nbsp;сайт.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4461735078770505813?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4461735078770505813' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4461735078770505813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4461735078770505813'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_29.html' title='Скажи мне, какой у тебя браузер'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3215695312122380053</id><published>2008-05-23T15:01:00.004+04:00</published><updated>2009-03-16T00:33:36.875+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript: контекст для вложенных функций</title><content type='html'>&lt;p style="font-size: 85%;"&gt;that и&amp;nbsp;this сидели на трубе&amp;hellip;&lt;/p&gt;

&lt;p&gt;Как известно, &lt;code&gt;this&lt;/code&gt; внутри вложенных функций (inner functions) равен глобальному объекту (global object). Из-за этого приходится писать нелепую конструкцию &lt;code&gt;var that = this;&lt;/code&gt; (господи, сколько&amp;nbsp;же раз я&amp;nbsp;написал эту строчку!)&lt;/p&gt;

&lt;p&gt;Пример:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var test = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;init: function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.txt = 'Test!';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var that = this;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.setTimeout(function() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(that.txt);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, 1000);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Как&amp;nbsp;же избавиться от&amp;nbsp;ненавистного &lt;code&gt;that&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Для этого попробуем воспользоваться методом &lt;code&gt;apply&lt;/code&gt;, который позволяет задать контекст (чему будет равен &lt;code&gt;this&lt;/code&gt;) у&amp;nbsp;функции. Однако, применить &lt;code&gt;apply&lt;/code&gt; к&amp;nbsp;callback-функции передаваемой в&amp;nbsp;&lt;code&gt;setTimeout&lt;/code&gt; нельзя, поскольку &lt;code&gt;apply&lt;/code&gt; сразу выполняет функцию к&amp;nbsp;которой он&amp;nbsp;применен. Поэтому напишем вспомогательный метод &lt;code&gt;scope&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Function.prototype.scope = function (o) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;var fn = this;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;return function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return fn.apply(o, arguments);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Теперь перепишем наш пример, используя метод &lt;code&gt;scope&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var test = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;init: function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.txt = 'Test!';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.setTimeout(function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(this.txt);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}.scope(this), 1000);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ура, мы&amp;nbsp;избавились от&amp;nbsp;&lt;code&gt;that&lt;/code&gt;!&lt;/p&gt;

&lt;p class="before_list"&gt;Плюсы:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;Выкинули &lt;code&gt;var that = this;&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;В&amp;nbsp;inner function используем &amp;laquo;родную&amp;raquo; переменную &lt;code&gt;this&lt;/code&gt; вместо трижды злоебучей &lt;code&gt;that&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;Мне кажется, код стал выглядеть элегантнее&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="before_list"&gt;Спорные моменты:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;Экономии объема кода нет, может быть даже небольшое увеличение&lt;/li&gt;
 &lt;li&gt;Возможно, ухудшилась читаемость кода, поскольку, не&amp;nbsp;дочитав до&amp;nbsp;конца определения функции, непонятно, на&amp;nbsp;что&amp;nbsp;же ссылается &lt;code&gt;this&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Изначально хотел опубликовать эту заметку в&amp;nbsp;&lt;a href="http://www.artlebedev.ru/tools/technogrette/"&gt;Техногрете&lt;/a&gt;, но&amp;nbsp;передумал&amp;nbsp;&amp;mdash; не&amp;nbsp;могу с&amp;nbsp;высокой трибуны рекомендовать решение, которым, возможно, сам не&amp;nbsp;буду пользоваться :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3215695312122380053?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3215695312122380053' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3215695312122380053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3215695312122380053'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_23.html' title='JavaScript: контекст для вложенных функций'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8309371177661887478</id><published>2008-05-20T15:00:00.003+04:00</published><updated>2009-03-16T00:33:57.708+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSL'/><title type='text'>Nightmare.xsl</title><content type='html'>&lt;p&gt;Вчера ночью, засыпая, подумал: &amp;laquo;Так, по&amp;nbsp;какому XSL-шаблону сон выводить будем?&amp;raquo; Крыша поехала, ага :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8309371177661887478?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8309371177661887478' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8309371177661887478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8309371177661887478'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_20.html' title='Nightmare.xsl'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6104858904901884920</id><published>2008-05-19T14:05:00.002+04:00</published><updated>2008-06-03T18:06:04.189+04:00</updated><title type='text'>Про ошибки</title><content type='html'>&lt;div style="margin: 0 5% 2em 50%; font-size: 85%;"&gt;
&lt;p style="margin: 0 0 0.5em 0;"&gt;Tell me about your worst professional mistake you&amp;rsquo;ve made and what you learned from&amp;nbsp;it.&lt;/p&gt;
&lt;p style="margin: 0 0 0.5em 0;"&gt;&lt;em&gt;Tough Interview Questions and How to&amp;nbsp;Handle Them&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Дело было в&amp;nbsp;далеком 2002&amp;nbsp;году. Я&amp;nbsp;только пришел в&amp;nbsp;Студию и&amp;nbsp;занимался в&amp;nbsp;основном поддержкой существующих сайтов, в&amp;nbsp;том числе одной очень уважаемой автомобильной компании.&lt;/p&gt;

&lt;p&gt;Передо мной стояла задача: добавить на&amp;nbsp;сайт еще одну модель автомобиля&amp;nbsp;&amp;mdash; описание, технические характеристики, фотогалерею, короче говоря, несколько страниц с&amp;nbsp;картинками.&lt;/p&gt;

&lt;p&gt;Сайт был устроен таким образом, что все картинки заливались через систему администрирования (сделанную не&amp;nbsp;мной), которая присваивала каждой картинке id-шник, переименовывала их по&amp;nbsp;этому id-шнику (получалось, например, 157.jpg) и&amp;nbsp;складывала в&amp;nbsp;папку /images/.&lt;/p&gt;

&lt;p&gt;У нас была копия сайта на&amp;nbsp;локальном сервере, где я&amp;nbsp;и&amp;nbsp;выполнил задачу. Настало время переноса на&amp;nbsp;рабочий сайт. Вот тут-то и&amp;nbsp;пробил роковой час&amp;nbsp;&amp;mdash; не&amp;nbsp;долго думая, я&amp;nbsp;скопировал все содержимое папки /images/ с&amp;nbsp;локального сервера на&amp;nbsp;живой. Набрав в&amp;nbsp;браузере адрес сайта, чтобы проверить все&amp;nbsp;ли хорошо после переноса, я&amp;nbsp;потерял дар речи и&amp;nbsp;замер в&amp;nbsp;ужасе. Сайт выглядел просто феерически. Все картинки перепутались: на&amp;nbsp;месте логотипа было колесо, вместо слогана&amp;nbsp;&amp;mdash; кусок бампера, вместо изображений автомобилей вылезли навигационные плашки, одним словом, наступил пиздец.&lt;/p&gt;

&lt;p&gt;Как позже выяснилось, локальная копия сайта на&amp;nbsp;самом деле, сука, не&amp;nbsp;была &amp;laquo;копией&amp;raquo; в&amp;nbsp;прямом смысле этого слова. Локальная и&amp;nbsp;живая версии сайта уже давно разошлись. Что самое западло, названия картинок не&amp;nbsp;совпадали. Чтобы перенести картинки на&amp;nbsp;живой сайт, нужно было залить их&amp;nbsp;через админку живого сайта.&lt;/p&gt;

&lt;p&gt;Что&amp;nbsp;же было дальше? Мы&amp;nbsp;с&amp;nbsp;менеджером побежали к&amp;nbsp;админам, и&amp;nbsp;они, дай им&amp;nbsp;бог здоровья, все восстановили из&amp;nbsp;последнего дампа. В&amp;nbsp;общем-то все обошлось, но&amp;nbsp;люди, зашедшие на&amp;nbsp;сайт в&amp;nbsp;эти полчаса, наверное, выпали в&amp;nbsp;осадок от&amp;nbsp;увиденного :)&lt;/p&gt;

&lt;p&gt;Чему&amp;nbsp;же научила меня эта ошибка? Самое главное, &lt;strong&gt;всегда подвергать сомнению и&amp;nbsp;проверять все свои предположения.&lt;/strong&gt; В&amp;nbsp;данном случае я&amp;nbsp;не&amp;nbsp;проверил свое предположение об&amp;nbsp;идентичности локальной и&amp;nbsp;живой версий сайта, за&amp;nbsp;что и&amp;nbsp;поплатился.&lt;/p&gt;

&lt;p&gt;А еще, я&amp;nbsp;стал бекапить файлы, которые собираюсь перезаписать на&amp;nbsp;живом сайте. Дамп админов&amp;nbsp;&amp;mdash; хорошо, а&amp;nbsp;свой бекап тоже не&amp;nbsp;помешает :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6104858904901884920?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6104858904901884920' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6104858904901884920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6104858904901884920'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_18.html' title='Про ошибки'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5864543450971877048</id><published>2008-05-17T19:00:00.011+04:00</published><updated>2009-03-28T17:02:12.629+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='браузеры'/><title type='text'>Ресайз окна браузера</title><content type='html'>&lt;p&gt;Занимаясь веб-разработкой, часто требуется посмотреть как выглядит сайт при определенном разрешении. Переключать разрешение монитора долго и&amp;nbsp;муторно, гораздо проще подогнать размер окна браузера. Обычно это делают с&amp;nbsp;помощью плагина или специальной программулины.&lt;/p&gt;

&lt;p&gt;Уже очень давно для ресайза окна браузера я&amp;nbsp;пользуюсь закладками в&amp;nbsp;самом браузере&amp;nbsp;&amp;mdash; удобно, всегда под рукой и&amp;nbsp;не&amp;nbsp;нужно держать постороннюю приблуду для этого. Решение работает в&amp;nbsp;Firefox, IE, Safari. Не&amp;nbsp;работает в&amp;nbsp;Opera. Вот пошаговая инструкция.&lt;/p&gt;

&lt;p&gt;1. Поставьте закладку на&amp;nbsp;любую страницу, хотя&amp;nbsp;бы на&amp;nbsp;страницу, которую вы&amp;nbsp;сейчас читаете.&lt;/p&gt;

&lt;p&gt;2. Откройте свойства новой закладки.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://lh5.ggpht.com/stepan.reznikov/SC7y-WtduiI/AAAAAAAAAng/gqfm7aEMDGE/browser-resize-1.gif" alt="" width="297" height="298" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;3. В&amp;nbsp;поле Name напишите 1024x768. В&amp;nbsp;поле Location введите javascript:window.resizeTo(1024,768);&lt;/p&gt;
&lt;p&gt;&lt;img src="http://lh6.ggpht.com/stepan.reznikov/SC7y-mtdujI/AAAAAAAAAno/na3rUMu_0iI/browser-resize-2.gif" alt="" width="337" height="255" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Готово! Нажмите на&amp;nbsp;получившуюся закладку и&amp;nbsp;окно браузера изменит свой размер на&amp;nbsp;1024&amp;times;768.&lt;/p&gt;

&lt;p&gt;Аналогично можно сделать закладки для остальных разрешений.&lt;/p&gt;

&lt;p&gt;У меня в&amp;nbsp;Firefox и&amp;nbsp;IE настроено так: для самого популярного разрешения 1024&amp;times;768&amp;nbsp;закладка находится в&amp;nbsp;тулбаре, для остальных разрешений закладки в&amp;nbsp;меню.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://lh6.ggpht.com/stepan.reznikov/SC7y-mtdukI/AAAAAAAAAnw/_XoeWjFsyN0/browser-resize-3.gif" alt="" width="435" height="259" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Кроме того, в&amp;nbsp;Firefox для закладки можно задать ключевое слово. Если потом набрать это слово в&amp;nbsp;адресной строке браузера и&amp;nbsp;нажать Enter, то&amp;nbsp;сработает соответствующая закладка. Например, для 1024&amp;times;768 я&amp;nbsp;задал ключевое слово &amp;laquo;1&amp;raquo;. Удобно для любителей работать с&amp;nbsp;клавиатурой: F6 (фокус в&amp;nbsp;адресную строку), 1, Enter. Вуаля! Ресайз менее чем за&amp;nbsp;1&amp;nbsp;секунду!&lt;/p&gt;

&lt;p class="before_list"&gt;На десерт:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;развернуть окно на&amp;nbsp;всю ширину экрана (maximize): Alt + Space, X&lt;/li&gt;
&lt;li&gt;вернуть прежний размер окна (restore): Alt + Space, R или Alt + Space, Enter&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5864543450971877048?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5864543450971877048' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5864543450971877048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5864543450971877048'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_17.html' title='Ресайз окна браузера'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/stepan.reznikov/SC7y-WtduiI/AAAAAAAAAng/gqfm7aEMDGE/s72-c/browser-resize-1.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4324415610577434714</id><published>2008-05-14T02:45:00.007+04:00</published><updated>2008-10-13T23:34:05.519+04:00</updated><title type='text'>Модель времени</title><content type='html'>&lt;p&gt;Когда-то читал интервью с&amp;nbsp;каким-то монстром программирования, где он&amp;nbsp;упомянул, что проводя собеседования с&amp;nbsp;устраивающимися на&amp;nbsp;работу программистами, всегда просит их&amp;nbsp;описать свою модель времени, как они видят себе год, неделю, день. По его мнению (с&amp;nbsp;которым я&amp;nbsp;согласен), в&amp;nbsp;голове у&amp;nbsp;каждого программиста обязательно должна быть четкая модель времени. Это такой своеобразный индикатор, что человек умеет структурировать окружающую его информацию&amp;nbsp;&amp;mdash; совершенно необходимый навык для программиста.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Год&lt;/strong&gt; представляется мне в&amp;nbsp;виде таблицы из&amp;nbsp;трех строк с&amp;nbsp;четырьмя месяцами в&amp;nbsp;каждой строке.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/stepan.reznikov/SCn9UWtdufI/AAAAAAAAAnI/awc0qaXoU_E/my-calendar-months.gif" width="513" height="178" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Важны переходы на&amp;nbsp;новую строку, особенно переход декабрь&amp;mdash;январь, очевидно, связанный с&amp;nbsp;Новым годом, и&amp;nbsp;переход август&amp;mdash;сентябрь&amp;nbsp;&amp;mdash; начало учебного года. Переход апрель&amp;mdash;май явно не&amp;nbsp;выражен и&amp;nbsp;размыт. Ощущение такое, что как будто апрель иногда хочет перелезть на&amp;nbsp;вторую строку или, наоборот, май пытается запрыгнуть на&amp;nbsp;первую. Апрель вообще какой-то особенно безликий месяц, при мысли о&amp;nbsp;нем он&amp;nbsp;не&amp;nbsp;сразу визуализируется на&amp;nbsp;схеме. Вероятно, это от&amp;nbsp;того, что в&amp;nbsp;моей жизни не&amp;nbsp;было важных событий в&amp;nbsp;апреле.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Дни недели&lt;/strong&gt; устроены в&amp;nbsp;моей голове точно также, как они были устроены в&amp;nbsp;школьном дневнике. Подозреваю, что большинство жителей нашей страны представляют себе именно такую схему недели. Неделя четко поделена пополам. В&amp;nbsp;первом столбце&amp;nbsp;&amp;mdash; понедельник, вторник, среда. Во&amp;nbsp;втором&amp;nbsp;&amp;mdash; четверг, пятница, суббота. Воскресенье&amp;nbsp;&amp;mdash; в&amp;nbsp;уме. Я&amp;nbsp;использую адресацию слева/справа, сверху/снизу/посередине. Скажем, планируя что-то на&amp;nbsp;четверг, я&amp;nbsp;мысленно помещаю событие в&amp;nbsp;ячейку &amp;laquo;справа, сверху&amp;raquo;.&lt;/p&gt;


&lt;p&gt;Со&amp;nbsp;&lt;strong&gt;временем суток&lt;/strong&gt; дела обстоят сложнее&amp;nbsp;&amp;mdash; четкой и&amp;nbsp;однозначной модели у&amp;nbsp;меня нет. Есть довольно туманная схема, в&amp;nbsp;которой день поделен на&amp;nbsp;неравные плавающие уровни.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh3.ggpht.com/stepan.reznikov/SCqGT2tduhI/AAAAAAAAAnY/xyFhnUzLn3w/time.gif" width="542" height="115" alt="" vspace="5" /&gt;&lt;/p&gt;


&lt;p&gt;А&amp;nbsp;как устроено ваше время?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4324415610577434714?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4324415610577434714' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4324415610577434714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4324415610577434714'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_2304.html' title='Модель времени'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/stepan.reznikov/SCn9UWtdufI/AAAAAAAAAnI/awc0qaXoU_E/s72-c/my-calendar-months.gif' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1106223648507234560</id><published>2008-05-13T12:37:00.004+04:00</published><updated>2008-05-13T13:14:09.616+04:00</updated><title type='text'>Если контент говеный, никакая разметка его не спасет</title><content type='html'>&lt;p&gt;Для рядового читателя все эти рассуждения о&amp;nbsp;&amp;laquo;семантической верстке&amp;raquo; по&amp;nbsp;большому счету до&amp;nbsp;лампочки. Они приходят за&amp;nbsp;контентом, а&amp;nbsp;не&amp;nbsp;для того, чтобы проверить правильность верстки. Какие в&amp;nbsp;исходном коде теги и&amp;nbsp;классы их&amp;nbsp;абсолютно не&amp;nbsp;волнует. Если сайт интересный, его прочтут при любой разметке. Если товар охуенный, его закажут не&amp;nbsp;смотря на&amp;nbsp;отсутствие семантики в&amp;nbsp;верстке. Информация, которую создатели сайта хотят донести до&amp;nbsp;людей, гораздо важнее и&amp;nbsp;требует большего внимания, чем верстка этой информации.&lt;/p&gt;

&lt;p&gt;Поэтому, когда я&amp;nbsp;получаю для вывешивания на&amp;nbsp;сайте скучный неинтересный на&amp;nbsp;хуй никому не&amp;nbsp;упавший текст, я&amp;nbsp;очень огорчаюсь.&lt;/p&gt;

&lt;p&gt;Разумеется, хорошая &amp;laquo;семантическая верстка&amp;raquo; повышает доступность сайта и&amp;nbsp;видимость поисковыми системами. Конечно, правильная разметка выгодна самим разработчикам, т.&amp;nbsp;к. облегчается поддержка проекта&amp;nbsp;&amp;mdash; новому кодеру легче вникнуть и&amp;nbsp;найти место где нужно поправить.&lt;/p&gt;

&lt;p&gt;Но&amp;nbsp;интересный контент в&amp;nbsp;тысячу раз важнее. Первых кого должна нанять студия веб-дизайна или интернет-компания, это копирайтера и&amp;nbsp;редактора. Потом уже кодера.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1106223648507234560?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1106223648507234560' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1106223648507234560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1106223648507234560'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post_13.html' title='Если контент говеный, никакая разметка его не&amp;nbsp;спасет'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-1050951856410758924</id><published>2008-05-05T00:15:00.009+04:00</published><updated>2009-03-16T00:36:48.984+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Дробный рейтинг</title><content type='html'>&lt;style&gt;
div.rating {width: 85px; margin: 0 0 1.2em 0; background: url('http://lh3.ggpht.com/stepan.reznikov/SB4JBZVba5I/AAAAAAAAAlk/btXK1cp2zL8/star-0-big.gif') repeat-x 0 0;}
div.rating div {height: 17px; background: url('http://lh4.ggpht.com/stepan.reznikov/SB4JBpVba6I/AAAAAAAAAls/1PswIdMqK5Q/star-1-big.gif') repeat-x 0 0; font-size: 1px; text-indent: -9999px;}
&lt;/style&gt;

&lt;p&gt;&lt;em&gt;Задача.&lt;/em&gt; Сделать для &lt;a href="http://euroset.ru/"&gt;интернет-магазина Евросети&lt;/a&gt; средний рейтинг товара в&amp;nbsp;виде звездочек с&amp;nbsp;дробными значениями. Например, средний рейтинг = 3,6. Четвертая звездочка должна быть закрашена на&amp;nbsp;60%.&lt;/p&gt;

&lt;p&gt;Очевидно, что нагенерить картинок для всех значений рейтинга невозможно. Поэтому, будем химичить в&amp;nbsp;HTML и&amp;nbsp;CSS.&lt;/p&gt;

&lt;p&gt;Для начала нам потребуются две картинки: пустая звездочка &lt;img src="http://lh3.ggpht.com/stepan.reznikov/SB4JBZVba5I/AAAAAAAAAlk/btXK1cp2zL8/star-0-big.gif" width="17" height="17" alt="" align="absmiddle" /&gt; и&amp;nbsp;закрашенная &lt;img src="http://lh4.ggpht.com/stepan.reznikov/SB4JBpVba6I/AAAAAAAAAls/1PswIdMqK5Q/star-1-big.gif" width="17" height="17" alt="" align="absmiddle" /&gt;.&lt;/p&gt;

&lt;p&gt;Делаем дивчик высотой в&amp;nbsp;одну звездочку, шириной в&amp;nbsp;пять звездочек и&amp;nbsp;бекграундом у&amp;nbsp;него пускаем пустую звездочку. Внутрь кладем еще один дивчик такой&amp;nbsp;же высоты с&amp;nbsp;закрашенной звездочкой бекграундом. А&amp;nbsp;вот ширину внутреннего дивчика высчитываем по&amp;nbsp;формуле: rating * 100 / 5 (я&amp;nbsp;сделал это XSL-ем на&amp;nbsp;сервере, но&amp;nbsp;можно и&amp;nbsp;яваскриптом сделать). Получилось:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div class="rating"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div style="width: 72%;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Для версии без стилей внутрь наших дивчиков добавим текст &amp;laquo;Оценка: 3,6&amp;raquo;. В&amp;nbsp;обычной версии со&amp;nbsp;стилями этот текст скроем.&lt;/p&gt;

&lt;p&gt;Последний штрих&amp;nbsp;&amp;mdash; добавим тайтл, чтобы можно было посмотреть точное значение рейтинга.&lt;/p&gt;

&lt;p&gt;Итого:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div class="rating" title="3,6"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div style="width: 72%;"&amp;gt;Оценка: 3,6&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;CSS:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;div.rating {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;width: 85px;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;background: url('star-0-big.gif') repeat-x 0 0;&lt;br /&gt;
}&lt;br /&gt;
div.rating div {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;height: 17px;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;background: url('star-1-big.gif') repeat-x 0 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size: 1px;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;text-indent: -9999px;&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;div class="rating" title="3,6"&gt;&lt;div style="width: 72%;"&gt;Оценка: 3,6&lt;/div&gt;&lt;/div&gt;

&lt;p class="before_list"&gt;Элементарно просто можно адаптировать для:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;звездочек большего размера, сердечек, кружек пива и&amp;nbsp;других форм;&lt;/li&gt;
&lt;li&gt;рейтингов по 6-ти, 10-ти или сколько угодно бальной системе.&lt;/li&gt;
&lt;/ul&gt;

&lt;p style="float: left; margin-right: 0.35em;"&gt;Рейтинг этой заметки:&lt;/p&gt;

&lt;div class="rating" title="5,0" style="float: left; margin-right: 0.35em;"&gt;&lt;div style="width: 100%;"&gt;Оценка: 5,0&lt;/div&gt;&lt;/div&gt;

&lt;p style="float: left;"&gt;;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-1050951856410758924?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=1050951856410758924' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1050951856410758924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/1050951856410758924'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/05/blog-post.html' title='Дробный рейтинг'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/stepan.reznikov/SB4JBZVba5I/AAAAAAAAAlk/btXK1cp2zL8/s72-c/star-0-big.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2252990323757338774</id><published>2008-04-26T19:48:00.007+04:00</published><updated>2009-03-16T10:04:29.755+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Вращение автомобиля на сайте ZAZ Sens</title><content type='html'>&lt;p&gt;Не&amp;nbsp;вдаваясь в&amp;nbsp;подробности реализации, хочу поделиться парой идей, лежащих в&amp;nbsp;основе &lt;a href="http://www.sensauto.ru/"&gt;вращения автомобиля&lt;/a&gt; на&amp;nbsp;сайте ZAZ&amp;nbsp;Sens.&lt;/p&gt;


&lt;p&gt;1. Для каждого цвета все восемь ракурсов автомобиля собраны в&amp;nbsp;одном файле JPG. Вот, например, файл для цвета &amp;laquo;Зеленый мох&amp;raquo;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sensauto.ru/f/1/car-sea-green.jpg"&gt;&lt;img width="50" height="178" alt="" src="http://lh5.ggpht.com/stepan.reznikov/SBM9ppVbamI/AAAAAAAAAh0/NbZPHid7srM/car-sea-green-small.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Почему я&amp;nbsp;решил объединить все ракурсы в&amp;nbsp;один общий файл? Во-первых, размер общего файла получается меньше. Во-вторых, меньше обращений на&amp;nbsp;сервер. И,&amp;nbsp;наконец, JavaScript-код для прелоада и&amp;nbsp;управления одним файлом проще, чем для прелоада и&amp;nbsp;управления восемью.&lt;/p&gt;

&lt;p&gt;Эта картинка стоит бэкграундом у&amp;nbsp;дивчика размером с&amp;nbsp;один ракурс автомобиля. При вращении меняется background-position у&amp;nbsp;дивчика и&amp;nbsp;показывается соответствующий ракурс:&lt;/p&gt;

&lt;p&gt;&lt;img width="60" height="344" alt="" src="http://lh3.ggpht.com/stepan.reznikov/SBM9rJVbanI/AAAAAAAAAh8/iDihF7sJeso/car-sea-green-animated.gif"&gt;&lt;/p&gt;


&lt;p&gt;2. Очевидно, что прежде чем давать пользователю вращать автомобиль определенного цвета, нужно дождаться полной загрузки файла, иначе во&amp;nbsp;время вращения будут неприятные эффекты в&amp;nbsp;виде обрезанного автомобиля или пустоты на&amp;nbsp;месте недогруженных ракурсов.&lt;/p&gt;

&lt;p&gt;Поэтому изначально все цвета задизейблены, а&amp;nbsp;в&amp;nbsp;JavaScript я&amp;nbsp;ставлю картинки с&amp;nbsp;собранными ракурсами на&amp;nbsp;загрузку (для всех цветов). По&amp;nbsp;событию onload соответствующий цвет энейблится (код упрощен для наглядности):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var oImage = document.createElement('img');&lt;br /&gt;
oImage.onload = function(){ /* включаем зеленый цвет */ });&lt;br /&gt;
oImage.src = '/f/1/car-sea-green.jpg';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Таким образом цвета включаются по&amp;nbsp;мере загрузки цветовых файлов.&lt;/p&gt;

&lt;p&gt;Моей ошибкой стало то, что я&amp;nbsp;ставлю на&amp;nbsp;загрузку все цветовые файлы сразу, в&amp;nbsp;результате чего они грузятся браузером параллельно. Получилось, что браузер долго грузит, потом почти одновременно включаются все цвета.&lt;/p&gt;

&lt;p&gt;Если&amp;nbsp;бы я&amp;nbsp;сделал последовательную загрузку, то&amp;nbsp;есть чтобы следующий цветовой файл начинал загружаться только по&amp;nbsp;завершению загрузки предыдущего, для пользователя это было&amp;nbsp;бы лучше&amp;nbsp;&amp;mdash; он&amp;nbsp;быстро&amp;nbsp;бы получил возможность вращать один цвет, а&amp;nbsp;пока он&amp;nbsp;его вращает, догрузились&amp;nbsp;бы остальные. К&amp;nbsp;сожалению, руки так и&amp;nbsp;не&amp;nbsp;дошли переделать.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2252990323757338774?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2252990323757338774' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2252990323757338774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2252990323757338774'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/zaz-sens.html' title='Вращение автомобиля на сайте ZAZ Sens'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/stepan.reznikov/SBM9ppVbamI/AAAAAAAAAh0/NbZPHid7srM/s72-c/car-sea-green-small.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3978834445554256734</id><published>2008-04-25T02:42:00.005+04:00</published><updated>2008-05-25T00:49:29.813+04:00</updated><title type='text'>Три составляюшие веба</title><content type='html'>&lt;p&gt;В&amp;nbsp;порядке важности:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Доступность (accessibility)&lt;/li&gt;
&lt;li&gt;Удобство (usability)&lt;/li&gt;
&lt;li&gt;Дизайн (design and aesthetics)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Именно в&amp;nbsp;таком порядке. Каждая последующая составляющая основывается на&amp;nbsp;предыдущей.&lt;/p&gt;

&lt;p&gt;Имея недоступный контент (например, текст захерачили картинкой или без яваскрипта не&amp;nbsp;показывается какая-то часть информации), нет смысла говорить об&amp;nbsp;удобстве пользования сайтом. Какое удобство, если некоторые люди вообще не&amp;nbsp;могут воспользоваться сайтом?&lt;/p&gt;

&lt;p&gt;Также бессмысленно рисовать красивые иконки и&amp;nbsp;кнопки, делать закругления и&amp;nbsp;прочие модные дизайнерские штуки, если сайт недоступный и/или неудобный. Алан Купер в&amp;nbsp;своей книге The Inmates Are Running the Asylum очень метко назвал это &lt;em&gt;painting the corpse&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3978834445554256734?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3978834445554256734' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3978834445554256734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3978834445554256734'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/blog-post_25.html' title='Три составляюшие веба'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3550202483235238503</id><published>2008-04-22T13:55:00.002+04:00</published><updated>2008-04-22T14:14:53.882+04:00</updated><title type='text'>Government web standards</title><content type='html'>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://webpublishing.agimo.gov.au/"&gt;Australian Government Web Publishing Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webstandards.govt.nz/"&gt;New Zealand Government Web Standards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Очень надеюсь, что и&amp;nbsp;&lt;a href="http://www.rsnet.ru/"&gt;российское правительство&lt;/a&gt; когда-нибудь дорастет до&amp;nbsp;того, чтобы всерьез заняться составлением стандартов для сайтов правительственных организаций.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3550202483235238503?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3550202483235238503' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3550202483235238503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3550202483235238503'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/government-web-standards.html' title='Government web standards'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6920571543932629297</id><published>2008-04-22T00:33:00.008+04:00</published><updated>2008-05-13T13:26:05.633+04:00</updated><title type='text'>Амазон каюк</title><content type='html'>&lt;p&gt;Американский Амазон отменил дешевые доставки (Standard Shipping и&amp;nbsp;Expedited Shipping) для России. В&amp;nbsp;&lt;a href="http://www.amazon.com/gp/help/customer/display.html?nodeId=596194"&gt;списке европейских стран&lt;/a&gt; напротив России появилась надпись Priority Only. Даже в&amp;nbsp;Албанию отправляют обычной почтой, а&amp;nbsp;в&amp;nbsp;Россию теперь только самой дорогой курьерской доставкой.&lt;/p&gt;

&lt;p&gt;Если раньше за&amp;nbsp;доставку трех книг суммарной стоимостью 60&amp;nbsp;$ нужно было заплатить примерно 20&amp;nbsp;$ (Expedited Shipping), то&amp;nbsp;теперь извольте отвалить все 50&amp;nbsp;$.&lt;/p&gt;

&lt;p&gt;Связано это, очевидно, с&amp;nbsp;плохой работой нашей российской почты&amp;nbsp;&amp;mdash; посылки часто теряются и&amp;nbsp;не&amp;nbsp;доходят, как случилось с&amp;nbsp;одним из&amp;nbsp;моих заказов. К&amp;nbsp;чести Амазона, в&amp;nbsp;ответ на&amp;nbsp;мое сообщение о&amp;nbsp;неполученной книге, они без всяких разбирательств и&amp;nbsp;дополнительной оплаты выслали книгу повторно, причем ускоренной доставкой. Потом, кстати, через месяц от&amp;nbsp;них пришла отбивка, что мол &amp;laquo;первая посылка к&amp;nbsp;нам вернулась, все нормально, чувак&amp;raquo;.&lt;/p&gt;

&lt;p&gt;Решил попробовать &lt;a href="http://www.amazon.co.uk/"&gt;британский Амазон&lt;/a&gt;. Они пока еще доставляют обычной почтой (Air Mail), но&amp;nbsp;сами книги стоят дороже. Те&amp;nbsp;самые три книги стоят 40&amp;nbsp;&amp;pound; + доставка 14&amp;nbsp;&amp;pound; = 54&amp;nbsp;&amp;pound; = 107&amp;nbsp;$. Те&amp;nbsp;же яйца.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6920571543932629297?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6920571543932629297' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6920571543932629297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6920571543932629297'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/blog-post_22.html' title='Амазон каюк'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-8834837618740638253</id><published>2008-04-13T15:08:00.022+04:00</published><updated>2009-03-28T16:36:20.451+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>Скоро рассвет, выхода нет</title><content type='html'>&lt;p&gt;Зашел я&amp;nbsp;как-то в&amp;nbsp;Одноклассники, поотвечал на&amp;nbsp;сообщения, собрался выйти и&amp;nbsp;привычным жестом потянулся в&amp;nbsp;правую верхнюю часть окна чтобы нажать на&amp;nbsp;ссылку &amp;laquo;Выход&amp;raquo;. У&amp;nbsp;меня уже отложилось где-то в&amp;nbsp;голове, что для того, чтобы выйти, нужно нажать на последнюю ссылку на&amp;nbsp;оранжевой плашке вверху.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh3.ggpht.com/stepan.reznikov/SAH76C3N8cI/AAAAAAAAACk/GDtX6Ef_jGw/01.gif" /&gt;&lt;/p&gt;

&lt;p&gt;Нажимаю и&amp;nbsp;попадаю в&amp;nbsp;раздел &amp;laquo;Помощь&amp;raquo;. Что за&amp;nbsp;черт? Какая еще помощь? Вчитываюсь в&amp;nbsp;названия ссылок.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/stepan.reznikov/SAH9GS3N8dI/AAAAAAAAACs/Q09bqShf1L8/02.gif" /&gt;&lt;/p&gt;

&lt;p&gt;Хм, последняя ссылка в&amp;nbsp;меню&amp;nbsp;&amp;mdash; &amp;laquo;Помощь&amp;raquo;, а &amp;laquo;Выхода&amp;raquo; вообще нет. Туда, сюда&amp;nbsp;&amp;mdash; нет выхода. Что за&amp;nbsp;ерунда?&lt;/p&gt;

&lt;p&gt;Через какое-то время до&amp;nbsp;меня доходит, что виной всему увеличенный размер шрифта в&amp;nbsp;моем Фаерфоксе. Это меню сверстано таким &amp;laquo;удивительным&amp;raquo; образом, что при увеличении размера шрифта невлезающие пункты меню (им&amp;nbsp;сказано float: left;) переносятся на&amp;nbsp;вторую строчку и&amp;nbsp;сливаются с&amp;nbsp;фоном (ссылкам задан белый цвет).&lt;/p&gt;

&lt;p&gt;При выделении ссылка проявляется.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://lh4.ggpht.com/stepan.reznikov/SAH-AS3N8fI/AAAAAAAAADA/F672trMaVXw/03.gif" /&gt;&lt;/p&gt;

&lt;p&gt;При дальнейшем увеличении размера шрифта пропадают и&amp;nbsp;остальные ссылки&amp;nbsp;&amp;mdash; &amp;laquo;Помощь&amp;raquo; и&amp;nbsp;так далее.&lt;/p&gt;

&lt;p&gt;В&amp;nbsp;IE размер шрифта, конечно, зафиксировали.&lt;/p&gt;

&lt;p&gt;Позор джунглей.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-8834837618740638253?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=8834837618740638253' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8834837618740638253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/8834837618740638253'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/blog-post.html' title='Скоро рассвет, выхода нет'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/stepan.reznikov/SAH76C3N8cI/AAAAAAAAACk/GDtX6Ef_jGw/s72-c/01.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2493287047928506690</id><published>2008-04-03T12:49:00.005+04:00</published><updated>2008-04-13T17:27:51.492+04:00</updated><title type='text'>Виза ВТБ24</title><content type='html'>﻿&lt;p&gt;Я&amp;nbsp;уже давно забил читать книги по&amp;nbsp;веб-разработке на&amp;nbsp;русском языке. Хороших книг просто нет. Скажем по&amp;nbsp;яваскрипту я&amp;nbsp;знаю только одну более-менее нормальную книгу на русском&amp;nbsp;&amp;mdash; Флэнагана, да и&amp;nbsp;та больше как справочник. Всем советую&amp;nbsp;&amp;mdash; если не&amp;nbsp;хотите читать говеный перевод прошлогодних западных книг или дристню отечественных авторов, короче, если хотите быть на&amp;nbsp;передовой&amp;nbsp;&amp;mdash; делайте карточку Визу и заказывайте книги на&amp;nbsp;Амазоне.&lt;/p&gt;

&lt;p&gt;Я&amp;nbsp;много раз заказывал на&amp;nbsp;Амазоне и&amp;nbsp;все мои карточки работали безотказно. Однако, недавно Амазон отказался проглотить платеж по&amp;nbsp;карте Виза банка ВТБ24. Пробую второй раз, третий&amp;nbsp;&amp;mdash; хуй вам.&lt;/p&gt;

&lt;p&gt;Стал гуглить на&amp;nbsp;тему возможных проблем. Выснилось, что с&amp;nbsp;недавнего времени &lt;a href="http://mvs.habrahabr.ru/blog/27261.html"&gt;ВТБ24 стал требовать передачу CVC (CVV) кода&lt;/a&gt;. Позвонил в&amp;nbsp;ВТБ24, спросил, дескать, что за&amp;nbsp;нахрен. Мне ответили, что запрос CVV кода увеличивает секьюрность карты, и&amp;nbsp;что об&amp;nbsp;этом было уведомление на&amp;nbsp;сайте банка. Видимо сотрудники ВТБ24 считают, что все владельцы карт прямо каждое утро начинают с&amp;nbsp;чтения новостей ВТБ24, настолько они важные и&amp;nbsp;интересные.&lt;/p&gt;

&lt;p&gt;Написал в&amp;nbsp;Амазон. Ответили:&lt;/p&gt;

&lt;blockquote&gt;I&amp;rsquo;m sorry, but our ordering system is not set&amp;nbsp;up to&amp;nbsp;accept the CVV2 security code associated with credit cards. I&amp;nbsp;hope this will not prevent you from receiving your order. Some issuing banks do have stricter requirements for internet purchases. If your bank requires that the CVV2 code be submitted, unfortunately we can&amp;rsquo;t accommodate that request and you will need to&amp;nbsp;use a&amp;nbsp;different credit card or&amp;nbsp;payment method.&lt;/blockquote&gt;

&lt;p&gt;Блять, придется переделывать карточку в&amp;nbsp;другом банке&amp;nbsp;&amp;mdash; она мне по&amp;nbsp;сути в&amp;nbsp;данный момент только для заказов на&amp;nbsp;Амазоне и&amp;nbsp;нужна.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2493287047928506690?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2493287047928506690' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2493287047928506690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2493287047928506690'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/24.html' title='Виза ВТБ24'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4281736420374837489</id><published>2008-04-02T00:45:00.010+04:00</published><updated>2009-03-31T14:36:58.533+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><title type='text'>PSD2HTML</title><content type='html'>&lt;p&gt;Существует большое количество &lt;a href="http://snook.ca/archives/html_and_css/html_css_services/"&gt;компаний специализирующихся исключительно на&amp;nbsp;верстке сайтов&lt;/a&gt;. Подозреваю, многие такие компании состоят из&amp;nbsp;одного-двух фрилансеров, но&amp;nbsp;не&amp;nbsp;в&amp;nbsp;этом суть.&lt;/p&gt;

&lt;p&gt;Вот, например, &lt;a href="http://www.psd2html.com/"&gt;PSD2HTML&lt;/a&gt;. Особенно у&amp;nbsp;них порадовала &lt;a href="http://www.psd2html.com/order-now.html"&gt;форма заказа&lt;/a&gt; с&amp;nbsp;кучей опций.&lt;/p&gt;

&lt;p&gt;И&amp;nbsp;что поразительно: делают быстро и&amp;nbsp;за&amp;nbsp;какие-то копейки. PSD2HTML обещает порезать макет в&amp;nbsp;течении 1&amp;nbsp;рабочего дня примерно за&amp;nbsp;150&amp;nbsp;долл. Поискал в&amp;nbsp;блогах и&amp;nbsp;на&amp;nbsp;форумах&amp;nbsp;&amp;mdash; кто пользовался их&amp;nbsp;услугами пишут, что на&amp;nbsp;выходе качественный xhtml/css-код. Блять, уволить надо половину наших кодеров и&amp;nbsp;пользовать PSD2HTML :-)&lt;/p&gt;

&lt;p&gt;Вообще интересно было&amp;nbsp;бы скормить в&amp;nbsp;такую контору макет от&amp;nbsp;нашего студийного дизайнера и&amp;nbsp;посмотреть не&amp;nbsp;подавятся&amp;nbsp;ли :-)&lt;/p&gt;

&lt;p&gt;Меня, признаться, самого посещали мысли о&amp;nbsp;создании подобной компании, которая&amp;nbsp;бы занималась преимущественно front-end веб-разработкой, ну&amp;nbsp;может изредка и&amp;nbsp;back-end. Крупнейшими клиентами такой компании могли&amp;nbsp;бы стать студии дизайна и&amp;nbsp;рекламные агентства не&amp;nbsp;специализирующиеся на&amp;nbsp;веб-дизайне, но&amp;nbsp;тем не&amp;nbsp;менее получающие время от&amp;nbsp;времени заказы на&amp;nbsp;сайты. Они в&amp;nbsp;состоянии нарисовать макет сайта (есть дизайнеры с&amp;nbsp;веб-дизайнерским прошлым), но&amp;nbsp;держать команду веб-технологов для них невыгодно и&amp;nbsp;бессмысленно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4281736420374837489?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4281736420374837489' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4281736420374837489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4281736420374837489'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/04/psd2html.html' title='PSD2HTML'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-905833233054555762</id><published>2008-03-30T17:00:00.008+04:00</published><updated>2008-03-30T17:56:07.869+04:00</updated><title type='text'>5 копеек</title><content type='html'>&lt;p&gt;Гуляя сегодня по&amp;nbsp;набережной Москвы-реки в&amp;nbsp;Марьино, обнаружил престранное сооружение. В&amp;nbsp;центре этой мраморной конструкции находится пятикопеечная монета. Вокруг монеты написаны названия московских вузов.&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dN6tHnouWi8/R--R2SwSOnI/AAAAAAAAAA4/PShCOC5Ui0U/s1600-h/IMG_1480_small.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_dN6tHnouWi8/R--R2SwSOnI/AAAAAAAAAA4/PShCOC5Ui0U/s320/IMG_1480_small.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5183522058060053106" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Что бы это значило? Мое предположение, что это сродни носу у&amp;nbsp;собаки на станции метро &amp;laquo;Площадь Революции&amp;raquo; за&amp;nbsp;который нужно подержаться перед сдачей экзамена. Здесь&amp;nbsp;же, видимо, нужно встать в&amp;nbsp;центр на&amp;nbsp;пятикопеечную монету и&amp;nbsp;мысленно сказать &amp;laquo;халява на&amp;nbsp;экзамене, приди!&amp;raquo;&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dN6tHnouWi8/R--ZVCwSOoI/AAAAAAAAABA/doNbPQWMOiE/s1600-h/IMG_1476_small.jpg"&gt;&lt;img  src="http://4.bp.blogspot.com/_dN6tHnouWi8/R--ZVCwSOoI/AAAAAAAAABA/doNbPQWMOiE/s320/IMG_1476_small.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5183530282922424962" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Второй вариант использования&amp;nbsp;&amp;mdash; для выбора вуза куда поступать. Становишься в&amp;nbsp;центр, закрываешь глаза и&amp;nbsp;бросаешь монетку вверх. На&amp;nbsp;какой вуз попала&amp;nbsp;&amp;mdash; туда и&amp;nbsp;пошел :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-905833233054555762?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=905833233054555762' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/905833233054555762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/905833233054555762'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/5.html' title='5 копеек'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dN6tHnouWi8/R--R2SwSOnI/AAAAAAAAAA4/PShCOC5Ui0U/s72-c/IMG_1480_small.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5915831912257697246</id><published>2008-03-27T13:05:00.005+03:00</published><updated>2009-03-16T00:37:29.309+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript: Closure</title><content type='html'>&lt;p&gt;На&amp;nbsp;русский closure обычно переводят как &amp;laquo;замыкание&amp;raquo;.&lt;/p&gt;

&lt;p&gt;John Resig в&amp;nbsp;своей книге &lt;a href="http://jspro.org/"&gt;Pro JavaScript Techniques&lt;/a&gt;, которую я&amp;nbsp;сейчас читаю, привел ссылку на&amp;nbsp;статью &lt;a href="http://www.jibbering.com/faq/faq_notes/closures.html"&gt;JavaScript Closures&lt;/a&gt;. Это очень мощная, пожалуй, самая глубокая и&amp;nbsp;фундаментальная статья по&amp;nbsp;JavaScript, которую я&amp;nbsp;когда-либо читал. Респект автору, Ричарду Корнфорду.&lt;/p&gt;

&lt;p&gt;Стал копать дальше, нашел еще замечательную статью: &lt;a href="http://blog.morrisjohns.com/javascript_closures_for_dummies"&gt;JavaScript Closures for Dummies&lt;/a&gt;. Написано очень понятно, с&amp;nbsp;хорошими примерами. Рекомендую начать с&amp;nbsp;этой статьи, если вы только осваиваете closure. Отдельно отметим оригинальную находку автора поместить кусочек JavaScript-кода на&amp;nbsp;кнопку, который этот код запускает.&lt;/p&gt;

&lt;p&gt;Также достойны вашего внимания еще две статьи о&amp;nbsp;closure: &lt;a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"&gt;на&amp;nbsp;Википедии&lt;/a&gt; и&amp;nbsp;&lt;a href="http://martinfowler.com/bliki/Closure.html"&gt;Мартина Фаулера&lt;/a&gt;. В&amp;nbsp;этих статьях речь идет о&amp;nbsp;closure вообще как о&amp;nbsp;концепции программирования, безотносительно к&amp;nbsp;JavaScript.&lt;/p&gt;

&lt;p&gt;Что касается книги Ресига, то&amp;nbsp;я&amp;nbsp;несколько разочарован. Материал изложен поверхностно, не&amp;nbsp;хватает глубины как в&amp;nbsp;статье Корнфорда. Много опечаток и&amp;nbsp;ошибок. Как раз в&amp;nbsp;одном из&amp;nbsp;примеров на&amp;nbsp;closure есть концептуальная ошибка, пример не&amp;nbsp;работает. Не&amp;nbsp;понятно как так можно, что он, не&amp;nbsp;оттестировал примеры перед публикацией что-ли?&lt;/p&gt;

&lt;p&gt;UPD: Ошибка в примере на&amp;nbsp;closure (листинг 2-16) есть только в&amp;nbsp;&lt;a href="http://jspro.org/code/"&gt;исходном коде&lt;/a&gt;, который можно скачать с&amp;nbsp;сайта книги. В&amp;nbsp;самой книге этой ошибки нет.&lt;/p&gt;

&lt;p&gt;Жду &lt;a href="http://www.amazon.com/dp/0596517742/"&gt;книгу Дугласа Крокфорда&lt;/a&gt;. Надеюсь, старина Крокфорд не&amp;nbsp;подведет :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5915831912257697246?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5915831912257697246' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5915831912257697246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5915831912257697246'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/javascript-closure.html' title='JavaScript: Closure'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4930795912179578445</id><published>2008-03-26T19:31:00.018+03:00</published><updated>2009-03-16T00:37:48.066+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSL'/><title type='text'>XSLT: сборная солянка</title><content type='html'>&lt;p&gt;Несколько неочевидных моментов по&amp;nbsp;XSLT.&lt;/p&gt;

&lt;h4&gt;1. avg, min, max&lt;/h4&gt;

&lt;p&gt;В&amp;nbsp;XSLT нет агрегатных функций &lt;code&gt;avg()&lt;/code&gt;, &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;. Есть только &lt;code&gt;count()&lt;/code&gt; и&amp;nbsp;&lt;code&gt;sum()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Предположим, у&amp;nbsp;нас есть такой XML:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;list&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;gt;10&amp;lt;/item&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;gt;5&amp;lt;/item&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;gt;25&amp;lt;/item&amp;gt;&lt;br /&gt;
&amp;lt;/list&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Среднее значение&lt;/strong&gt; можно посчитать так:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:variable name="avg" select="sum(/list/item) div count(/list/item)"/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Минимум&lt;/strong&gt; и&amp;nbsp;&lt;strong&gt;максимум&lt;/strong&gt; чуть сложнее. Бежим по&amp;nbsp;отсортированным по&amp;nbsp;возрастанию/убыванию нодам и&amp;nbsp;берем первую:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:variable name="min"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:for-each select="/list/item"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:sort data-type="number" order="ascending"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="position() = 1"&amp;gt;&amp;lt;xsl:value-of select="."/&amp;gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:variable&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:variable name="max"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:for-each select="/list/item"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:sort data-type="number" order="descending"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="position() = 1"&amp;gt;&amp;lt;xsl:value-of select="."/&amp;gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:variable&amp;gt;&lt;/code&gt;&lt;/p&gt;


&lt;h4&gt;2. &lt;code&gt;current()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;current()&lt;/code&gt; внутри квадратных скобок позволяет выйти из&amp;nbsp;контекста ноды к&amp;nbsp;которой применены эти скобки и&amp;nbsp;вернуться к&amp;nbsp;контексту текущей ноды (которая была заматчена шаблоном или заселекчена &lt;code&gt;&amp;lt;xsl:for-each&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;То есть вместо того, чтобы создавать переменную:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="navigation"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name="status" select="@status"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="/captions/caption[@status = $status]"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;можно написать так:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="navigation"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="/captions/caption[@status = current()/@status]"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;


&lt;h4&gt;3. &lt;code&gt;concat()&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Работает быстрее:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:value-of select="concat(@Name, ' ', @Surname)"/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;чем:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:value-of select="@Name"/&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select="' '"/&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select="@Surname"/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Потому что в&amp;nbsp;первом случае происходит только одна операция вставки в&amp;nbsp;результирующее XML-дерево.&lt;/p&gt;

&lt;p&gt;Не&amp;nbsp;говоря уже о&amp;nbsp;том, что первый вариант компактнее.&lt;/p&gt;


&lt;h4&gt;4. &lt;code&gt;not()&lt;/code&gt; vs. &lt;code&gt;!=&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;В&amp;nbsp;некоторых версиях XSLT-процессоров есть разница:&lt;/p&gt;

&lt;p&gt;not(@name = 'Stepan')&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;a name="Stepan"/&amp;gt; =&amp;gt; false&lt;br /&gt;
&amp;lt;a name="Leechy"/&amp;gt; =&amp;gt; true&lt;br /&gt;
&amp;lt;a/&amp;gt; =&amp;gt; true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;@name != 'Stepan'&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;a name="Stepan"/&amp;gt; =&amp;gt; false&lt;br /&gt;
&amp;lt;a name="Leechy"/&amp;gt; =&amp;gt; true&lt;br /&gt;
&amp;lt;a/&amp;gt; =&amp;gt; false&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Пару раз когда использовал &lt;code&gt;!=&lt;/code&gt; сталкивался с&amp;nbsp;тем, что вылезала бага при переносе кода с&amp;nbsp;разработческого сервера на&amp;nbsp;хостинг, где стоял другой XSLT-процессор. Поэтому рекомендую всегда использовать &lt;code&gt;not()&lt;/code&gt;.&lt;/p&gt;


&lt;h4&gt;5. Глобальные переменные &amp;rarr; ускорение&lt;/h4&gt;

&lt;p&gt;Переменная &lt;code&gt;Regions&lt;/code&gt; вычисляется каждый раз при вызове шаблона для &lt;code&gt;&amp;lt;MuscatRow&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:template match="MuscatRow"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name="Regions" select="/Imprimatur/Element[@Name = 'Regions']/Document"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="$Regions[@Name = current()/@Name]/content"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Используя глобальную переменную можно добиться некоторого ускорения. Переменная &lt;code&gt;Regions&lt;/code&gt; вычисляется один раз:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:variable name="Regions" select="/Imprimatur/Element[@Name = 'Regions']/Document"/&amp;gt;&lt;br /&gt;
&amp;lt;xsl:template match="MuscatRow"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="$Regions[@Name = current()/@Name]/content"/&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Актуально при большом количестве &lt;code&gt;&amp;lt;MuscatRow&amp;gt;&lt;/code&gt;.&lt;/p&gt;


&lt;h4&gt;6. Отсчет preceding-sibling-ов&lt;/h4&gt;

&lt;p&gt;preceding-sibling[1]&amp;nbsp;&amp;mdash; это &lt;em&gt;ближайший&lt;/em&gt; предыдущий элемент.&lt;/p&gt;

&lt;p&gt;Получается вот что:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;preceding-sibling[last()]&lt;br /&gt;
...&lt;br /&gt;
preceding-sibling[2]&lt;br /&gt;
preceding-sibling[1]&lt;br /&gt;
&lt;b&gt;current item&lt;/b&gt;&lt;br /&gt;
following-sibling[1]&lt;br /&gt;
following-sibling[2]&lt;br /&gt;
...&lt;br /&gt;
following-sibling[last()]&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4930795912179578445?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4930795912179578445' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4930795912179578445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4930795912179578445'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/xsl.html' title='XSLT: сборная солянка'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-2580169518343010515</id><published>2008-03-26T16:09:00.012+03:00</published><updated>2009-03-28T17:03:40.679+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>HTML: контейнеры</title><content type='html'>&lt;p&gt;Как&amp;nbsp;бы вы заверстали копирайт? Варианты ответов:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;p id="copyright"&amp;gt;(с) 2005 Company Inc.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;div id="copyright"&amp;gt;(с) 2005 Company Inc.&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;div id="copyright"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;(с) 2008 Company Inc.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Первый вариант ограничивает нас только одним абзацем. Если со&amp;nbsp;временем потребуется добавить второй абзац копирайта, то&amp;nbsp;верстку придется переделать. Кроме того, представим, что вдруг потребовалось вставить в&amp;nbsp;копирайт блок с&amp;nbsp;какой-то сложной версткой (очередное дизайнерское извращение). Тег &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; не&amp;nbsp;может содержать блоковых элементов, поэтому опять-таки придется переделать.&lt;/p&gt;

&lt;p&gt;Поэтому добавляем контейнер, в&amp;nbsp;который мы сможем засунуть любое количество параграфов и&amp;nbsp;вообще любой фрагмент HTML. Второй вариант уже лучше.&lt;/p&gt;

&lt;p&gt;Однако, я&amp;nbsp;выбираю третий вариант, не&amp;nbsp;смотря на&amp;nbsp;то, что он самый длинный. Тег &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; добавляет еще немного семантики&amp;nbsp;&amp;mdash; получается &amp;laquo;параграф текста внутри блока копирайта&amp;raquo;.&lt;/p&gt;

&lt;p&gt;Еще один плюс: в&amp;nbsp;версии без стилей блоки текста не&amp;nbsp;слипнутся.&lt;/p&gt;

&lt;p&gt;Простой пример.&lt;/p&gt;

&lt;p&gt;В&amp;nbsp;версии без стилей текст слипнется:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div id="some_additional_info"&amp;gt;Some additional info.&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;div id="copyright"&amp;gt;(с) 2008 Company Inc.&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;А&amp;nbsp;так не&amp;nbsp;слипнется:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div id="some_additional_info"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;Some additional info.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;div id="copyright"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;(с) 2008 Company Inc.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Кстати, проверять верстку с&amp;nbsp;отключенными стилями вообще очень полезно. Если сайтом по-прежнему можно пользоваться, значит сверстано семантически грамотно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-2580169518343010515?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=2580169518343010515' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2580169518343010515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/2580169518343010515'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/html.html' title='HTML: контейнеры'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-9193771274140432575</id><published>2008-03-21T23:49:00.001+03:00</published><updated>2008-03-26T23:47:42.702+03:00</updated><title type='text'>Про компромиссы</title><content type='html'>&lt;p&gt;Важно уметь найти компромисс.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Делать работу с&amp;nbsp;учетом возможных будущих изменений, но&amp;nbsp;с&amp;nbsp;другой стороны не&amp;nbsp;ковыряться слишком долго, делая универсальный вариант, который потом никому не&amp;nbsp;понадобится.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Найти приемлимый баланс между семантически идеальным кодом, сверстанным по&amp;nbsp;стандартам, и&amp;nbsp;тем, как это отображается в&amp;nbsp;различных браузерах.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Сделать админскую часть сайта простой и&amp;nbsp;понятной, и&amp;nbsp;вместе с&amp;nbsp;тем достаточно мощной для решения необходимых задач.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Знать грань, когда лучше пойти договориться с&amp;nbsp;дизайнером, чтобы он немного перерисовал, вместо того чтобы умирать, верстая ебанистический макет.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-9193771274140432575?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=9193771274140432575' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9193771274140432575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/9193771274140432575'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/blog-post_5110.html' title='Про компромиссы'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-7478603135672262746</id><published>2008-03-21T19:55:00.026+03:00</published><updated>2009-03-16T00:38:58.334+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSL'/><title type='text'>XSLT: sort</title><content type='html'>&lt;p&gt;Используя &lt;code&gt;&amp;lt;xsl:sort&amp;gt;&lt;/code&gt; нужно иметь в&amp;nbsp;виду два момента.&lt;/p&gt;

&lt;p&gt;&amp;mdash; При хождении от&amp;nbsp;текущего элемента по&amp;nbsp;осям preceding-sibling и&amp;nbsp;following-sibling, мы ходим &lt;em&gt;по&amp;nbsp;исходному дереву&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;xsl:for-each select="item"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:sort select="name" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- preceding-sibling и following-sibling работают по&amp;nbsp;исходным,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;не&amp;nbsp;отсортированным данным --&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:for-each&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&amp;mdash; &lt;code&gt;position()&lt;/code&gt; после &lt;code&gt;&amp;lt;xsl:sort&amp;gt;&lt;/code&gt; возвращает позицию &lt;em&gt;в&amp;nbsp;отсортированном дереве&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-7478603135672262746?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=7478603135672262746' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7478603135672262746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/7478603135672262746'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/xsl-sort.html' title='XSLT: sort'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6514056161357405677</id><published>2008-03-21T19:43:00.014+03:00</published><updated>2009-08-04T22:28:51.944+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS: line-height</title><content type='html'>&lt;p&gt;Как-то я&amp;nbsp;долго мучился с&amp;nbsp;&lt;code&gt;line-height&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Задавал его в&amp;nbsp;&lt;code&gt;em&lt;/code&gt; и&amp;nbsp;процентах у&amp;nbsp;&lt;code&gt;body&lt;/code&gt; и&amp;nbsp;были жуткие глюки с&amp;nbsp;наследованием.&lt;/p&gt;

&lt;p&gt;Я уже было отчаялся и&amp;nbsp;решил жахнуть стиль для звездочки:&lt;br /&gt;
&lt;code&gt;* {line-height: 1.4em;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Но тут, коллега подсказал мне, что &lt;strong&gt;&lt;code&gt;line-height&lt;/code&gt; нужно указывать без единиц измерения&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Оказывается, если указывать &lt;code&gt;line-height&lt;/code&gt; в&amp;nbsp;&lt;code&gt;em&lt;/code&gt; или &lt;code&gt;%&lt;/code&gt;, то&amp;nbsp;при наследовании браузеры не&amp;nbsp;пересчитывают &lt;code&gt;line-height&lt;/code&gt; в&amp;nbsp;зависимости от размера шрифта текущего элемента. Из-за этого у&amp;nbsp;меня в&amp;nbsp;&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; слипались строчки.&lt;/p&gt;

&lt;p&gt;А&amp;nbsp;если указывать просто число без единиц измерения, то&amp;nbsp;пересчитывают. То&amp;nbsp;есть берут размер шрифта текущего элемента, умножают на&amp;nbsp;это число и&amp;nbsp;получается высота строки текущего элемента.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6514056161357405677?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6514056161357405677' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6514056161357405677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6514056161357405677'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/css-line-height.html' title='CSS: line-height'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-5436980990220371080</id><published>2008-03-21T17:27:00.007+03:00</published><updated>2010-01-14T14:05:32.921+03:00</updated><title type='text'>Правки в чужом коде</title><content type='html'>&lt;p&gt;Когда меня просят помочь по&amp;nbsp;какому-либо проекту, я&amp;nbsp;всегда сначала потрачу 15&amp;nbsp;минут на&amp;nbsp;изучение особенностей написания кода в&amp;nbsp;данном проекте. Как именуются классы и&amp;nbsp;айдишники в&amp;nbsp;CSS, переменные и&amp;nbsp;методы в&amp;nbsp;JavaScript, шаблоны и&amp;nbsp;моды в&amp;nbsp;XSL. Как отбиваются блоки кода пустыми строками, где стоят пробелы, а&amp;nbsp;где нет. И&amp;nbsp;постараюсь сделать в&amp;nbsp;этом&amp;nbsp;же стиле, как&amp;nbsp;бы он&amp;nbsp;не&amp;nbsp;был мне противен.&lt;/p&gt;

&lt;p&gt;Никто не&amp;nbsp;любит править чужой код. Но&amp;nbsp;также неприятно открыть свой код и&amp;nbsp;увидеть, что кто-то нагадил там в&amp;nbsp;другом стиле :-) Это все равно как если бы Зюсмайер, дописывая &amp;laquo;Реквием&amp;raquo; Моцарта, вставил бы туда какую-нибудь отсебятину, пусть и&amp;nbsp;хорошую. Хорошо, но&amp;nbsp;не&amp;nbsp;в&amp;nbsp;кассу. Нужно уважать автора и&amp;nbsp;его стиль программирования.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-5436980990220371080?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=5436980990220371080' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5436980990220371080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/5436980990220371080'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/blog-post_21.html' title='Правки в чужом коде'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-6544116148999259491</id><published>2008-03-21T10:50:00.014+03:00</published><updated>2009-03-16T00:39:35.001+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript: return this;</title><content type='html'>&lt;p&gt;Если в&amp;nbsp;методе не&amp;nbsp;нужно возвращать некое значение, то&amp;nbsp;лучше сделать чтобы этот метод возвращал &lt;code&gt;this&lt;/code&gt;. Это позволяет программировать в&amp;nbsp;каскадном стиле:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;myObj.prepare().activate();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Напомню, что если метод явно ничего не&amp;nbsp;возвращает, то&amp;nbsp;он&amp;nbsp;возвращает &lt;code&gt;undefined&lt;/code&gt;. Исключение составляют конструкторы, которые по&amp;nbsp;умолчанию и&amp;nbsp;так возвращают &lt;code&gt;this&lt;/code&gt;, то&amp;nbsp;есть указатель на&amp;nbsp;новый созданный объект. Поэтому в&amp;nbsp;конструкторах не&amp;nbsp;нужно писать &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-6544116148999259491?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=6544116148999259491' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6544116148999259491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/6544116148999259491'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/javascript-return-this.html' title='JavaScript: return this;'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3177348248360438240</id><published>2008-03-20T17:02:00.008+03:00</published><updated>2008-11-07T16:26:05.216+03:00</updated><title type='text'>Смотреть в будущее</title><content type='html'>&lt;p&gt;Хороший технолог всегда закладывается на&amp;nbsp;то, чего по&amp;nbsp;утверждению дизайнера или менеджера на&amp;nbsp;сайте никогда не&amp;nbsp;будет. Потому что знает&amp;nbsp;&amp;mdash; скоро все именно так и&amp;nbsp;будет.&lt;/p&gt;

&lt;p&gt;27&amp;nbsp;июня 2005&amp;nbsp;года эта фраза висела на&amp;nbsp;главной странице Студии.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_dN6tHnouWi8/SRRApqJJhPI/AAAAAAAAAtw/27Jq5oT9CLo/s1600-h/2005-06-27.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_dN6tHnouWi8/SRRApqJJhPI/AAAAAAAAAtw/27Jq5oT9CLo/s320/2005-06-27.jpg" width="292" height="320" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3177348248360438240?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3177348248360438240' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3177348248360438240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3177348248360438240'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/blog-post_20.html' title='Смотреть в будущее'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dN6tHnouWi8/SRRApqJJhPI/AAAAAAAAAtw/27Jq5oT9CLo/s72-c/2005-06-27.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-4412561512283319676</id><published>2008-03-19T16:01:00.012+03:00</published><updated>2009-03-09T12:33:32.388+03:00</updated><title type='text'>Мысли по поводу организации работы</title><content type='html'>&lt;p&gt;Неопытный технолог думает как вообще решить задачу хоть как-нибудь. Опытный&amp;nbsp;же технолог имеет багаж решений, которые он&amp;nbsp;может применить. Скорее всего, он&amp;nbsp;уже решал похожую задачу, возможно, не&amp;nbsp;один раз. Поэтому, его цель&amp;nbsp;&amp;mdash; не&amp;nbsp;просто решить задачу. Опытный технолог думает шире. Он&amp;nbsp;ищет решение наилучшим образом интегрирующееся с&amp;nbsp;остальными частями системы. Он&amp;nbsp;смотрит в&amp;nbsp;будущее, стараясь сделать так, чтобы модификация и&amp;nbsp;развитие кода были максимально безболезненны. Он&amp;nbsp;заботится о&amp;nbsp;технологах из&amp;nbsp;отдела поддержки, чтобы ребята не&amp;nbsp;сломали себе голову, разбираясь как работает код. Он&amp;nbsp;думает о&amp;nbsp;возможных экстремальных ситуациях и&amp;nbsp;закладывается на&amp;nbsp;них в&amp;nbsp;коде.&lt;/p&gt;

&lt;p&gt;Я&amp;nbsp;за такую схему работы: более опытный технолог начинает проект, задает направление, закладывает фундамент, создает базовые шаблоны, основные механизмы и&amp;nbsp;прочее. Менее опытный технолог затем продолжает, а&amp;nbsp;более опытный присматривает и&amp;nbsp;корректирует (&amp;laquo;ведет&amp;raquo;) менее опытного.&lt;/p&gt;

&lt;p&gt;Нельзя давать человеку одному делать новый проект на&amp;nbsp;незнакомой для него системе (CMS). Человеку сложно сходу придумать хорошую архитектуру решения в&amp;nbsp;новой для него среде разработки. Вопросов которые нужно решить много: где как что хранить, как структурировать шаблоны и&amp;nbsp;прочее. Дай мне сейчас новую систему, отличную от&amp;nbsp;Имприматур&amp;nbsp;I или II, и&amp;nbsp;если мне никто не&amp;nbsp;поможет, я&amp;nbsp;скорее всего тоже сначала сделаю не&amp;nbsp;лучшим образом.&lt;/p&gt;

&lt;p&gt;Можно проводить семинары, это, конечно, дает какой-то результат. Однако после семинара человек остается один на&amp;nbsp;один с&amp;nbsp;системой и&amp;nbsp;начинает &amp;laquo;ваять&amp;raquo;.&lt;/p&gt;

&lt;p&gt;У&amp;nbsp;менее опытных технологов возможно поначалу будет &amp;laquo;ломка&amp;raquo;. Привыкать к&amp;nbsp;чужому стилю программирования и&amp;nbsp;структурирования информации не&amp;nbsp;просто. Зато они чему-то научатся и&amp;nbsp;не&amp;nbsp;сделают проект, который потом придется переделывать.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-4412561512283319676?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=4412561512283319676' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4412561512283319676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/4412561512283319676'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/blog-post_19.html' title='Мысли по поводу организации работы'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8221830139710606339.post-3299892742789301314</id><published>2008-03-19T13:53:00.012+03:00</published><updated>2009-03-16T10:07:33.289+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='браузеры'/><title type='text'>Переключение режимов в IE8</title><content type='html'>&lt;p&gt;Кстати, если кто еще не&amp;nbsp;знает. Микрософт передумали и&amp;nbsp;теперь IE8 по&amp;nbsp;умолчанию будет рендерить в&amp;nbsp;режиме IE8 Standards. Но&amp;nbsp;с&amp;nbsp;помощью &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; ему можно будет сказать &amp;laquo;рендери как IE7&amp;raquo;. Ранее анонсировалось обратное поведение.&lt;/p&gt;

&lt;p&gt;Итого в&amp;nbsp;IE8 будет 3&amp;nbsp;режима: Quirks, IE7 Standards и&amp;nbsp;IE8 Standards.&lt;/p&gt;

&lt;p&gt;Поведение такое:&lt;/p&gt;

&lt;p&gt;1. Задан DOCTYPE для стандартного режима или неизвестный DOCTYPE&amp;nbsp;&amp;mdash; включается IE8 Standards mode&lt;/p&gt;

&lt;p&gt;2. Задан DOCTYPE для режима Quirks или DOCTYPE отсутствует&amp;nbsp;&amp;mdash; Quirks mode&lt;/p&gt;

&lt;p&gt;3. Есть &lt;code&gt;&amp;lt;meta equiv="X-UA-Compatible" content="IE=7"&amp;gt;&lt;/code&gt;&amp;nbsp;&amp;mdash; вне зависимости от&amp;nbsp;DOCTYPE, включается IE7 Standards mode&lt;/p&gt;

&lt;p&gt;Ссылки по&amp;nbsp;теме:&lt;br /&gt;
&lt;a href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx"&gt;Microsoft's Interoperability Principles and IE8&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.msdn.com/ie/archive/2008/03/06/the-default-layout-mode.aspx"&gt;The Default Layout Mode&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8221830139710606339-3299892742789301314?l=sreznikov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8221830139710606339&amp;postID=3299892742789301314' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3299892742789301314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8221830139710606339/posts/default/3299892742789301314'/><link rel='alternate' type='text/html' href='http://sreznikov.blogspot.com/2008/03/blog-post.html' title='Переключение режимов в&amp;nbsp;IE8'/><author><name>Степан Резников</name><uri>http://www.blogger.com/profile/15218948405455691320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yO771S6wx-c/Th70LJUl7vI/AAAAAAAADZQ/zc1thGI7FFA/s220/sreznikov.png'/></author><thr:total>0</thr:total></entry></feed>
