<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Подлипенский Павел</title>
    <description>Блог о технологиях и деньгах</description>
    <link>http://www.podlipensky.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.podlipensky.com/opml.axd</blogChannel:blogRoll>
    <dc:creator>Подлипенский Павел</dc:creator>
    <dc:title>Подлипенский Павел</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/podlipensky" type="application/rss+xml" /><feedburner:emailServiceId>podlipensky</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Думаете, вы знаете JavaScript</title>
      <description>&lt;p&gt;Вы бородатый веб разработчик и думаете уже видали всякие чудеса в JavaScript-коде? Хм, чтож тогда следующие задачки для вас.&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. ++Math.PI&lt;br /&gt;2. (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)&lt;br /&gt;3. typeof NaN&lt;br /&gt;4. typeof typeof undefined&lt;br /&gt;5. a = {null:null}; typeof a.null;&lt;br /&gt;6. a = &amp;quot;5&amp;quot;; b = &amp;quot;2&amp;quot;; c = a * b;&lt;br /&gt;7. a = &amp;quot;5&amp;quot;; b = 2; c = a+++b;&lt;br /&gt;8. isNaN(1/null)&lt;br /&gt;9. (16).toString(16)&lt;br /&gt;10. 016 * 2&lt;br /&gt;11. ~null&lt;br /&gt;12. &amp;quot;ab c&amp;quot;.match(/\b\w\b/)&lt;/p&gt;&lt;p&gt;Жду ваши варианты в комментариях (просьба не постить по десять одинаковых комментариев, все равно раньше чем я их промодерю они не появятся). До компа я доберусь только завтра, поэтому и ваши комментарии тоже появятся только завтра, а заодно и обновление к этому посту - в виде ответов и объяснений к решениям (да, я их сопру с ваших комментариев, поэтому сначала думайте, а потом пишите!)&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ответы и решения:&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;1. 4.141592653589793&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;С этим надеюсь понятно, в школе все учились.... Я знаю некоторых смутило, что Пи вроде как должно быть константой, но спешу вас разочаровать - в джаваскрипте с константами плохо, а точнее их нет в том понимании, в каком мы видим их, скажем, в C#.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;2. false&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Такой же ответ получат и Java разработчики, потому как и Java и JavaScript используют&amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;IEEE 754 числа с плавающей точкой. Более подробно об операциях с числами с плавающей точкой можно найти&amp;nbsp;&lt;a rel="nofollow" href="http://www.macaulay.ac.uk/fearlus/floating-point/" target="_blank"&gt;тутаньки&lt;/a&gt;.&amp;nbsp;&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;3. &amp;quot;number&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Логического объяснения этому я не нашел, единственное что могу посоветовать, это стараться использовать isNaN вместо typeof SomePotentialNumber, во избежание казусов.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;4. &amp;quot;string&amp;quot;&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; font-weight: normal; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Тут все просто - первый оператор typeof вернет тип переменной в виде строки, следовательно второй оператор должен вернуть тип результата первого оператора, т.е. string.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;5. &amp;quot;object&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Мы присвоили переменной а, объект с полем &amp;quot;null&amp;quot;, значение которого null, а это в свою очередь, пусть и специфический, но объект. Другими словами мы тут имеем&amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;a.null === null.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;6. 10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Если в операциях умножение, деление или вычитание один из операторов строка - интерпретатор пытается преобразовать его в число.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;7. 7&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Порядок выполнения операндов в Javascript &amp;nbsp;идет слева направо, поэтому мы имеем &amp;quot;а увеличить на 1, а затем сложить с b&amp;quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;8. false&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;С этим тоже, думаю, все понятно.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;9. 10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;toString() принимает числовой параметр (необязательный) и toString(16) означает, что число записано в шестнастеричной системе счисления, посему ответ и 10.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;10. 28&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;016 это восьмеричное представление числа 14 в десятеричной системе счисления.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;11. -1&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; font-weight: normal; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;12. [ &amp;quot;c&amp;quot; ]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Отдельно стоящий символ в той строке только один - &amp;quot;с&amp;quot;, это и ищет указанное регулярное выражение.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/P68ysl4cr3Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/P68ysl4cr3Q/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/04/28/javascript-puzzle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</guid>
      <pubDate>Tue, 28 Apr 2009 06:30:00 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=38794625-0c30-4327-ba66-1b19982b0d15</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/04/28/javascript-puzzle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=38794625-0c30-4327-ba66-1b19982b0d15</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</feedburner:origLink></item>
    <item>
      <title>Минимальная зарплата</title>
      <description>&lt;p&gt;Думаю все уже в курсе, что&amp;nbsp;&lt;a href="http://www.developers.org.ua/archives/krokodil/2008/10/13/outsourcing-business-in-times-on-crisis/"&gt;у нас кризис&lt;/a&gt;&amp;nbsp;(теперь кажется финансовый), впрочем как и у всех. И каждый понимает что ничего хорошего ему это событие не принесет. А одним из &amp;quot;благ&amp;quot; кризиса является минимальная зарплата, т.е. та сумма денег, за которую и вы не против поработать и шефу увольнять вас пока нет повода. Звучит неплохо, правда? Неправда. У большинства людей хорошо развито чувство собственничества, поэтому пока это не мое, мне все равно кто этим владеет, но как только оно стало моим - хрен кто это у меня отберет! А тут такое дело - зарплату понижают! Не буду больше растекаться по древу вот вам поучительный комикс на эту тему:&lt;/p&gt;&lt;img src="http://www.podlipensky.com/image.axd?picture=2009%2f4%2f3376271384_b84611b2a1_o.jpg" alt="" /&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/bYTapVOJ-T8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/bYTapVOJ-T8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/04/27/minimal-wages.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</guid>
      <pubDate>Mon, 27 Apr 2009 01:34:00 +0300</pubDate>
      <category>В мире</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/04/27/minimal-wages.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</feedburner:origLink></item>
    <item>
      <title>4 интересных онлайн презентаций для веб-разработчика</title>
      <description>&lt;p&gt;&lt;strong&gt;1. Ajax 101 | Workshop&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/billwscott"&gt;Bill Scott&lt;/a&gt; | &lt;a href="http://www.slideshare.net/billwscott/ajax-101-workshop"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Введение в программирование с помощью Ajax. Включает XMLHttpRequest, XML, JSON, JavaScript, HTML, CSS, Dom Scripting, Event Handling с небольшими примерами на YUI.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div id="__ss_24818" style="width: 425px; text-align: left"&gt;&lt;a title="Ajax 101 Workshop" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/billwscott/ajax-101-workshop?type=powerpoint"&gt;Ajax 101 Workshop&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ajax-101-workshop-29092&amp;amp;stripped_title=ajax-101-workshop" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ajax-101-workshop-29092&amp;amp;stripped_title=ajax-101-workshop" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/billwscott"&gt;Bill Scott&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/scripthack"&gt;scripthack&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/mashup"&gt;mashup&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTU*NTgmcHQ9MTIzNTUwNjk4MTY1MiZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;br /&gt;  &lt;p&gt;&lt;strong&gt;2. Modular CSS&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/maxdesign"&gt;Russ Weakley&lt;/a&gt; | &lt;a href="http://www.slideshare.net/maxdesign/modular-css"&gt;This presentation on Slide Share&lt;/a&gt;     &lt;br /&gt;Вполне доступно (даже я понял) объясняется механизм построения &lt;strike&gt;правильного&lt;/strike&gt; модульного CSS, что позволяет прятать/показывать отдельные CSS правила для отдельных браузеров, без различного рода уловок и обходных путей.&lt;/p&gt;  &lt;div id="__ss_69855" style="width: 425px; text-align: left"&gt;&lt;a title="Modular CSS" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/maxdesign/modular-css?type=presentation"&gt;Modular CSS&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=modular-css3496&amp;amp;stripped_title=modular-css" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=modular-css3496&amp;amp;stripped_title=modular-css" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/maxdesign"&gt;Russ Weakley&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/flexible"&gt;flexible&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/system"&gt;system&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTcwNzMmcHQ9MTIzNTUwNzEzMDU3MiZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;p&gt;&lt;strong&gt;3. jQuery in 15 minutes&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/simon"&gt;Simon&lt;/a&gt; | &lt;a href="http://www.slideshare.net/simon/jquery-in-15-minutes"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Небольшое введение в JQuery. Функции, коллекции, работа со значениями и цепочками.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="__ss_88304" style="width: 425px; text-align: left"&gt;&lt;a title="jQuery in 15 minutes" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/simon/jquery-in-15-minutes?type=presentation"&gt;jQuery in 15 minutes&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=jquery-in-15-minutes1421&amp;amp;stripped_title=jquery-in-15-minutes" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=jquery-in-15-minutes1421&amp;amp;stripped_title=jquery-in-15-minutes" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/simon"&gt;simon&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/javascript"&gt;javascript&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/jquery"&gt;jquery&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTY3NjYmcHQ9MTIzNTUwNzM2NTY1NSZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4. JavaScript Library Overview&lt;/strong&gt;&amp;#160; &lt;br /&gt;Автор &lt;a href="http://www.slideshare.net/jeresig"&gt;Jeresig&lt;/a&gt; | &lt;a href="http://www.slideshare.net/jeresig/javascript-library-overview"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Интересный обзор популярных JavaScript библиотек (jquery, prototype, Scriptaculous...) для веб-дизайнеров.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="__ss_143885" style="width: 425px; text-align: left"&gt;&lt;a title="JavaScript Library Overview" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/jeresig/javascript-library-overview?type=presentation"&gt;JavaScript Library Overview&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=javascript-library-overview-1193202840830224-1&amp;amp;stripped_title=javascript-library-overview" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=javascript-library-overview-1193202840830224-1&amp;amp;stripped_title=javascript-library-overview" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/jeresig"&gt;jeresig&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/dojo"&gt;dojo&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/prototype"&gt;prototype&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTkxMTgmcHQ9MTIzNTUwNzQzNjMxMSZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/LWtG0uvGmL4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/LWtG0uvGmL4/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/25/four-online-presentations-for-web-developers.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</guid>
      <pubDate>Wed, 25 Feb 2009 17:47:42 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/25/four-online-presentations-for-web-developers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=17af4966-79cf-4f20-bfc5-3f40fa95868d</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</feedburner:origLink></item>
    <item>
      <title>Video: Layout Engine Internals</title>
      <description>&lt;p&gt;Интересное видео в тему к предыдущему посту. Если вы еще не в курсе, как работает браузер - жмите на серенький треугольничек рядом с дядькой.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bab3c1f9-6ecd-45d7-a58d-de29ad8e8e75" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/a2_6bGNZ7bA&amp;amp;eurl=http://dougt.wordpress.com/&amp;amp;feature=player_embedded"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/a2_6bGNZ7bA&amp;amp;eurl=http://dougt.wordpress.com/&amp;amp;feature=player_embedded" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/AnCLKYK1Hwo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/AnCLKYK1Hwo/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/17/Video-Layout-Engine-Internals.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</guid>
      <pubDate>Tue, 17 Feb 2009 00:02:25 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/17/Video-Layout-Engine-Internals.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</feedburner:origLink></item>
    <item>
      <title>Скаженi кабани: Оптимизируем операции с DOM'ом</title>
      <description>&lt;p&gt;Давно известно, что операции с DOM'ом весьма и весьма трудоемки. Потери в производительности заметны обычно в трех случаях:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;когда скрипт выполняет &lt;strong&gt;манипуляции&lt;/strong&gt; с деревом объектов (создает, удаляет или изменяет часть дерева)  &lt;li&gt;если скрипт "заставляет" браузер &lt;strong&gt;перерисовывать&lt;/strong&gt; (redraw) или &lt;strong&gt;перестраивать разметку&lt;/strong&gt; (reflow) страницы  &lt;li&gt;и наконец, в случае когда скрипт "ищет" один из узлов дерева объектов (если дерево большое).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Последний пункт я уже рассматривал в &lt;a href="http://podlipensky.com/post/2008/11/24/quick-web-sites-optimize-jquery.aspx" target="_blank"&gt;одной из статей&lt;/a&gt; своего цикла &lt;a href="http://podlipensky.com/tag/%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.aspx" target="_blank"&gt;Скаженi кабани&lt;/a&gt;, на примере JQuery. Поэтому сегодня мы поговорим о первых двух. Эм...на самом деле я схитрил, и первый пункт представляет собой ни что иное, как причину появления второго пункта. Тогда сразу перейдем ко второму пункту и попробуем разобраться в терминах перерисовывать и перестраивать разметку:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Перерисовка страницы &lt;/strong&gt;браузером происходит в случае, когда что-то визуально изменилось, но разметка страницы осталась прежней. Например, изменился цвет элемента или элемент стал видимым/невидимым (с помощью visibility: [hidden, visible], так как это не повлияет на разметку). Эта операция существенно влияет на производительность веб приложения, так как заставляет браузер пройтись по дереву объектов и определить какие элементы видимы и как они должны быть отображены.&lt;/p&gt; &lt;p&gt;Перестройка разметки страницы более дорогостоящая операция. Она происходит в следующих случаях:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;при первой загрузке страницы. В случае с Firefox, перестройка может происходить несколько раз, по мере &lt;strong&gt;докачивания контента&lt;/strong&gt; страницы;  &lt;li&gt;когда вы добавляете или удаляете элементы DOM'a. Надо сказать, тут есть одно исключение - если вы добавили/удалили объект с абсолютным позиционированием, то это может и не привести к перестройке разметки страницы, так как позиция и размеры других элементов не были изменены;  &lt;li&gt;когда стиль элемента изменен и он влияет на размер и положение этого либо других объектов;  &lt;li&gt;когда вы пытаетесь обратиться к свойствам, требующим вычислений со стороны браузера (например, offsetWidth, clientHeight). А также в случае попытки получить вычисляемые CSS значения (с помощью getComputedStyle() или currentStyle в IE).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Процесс перестройки разметки страницы выглядит примерно следующим образом:&lt;/p&gt; &lt;p&gt;&lt;a href="http://Mozilla.org" target="_blank" rel="nofollow"&gt;Mozilla.org&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="display: block"&gt; &lt;object type="application/x-shockwave-flash" height="330" width="400" data="http://video.google.com/googleplayer.swf?docid=1020647662203348823"&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://wiki.org" target="_blank" rel="nofollow"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="display: block"&gt; &lt;object type="application/x-shockwave-flash" height="330" width="400" data="http://video.google.com/googleplayer.swf?docid=-5863446593724321515"&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Но перестройка разметки странцы не происходит сразу после добавления элемента в дерево или после изменения высоты элемента. Все "запросы" на перестройку разметки выстраиваются в очередь и выполняются уже после выполнения скрипта. Причем, некоторые "запросы" могут быть объединены, если они применяются к одному элементу и являются одного типа (например изменяют его ширину). Но процесс оптимизации таких "запросов" сильно зависит от типа браузера (и даже версии браузера). Пользователь не может взаимодействовать с вашим приложением, пока идет перестройка разметки.&lt;/p&gt; &lt;p&gt;Теперь когда мы в курсе "почему наш сайт тормозит", рассмотрим несколько техник оптимизации работы с DOM'ом. Первое что приходит в голову, это минимизировать количество дорогостоящих операций (описанных выше). А значит, необходимо как можно больше операций совершать вне DOM'а, например используя &lt;a href="http://ejohn.org/blog/dom-documentfragments/" target="_blank" rel="nofollow"&gt;DocumentFragment&lt;/a&gt;.&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;p&gt;&lt;/p&gt;
    item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product&lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.appendChild(item); &lt;span style="color: #008000"&gt;// AHTUNG! Operation with DOM&lt;/span&gt;&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Предыдущий код можно оптимизировать следующим образом:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; fragment = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createDocumentFragment(); &lt;span style="color: #008000"&gt;//create document fragment&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product&lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fragment.appendChild(item); &lt;span style="color: #008000"&gt;//working with fragment only, not with DOM&lt;/span&gt;&lt;br&gt;}&lt;br&gt;list.appendChild(fragment); &lt;span style="color: #008000"&gt;//add fragment to DOM&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Эта версия кода затрагивает дерево объектов только раз, в последней строчке. И так как DocumentFragment не имеет визуальной составляющей, то все операции с ним не вызывают ни перерисовки, ни изменения в разметке страницы. Но так как DocumentFragment не может быть добавлен в DOM, то операция appendChild добавит все дочерние элементы фрагмента (вместо того, чтобы добавить сам фрагмент). &lt;/p&gt;
