<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог веб-студии Магвай &#187; Кодинг</title>
	<atom:link href="http://blog.magwai.ru/rubric/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.magwai.ru</link>
	<description>корпоративный блог веб-студии Магвай</description>
	<lastBuildDate>Fri, 27 Aug 2010 11:28:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Идеальный веб-программист</title>
		<link>http://blog.magwai.ru/451/</link>
		<comments>http://blog.magwai.ru/451/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 18:35:16 +0000</pubDate>
		<dc:creator>m4a1</dc:creator>
				<category><![CDATA[Веб-сайты]]></category>
		<category><![CDATA[Жизнь студии]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://blog.magwai.ru/?p=451</guid>
		<description><![CDATA[Давно хотел написать свои мысли про качества современного веб-программиста. Но все никак не мог сформулировать. Сейчас после утоления кадрового голода нашей студией все как-то встало на свои места. Я сделал для себя 2 вывода:

Хороших сотрудников нужно искать постоянно.
Хорошие сотрудники есть и они обязательно найдутся, если следовать п.1.

Ну а теперь про качества этого самого идеального программиста.
Личные [...]]]></description>
			<content:encoded><![CDATA[<p>Давно хотел написать свои мысли про качества современного веб-программиста. Но все никак не мог сформулировать. Сейчас после утоления кадрового голода нашей студией все как-то встало на свои места. Я сделал для себя 2 вывода:</p>
<ol>
<li>Хороших сотрудников нужно искать постоянно.</li>
<li>Хорошие сотрудники есть и они обязательно найдутся, если следовать п.1.</li>
</ol>
<p>Ну а теперь про качества этого самого идеального программиста.<strong></strong></p>
<p><strong>Личные качества</strong></p>
<p><em>Неконфликтность, дружелюбность</em>. Представьте: заказчик &#8211; это приложение, проект-менеджер &#8211; драйвер, программист &#8211; биос. Приложения обычно не обращаются к биосу напрямую, они используют для этого драйверы. Биос выполняет допустимые команды драйвера и не конфликтует ни с драйвером, ни с приложением. Такой конфликт в компьютере приводит к синему экрану смерти. Программист должен осознавать свою роль как специалиста в программной части сайта и роль менеджера как своего защитника перед необузданной фантазией заказчика. Программист должен понимать, что менеджер &#8211; это его соратник, с которым они могут сделать проект лучше и качественнее.</p>
<p><em>Ответственность, исполнительность</em>. Каждый участник команды, создающей сайт отвечает за свою сферу. На практике это сводится к адекватной оценке сроков выполнения своей задачи и гарантии, что они не будут сорваны. Также сюда можно включить личную  моральную (да да да, как это не смешно) ответственность программиста за качество работы. Дело в том, что без личного положительного отношение программиста к своему труду и его результату не получится сделать хорошего сайта. Именно поэтому у нас не прижилась практика формирования подробного ТЗ на сайты. Нужно просто-напросто все делать круто. Это единственный критерий, который формируется всей командой длительное время.</p>
<p><em>Чувство юмора</em>. Уныние &#8211; грех. Все унылые люди должны работать в сберкассах и в отделениях связи. К этому я уже привык при оплате ЖКХ. Делать сайты нужно весело. Мы работаем в современной, динамичной сфере. По интернету бродят Медведы, Упячки, Онотоле, Трололо и прочие замечательные мемы. Несколько раз в день есть повод для бугага. Если во время работы сотрудник не может со всеми тупо поржать &#8211; это не значит, что он серьезный спец. У него просто проблемы с социализацией, а такие не могут работать в команде.</p>
<p><em>Адекватное ЧСВ</em>. Часто у программистов с этим проблемы. Ведь в этом непонятном коде мало кто че понимает. Вот и возникает ощущение что ты шаман и делаешь всегда все правильно. А тут эти неорганизованные менеджеры лезут с доработками. Хотя щас становится все лучше. Технологии так быстро развиваются, что даже сисадмины уже не могут годами пить пиво, глядя на настроенный сервер. Перемены делают айтишников постоянными студенами, а значит постоянными недоучками. Вот такой нам и нужен &#8211; вечный ученик.</p>
<p><strong>Профессиональные навыки</strong></p>
<p><em>PHP/MySQL</em>. Если вы не родились со знанием PHP &#8211; его просто нужно выучить. На это нужно время. Мне на это понадобилось года 2. Одаренная молодежь я думаю за годик управится. Мы не можем учить PHP программиста в офисе. Нет, я не КО, я реально получил много резюме от людей на должность PHP программиста, не знающих PHP. Знать язык &#8211; это не значит досконально знать синтаксис. Нужно уметь решить любую задачу с использованием языка. Неважно на сколько грамотно, главное быстро и прозрачно.</p>
<p><em>Фреймворки, сервисы, новинки</em>. Программист должен быть в курсе происходящего вокруг него. Он должен просто пожирать все новую и новую информацию. Не читаете IT блоги, не следите за развтием Гугла, не знаете тенденции стартапов &#8211; во просто IT мусор, милый старый Wall-E, не более. Быть в курсе очень трудно. Это тоже работа. Нужно следить за развитием PHP, JS, CSS фреймворков, всякими API, появлением новых технологий, долей IE6, кармой Boomburuma.</p>
<p><em>HTML/CSS</em>. Веб-программист должен уметь верстать. Да, вот прям взять PSD макет и сварганить HTML, CSS и кучу картинок. Если человек работает в этой сфере и не верстает или просто &laquo;читает&raquo; HTML &#8211; он профнепригоден. Конечно такие слова могут обидеть серьезных спецов, считающих, что верстка &#8211; это удел дизайнеров или низкоквалифицированных верстальщиков. Но правда состоит в том, что верстка HTML страницы &#8211; это программирование на языке HTML и CSS. Это часть вашего кода, которая должна работать вместе с серверными скриптами как оркестр. Современный сайт невозможен без тесной интеграции сервера и клиента. И все чаще функционал переползает на клиента.</p>
<p><em>Javascript</em>. Не знаете javascript? Наверное вы пишете парсеры и серверные API. Если это не так &#8211; вы профнепригодны. Для веб-программиста должен быть открыт  мир jquery, mootools и других замечательных фреймворков. Веб-приложения прекрасно стилизуются с помощью jqueryui. А ведь веб-приложения &#8211; это будущее. Эт тенденция. Сайты постепенно превращаются в агрегаторы различных API. Еще пара лет и вы забудете что такое аплоад файлов на сервер. Вместо этого будут сервисы хранения, сервисы обработки и сервисы отдачи данных. И этому учиться нужно уже сегодня.</p>
<p>Идеальный программист &#8211; это не какой-то супер человек, все это умеющий и обладающий всеми перечисленными качествами. Такие люди есть и у нас в городе. Но как правило они испорчены другими работодателями ввиду отсутствия стимулов к развитию. А главный стимул &#8211; интересные и сложные, даже невозможные задачи. В поточном сайтостроительстве от программиста многого не требуется. На тебе верстку, на тебе bitrix/umi/netcat &#8211; прикрути все это. Отсюда и термины, в которых программисты описывают свою работу: прикрутить модуль, собрать сайт, натянуть дизайн, поднять на движке, установить шаблон. Все это задачи не для программистов. Это низкоквалифицированный труд, и оплачиваться он должен скудно. Нам нужны, если говорить юридически, законодатели, а не правоприменители.</p>
<p>Выводы я делал на основе полученных резюме и общения с кандидатами, а также своего субъективного восприятия профессии. Надеюсь, что студент с горящими глазами прочитает это и напишет письмо с предложением сотрудничества <img src='http://blog.magwai.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.magwai.ru/451/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Автоматизация разметки областей</title>
		<link>http://blog.magwai.ru/423/</link>
		<comments>http://blog.magwai.ru/423/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 22:37:28 +0000</pubDate>
		<dc:creator>m4a1</dc:creator>
				<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://blog.magwai.ru/?p=423</guid>
		<description><![CDATA[Делали мы недавно сайт. Местный. Корпоративный. Про недвижимость. Все ничего, но заказчику нужны интерактивные планы поселков. Вот как-то так:

Чтоб при наведении на участок всплывало окошко и сам участок подсвечивался. Как видите границы участка у них проходят не по меридианам как у африканских государств, а могут быть произволной формы.
Решения тут 2 (ну если не усложнять):
- Флэшер. [...]]]></description>
			<content:encoded><![CDATA[<p>Делали мы недавно сайт. Местный. Корпоративный. Про недвижимость. Все ничего, но заказчику нужны интерактивные планы поселков. Вот как-то так:</p>
<p><a href="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_1.jpg"><img class="alignnone size-full wp-image-424" title="cu_1" src="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_1.jpg" alt="cu_1" width="599" height="378" /></a></p>
<p>Чтоб при наведении на участок всплывало окошко и сам участок подсвечивался. Как видите границы участка у них проходят не по меридианам как у африканских государств, а могут быть произволной формы.</p>
<p>Решения тут 2 (ну если не усложнять):</p>
<p>- Флэшер. Либо дилетант, который зафигачит карту и зашьет туда все данные по участкам. Либо профи, который организует ajax подгрузку контента.</p>
<p>- Карта на javascript/css/html с подгрузкой контента с сервера.</p>
<p>Проблема в обоих случаях будет одна и та же. Как наносить на карту участки? Я думаю существует немало решений этого вопроса. Хочу рассказать как его решали мы.</p>
<p>Писали мы для одного сайта такой контрол в админку, который позволяет отмечать на картинке точки и сохранять координаты в БД. Вот так, например:</p>
<p><a href="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_2.jpg"><img class="alignnone size-full wp-image-425" title="cu_2" src="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_2.jpg" alt="cu_2" width="600" height="446" /></a></p>
<p>Ничего особенного. Просто при заполнении описания девушки на большой картинке ставится точка, которая будет якорем для описания.</p>
<p>Функционал контрола был расширен до возможности не просто указывать точки, а еще делать из них полигон произвольной формы. Вот так происходит разметка сложной фигуры программиста в панели управления:</p>
<p><a href="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_3.jpg"><img class="alignnone size-full wp-image-426" title="cu_3" src="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_3.jpg" alt="cu_3" width="600" height="392" /></a></p>
<p>После завершения фигуры с сервера подгружается пнгшка, отрисованная по коодинатам точек</p>
<p><a href="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_4.jpg"><img class="alignnone size-full wp-image-427" title="cu_4" src="http://blog.magwai.ru/wp-content/uploads/2010/04/cu_4.jpg" alt="cu_4" width="600" height="395" /></a></p>
<p>Ну я не отличаюсь аккуратностью выделения объектов, как это видно из картинки, однако идея я думаю понятна, тем более участки на плане поселка несколько &laquo;поквадратнее&raquo; и их легче обозначить.</p>
<p>Все, объект сохранен в базе. Осталось его показать посетителям сайта.</p>
<p>Для этого делаем прозрачную картинку, размером с фотографию, которую размечали. К этой картинке прикрепляем MAP cкучей AREA типа POLY. Координаты берем из базы. Для красоты на движения мыши навешиваем подгрузку прозрачной пнгшки, где цветом залита выделенная область и получаем что-то типа вот этого:</p>
<p><a href="http://zdemo.magwai.ru/point">http://zdemo.magwai.ru/point</a></p>
<p>Вот так еще один флэшер остался без обеда, а мы пополнили свою копилу еще одним полезным контролом и техникой подсветки областей нестандартной формы.</p>
<p>Весь исходный код этого и других примеров доступен с <a href="http://github.com/magwai/">http://github.com/magwai/</a>. Также на скорую руку сделан сайт о zkernel &#8211; ядре, на котором основан код наших сайтов: <a href="http://zdemo.magwai.ru/">http://zdemo.magwai.ru/</a>. Он будет пополняться новыми примерами и описаниями работы zkernel. Исходный код этого сайта также доступен в репозитории на github.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.magwai.ru/423/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Теперь наш код будет на 70% веселее</title>
		<link>http://blog.magwai.ru/397/</link>
		<comments>http://blog.magwai.ru/397/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 21:31:09 +0000</pubDate>
		<dc:creator>m4a1</dc:creator>
				<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://blog.magwai.ru/?p=397</guid>
		<description><![CDATA[Чем лучше программная основа сайта, там она менее заметна. Она не должна ничего навязывать. Ни посетителю сайта, ни его проектировщикам. Отстутствие технических ограничений &#8211; залог создания уникальных и красивых сайтов.
Вот список текущих (на мой взгляд) тенденций веб-разработки:
- Возрастающая динамичность сайтов: ajax, json, canvas, svg, js фреймворки.
- Важность клиентской оптимизации: сжатие js, css, корректные заголовки, кэширование [...]]]></description>
			<content:encoded><![CDATA[<p>Чем лучше программная основа сайта, там она менее заметна. Она не должна ничего навязывать. Ни посетителю сайта, ни его проектировщикам. Отстутствие технических ограничений &#8211; залог создания уникальных и красивых сайтов.</p>
<p>Вот список текущих (на мой взгляд) тенденций веб-разработки:</p>
<p>- <strong>Возрастающая динамичность сайтов</strong>: ajax, json, canvas, svg, js фреймворки.</p>
<p>- В<strong>ажность клиентской оптимизации</strong>: сжатие js, css, корректные заголовки, кэширование статики, спрайты, быстродействие селекторов в css.</p>
<p>- <strong>Интеграция различных веб-сервисов</strong>: google (карты, календари, контакты), picasa, panoramio, всякие фиды (rss, atom), twitter, авторизация по openid.</p>
<p>- <strong>Медиа возможности</strong>: интеграция видеоплееров, хранение видео в аккаунте youtube, потоковые трансляции, интеграция javascript и flash интерфейсов.</p>
<p>- <strong>Повышение универсальности программной части сайтов</strong>. Возможность совместной работы над проектом, а также стандартизация библиотек. Ворастающая роль open source.</p>
<p>Как со всем этим жить? Сложно. Нужно постоянно развиваться, быть в курсе тенденций, развития библиотек, узнавать о появлении новых плагинов в этим библиотекам, быстро все это интегрировать и использовать новшества как конкурентные преимущества.</p>
<p>Как мы отвечаем на все эти вызовы? Изменяемся. Постоянно пробуем новое. Сначала мы хотели <strong>развивать свои наработки</strong> в полноценную CMS. У меня есть опыт создания и развития движка сайта. Начался он конечно на предыдущем месте работы: веб-студии Интерволги. Где для нужд портала <a href="http://volga34.ru">volga34.ru</a> был написан движок kernel (iKernel вроде сейчас продолжает существовать на нескольких десятках сайтов, ну и на Волге34 естественно). Но то был именно &laquo;движок&raquo;, набор скриптов с навешенной на них админкой. На основе заложенных в него идей я попытался сделать CMS. Хотелось в 2 клика создавать сайты. Результат: <a href="http://vizitka.magwai.ru">vizitka.magwai.ru</a>. Продукт, подзабытый нами ввиду отказа от создания неадекватно дешевых сайтов. В пике своего развития на нем были написаны сайты: <a href="http://modno-byt-rebenkom.ru">modno-byt-rebenkom.ru</a>, <a href="http://rabota498.ru">rabota498.ru</a>, <a href="http://viaborse.ru">viaborse.ru</a>.</p>
<p>Но последние полгода сильно изменили рынок веб-разработки. На рынок ворвался <strong>битрикс</strong> с системами для всех ниш. Пробовали его, поняли что не наше это. Безусловно как инструмент для создания корпоративных порталов он хорош. Ну вот нужно сделать сайт универа &#8211; пожалуйста. Нужно интернетизировать гос. орган &#8211; битрикс однозначно. Но делать на нем что-то изящное, такое знаете, чтобы там кнопочки чпок чпок, картиночки жик жик, твиттер+picasa+гугмапс &#8211; нее это не для битрикс. Битрикс &#8211; это танк, а мы же делаем порше.</p>
<p>Постепенно сформировались требования к программной основе сайтов нашей студии:</p>
<p>- <strong>Не должна накладывать ограничений на программиста</strong>, делая раработку нестандартного функционала слишком трудоемкой.</p>
<p>- <strong>Не должна заставлять проект-менеджеров думать в рамках системы</strong>. Чтобы новости могли быть не только списком сверху вниз, но и по кругу и летать могли, и прыгать. Чтобы не было понятия модуль, блок, сетка. Выдали на верстку Джаконду &#8211; программируем Джаконду, чтоб не только смотрела загадочно, но и подмигивала.</p>
<p>- <strong>Должна быть стабильна, масштабируема и модульна</strong>. По себе заметил, что пик эффективности разработки наступает через пол года после освоения библиотеки. Важно, чтобы за пол года библиотека не оказалась на обочине прогресса. Мы не можем рассчитывать на то, что модно. Нужны проверенные технологии.</p>
<p>- <strong>Должна иметь возможность развития</strong> силами нескольких или даже многих людей. Всегда нужны свежие идеи, вытеснение быдлокода.</p>
<p>- <strong>Должна быть бесплатна</strong>. Мы не можем позволить себе оказаться неконкурентными из-за несоответствия стоимости лицензии и потребностей заказчика. Заказчик должен платить за наш труд и бренд, но не за нашу неспособность развивать собственные технологии.</p>
<p>Итак, мы выбираем <strong>ZendFramework. </strong>Эта библиотека отвечает всем указанным требованиям. Переход на нее планировался 6 месяцев, 3 из которых были посвящены разработке собственной среды (оболочки) для удобного сайтостроения и интеграции компонентов ZendFramework с десятками других библиотек. Эта оболочка была оформлена в виде отдельной библиотеки, включающей в себя множество php классов для задач: построения панели управления, работы с графикой, javascript, css, множество js компонент (jqueryui, datagrid, colorpicker, uploadify&#8230;). Название этой надстройки над Zend &#8211; <strong>Zkernel</strong>.</p>
<p>Zkernel лицензирована как опенсорс. Под самую открытую лицензию &#8211; MIT. Для проекта создан репозиторий на <strong><a href="http://github.com/magwai/zkernel/">github</a></strong>. Исходный код ядра наших сайтов может быть просмотрен кем угодно, и кем угодно использован для создания своих сайтов или интеграции в другие системы.</p>
<p>ZendFramework будет использован на всех последующих сайтах студии. Ну а в данный момент мы можем продемонстрировать достаточно крупный интернет-магазин, написанный полностью на новой системе: <strong><a href="http://palerom.ru">palerom.ru</a></strong>. Это хороший пример для демонстрации возможностей движка, потому что на Палероме есть все: корзина заказов, видео, формы чата,  каталог на несколько тысяч позиций, поиск с использованием Lucene, генерация xls прайса, система управления с разделением прав на админов и менеджеров, система рассылок и внутренняя почта сайта.</p>
<p>Ааа, только не спрашивайте нас больше, что у нас за CMS. У нас нет и не будет CMS! Увы, пока не сделали станок для создания шедевров живописи. Неужели вы думаете, что кто-то уже написал для него идеальную программу?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.magwai.ru/397/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Разгрузка сервера</title>
		<link>http://blog.magwai.ru/81/</link>
		<comments>http://blog.magwai.ru/81/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 17:37:36 +0000</pubDate>
		<dc:creator>m4a1</dc:creator>
				<category><![CDATA[Веб-сайты]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[нагрузка]]></category>
		<category><![CDATA[сервер]]></category>

		<guid isPermaLink="false">http://blog.magwai.ru/?p=81</guid>
		<description><![CDATA[Наконец добрались руки до нашего сервера magwai.ru. С каждым месяцем количество размещенных на нем сайтов растет. Растет и нагрузка: периодические DDoSы, гигабайты скачиваемой статики, частые пиковые загрузки канала.
Последнее время узким местом сервера стала его способность отдавать миру несколько десятков гигабайт картинок в сутки, так как мы хостим проект, генерирующий кучу подобного траффика и попутно других [...]]]></description>
			<content:encoded><![CDATA[<p>Наконец добрались руки до нашего сервера magwai.ru. С каждым месяцем количество размещенных на нем сайтов растет. Растет и нагрузка: периодические DDoSы, гигабайты скачиваемой статики, частые пиковые загрузки канала.</p>
<p>Последнее время узким местом сервера стала его способность отдавать миру несколько десятков гигабайт картинок в сутки, так как мы хостим проект, генерирующий кучу подобного траффика и попутно других проблем. Решение у меня появилось уже давно благодаря нескончаемым постам на хабре. Это nginx. Но подступиться к нему было боязно: все-таки сервер у нас один и находится он не в одной тысяче километров отсюда. Но когда-то нужно было начинать. Итак, сейчас мы имеем прекрасную связку apache2 + nginx 0.7. Все оказалось невероятно просто: ставим nginx, убрав все лишнее из опций сборки, переводим апач с порта 80 на порт 8888, пишем правила в nginx.conf, которые делают его ответственным за всю статику, все динамическое перенаправляем на тяжелый апач.</p>
<p>Результат поражает. Нагрузка на процессор снизилась раз в 10. Время открытия страниц сократилось в 4 раза, все заголовки статики в норме, все что нужно сжимается gzipом. Субъективно сайты с нашего сервера просто летают. Ну как пример можно покликать по magwai.ru. В логах апача осталось только то, что требует php &#8211; все остальное отдает nginx.</p>
<p>Рекомендую всем, кто думает о покупке еще одного сервера <img src='http://blog.magwai.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.magwai.ru/81/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Сжатие JavaScript и CSS</title>
		<link>http://blog.magwai.ru/8/</link>
		<comments>http://blog.magwai.ru/8/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 06:49:17 +0000</pubDate>
		<dc:creator>m4a1</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://blog.magwai.ru/?p=8</guid>
		<description><![CDATA[Проблему отдачи JavaScript и CSS уже много раз обсуждали и есть множество готовых решений для этого. Я бы хотел рассказать как это делается в наших сайтах и почему я выбрал именно этот способ.
Что я пробовал для JavaScript:
1. Хранить minified версии нужных скриптов на сервере, а при отдаче клиенту склеивать их в один файл, затем сохранять [...]]]></description>
			<content:encoded><![CDATA[<p>Проблему отдачи JavaScript и CSS уже много раз обсуждали и есть множество готовых решений для этого. Я бы хотел рассказать как это делается в наших сайтах и почему я выбрал именно этот способ.</p>
<p>Что я пробовал для JavaScript:</p>
<p>1. Хранить minified версии нужных скриптов на сервере, а при отдаче клиенту склеивать их в один файл, затем сохранять его в кэше. При последующих обращениях склеенный файл просто отдается как статика с корректными заголовками и e-tagом от апача. Именем файла является md5 от всех имен подключенных скриптов. Недостатком является &laquo;немобильность&raquo; кэша. Единожды созданный он разрастается до больших размеров при изменении исходных файлов и по сути на каждую версию скриптов создается по файлу &#8211; плохо для разработки. Также отсутствует контроль заголовков скрипом сайта.</p>
<p>2. При загрузке страницы делать запрос на JavaScript, в котором закодированы имена всех нужных файлов. Сервер отдает JavaScript динамически с проставлением нужных заголовков. Недостаток &#8211; нечитаемый и длинный URL для JavaScript, ограничение на длину запроса (т. е. нельзя подключить много скриптов).</p>
<p>3. Используемый сейчас метод. Сжатие вообще всех JavaScript сайта с помощью установки хэндлера апач.</p>
<p>Action mh &laquo;/x_gs/&raquo;<br />
AddHandler mh .css .js</p>
<p>То есть любой скрипт будет обработан php скриптом по адресу /x_gs/. Там происходит сжатие скрипта с помощью yuicompressor и его отдача. При этом контролируются все заголовки: Expires устанавливается на месяц вперед, Last-modified равен дате изменения файла скрипта, e-tag &#8211; md5 от имени файла + дата модификации Все это обжимается gzip. При повторном запросе проверяется e-tag и last-modified. Это позволяет при последующих обращениях отдавать только 304 ответ. У этого подхода есть недостаток &#8211; при большом количестве посещений можно нагрузить сервер сжатием yuicompressor. Например jquery 1.3.2 в среднем жмется около 500 мс &#8211; очень долго. Для обхода этой проблемы сжатый скрипт кэшируется в memcached с ключем &#8211; именем файла + дата модификации, что позволяет использовать такое кэширование на всем сервере сразу, а не в рамках отдельного сайта. Если на хостинге нет java &#8211; используется JSMin.</p>
<p>Что я пробовал для CSS:</p>
<p>Практически то же самое, за исключением той особенности CSS, что нельзя просто склеить все цсски в 1 файл, если они из разных каталогов, так как background картинки в них прописываются относительно положения файлов. Сейчас CSS отдается так же как и JavaScript. Сжимается тем же yuicompressor. Если нет java &#8211; CSSTidy.</p>
<p>Результат очень неплох. Размер скриптов минимален. Разработку вести удобно, так как нет кэшей, которые бы не зависили от времени изменения файла. Никаких каталогов к эшами. Нагрузка на сервер упала, так как в большинстве случаев видим 304 ответ. Особенно приятно видеть, что сжимается не только то что я использую на самом сайте, но и скрипты MCE/FCK редакторов в панели управления.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.magwai.ru/8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
