<?xml version="1.0" encoding="windows-1251"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WEB Optimizator</title><description>Статьи и переводы по оптимизации скорости загрузки сайта</description><image><url>http://i.webo.in/x.png</url><title>Web Optimizator</title><link>http://webo.in/speed/</link></image><link>http://webo.in/</link><lastBuildDate>Sun, 13 Feb 2011 07:50:27 GMT</lastBuildDate><generator>FeedCreator by DreamwinD</generator><language>ru</language><webMaster>info@webo.name (WEBO Software)</webMaster><copyright>Copyright 2008-2011, WEBO Software</copyright><ttl>240</ttl><item><title>Конкурс SalesJump от InSales: финал</title><link>http://webo.in/articles/all/2010/10-salesjump-insales-final/</link><guid>http://webo.in/articles/all/2010/10-salesjump-insales-final/</guid><description>&lt;blockquote&gt;&lt;p&gt;19 ноября состоялась церемония награждения конкурса SalesJump, который проводился среди начинающих интернет-магазинов. Церемония подводила итоги четырехмесячной битвы за звание самого лучшего интернет-магазина.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;15 июля конкурсу был дан старт. Принять участие мог любой магазин, созданный не ранее 1 июня 2010 года. Магазин также мог представлять собой копию уже существующего интернет-магазина, но на новом домене. Прием заявок продолжался до 15 сентября, и за это время свыше 200 проектов изъявили желание побороться за призовой фонд, который превысил изначально заявленный миллион рублей почти на двести тысяч. К участию, однако, были допущены 148 проектов, соответствовавших всем критериям жюри. На время проведения конкурса всем участникам для работы была бесплатно предоставлена платформа InSales.&lt;/p&gt;&lt;p&gt;Поскольку многие только начинали свой путь в интернет-торговле, организаторы конкурса решили провести для участников серию мастер-классов, осветивших основные вопросы, с которыми сталкивается предприниматель, занимающийся организацией интернет-магазина.&lt;/p&gt;&lt;p&gt;В начале сентября было проведено 4 мастер-класса по следующим темам:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Бизнес-планирование, юридическое оформление, бухгалтерские вопросы.&lt;/li&gt;&lt;li&gt;Дизайн, навигация, удобство использования вашего магазина.&lt;/li&gt;&lt;li&gt;Продвижение.&lt;/li&gt;&lt;li&gt;Организация логистики, работа с поставщиками.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Кроме того, было проведено 2 онлайн-семинара, в ходе которых можно было получить ответы на интересующие вопросы, связанные как с использованием платформы InSales, так и с тонкостями продажи товаров через интернет.&lt;/p&gt;&lt;p&gt;С 20 сентября по 10 октября участники вели усиленную работу по подготовке магазина к финалу, ведь пройти туда должно было всего 35 магазинов. И 17 октября на сайте конкурса появился список счастливчиков, которые прошли в финал. Отбирались проекты, создавшие сайт, наполнившие каталог, зарегистрировавшие юридическое лицо или ИП и организовавшие доставку заказываемых товаров &amp;mdash; т.е. создавшие полноценно работающий интернет-магазин. Именно они начали борьбу за основной призовой фонд. Компания InSales при поддержке компаний Yagoodza, Price.ru, Subscribe.Ru, WEBO Software, Livecontact, Nextore, 3D Bank, Unisender, МойСклад и Aviso SMS собрала беспрецедентный призовой фонд в виде программного обеспечения, услуг и рекламных бюджетов на сумму 1 193 320 рублей, который и был разыгран среди финалистов.&lt;/p&gt;&lt;p&gt;4 основные номинации конкурса SalesJump:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;«Стремительный Бизнес». В рамках номинации были отобраны лидеры по обороту, числу заказов и посещаемости.&lt;/li&gt;&lt;li&gt;«Выбор покупателей». Для участия в номинации были отобраны магазины с наибольшим числом заказов и самой большой конверсией.&lt;/li&gt;&lt;li&gt;«Удобный магазин». В данной номинации победитель определялся Жюри в ходе голосования по основному критерию: общая жизнеспособность магазина по мнению жюри.&lt;/li&gt;&lt;li&gt;«Выбор пользователей». В данной номинации голосование осуществлялось пользователями интернета на сайте конкурса.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Также были специальные номинации:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;«Выбор журнала «Свой бизнес». Победитель выбирался редакцией журнала среди 12 номинантов по основным 4-м номинациям.&lt;/li&gt;&lt;li&gt;«Выбор сервиса 3D Bank». Победитель выбирался представителями сервиса 3D bank.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;На сайте конкурса за финалистов было отдано 1526 голосов.&lt;/p&gt;&lt;p&gt;В итоге победителями стали следующие проекты.&lt;/p&gt;&lt;h3&gt;В номинации «Выбор пользователей»:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://mrjones.ru/" rel="nofollow"&gt;MrJones.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://made4me.ru/" rel="nofollow"&gt;Made4Me.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://victorinoxshop.ru/" rel="nofollow"&gt;VictorinoxShop.ru&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;В номинации «Удобный магазин»:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://victorinoxshop.ru/" rel="nofollow"&gt;VictorinoxShop.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://made4me.ru/" rel="nofollow"&gt;Made4Me.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bazar.fergaba.ru/" rel="nofollow"&gt;Bazar.Fergana.ru&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;В номинации «Стремительный бизнес»:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://sushivenik.ru/" rel="nofollow"&gt;SushiVenik.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://shop.bukashi.ru/" rel="nofollow"&gt;Shop.Bookashki.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://roycan.ru/" rel="nofollow"&gt;RoyCan.ru&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;В номинации «Выбор покупателей»:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://shop.bukashki.ru/" rel="nofollow"&gt;Shop.Bookashki.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://roycan.ru/" rel="nofollow"&gt;RoyCan.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dsk-karusel.ru/" rel="nofollow"&gt;DSK-karusel.ru&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Что касается специальных призов, то журнал «Свой бизнес» в январском номере опубликует полосу о магазине &lt;a href="http://bazar.fergana.ru/" rel="nofollow"&gt;Bazar.Fergana.ru&lt;/a&gt;, сервис Price.ru подарил пакет кликовых объявлений «Антикризисный» проекту &lt;a href="http://sushivenik.ru/" rel="nofollow"&gt;SushiVenik.ru&lt;/a&gt;, а сервис 3D bank создаст 3-д витрину товаров интернет-магазину &lt;a href="http://niirobot.ru/" rel="nofollow"&gt;niirobot.ru&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Все победители получили тарифный план «Бизнес» на 1 год от компании InSales, оптимизацию скорости работы сайта интернет-магазина от WEBO Software, 1 год использования сервиса «МойСклад» по тарифу «Профессиональный», 1 год использования чата с покупателями на сайте интернет-магазина от LiveContact, 8 часов рекомендаций и консалтинга по общему развитию интернет магазина от Nextore, тарифный план «Часто 5.000» от компании UniSender на 3 месяца, 1 год оплаченного продвижения по тарифному плану «Улучшенный» от площадки Yagoodza, базовое размещение на Price.Ru, рекламный бюджет от Subscribe.ru и пакет смс-сообщений от Aviso SMS.&lt;/p&gt;&lt;p&gt;Номинанты, занявшие вторые места, также получили подарок от сервиса «МойСклад» &amp;mdash; 6 месяцев использования сервиса по тарифному плану «Базовый». Кроме того, им также были вручены 1 год использования чата с покупателями на сайте интернет-магазина от LiveContact и подписка на полгода на журнал «Свой Бизнес».&lt;/p&gt;&lt;p&gt;Призеры, занявшие третьи места, получили 6 месяцев использования сервиса «МойСклад» по тарифному плану «Базовый», 1 год использования чата с покупателями на сайте интернет-магазина от LiveContact и книги от журнала «Свой бизнес».&lt;/p&gt;&lt;p&gt;Мы искренне надеемся, что наш конкурс станет ежегодным мероприятием, и в следующем году мы дадим старт еще как минимум 30 успешным проектам.&lt;/p&gt;&lt;p&gt;Подробнее о конкурсе SalesJump:&lt;br/&gt;&lt;a href="http://www.salesjump.ru/" rel="nofollow"&gt;www.salesjump.ru&lt;/a&gt;&lt;/p&gt;&lt;p class="X"&gt;&lt;/p&gt;
</description><pubDate>Sun, 28 Nov 2010 00:00:00 GMT</pubDate><comments>http://webo.in/articles/all/2010/10-salesjump-insales-final/</comments></item><item><title>Удобство и Время: когда лучшее - враг хорошего</title><link>http://webo.in/articles/ux2010/usability-time/</link><guid>http://webo.in/articles/ux2010/usability-time/</guid><description>&lt;h3&gt;Привычки работы с интерфейсами&lt;/h3&gt;&lt;p&gt;Что такое для нас удобство использования? Всегда ли это меньше кликов и переходов, меньше смен экранов, меньше полей для заполнения? Когда мы можем увеличить количество информации, которую предоставляем пользователям, и при этом удобство использования только увеличится? Всегда ли уменьшение числа действий пользователя означает уменьшение времени работы с интерфейсами? Или же мы должны уменьшить неопределенность на каждом этапе работы, сократив при этом общее количество операций со стороны пользователя?&lt;/p&gt;&lt;p&gt;На эти вопросы и часть других отвечает доклад, предоставляя конкретные сценарии и подходы при создании интерфейсов, направленные на ускорение работы с ними. Но для начала давайте рассмотрим, какие сейчас существуют стандарты в области комфортного времени работы с интерфейсами.&lt;/p&gt;&lt;p&gt;Порядка 2-10 секунд пользователь готов ждать появления интерфейса (или хотя бы его предвестника) на экране своего компьютера. При этом еще 5-30 секунд может уходить на ознакомление с ситуацией. Если время работы с программным продуктом превышает заявленные цифры, то уже стоит забить тревогу. Однако если при этом в интерфейсе есть какой-либо индикатор загрузки, то время его ожидания может быть еще несколько (десятков) секунд. При все этом пользователь привык к достаточно быстрого реагированию на свои действия: уже после 0,2с уже будет возникать тревога, все ли в порядке с продуктом.&lt;/p&gt;&lt;p&gt;Из всего вышесказанного следует некоторое количество сценариев организации работы с интерфейсами.&lt;/p&gt;&lt;h3&gt;Сценарий 1: ускоряем ожидание&lt;/h3&gt;&lt;p&gt;В случае сложного интерфейса (многосоставного), время ожидания которого сложно регулировать для всех пользователей, можно использовать следующую схему работы.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;При первой загрузке приложения показываем ознакомительный промо-экран. Пока пользователь читает специальную информацию, вводящую его в курс дела, продукт может загрузить еще некоторое количество информации. Время реакции на промо-экран: 2-10 секунд.&lt;/li&gt;&lt;li&gt;После промо-экрана мы можем отобразить некоторый базовый интерфейс продукта, в котором большая часть информации уже доступна. Но есть индикаторы загрузки на месте блоков, требующих значительное количество серверных ресурсов. Пользователь готов подождать еще несколько секунд до появления полностью функционального интерфейса.&lt;/li&gt;&lt;li&gt;Наконец после 5-20 секунд перед пользователем оказывается полностью готовый к работе продукт (и у пользователя не остается ощущения того, что продукт &amp;laquo;тормозит&amp;raquo;). При этом повторная загрузка может быть значительно ускорена за счет кэширования.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Сценарий 2: информируем пользователя&lt;/h3&gt;&lt;p&gt;Во-первых, если пользователь привык получать обратную связь от продукта через 0,2с после своих действий, то нужно это обратную связь обеспечить! Т.е. отображать произвольный индикатор загрузки при обработке пользовательких данных и смене экрана. Однако если обработка данных происходит быстрее, то лишний раз индикатор лучше не показывать (не мелькать им). Поэтому стоит сделать переключать для отображения индикатора только в том случае, если ожидание продолжается больше 0,2с.&lt;/p&gt;&lt;p&gt;Очень часто интерфейс для пользователя не понятен (много новы понятий и терминов). Но отделить &amp;laquo;продвинутого&amp;raquo; пользователя от &amp;laquo;обычного&amp;raquo; нет никакой возможности. Именно с этой целью (научить новых и не раздражать старых) вводятся подсказки, которые появляются в специально отведенных местах (знак вопроса рядом с каждым термином). Это распространенная практика экономит время пользователей и снижает время ознакомления (за счет обучения) и работы (за счет минимизации обучающих элементов) с интерфейсом.&lt;/p&gt;&lt;p&gt;В том случае, когда необходимо разбить интерфейс на несколько последовательных шагов (экранов), то общее количество шагов обязательно должно быть выведено. Дополнительно каждый шаг стоит снабдить не только названием, но и кратким описанием или даже иллюстрацией (если шаг автоматический и не требует от пользователя никаких действий). В случае автоматических действий продукта, если требуется бездействие пользователя, то последнего обязательно нужно об этом проинформировать. Очень хорошо, если пользователя удастся развлечь, и время ожидания для него пройдет незаметно.&lt;/p&gt;&lt;p&gt;Если от пользователя требуется заполнить какую-то большую форму, то ее стоит разбить на несколько шагов таким образом, чтобы время работы с каждым шагом составляло 20-40 секунд. Это позволит обеспечить должную интерактивность, не раздражая пользователя частой сменой. В любом случае, после каждого внедрения или реорганизации интерфейса нужно проводить юзабилити-тестирование для оценки результатов.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sun, 10 Oct 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/ui_design_and_usability/105862/#comments</comments></item><item><title>Насколько открыт Open Source</title><link>http://webo.in/articles/add2010/open-source/</link><guid>http://webo.in/articles/add2010/open-source/</guid><description>&lt;p&gt;Очень часто мы слышим вокруг, что использование Open Source кода &amp;mdash; это хорошо и правильно, это развивает ИТ-индустрию, это позволяет накапливать знания, а не тратить время разработчиков, создавая очередной &amp;laquo;велосипед&amp;raquo;. Но давайте разбираться, так ли дело обстоит на самом деле, какие трудности будут нас преследовать на пути распространения Open Source продуктов, и как их преодолеть.&lt;/p&gt;&lt;h3&gt;Задачи лицензирования&lt;/h3&gt;&lt;p&gt;Для чего разработчики выбирают Open Source? Во-первых, чтобы сделать продукт доступнее, понятнее для конечных пользователей (ведь тоже могут быть разработчиками, и им проще будет пользоваться продуктом, если они будут представлять основные принципы его работы). Во-вторых, для возможности внесения изменения в сам продукт (модификаций или улучшений). В-третьих, для возможности позволить эти изменения, добавленные сторонними разработчиками, внести в основной продукт без потери авторских и других прав. Тут надо сразу оговориться, что под Open Source продуктом понимается не свободное программное обеспечение (freeware), и не код, доступный публично, а опубликованный в общем доступе код с оговоренными правилами лицензирования.&lt;/p&gt;&lt;p&gt;Все права, оговориваемые Open Source лицензиями, можно условно разделить на авторское право (собственно, copyright), право на использование (выполнение) кода, право на демонстрацию или изучение (открытых исходные тексты продукта), право копирования, право внесения изменений в исходный код, право распространения (без или с изменениями) и право изменения лицензии или включения в свой продукт.&lt;/p&gt;&lt;h3&gt;Типы лицензий&lt;/h3&gt;&lt;p&gt;Если расположить градации лицензий по увеличению количества прав, первым будет закрытый код, который обычно сохраняет только авторское право, но очень часто право выполнения и демонстрации ограничено или является даже платным (как в случае с Windows).&lt;/p&gt;&lt;p&gt;Следующими, как ни странно, идут GPL и LGPL-лицензии. Исходный код, единожды открытый под GPL, уже не может быть закрыт (поскольку любой, кто его получил, может продолжить его распространение), лицензия не может быть изменена, и его использование является абсолютно свободным. Однако, при распространении необходимо прикладывать исходные коды продукта и саму лицензию.&lt;/p&gt;&lt;p&gt;Более свободным вариантом (также с необходимостью поставлять продукт вместе с исходными кодами) является семейство GPL-совместимых лицензий. Здесь авторы могут изменить лицензию исходного кода внутри группы без каких-либо нарушений.&lt;/p&gt;&lt;p&gt;Следующей градацией свободы является группа OSI-совместимых лицензий, внутри которой есть как GPL-совместимые, так и GPL-несовместимые. Миграция между этими двумя подгруппами запрещена, но GPL-несовместимых лицензий больше, и часть из них позволяет даже коммерческое использование продукта, полученного из имеющихся исходных кодов.&lt;/p&gt;&lt;p&gt;Наиболее свободным является открытый код (размещенный в так называемом &amp;laquo;публичном доступе&amp;raquo;, public domain). Но в этом случае код теряет авторское право (это противоречит российскому законодательству, поэтому в нашей стране такая практика не применима).&lt;/p&gt;&lt;h3&gt;Случаи использования&lt;/h3&gt;&lt;p&gt;Давайте рассмотрим несколько характерных случаев поведения при работы с Open Source лицензиями.&lt;/p&gt;&lt;h4&gt;Выбор лицензии&lt;/h4&gt;&lt;p&gt;К первоначальному выбору лицензии, под которой исходный код продукта будет открыт, &amp;mdash; это ответственный процесс. Хотя если продукт предполагается развивать очень активно, то в любой момент лицензию можно будет сменить (но это не будет распространяться на уже опубликованный код под другой лицензией).&lt;/p&gt;&lt;p&gt;Если мы собираемся существенно ограничить коммерческое использование продукта и максимально увеличить пользовательский охват, то лучше всего использовать GPL-лицензии. Они гарантируют, что все последующие модификации будут опубликованы также под GPL-лицензиями, и сам механизм лицензирования (ограничения) запретит какие-либо ограничения.&lt;/p&gt;&lt;p&gt;Если мы хотим сделать наш код максимально доступным для использования (в том числе, в коммерческих продуктах), то лучше всего выбрать GPL- или даже OSI-совместимую лицензию. При этом можно выбрать и двойное лицензирование (например, BSD + Apache лицензии).&lt;/p&gt;&lt;p&gt;Если же нам существенно, чтобы продукт мог быть использован только в коммерческих целях (т.е. нужно ограничить права его использования и распространения), то здесь выход один &amp;mdash; создание своей лицензии.&lt;/p&gt;&lt;h4&gt;Множественное лицензирование&lt;/h4&gt;&lt;p&gt;В том случае, если мы выбираем множественное лицензирование исходного кода (так поступают все наиболее коммерчески успешные проекты), то стоит разделить весь функционал продукта на ядро (общая часть продукта, связывающая его модули в единое целое) и модули (функционал продукта, который не может быть выполнен без ядра, но составляет существенную его часть). Затем определить набор модулей, которые будут опубликованы под OSI-совместимой лицензией (при этом можно выбирать и множественное лицензирование в этой области) и коммерческой лицензией. И в заголовок каждого файла исходного кода добавить, под какой лицензией он выложен.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;@licensed LGPL (LICENSE-LGPL.txt)
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/104931/#comments</comments></item><item><title>Web Performance: от идеи к стандарту</title><link>http://webo.in/articles/wsd2010/web-performance/</link><guid>http://webo.in/articles/wsd2010/web-performance/</guid><description>&lt;p&gt;Сейчас мы являемся свидетелями уникального явления: накопленный опыт, практики использования и проблемы веб-производительности обретают некоторую законченную форму в виде стандарта от W3C. Это стандарт Web Performance, над которым работает выделенная, &lt;a href="http://www.w3.org/2010/webperf/" rel="nofollow"&gt;недавно созданная группа&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Но начнем сначала.&lt;/p&gt;&lt;h3&gt;Вчера: немного истории&lt;/h3&gt;&lt;p&gt;На заре Интернета, в прошлом веке, проблемы производительности веб-сайтов не было, были проблемы медленного Интернет-соединения (потому что страницы начала века выглядят почти идеально с точки зрения текущих практик высокой производительности). Обычная страница представляла собой несколько (часто не больше 5) файлов, из которых текстовых файлов было 1-2. Лучшей практикой увеличения скорости загрузки было gzip-сжатие, но в силу слабой поддержки со стороны браузеров оно применялось редко.&lt;/p&gt;&lt;p&gt;Чуть позже, уже в нашем веке, с развитием технологий и стандартов, проблема &amp;laquo;медленных&amp;raquo; стала проявляться больше. На странице уже было несколько файлов стилей и скриптов, браузеры не умели эффективно их загружать, были разработаны все основные техники оптимизации, но до широкой общественности пока не дошли.&lt;/p&gt;&lt;p&gt;И на том фоне Yahoo! в 2007 году выкладывают свои советы по производительности и дополнение YSlow. Это было равносильно взрыву, о веб-производительности заговорили все. Появилась Net Panel в Firebug, появился Web Inspector в Safari в 2008 году, а в следующем году появился dynaTrace для IE и Speed Tracer.&lt;/p&gt;&lt;p&gt;На фоне этого бума летом 2010 года была образована отдельная группа W3C, занимающаяся разработкой соответствующих стандартов.&lt;/p&gt;&lt;h3&gt;Сегодня: получение данных&lt;/h3&gt;&lt;p&gt;Почему же возникла необходимость в создание такой группы? Ведь уже есть инструменты для анализа производительности и практики создания быстрых сайтов. Во-первых, сейчас достаточно сложно получить информации о производительности страницы &amp;laquo;в общем виде&amp;raquo;. Каждый из браузеров имеет собственное API (позволяющее через JavaScript получить доступ к C-данным), но экспорт всех значений кроссбраузерно очень сложен.&lt;/p&gt;&lt;p&gt;Во-вторых, доступный набор значений, которые тоже не так просто получить (ниже приведен пример получения времени &lt;code&gt;onLoad&lt;/code&gt;, наиболее простого из всех), крайне ограничен. Сказать по нему что-то конкретное о производительности сайта сложно.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;html&amp;gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/104542/#comments</comments></item><item><title>VML, SVG, Canvas: вперед в прошлое</title><link>http://webo.in/articles/wsd2009/vrml-vml-svg-canvas/</link><guid>http://webo.in/articles/wsd2009/vrml-vml-svg-canvas/</guid><description>&lt;h3&gt;Предыстория векторных форматов&lt;/h3&gt;&lt;p&gt;В 90х годах прошлого века было довольно много попыток внести ясность в описание и представление векторных данных в вебе. Началось это примерно в 1994-1995 годах, когда несколько независимых групп разрабатывают и предлагают сначала спецификацию, а затем и плагины к браузерам для &lt;a href="http://svf.org/svf1/" rel="nofollow"&gt;SVF (Simple Vector Format)&lt;/a&gt;, &lt;a href="http://www.w3.org/MarkUp/VRML/" rel="nofollow"&gt;VRML (Virtual Reality Markup Language)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Чуть позже, 19 августа 1998 года, была представлена альтернатива для CGM (Computer Graphic Metafile) &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-WebCGM-19980819/" rel="nofollow"&gt;Web CGM&lt;/a&gt;,&amp;nbsp;&amp;mdash; которая бы позволила расширить сферу примнения данного формата.&lt;/p&gt;&lt;p&gt;VRML оказался самым жизнеспособным из всех представленных аналогов (наверное, в силу поддержки в Netscape), и был сначала утвержден в рамках стандарта &lt;a href="http://www.web3d.org/x3d/specifications/vrml/VRML97Am1/" rel="nofollow"&gt;VRML97&lt;/a&gt;, а затем преобразован в &lt;a href="http://www.web3d.org/x3d/specifications/" rel="nofollow"&gt;X3D&lt;/a&gt; в 2004 году.&lt;/p&gt;&lt;h3&gt;VML / PGML: немного истории&lt;/h3&gt;&lt;p&gt;Sun / IBM / Adobe 10 апреля 1998 года выкатывают свое решение для представления данных в векторном формате в вебе &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-PGML-19980410" rel="nofollow"&gt;PGML&lt;/a&gt;. Microsoft тоже не дремлет и вместе с рядом крупных компаний предлагает буквально через месяц (13 мая) на &lt;a href="http://www.w3.org/TR/NOTE-VML" rel="nofollow"&gt;рассмотрение W3C альтернативное решение &amp;mdash; стандарт VML&lt;/a&gt;. Дальше Microsof гнет свою линию и включает поддержку VML уже в IE 5.0 (в &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer_5" rel="nofollow"&gt;марте 1999 года&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Очевидно, что технология, обладающая такой мощной поддержкой в браузерах того времени просто так не могла умереть (в отличие от PGML, которая, по-видимому, поддерживается только в настольных приложений тех компаний, которые его выдвинули). И &lt;a href="http://arstechnica.com/microsoft/news/2008/04/microsofts-office-open-xml-now-an-official-iso-standard.ars" rel="nofollow"&gt;в 2008 году VML окончательно закрепляется в качестве стандарта в составе Open Office XML&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: истоки&lt;/h3&gt;&lt;p&gt;История Canvas во многом отлична от упомянтых векторных стандартов. Во-первых, в 2005 году Apple предложила использовать &lt;a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/Canvas.html" rel="nofollow"&gt;уже вендренную ею технику Canvas&lt;/a&gt; для попиксельного изменения изображения внутри какой-то области (Canvas, холста). Эта идея была подхвачена Mozilla, которая интегрировала ее в Gecko 1.8 (Firefox 1.5 и выше), а позже и Opera (Opera 9.0 вышла с поддержкой Canvas).&lt;/p&gt;&lt;p&gt;Затем Canvas был включен в готовящийся стандарт Web Applications 1.0, который затем &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" rel="nofollow"&gt;вошел в состав HTML5&lt;/a&gt;. Планируется, что поддержка Canvas пойдет в следующую версию IE.&lt;/p&gt;&lt;h3&gt;VML + SVG: векторные форматы&lt;/h3&gt;&lt;p&gt;На настоящий момент SVG поддерживается всеми современными браузерами. Для IE необходимо использовать эмуляцию всех методов через VML (либо создавать альтернативное приложение).&lt;/p&gt;&lt;p&gt;Для описания SVG используется XML формат. При этом, естественно, возможны любые преобразования получившегося изображения при помощи DOM-методов (т.е. можно использовать любую JavaScript-логику &amp;laquo;поверх&amp;raquo; векторных форматов).&lt;/p&gt;&lt;p&gt;Спектр использования векторной графики сейчас довольно широк: это отображение масштабируемых объектов, областей на картах, вывод графиков. Стоит отметить, что в силу XML-природы SVG может быть легко интегрирован с другими форматами, в частности, сейчас идет его интеграция с MathML. Также можно назвать одно &amp;laquo;нестандартное&amp;raquo; применение VML &amp;mdash; для эмуляции полупрозрачности в PNG для IE. Для этого разработана специальная JavaScript-библиотека &amp;mdash; &lt;a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" rel="nofollow"&gt;DD_belatedPNG&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: растровые операции&lt;/h3&gt;&lt;p&gt;Основным отличием от SVG в Canvas является его чисто динамическая (можно использовать только при помощи JavaScript) и растровая (нет объектов и связе между ними) природа. Однако в некоторых случаях это только плюс (например, сложные области на картах было бы логичнее обводить при помощи растровой, а не векторной графики).&lt;/p&gt;&lt;p&gt;Для работоспособности в IE используется эмуляция с помощью VML.&lt;/p&gt;&lt;p&gt;Как и всякую популярную технологию, Canvas используют по поводу и без везде, где только можно. Например, для отображения в браузере произвольных шрифтов (поскольку корректная поддержка &lt;code&gt;@font-face&lt;/code&gt; несколько запаздывает): &lt;a href="http://typeface.neocracy.org/" rel="nofollow"&gt;typeface.js&lt;/a&gt; (к слову есть более правильное с идеологической точки зрения решение данной проблемы - &lt;a href="http://cufon.shoqolate.com/generate/" rel="nofollow"&gt;cufon&lt;/a&gt;). Также хочется отметить пример портирование библиотеки Processing - &lt;a href="http://processingjs.org/" rel="nofollow"&gt;Processing.js&lt;/a&gt;. Множество других примеров использования технологии можно посмотреть на &lt;a href="http://www.canvasdemos.com/" rel="nofollow"&gt;www.canvasdemos.com&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Если вы собираетесь использовать точечную (пиксельную) графику, то лучше Canvas для этой цели ничего не подходит. При работе с большими (по площади) векторными объектами лучше использовать SVG. Также будет необходимо дублировать всю функциональность через VML для IE 8 и ниже.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/77588/#comments</comments></item><item><title>VML, SVG, Canvas: вчера, сегодня, завтра</title><link>http://webo.in/articles/wsd2009/vml-svg-canvas/</link><guid>http://webo.in/articles/wsd2009/vml-svg-canvas/</guid><description>&lt;h3&gt;VML / PGML: немного истории&lt;/h3&gt;&lt;p&gt;Sun / IBM / Adobe 10 апреля 1998 года выкатывают свое решение для представления данных в векторном формате в вебе &amp;mdash; &lt;a href="http://www.w3.org/TR/1998/NOTE-PGML-19980410" rel="nofollow"&gt;PGML&lt;/a&gt;. Microsoft тоже не дремлет и вместе с рядом крупных компаний предлагает буквально через месяц (13 мая) на &lt;a href="http://www.w3.org/TR/NOTE-VML" rel="nofollow"&gt;рассмотрение W3C альтернативное решение &amp;mdash; стандарт VML&lt;/a&gt;. Дальше Microsoft гнет свою линию и включает поддержку VML уже в IE 5.0 (в &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer_5" rel="nofollow"&gt;марте 1999 года&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Очевидно, что технология, обладающая такой мощной поддержкой в браузерах того времени просто так не могла умереть (в отличие от PGML, которая, по-видимому, поддерживается только в настольных приложений тех компаний, которые его выдвинули). И &lt;a href="http://arstechnica.com/microsoft/news/2008/04/microsofts-office-open-xml-now-an-official-iso-standard.ars" rel="nofollow"&gt;в 2008 году VML окончательно закрепляется в качестве стандарта в составе Open Office XML&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;SVG: немного истории&lt;/h3&gt;&lt;p&gt;SVG, будучи инициативой, исходящей конкретно от W3C, развивался как формат весьма динамично. В конце 1998 года была образована SVG Working Group, которая занялась разработкой этого формата, через полгода (в июле 1999 года) она предложила первый вариант спецификации, и уже в 2001 году увидел свет &lt;a href="http://www.w3.org/TR/SVG10/" rel="nofollow"&gt;стандарт SVG 1.0&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;На данный момент основным работающим стандартом &lt;a href="http://www.w3.org/TR/SVG11/" rel="nofollow"&gt;является SVG 1.1&lt;/a&gt; (утвержденный в 2003 году). &lt;a href="http://www.w3.org/Graphics/SVG/WG/wiki/Roadmap" rel="nofollow"&gt;В июне 2012 года&lt;/a&gt; планируется предоставить полностью готовый SVG 2.0.&lt;/p&gt;&lt;h3&gt;Canvas: истоки&lt;/h3&gt;&lt;p&gt;История Canvas во многом отлична от упомянутых векторных стандартов. Во-первых, в 2005 году Apple предложила использовать &lt;a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/Canvas.html" rel="nofollow"&gt;уже вендренную ею технику Canvas&lt;/a&gt; для попиксельного изменения изображения внутри какой-то области (Canvas, холста). Эта идея была подхвачена Mozilla, которая интегрировала ее в Gecko 1.8 (Firefox 1.5 и выше), а позже и Opera (Opera 9.0 вышла с поддержкой Canvas).&lt;/p&gt;&lt;p&gt;Затем Canvas был включен в готовящийся стандарт Web Applications 1.0, который затем &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html" rel="nofollow"&gt;вошел в состам HTML5&lt;/a&gt;. Планируется, что поддержка Canvas войдет в следующую версию IE.&lt;/p&gt;&lt;h3&gt;VML + SVG: векторные форматы&lt;/h3&gt;&lt;p&gt;На настоящий момент SVG поддерживается всеми современными браузерами. Для IE необходимо использовать эмуляцию всех методов через VML (либо создавать альтернативное приложение).&lt;/p&gt;&lt;p&gt;Для описания SVG используется XML формат. При этом, естественно, возможны любые преобразования получившегося изображения при помощи DOM-методов (т.е. можно использовать любую JavaScript-логику &amp;laquo;поверх&amp;raquo; векторных форматов).&lt;/p&gt;&lt;p&gt;Спектр использования векторной графики сейчас довольно широк: это отображение масштабируемых объектов, областей на картах, вывод графиков. Стоит отметить, что в силу XML-природы SVG может быть легко интегрирован с другими форматами, в частности, сейчас идет его интеграция с MathML. Также можно назвать одно &amp;laquo;нестандартное&amp;raquo; применение VML &amp;mdash; для эмуляции полупрозрачности в PNG для IE. Для этого разработана специальная JavaScript-библиотека &amp;mdash; &lt;a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" rel="nofollow"&gt;DD_belatedPNG&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas: растровые операции&lt;/h3&gt;&lt;p&gt;Основным отличием от SVG в Canvas является его чисто динамическая (можно использовать только при помощи JavaScript) и растровая (нет объектов и связе между ними) природа. Однако в некоторых случаях это только плюс (например, сложные области на картах было бы логичнее обводить при помощи растровой, а не векторной графики).&lt;/p&gt;&lt;p&gt;Для работоспособности в IE используется эмуляция с помощью VML.&lt;/p&gt;&lt;p&gt;Как и всякую популярную технологию, Canvas используют по поводу и без везде, где только можно. Например, для отображения в браузере произвольных шрифтов (поскольку корректная поддержка &lt;code&gt;@font-face&lt;/code&gt; несколько запаздывает): &lt;a href="http://typeface.neocracy.org/" rel="nofollow"&gt;typeface.js&lt;/a&gt; (к слову есть более правильное с идеологической точки зрения решение данной проблемы&amp;nbsp;&amp;mdash; &lt;a href="http://cufon.shoqolate.com/generate/" rel="nofollow"&gt;cufon&lt;/a&gt;). Также хочется отметить пример портирования библиотеки Processing &amp;mdash; &lt;a href="http://processingjs.org/" rel="nofollow"&gt;Processing.js&lt;/a&gt;. Множество других примеров использования технологии можно посмотреть на &lt;a href="http://www.canvasdemos.com/" rel="nofollow"&gt;www.canvasdemos.com&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Canvas против SVG&lt;/h3&gt;&lt;p&gt;На данный момент Canvas при решении большинства задач справляется с ними быстрее, чем SVG. Достаточно давно был разработан пример использования Canvas для &lt;a href="http://www.ernestdelgado.com/gmaps/canvas/ddemo1.html" rel="nofollow"&gt;ряда задач Google Maps&lt;/a&gt;. В нем зафиксирован прирост скорости в 200-500% (для всех браузеров, которые поддерживают Canvas).&lt;/p&gt;&lt;p&gt;Также можно &lt;a href="http://intertwingly.net/stories/2006/07/10/penroseTiling.html" rel="nofollow"&gt;привести еще один тест&lt;/a&gt; скорости отображения объектов в Canvas и SVG. Здесь SVG снова проигрывает.&lt;/p&gt;&lt;p&gt;Для уточнения вопросов производительности можно &lt;a href="http://www.borismus.com/canvas-vs-svg-performance/" rel="nofollow"&gt;обратиться к исследованию&lt;/a&gt;, установившему закономерность между производительностью SVG, Canvas и параметрами изображения. В результате оказывается вполне очевидным, что при увеличении числа объектов (для SVG &amp;mdash; векторных) производительность SVG падает сильно (почти экспоненциально), а Canvas &amp;mdash; остается на стабильном уровне. Здесь стоит отметить, что размер активной области при этом не изменяется.&lt;/p&gt;&lt;p&gt;Однако если мы начнем увеличивать область построения (размеры объектов), то тут векторный формат показывает себя во всей красе: производительность практически не меняется. Производительность Canvas падает (как и следовало ожидать) квадратичным образом от числа объектов (площадь активной области увеличивается квадратично).&lt;/p&gt;&lt;p&gt;Из этого можно сделать простой вывод: если вы собираетесь использовать точечную (пиксельную) графику, то лучше Canvas для этой цели ничего не подходит. При работе с большими (по площади) векторными объектами лучше использовать SVG. Также будет необходимо дублировать всю функциональность через VML для IE 8 и ниже.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/webstandards/76607/#comments</comments></item><item><title>Разгоняем все, что движется</title><link>http://webo.in/articles/weborub/speed-up-all-movable/</link><guid>http://webo.in/articles/weborub/speed-up-all-movable/</guid><description>&lt;p&gt;&lt;img src="http://control.ileader.biz/u/_files/files/0/14.gif"width="277"height="200"alt="ВЕБОРУБ Ice 2008"title="ВЕБОРУБ Ice 2008"/&gt;&lt;/p&gt;&lt;h3&gt;Оптимизация &lt;a href="http://webo.in/"&gt;времени загрузки сайта&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Основные направления для проведения оптимизации с целью уменьшить время загрузки страницы включают уменьшение размера файла и уменьшение числа запросов. В качестве наиболее действенных методов, которые позволяют добиться поставленной задачи, можно рассмотреть:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/all/mod-gzip-minify-on-fly/"&gt;Gzip&lt;/a&gt; / minify для текстовых файлов (в том числе, HTML-, JS-, CSS-)&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS sprites&lt;/a&gt; и Image Map для картинок&lt;/li&gt;&lt;li&gt;ETag / Cache-Control для статических файлов&lt;/li&gt;&lt;li&gt;Семантическая верстка вместо табличной&lt;/li&gt;&lt;li&gt;Параллельные запросы на несколько &amp;laquo;ресурсных&amp;raquo; серверов&lt;/li&gt;&lt;li&gt;Убираем&lt;ul&gt;&lt;li&gt;Редиректы&lt;/li&gt;&lt;li&gt;404-ошибки&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/10-css-expressions-optimization/"&gt;CSS Expressions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Рассмотрим сжатие и минимизацию текстовых файлов. По итогам проведенных исследований, для &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;сжатия JavaScript&lt;/a&gt; лучше использовать Dean Edwards Packer, если файлы не будут дополнительно архивироваться на сервере, иначе лучше пользоваться YUI Compressor'ом. Для &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;сжатия CSS-файлов&lt;/a&gt; в любом случае лучше пользоваться CSS Tidy (но при этом возможны некоторые проблемы с хаками).&lt;/p&gt;&lt;p&gt;Если на сервере включено архивирование при выдачи файлов (&lt;code&gt;mod_gzip/deflate&lt;/code&gt;), но CSS-/JS-файлы имеется смысл архивировать и класть в виде статических архивов, чтобы дополнительно не нагружать сервер. Процедуру минимизации/архивирования можно автоматизировать при загрузке всех изменений на production-сервер.&lt;/p&gt;&lt;p&gt;HTML можно также несколько уменьшить, если убрать незначащие пробелы, переводы строк, часть символов (html entities) заменить на их действительное представление.&lt;/p&gt;&lt;h3&gt;CSS sprites&lt;/h3&gt;&lt;p&gt;Число фоновых картинок на странице может достигать нескольких сотен, обычно при этом значительное их количество используется на конкретной странице с подключенным файлом стилей. Обычно все картинки небольшие по размеру и могут быть собраны в характерные группы. Группировку можно проводить по следующим критериям:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Анимированные картинки&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по горизонтали (&lt;code&gt;repeat-x&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по вертикали (&lt;code&gt;repeat-y&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые повторяются по всем направлениям (&lt;code&gt;repeat&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Картинки, которые не повторяются (&lt;code&gt;no-repeat&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Таким образом, сотни ресурсных файлов можно свести к паре десятков, что существенным образом снизит число запросов к серверу. Однако, если вы ориентируетесь на клиентов с IE 4.0, то этот подход использовать нельзя: браузер не понимает &lt;code&gt;background-position&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/all/http-caching/"&gt;Кеширование&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Одним из наиболее действенных путей уменьшения времени загрузки страницы является кеширование. Его можно проводить на разных уровнях, но конечным его результатом должно быть сведение к минимум запросов при открытии страницы во все последующие посещения (в идеале, вообще 0 запросов).&lt;/p&gt;&lt;p&gt;Во-первых, для статических файлов, которые изменяются достаточно редко, можно прописать кеширующие заголовки (Cache-Control). Во-вторых, можно дополнительно выставить ETag на сервере (уникальный идентификатор ресурса). Однако, есть ряд проблем с настройкой ETag для сайтов, базирующихся на нескольких (кластере) серверах. Форсировать сброс кеша на клиенте можно выставлением уникальной GET-строки (метка текущей версии или метка текущей даты). Этот процесс также можно автоматизировать.&lt;/p&gt;&lt;p&gt;Очень часто при оптимизации забывают про качественное уменьшение HTML-кода, переход от табличной к семантической, смешанной или блочной, верстке. Однако, использование технологий, основанных на спецификации и передовых разработках в этой области, позволяют существенно уменьшить размер HTML. На данный момент, полностью блочная или смешанная семантическая верстка очень хорошо отображается в браузерах (корректность отображения достигается в 99,9%).&lt;/p&gt;&lt;p&gt;Вынесение общих стилевых объявлений и скриптов во внешние файлы также уменьшит размер страницы и позволит кешировать общую часть кода (CSS- и JS-).&lt;/p&gt;&lt;p&gt;При большом количестве запрашиваемых на странице ресурсов (от 20) для дальнейшей оптимизации можно распределить запросы к статическим файлам по нескольким внешним &amp;laquo;легким&amp;raquo; серверам (thttpd, nginx), чтобы распараллелить запросы. Более 4 таких серверов подключать не рекомендуется.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/"&gt;WEBo.sunnybear.ru&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;В начале февраля был запущен проект, полностью посвященный клиентской оптимизации. На данный момент им оценено 6500 сайтов, среднее время загрузки колеблется от 11 до 100 секунд, при этом рассчитанное ускорение составляет до 1000% (в случае применения всех указанных рекомендаций).&lt;/p&gt;&lt;p&gt;Проект работает в режиме справочного пособия, которое позволяет проанализировать конкретный сайт, установить узкие места и эффективно их исправить. Сейчас анализатор выдает более 30 советов по возможному уменьшению времени загрузки страницы, содержит &lt;a href="http://webo.in/articles/"&gt;несколько десятков статей&lt;/a&gt; и докладов, в которых рассматриваются проблемы оптимизации. Также выложены &lt;a href="http://webo.in/video/"&gt;видео-записи докладов&lt;/a&gt; с ClientSide'2007.&lt;/p&gt;&lt;p&gt;Мне кажется, что у проекта большой потенциал, который можно и нужно развивать, ибо проблема оптимизации хоть и стоит перед веб-разработчиками, но о ней склонны забывать или не обращать внимание, ссылаясь на скорость современных каналов или малую нагруженность ресурса.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Буду рад ответить на ваши вопросы.&lt;/p&gt;&lt;p class="X"&gt;&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://webo.in/articles/weborub/speed-up-all-movable/</comments></item><item><title>Проверяем качество сайтов</title><link>http://webo.in/articles/site2009/website-quality/</link><guid>http://webo.in/articles/site2009/website-quality/</guid><description>&lt;p&gt;Какую картину мы обычно наблюдаем при сдаче готовых интернет-проектов (будь то социальные сети, интернет-магазины или домашние страницы)? Исполнители сдают сайт, который хорошо выглядит в браузере заказчика, который обеспечивает заложенную функциональность, может быть, даже содержит внятную документацию и удовлетворяет нормам по серверной нагрузке. Вроде все замечательно, но этого мало.&lt;/p&gt;&lt;p&gt;Через несколько недель после работы такого веб-сайта становится понятно, что поддерживать его тяжело, работает он медленно и далеко не у всех пользователей корректно. ЧтО же делать?&lt;/p&gt;&lt;h3&gt;Ключевые моменты оценки качества веб-проектов&lt;/h3&gt;&lt;p&gt;На самом деле, можно достаточно быстро принять решение о качестве сдаваемого интернет-проекта с помощью бесплатных инструментов. Что же действительно влияет на качество:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Совместимость сайта с браузерами.&lt;/li&gt;&lt;li&gt;Соответствие стандартам.&lt;/li&gt;&lt;li&gt;Семантика HTML-кода.&lt;/li&gt;&lt;li&gt;Доступность сайта для пользователей.&lt;/li&gt;&lt;li&gt;Скорость работы на стороне сервера.&lt;/li&gt;&lt;li&gt;Скорость работы на стороне браузера.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Как все это проверить за 10 минут?&lt;/p&gt;&lt;h3&gt;Кроссбраузерность сайта&lt;/h3&gt;&lt;p&gt;Проверяем с помощью &lt;a href="http://www.browsershots.org/" rel="nofollow"&gt;www.browsershots.org&lt;/a&gt;. Выбираем наиболее распространенные браузеры для целевой аудитории (Internet Explroer 6, 7 и 8, Firefox 2 и 3, Opera 9 и 10, Safari 3, Chrome 1). Получаем пару десятков изображений главной страницы сайта, и уже по ней оцениваем качество верстки: насколько она соответствует начальному дизайн-макету.&lt;/p&gt;&lt;h3&gt;Соответствие стандартам&lt;/h3&gt;&lt;p&gt;Обычно при разработке в соответствии со стандартами уменьшается время на поддержку и развития такого сайта и увеличивается его доступность для пользователей. Какие стандарты стоит проверять?&lt;/p&gt;&lt;p&gt;Проверяем с помощью HTML-валидатора: &lt;a href="http://validator.w3.org/"&gt;validator.w3.org&lt;/a&gt;, на самом деле нам достаточно, чтобы было не более 25 ошибок на странице. Рекомендуется проверять несколько типичных страниц для устранения наиболее очевидных недочетов.&lt;/p&gt;&lt;p&gt;Соответствие стандартам доступности: WCAG. Проверяем с помощью &lt;a href="http://www.contentquality.com/"&gt;www.contentquality.com&lt;/a&gt;, достаточно соответствия первому уровню (A, WCAG Priority 1).&lt;/p&gt;&lt;h3&gt;Доступность и семантика кода&lt;/h3&gt;&lt;p&gt;Отключение стилей и JavaScript в браузере позволит &amp;laquo;увидеть&amp;raquo; сайт таким, как он &amp;laquo;выглядит&amp;raquo; для поисковых и других роботов. В Firefox это можно сделать с помощью Web Developer Toolbar. В других браузерах &amp;mdash; в настройках отключения скриптов и с помощью:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;javascript:document.getElementsByTagName('head')[0].innerHTML='';void(0);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Запуск этой адреса в браузере устранит большую (или же все) стили со страницы.&lt;/p&gt;&lt;p&gt;Дополнительно страница с отключенными стилями позволит проверить, насколько семантически верен HTML-код. Если содержание на странице остается понятным для пользователя, если ключевые элементы взаимодействия по-прежнему доступны &amp;mdash; то можно считать, что страница сверстана семантически верно. Иначе нужно устранять найденные недочеты (например, отсутствующее меню или форму входа). Не стоит искать у страницы с отключенными стилями полного соответствия дизайн-макету &amp;mdash; его и не должно быть. Но содержимое такой страницы должно быть приятно для глаза и доступно для использования. Это основное правило.&lt;/p&gt;&lt;h3&gt;Скорость работы сайта&lt;/h3&gt;&lt;p&gt;Очень часто скорость работы оказывает ключевое влияние на конвертация посетителей в доход сайта. Особенно это характерно для интернет-магазинов. Как мы можем проверить эту скорость? Для серверной стороны существует инструмент &lt;a href="http://host-tracker.com/" rel="nofollow"&gt;host-tracker.com&lt;/a&gt;, с помощью которого можно установить характерное время доступа к сайту из различных точек земного шара. Также он позволяет оценить характерное время создания страницы на сервере (если минимальное время доступа к сайту больше 1с, то уже стоит бить тревогу).&lt;/p&gt;&lt;p&gt;Для проверки отказоустойчивости сайта стоит воспользоваться сервисом &lt;a href="http://loadimpact.com/index.php?ri=201" rel="nofollow"&gt;Load Impact&lt;/a&gt;. Бесплатный анализ позволяет проверить до 50 одновременных посещений (каждое из которых может открывать несколько десятков страниц на сайте). Основным показателем устойчивости сайта к нагрузкам будет вид кривой, который получится после проведения теста. Если график ровный или время открытия страницы несколько падает при росте посещаемости &amp;mdash; значит, с сайтом все нормально. Если нет, то нужно принимать решение об оптимальном потоке посетителей, которых сайт сможет обслужить.&lt;/p&gt;&lt;p&gt;&lt;img width="542" height="308" src="/articles/site2009/website-quality/loadimpact.png" alt="Время открытия страницы в зависимости от потока посетителей" title="Время открытия страницы в зависимости от потока посетителей"/&gt;&lt;/p&gt;&lt;p&gt;Для проверки качества скорости загрузки клиентской составляющей можно воспользоваться либо YSlow под Firebug для Firefox (оценка должна быть не менее 80, лучше всего не менее 90). Или же бесплатным инструментом &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; (простая оценка не ниже 70, лучше не ниже 80).&lt;/p&gt;&lt;h3&gt;На что влияет качество сайта&lt;/h3&gt;&lt;p&gt;Это, в первую очередь, стоимость его поддержки и развития. Сайт, сделанный грамотно и по всем стандартам, гораздо проще развивать, поскольку времени написание дополнительного кода при наличии хорошей, стандартной базы уходит значительно меньше. Это и масштабируемость проекта, когда разработчики предусматривают большой &amp;laquo;запас прочности&amp;raquo; для ежедневных посещений, и в пиковые часы сайт будет работать в штатном режиме, не требуя дополнительного масштабирования.&lt;/p&gt;&lt;p&gt;Скорость создания HTML-страниц и общее время загрузки очень сильно влияет на доступность сайта. Ключевым параметром здесь является &amp;laquo;загрузка за 4 секунды&amp;raquo; и более быстрая загрузка, чем у основных конкурентов. В отсутствии основных преимуществ на рынках с высокой конкуренцией скорость работы сайта может оказаться решающим фактором при принятии решения.&lt;/p&gt;&lt;p&gt;Сейчас на рынке существует несколько решений, позволяющий автоматизировать ускорение сайта на клиентском уровне. Для ASP.NET &amp;mdash; это &lt;a href="http://getrpo.com/" rel="nofollow"&gt;GetRPO.com&lt;/a&gt;, для систем на базе PHP &amp;mdash; это &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/62907/#comments</comments></item><item><title>Качество переходит в количество</title><link>http://webo.in/articles/riw2009/quality-becomes-quantity/</link><guid>http://webo.in/articles/riw2009/quality-becomes-quantity/</guid><description>&lt;h3&gt;Быстрая оценка потенциала SEO для сайта&lt;/h3&gt;&lt;p&gt;В докладе идет речь, в первую очередь, о применении быстрых инструментов анализа для проверки, насколько качественно работает поисковое продвижение для небольшого сайта или насколько хорошо готов такой сайт к запуску продвижения в поисковых движках. Среди таких точек проверки (позволяющих быстро убедиться в готовности / качестве сайта с точки зрения SEO) можно назвать следующие.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Файл robots.txt.&lt;/li&gt;&lt;li&gt;Заголовки и фрагменты текста в поиске.&lt;/li&gt;&lt;li&gt;Глубина индексации.&lt;/li&gt;&lt;li&gt;Внутренняя перелинковка.&lt;/li&gt;&lt;li&gt;Скорость загрузки.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Давайте рассмотрим каждый из пунктов подробнее.&lt;/p&gt;&lt;h3&gt;Файл robots.txt&lt;/h3&gt;&lt;p&gt;Достаточно часто этот файл (расположенный в корне сайта) создают в соответствии со стандартами, поэтому тут проблемы маловероятны. На какие моменты стоит обратить внимание:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;User-Agent&lt;/code&gt; &amp;mdash; идентификатор браузера пользователя или поискового робота.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Disallow&lt;/code&gt; директива позволяет исключить нежелательные страницы из индекса. Это могут быть как результаты внутреннего поиска, так и личный кабинет пользователей или раздел администратора. Также здесь можно исключить некоторые наиболее &amp;laquo;тяжелые&amp;raquo; страницы в плане серверной нагрузки.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Host&lt;/code&gt; учитывает только Яндекс. Может быть полезно при использовании нескольких зеркал.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Sitemap&lt;/code&gt; указывает на XML-файл карты сайта. Очень полезно при увеличении глубины индексации сайта при наличии нескольких (десятков, сотен) тысяч страниц.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Crawl-delay&lt;/code&gt; устанавливает интервал захода поисковых роботов на сайт. Полезно для уменьшения нагрузки на сервер от индексации (в ночное время), либо для нивелирования влияния поисковых роботов на задержки для остальных посетителей сайта.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Все указанные вещи можно быстро проверить либо самостоятельно, либо с помощью бесплатных инструментов, например, &lt;a href="http://webmaster.yandex.ru/wmconsole/public_robots_txt.xml" rel="nofollow"&gt;webmaster.yandex.ru/wmconsole/public_robots_txt.xml&lt;/a&gt;. Дополнительно при добавлении, например, в Яндекс сайта для индексации, поисковик может проверить возможность индексации данного сайта и сразу же выдать предупреждение в случае ее невозможности.&lt;/p&gt;&lt;p&gt;В следующем примере мы указываем для сайта &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; для всех поисковых роботов запрет на индексацию секции &lt;code&gt;/my/&lt;/code&gt;, XML-файл с картой сайта и интервал между запросами страниц в 10 секунд.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;User-agent: *
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/searchengines/73636/#comments</comments></item><item><title>Переносим нагрузку на клиент</title><link>http://webo.in/articles/riw2008/move-load-to-client/</link><guid>http://webo.in/articles/riw2008/move-load-to-client/</guid><description>&lt;p&gt;Клиентская оптимизация оперирует двумя основными принципами: меньше данных и меньше соединений. Но именно эти принципы помогают уменьшить нагрузку на сам сервер. Давайте посмотрим, как это происходит и как перенести часть серверной нагрузки на клиентский браузер.&lt;/p&gt;&lt;h3&gt;3 основные правила&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Кеширование во главу угла.&lt;/strong&gt; Сервер может управлять состоянием кеша клиентского браузера, во-первых, через заголовок &lt;code&gt;Cache-Control&lt;/code&gt; (и его атрибуты &lt;code&gt;max-age&lt;/code&gt;, &lt;code&gt;pre-check&lt;/code&gt;, &lt;code&gt;post-check&lt;/code&gt;), который может указывать на промежуток времени, в течение которого соответствующий файл следует хранить на диске и не запрашивать с сервера. Рекомендуется для всех статических файлов выставлять максимальное время жизни кеша и форсировать его обновление у пользователя через изменение URL ресурса (с помощью &lt;code&gt;RewriteRule&lt;/code&gt; либо GET-параметра).&lt;/p&gt;&lt;p&gt;Во-вторых, состоянием клиентского кеша можно управлять через заголовки &lt;code&gt;ETag&lt;/code&gt; и &lt;code&gt;Last-Modified&lt;/code&gt;, которые ставят в соответствие каждому файлу уникальный идентификатор, изменяющийся при изменении файла, своеобразная цифровая подпись или хеш. При этом серверу не нужно пересылать файл заново, а лишь ответить кодом 304 на запрос браузера, если файл не изменился с момента последнего запроса. При этом сам файл не пересылается, соединение (и сокет) освобождается быстрее, и ресурса сервера также экономятся.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Меньше запросов &amp;mdash; легче серверу.&lt;/strong&gt; Объединение файлов никто не отменял. Чтобы не заставлять сервер обмениваться с браузером заголовками для передачи, например, нескольких таблиц стилей гораздо экономичнее будет их объединить в одну. При этом браузер быстрее получит всю необходимую информацию и быстрее освободит такой важный ресурс как соединение.&lt;/p&gt;&lt;p&gt;Наряду с объединением текстовых файлов не стоит пренебрегать и объединением картинок. Если учитывать, что современные браузеры могут устанавливать несколько десятков одновременных соединений с сервером для получения статических файлов (и 80% из них &amp;mdash; это именно картинки), то экономия от использования CSS Sprites или Image Map рассчитывается очень просто. В некоторых случаях удается уменьшить число соединений браузера с сервером для загрузки одной HTML-страницы в 8&amp;ndash;10 раз.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Архивировать и кешировать на сервере.&lt;/strong&gt; Как показали проведенные исследования gzip-сжатия текстового файла &amp;laquo;на лету&amp;raquo; в 95&amp;ndash;98% случаев позволяет сократить время на передачу файла браузеру. Если хранить архивированные копии файлов сервере (в памяти proxy-сервере или просто на диске), то соединение в общем случае удается освободить в 3&amp;ndash;4 раза быстрее.&lt;/p&gt;&lt;p&gt;В случае высоконагруженных серверов с динамическими HTML-файлами gzip также может применим. Здесь стоит ориентироваться на минимальную степень сжатия, ибо процессорные издержки при это растут линейно, а размер уменьшается лишь логарифмически.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Спорные моменты&lt;/h3&gt;&lt;p&gt;Следующие моменты стоит рассматривать как спорные: они могут как ускорить загрузку ваших сайтов, так и замедлить ее или слишком осложнить процесс разработки.&lt;/p&gt;&lt;h4&gt;Параллельные загрузки&lt;/h4&gt;&lt;p&gt;Создание нескольких зеркал для выдачи статических файлов обычно помогает ускорить загрузку страницы в браузере, но каково при этом приходится серверу? В общем случае, если общее число файлов на странице не превосходит 10, то зеркала применять нецелесообразно. При 10-20 файлах стоит ограничиться лишь одним зеркалом, и лишь если файлов становится несколько десятков, то стоит думать о 2&amp;ndash;3 зеркалах.&lt;/p&gt;&lt;p&gt;Однако, при существовании большого количества файлов (например, картинок) разумнее будет их объединять &amp;mdash; это поможет и серверу и клиенту.&lt;/p&gt;&lt;h4&gt;Все-в-одном-файле&lt;/h4&gt;&lt;p&gt;Технология кроссбраузерного &lt;code&gt;data:URL&lt;/code&gt; позволяет использовать один CSS-файл и для стилевых правил, и для небольших фоновых картинок. Это позволяет избежать использования CSS Sprites и многочисленных обращений для загрузки мелких фоновых изображений.&lt;/p&gt;&lt;p&gt;Однако, данный подход связан с некоторыми технологическими сложностями (необходима дополнительная обработка файлов перед их публикацией на рабочем сервере) и не позволяет осуществлять кеширование отдельных компонентов. В принципе, то же самое можно сказать и о включении CSS-/JS-файлов в HTML-страницу. Решение о таких мерах должно приниматься, исходя из индивидуальных особенностей проекта.&lt;/p&gt;&lt;h4&gt;Обрезание Cookie&lt;/h4&gt;&lt;p&gt;Cookie передаются при каждом запросе браузера на сервер. Иногда их размер может быть весьма значительным и даже превосходить полезный объем информации. К тому же, большое количество значений в заголовке Cookie несет дополнительную нагрузку на серверную логику &amp;mdash; ведь обычно все их нужно проанализировать и переслать обратно браузеру.&lt;/p&gt;&lt;p&gt;Одним из наиболее распространенных вариантов является выделение статических файлов на отдельное зеркало, на которое не передаются Cookie. Однако, этот подход не позволяет, например, показывать изображения только авторизованным пользователям. Отправка пользователю только необходимых cookie также сопряжена с логическими ошибками &amp;mdash; нужно ведь послать определенные cookie всем нужным пользователям и не послать всем ненужным.&lt;/p&gt;&lt;h3&gt;Выводы&lt;/h3&gt;&lt;p&gt;За счет объединения файлов и настройки агрессивного кеширования возможно уменьшение числа первоначальных запросов к серверу в несколько раз, и сведение повторных запросов всего к 1&amp;ndash;2 (если все остальные десятки файлов браузер будет брать из собственного кеша). Это позволит значительно сократить число активных соединений в секунду.&lt;/p&gt;&lt;p&gt;Архивирование также помогает сократить нагрузку на сервер, однако, его нужно использовать более аккуратно, чтобы не навредить слишком большой степенью сжатия или архивированием не тех типов файлов (например, JPEG).&lt;/p&gt;&lt;p&gt;Есть также ряд других методов (параллельные загрузки, все-в-одном, cookie и т.д.), которые могут повлиять на серверную нагрузку. Однако, и все нужно использовать с крайней осторожностью, и большого снижения нагрузки за их счет добиться нельзя.&lt;/p&gt;&lt;p&gt;Спасибо за внимание, буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/41716/#comments</comments></item><item><title>Разгоняем все, что движется</title><link>http://webo.in/articles/rit2008/speed-up-all-movable/</link><guid>http://webo.in/articles/rit2008/speed-up-all-movable/</guid><description>&lt;h3&gt;Оптимизация времени загрузки сайта: проблемы и решения&lt;/h3&gt;&lt;p&gt;Большинство сайтов Рунета работают :) Почти всегда. И почти всегда медленно. Иногда причина этого &amp;mdash; плохой канал связи у конечного пользователя или самого сайта. Но ни веб-разработчики, ни онлайн-маркетологи зачастую не отдают себе отчет, насколько эту ситуацию можно изменить, и изменить кардинально.&lt;/p&gt;&lt;h3&gt;Основные методы&lt;/h3&gt;&lt;p&gt;Сегодня речь пойдет о способах ускорения загрузки сайта. О методах увеличения эффективности сайта как инструмента продаж или оказания услуг, как существенной имиджевой составляющей бренда или просто личного блога. В качестве основных технологических направлений по уменьшению времени загрузки веб-страниц можно выделить следующие:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Уменьшение объема данных: большое число методов по минимизации и архивированию.&lt;/li&gt;&lt;li&gt;Уменьшение числа запросов: основная технология &amp;mdash; CSS Sprites.&lt;/li&gt;&lt;li&gt;Кеширование.&lt;/li&gt;&lt;li&gt;Параллельные загрузки.&lt;/li&gt;&lt;li&gt;Оптимизация JavaScript.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Обзор аудитории&lt;/h3&gt;&lt;p&gt;Основным критерием, который должен определять, какие методы и в каком объеме стоит применять, естественно, будет аудитория ресурса. Для каждого сайта можно выделить несколько характерных групп страниц, которые посещаются тем или иным типом аудитории. В первую группу войдут веб-страницы, на которые заходят всякий раз новые пользователи. Это и специальные рекламные страницы, задачей которых является прямая продажа продукта. Это и страницы объявлений, которые пользователи должны увидеть один, максимум, два раза. И т.д. Аудитория таких страниц на 99,9% состоит из новых пользователей. Следовательно, для них нужно применять методы, снижающие, в первую очередь, число обращений к серверу для показа страницы: объединение файлов и экстремальную оптимизацию.&lt;/p&gt;&lt;p&gt;Во вторую группу войдут страницы, аудитория которых также часто меняется, однако, часть ее может просматривать страницы неограниченное число раз. Для таких страниц можно выделить характерное ядро постоянных посетителей, однако, оно составляет не более 30&amp;ndash;40% от общего числа. Большинство сайтов, которые &amp;laquo;живут&amp;raquo; на поисковом трафике, являются замечательным примером ресурсов, полностью подходящих под эту группу. Для таких сайтов, в первую очередь, стоит рассмотреть методы уменьшения числа запросов (CSS Sprites), также возможную минимизацию всех текстовых файлов (HTML, CSS, JS). Однако, применение кеширование в данном случае оправдано в меньшей степени, так как уменьшит время загрузки страницы не так сильно (если брать средневзвешенное значение), чем, например, параллельные запросы.&lt;/p&gt;&lt;p&gt;Наконец, к третьей группе можно отнести все остальные страницы, а именно те, аудитория которых в большей степени постоянна (конкретные числа стоит рассматривать из параметров монетизации различных групп аудитории, однако, характерные значения здесь &amp;mdash; это 30% постоянных пользователей ресурса). В этой группе наиболее действенным будет, конечно же, кеширование и &lt;a href="http://webo.in/speed/javascipt/"&gt;оптимизация скорости работы JavaScript&lt;/a&gt; и Flash-анимации &amp;mdash; ведь именно она будет &amp;laquo;съедать&amp;raquo; больше всего времени у характерного пользователя такой аудитории.&lt;/p&gt;&lt;h3&gt;Уменьшение объема данных: сжатие и архивирование&lt;/h3&gt;&lt;p&gt;Основными инструментами для уменьшения объема данных являются разнообразные минимизаторы и обфускаторы (для &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;JavaScript-файлов&lt;/a&gt;), архивирование и также ряд утилит для уменьшения размера изображений. Давайте рассмотрим их по порядку.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:76,72,81,79,75,81,76,80,79,79,77,61|5,7,8,18,15,15,17,23,20,21,27,52|77,75,82,82,80,84,79,81,84,83,80,77|4,0,2,11,6,7,8,13,12,13,18,45|77,73,82,81,79,83,78,81,83,82,79,74|8,9,10,18,17,16,20,25,22,23,30,53|78,75,82,82,80,84,79,82,85,83,81,77|78,75,82,81,80,84,79,81,84,83,81,78|15,20,27,24,25,27,28,31,36,30,35,57|18,14,20,23,23,24,27,31,30,30,36,54|79,76,82,82,81,84,80,82,85,84,81,77&amp;amp;chxl=0:|5730|8573|19744|29539|11052|131446|11851|13040|58892|47175|67244|1383|1:||10%|20%|30%|40%|50%|60%|70%|80%|90%|100%&amp;amp;chco=868686,D0EB55,D0EB55,EBD055,EBD055,5539EB,5539EB,55EBD0,55EBD0,D055EB,D055EB&amp;amp;chg=8.33,10&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2,6,3|2|2,6,3|2|2,6,3|2|2|2,6,3|2,6,3|2&amp;amp;chdl=GZIP|CSSMin|CSSMin%2BGZIP|Minify|Minify%2BGZIP|YUI|YUI%2BGZIP|Minifier|Minifier%2BGZIP|CSS%20Tidy|CSS%20Tidy%2BGZIP" class="chart" alt="График сжатия CSS-файлов" title="График сжатия CSS-файлов"/&gt;&lt;p&gt;Как показало проведенное тестирование средств &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;сжатия CSS&lt;/a&gt;, лучше всего с этой задачей справляется проект CSS Tidy (примерно на одном уровне с ним идет YUI Compressor), который вместе с дополнительным архивированием файлов позволяет получить выигрыш до 85%.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:43,54,60,69,71,74,70,73,77,77,82,70|1,0,0,0,0,0,17,23,30,26,35,45|43,54,60,70,71,74,75,77,83,81,85,84|1,0,0,0,0,0,17,23,30,25,34,45|44,54,60,70,71,74,75,77,83,81,85,84|0,0,0,0,0,0,11,27,31,30,36,47|43,53,59,69,71,74,74,76,81,79,84,83|13,47,52,69,71,73,72,76,83,82,81,84|0,9,15,35,34,41,32,53,61,60,56,68|1,0,6,0,0,19,18,35,41,41,40,45|44,54,61,69,71,76,74,79,84,83,86,84&amp;amp;chxl=0:|853|9580|5857|43099|83879|39686|21414|22015|289446|124136|8867|95285|1:||10%|20%|30%|40%|50%|60%|70%|80%|90%|100%&amp;amp;chco=868686,D0EB55,D0EB55,EBD055,EBD055,5539EB,5539EB,55EBD0,55EBD0,D055EB,D055EB&amp;amp;chg=8.33,10&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2,6,3|2|2,6,3|2|2,6,3|2|2|2,6,3|2,6,3|2&amp;amp;chdl=GZIP|JSMin|JSMin%2BGZIP|Minify|Minify%2BGZIP|Rhino|Rhino%2BGZIP|Packer|Packer%2BGZIP|YUI|YUI%2BGZIP" alt="График сжатия JS-файлов" title="График сжатия JS-файлов" class="chart"/&gt;&lt;p&gt;Для JavaScript-файлов ситуация несколько интереснее. Если применять архивирование, то лучше всего использовать &lt;a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow" lang="en"&gt;YUI Compressor&lt;/a&gt;, так как он, в среднем, сжимает в этом случае лучше. Если архивирование для JS-файлов применять нельзя, то лидером в сжатии является &lt;a href="http://dean.edwards.name/packer/" rel="nofollow" lang="en"&gt;Dean Edwards Packer&lt;/a&gt;, однако, он вносит дополнительные издержки на свою &lt;a href="http://webo.in/articles/habrahabr/20-javascript-libraries-load-time/"&gt;&amp;laquo;распаковку&amp;raquo;&lt;/a&gt;. &lt;a href="http://webo.in/articles/habrahabr/20-javascript-libraries-load-time/"&gt;Как показали исследования&lt;/a&gt;, для пользователей, которые будут, в основном, загружать JavaScript из кеша, лучше использовать &lt;a href="http://webo.in/articles/habrahabr/11-minifing-javascript/"&gt;сжатие без обфускации&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Использование архивирования через &lt;a href="http://webo.in/articles/all/mod-gzip-minify-on-fly/"&gt;&lt;code&gt;mod_gzip&lt;/code&gt;&lt;/a&gt; для Apache способно существенно уменьшить размер загружаемых файлов. Однако, в случае очень быстрого канала у пользователей (например, локальный ресурс) и ограниченных ресурсов сервера (высокая удельная нагрузка на создание страницы) будет разумнее &lt;a href="http://webo.in/articles/habrahabr/30-gzip-versus-broadband/"&gt;сжатие не использовать&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=550x300&amp;amp;cht=lc&amp;amp;chxt=x,y&amp;amp;chd=t:0,1,1,3,6,12,23,47,94|0,0,0,1,1,3,6,11,22|0,0,0,0,0,1,2,3,6|0,0,0,0,0,1,2,3,6&amp;amp;chxl=0:|500%D0%B1|1000%D0%B1|2000%D0%B1|4000%D0%B1|8000%D0%B1|16000%D0%B1|32000%D0%B1|64000%D0%B1|128000%D0%B1|1:||20%D0%BC%D1%81|40%D0%BC%D1%81|60%D0%BC%D1%81|80%D0%BC%D1%81|100%D0%BC%D1%81|120%D0%BC%D1%81&amp;amp;chco=D0EB55,5539EB,55EBD0,EBD055&amp;amp;chg=8.33,16.66&amp;amp;chf=bg,s,FFFFFF&amp;amp;chls=2|2|2&amp;amp;chdl=100Kb%20Transfer|280MHz%20GZIP|1500Kb%20Transfer|1000MHz%20GZIP" alt="Накладные издержки на сжатие и передачу информации для 100Кб и 1500Кб и 280МГц и 1000МГц" title="Накладные издержки на сжатие и передачу информации для 100Кб и 1500Кб и 280МГц и 1000МГц" class="chart"/&gt;&lt;p&gt;Также стоит для архивированных файлов добавить соответствующие заголовки (&lt;code&gt;Cache-Control:private&lt;/code&gt;), чтобы избежать ряда проблем с кеширующими прокси-серверами. Для архивирования CSS- и JS-файлов также нужно исключить Safari и Konqueror из тех браузеров, которым можно отправлять gzip-файлы: эти браузеры до последнего времени не умели их корректно распознавать.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/26-speed-up-images-png-versus-gif/"&gt;Уменьшение размера изображений&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для большинства графических элементов рекомендуется использовать формат PNG, так как он более экономичен, чем GIF. Однако, для небольших изображений GIF-формат может оказаться лучше. На данный момент PNG-изображения поддерживаются, практически, всеми браузерами, поэтому вы ничего не потеряете, если будете использовать его.&lt;/p&gt;&lt;p&gt;Сейчас существует проблема с поддержкой альфа-канала в Internet Explorer (которую уже исправили в 7 версии), однако, в версиях ниже 7 (5.5 и 6) она решается через &lt;code&gt;ImageAlphaLoader&lt;/code&gt; (с помощью &lt;a href="http://webo.in/articles/habrahabr/10-css-expressions-optimization/"&gt;CSS expressions&lt;/a&gt;, CSS хаков или JavaScript), что позволяет использовать полупрозрачность, практически, в полном объеме.&lt;/p&gt;&lt;p&gt;В случае проблем с совпадением цветом (опять-таки в Internet Explorer) рекомендуется удалить из изображения gamma-чанков. В этом также может помочь ряд утилит, уменьшающих размер PNG-изображений: например, &lt;a href="http://pmt.sourceforge.net/pngcrush/" rel="nofollow" lang="en"&gt;&lt;code&gt;pngcrush&lt;/code&gt;&lt;/a&gt;. Для уменьшения размера JPG-изображений можно применить утилиту &lt;a href="http://linux.about.com/library/cmd/blcmdl1_jpegtran.htm" rel="nofollow" lang="en"&gt;&lt;code&gt;jpegtran&lt;/code&gt;&lt;/a&gt;, которая не затрагивает цветовые данные изображения, а удаляет комментарии и другие мета-данные.&lt;/p&gt;&lt;p&gt;Для анимированных изображений стоит использовать либо GIF-изображения с несколькими кадрами, либо DHTML-анимацию (JavaScript + PNG/JPEG).&lt;/p&gt;&lt;h3&gt;Семантическая верстка&lt;/h3&gt;&lt;p&gt;Когда разговор заходит про уменьшение размера кода, очень часто забывают про переход на семантическую разметку вместо табличной. Однако, она способна уменьшить не только время разработки backend-логики за счет более прозрачной структуры блоков, но и &amp;laquo;облегчить&amp;raquo; frontend-часть, сократив размер HTML примерно на 30%.&lt;/p&gt;&lt;p&gt;Сразу хочу заметить, что строгое следование семантике может отрицательно сказаться на размере кода, поэтому вам придется решить, что для вас важнее: поддержка последних тенденций (например, из мира микроформатов) или &lt;a href="http://webo.in/speed/"&gt;скорость загрузки страницы&lt;/a&gt;, например, интернет-магазина. Возможно, в ряде случаев будет разумно применить более простую спецификацию, сократив тем самым общее количество тегов и размер картинок (для CSS Sprites).&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/16-optimization-page-load-time/"&gt;Уменьшение числа запросов&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для уменьшения числа запросов при загрузке страницы применяют, в основном, техники слияния, адаптированные под разные типы данных. Например, для &lt;a href="http://webo.in/articles/habrahabr/02-delay-loading-stylesheets/"&gt;объединения CSS-файлов&lt;/a&gt; в один стоит использовать конструкцию&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;@media тип {селекторы для этого типа}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;например,&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;@media print {.nonprintable{display:none}}.&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Для уменьшения числа JS-файлов у нас гораздо больше простора для фантазии. Можно просто создать один большой файл со всеми используемыми вызовами и библиотеками. Можно создать один внешний файл, который будет загружать библиотеки по мере необходимости. А можно с помощью комбинированного обработчика событий &lt;code&gt;window.onload&lt;/code&gt; начать загрузку всех необходимых файлов сразу по получению HTML-кода.&lt;/p&gt;&lt;p&gt;Используя технику &amp;laquo;ненавязчивый&amp;raquo; JavaScript можно добиться существенного визуального ускорения при загрузке сложного интерфейса или веб-страниц с нетривиальной логикой.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS Sprites&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Наиболее популярной техникой для объединения изображений является CSS Sprites (или CSS Image maps), когда для отображения нескольких (десятков или даже сотен) изображений используется один ресурсный файл. Она дает ощутимый выигрыш в &lt;a href="http://webo.in/"&gt;скорости загрузки&lt;/a&gt; при использовании анимационных эффектов (например, смене изображения при наведении мыши), а также при большом количестве иконок на странице.&lt;/p&gt;&lt;p&gt;В качестве основных рекомендаций при создании ресурсных файлов для CSS Sprites можно назвать следующие:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Разбиение всех изображений на 5 основных групп (не рекомендуется использовать в одном файле изображений из более, чем 2 групп):&lt;ul&gt;&lt;li&gt;Изображения, повторяющиеся по всем направлениям (&lt;code&gt;repeat&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, повторяющиеся по горизонтали (&lt;code&gt;repeat-x&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, повторяющиеся по вертикали (&lt;code&gt;repeat-y&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Изображения, которые не повторяются (&lt;code&gt;no-repeat&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;И анимированные изображения.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Размер файлов должен быть не более 10&amp;ndash;20 Кб.&lt;/li&gt;&lt;li&gt;Объединение близких по цветовой гамме изображений.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Если у вас на странице выводится много небольших изображений, возможно, стоит воспользоваться техникой Image Map, чтобы сократить их количество.&lt;/p&gt;&lt;h3&gt;Экстремальная оптимизация&lt;/h3&gt;&lt;p&gt;Под экстремальной оптимизацией я понимаю максимальное уменьшение размера файлов и их количества, может быть, даже в ущерб браузерной совместимости.&lt;/p&gt;&lt;p&gt;В качестве характерного примера использования таких техник можно примести главные страницы &lt;a href="http://yandex.ru/" rel="nofollow"&gt;Яндекса&lt;/a&gt; и &lt;a href="http://www.yahoo.com/" rel="nofollow"&gt;Yahoo!&lt;/a&gt;, на которых CSS- И JS-файлы кроме стандартной минимизации еще и включены в итоговый HTML-код, а сам HTML отдается в виде gzip-архивов.&lt;/p&gt;&lt;p&gt;Логическим продолжением в данном случае будет использование схемы &lt;code&gt;data:URL&lt;/code&gt; и base64-кодирования для подключения фоновых и обычных изображений. Результирующий размер gzip-файла увеличится на 5&amp;ndash;10% (от размера изображения), однако, при этом удастся сэкономить один запрос к серверу. С помощью несложных вычислений можно подсчитать, при каком размере файла это рационально применять.&lt;/p&gt;&lt;p&gt;Однако, Internet Explorer не поддерживает эту технику (до версии 7 включительно). Для него можно использовать специальные хаки (в том числе, &lt;code&gt;* html&lt;/code&gt;), условные комментарии или mhtml-схему, которая обеспечивает, практически, ту же функциональность, что и &lt;code&gt;data:URL&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://webo.in/articles/all/http-caching/"&gt;Кеширование&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Основной техникой для ускорения загрузки страницы для постоянных посетителей является кеширование, которое может свести число запросов к серверу для отображения страницы к минимуму (в идеале, к нулю). Здесь стоит помнить о корректной настройке заголовка &lt;code&gt;Cache-Control&lt;/code&gt;. Для сброса кеша всегда можно воспользоваться дополнительным параметром в GET-запросе к ресурсу, который заставит сервер взять тот же физический файл, а клиентский браузер запросить файл и сохранить его под новым именем. Для статических ресурсов стоит выставлять достаточно большой срок кеша (можно экспериментировать со значения от месяца), для остальных файлов это значение должно быть равно среднему времени изменения либо вообще отсутствовать (для HTML-файлов, например).&lt;/p&gt;&lt;p&gt;В качестве дополнительного кеширующего аргумента можно использовать уникальные идентификаторы ресурсов (ETag). Они позволяет серверу не отдавать файл заново даже при закончившемся времени кеширования, а просто его продлять. Однако, существует ряд проблем с распределением файлов по разным физическим серверам и настройке на них идентичных ETag, но это, скорее, относится к уже очень большим системам.&lt;/p&gt;&lt;h3&gt;Параллельные загрузки&lt;/h3&gt;&lt;p&gt;Для уменьшения удельного времени ответа от сервера при загрузке большого числа файлов можно разделить загрузку на несколько потоков (серверов). Сами сервера для такой цели (быстрой отдачи статических ресурсов) лучше настраивать под &amp;laquo;легким&amp;raquo; окружением (например, nginx). В качестве балансирующего параметра можно рассматривать как распределение по географическому принципу (например, кластеры в США, Европе, Азии), так и по нагрузке (пул свободных серверов определяется каждый раз при загрузке страницы). Также возможно использование балансировки на клиенте для достижения того же эффекта.&lt;/p&gt;&lt;p&gt;В качестве основных проблем стоит отметить необходимости создания хеш-функции от имени файла, чтобы один и тот же файл загружался только с одного сервера, иначе браузер будет запрашивать его с серверов-зеркал, пока не забьет кеш всеми его копиями. Также стоит ограничиться 4 хостами (для большого числа файлов), для небольшого (15&amp;ndash;25) стоит использовать не более 3. 2 хоста разумно использовать, только если число файлов превосходит 10 из-за дополнительных расходов на распознавание имени в DNS-таблице.&lt;/p&gt;&lt;h3&gt;Оптимизация JavaScript&lt;/h3&gt;&lt;p&gt;Чуть ранее я уже упоминал про возможность загружать необходимые для отображения страницы JavaScript-файлы, фактически, после ее загрузки. Однако, есть еще и пара нюансов. Например, ваш сайт должен полностью функционировать и без JavaScript (должны осуществляться переходы по ссылкам, первоначальный вид страницы должен формироваться на сервере). Это позволит повысить индексируемость сайта и обезопасит тех пользователей, у которых ваши скрипты не работают по тем или иным причинам.&lt;/p&gt;&lt;p&gt;Используйте возможности CSS по максимуму. Вы не сможете отобразить страницу в браузере лучше, чем сам браузер, поэтому оставьте всю тяжелую работу по рендерингу для него (это относится к анимационным эффектам при наведении на кнопки, изменению разметки при изменении размеров окна и т.д.). CSS-движок, в среднем, работает быстрее, чем JavaScript. Также посоветую избегать использования CSS expressions либо оптимизировать их, чтобы они исполнялись только один раз на странице.&lt;/p&gt;&lt;p&gt;Обновляйте DOM-дерево большими кусками. DOM-Обращения ресурсоемки, это почти как база данных для серверных приложений. Чем меньше будет у вас работы с DOM, тем быстрее будет ваш JavaScript. Отдельное слово по поводу обработчиков событий: сводите их количество к минимуму. В идеале, стоит повесить один-единственный &lt;code&gt;onclick&lt;/code&gt; на &lt;code&gt;&amp;laquo;body&amp;raquo;&lt;/code&gt; и обрабатывать уже источник клика. Если вам требуются менее глобальные эффекты &amp;mdash; просто ограничьтесь одним обработчиков на блоке, в котором заключена требуемая область. Большое количество обработчиков событий (которые еще и забывают убирать из изменении HTML-кода на странице) приводит к &lt;a href="http://webo.in/articles/habrahabr/18-solving-internet-explorer-memory-leaks/"&gt;утечкам памяти в IE&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;И несколько общих советов: кешируйте глобальные переменные в локальные (однако, тут могут быть нюансы, особенно с &lt;a href="http://webo.in/articles/habrahabr/28-chain-javascript-calls-optimization/"&gt;цепочками вызовов функций&lt;/a&gt;), избегайте использовать &lt;code&gt;eval&lt;/code&gt; и &lt;code&gt;setTimeout&lt;/code&gt; / &lt;code&gt;setInterval&lt;/code&gt; (которые выполняют &lt;code&gt;eval&lt;/code&gt; на передаваемую в качестве аргумента строку). Вместо этого можно использовать анонимные функции.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;(function(){ ... }())&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;При осуществлении тяжелых вычислений (например, подгрузка данных или сортировка больших массивов) стоит &lt;a href="http://webo.in/articles/habrahabr/13-cpu-intensive-javascript/"&gt;обновлять интерфейс пользователя&lt;/a&gt;, чтобы он знал, что выполняются какие-то действия, и мог немного подождать. Однако, тут главное не переусердствовать с уведомлениями: ведь каждое обновление страницы занимает некоторое время, и накладные издержки на него могут оказаться много больше &amp;laquo;полезного&amp;raquo; времени.&lt;/p&gt;&lt;h3&gt;Действенность методов&lt;/h3&gt;&lt;p&gt;Что же из всего вышеперечисленного больше всего влияет на скорость загрузки? Как я уже упоминал, это сильно зависит от типа оптимизируемых страниц, однако, можно выделить некоторые общие тенденции. Так, кеширование позволяет снизить время загрузки страницы вплоть до нуля (чтобы она полностью загружалась из браузерного кеша пользователя, а ведь на ней может быть реклама, которую пользователь увидит, не заходя физически к вам на сайт).&lt;/p&gt;&lt;p&gt;Использование нескольких серверов для параллельных запросов способно уменьшить время загрузки на где-то 85%, использование CSS Sprites &amp;mdash; на 60%. Объединение текстовых файлов и их минимизация, в среднем, дает 40% выигрыш (однако, если у вас сложное веб-приложение, в котором функционирует десятки JavaScript-библиотек, то такая техника способно в разы ускорить его работу).&lt;/p&gt;&lt;p&gt;Оптимизация изображений уменьшает их удельный вес примерно на 30%. Если вы займетесь оптимизацией JavaScript-кода и вызовов функций, то сэкономите около 20%. Семантическая верстка способна уменьшить время загрузки только лишь на 10% (это связано с тем, что удельный вес HTML-кода в объеме страницы очень мал, поэтому больший выигрыш дает простое архивирование).&lt;/p&gt;&lt;p&gt;Что дадут оптимизационные мероприятия вашему бизнесу? По данным Yahoo! замедление страниц Google на 500мс приводит к 20% потере трафика, для Amazon 100мс обходятся в 1% продаж. Недавно проведенная оптимизация главной страницы европейского сайта &lt;a href="http://eu.acronis.com/" rel="nofollow"&gt;Acronis&lt;/a&gt; (время загрузки было уменьшено почти в 5 раз) привело примерно к 5% росту продаж и такому же увеличению трафика на внутренние страницы.&lt;/p&gt;&lt;p&gt;Также оптимизационные мероприятия позволили ускорить загрузку сайта &lt;a href="http://www.pmexpert.ru/" rel="nofollow"&gt;www.pmexpert.ru&lt;/a&gt; в 2,8 раза, а &lt;a href="http://www.creative.su/"&gt;www.creative.su&lt;/a&gt; в 2,6 раза&lt;/p&gt;&lt;h3&gt;Профилирующие инструменты для &lt;a href="http://webo.in/"&gt;оптимизации&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Лучшим в своем классе профилирующим инструментом для &lt;a href="http://webo.in/speed/complex/"&gt;оценки скорости загрузки сайта&lt;/a&gt; а анализа узких мест является &lt;a href="http://webo.in/articles/rit2008/speed-up-all-movable/https://addons.mozilla.org/ru/firefox/addon/5369" rel="nofollow" lang="en"&gt;Yslow&lt;/a&gt; под &lt;a href="http://webo.in/articles/rit2008/speed-up-all-movable/https://addons.mozilla.org/ru/firefox/addon/1843" rel="nofollow" lang="en"&gt;Firebug&lt;/a&gt; для &lt;a href="http://www.mozilla.com/en-US/firefox/" lang="en" rel="nofollow"&gt;Firefox&lt;/a&gt;). С помощью него можно установить и отладить, практически, все, что требуется для ускорения загрузки сайта. Основным его минусом является невозможность посмотреть, как именно происходит загрузка из кеша и, естественно, распространение только под Firefox (хотя, может быть, это является и плюсом).&lt;/p&gt;&lt;p&gt;Недавно &lt;a href="http://www.aol.com/" rel="nofollow" lang="en"&gt;AOL&lt;/a&gt; выпустило &lt;a href="http://pagetest.wiki.sourceforge.net/" rel="nofollow" lang="en"&gt;PageTest&lt;/a&gt; для Internet Explorer'а (6 и 7), который также позволяет увидеть диаграмму загрузки сайта, однако, не выдает таких развернутых советов, как YSlow. Для нахождения утечек памяти и замыканий под IE можно воспользоваться &lt;a href="http://outofhanwell.com/ieleak/index.php?title=Main_Page" rel="nofollow" lang="en"&gt;Drip&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jsunit.net/" rel="nofollow" lang="en"&gt;JsUnit&lt;/a&gt; предоставляет мощный framework для тестирования и отладки ваших JavaScript-приложений. С помощью &lt;a href="http://research.microsoft.com/projects/ajaxview/" rel="nofollow" lang="en"&gt;AjaxView&lt;/a&gt; можно проксировать и анализировать &lt;a href="http://webo.in/articles/habrahabr/23-high-performance-ajax-applications/"&gt;AJAX-запросы&lt;/a&gt;. Для профессионального профилирования веб-приложений стоит воспользоваться &lt;a href="http://rockstarapps.com/pmwiki/pmwiki.php?n=JsLex.JsLex" rel="nofollow" lang="en"&gt;JsLex&lt;/a&gt;, а время выполнения различных операций на странице можно замерить с помощью &lt;a href="http://developer.yahoo.com/yui/profiler/" rel="nofollow" lang="en"&gt;YUI Profiler&lt;/a&gt;. Но не забывайте, что лучшей проверкой ваших приложений на прочность всегда был и остается пользователь.&lt;/p&gt;&lt;p&gt;Наконец, пара слов об онлайн-инструментах. Пожалуй, самым старым и профессиональным можно назвать &lt;a href="http://www.websiteoptimization.com/"&gt;WebSiteOptimizator&lt;/a&gt;, который получает данные о всех требуемых для загрузки страницы файлах и выдает ряд советов по оптимизации времени загрузки. Также есть ряд сервисов (&lt;a href="http://www.octagate.com/service/SiteTimer/" rel="nofollow" lang="en"&gt;OctaGate SiteTimer&lt;/a&gt; и &lt;a href="http://tools.pingdom.com/fpt/" rel="nofollow" lang="en"&gt;Pingdom Tools&lt;/a&gt;), которые отображают диаграмму загрузки сайта в режиме онлайн. Однако, на них практически отсутствуют советы по &lt;a href="http://webo.in/"&gt;оптимизации скорости загрузки&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;В отличие от вышеуказанных инструментов, &lt;a href="http://webo.in/"&gt;Web Optimizator&lt;/a&gt; позволяет как получить сведения о всех загружаемых файлах и большое количество подробных советов (что же с этими файлами можно и нужно сделать) так и посмотреть, как эти файлы будут загружаться в различных браузерах. И что более важно, применять ряд оптимизационных методов &amp;laquo;не отходя от кассы&amp;raquo;, т.е. прямо на диаграмме загрузки. При этом не нужно ничего настраивать на сервере и проверять, уменьшится ли время загрузки после определенных действий или нет &amp;mdash; все можно осуществить в режиме онлайн.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Буду рад ответить на ваши вопросы.&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blog/client_side_optimization/33670/#comments</comments></item><item><title>Скорость имеет значение</title><link>http://webo.in/articles/ok2009/speed-matters/</link><guid>http://webo.in/articles/ok2009/speed-matters/</guid><description>&lt;h3&gt;Проблема медленных сайтов реальна&lt;/h3&gt;&lt;p&gt;С каждым годом Интернет растет вширь и вглубь. Увеличивается пропускная способность каналов, пользователи переходят с коммутируемого доступа на безлимитный. Сайты становятся больше по размеру, больше по наполнению и сложнее во взаимодействии. Размеры загружаемых файлов при этом увеличиваются многократно, а время ожидание пользователей не уменьшается.&lt;/p&gt;&lt;h3&gt;Рост Интернета&lt;/h3&gt;&lt;p&gt;За последние 5 лет средний размер веб-страниц вырос втрое (по данным исследования Akamai), а за последний год &amp;mdash; в полтора раза (по данным &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt;). При этом каждая страница использует в среднем по 50 объектов, что крайне негативно сказывается на общем времени загрузки. Только порядка 5-10% от общего времени загрузки приходится на серверную часть. Все остальное составляет именно клиентская архитектура.&lt;/p&gt;&lt;h3&gt;Белый экран в браузере&lt;/h3&gt;&lt;p&gt;Сколько времени вы готовы смотреть на белый экран в браузере прежде, чем сайт загрузится? 75% посетителей уйдут после 10 секунд. При этом наиболее характерным временем будет 4 секунды: если за это время сайт загружается у 90% пользователей, то вы счастливый владелец быстрого интернет-ресурса.&lt;/p&gt;&lt;p&gt;Однако и здесь дорога каждая миллисекунда. Недаром высоконагруженные проекта типа Google, Amazon, Flickr, Netflix, Яндекс, вКонтакте и Одноклассники так серьезно подходят к вопросу скорости загрузки сайтов. За каждым потерянным моментом времени кроется определенная сумма денег. Это именно то место, где время тождественно равно деньгам.&lt;/p&gt;&lt;h3&gt;В чем проблема?&lt;/h3&gt;&lt;p&gt;Основное время при загрузке страницы уходит именно на клиентскую часть. Серверные затраты обычно крайне малы и составляют от 50 до 500 мс. Среднему пользователю на самом деле абсолютно все равно, сколько страница будет создаваться на сервере, если он ее увидит через полсекунды. В этом случае фокус смещается именно на клиентскую, а не серверную оптимизацию.&lt;/p&gt;&lt;p&gt;Характер проблем варьируется от сайта к сайту. Иногда он заключается в особенности интернет-подключения основной массы пользователей ресурса (например, если широко используются модемы). Иногда &amp;mdash; в сложности самого сайта и неоправданном использовании ресурсов сети. Иногда &amp;mdash; в неграмотном использовании клиентских технологий и большого количества разнородных решений. Но все эти проблемы можно решить.&lt;/p&gt;&lt;h3&gt;Кто виноват и что делать?&lt;/h3&gt;&lt;p&gt;Для решения описанных проблем прежде всего нужно начинать с профессионального подхода при разработке какого-либо веб-приложения. Он обязательно должен опираться на использование веб-стандартов, в том числе и в области скорости загрузки и взаимодействия с пользователем.&lt;/p&gt;&lt;p&gt;Для полноценной оптимизации крупные компании разрабатывают специализированные решения. Однако даже в этом случае они опираются на многочисленный свод правил, описывающих наиболее оптимальное взаимодействие браузера с пользователем. Для среднего размера сайтов, использующих какое-либо стандартное решение для обслуживания контента, стоит обратить свое внимание на решения по автоматизации клиентской оптимизации.&lt;/p&gt;&lt;p&gt;Это &lt;a href="http://getrpo.com/" rel="nofollow"&gt;GetRPO.com&lt;/a&gt;, который направлен на сайта на базе сервера IIS. Для Apache и PHP существует два аналогичных решения: &lt;a href="http://aciddrop.com/php-speedy/" rel="nofollow"&gt;PHP Speedy&lt;/a&gt; (как плагин для Wordpress и Joomla!, &lt;a href="http://www.webogroup.com/ru/home/site-speedup/"&gt;ускорение Joomla!&lt;/a&gt;) и &lt;a href="http://code.google.com/p/web-optimizator/"&gt;Web Optimizer&lt;/a&gt; (как отдельное веб-приложение). Каждое из описанных решений позволяет свести затраты на внедрение оптимизации к минимуму и получить весьма неплохой результат для показателя скорости загрузки страницы.&lt;/p&gt;&lt;p&gt;Наконец при разработке сайтов стоит руководствоваться принципом &amp;laquo;мягкой деградации&amp;raquo;, согласно которому нужно наращивать функциональность в зависимости от способности браузера, а не наоборот. Например, можно использовать самые передовые технологии при верстке, которые поддерживаются не очень большим числом браузером, но должны поддерживаться значительной их долей, скажем, через год. Тогда определенные решения будут выглядеть безупречно у небольшого числа пользователей, у остальных &amp;mdash; хорошо или приемлемо. Но с прогрессом интернета число последних будет стремительно уменьшаться.&lt;/p&gt;&lt;p&gt;Напоследок стоит упомянуть про возможность использования распределенной сети серверов для сведения времени ответа к минимуму. В этом могут помочь существующие системы &amp;laquo;облачных&amp;raquo; вычислений, такие как: AMazon S3, Google Apps, Microsoft Azure. Также аналогичная система есть и на российских просторах. Это первая в России CDN &amp;mdash; &lt;a href="http://ngenix.net/"&gt;NGENIX&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Потенциал ускорения&lt;/h3&gt;&lt;p&gt;Как показывает практика, средний сайт в Рунете можно достаточно легко ускорить в 3-5 раза. И при этом не нужно быть гением в клиентской оптимизации &amp;mdash; достаточно применить ряд широко известных советов.&lt;/p&gt;&lt;p&gt;Все эти советы с детальным анализом эффективности, а также большое количество прикладного и новаторского материала приведено в первой в России специализированной книге, посвященной всем тонкостям клиентской оптимизации &amp;mdash; &lt;a href="http://speedupyourwebsite.ru/books/speed-up-your-website/"&gt;&amp;laquo;Разгони свой сайт&amp;raquo;&lt;/a&gt;. В книге описаны все тонкости архивирования и кэширования, объединения и разъединения файлов, а также особенности оптимизации CSS- и JavaScript-логики. На данный момент продается во всех больших книжных магазинах Москвы и доступна через ряд интернет-магазинов, например, &lt;a href="http://www.ozon.ru/context/detail/id/4400714/" rel="nofollow"&gt;ozon.ru&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Спасибо за внимание. Вопросы?&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/58052/#comments</comments></item><item><title>Быстрый сайт - это больше, чем хороший сайт</title><link>http://webo.in/articles/oborot2009/faster-means-better/</link><guid>http://webo.in/articles/oborot2009/faster-means-better/</guid><description>&lt;h3&gt;Скорость как основной критерий качества интернет-магазина&lt;/h3&gt;&lt;p&gt;Давайте рассмотрим основные критерии качества интернет-магазина. Здесь намеренно не упоминаются методы привлечения трафика: они составляют отдельную группу характеристик.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Соответствие заложенной нагрузке.&lt;/strong&gt; Сайт может хорошо справляться с 1 просмотром страницы в секунду, но не выдерживать и 3 одновременных посетителей. Здесь нужно хорошо понимать, что при заявленной разработчиками посещаемости в 10000 человек ежедневно, такой сайт может быть способен выдавать не более 30-50 тысяч просмотров, что говорит о времени создания страницы порядка секунды или даже больше. В таких условиях рассчитывать на такой сайт, как на эффективный механизм онлайн-маркетинга не приходится.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Соответствие стандартам.&lt;/strong&gt; Стандартные решения легче разрабатывать и поддерживать. Стандартный код имеет большую совместимость с текущими (и будущими) версиями браузеров. Также соответствие стандартов говорит о высокой культуре разработки при создания сайта, поэтому в большинстве случаев стандартный сайт еще и более качественный.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Удобство использования.&lt;/strong&gt; Если сайт запутанный, пугающий или просто неудобный, то им, естественно, пользоваться не будут. Простейшую проверку удобства использования можно провести среди ваших знакомых, друзей и подчиненных: попросите их выполнить с помощью сайта какую-либо задачу и смотрите на результат. Особенно важно спрашивать, какие чувства у испытуемого при выполнении это задачи: это поможет глубже понять целевую аудиторию.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Решение бизнес-задач владельца.&lt;/strong&gt; Сайт может быть быстрым, качественным, удобным, но не решать основные задачи. Например, на сайте элитной недвижимости не будет контактов обратной связи. Или на сайте интернет-магазина будут отсутствовать кнопки "Купить" или "В корзину". Решение задач бизнес &amp;mdash; это существенное условие качественного сайта.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Существующие стандарты&lt;/h3&gt;&lt;p&gt;Большая часть веб-технологий уже покрыта стандартами: это, в первую очередь, RFC, описывающие протоколы, и рекомендации W3C, которые уже давно стали стандартами в мире клиентских технологий. Также широко распространено сертифицирование по серверным языкам программирования: квалификация разработчиков может быть проверена достаточно путями.&lt;/p&gt;&lt;p&gt;Сложнее дело обстоит с удобством использования сайта (здесь стандартом пока крайне мало, и все они относятся к области доступности) и скоростью загрузки (здесь же есть общее положение по отрасли, которое и формирует нормальные или стандартные показатели).&lt;/p&gt;&lt;h3&gt;Скорость загрузки как стандарт&lt;/h3&gt;&lt;p&gt;Теперь перейдем к основным сформировавшимся в отрасли на текущий момент показателям скорости загрузки. В первую очередь, это время создании страницы на сервере, оно не должно превышать 0,5с. Затем идет достаточно характерный параметр: время появления в браузер хотя бы какого-то изображения сайта. Пользователи не склонны ждать много больше более 1 секунды в неизвестности, если заходят на качественный сайт. Поэтому &amp;laquo;белый экран&amp;raquo; в браузере рекомендуется показывать также не более 0,5с. Это стадия предварительной загрузки страницы.&lt;/p&gt;&lt;p&gt;Далее пользователь пытается освоится на сайте, и загрузка может продолжаться в интерактивном режиме. Однако полное время загрузки страницы не должно превышать 4 секунд: именно такой сейчас характерный порог ожидания пользователя. Если сайт загружается много дольше, то пользователь будет склонен покинуть его и искать альтернативу (а их сейчас очень много).&lt;/p&gt;&lt;p&gt;Для сравнения: по итогам последнего исследования Akamai характерное время загрузки страницы для западных пользователей &amp;mdash; 2 секунды, в два раза меньше.&lt;/p&gt;&lt;h3&gt;Скорость загрузки как критерий&lt;/h3&gt;&lt;p&gt;Быстрые сайты кажутся пользователям более качественными и красивыми (это подтверждено многочисленными исследованиями). Пользователи склонны больше доверять быстрому интернет-магазину (впечатление от скорости работы сайта будет распространяться и на мнение о скорости, например, доставки или ответа на запросы). По исследования Google и Microsoft увеличение времени ожидания пользователя приводит к снижению конверсию посещений.&lt;/p&gt;&lt;p&gt;Какие же реальные цифры? На основе нашего опыта интеграции решений для ускорения сайтов мы можем сказать следующее:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;увеличение скорости на 100% приводит к 5% росту продаж,&lt;/li&gt;&lt;li&gt;на 200% &amp;mdash; к 10% росту,&lt;/li&gt;&lt;li&gt;на 300% &amp;mdash; к 12% росту.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Скорость имеет значение и может быть подсчитана! Вот характерный график внедрения простых методов ускорения сайта (приведено число просмотров страницы на пользователя):&lt;/p&gt;&lt;p&gt;&lt;img src="http://i.webo.in/web-optimizer/web.optimizer.results.png" alt="Результаты внедрения Web Optimizer"/&gt;&lt;/p&gt;&lt;h3&gt;Проверяем скорость&lt;/h3&gt;&lt;p&gt;Для проверки серверной стороны существует инструмент &lt;a href="http://host-tracker.com/" rel="nofollow"&gt;host-tracker.com&lt;/a&gt;, с помощью которого можно установить характерное время доступа к сайту из различных точек земного шара. Также он позволяет оценить характерное время создания страницы на сервере (если минимальное время доступа к сайту больше 1с, то уже стоит бить тревогу).&lt;/p&gt;&lt;p&gt;Для проверки отказоустойчивости сайта стоит воспользоваться сервисом &lt;a href="http://loadimpact.com/index.php?ri=201" rel="nofollow"&gt;Load Impact&lt;/a&gt;. Бесплатный анализ позволяет проверить до 50 одновременных посещений (каждое из которых может открывать несколько десятков страниц на сайте). Основным показателем устойчивости сайта к нагрузкам будет вид кривой, который получится после проведения теста. Если график ровный или время открытия страницы несколько падает при росте посещаемости &amp;mdash; значит, с сайтом все нормально. Если нет, то нужно принимать решение об оптимальном потоке посетителей, которых сайт сможет обслужить.&lt;/p&gt;&lt;p&gt;&lt;img src="http://webo.in/articles/site2009/website-quality/loadimpact.png" alt="Проверка с помощью LoadImpact"/&gt;&lt;/p&gt;&lt;p&gt;Для проверки качества скорости загрузки клиентской составляющей можно воспользоваться либо YSlow под Firebug для Firefox (оценка должна быть не менее 80, лучше всего не менее 90). Или же бесплатным инструментом &lt;a href="http://webo.in/"&gt;webo.in&lt;/a&gt; (простая оценка не ниже 70, лучше не ниже 80).&lt;/p&gt;&lt;h3&gt;На что влияет скорость&lt;/h3&gt;&lt;p&gt;Скорость загрузки оказывает ключевое влияние на доступность сайта (больше психологическую, чем фактическую), активность пользователей на сайте (медленными сайтами люди предпочитают не пользоваться) и его конверсию (медленным сайтам не доверяют).&lt;/p&gt;&lt;p&gt;Сейчас на рынке существует несколько решений, позволяющих автоматизировать ускорение сайта на клиентском уровне. Для ASP.NET &amp;mdash; это &lt;a href="http://www.aptimize.com/" rel="nofollow"&gt;Aptimize&lt;/a&gt;, для систем на базе PHP &amp;mdash; это &lt;a href="http://www.web-optimizer.ru/"&gt;Web Optimizer&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/71290/#comments</comments></item><item><title>Нативные события в браузерах</title><link>http://webo.in/articles/livejournal/01-native-browser-events/</link><guid>http://webo.in/articles/livejournal/01-native-browser-events/</guid><description>&lt;p&gt;&lt;em&gt;Примечание от sunnybear: в данной заметке lusever рассматривает наиболее компактные способы назначения обработчиков событий для элементов DOM-дерева. Рекомендуется читать вместе со статьями &lt;a href="http://webo.in/articles/habrahabr/05-delayed-loading/"&gt;«отложенная» загрузка&lt;/a&gt; и &lt;a href="http://webo.in/articles/habrahabr/04-speed-up-events-handlers/"&gt;ускоряем обработку событий&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Только практические javascript решения, без всякой теории о всплытии и захвате.&lt;/p&gt;&lt;p&gt;Рекомендую использовать выражения, идущие в конце логического блока.&lt;/p&gt;&lt;h3&gt;Ловим&lt;/h3&gt;&lt;h4&gt;В html&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;В начале выполнится функция, потом переход по ссылке&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func()"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Переход не выполнится (см. &lt;code&gt;preventDefault&lt;/code&gt;)&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func(); return false"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Переход зависит от того, вернет ли &lt;code&gt;func&lt;/code&gt; false&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="return func()"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Передаем доступные параметры (порядок не важен):&lt;/strong&gt;&lt;br/&gt;&lt;code&gt;this&lt;/code&gt; &amp;mdash; нода&lt;br/&gt;&lt;code&gt;event&lt;/code&gt; &amp;mdash; тут значение имеет то, что мы передаем:&lt;ul&gt;&lt;li&gt;&lt;code&gt;function(event)&lt;/code&gt; &amp;mdash; получим кросс-браузерный вариант&lt;/li&gt;&lt;li&gt;&lt;code&gt;function(e)&lt;/code&gt; &amp;mdash; передаст объект &lt;code&gt;Event&lt;/code&gt; только для не IE браузеров&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" onclick="func(this, event)"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h4&gt;В javascript&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href="http://webo.in/articles/livejournal/01-native-browser-events/#" id="link"&amp;gt;я ссылка&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;blockquote&gt;&lt;pre&gt;var node = document.getElementById('link')&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Назначаем напрямую&lt;/strong&gt;&lt;blockquote&gt;&lt;pre&gt;node.onclick = function(){
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://lusever.livejournal.com/18870.html#comments</comments></item><item><title>Разгоняем CMS: дешево и сердито</title><link>http://webo.in/articles/icamp2008/cms-speedup/</link><guid>http://webo.in/articles/icamp2008/cms-speedup/</guid><description>&lt;p&gt;Данный обзор делался исключительно для презентации на конференции iCamp'2008. Я проанализировал несколько наиболее распространенных в Рунете CMS и привел все информацию по ускорению их загрузки, которую удалось обнаружить.&lt;/p&gt;&lt;h3&gt;&lt;a href="http://www.sbuilder.ru/" rel="nofollow"&gt;S.Builder&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="http://www.sbuilder.ru/demo/about.php" rel="nofollow"&gt;Демо-версия&lt;/a&gt;, практически, никакой информации не дала, поэтому далее информация (цитаты) лично от директора.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Gzip для HTML&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;В версии 4.0 этой функцией можно управлять из настроек системы. Просто поставить галочку в поле «Использовать GZip-сжатие страниц» и если браузер человека поддерживает такую функцию, то и CMS и страницы сайта будут использовать GZip. Если на одной CMS собрано несколько сайтов, настройка отдельна для каждого сайта.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;CSS/JS сжатие/минимизация&lt;/h4&gt;&lt;p&gt;Не применяется. Только руками верстальщика.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;В нашей CMS человек сам вставляет HTML, CSS и JS в том виде, в котором они были сверстаны.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Кеширование&lt;/h4&gt;&lt;p&gt;Насколько удалось установить, наиболее корректно отдается &lt;code&gt;Last-Modified&lt;/code&gt; для HTML. Все остальное покрыто мраком.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;CSS Sprites / параллельные хосты&lt;/h4&gt;&lt;p&gt;Нет и не планируется.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;a href="http://www.umi-cms.ru/" rel="nofollow"&gt;UMI.CMS&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Проверялась демо-версия, &lt;a href="http://www.umi-cms.ru/downloads/test_umicms/" rel="nofollow"&gt;доступная с официального сайта&lt;/a&gt;. Также была попытка установить пакет с сайта. В него не удалось залогиниться.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;h4&gt;Включаем кеширование&lt;/h4&gt;&lt;p&gt;Оно включается в настройках &lt;code&gt;Модули -&amp;gt; Конфигурация -&amp;gt; Глобальные -&amp;gt; Разрешить браузерам кешировать страницы&lt;/code&gt;. В серверные заголовки при этом добавляется &lt;code&gt;Last-Modified&lt;/code&gt;. Цитата из документации:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Если эта опция включена, то браузер пользователя будет вначале проверять, изменилась ли страница, и если страница не менялась, то загрузит ее из локального кэша. При этом браузеру будет посылаться HTTP-заголовок Last-Modified, который содержит дату последнего изменения страницы. Эта опция поможет значительно снизить нагрузку на трафик и позволит быстрее открывать страницы.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;h4&gt;Подключаем зеркала для ускорения выдачи статики&lt;/h4&gt;&lt;p&gt;&lt;code&gt;Модули -&amp;gt; Конфигурация -&amp;gt; Домены&lt;/code&gt;, выбираем наш домен и жмем &lt;code&gt;Зеркала&lt;/code&gt;. На открывшейся странице можно добавить еще несколько (2&amp;ndash;4) хоста для выдачи статики. Например, у нас был домен&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;endocardial.demo-pro.umi-cms.ru&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;мы добавляем еще 4 хоста&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;i1.endocardial.demo-pro.umi-cms.ru
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blog/client_side_optimization/47816.html#comments</comments></item><item><title>Установка Web Optimizer версии 0.5</title><link>http://webo.in/articles/habrahabr/99-web-optimizer-installation-0.5/</link><guid>http://webo.in/articles/habrahabr/99-web-optimizer-installation-0.5/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Web Optimizer" title="Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Не так давно вышла версия 0.5 (RC3) приложения для автоматического ускорения сайтов  &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;. Поскольку с момента написания &lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;предыдущего руководства по установке&lt;/a&gt; прошло уже три месяца, интерфейс и логика работы приложения существенно изменились (стали проще и нагляднее), то стоит осветить процесс установки еще раз, в новом виде и с новыми подробностями.&lt;/p&gt;&lt;h3&gt;Шаг 1: загрузка архива&lt;/h3&gt;&lt;p&gt;Web Optimizer поставляется в двух вариантах: ZIP-архив и мини-установщик. Для загрузки первого варианта идем по адресу &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt; и выбираем Featured версию 0.5 или выше.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-04.png" alt="Выбираем файл для загрузки" title="Выбираем файл для загрузки"/&gt;&lt;/p&gt;&lt;p&gt;Загружаем ZIP-архив в корень сайта. Если к сайту есть SSH-доступ, то можно использовать просто wget:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;wget http://web-optimizator.googlecode.com/files/web-optimizer.v0.5beta.zip&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Затем полученный архив нужно будет распаковать в корень, чтобы получилась папка web-optimizer.&lt;/p&gt;&lt;p&gt;Если к сайту есть только FTP-доступ, то загружаем сначала на локальный диск, потом распаковываем, а потом уже (например, через FAR) копируем в корень сайта.&lt;/p&gt;&lt;p&gt;При отсутствии желания загружать распакованный архив на сервер (или распаковывать на сервере загруженный архив) есть версия мини-установщика, который (при наличии &lt;code&gt;curl&lt;/code&gt; на сервере) сам все загрузит и начнет установку. Для этого нужно загрузить только файл &lt;code&gt;install.me.php&lt;/code&gt; в корень сайта и открыть его в браузере.&lt;/p&gt;&lt;p&gt;После того, как все необходимые файлы оказались на сайте, то нужно выставить права на запись, как минимум, для файла &lt;code&gt;web-optimizer/config.php&lt;/code&gt; и (опционально) папки &lt;code&gt;web-optimizer/cache&lt;/code&gt; для пользователя, под которым работает сервер. Иначе настройки и закэшированные версии сжатых файлов не смогут сохраниться. При желании папка кэширования может быть другой (об этом чуть ниже), поэтому будет необходимо только выставить права на конфигурационный файл.&lt;/p&gt;&lt;h3&gt;Шаг 2: настройка&lt;/h3&gt;&lt;p&gt;Заходим в браузере по адресу&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;http://ваш_сайт/web-optimizer/index.php&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Вместо &lt;code&gt;web-optimizer&lt;/code&gt; может быть произвольная директория, в которой находится Web Optimizer. Видим приветственный экран от Web Optimizer. Если не видим, то стоит перепроверить, куда был скопирован Web Optimizer, а зайти именно в ту папку.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-05.png" alt="Настройка доступа" title="Настройка доступа"/&gt;&lt;/p&gt;&lt;p&gt;Здесь возможно 2 варианта развития событий:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Быстрая установка&lt;/li&gt;&lt;li&gt;Обычная установка&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Быстрая установка&lt;/h4&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-06.png" alt="Быстрая установка" title="Быстрая установка"/&gt;&lt;/p&gt;&lt;p&gt;Для начала быстрой установки вводим будущий логин и пароль доступа к административной части и нажимаем зеленую кнопку «Быстрая установка». После этого Web Optimizer вычисляет директории на сервере, сохраняет все настройки по умолчанию и осуществляет цепочную оптимизацию для главной страницы: создает закэшированные версии сжатых файлов. Только потом, если файлы (обычно только корневой &lt;code&gt;index.php&lt;/code&gt;, зависит от используемой CMS) доступны на запись, производится их автоматическое изменение.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-07.png" alt="Окончание установки" title="Окончание установки"/&gt;&lt;/p&gt;&lt;p&gt;Иначе Web Optimizer выведет инструкции по изменению этих файлов.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-12.png" alt="Инструкции по изменению файлов" title="Инструкции по изменению файлов"/&gt;&lt;/p&gt;&lt;h4&gt;Обычная установка&lt;/h4&gt;&lt;p&gt;Обычная установка отличается от быстрой только наличием промежуточного шага с редактированием настроек. Запустить ее можно, нажав по кнопке «Далее», цифре 2 или 3 в верхнем меню или оранжевой стрелочек справа.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-11.png" alt="Настройки" title="Настройки"/&gt;&lt;/p&gt;&lt;p&gt;Подробно все настройки и их особенности &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описаны в соответствующей статье&lt;/a&gt;. Прежде всего нужно убедиться в том, что вычисленные пути являются правильными. Также можно задать произвольные директории кэширования: это будет необходимо при включении настройки «Защищенный режим» (находится в разделе «Использование &lt;code&gt;.htaccess&lt;/code&gt;»). После этой настройки пароль при доступе к Web Optimizer будет запрашиваться только через HTTP Basic Authorization. Дополнительно вводить его не потребуется. Однако файлы, которые находятся внутри папки с Web Optimizer, станут не доступны обычным пользователям, поэтому директории кэширования нужно из нее перенести.&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-10.png" alt="Защищенный режим" title="Защищенный режим"/&gt;&lt;/p&gt;&lt;h3&gt;Шаг 3: Управление&lt;/h3&gt;&lt;p&gt;В Web Optimizer версии 0.5 доступно несколько инструментов для управления приложением.&lt;/p&gt;&lt;p&gt;&lt;img width="10)%" src="http://i.webo.in/web-optimizer/7-09.png" alt="Обычный режим. Обновление" title="Обычный режим. Обновление"/&gt;&lt;/p&gt;&lt;p&gt;Во-первых, это конфигурирование всех настроек (здесь и далее при работе не в защищенном режиме нужно будет ввести логин и пароль), которое можно осуществить по кнопке «Далее» (или клику по цифрам 2 или 3 или оранжевой стрелочке справа). Во-вторых, это очистка кэша (будет необходимо, если вы провели изменение каких-либо CSS- или JS-файлов на сервере при включенной настройке «Не проверять время изменения файлов»)  кнопка «Очистить кэш». В-третьих, это возможность безболезненно удалить Web Optimizer (будут удалены все добавленные в файлы CMS вызовы, а файл &lt;code&gt;.htaccess&lt;/code&gt; будет очищен от оптимизационных директив)  кнопка «Удалить».&lt;/p&gt;&lt;p&gt;При наличии &lt;code&gt;curl&lt;/code&gt; на сервере и существовании более новой версии, чем текущая, будет предложено обновиться (появится блок с кнопкой «Обновить»). При обновлении все исходные настройки будут сохранены. Также могут добавиться некоторые новые. В обычном режиме панель администрирования для Web Optimizer выглядит следующим образом:&lt;/p&gt;&lt;p&gt;&lt;img width="100%" src="http://i.webo.in/web-optimizer/7-08.png" alt="Обычный режим" title="Обычный режим"/&gt;&lt;/p&gt;&lt;h3&gt;Решение возникающих проблем&lt;/h3&gt;&lt;p&gt;Часть известных проблем и методов решения уже &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описана в предыдущей статье&lt;/a&gt;. Если вы обнаружили некорректное поведение Web Optimizer для вашего сайта, вы можете &lt;a href="http://code.google.com/p/web-optimizator/issues/entry" rel="nofollow"&gt;опубликовать описание ошибки&lt;/a&gt; (требуется Google-аккаунт) или &lt;a href="http://code.google.com/p/web-optimizator/issues/list?can=1&amp;amp;cells=tiles" rel="nofollow"&gt;посмотреть все известные (или решенные) вопросы&lt;/a&gt;. На данный момент среднее время решения проблемы составляет около суток (обычно несколько часов).&lt;/p&gt;&lt;p&gt;Также можно попробовать решить проблему в интерактивном режиме, &lt;a href="http://webo.in/contacts/"&gt;используя указанные контакты&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Эффективность&lt;/h3&gt;&lt;p&gt;Несколько результатов использования Web Optimizer (для «чистой» установки системы, без каких-либо предварительных оптимизаций) &lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;приведено здесь&lt;/a&gt;. Оценка YSlow поднимается до 89-97, скорость клиентской загрузки в 2-3 (реже 3-5) раз. Сам Web Optimizer после создания кэшированных файлов тратит всего 3-10мс на проверку и обновление выходного HTML-документа (при настройках по умолчанию, корректное сжатие HTML в одну строку  достаточно ресурсоемкая операция и может занимать еще 50-100мс).&lt;/p&gt;&lt;p&gt;Загрузить Web Optimizer &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/98-web-optimizer-0.5/"&gt;Web Optimizer 0.5 "cheetah"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62861/#comments</comments></item><item><title>Web Optimizer 0.5 «cheetah», RC3</title><link>http://webo.in/articles/habrahabr/98-web-optimizer-0.5/</link><guid>http://webo.in/articles/habrahabr/98-web-optimizer-0.5/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Мы снова здесь со свежей версией приложения для автоматизации клиентской оптимизации  Web Optimizer. Больше месяца прошло с момента выхода последней стабильной версии, более 300 реальных сайтов испытали феноменальное ускорение, но нам этого показалось мало. И мы сделали хороший продукт еще лучше.&lt;/p&gt;&lt;p&gt;Итак, встречайте: версия 0.5 под кодовым именем «cheetah» (гепард), Release Candidate 3.&lt;/p&gt;&lt;p&gt;Загрузить: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Что нового?&lt;/h3&gt;&lt;p&gt;Естественно, весь месяц мы не сидели сложа руки и писали, тестировали, обновляли и тестировали вновь. Изменения по сравнению с версией 0.4.5:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Одним из главных бонусов является включение в состав Web Optimizer последней версии библиотеки для форматирования и оптимизации CSS-кода  CSS Tidy (наверное, в ближайшем будущем выйдет ее новая версия, 1.4, а то уже все заждались). Исправлено несколько очевидных и не очень ошибок (в частности, связанных с CSS3-селекторами).&lt;/li&gt;&lt;li&gt;Была существенно переработана логика самого Web Optimizer для максимальной производительности. По последним тестам время его работы для отдельной страницы составляет 3-10мс (в среднем сайт на Joomla! требует 200-500мс для выполнения всей серверной логики).&lt;/li&gt;&lt;li&gt;Исправлена проблема с «белым экраном» при использовании CSS Sprites (связана с «вылетом» GDLib при попытке создать слишком большое изображение). Теперь при недостатке памяти просто создается не такой большой спрайт, как хотелось бы. Видимо, в будущих версиях алгоритм расходования памяти будет существенно улучшен.&lt;/li&gt;&lt;li&gt;Полностью обновлен пользовательский интерфейс (спасибо &lt;a href="http://fade.habrahabr.ru/" rel="nofollow"&gt;&lt;img src="http://www.habrahabr.ru/i/small_default_userpic.gif" alt="посмотреть профиль" title="посмотреть профиль"/&gt;&amp;nbsp;fade&lt;/a&gt; ). Мы продолжаем &lt;a href="http://sprites.in/donate/"&gt;собирать деньги&lt;/a&gt;, чтобы отблагодарить автора дизайна. Еще не поздно внести свою лепту.&lt;/li&gt;&lt;li&gt;Авто-изменение PHP-файлов CMS включено по умолчанию. В случае невозможности такого изменения на последнем шаге выводится полный список необходимых изменений для файлов.&lt;/li&gt;&lt;li&gt;Добавлена возможность создать «защищенную» установку: Web Optimizer может находиться в произвольной директории и быть закрытым при помощи &lt;code&gt;.htpasswd&lt;/code&gt;. Более подробно данная тема раскрывается в &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;статье про настройки&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;В настройки Web Optimizer добавлены ссылки на соответствующие статьи, в которых заявленные техники освещаются в полном масштабе.&lt;/li&gt;&lt;li&gt;Добавлено достаточно простое кэширование для HTML-документов. Помогает в случае простых сайтов снять нагрузку с сервера (создаваемые HTML-документы надежно кэшируются). Доступные настройки: время кэширования, регулярное выражение для запрета кэширования, список USER AGENTS для форсирования кэширования, возможность сделать быстрый сброс документа.&lt;/li&gt;&lt;li&gt;Благодаря сотрудничеству с &lt;a href="http://ort.habrahabr.ru/" rel="nofollow"&gt;&lt;img src="http://www.habrahabr.ru/i/small_default_userpic.gif" alt="посмотреть профиль" title="посмотреть профиль"/&gt;&amp;nbsp;ort&lt;/a&gt; значительно улучшена стабильность работы и функционирование распределения изображений по статическим хостам. Все обнаруженные проблемы совместимости с LiveStreet 0.3 были устранены.&lt;/li&gt;&lt;li&gt;Добавлена возможность оптимизации фоновых изображений через API сервиса &lt;a href="http://smush.it/" rel="nofollow"&gt;smush.it&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;По умолчанию добавлено статическое архивирование для CSS/JS-файлов. Это означает, что если сжатием у вас заправляет сервер, то ему не придется каждый раз сжимать эти файлы перед отдачей клиенту  gzip-версии будут храниться на сервере рядом с обычными и отдаваться в случае необходимости. Даже если сжатием заправляет PHP, все равно он будет отдавать уже готовые сжатые файлы, а не запускать &lt;code&gt;ob_gzhandler&lt;/code&gt; каждый раз.&lt;/li&gt;&lt;li&gt;Улучшен алгоритм работы &lt;code&gt;data:URI&lt;/code&gt;: немного увеличен максимальный размер файла и добавлены исключения для некоторых типов (&lt;code&gt;.htc&lt;/code&gt;, &lt;code&gt;.cur&lt;/code&gt;, &lt;code&gt;.eot&lt;/code&gt; и т.д.).&lt;/li&gt;&lt;li&gt;Добавлена возможность вынести сгенерированный JS-файл перед &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. Также добавлена возможность вынести загрузку счетчиков и рекламы в самый низ документа, чтобы избежать блокирующего влияния скриптов.&lt;/li&gt;&lt;li&gt;Добавлена очистка кэша из панели администрирования.&lt;/li&gt;&lt;li&gt;Добавлена возможность корректно сжимать HTML в одну строку.&lt;/li&gt;&lt;li&gt;Добавленные системы:&lt;ul&gt;&lt;li&gt;Textpattern 4.0&lt;/li&gt;&lt;li&gt;Kohana 2.3&lt;/li&gt;&lt;li&gt;phpBB 3.0&lt;/li&gt;&lt;li&gt;Yii 1.0&lt;/li&gt;&lt;li&gt;SMF 1.1.8&lt;/li&gt;&lt;li&gt;IPB 2.3.6&lt;/li&gt;&lt;li&gt;Bitrix&lt;/li&gt;&lt;li&gt;cogear 1.0&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ну и сотня-другая не столь крупных исправлений и улучшений.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Что дальше?&lt;/h3&gt;&lt;p&gt;Видимо, главным приоритетом для новой версии станет максимальная совместимость с самыми различными вариантами поддерживаемхы CMS и максимальная производительность при любых настройках и любом серверном окружении (не у всех же сайтов выделенный сервер с 1Гб оперативной памяти?). На данный момент есть весьма интересная задача по оптимизации создания CSS Sprites (как показала практика, они стабильно создаются уже в 95-99% случаев) в случае ограниченной памяти. Если кто соберется помочь  пишите в комментариях, приват и по &lt;a href="http://webo.in/contacts/"&gt;указанным контактам&lt;/a&gt;. Только давайте не так, как вышло с версткой для нового интерфейса, когда 5 верстальщиков один за другим сошли с дистанции.&lt;/p&gt;&lt;h3&gt;Замеченные ошибки и документации&lt;/h3&gt;&lt;p&gt;Документация и описание приложения будет ширится и расти. на данный момент уже опубликована &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;статья с описанием настроек&lt;/a&gt;, готова к публикации статья с пошаговым руководством по установке. В процессе подготовки статья с описанием известных проблем под наиболее популярные CMS.&lt;/p&gt;&lt;p&gt;Часть документации (в основном, касательно принципов работы) выложена на английском здесь: &lt;a href="http://code.google.com/p/web-optimizator/w/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/w/list&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Некоторые известные проблемы и методы их решения уже &lt;a href="http://webo.in/articles/habrahabr/96-web-optimizer-settings/"&gt;описаны в предыдущей статье&lt;/a&gt;. Если вы обнаружили некорректное поведение Web Optimizer для вашего сайта, вы можете &lt;a href="http://code.google.com/p/web-optimizator/issues/entry" rel="nofollow"&gt;опубликовать описание ошибки&lt;/a&gt; (требуется Google-аккаунт) или &lt;a href="http://code.google.com/p/web-optimizator/issues/list?can=1&amp;amp;cells=tiles" rel="nofollow"&gt;посмотреть все известные (или решенные) вопросы&lt;/a&gt;. На данный момент среднее время решения проблемы составляет около суток (обычно несколько часов).&lt;/p&gt;&lt;p&gt;Также можно попробовать решить проблему в интерактивном режиме, &lt;a href="http://webo.in/contacts/"&gt;используя указанные контакты&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Монетизация&lt;/h3&gt;&lt;p&gt;На данный момент доступна платная установка и настройка приложения дл вашего сайта. &lt;a href="http://webo.in/speed/"&gt;Заказать можно здесь&lt;/a&gt;. Также есть вероятность того, что будет выпущена отдельная, коммерческая ветка приложения, которая будет каким-либо образом продаваться (политика лицензирования обсуждается).&lt;/p&gt;&lt;p&gt;Если у вас есть какие-то конкретные коммерческие предложения, их всегда можно озвучить по &lt;a href="http://webo.in/contacts/"&gt;указанным контактам&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Эффективность&lt;/h3&gt;&lt;p&gt;Несколько результатов использования Web Optimizer (для «чистой» установки системы, без каких-либо предварительных оптимизаций) &lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;приведено здесь&lt;/a&gt;. Оценка YSlow поднимается до 89-97, скорость клиентской загрузки в 2-3 (реже 3-5) раз. Сам Web Optimizer после создания кэшированных файлов тратит всего 3-10мс на проверку и обновление выходного HTML-документа (при настройках по умолчанию, корректное сжатие HTML в одну строку  достаточно ресурсоемкая операция и может занимать еще 50-100мс).&lt;/p&gt;&lt;p&gt;Ну, вроде все. До новых встреч :)&lt;/p&gt;&lt;p&gt;Загрузить Web Optimizer: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Поддержать проект материально: &lt;a href="http://sprites.in/donate/"&gt;sprites.in/donate/&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/93-web-optimizer-0.4.5/"&gt;Web Optimizer. Версия 0.4.5 &amp;mdash; Release Candidate 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/92-web-optimizer-0.4/"&gt;Web Optimizer. Версия 0.4 &amp;mdash; Stable Release Candidate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/89-css-sprites-2.0/"&gt;CSS Sprites 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62009/#comments</comments></item><item><title>CSS Tidy: нужна помощь</title><link>http://webo.in/articles/habrahabr/97-css-tidy/</link><guid>http://webo.in/articles/habrahabr/97-css-tidy/</guid><description>&lt;p&gt;&lt;a href="http://csstidy.sourceforge.net/" rel="nofollow"&gt;CSS Tidy&lt;/a&gt; является полностью открытой и на данный момент одной из самых мощных библиотек по преобразования CSS-кода. В большинстве случаев ее используют для минимизации CSS-кода (что позволяет добиваться &lt;a href="http://webo.in/articles/habrahabr/14-minifing-css/"&gt;весьма впечатляющих результатов&lt;/a&gt;, &lt;a href="http://csstidy.sourceforge.net/example.php" rel="nofollow"&gt;пример с сайта CSS Tidy&lt;/a&gt;). Огромное количество сайтов предлагают минимизаторы, основанные именно на CSS Tidy: &lt;a href="http://www.cleancss.com/" rel="nofollow"&gt;CleanCSS&lt;/a&gt;, &lt;a href="http://hellobmw.com/csstidy/" rel="nofollow"&gt;CSS Formatter and Optimizer&lt;/a&gt;, &lt;a href="http://www.csscompressor.com/" rel="nofollow"&gt;CSS Compressot&lt;/a&gt; и многие другие. Даже &lt;a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow"&gt;YUI Compressor&lt;/a&gt; год назад уступал CSS Tidy по степени сжатия.&lt;/p&gt;&lt;h3&gt;Преамбула&lt;/h3&gt;&lt;p&gt;Количество настроек CSS Tidy впечатляет: это и сжатие наименований свойств (цветов, шрифтов, фона), и регистро-независимый вывод, и объединение селекторов для максимальной минимизации кода, и их сортировка, и исключение нестандартных CSS-свойств, и сохранение синтаксиса введенного кода, и т.д. (&lt;a href="http://csstidy.sourceforge.net/usage.php" rel="nofollow"&gt;полный список поддерживаемых настроек с примерами&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Поскольку библиотека направлена на разбор и стандартизацию (как следует из названия - Tidy), а не только на минимизацию кода, то с ее помощью можно проворачивать довольно любопытные вещи. Например, выводить CSS-код в стандартном виде в любом формате (CSS Tidy &lt;a href="http://csstidy.sourceforge.net/templates.php" rel="nofollow"&gt;поддерживает шаблоны вывода&lt;/a&gt;). Или осуществлять любые преобразование с таблицей стилей на странице (к слову, именно она используется для &lt;a href="http://sprites.in/"&gt;создания CSS Sprites&lt;/a&gt; и, естественно, в приложении для автоматической клиентской оптимизации &amp;mdash; &lt;a href="http://code.google.com/p/web-optimizator/" rel="nofollow"&gt;Web Optimizer&lt;/a&gt;). В Web Optimizer уже включена самая последняя версия CSS Tidy, в которой исправлены некоторые ошибки.&lt;/p&gt;&lt;p&gt;Так как приложение написано с учетом высоких требований к производительности, то работает оно очень шустро (в несколько раз быстрее того же YUI Compressor).&lt;/p&gt;&lt;p&gt;Но речь не совсем об этом.&lt;/p&gt;&lt;h3&gt;Амбула&lt;/h3&gt;&lt;p&gt;На данный момент (&lt;a href="http://en.wikipedia.org/wiki/CSSTidy" rel="nofollow"&gt;как написано в Wikipedia&lt;/a&gt;) автор (Florian Schmitz) ищет людей, который смогли бы вести проект дальше. PHP-часть библиотеки не так сложна, и я справляюсь с ней самостоятельно. Но проблемы возникли при необходимости параллельно поддерживать Win32-версию (CPP). Беглый взгляд на текущий состав файлов мне ничего не подсказал, поэтому я прошу у сообщества помощи и в свою очередь ищу людей, которые смогли бы поддерживать актуальность CPP-ветки.&lt;/p&gt;&lt;p&gt;Для примера текущий список файлов в ней:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;SConscript
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62464/#comments</comments></item><item><title>Web Optimizer. Настройка и использование</title><link>http://webo.in/articles/habrahabr/96-web-optimizer-settings/</link><guid>http://webo.in/articles/habrahabr/96-web-optimizer-settings/</guid><description>&lt;p class="right"&gt;&lt;a href="http://code.google.com/p/web-optimizator/"&gt;&lt;img src="http://web-optimizator.googlecode.com/svn/trunk/images/web.optimizer.logo.small.png" alt="Загрузить Web Optimizer"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Пока выпуск версии 0.5 веб-приложения, автоматизирующего клиентскую оптимизацию для PHP-сайтов, отодвигается на некоторое неопределенное время, мы решили подготовить небольшой обзор текущих настроек и возможностей приложения.&lt;/p&gt;&lt;h3&gt;Особенности работы&lt;/h3&gt;&lt;p&gt;Web Optimizer перехватывает выводимый HTML-документ и преобразовывает его к оптимальному виду. В частности, анализируется вся секция &lt;code&gt;head&lt;/code&gt; на предмет CSS- и JavaScript-файлов, также при существовании статических хостов изображения распределяются по ним (меняются адреса у изображений), а блоки с рекламой и счетчиками переносятся перед &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; (опять-таки только при включении соответствующей настройки). Также HTML подвергается минимизации (удаляются лишние переводы строк и отступы, могут удаляться комментарии и вообще все лишние символы, но это ресурсоемкие операции, и по умолчанию они выключены).&lt;/p&gt;&lt;p&gt;Загрузить приложение: &lt;a href="http://code.google.com/p/web-optimizator/downloads/list" rel="nofollow"&gt;http://code.google.com/p/web-optimizator/downloads/list&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Настройка Web Optimizer&lt;/h3&gt;&lt;p&gt;Ниже приведены настройки, доступные в Web Optimizer версии 0.4.9.7 (войдут в 0.5 без изменений):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Директории кэширования&lt;/strong&gt;. Здесь можно выставить пути к кэширующим директориям (на файловой системе), в которых будут записываться сохраненные уменьшенные CSS-, JavaScript- и HTML-файлы. Также здесь можно определить корневую директорию сайта (необходима для правильного расчета всех относительных путей). По умолчанию все кэширующие директории назначаются в папке &lt;code&gt;cache&lt;/code&gt; в самом Web Optimizer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Настройки сжатия&lt;/strong&gt;. Эта группа настроек отвечает за объединении и минимизацию JavaScript- и CSS-файлов. По умолчанию JavaScript-файлы объединяются и минимизируются при помощи JSMin (или YUI Compressor, если доступна &lt;code&gt;java&lt;/code&gt;). Также можно сжимать JavaScript при помощи Dean Edwards Packer (является лучшим выбором при отсутствии &lt;code&gt;gzip&lt;/code&gt;-сжатия). Здесь также можно настроить, каким образом минимизировать выводимый HTML-код (простое удаление лишних переводов строк и пробелов, &amp;laquo;вытягивание&amp;raquo; в одну строку и(ли) удаление комментариев). Условные комментарии для IE не затрагиваются ни в каком случае.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Включить внешние JavaScript-файлы&lt;/strong&gt;. Web Optimizer может загружать внешние JavaScript-файлы (вызываемые с других доменов), а также внутренний код (заключенный прямо в &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;). Здесь можно настроить и &amp;laquo;склеивание&amp;raquo; CSS-кода, находящегося в &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; (по умолчанию включено). Также можно указать (через пробел) названия файлов (названия, а не полные пути), которые нужно исключить из логики объединения. На этапе тестирования была обнаружена невозможность объединить исходные библиотеки Tiny MCE и FCE Editor, поэтому они исключаются по умолчанию.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&amp;laquo;Ненавязчивый&amp;raquo; JavaScript&lt;/strong&gt;. В этой группе собраны настройки, отвечающие за неблокирующие загрузку различных вариантов JavaScript. В частности, можно вынести объединенный JavaScript-файл перед &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; (или вообще вызывать его загрузку по событию &lt;code&gt;DomContentLoaded&lt;/code&gt;), можно вынести загрузку некоторых счетчиков, рекламы и информеров также в самый низ документа (после JavaScript-кода результирующий HTML-код вставляется в исходное место на странице, обеспечивая постепенное появление дополнительных рекламных блоков после того, как загрузилось основное содержание).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Не проверять время изменения&lt;/strong&gt;. Данная настройка позволяет не проверять при загрузке каждой страницы время изменение и содержание всех файлов, только существование закэшированных версий. За счет этого мы получаем существенный прирост серверной производительности (по умолчанию настройка включена). В случае отладки или очень частого изменения исходных JavaScript- или CSS-файлов настройку лучше отключить.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Gzip-сжатие (архивирование)&lt;/strong&gt;. Данная группа настроек регулирует, отдавать ли браузеру JavaScript-, CSS- или HTML-файлы в виде архивов. Gzip-сжатие позволяет сэкономить 70-85% трафика при передаче текстовых файлов, однако может быть (особенно в случае сжатия через PHP и высоконагруженных проектов) не очень оптимальной для сервера. В любом случае по возможности все настройки сжатия выносятся в &lt;code&gt;.htaccess&lt;/code&gt; (для CSS- и JavaScript- в статическом виде). При невозможности изменения &lt;code&gt;.htaccess&lt;/code&gt; gzip-версии JavaScript- и CSS-кода сохраняются в кэширующих директориях, что также сводит нагрузку на процессор (через PHP) к минимуму.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&amp;laquo;Вечное&amp;raquo; кэширование&lt;/strong&gt;. Настройки этой группы отвечают за выставление кэширующих заголовков для JavaScript-, CSS-, HTML- или статических файлов (изображений и анимации). Для изображений и анимации соответствующие правила размещаются только в &lt;code&gt;.htaccess&lt;/code&gt;, для остальных файлов они дублируются по необходимости через PHP. По умолчанию для статических файлов выставляется срок кэширования на 10 лет (при изменении файлов новые версии имеют другое имя, создаваемое на основе md5-хэша от общего содержимого файлов). Для HTML-файлов есть возможность вручную выставить подходящий срок действия клиентского кэша. Отличие этой настройки от следующей группы (серверного кэширования HTML-файлов) заключается в том, что выводимый HTML никак на сервере не сохраняется, мы только указываем браузерам, что они могут не перезапрашивать HTML-документы в течение определенного времени. Будут ли браузеры следовать этому указания или нет, остается полностью на их совести.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кэширование HTML-файлов&lt;/strong&gt;. Для существенного ускорения работы серверной стороны практически во всех случаях требуется применять серверное кэширование. И практически все CMS это поддерживают (на том или ином уровне). Web Optimizer предлагает альтернативный вариант (для тех случаев, когда текущая система это не умеет, либо нужно более &amp;laquo;жесткое&amp;raquo; решение): простое кэширование HTML-документов. При включении этой настройки HTML-файлы сохраняются в директории кэширования и отдаются при первом вызове Web Optimizer, без обработки внутренней логики системы. Естественно, учитывается срок действия кэша. Также возможно выдавать сразу не весь документ, а первый 1-2 Кб (через сброс документа), а потом рассчитывать остальную часть. Это может помочь визуально ускорить загрузку страницы на некоторых окружениях. Для настройки кэширования доступен список частей URL сайта, которые нужно исключить (есть возможность задавать регулярные выражения) и список роботов (USER AGENTS), для которых нужно форсировать выдачу кэширующего файла.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CSS Sprites&lt;/strong&gt;. Пожалуй, самая технологически мощная и самая спорная часть Web Optimizer. Правильное использование спрайтов позволяет на порядок (!) уменьшить число запросов к серверу при загрузке страницы с большим количеством фоновых изображений (с 20-100 до 3-10). Однако существуют некоторые проблемы с отображением комбинированных картинок для IE6 (картинки по умолчанию создаются в 32-битной палитре, а IE6 не умеет корректно обрабатывать прозрачность для таких PNG), проблемы устраняются исключением IE6 из создания спрайтов (соответствующей настройкой), либо использованием непрозрачных картинок. Также доступны настройки по использованию JPEG вместо PNG для полноцветных изображений, &amp;laquo;агрессивному&amp;raquo; режиму (&lt;code&gt;repeat-x&lt;/code&gt; и &lt;code&gt;repeat-y&lt;/code&gt; будут объединяться без учета фактических размеров контейнеров), добавлению свободного пространства (позволяет избежать рудиментов при масштабировании таких картинок в современных браузерах).
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/web_optimizator/62009/#comments</comments></item><item><title>Data URI [CSS] Sprites 1.1 - Автоматизация процесса сборки css спрайтов</title><link>http://webo.in/articles/habrahabr/95-data-uri-sprites-1.1/</link><guid>http://webo.in/articles/habrahabr/95-data-uri-sprites-1.1/</guid><description>&lt;p&gt;&lt;img src="http://duris.ru/images/logo.png" width="434" height="85" alt="data:URI [CSS] Sprites" title="data:URI [CSS] Sprites"/&gt;&lt;/p&gt;&lt;p&gt;Многим профессиональным веб-разработчикам известны приемы оптимизации сайтов. Одним из способов оптимизации является использование &lt;a href="http://webo.in/articles/habrahabr/08-all-about-css-sprites/"&gt;CSS спрайтов&lt;/a&gt;. Этим же разработчикам известно, какие существуют трудности с формированием, сборкой и пересборкой стандартных спрайтов. В инете можно найти инструменты для автоматизации этого процесса. При использовании стандартных спрайтов полностью автоматизировать сборку для всех случаев проблематично, из-за специфики background в css. Иногда камнем преткновения является свойство repeat фоновой картинки.&lt;/p&gt;&lt;h3&gt;Data:URI CSS&lt;/h3&gt;&lt;p&gt;Существует альтернативный вариант генерации CSS спрайтов, на основе &lt;a href="http://ru.wikipedia.org/wiki/Data:_URL" rel="nofollow"&gt;&lt;code&gt;data:uri&lt;/code&gt; схемы&lt;/a&gt;. Данный подход интересен тем, что максимально минимизируется кол-во обращений к серверу, + самое важное &amp;mdash; можно &lt;strong&gt;полностью&lt;/strong&gt; автоматизировать процесс сборки и перегенерации спрайтов. Для &lt;strong&gt;полной автоматизации&lt;/strong&gt; процесса оптимизации работы сайтов и сборки css спрайтов на основе &lt;code&gt;data:uri&lt;/code&gt; схемы была разработана специальная библиотека. На базе созданной библиотеки развернут сайт &lt;a href="http://duris.ru/"&gt;Duris.ru&lt;/a&gt;. Те кто ранее не слышал про данную разработку могут почитать &lt;a href="http://webo.in/articles/habrahabr/74-data-uri-sprites-automation/"&gt;предыдущую статью&lt;/a&gt; на эту тему.&lt;/p&gt;&lt;h3&gt;Обновление версия 1.1&lt;/h3&gt;&lt;p&gt;Теперь о главном. Инструмент генерации спрайтов обновился и заимел рад дополнительных возможностей:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;обработка &lt;code&gt;media&lt;/code&gt; в &lt;code&gt;link&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt; &amp;mdash; теперь css стили собираются в зависимости от &lt;code&gt;media&lt;/code&gt;, генерация происходит только для &lt;code&gt;@media = null || all || screen&lt;/code&gt;&lt;/li&gt;&lt;li&gt;улучшена обработка &lt;code&gt;@import&lt;/code&gt;&lt;/li&gt;&lt;li&gt;корректно обрабатываются условные комментарии (comment conditional) для IE&lt;/li&gt;&lt;li&gt;теперь спрайты работают и для IE8, причем независимо от режима работы (при разных &lt;code&gt;X-UA-Compatible&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;устранен ряд ошибок с последовательностью формирования правил в css стилях&lt;/li&gt;&lt;li&gt;добавлена возможность обрабатывать Javascript, а именно склеивать в один файл и применять компрессию&lt;/li&gt;&lt;li&gt;устранены все известные баги&lt;/li&gt;&lt;li&gt;добавлена возможность работы с локальной файловой системы (для интеграции в свои проекты)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Указанный инструмент генерации data:uri спрайтов интегрирован в один из серьезных проектов, естественно показать который на данный момент не могу, но результат интеграции больше чем просто радует. Наконец-то мучения со спрайтами закончены.&lt;/p&gt;&lt;h3&gt;Будущее&lt;/h3&gt;&lt;p&gt;При появлении поддержки в IE8 &lt;code&gt;data:uri&lt;/code&gt; схемы разработанный подход становится довольно перспективным, теперь все современные браузеры поддерживают такие спрайты. Для полного счастья осталось браузеру Opera увеличить размер поддерживаемой &lt;code&gt;data:uri&lt;/code&gt; схемы (пока в Opera имеется ограничение ~ 4кб). &lt;em&gt;Примечание от sunnybear: подтверждения этого найти не удалось, но есть &lt;a href="http://msdn.microsoft.com/en-us/library/cc848897(VS.85).aspx" rel="nofollow"&gt;ограничение на 32Кб в IE8&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Детально ознакомится с принципами генерации и подключения data:uri css спрайтов можно в разделе &lt;a href="http://duris.ru/faq/"&gt;FAQ&lt;/a&gt;. Если у вас возникли вопросы или предложения по работе сайта или алгоритма в целом, вы можете оставить свои пожелания на нашем сайте в виджете обратной связи, или просто пишите в комментарии.&lt;/p&gt;&lt;p&gt;Напоследок, отличная подборка инструментов для генерации CSS спрайтов &lt;a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/"&gt;www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Пользуйтесь на здоровье.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPD&lt;/strong&gt;: Сайт &lt;a href="http://artlebedev.ru/" rel="nofollow"&gt;artlebedev.ru/&lt;/a&gt;, на который настроен duris.ru по умолчанию «в тумане», соот-но чтобы оценить работу вставляйте свои или какие-то другие рабочие на данный момент сайты.&lt;/p&gt;&lt;h3&gt;Читать дальше&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/87-web-optimizer-installation/"&gt;Установка Web Optimizer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/86-auto-css-sprites/"&gt;Автогенерация CSS Sprites&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/85-web-optimizator/"&gt;PHP Speedy &amp;mdash; наше все&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/76-web-evolution/"&gt;Развитие веба с 2000 до 2007&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/74-data-uri-sprites-automation/"&gt;Data:URI CSS Sprites современный подход к генерации CSS спрайтов&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/69-total-image-optimization/"&gt;Оптимизация изображений, часть 3: 4 шага для уменьшения размера файлов &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/67-practical-example/"&gt;Оптимизация загрузки страниц на практике&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webo.in/articles/habrahabr/66-online-store-speed-up/"&gt;Эксперимент сколько живых денег может принести ускорение загрузки сайта?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><comments>http://www.habrahabr.ru/blogs/client_side_optimization/60757/#comments</comments></item><atom:link href="http://webo.in/rss20.xml.gz" rel="self" type="application/rss+xml"/></channel></rss>