&lt;p&gt;Другим, более эффективным подходом, будет работать с элементом, не находящимся в дереве. К примеру, мы можем удалить наш объект из дерева перед выполнением операций над ним (removeChild() или replaceChild())&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;parent&lt;/span&gt; = list.parentNode; &lt;span style="color: #008000"&gt;//find parent&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;parent&lt;/span&gt;.removeChild(list); &lt;span style="color: #008000"&gt;//remove list element from DOM&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; fragment = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createDocumentFragment(); &lt;span style="color: #008000"&gt;//create document fragment&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product &lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.appendChild(item);&lt;br&gt;}&lt;br&gt;&lt;span style="color: #0000ff"&gt;parent&lt;/span&gt;.appendChild(list);&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Мы не избежали перестройки разметки страницы, но мы уменьшили количество таких перестроек.&lt;/p&gt;
&lt;p&gt;Другой причиной перерисовки или перестройки страницы служат &lt;strong&gt;стили&lt;/strong&gt; и спобосы их назначения элементам. Рассмотрим следующий кусок кода:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;element.style.backgroundColor = "&lt;span style="color: #8b0000"&gt;white&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause redraw&lt;/span&gt;&lt;br&gt;element.style.color = "&lt;span style="color: #8b0000"&gt;red&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause redraw&lt;/span&gt;&lt;br&gt;element.style.fontSize = "&lt;span style="color: #8b0000"&gt;12em&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause reflow&lt;/span&gt;&lt;br&gt;element.style.widht = "&lt;span style="color: #8b0000"&gt;100px&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause reflow&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Как видите первые две строки инициируют перерисовку. Избежать этого можно, если перед изменением стилей скрыть элемент с помощью visibility:hidden или display:none (будет произведено два лишних reflow). Избежать перестройки разметки тут не получиться, но их количество можно уменьшить, если задать все изменения стилей в CSS классе.&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;.&lt;span style="color: #800000"&gt;newClass&lt;/span&gt;{&lt;br&gt;	&lt;span style="color: #800000"&gt;background-color&lt;/span&gt;: &lt;span style="color: #800000"&gt;blue&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;color&lt;/span&gt;: &lt;span style="color: #800000"&gt;red&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;font-size&lt;/span&gt;: &lt;span style="color: #800000"&gt;12em&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;with&lt;/span&gt;: &lt;span style="color: #800000"&gt;100px&lt;/span&gt;;&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;а затем&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;element.className = "&lt;span style="color: #8b0000"&gt;newClass&lt;/span&gt;";&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Скрытый reflow может также произойти, если мы попытаемся получить одно из вычисляемых свойств (например &lt;strong&gt;offsetWidth&lt;/strong&gt;). Браузер должен быть уверен, что значение свойства актуально, поэтому он рассчитает его заново, а это фактически и будет перестройка разметки страницы. Избежать этого опять же нельзя, но мы можем уменьшить количество таких операций за счет кэширования значения этого свойства:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; posElem = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById('animation');
&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; calcWidth = posElem.offsetWidth;
posElem.style.fontSize = ( calcWidth / 10 ) + 'px';
posElem.firstChild.style.marginLeft = ( calcWidth / 20 ) + 'px';
posElem.style.left = ( ( -1 * calcWidth ) / 2 ) + 'px';
... other changes ...&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Полезные ссылки&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mozilla.org/newlayout/doc/reflow.html" target="_blank" rel="nofollow"&gt;Notes on HTML Reflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ejohn.org/blog/dom-documentfragments/" target="_blank" rel="nofollow"&gt;Dom document fragments&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow" target="_blank" rel="nofollow"&gt;Efficent Javascript (from Opera)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ryboe.com/2008/07/22/increasing-appendchild-performance-with-dom-tricks.html" target="_blank" rel="nofollow"&gt;Increasing appendChild Performance with DOM Tricks&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/smsbMfIMnPU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/smsbMfIMnPU/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/16/dom-operations-optimization.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</guid>
      <pubDate>Mon, 16 Feb 2009 02:00:43 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=b95ecda1-8094-412c-94ca-f2e55a96e402</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/16/dom-operations-optimization.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=b95ecda1-8094-412c-94ca-f2e55a96e402</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</feedburner:origLink></item>
    <item>
      <title>Производительность браузеров в зависимости от верстки</title>
      <description>&lt;p&gt;Честно говоря раньше не придавал особого значения такой фазе веб-девелопмента, как верстка. Отчасти потому что никогда этим сам не занимался(на должном уровне), отчасти от того, что недопонимал некоторые аспекты веб-разработки. Недавно наткнулся на &lt;a href="http://www.artlebedev.ru/tools/technogrette/html/browser-performance/" target="_blank" rel="nofollow"&gt;интересную статью&lt;/a&gt; Сергея Чикуенока (из команды никому не известного &lt;a href="http://www.artlebedev.ru" target="_blank" rel="nofollow"&gt;Артема Лебедева&lt;/a&gt;). Суть этой статьи сводится к следующему: если клиентский код работает медленно - убейте дизайнера, верстальщика или кто этим у вас там занимался. Потому как &lt;strong&gt;разметка влияет на скорость работы веб-приложения&lt;/strong&gt;. Кому интересно почитать детали можно в &lt;a href="http://www.artlebedev.ru/tools/technogrette/html/browser-performance/" target="_blank" rel="nofollow"&gt;оригинале статьи&lt;/a&gt;, а я лишь процитирую выводы:&lt;/p&gt; &lt;ol&gt; &lt;ol&gt; &lt;li&gt;Для интерактивных элементов лучше использовать &lt;tt&gt;position: absolute&lt;/tt&gt;.  &lt;li&gt;Большое количество элементов на странице может снизить производительность, но не стоит увлекаться их сокращением в ущерб надежности макета.  &lt;li&gt;Не надо делать очень глубоких вложенных структур элементов.  &lt;li&gt;Прежде чем начинать верстку макета, следует узнать, какие интерактивные механизмы там должны быть — это избавит от многих проблем уже на начальном этапе работы над проектом.  &lt;li&gt;Не надо загонять себя в угол глупых стереотипов: «валидность» и «семантичность» никому, кроме самих разработчиков, не нужна.  &lt;li&gt;Не стоит без надобности растягивать картинки. Если это необходимо сделать, следует воспользоваться &lt;tt&gt;canvas&lt;/tt&gt;.  &lt;li&gt;Как правило, &lt;tt&gt;img&lt;/tt&gt;-элемент будет работать гораздо быстрее, чем CSS-свойство &lt;tt&gt;background-image&lt;/tt&gt;.  &lt;li&gt;Помните главное правило: &lt;i&gt;оптимизировать нужно то, что требует оптимизации&lt;/i&gt;. &lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;Вот так-то господа, веб разработчики...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/JEFBlyoH_FQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/JEFBlyoH_FQ/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/13/browser-performance-layout.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</guid>
      <pubDate>Fri, 13 Feb 2009 09:17:04 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/13/browser-performance-layout.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=eca0dda4-07b7-44ee-8f88-1ace31a09c32</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</feedburner:origLink></item>
    <item>
      <title>Небольшой LINQ пазл</title>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
 
&lt;p&gt;
Почему следующий кусок кода генерирует &lt;strong&gt;StackOverflowException&lt;/strong&gt;?
&lt;/p&gt;
&lt;pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; q = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;[] { 1, 2 };
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
q = from x &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;[] { 1, 2 }
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
    from y &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; q
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
    select x + y;
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
q.ToArray();
&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
С предложениями, как это &lt;strong&gt;исправить&lt;/strong&gt; - прошу в комментарии ;)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/qE2hD8XFrcg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/qE2hD8XFrcg/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/11/linq-puzzle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</guid>
      <pubDate>Wed, 11 Feb 2009 10:25:00 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=e0f63684-4431-4159-9b24-3904918f95b2</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/11/linq-puzzle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=e0f63684-4431-4159-9b24-3904918f95b2</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</feedburner:origLink></item>
    <item>
      <title>Письмо архитектору</title>
      <description>&lt;p&gt;По роду деятельности получаю различного рода документы(требования) от наших клиентов. Ввиду подписанного мною NDA, я не могу их публиковать. Поэтому я представляю требования к проекту, как требования к постройке дома.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Уважаемый Архитектор,&lt;/p&gt; &lt;p&gt;Пожалуйста спланируте и построте мне дом. Я не совсем уверен, что именно мне нужно, поэтому полностью полагаюсь на вас. Тем не менее, у меня есть несколько идей, которые я бы хотел видеть реализованными в моем доме. К примеру, я бы хотел иметь 2 или 44 спальных комнаты. Спланируйте пожалуйста, так чтобы эти комнаты можно было потом легко убрать или добавить, потому что я приму окончательное решение только тогда, когда увижу чертежи. А также оцените финансовые затраты на каждый вариант, чтобы я мог принять правильное решение.&lt;/p&gt; &lt;p&gt;Пожалуйста учтите, что мой новый дом должен стоить дешевле, чем дом в котором я живу. Убедитесь, что все недостатки, присутствующие в моем текущем жилище, будут устранены в новом доме (чтоб розетка была не за шкафом, и чтобы телевизор не выключался, когда кто-нибудь включает душ). &lt;/p&gt; &lt;p&gt;Не используйте дорогие материалы (алюминий, медь, и др). Но если нужда в этом все-таки будет, то потрудитесь детально объяснить почему этот материал нельзя заменить на более дешевый.&lt;/p&gt; &lt;p&gt;Надеюсь вы будете использовать последние технологии и идеи при разработке проекта моего дома. Хотя, кухню, пожалуй, давайте сделаем в венецианском стиле IX века.&lt;/p&gt; &lt;p&gt;Чтобы быть уверенным, что вы строите то, что я и моя семья хотим, пожалуйста свяжитесь со всеми членами моей семьи (включая 5ти месячную Мэри) и узнайте у них, чего бы они хотели видеть в нашем новом доме. Моя мама, точно знает, как должен выглядеть наш новый дом, так как она часто нас посещает - раз, а то и два в год. Пожалуйста убедитесь, что вы удовлетворили требования всех членов моей семьи и приняли правильное решение. Но, я оставляю за собой право отменить любое ваше решение, если оно мне не понравиться.&lt;/p&gt; &lt;p&gt;И пожалуйста, не утомляйте меня сейчас деталями. Ваша задача не построить дом, а просто сделать план, нарисовать общую картину так сказать. К примеру, сейчас не время определять цвет паркета. И вот еще, учтите, что моей жене нравиться синий цвет.&lt;/p&gt; &lt;p&gt;Сейчас, также не время покупать какие-либо материалы к постройке дома. Этим займемся когда одобрим план. Надеюсь вы успеете возвести дом в течение 48 часов, после одобрения вашего плана...&lt;/p&gt; &lt;p&gt;И хоть вы сейчас разрабатываете дом для меня, учтите на будущее, что я возможно захочу продать этот дом. Поэтому стоит предусмотреть гибкую конфигурацию дома, на случай если моим покупателям что-то не понравиться.&lt;/p&gt; &lt;p&gt;Вы должны быть восхищены такой уникальной возможностью поработать на меня и используя последние новаторские технологии и материалы построить дом. Я вам предоставляю невероятную свободу в принятии решений для моего дома. Свяжитесь со мной как только закончите разработку плана. &lt;/p&gt; &lt;p&gt;Заранее неуверен в успехе,&lt;/p&gt; &lt;p&gt;Заказчик&lt;/p&gt; &lt;p&gt;P.S.&lt;/p&gt; &lt;p&gt;Моя жена только что мне сказала, что она не согласна с большинством моих инструкций приведенных выше. Ваша задача, как архитектора, решить эту проблему и взять всю ответственность на себя. Если жи вы не можете этого сделать, то я поищу другого &lt;strike&gt;идиота&lt;/strike&gt; архитектора.&lt;/p&gt; &lt;p&gt;P.P.S.&lt;/p&gt; &lt;p&gt;Возможно мне нужен, не дом, а трейлер на колесиках. Пожалуйста ответьте мне, если вы считаете также.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Все вышенаписанное было создано по мотивам схожего &lt;a href="http://blog.wikijava.org/2009/01/04/if-architects-had-to-work-like-software-developers/" target="_blank" rel="nofollow"&gt;романа&lt;/a&gt; и моего личного &lt;a href="http://podlipensky.com/tag/%D0%BE%D0%BF%D1%8B%D1%82.aspx" target="_blank"&gt;опыта&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/4QlcT6I0hD8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/4QlcT6I0hD8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/11/mail-to-architector.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</guid>
      <pubDate>Wed, 11 Feb 2009 09:03:34 +0300</pubDate>
      <category>Управление проектами</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=16323552-156a-48f0-86da-a02b29eb69c1</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/11/mail-to-architector.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=16323552-156a-48f0-86da-a02b29eb69c1</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</feedburner:origLink></item>
    <item>
      <title>Скаженi кабани: Повышение производительности в браузерах</title>
      <description>&lt;p&gt;
&lt;a rel="nofollow" href="http://ejohn.org" target="_blank"&gt;John Resig&lt;/a&gt;, создатель &lt;a rel="nofollow" href="http://jquery.com" target="_blank"&gt;JQuery&lt;/a&gt;, совсем недавно провел небольшую &lt;a rel="nofollow" href="http://ejohn.org/blog/talk-performance-improvements-in-browsers/" target="_blank"&gt;презентацию&lt;/a&gt; в Гугле. Темой встречи были улучшения производительности в браузерах(в ближайших релизах), некие новшества в Javascirpt движках, новые способы работы с DOM и изумительные эффекты с помощью CSS стилей. Но обо всем по порядку.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Количество процессов на браузер&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Одним из интереснейших нововведений в IE8 и Chrome стало то, что теперь вкладки разделены на несколько процессов. Это дает огромное преимущество в производительности, так как теперь различные веб страницы могут загружаться и исполняться параллельно, не отнимая машинных ресурсов друг у друга. В тоже время такие браузеры как FF, Opera и более старые версии IE загружают/исполняют несколько страниц в одном процессе (различные страницы выполняются отдельными потоками).
&lt;/p&gt;
&lt;p&gt;
Позвольте я поясню, каким же образом происходит разделение вкладок на процессы в &lt;strong&gt;Internet Explorer 8&lt;/strong&gt;. Но для начала давайте вспомним модель процессов IE7:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_2.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb.png" border="0" alt="image" width="600" height="484" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Как видите, каждое окно браузера (UI Frame) находиться в отдельном процессе. Хотя, надо сказать, тут есть одно исключение - если вы нажмете CTRL+N, то новый UI фрейм создастся в том же процессе. Закладки, расширения браузера (toolbar extensions), вспомагательные объекты и ActiveX контролы находятся в том же процессе, что и UI фрейм. Проблема такой модели в том, что любая фатальная ошибка (например stack overflow) в одной из закладок приведет к закрытию всех закладок в этом процессе. 
&lt;/p&gt;
&lt;p&gt;
Рассмотрим модель процессов в IE8:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_4.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_1.png" border="0" alt="image" width="677" height="522" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
В новом браузере изменилось лишь месторасположение UI фрейма соответствующих ресурсов. Со стороны пользователя это будет выглядеть вот так:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_6.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_2.png" border="0" alt="image" width="460" height="294" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
И так как закладки изолированы от UI фрейма, то фатальная ошибка в одной из закладок приведет к закрытию всех закладок в этом процессе, но &lt;strong&gt;окно браузера останется открытым&lt;/strong&gt;. Зачем нам это нужно? А для того, чтобы браузер (UI Frame) имел возможность восстановить закрытые вкладки. Но вернемся к разделению вкладок на процессы. Как вы наверное уже успели заметить закладки разделяются на процессы по принципу принадлежности к одной из моделей безопасности (medium IL или low IL). Это накладывало некоторые ограничения на процесс(окно браузера) и когда вы, например, открыли Интранет страницу в одной вкладке, а затем пытались открыть Интернет страницу в другой, то браузер вам сообщал: &amp;quot;Internet Explorer needs to display this webpage in a new window&amp;quot;. Это происходило по той причине, что данный процесс(а следовательно и данное окно браузера) имело определенные security-ограничения в отношении страниц, которые он отображал. Теперь, вы можете открывать страницы &lt;strong&gt;с разными уровнями безопасности в одном окне&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Боюсь ввести вас в заблуждение, что и &lt;strong&gt;Chrome&lt;/strong&gt; работает по тому же принципу, что и IE 8 (раз эта фича была объявлена для обоих браузеров в одном предложении ранее). Поэтому вкратце расскажу как это происходит в гугловом браузере.
&lt;/p&gt;
&lt;p&gt;
Chrome создает три типа процессов:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Браузер. &lt;/strong&gt;Существует только один процесс браузера, который управляет закладками, окнами и &amp;quot;хромированием&amp;quot; внешнего вида. Этот процесс также ответственен за операции с диском, сетью, пользовательским вводом.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Отрисовщик (Renderer).&lt;/strong&gt; Прости господи меня за такой перевод, но этот тип процессов действительно отвечает за обработку HTML, Javascript, CSS, картинок и много чего еще.&amp;nbsp; Причем эти процессы не имеют доступа ни к вашему диску, ни к сетевым ресурсам. Все взаимодействия с пользователем, а также отрисовка на дисплее лежит на процессе типа Браузер. Такое разделение на процессы позволяет сразу убивать подозрительные процессы, которые могли быть подвержены различного рода атакам.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Плагины.&lt;/strong&gt; Процесс браузера также создает по одному процессу для каждого типа плагина: Flash, Quicktime, Adobe Reader и тп. 
&lt;/p&gt;
&lt;p&gt;
Все эти процессы можно увидеть в собственном Chrome Task Managar&amp;#39;e:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_8.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_3.png" border="0" alt="image" width="244" height="136" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Как только Chrome создал процесс типа Браузер, он начинает создавать по одному процессу типа Отрисовщик для каждого веб-сайта, который вы посещаете. Но тут тоже не все так просто, как кажется на первый взгляд. Ведь создавать такое количество процессов было бы весьма расточительно, учитывая то, что создание процесса это весьма трудоемкая и ресурсоемкая операция. Поэтому, если вы открываете новую закладку используюя JavaScript, или если вы открываете страницу с того же сайта, но в новой закладке, то эти закладки будут находиться в одном процессе (типа Отрисовщик). Это позволяет этим страницам на разных вкладках общаться посредством JavaScript и разделять общие закэшированные объекты. Но даже при таком подходе в группировке вкладок в процессы, существует риск создать слишком много процессов и &amp;quot;повесить&amp;quot; систему. Поэтому разработчики ввели ограничение на количество процессов, это число зависит от ресурсов вашей машины, но в среднем оно не превышает 20.
&lt;/p&gt;
&lt;p&gt;
Процессы типа Плагин создаются сразу как только вы открыли страницу, нуждающуюся в этом плагине. И убивает этот процесс, вскоре после того как вы закрыли последнюю страницу, использующую этот плагин.
&lt;/p&gt;
&lt;p&gt;
Мда...хотел написать обзорный пост о презентации, а получился обзорный пост о распределении закладок по процессам в браузерах... Ладно, не буду превращать этот пост в руководство по написанию эффективных веб приложений. Дам лишь ссылки на &lt;a rel="nofollow" href="http://www.youtube.com/watch?v=13-3VMzfU3Y" target="_blank"&gt;видео презентации&lt;/a&gt; и ее &lt;a rel="nofollow" href="http://www.slideshare.net/jeresig/performance-improvements-in-browsers-presentation" target="_blank"&gt;слайды&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Остальные интересности и вкусности этой презентации я постараюсь осветить в ближайшем светлом будущем.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Полезные ссылки&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx" target="_blank"&gt;IE8 and Loosely-Coupled IE (LCIE)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ie/archive/2008/07/28/ie8-and-reliability.aspx" target="_blank"&gt;IE8 and Reliability&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ieru/archive/2008/10/14/ie8.aspx" target="_blank"&gt;Группировка вкладок в IE8&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blog.chromium.org/2008/09/multi-process-architecture.html" target="_blank"&gt;Multi-process Chrome Architecture&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/-tpi4jXm240" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/-tpi4jXm240/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/10/browser-performance-improvement.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</guid>
      <pubDate>Tue, 10 Feb 2009 09:01:00 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/10/browser-performance-improvement.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=83a7edc4-b5e7-4c81-a634-54e84f9aa936</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</feedburner:origLink></item>
    <item>
      <title>NHaml. Что это такое и с чем его едят.</title>
      <description>&lt;p&gt;&lt;strong&gt;NHaml&lt;/strong&gt; это .NET реализация популярного &lt;a href="http://rubyonrails.com/" target="_blank" rel="nofollow"&gt;Rails Haml&lt;/a&gt;. Поэтому, сначала давайте попробуем понять что такое &lt;a href="http://ru.wikipedia.org/wiki/Haml" target="_blank" rel="nofollow"&gt;Haml&lt;/a&gt;. Расшифровывается он как &lt;strong&gt;XHTML Abstraction Markup Language&lt;/strong&gt;, то есть это язык разметки для упрощёной генерации &lt;a href="http://ru.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt;. В нашем арсенале уже имеются средства для достижения подобных целей: XSLT, ASP.NET Web Forms или даже лучше ASP.NET MVC и др. NHaml предоставляет альтернативный способ построения разметки ваших страниц, причем если сам XHTML весьма многословный язык, то NHaml пронизан духом лаконичности. Сокращения, ключевые слова, обозначение блоков — все направлено на сокращение объема кода при максимальном сохранении его ясности. Давайте рассмотрим следующий кусок кода:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;ASP.NET MVC (винегрет из кода и html)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeBehind="List.aspx" Inherits="MvcApplication5.Views.Products.List" Title="Products" %&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Content&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"MainContentPlaceHolder"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= ViewData.CategoryName &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; foreach (var product in ViewData.Products) { &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= product.ProductName &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"editlink"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;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; (&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink("Add New Product", new { Action="New" }) &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Эту же разметку (причем сохранив логику ее построения) можно написать и так:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;NHaml&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%h2= ViewData.CategoryName
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%ul
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  - &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var product &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; ViewData.Products)
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    %li
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      = product.ProductName 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      .editlink
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;        = Html.ActionLink("&lt;span style="color: #8b0000"&gt;Edit&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { Action="&lt;span style="color: #8b0000"&gt;Edit&lt;/span&gt;", ID=product.ProductID })
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;= Html.ActionLink("&lt;span style="color: #8b0000"&gt;Add New Product&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { Action="&lt;span style="color: #8b0000"&gt;New&lt;/span&gt;" })&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Как видите, количество кода несколько уменьшилось. Но тут не все так просто. Во-первых, блоки в NHaml обозначаются с помощью отступов, аналогично Python. Т.е. следующий фрагмент кода&lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%one
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    %two
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      %three Hey there&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;преобразуется в &lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;one&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;two&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;three&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Hey there&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;three&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;two&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;one&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Можно по-разному относиться к Python’овскому стилю обозначения блоков, но нельзя не признать, что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML. Во-вторых, первый символ (не считая отсупов) может описывать способ обработки этой строки. К примеру, символ &lt;strong&gt;"%" &lt;/strong&gt;указывает на то, что это XHTML тег. Эти директивы называются &lt;strong&gt;правилами разметки&lt;/strong&gt; и почти совпадают с &lt;a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html" target="_blank" rel="nofollow"&gt;подобными правилами&lt;/a&gt; в родном Haml. Радует и то, что практически все директивы состоят из одного символа (%, =, -, ., #) и во многом похожи(по назначению) на аналогичные CSS директивы, что упрощает освоение языка. А любители верстки div-ами могут наслаждаться тем, что div является тегом по умолчанию, например #header и %div#header - одно и тоже.&lt;/p&gt;
&lt;p&gt;Практически на всех веб-проектах от четверти до половины строк кода приходится на HTML-код. Даже с учетом того, что HTML писать проще, чем программный код, можно предположить, что до трети времени будет уходить на создание и отладку шаблонов. Следовательно, за счет использования качественного языка генерации HTML можно выиграть немало времени. В некоторых проектах созданием HTML-кода занимаются отдельные люди, работающие на стыке программирования и веб-дизайна. Для них потенциальный выигрыш будет еще выше. 
&lt;p&gt;Таким образом, проблема продуктивного создания &lt;strong&gt;HTML-кода&lt;/strong&gt; является одной из ключевых проблем повышения продуктивности веб-разработки вообще. Не уверен, что NHaml сейчас имеет смысл использовать в коммерческих проектах, так как это еще молодая технология (родилась она где-то в 2007 году). И, как свойственно молодым технологиям (тому же Silverlight), Nhaml довольно радикально меняется от версии к версии. Но, тем не менее, я полагаю, что существует четкая тенденция развития языков разметки в сторону упрощения чтения и редактирования человеком. И хотя, предсказание будущего — штука неблагодарная, особенно в области высоких технологий, осмелюсь сделать ставку на эту (или весьма похожую) технологию построения разметки страниц. 
&lt;p&gt;&lt;strong&gt;Полезные ссылки&lt;/strong&gt; 
&lt;p&gt;&lt;a href="http://weblogs.asp.net/mirvodasergey/archive/2008/06/02/introducing-monorail-nhaml.aspx" target="_blank" rel="nofollow"&gt;Introducing MonoRail NHAML&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.brianhartsock.com/2009/01/15/using-nhaml-from-source/" target="_blank" rel="nofollow"&gt;Using NHaml, from Source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-35-use-the-nhaml-view-engine.aspx" target="_blank" rel="nofollow"&gt;Use the NHaml View Engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://andrewpeters.net/" target="_blank" rel="nofollow"&gt;Блог одного из разработчиков этой технологии&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/muG3zI9vD6U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/muG3zI9vD6U/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/08/Nhaml-introduction.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</guid>
      <pubDate>Sun, 08 Feb 2009 23:17:17 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/08/Nhaml-introduction.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</feedburner:origLink></item>
    <item>
      <title>Как отключить JQuery анимацию одним ударом</title>
      <description>&lt;p&gt;
Вчера набрел на настройку &lt;strong&gt;jQuery.fx.off&lt;/strong&gt; в соотв. &lt;a rel="nofollow" href="http://docs.jquery.com/Effects/jQuery.fx.off" target="_blank"&gt;документации&lt;/a&gt;. Эта штука позволяет отключить любую анимацию jQuery на всей странице. Выглядит это примерно так:
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5822b95a-ab1d-45f8-9884-d0925a0a82f7" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;span style="color: #000000"&gt;jQuery.fx.off &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;
$(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;input&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;(){&lt;br /&gt;
$(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;div&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).toggle(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;slow&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;
}); &lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
После нажатия на кнопочку, ваш div появиться/спрячется незамедлительно, без какой либо анимации.
&lt;/p&gt;
&lt;p&gt;
Понадобиться этот ловкий прием может, если вы имеете дело с &amp;quot;тормознутым&amp;quot; клиентом. И ваша страница вместо анимаций показывает слайд-шоу.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/3XjErPjS7g8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/3XjErPjS7g8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/06/d09ad0b0d0ba-d0bed182d0bad0bbd18ed187d0b8d182d18c-JQuery-d0b0d0bdd0b8d0bcd0b0d186d0b8d18e-d0bed0b4d0bdd0b8d0bc-d183d0b4d0b0d180d0bed0bc.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</guid>
      <pubDate>Fri, 06 Feb 2009 09:04:00 +0300</pubDate>
      <category>JQuery</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=f0822750-4efd-4fda-8841-703199bbf627</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/06/d09ad0b0d0ba-d0bed182d0bad0bbd18ed187d0b8d182d18c-JQuery-d0b0d0bdd0b8d0bcd0b0d186d0b8d18e-d0bed0b4d0bdd0b8d0bc-d183d0b4d0b0d180d0bed0bc.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=f0822750-4efd-4fda-8841-703199bbf627</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</feedburner:origLink></item>
    <item>
      <title>Как не забыть об console.log?</title>
      <description>&lt;p&gt;
Одной из моих излюбленных фич в Firebug является &lt;strong&gt;console.log&lt;/strong&gt;. Полагаю, у меня есть единомышленники. И мы (я и мои единомышленники) часто забываем в коде, на продакшин серверах, наши излюбленные console.log. А пользователи, не поставившие себе Firebug, лицезреют некоторые Javascript ошибки... Решением данной проблемы могут быть либо таблетки от склероза (если такие уже придумали) или &lt;strong&gt;иммитация console объектов и методов&lt;/strong&gt;. Выглядит это примерно следующим образом:
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f6332ecc-eb16-4abe-8471-d824c7ac8b45" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;window.console &lt;/span&gt;&lt;span style="color: #000000"&gt;||&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;console.firebug)
{
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&lt;span style="color: #000000"&gt; names &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;log&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;debug&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;info&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;warn&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;error&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;assert&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;dirxml&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,
&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;group&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;groupEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;timeEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;count&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;trace&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;profile&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;profileEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;];
window.console &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; {};
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; i &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt; names.length; &lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;i)
window.console[names[i]] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;() {}
}&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
Этот код можно смело копировать в ваши javacript библиотеки и просто куски кода. Также можно просто сослаться на
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:66d03669-3b3b-4cbf-8727-190f819eb2d1" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000"&gt; graceful degradation of firebugs console obj &lt;/span&gt;&lt;span style="color: #008000"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; src&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.getfirebug.com/firebug/firebugx.js&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
После чего можно смело писать так
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c4c0df6a-a092-4905-b6a1-d39fdcc307b0" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--&gt;&lt;span style="color: #000000"&gt;console.error(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;an error&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;); 
console.warn(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;a warning&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;);  &lt;/span&gt;&amp;nbsp;&lt;br /&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
Или даже так:
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d5e0d543-bcd7-4b37-bb77-1623d6ac6eac" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--&gt;&lt;span style="color: #000000"&gt;console.dir({thanks:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;, reading:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;that&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;, cool:&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;(){ alert(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;being cool&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color: #000000"&gt;); }});  &lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
P.S. 
&lt;/p&gt;
&lt;p&gt;
И все же, если кто-то знает, где можно купить таблетки от склероза - прошу в комментарии.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Полезные ссылки&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://getfirebug.com/console.html" target="_blank"&gt;http://getfirebug.com/console.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://code.google.com/support/bin/answer.py?answer=94630" target="_blank"&gt;Google Code - Fun with Firebug&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/mCrC6yxq6KU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/mCrC6yxq6KU/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/05/d09ad0b0d0ba-d0bdd0b5-d0b7d0b0d0b1d18bd182d18c-d0bed0b1-consolelog.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=0bdb05b6-432a-4443-a22d-05bfc5b18ec2</guid>
      <pubDate>Thu, 05 Feb 2009 16:05:00 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=0bdb05b6-432a-4443-a22d-05bfc5b18ec2</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=0bdb05b6-432a-4443-a22d-05bfc5b18ec2</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/05/d09ad0b0d0ba-d0bdd0b5-d0b7d0b0d0b1d18bd182d18c-d0bed0b1-consolelog.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=0bdb05b6-432a-4443-a22d-05bfc5b18ec2</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=0bdb05b6-432a-4443-a22d-05bfc5b18ec2</feedburner:origLink></item>
    <item>
      <title>Дорогие мои подписчики...</title>
      <description>&lt;p&gt;
Прошу прощения, что так долго не писал. Пока нахожусь в творческом запое. Как выйду - обязательно продолжу &amp;quot;умничать&amp;quot; и &amp;quot;вредничать&amp;quot; на просторах своего блога.
&lt;/p&gt;
&lt;img src="http://www.podlipensky.com/image.axd?picture=2009%2f1%2fff84_holidayfreelance20081.jpg" alt="" /&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/NTXkBsPVO4w" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/NTXkBsPVO4w/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/01/20/d094d0bed180d0bed0b3d0b8d0b5-d0bcd0bed0b8-d0bfd0bed0b4d0bfd0b8d181d187d0b8d0bad0b8.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=237190f2-7012-456f-b995-7db131c6ce70</guid>
      <pubDate>Tue, 20 Jan 2009 16:26:00 +0300</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=237190f2-7012-456f-b995-7db131c6ce70</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=237190f2-7012-456f-b995-7db131c6ce70</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/01/20/d094d0bed180d0bed0b3d0b8d0b5-d0bcd0bed0b8-d0bfd0bed0b4d0bfd0b8d181d187d0b8d0bad0b8.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=237190f2-7012-456f-b995-7db131c6ce70</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=237190f2-7012-456f-b995-7db131c6ce70</feedburner:origLink></item>
    <item>
      <title>Убей Javascript - спаси Киловатт</title>
      <description>&lt;p&gt;
Не знаю, то ли под влиянием финансового кризиса, то ли из-за нехватки керосина для своих компьютеров, но амеры &lt;a rel="nofollow" href="http://www.sectheory.com/browser-power-consumption.htm" target="_blank"&gt;посчитали&lt;/a&gt; сколько электроенергии уходит на просмотр веб-страниц. Причем калькулировали с учетом браузеров и технологий, используемых на странице. В среднем просмотр одной страницы без Flash, Javascript и Silverlight обходиться ближайшей электростанции в .382 Ампер (45.076 Ватт). А вот какое безобразие твориться, если смотреть полноценные страницы с рекламой и всякими финтифлюшками:
&lt;/p&gt;
&lt;p&gt;
&lt;table border="1" align="center"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td align="center"&gt;&lt;strong&gt;Browser&lt;/strong&gt;&lt;/td&gt;
			&lt;td align="center"&gt;&lt;strong&gt;Amperage&lt;/strong&gt;&lt;/td&gt;
			&lt;td align="center"&gt;&lt;strong&gt;Watts&lt;/strong&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Average across entire Alexa 100 in Internet Explorer 7.0&lt;/td&gt;
			&lt;td&gt;0.414&lt;/td&gt;
			&lt;td&gt;48.852&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Average across entire Alexa 100 in Firefox 3.0.4&lt;/td&gt;
			&lt;td&gt;0.406&lt;/td&gt;
			&lt;td&gt;47.908&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Average for top 10 power abusers in Internet Explorer 7.0&lt;/td&gt;
			&lt;td&gt;0.474&lt;/td&gt;
			&lt;td&gt;55.932&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Average for top 10 power abusers in Firefox 3.0.4&lt;/td&gt;
			&lt;td&gt;0.481&lt;/td&gt;
			&lt;td&gt;56.758&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Average for top 10 power abusers in Firefox 3.0.4 with NoScript and Adblock Plus&lt;/td&gt;
			&lt;td&gt;0.382&lt;/td&gt;
			&lt;td&gt;45.076&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Также было подсчитано, что на сэкономленные фаерфоксом(за счет отключенного JavaScript и Flash) &lt;strong&gt;0,1 Ампер и почти 11 Ватт&lt;/strong&gt;, можно зажечь флюоресцентную лампочку!
&lt;/p&gt;
&lt;p&gt;
Отключайте баннеры, экономьте электроенергию и кризис пройдет для вас незамеченным. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/gzCrApfgG-g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/gzCrApfgG-g/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2008/12/30/d0a3d0b1d0b5d0b8-Javascript-d181d0bfd0b0d181d0b8-d09ad0b8d0bbd0bed0b2d0b0d182d182.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=0ff1b5c5-32ab-497e-a963-184fc9de1ba8</guid>
      <pubDate>Tue, 30 Dec 2008 09:12:00 +0300</pubDate>
      <category>В мире</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=0ff1b5c5-32ab-497e-a963-184fc9de1ba8</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=0ff1b5c5-32ab-497e-a963-184fc9de1ba8</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2008/12/30/d0a3d0b1d0b5d0b8-Javascript-d181d0bfd0b0d181d0b8-d09ad0b8d0bbd0bed0b2d0b0d182d182.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=0ff1b5c5-32ab-497e-a963-184fc9de1ba8</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=0ff1b5c5-32ab-497e-a963-184fc9de1ba8</feedburner:origLink></item>
    <item>
      <title>Скаженi кабани: GridView vs Response.Write</title>
      <description>&lt;p&gt;
Разработка веб-сайтов, впрочем как и любых других софтверных строений, всегда стояла на распутьи трех дорог: скорость разработки, качество продукта и производительность веб-сайта. И именно на последнее и пожаловался недавно наш заказчик...
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;Что-то случилось...&lt;/strong&gt;
&lt;/p&gt;
  
&lt;p&gt;
... понял я, когда в час ночи зазвонил мой телефон. Сквозь сон я выслушал все новогодние &amp;quot;пожелания&amp;quot; заказчика и краткое описание проблемы - &amp;quot;Страница медленно работает&amp;quot;. Затем пока нашел штаны, пока нашел где у меня ноги, пока оделся и, спустя часы, я оказался на работе. Нагрузочное (или даже стресc-тестирование) показало, что страница действительно забирает 90% процессорного времени при больших объемах данных на ней. После небольшого разбирательства выяснилось, что показания &lt;strong&gt;%Time in GC&lt;/strong&gt; счетчика производительности &lt;a rel="nofollow" href="http://blogs.msdn.com/maoni/archive/2004/06/03/148029.aspx"&gt;меньше оптимальных&lt;/a&gt;. После чего наш консилиум заключил, что приложение нерационально использует оперативную память сервера.
&lt;/p&gt;
  
&lt;p&gt;
MSDN &lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms998579.aspx"&gt;говорит&lt;/a&gt;: 
&lt;/p&gt;
  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	&lt;em&gt;.NET CLR Memory\% Time in GC&lt;/em&gt;
	&lt;/p&gt;
	    
	&lt;p&gt;
	Threshold: This counter should average about 5 percent for most applications when the CPU is 70 percent busy, with occasional peaks. As the CPU load increases, so does the percentage of time spent performing garbage collection. Keep this in mind when you measure the CPU. 
	&lt;/p&gt;
	    
	&lt;p&gt;
	Significance: This counter indicates the percentage of elapsed time spent performing a garbage collection since the last garbage collection cycle. The most common cause of a high value is making too many allocations, which may be the case if you are allocating on a per-request basis for ASP.NET applications. You need to study the allocation profile for your application if this counter shows a higher value. 
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;p&gt;
За этим последовал небольшой &lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms998574.aspx"&gt;code review&lt;/a&gt;, во время которого выяснилось, что приложение создает дофига коллекций. Коллекции использовались для переноса данных из BLL в Presentation Layer, и последующей конвертации их в DataTable (для байндига в GridView). Таким образом мы создали три анти-паттерна производительности (во завернул-то!): храним много данных в памяти, создаем большое количество циклов и конвертаций типов.
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;Пути решения&lt;/strong&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Байндить коллекции сразу GridView, без конвертации в DataTable &lt;/li&gt;    
	&lt;li&gt;Создавать DataTable сразу из XML файла, минуя коллекции во избежания больших циклов&amp;nbsp; и конвертации типов &lt;/li&gt;    
	&lt;li&gt;Использовать XSLT для трансофрмации XML в HTML таблицу (нафиг тогда вообще ASP.NET?) &lt;/li&gt;    
	&lt;li&gt;Использовать Response.Write(), как это &lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms998549.aspx"&gt;предлагает сделать Майкрософт&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Решили попробовать последнее.
&lt;/p&gt;
  
&lt;p&gt;
В результате получили следующее:
&lt;/p&gt;
  
&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;
	&lt;tbody&gt;
		     
		&lt;tr&gt;
			       
			&lt;td width="200" valign="top"&gt;GridView&lt;/td&gt;        
			&lt;td width="200" valign="top"&gt;Response.Write()&lt;/td&gt;     
		&lt;/tr&gt;
		      
		&lt;tr&gt;
			       
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/iGridViewvsResponse.Write_135D4/image_2_2.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/iGridViewvsResponse.Write_135D4/image_2_thumb.png" border="0" alt="image_2" width="148" height="244" /&gt;&lt;/a&gt; &lt;/td&gt;        
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/iGridViewvsResponse.Write_135D4/image_8_2.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/iGridViewvsResponse.Write_135D4/image_8_thumb.png" border="0" alt="image_8" width="194" height="244" /&gt;&lt;/a&gt; &lt;/td&gt;     
		&lt;/tr&gt;
		   
	&lt;/tbody&gt;
&lt;/table&gt;
  
&lt;p&gt;
Интересные результаты, неправда ли? И хотя мы выиграли в производительности мы проиграли как минимум в удобстве и безопасности: GridView не просто рендерит таблицу, а и реализует некий функционал для управления и взаимодействия с данными в ней. А также делает проверки на cross-site scripting и другие виды атак. Так, что настаивать на Response.Write не буду. Решение использовать зависит от конкретной ситуации и пожеланий вашего заказчика.
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;Полезные ссылки&lt;/strong&gt;
&lt;/p&gt;
  
&lt;p&gt;
&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms998549.aspx"&gt;Improving ASP.NET Performance&lt;/a&gt;
&lt;/p&gt;
  
&lt;p&gt;
&lt;a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms998579.aspx"&gt;Measuring .NET Application Performance&lt;/a&gt;
&lt;/p&gt;
  
&lt;p&gt;
&lt;a rel="nofollow" href="http://www.podlipensky.com/admin/Pages/Code%20Review:%20.NET%20Application%20Performance"&gt;Code Review: .NET Application Performance&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/K5nfreGNfro" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/K5nfreGNfro/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2008/12/29/d0a1d0bad0b0d0b6d0b5d0bdi-d0bad0b0d0b1d0b0d0bdd0b8-GridView-vs-ResponseWrite.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=c72b29cd-2259-44a8-8302-52a881a05c17</guid>
      <pubDate>Mon, 29 Dec 2008 09:04:00 +0300</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=c72b29cd-2259-44a8-8302-52a881a05c17</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=c72b29cd-2259-44a8-8302-52a881a05c17</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2008/12/29/d0a1d0bad0b0d0b6d0b5d0bdi-d0bad0b0d0b1d0b0d0bdd0b8-GridView-vs-ResponseWrite.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=c72b29cd-2259-44a8-8302-52a881a05c17</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=c72b29cd-2259-44a8-8302-52a881a05c17</feedburner:origLink></item>
  </channel>
</rss>
