<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Insight IT</title><link>https://www.insight-it.ru/</link><description></description><atom:link href="https://www.insight-it.ru/tag/html/feed/index.xml" rel="self"></atom:link><lastBuildDate>Thu, 20 Sep 2012 20:16:00 +0400</lastBuildDate><item><title>Вакансии: PHP и Python разработчики в Киеве</title><link>https://www.insight-it.ru//vacancy/2012/vakansii-php-i-python-razrabotchiki-v-kieve/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Киевская команда разработчиков игр для социальных и мобильных платформ
Level UP ищет опытных специалистов по
веб-разработке на Python и PHP.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="senior-python-developer"&gt;Senior Python Developer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработка высоконагруженных веб-приложений;&lt;/li&gt;
&lt;li&gt;Разработка внутренних и публичных API;&lt;/li&gt;
&lt;li&gt;Разработка архитектуры комплексных сервисов;&lt;/li&gt;
&lt;li&gt;Конвертирование бизнес-задач в технические решения (R&amp;amp;D).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Требования:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Опыт разработки на &lt;strong&gt;Python&lt;/strong&gt; более 3х лет;&lt;/li&gt;
&lt;li&gt;Сильные навыки применения реляционных и нереляционных баз данных;&lt;/li&gt;
&lt;li&gt;Опыт в разработке высоконагруженных веб-приложений;&lt;/li&gt;
&lt;li&gt;Дружба с &lt;strong&gt;Linux&lt;/strong&gt; и &lt;strong&gt;Git&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Хорошее знание клиентских технологий (HTML, CSS, Javascript);&lt;/li&gt;
&lt;li&gt;Опыт работы в команде.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Плюсом будет:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Опыт разработки комплексных проектов на &lt;strong&gt;PHP&lt;/strong&gt; или серверном
    &lt;strong&gt;Javascript&lt;/strong&gt; &lt;em&gt;(node.js)&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Опыт разработки инструментов для верстки, автоматизации верстки,
    шаблонизаторов и пр.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="senior-php-developer"&gt;Senior PHP Developer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработка высоконагруженных социальных веб-приложений;&lt;/li&gt;
&lt;li&gt;Работа в небольшой дружной команде до 15 человек;&lt;/li&gt;
&lt;li&gt;Решение нетривиальных задач и создание инструментов для внутреннего
    использования;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Требования:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Опыт разработки на &lt;strong&gt;PHP&lt;/strong&gt; более 3х лет;&lt;/li&gt;
&lt;li&gt;Опыт работы с &lt;strong&gt;MySQL&lt;/strong&gt; и &lt;strong&gt;MongoDB&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Опыт в разработке высоконагруженных веб-приложений;&lt;/li&gt;
&lt;li&gt;Дружба с &lt;strong&gt;Linux&lt;/strong&gt; и &lt;strong&gt;Git&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Хорошее знание клиентских технологий (HTML, CSS, Javascript);&lt;/li&gt;
&lt;li&gt;Опыт примененения функционарного и юнит тестирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Плюсом будет:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Опыт разработки на &lt;strong&gt;Python&lt;/strong&gt; или серверном &lt;strong&gt;Javascript&lt;/strong&gt;
&lt;em&gt;(nodejs)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usloviia-dlia-oboikh-vakansii"&gt;Условия для обоих вакансий&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Зарплата в диапазоне &lt;strong&gt;\$2500-4000&lt;/strong&gt; в месяц по результатам
    собеседования;&lt;/li&gt;
&lt;li&gt;Полный рабочий день в &lt;strong&gt;Киевском офисе&lt;/strong&gt;, иногородним помощь с
    переездом;&lt;/li&gt;
&lt;li&gt;За успешную рекомендацию специалиста по данным вакансиям компания
    выплачивает&amp;nbsp;&lt;strong&gt;бонус в размере $1000&lt;/strong&gt; так что сообщите своим
    знакомым, кому-то это может быть интересно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zainteresovalo"&gt;Заинтересовало?&lt;/h2&gt;
&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Не лишним будет, если кроме резюме Вы напишите - почему Вам нравится
серверная разработка на Python или PHP и почему Вам интересна данная
вакансия. Плюс упомяните, пожалуйста, что Вы узнали о данной вакансии
через &lt;strong&gt;Insight IT&lt;/strong&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 20 Sep 2012 20:16:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-09-20:vacancy/2012/vakansii-php-i-python-razrabotchiki-v-kieve/</guid><category>css</category><category>Git</category><category>html</category><category>JavaScript</category><category>Level UP</category><category>Linux</category><category>MongoDB</category><category>MySQL</category><category>node.js</category><category>PHP</category><category>Python</category><category>вакансии</category><category>Киев</category></item><item><title>Вакансии: команда IT-звезд</title><link>https://www.insight-it.ru//vacancy/2012/vakansii-komanda-it-zvezd/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Благодаря сайту &lt;strong class="trebuchet"&gt;Insight IT&lt;/strong&gt;, компания
RDM-Soft нашла ОТЛИЧНОГО тимлида! Теперь, &lt;a href="https://www.insight-it.ru/vacancy/2012/vakansiya-php-polkovodec/"&gt;тимлидер&lt;/a&gt; ищет в свою команду&amp;nbsp;единомышленников и просто IT-звезд.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="o-kompanii"&gt;О компании&lt;/h2&gt;
&lt;p&gt;История компании началась в 2003 году. С этого момента выпущено много
проектов. Некоторыми из них Вы, возможно, так или иначе пользовались.
Сейчас запускается еще один проект:&amp;nbsp;&lt;strong&gt;SEO-биржа&lt;/strong&gt;. У Вас
есть прекрасная возможность оказаться у истоков будущего хита!&lt;/p&gt;
&lt;h2 id="kto-nuzhen"&gt;Кто нужен?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mr. Backend.&lt;/strong&gt; Он же программист.&amp;nbsp;&lt;em&gt;(вакансия закрыта)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Мастер-ломастер.&lt;/strong&gt; Он же инженер по контролю качества, проще
    говоря тестер.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dr. Frontend.&lt;/strong&gt; Он же фронтендщик. &lt;em&gt;(вакансия закрыта)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mr-backend"&gt;Mr. Backend&lt;/h3&gt;
&lt;h4&gt;Требования&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Отличные знания: &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;ООП&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, &lt;strong&gt;MVC&lt;/strong&gt;,
    &lt;strong&gt;ZendFramework&lt;/strong&gt; (либо альтернатив), &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Опыт работы по специальности: от 3 лет.&lt;/li&gt;
&lt;li&gt;Опыт работы в команде.&lt;/li&gt;
&lt;li&gt;Желание развиваться и изучать новое.&lt;/li&gt;
&lt;li&gt;Отсутствие желания искать работу в ближайшие 3 года.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Задачи&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Разработка серверной части проекта.&amp;nbsp;Включает в себя :&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;/li&gt;
&lt;/ul&gt;
&lt;h3 id="master-lomaster-sqa"&gt;Мастер-Ломастер (SQA)&lt;/h3&gt;
&lt;h4&gt;Требования&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Хорошие знания: &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Отличные знания принципов whitebox и blackbox тестирования.&lt;/li&gt;
&lt;li&gt;Опыт работы по специальности: от 2 лет.&lt;/li&gt;
&lt;li&gt;Опыт работы в команде.&lt;/li&gt;
&lt;li&gt;Желание развиваться и изучать новое.&lt;/li&gt;
&lt;li&gt;Отсутствие желания искать работу в ближайшие 3 года.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Задачи&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Написание юнит-тестов, автотестов.&lt;/li&gt;
&lt;li&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;li&gt;безопасности.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;В общем, тоже очень много интересной работы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dr-frontend"&gt;Dr. Frontend&lt;/h3&gt;
&lt;h4&gt;Требования&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Понимание, как сделать интерфейс удобным и приятным для пользователя&lt;/li&gt;
&lt;li&gt;Отличные знания: &lt;strong&gt;HTML&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, &lt;strong&gt;JavaScript&lt;/strong&gt;&amp;nbsp;(jQuery, ExtJS
    или других распространенных библиотек)&lt;/li&gt;
&lt;li&gt;Опыт проектирования и реализации пользовательского интерфейса&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Задачи&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Прототипирование UI сервиса&lt;/li&gt;
&lt;li&gt;Реализация спроектированного UI&lt;/li&gt;
&lt;li&gt;Разработка расширений&amp;nbsp;для Firefox и Chrome.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usloviia_1"&gt;Условия&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Удаленная работа.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Работа в профессиональной команде.&lt;/li&gt;
&lt;li&gt;Полный рабочий день (5 дней в неделю по 8 часов).&lt;/li&gt;
&lt;li&gt;Карьерный и профессиональный рост.&lt;/li&gt;
&lt;li&gt;Прислушивание к Вашему мнению.&lt;/li&gt;
&lt;li&gt;Зарплата по результатам собеседования:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mr. Backend:&lt;/strong&gt;&amp;nbsp;от $1500 до $2000&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Мастер-Ломастер:&lt;/strong&gt;&amp;nbsp;от $700 до $1500&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dr. Frontend:&lt;/strong&gt; от $1000 до $2000&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 04 May 2012 18:20:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-05-04:vacancy/2012/vakansii-komanda-it-zvezd/</guid><category>css</category><category>html</category><category>JavaScript</category><category>JQuery</category><category>PHP</category><category>RDM-soft</category><category>SQA</category><category>ZendFramework</category><category>вакансии</category></item><item><title>Повторное использование шаблонов</title><link>https://www.insight-it.ru//interactive/2012/povtornoe-ispolzovanie-shablonov/</link><description>&lt;blockquote&gt;
&lt;p&gt;Лень - двигатель прогресса&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Сегодня мы рассмотрим способ, позволяющий немного упростить себе жизнь
при создании &lt;a href="https://www.insight-it.ru/interactive/"&gt;интерактивного сайта&lt;/a&gt;&amp;nbsp;путем повторного использования шаблонов. Визуально результат будет примерно таким же, как при дублировании бизнес-логики в браузере, но ценой существенно меньших
трудозатрат на разработку JavaScript-клиента, да и на серверной части
тоже. Хотите узнать как это провернуть?&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Небольшая ремарка, чтобы не было недопонимания из-за терминологии:&lt;/p&gt;
&lt;div class="card blue lighten-4"&gt;
&lt;div class="card-content"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Шаблон&lt;/strong&gt;&amp;ensp;&lt;em&gt;(template)&lt;/em&gt; : HTML-документ с расширенным набором тегов,
    которые впоследствии используются для подстановки динамических
    данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Шаблонизатор&lt;/strong&gt;&amp;ensp;&lt;em&gt;(templating engine)&lt;/em&gt; : библиотека, позволяющая на
    основе &lt;em&gt;шаблона&lt;/em&gt; (использующего определенный синтаксис
    дополнительных тегов) и &lt;em&gt;динамических данных&lt;/em&gt; получить итоговый
    HTML-документ, пригодный для отображения в браузере.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Рендеринг&lt;/strong&gt;&amp;ensp;&lt;em&gt;(rendering)&lt;/em&gt; : в данном контексте &amp;mdash; процесс, которым занимается шаблонизатор.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="obshchii-printsip"&gt;Общий принцип&lt;/h2&gt;
&lt;p&gt;Чтобы сразу в голове сложилась нужная картина, начнем с дополненной
схемы из статьи про &lt;a href="https://www.insight-it.ru/interactive/2012/arkhitektura-interaktivnykh-sajjtov/"&gt;архитектуру интерактивных сайтов&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Повторное использование шаблонов" class="responsive-img" src="https://www.insight-it.ru/images/templates.jpeg" title="Повторное использование шаблонов"/&gt;&lt;/p&gt;
&lt;p&gt;Если вкратце, то стандартный интерфейс внутренних сервисов, скрывающихся
за блоком &lt;strong&gt;"Бизнес-логика"&lt;/strong&gt;, можно реализовать таким образом, чтобы он
возвращал все необходимые данные для рендеринга шаблона плюс его имя.
База &lt;strong&gt;шаблонов&lt;/strong&gt; у всех общая, у каждого уникальное имя, каждый сервер
интерфейсов (обоих) держит по копии всех шаблонов в памяти.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML интерфейс&lt;/strong&gt; просто разбирает HTTP-запросы, отправляет на его
основе сообщение(ия) внутренним сервисам, получает в ответ имя шаблона и
данные для его заполнения, с помощью &lt;strong&gt;шаблонизатора&lt;/strong&gt; рендерит итоговый
&lt;a href="/tag/html/"&gt;HTML&lt;/a&gt; и отдает браузеру или роботу.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Интерфейс сериализованных данных&lt;/strong&gt;&amp;ensp;&lt;em&gt;(если он, как и обсуждалось ранее,
работает через &lt;a href="https://www.insight-it.ru/interactive/2012/postoyannoe-soedinenie-mezhdu-brauzerom-i-serverom/"&gt;постоянное соединение с браузером&lt;/a&gt;)&lt;/em&gt;&amp;nbsp;каждому
подключившемуся клиенту первым делом отправляет
&lt;a href="/tag/json/"&gt;JSON&lt;/a&gt;-объект с шаблонами, по крайней мере если их не особо
много, иначе лучше "по запросу". При действии пользователя
JavaScript-клиент отправляет сообщение с информацией, на его основе
интерфейс сериализованных данных передает то же самое (а может и как-то
модифицированное) сообщение внутреннему сервису, также получает в ответ
имя шаблона и данные и перенаправляет их клиенту (возможно
сконвертировав в другой формат). Клиенту остается передать их своему
шаблонизатору и заменить результатом его работы какую-то часть уже
имеющегося в окне браузера HTML-документа.&lt;/p&gt;
&lt;h2 id="rendering"&gt;Рендеринг&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Шаблонизаторов&lt;/strong&gt; сейчас доступно огромное количество под любую
платформу, с разной производительностью и возможностями, но чтобы
воплотить эту стратегию в жизнь подойдут далеко не все. Два основных
требования:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Отсутствие внешних вызовов при рендеринге&lt;/em&gt;, то есть на входе только
    данные, если используются какие-то фильтры или что-то такое - они
    должны быть частью шаблонизатора.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Шаблонизатор должен иметь реализацию на JavaScript&lt;/em&gt;, так как будет
    исполняться в том числе и в браузере.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Да, многофункциональные шаблонизаторы вроде &lt;a href="/tag/jinja2/"&gt;Jinja2&lt;/a&gt; - это
очень удобно, но конкретно в данном случае богатый ассортимент
возможностей не уместен. Наиболее известный &lt;em&gt;кроссплатформенный&lt;/em&gt;
шаблонизатор, не обремененный ничем лишним, называется
&lt;strong&gt;&lt;a href="https://www.insight-it.ru/goto/89b84f30/" rel="nofollow" target="_blank" title="http://mustache.github.io/"&gt;mustache&lt;/a&gt;&lt;/strong&gt;. С его использованием иногда
получаются довольно замысловатые конструкции, но зато он отлично
подходит под этот сценарий использования и прост как три копейки,
изучить можно за 5 минут, &lt;em&gt;рекомендую&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;В этой схеме напрашивается использование &lt;a href="/tag/node-js/"&gt;node.js&lt;/a&gt; для
реализации &lt;strong&gt;HTML-интерфейса&lt;/strong&gt;, что откроет доступ к многочисленным
шаблонизаторам, &lt;a href="https://www.insight-it.ru/goto/261edaf6/" rel="nofollow" target="_blank" title="https://github.com/joyent/node/wiki/modules#wiki-templating"&gt;реализованным исключительно на JavaScript&lt;/a&gt;.
Тем более кроме рендеринга шаблонов эта часть проекта практически ничего
и не делает. В качестве бонуса требование про отсутствие внешних вызовов
станет не таким строгим, да и в целом, если минималистичное решение
вроде &lt;a href="/tag/mustache/"&gt;mustache&lt;/a&gt;&amp;nbsp;по каким-то идеологическим соображениям
не устраивает - любой написанный для node.js шаблонизатор наверняка
станет отличным выходом.&lt;/p&gt;
&lt;h2 id="struktura-shablonov"&gt;Структура шаблонов&lt;/h2&gt;
&lt;p&gt;При рендеринге на клиентской стороне &lt;strong&gt;обычно&lt;/strong&gt; нужно заменять лишь
содержимое определенного блока, где располагается основной контент
сайта. Изменения в в других частях сайта нужны существенно реже,
соответственно стоит вынести их в отдельные шаблоны.&lt;/p&gt;
&lt;p&gt;Таким образом большинство шаблонов, соответствующих страницам сайта,
представляют собой содержимое одного блока. Отдельные шаблоны,
актуальные для всего сайта, создаются для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Блока &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; документа&lt;/li&gt;
&lt;li&gt;Видимой "шапки" сайта&lt;/li&gt;
&lt;li&gt;Сайдбара(ов), если они не сильно зависят от основного контентом
    страниц&lt;/li&gt;
&lt;li&gt;Видимого "подвала" сайта плюс тегов для подключения
    &lt;a href="/tag/javascript/"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;HTML-интерфейс&lt;/strong&gt; при чтении их из файловой системы "склеивает" их в
полные шаблоны для каждой страницы, просто конкатенацией или с
использованием механизмов шаблонизатора. &lt;strong&gt;Интерфейс сериализованных
данных&lt;/strong&gt; "заворачивает" шаблоны страниц в JSON (или другой используемый
формат) прямо в исходном виде для вставки в блок с основным контентом.
Из "общесайтовых"&amp;nbsp;шаблонов браузерному клиенту вероятно могут
понадобиться только сайдбар(ы), и то не всегда.&lt;/p&gt;
&lt;p&gt;Изменения в остальных частях сайта лучше все же отдать на совесть
&lt;em&gt;представлений&lt;/em&gt; на основе клиентского фреймворка. В первую очередь это
касается изменения &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; и других мета-тегов.&lt;/p&gt;
&lt;h2 id="primechaniia"&gt;Примечания&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;При использовании минималистичного шаблонизатора без внешних вызовов
    будьте морально готовы передавать ему "многоуровневые" объекты для
    вставки в шаблон. Например, если говорить о постраничной навигации,
    там, где в продвинутом шаблонизаторе было бы что-то вроде &lt;code&gt;{% pagination(current_page, total_pages) %}&lt;/code&gt;,&amp;nbsp;может понадобится не
    только написать саму верстку (что, в целом, хорошая практика), а еще
    и передать информацию о точном списке страниц, какая именно из них
    активная, где пропуски и пр.&lt;/li&gt;
&lt;li&gt;Стоит обращать внимание на производительность используемого
    шаблонизатора. Например, под одну из платформ "официальная"
    реализация &lt;strong&gt;mustache&lt;/strong&gt;, как оказалось,&amp;nbsp;проигрывает сторонней с
    отрывом в 2 порядка.&lt;/li&gt;
&lt;li&gt;Хоть при таком подходе добиться одинакового внешнего вида страниц
    при рендеринге серверной и клиентской частью достаточно легко,
    следить за их соответствием все же стоит - какие-то детали можно и
    упустить.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zakliuchenie"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Как я уже намекал в конце &lt;a href="https://www.insight-it.ru/interactive/2012/postoyannoe-soedinenie-mezhdu-brauzerom-i-serverom/"&gt;предыдущего материала&lt;/a&gt;,
обсуждавшийся в этой статье подход не совсем &lt;em&gt;"идеологически
правильный"&lt;/em&gt;, по крайней мере с точки зрения используемого &lt;em&gt;клиентского
фреймворка&lt;/em&gt;. &lt;strong&gt;Модели&lt;/strong&gt;,&amp;nbsp;вероятно,&amp;nbsp;будут использоваться для хранения
библиотеки шаблонов и данных для их рендеринга, а не для объектов
предметной области проекта. &lt;strong&gt;Представления&lt;/strong&gt; будут отвечать лишь за
рендеринг шаблонов и синхронизацию второстепенных элементов интерфейса.
Если Вы все же пойдете по этому пути, хочется, чтобы Вы сделали это
осознанно. Альтернативный сценарий создания полноценного
JavaScript-приложения для работы в браузере для некоторых проектов
по-прежнему может оказаться более предпочтительным.&lt;/p&gt;
&lt;p&gt;В&amp;nbsp;следующей&amp;nbsp;статье мы наконец-то перейдем к более привычной для меня
&lt;em&gt;серверной части&lt;/em&gt; интерактивных сайтов, там тоже есть много интересных
моментов, которые стоит обсудить.&lt;/p&gt;
&lt;div class="card green"&gt;
&lt;p&gt;&lt;div class="card-content white-text"&gt;
Эта статья - четвертая в &lt;a class="green-text text-lighten-4" href="https://www.insight-it.ru/interactive/"&gt;серии про Интерактивные сайты&lt;/a&gt;, автор - &lt;a class="green-text text-lighten-4" href="https://www.insight-it.ru/goto/b03d9116/" rel="nofollow" target="_blank" title="http://blinkov.ru"&gt;Иван&amp;nbsp;Блинков&lt;/a&gt;, основано на личном опыте.
До встречи &lt;a class="green-text text-lighten-4" href="/feed/"&gt;на страницах Insight IT&lt;/a&gt;!
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 13 Apr 2012 08:00:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-04-13:interactive/2012/povtornoe-ispolzovanie-shablonov/</guid><category>html</category><category>JSON</category><category>mustache</category><category>node.js</category><category>rendering</category><category>template</category><category>template engine</category><category>интерфейс</category><category>шаблон</category><category>шаблонизация</category></item><item><title>Jinja2</title><link>https://www.insight-it.ru//python/2012/jinja2/</link><description>&lt;p&gt;Я уже много раз упоминал в комментариях и других постах, что когда мне
приходится программировать, последние пару лет я чаще всего использую
&lt;a href="/tag/python/"&gt;Python&lt;/a&gt;.&amp;nbsp;При этом так забавно получилось, что в рубрике "Программирование" об этом языке практически ни слова, даже подрубрики не было. Сегодня я попробую потихоньку начать исправлять данную ситуацию, речь пойдет об одном из самых продвинутых шаблонизаторов под Python - &lt;strong&gt;Jinja2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Встречаем!&lt;!--more--&gt;&lt;/p&gt;
&lt;h2 id="vvedenie"&gt;Введение&lt;/h2&gt;
&lt;p&gt;Я хочу рассказать о том, что можно интересного сделать с помощью Jinja2,
по вопросам как именно - лучше обратиться к &lt;a href="https://www.insight-it.ru/goto/221c343/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs"&gt;официальной документации&lt;/a&gt;. Хотя на конкретные вопросы
по реализации в комментариях с удовольствием отвечу.&lt;/p&gt;
&lt;p&gt;Прежде чем перейти к делу, хочу напомнить что имеется ввиду под словом
&lt;em&gt;шаблонизатор&lt;/em&gt;: механизм для создания HTML-страниц путем заполнения
HTML-шаблонов динамическими данными, получаемыми из СУБД или внешних
источников. Шаблонизатор предоставляет некую надстройку над синтаксисом
HTML для создания шаблонов и API для их использования.&lt;/p&gt;
&lt;h2 id="bazovyi-funktsional"&gt;Базовый функционал&lt;/h2&gt;
&lt;p&gt;Многое из этого можно увидеть и в альтернативных реализациях
шаблонизаторов, так что ничего особенного:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{{ ... }}&lt;/code&gt; позволяет распечатать значение переменной или какого-то
выражения, синтаксис достаточно свободный - можно обращаться к элементам
коллекций, методам/атрибутам объектов и.т.п.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{% ... %}&lt;/code&gt;&amp;nbsp;позволяет вызвать дополнительные теги, среди которых
условные выражения, различные варианты циклов и многое другое.&lt;/li&gt;
&lt;li&gt;Присутствиет концепция
&lt;a href="https://www.insight-it.ru/goto/fcce65d3/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs/templates/#builtin-filters"&gt;&lt;strong&gt;фильтров&lt;/strong&gt;&lt;/a&gt;,
сильно напоминающих UNIX pipes: начинается все с переменной или
выражения, после чего можно через символ &lt;code&gt;|&lt;/code&gt; указать как её обработать
перед выводом в итоговый документ. Например, &lt;code&gt;{{ foo|lower }}&lt;/code&gt; выведет
содержимое строки foo в нижнем регистре. Как и в pipes, из фильтров
можно делать цепочки.&lt;/li&gt;
&lt;li&gt;Механизм &lt;a href="https://www.insight-it.ru/goto/45907dba/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs/templates/#template-inheritance"&gt;&lt;strong&gt;наследования&lt;/strong&gt;&lt;/a&gt;
позволяет избежать избыточности в коде. В коде шаблона выделяются
именованные блоки тегом &lt;code&gt;{% block ... %}&lt;/code&gt;, после чего шаблон-потомок может переопределить содержимое блоков шаблона-родителя произвольным образом. Типичный пример использования:&lt;ul&gt;
&lt;li&gt;Создается базовый шаблон страницы, состоящий из основного каркаса
страницы &amp;nbsp;и всех общих для всего сайта элементов (ссылки на файлы
стилей, общие &lt;a href="/tag/javascript/"&gt;JavaScript&lt;/a&gt; файлы и библиотеки,
какие-то мета теги, title по-умолчанию)&lt;/li&gt;
&lt;li&gt;В базовом шаблоне содержимое каждой части выделяется в именованный
блок (как минимум шапка, место под контент, 1-2 сайдбара и подвал),
иногда рядом со стилями и скриптами оставляют по пустому блоку на
случай, если шаблонам-наследникам потребуется что-то специфичное.&lt;/li&gt;
&lt;li&gt;Если какой-то блок будет содержать одну и ту же информацию на
большинстве страниц сайта, то её тоже обычно помещают в базовый
шаблон.&lt;/li&gt;
&lt;li&gt;Создается по шаблону-потомку на каждый тип используемых на сайте
страниц, в которых переопределяется как правило &amp;nbsp;(но далеко не
всегда) только блок с конткентом и заголовок страницы. Из
шаблонов-потомков также можно составить иерархию в случае, если у
них есть много общей информации.&lt;/li&gt;
&lt;li&gt;Стоит упомянуть, что есть альтернативный механизм включения
(include) шаблонов по-аналогии с &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;-файлами, но я
достойных применений ему не нашел.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Очень много внимания уделено &lt;strong&gt;экранированию символов&lt;/strong&gt;, хотя особо на
него надеяться не стоит - с точки зрения безопасности намного важнее
фильтровать попадающие на сайт данные, а не выводимые в шаблонах. Хотя
как дополнительная подстраховка не помешает.&lt;/li&gt;
&lt;li&gt;Простая &lt;a href="https://www.insight-it.ru/goto/c0aeaa06/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs/extensions/#i18n-extension"&gt;&lt;strong&gt;интеграция с gettext&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;придется кстати интернациональным проектам.&lt;/li&gt;
&lt;li&gt;Опциональное &lt;strong&gt;считывание шаблонов с диска&lt;/strong&gt; при каждом запросе страницы незаменимо при разработке.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="proizvoditelnost"&gt;Производительность&lt;/h2&gt;
&lt;p&gt;Сравнительные тесты производительности шаблонизаторов под Python
довольно условны, очень многое зависит от конкретных шаблонов и
динамических данных. Тем не менее, во всех из них &lt;strong&gt;Jinja2&lt;/strong&gt; определенно
не в аутсайдерах, в топ5 вполне стабильно.&lt;/p&gt;
&lt;p&gt;Шаблоны компилируются в байткод для последующего использования, с этой
особенностью связаны два момента, которые спользовать:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Байткод можно &lt;a href="https://www.insight-it.ru/goto/873c9444/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs/api/#bytecode-cache"&gt;хранить&lt;/a&gt; в &lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt; или любом другом внешним хранилище, достаточно лишь реализовать минимальный get/set интерфейс.&lt;/li&gt;
&lt;li&gt;Доступен опциональный &lt;a href="https://www.insight-it.ru/goto/cd6194bd/" rel="nofollow" target="_blank" title="http://jinja.pocoo.org/docs/intro/#more-speed-with-markupsafe"&gt;модуль&lt;/a&gt; на &lt;a href="/tag/c/"&gt;C&lt;/a&gt;, который берет на себя часть работы по заполнению шаблонов, что делает этот процесс несколько быстрее.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rasshiriaemost"&gt;Расширяемость&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Jinja2&lt;/strong&gt; предоставляет широкие возможности по подключению
дополнительных модулей и самостоятельной реализации и использованию
аналогов любых компонентов системы. Можно разрабатывать и подключать
свои фильтры, проверки, глобальные функции, загрузчики шаблонов,
расширения и пр. Пройдемся по потенциальным вариантам использования этих
возможностей на благо проекта, в основном в целях клиентской
оптимизации.&lt;/p&gt;
&lt;h3 id="webassets"&gt;Webassets&lt;/h3&gt;
&lt;p&gt;Этот &lt;a href="https://www.insight-it.ru/goto/5908cea6/" rel="nofollow" target="_blank" title="https://github.com/miracle2k/webassets"&gt;проект&lt;/a&gt;&amp;nbsp;позволяет делать с
подключаемыми внешними Javascript и CSS файлами практически все, что
угодно. В типичном варианте использования используется тег &lt;strong&gt;{% assets
%}&lt;/strong&gt;&amp;nbsp;для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Указания списка изначальных CSS/JS файлов, для конкатенации и
    последующей обработки.&lt;/li&gt;
&lt;li&gt;Указания окружения ссылки на итоговый файл, т.е. как именно должен
    выглядеть тег &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; или &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Списка фильтров, для минимизации или других преобразований кода.&lt;/li&gt;
&lt;li&gt;Возможно использование &lt;a href="https://www.insight-it.ru/goto/9d74fdb3/" rel="nofollow" target="_blank" title="http://sass-lang.com"&gt;sass&lt;/a&gt;&amp;nbsp;или
    &lt;a href="https://www.insight-it.ru/goto/48ae8bc7/" rel="nofollow" target="_blank" title="http://lesscss.org"&gt;less&lt;/a&gt;&amp;nbsp;файлов вместо чистого CSS.&lt;/li&gt;
&lt;li&gt;Отключение конкатенации и минимизации при разработке доступно
    изменением одного флага.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В итоге вопрос с подготовкой минимизированных статических файлов
становится полностью автоматическим.&lt;/p&gt;
&lt;p&gt;Доступна интегрирация и с другими Python шаблонизаторами, в Jinja2 он
подключается просто как расширение.&lt;/p&gt;
&lt;h3 id="minimizatsiia-html"&gt;Минимизация HTML&lt;/h3&gt;
&lt;p&gt;Этот вопрос решается путем наследования от поставляемого вместе с
шаблонизатором загрузчика шаблонов. API позволяет делать между чтением
шаблона и генерацией байткода что угодно с текстом шаблона, например
можно пропустить все через примитивную регулярку (вернее через
несколько) и свернуть тем самым весь HTML в одну строку. Хочется
обратить внимание, что осуществляется этот процесс очень редко (особенно
при использовании кэша байт кода), так что можно делать на этом этапе
даже сильно ресурсоемкие преобразования текста.&lt;/p&gt;
&lt;h3 id="drugoi-format-dannykh"&gt;Другой формат данных&lt;/h3&gt;
&lt;p&gt;В одном из моих проектов при первом заходе на сайт или при отключенном
JS сервер полностью отрисовывал страницу, а при переходах по ссылкам
внутри сайта делался AJAX-запрос и сервер выдавал какие блоки нужно
обновить и каким содержимым в формате JSON. Про клиентскую часть всего
этого дела можно легко написать отдельную здоровую статью, так что в
подробности не вдаюсь.&lt;/p&gt;
&lt;p&gt;Да, наверняка многие скажут, что в этой ситуации надо было использовать
универсальные шаблоны для JS и серверной части, но на Jinja2 такое тожно
можно реализовать, с той лишь разницей, что пришлось гонять по сети не
только сами данные, но и часть HTML-разметки (что, порой, тоже не
плохо). Реализуется как и минимизация HTML посредством переопределения
загрузчика страниц, который использовался вместо стандартного, если
запрос пришел через AJAX.&lt;/p&gt;
&lt;h3 id="sekonomim-eshche-paru-bait"&gt;Сэкономим еще пару байт&lt;/h3&gt;
&lt;p&gt;С подобного рода оптимизацией не заборачивается, наверное и 0.01%
интернет-проектов, но я в свое время как-то увлекся и написал штуку для
"выжимания" десятка-другого байт с большинства страниц и CSS/JS файлов.
"Проблема" состоит в следующем: &lt;strong&gt;классы и идентификаторы&lt;/strong&gt;,
использующиеся в HTML, в "культурных" проектах &lt;strong&gt;имеют&lt;/strong&gt; хотя бы
отдаленно &lt;strong&gt;человекочитаемые названия&lt;/strong&gt;, что почти всегда означает их
длинность, что, учитывая их частую повторяемость в коде, в свою очередь
негативно влияет на &lt;em&gt;итоговый&amp;nbsp;размер HTML/JS/CSS документов&lt;/em&gt;.
Теоретическое решение лежит на поверхности: использовать "длинные"
идентификаторы и классы в HTML при разработке, а при развертывании на
публику&amp;nbsp;&lt;strong&gt;переименовывать их в "короткие"&lt;/strong&gt;: &lt;em&gt;a, b, c, ..., aa, ab, ac,
...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;На практике же все несколько сложнее: есть масса проблем с префиксностью
и суффиксностью, в JS классы иногда неотличимы от других строк с точками
(зависят от контекста), некоторые классы и идентификаторы генерируются
динамически - на них прийдется либо забивать, либо обрабатывать
индивидуально, и это далеко не все...&lt;/p&gt;
&lt;p&gt;Если у кого-то возникнет желание тоже сделать что-то подобное средствами
&lt;em&gt;Jinja2&lt;/em&gt;, то советую "вмешиваться" в обработку JS/CSS посредством
дополнительного фильтра в &lt;em&gt;Webassets&lt;/em&gt;, а сами шаблоны редактировать как
и в предыдущих разделах при считывании их с диска.&lt;/p&gt;
&lt;h3 id="spraity-i-obrabotka-izobrazhenii"&gt;Спрайты и обработка изображений&lt;/h3&gt;
&lt;p&gt;Создание &lt;a href="https://www.insight-it.ru/goto/a3d1c475/" rel="nofollow" target="_blank" title="http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D1%80%D0%B0%D0%B9%D1%82_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0)"&gt;спрайтов&lt;/a&gt;&amp;nbsp;как таковых не предусмотрено, так как по сути это не по части шаблонизатора. Но есть вариант подключить их к Webassets, например через интеграцию&amp;nbsp;&lt;a href="/tag/ruby/"&gt;Ruby&lt;/a&gt;-проектом
&lt;a href="https://www.insight-it.ru/goto/3998bac3/" rel="nofollow" target="_blank" title="https://github.com/chriseppstein/compass"&gt;compass&lt;/a&gt; (у которого есть
плагин-генератор спрайтов).&lt;/p&gt;
&lt;p&gt;Если говорить просто о уменьшении размеров изображений, то это легко
делается средствами самого &lt;a href="/tag/python/"&gt;Python&lt;/a&gt; и с шаблонизатором
практически не взаимодействует: достаточно обрабатывать изображения при
загрузке их пользователями и держать статические изображения "в форме".&lt;/p&gt;
&lt;h3 id="idei-dlia-filtrov-i-globalnykh-funktsii"&gt;Идеи для фильтров и глобальных функций&lt;/h3&gt;
&lt;p&gt;Список встроенных в Jinja2 фильтров, функций и проверок, хоть и обширен,
но того, что нужно, там зачастую не оказывается. Вот несколько примеров,
чего в нем нет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Форматирования даты/времени по шаблону&lt;/li&gt;
&lt;li&gt;Фильтрации HTML с белым списком тегов&lt;/li&gt;
&lt;li&gt;Получения атрибута объекта с неизвестным заранее именем (getattr)&lt;/li&gt;
&lt;li&gt;Вывода строки в режиме "первая - заглавная, остальные - прописные&lt;/li&gt;
&lt;li&gt;Генерации часто используемых HTML-тегов, например &lt;code&gt;&amp;lt;a href="..."&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Не смотря на то, что реализация каждого из вышеизложенных пунктов
занимает буквально чуть-чуть строк кода, меня всегда удивляло отсутствие
подобных достаточно примитивных вещей "в комплекте".&lt;/p&gt;
&lt;h2 id="podvodim-itogi_1"&gt;Подводим итоги&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Jinja2&lt;/strong&gt; - отличный инструмент для тех проектов, которым важно не
просто донести какую-то информацию до пользователей, а сделать это
приятно и быстро, как для себя, так и для пользователя. Гибкость и
расширяемость этого движка шаблонов позволяет адаптировать его под нужды
любого проекта, а также воспользоваться в полной мере всеми
возможностями современной &lt;em&gt;клиентской оптимизации&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;С удовольствием бы опубликовал упоминавшиеся в статье куски кода в
opensource, но для этого нужно взять себя в руки и состряпать из них
что-то "отчуждаемое" от тех проектов, для которых оно писалось.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;В комментариях предлагаю обсудить Jinja2 в сравнении с другими
шаблонизаторами: кто какими альтернативами пользуется, в чем видит
сильные и слабые стороны, какой фактор оказывается решающим при выборе
движка для конкретного проекта?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Спасибо за внимание, &lt;a href="/feed/"&gt;подписавшись на Insight IT&lt;/a&gt; можно
узнавать о новых материалах одним из первых :)&lt;/strong&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sun, 19 Feb 2012 18:39:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-02-19:python/2012/jinja2/</guid><category>compass</category><category>html</category><category>Jinja2</category><category>less</category><category>Memcached</category><category>Python</category><category>sass</category><category>webassets</category><category>клиентская оптимизация</category><category>шаблон</category><category>шаблонизация</category></item><item><title>Как нужно верстать?</title><link>https://www.insight-it.ru//frontend/2011/kak-nuzhno-verstat/</link><description>&lt;p&gt;По одному из проектов меня попросили написать бумажку, которую можно
давать верстальщикам-фрилансерам, чтобы вкратце объяснить, чего от них
хотят. Я на самом деле не считаю себя особо большим спецом по верстке,
так что получилось довольно сумбурно и местами спорно (иногда
проскальзывает специфика проекта, но думаю это некритично). Результат
решил опубликовать в блоге, так как возможно многим она может показаться
полезной, плюс очень хотелось бы послушать критику и дополнения в
комментариях. Источники информации - различные статьи и блоги + личный
опыт. Ссылки приводить не буду, так как подробная информация по любой из
тем легко гуглится.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;HTML и CSS должны быть &lt;strong&gt;читаемыми&lt;/strong&gt; (все равно потом все ужимаем):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HTML должен быть иерархическим, открывающие теги с новой строки
    (кроме случаев с), отступы 4 пробела&lt;/li&gt;
&lt;li&gt;CSS желательно не свернутые в строчку, а по одной директиве на
    строку, тоже с отступами по 4 пробела&lt;/li&gt;
&lt;li&gt;Можно сразу
    использовать&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/dca1748a/" rel="nofollow" target="_blank" title="http://sass-lang.com/"&gt;SASS&lt;/a&gt; -
    сильно упрощает всем жизнь&lt;/li&gt;
&lt;li&gt;Идентификаторы классов должны быть человекочитабельмыми
    английскими словами и фразами&lt;/li&gt;
&lt;li&gt;Очень желательно&amp;nbsp;&lt;em&gt;не использование&lt;/em&gt; в названиях классов и
    идентификаторов ключевых слов из HTML/CSS/JS/jQuery&lt;/li&gt;
&lt;li&gt;Очень желательно, чтобы идентификаторы и классы&amp;nbsp;&lt;em&gt;не были&lt;/em&gt;
    префиксными (ни одно названия не является началом или концом
    другого, например &lt;code&gt;.icon&lt;/code&gt; и &lt;code&gt;.icon_small&lt;/code&gt;) - это позволяет
    сократить их все до 1-2 символов на этапе постобработки&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DOCTYPE&lt;/code&gt; предпочтителен HTML5, но в крайнем случае можно и XHTML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Кодировка:&amp;nbsp;&lt;em&gt;обязательно&lt;/em&gt; &lt;strong&gt;UTF-8&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Валидность&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HTML:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/e3e768b3/" rel="nofollow" target="_blank" title="http://validator.w3.org/"&gt;http://validator.w3.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CSS:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/5ff07096/" rel="nofollow" target="_blank" title="http://jigsaw.w3.org/css-validator/"&gt;http://jigsaw.w3.org/css-validator/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WCAG:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/90682485/" rel="nofollow" target="_blank" title="http://www.cynthiasays.com/"&gt;http://www.cynthiasays.com/&lt;/a&gt;
    и&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/b17bf654/" rel="nofollow" target="_blank" title="http://www.w3.org/WAI/WCAG20/quickref/"&gt;http://www.w3.org/WAI/WCAG20/quickref/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Соответствие макету&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Проверка:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/26bbcbb0/" rel="nofollow" target="_blank" title="https://addons.mozilla.org/ru/firefox/addon/pixel-perfect/"&gt;https://addons.mozilla.org/ru/firefox/addon/pixel-perfect/&lt;/a&gt;,&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/6d40d8b1/" rel="nofollow" target="_blank" title="https://github.com/aishek/modulargrid"&gt;https://github.com/aishek/modulargrid&lt;/a&gt;
    и &lt;a href="https://www.insight-it.ru/goto/330b447f/" rel="nofollow" target="_blank" title="https://browserlab.adobe.com/en-us/index.html"&gt;https://browserlab.adobe.com/en-us/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;﻿Хоть и попиксельное соответствие приветствуется и считается
    обязательным, но местами возможны отклонения:&lt;ol&gt;
&lt;li&gt;Когда дизайнер нарисовал криво&lt;/li&gt;
&lt;li&gt;Когда незначительные различия в отрисовке шрифтов&lt;/li&gt;
&lt;li&gt;Когда у дизайнера разошлось вдохновение и единственный
    способ сделать точно так как на картинке - впихнуть
    здоровенный JPEG в пару сот килобайт на фон; в таких случаях
    стараемся разбить фон на составные части и/или паттерны и
    делаем его частями, стараясь минимизировать ущерб "креативу"
    при адекватном размере страницы&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Кроссбраузерность&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Перед приемом/сдачей работы проверить
    на&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/939754d/" rel="nofollow" target="_blank" title="http://browsershots.org/"&gt;http://browsershots.org/&lt;/a&gt; (или аналоге) и во всех доступных
    под рукой браузерах&lt;/li&gt;
&lt;li&gt;Не забыть мобильные браузеры Opera Mini, iPhone и Android.&lt;/li&gt;
&lt;li&gt;Хаки для IE в conditional comments, не забываем правильно
    фильтровать для разных его версий&lt;/li&gt;
&lt;li&gt;IE6 должен адекватно воспринимать специфичные для HTML5 теги&lt;/li&gt;
&lt;li&gt;Помимо этого желательно проверить все разрешения от 1024х768 до
    1920х1080 - везде все должно смотреться пристойно, без
    скроллбаров и излишних пустых областей&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Гибкость шаблона&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;При этом не смотря на то, что в макетах для примера используется
    какой-то текст, шаблон должен нормально себя вести при любом
    количестве текста (как нулевом, так и очень большом) в любом
    элементе&lt;/li&gt;
&lt;li&gt;Если пункт меню, заголовок или просто текст в 5-10 раз длиннее
    или короче того, что на макете - все должно отображаться
    корректно (по возможности, естественно)&lt;/li&gt;
&lt;li&gt;Если в макете не было всех шести видов заголовков, ссылок в
    тексте, картинок, цитат, аббревиатур, блоков pre и code - это не
    значит, что стиль по-умолчанию для всех стандартных
    html-элементов может отсутствовать в CSS - возьмите цвета и
    стиль от других элементов шаблона и сделайте хоть как-то, для
    образца все элементы можно добавить в текст, даже если их там не
    было&lt;/li&gt;
&lt;li&gt;У всех ссылок должно быть отдельное поведение для :hover, у
    ссылок внутри текста - и для :visited&lt;/li&gt;
&lt;li&gt;Если в макете все же были заголовки: их структура должна быть
    перенесена верно&lt;/li&gt;
&lt;li&gt;Надеяться, что WYSIWYG или Word проставит какие-то особые стили
    к тексту и все будет нормально&amp;nbsp;&lt;em&gt;нельзя&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Если используем HTML5, то верстка должна быть&amp;nbsp;&lt;em&gt;семантической&lt;/em&gt;,
    то есть блоки навигации заворачиваем в nav, сайдбар в aside
    и.т.п.&lt;/li&gt;
&lt;li&gt;Стили для печати и мобильной версии указываем отдельными файлами
    с соответствующим media&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Не забываем о производительности CSS: селекторы обрабатываются
    справа-налево, подробнее
    здесь:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/6aa64e6a/" rel="nofollow" target="_blank" title="http://code.google.com/speed/page-speed/docs/rendering.html"&gt;http://code.google.com/speed/page-speed/docs/rendering.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CSS3 правила для нормальных браузеров (border-radius, gradient,
    text-shadow, box-shadow), с остальными извращаемся отдельно,
    никаких хаков с кучей &lt;code&gt;&amp;lt;b&amp;gt;&lt;/code&gt; и подобных&lt;/li&gt;
&lt;li&gt;Размеры и позиционирование элемента должны указываться в одних
    единицах измерения&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Изображения&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;С умом относимся к выбору формата и уменьшаем их объем
    (см.&amp;nbsp;&lt;a href="https://www.insight-it.ru/frontend/2011/instrumenty-dlya-minimizacii-razmera-izobrazhenijj/"&gt;"Инструменты для минимизации размера изображений"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Иллюстрации и элементы интерфейса с четкими краями лучше
    сохранять в PNG8, фотографии в progressive JPEG - но в целом
    руководствуемся минимизацией объема не в ущерб качеству&lt;/li&gt;
&lt;li&gt;Отсутствие &lt;code&gt;title&lt;/code&gt; и &lt;code&gt;alt&lt;/code&gt;&amp;nbsp;&lt;em&gt;непростительно&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;По возможности всегда указываем размеры изображений, особенно
    если они являются частью дизайна и заранее известны&lt;/li&gt;
&lt;li&gt;Для групп небольших изображений приблизительно одинаковой ширины
    или высоты (иконки, картинки разных буллетов и.т.п.) используем
    CSS Sprites:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/149b7279/" rel="nofollow" target="_blank" title="http://css-tricks.com/css-sprites/"&gt;http://css-tricks.com/css-sprites/&lt;/a&gt; (для ленивых
    есть ряд инструментов для автоматизации процесса)&lt;/li&gt;
&lt;li&gt;Для совсем маленьких изображений используем
    data:URI+MHTML:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/905dc16e/" rel="nofollow" target="_blank" title="http://www.phpied.com/inline-mhtml-data-uris/"&gt;http://www.phpied.com/inline-mhtml-data-uris/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Шрифты&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Указываем базовый размер шрифта в em, там где нужен размер
    больше или меньше - в % от базового&lt;/li&gt;
&lt;li&gt;Line-height задаем в долях&lt;/li&gt;
&lt;li&gt;Должно быть как минимум одному шрифту для Windows, Linux и Mac
    OS. Примеры:&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Arial,Helvetica,FreeSans,"Liberation Sans","Nimbus Sans L",sans-serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Courier New",Courier,FreeMono,"Nimbus Mono L","Liberation Mono",monospace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Georgia,"Bitstream Charter","Century Schoolbook L","Liberation Serif",Times,serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Lucida Sans","Lucida Sans Unicode","Lucida Grande",Lucida,sans-serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Lucida Console",Monaco,"DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono",monospace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Palatino,"Palatino Linotype",Palladio,"URW Palladio L","Book Antiqua","Liberation Serif",Times,serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tahoma,Geneva,"DejaVu Sans Condensed",sans-serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Times New Roman",Times,"Nimbus Roman No9 L","FreeSerif","Liberation Serif",serif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Verdana,"Bitstream Vera Sans","DejaVu Sans","Liberation Sans",Geneva,sans-serif&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Если требуется нестандартный шрифт, используем кроссбраузерный
    font-face:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/419fd700/" rel="nofollow" target="_blank" title="http://randsco.com/index.php/2009/07/04/p680"&gt;http://randsco.com/index.php/2009/07/04/p680&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Формы&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ко всем полям должен быть label или, если так задумано,
    toggleval&lt;/li&gt;
&lt;li&gt;Если используем HTML5, то и поля форм тоже делаем по этому
    стандарту (email/tel)&lt;/li&gt;
&lt;li&gt;Проверить работу tabindex&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Использование &lt;strong&gt;микроформатов&lt;/strong&gt; желательно, если они уместны (hCard,
    hCalendar, hAtom, XFN)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&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;Работоспособность проверяем средствами Firebug&lt;/li&gt;
&lt;li&gt;Сайт должен нормально функционировать с выключенным JavaScript
    (и Flash тоже, к слову)&lt;/li&gt;
&lt;li&gt;Если на странице имеются формы - они должны валидироваться еще
    до отправки и нормально отображать ошибки (как минимум просто
    цветом)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Остальное&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Полное отсутствие комментариев в html, кроме условных&lt;/li&gt;
&lt;li&gt;Копирайт пишем правильно:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/dd9dd788/" rel="nofollow" target="_blank" title="http://habrahabr.ru/blogs/typography/23812/"&gt;http://habrahabr.ru/blogs/typography/23812/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Никакого CSS или JS внутри HTML, только внешние файлы&lt;/li&gt;
&lt;li&gt;Ссылки на внешние ресурсы должны быть с &lt;code&gt;target="_blank"&lt;/code&gt; и по
    необходимости могут снабжаться
    иконками:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/2fb93566/" rel="nofollow" target="_blank" title="https://github.com/joshuaclayton/blueprint-css/blob/master/blueprint/plugins/link-icons/screen.css"&gt;https://github.com/joshuaclayton/blueprint-css/blob/master/blueprint/plugins/link-icons/screen.css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Текст лучше оттипографить перед
    публикацией:&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/d2a1d6c6/" rel="nofollow" target="_blank" title="http://rmcreative.ru/blog/post/tipograf"&gt;http://rmcreative.ru/blog/post/tipograf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Логотип должен вести на главную страницу&lt;/li&gt;
&lt;li&gt;Ссылки на внешние ресурсы (изображения, CSS, JS) лучше делать
    относительными&lt;/li&gt;
&lt;li&gt;Не забываем &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; всей страницы, должен быть понятен как
    человеку, так и поисковым системам&lt;/li&gt;
&lt;li&gt;HTML, JS и CSS лучше минимизировать не на этапе верстки, а
    автоматически при генерации шаблонов&lt;/li&gt;
&lt;li&gt;Не забыть выкинуть не используемые стили (вроде красной рамочки
    для выделения элементов в процессе верстки)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 25 Feb 2011 00:02:00 +0300</pubDate><guid>tag:www.insight-it.ru,2011-02-25:frontend/2011/kak-nuzhno-verstat/</guid><category>css</category><category>html</category><category>html5</category><category>js</category><category>markup</category><category>верстка</category></item><item><title>Микроформаты</title><link>https://www.insight-it.ru//theory/2008/mikroformaty/</link><description>&lt;p&gt;&lt;img alt="Microformats" class="left" src="https://www.insight-it.ru/images/microformats.png" title="Microformats"/&gt;&lt;/p&gt;
&lt;p&gt;Не смотря на тот факт, что эта технология еще только начинает получать
широкое распространение и применение на просторах Сети, слов о ней уже
написано немало, не вижу ни одной причины почему бы мне тоже не написать
несколько слов о &lt;a href="https://www.insight-it.ru/goto/b960d7c/" rel="nofollow" target="_blank" title="http://microformats.org"&gt;микроформатах.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Основной идеей микроформатов является попытка дополнить смыслом
существующие элементы стандартов разметки - XHTML и HTML, такого рода
смысл нынче модно назвать словом &lt;em&gt;семантика&lt;/em&gt;, что так или иначе влияет
как на людей, пользующихся услугами Сети, так и на программы,
обслуживающие ее функционирование.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id="chto-predstavliaiut-soboi-mikroformaty"&gt;Что представляют собой микроформаты?&lt;/h3&gt;
&lt;p&gt;Строго говоря, микроформаты являются набором форматов данных,
основывающихся на существующих широкораспространенных стандартах
представления данных (в частности XHTML), каждый из них предназначен для
решения конкретной узкоспециализированной задачи, то есть для
обеспечения конкретной семантикой конкретной части стандарта.&lt;/p&gt;
&lt;p&gt;Как не трудно догадаться, измение существующих и добавление новых тэгов
к стандарту XHTML в микроформатах недопустимо, ведь иначе документ
перестанет соответствовать исходному стандарту. Именно по-этому для
реализации микроформатов используются атрибуты тэгов XHTML, в которых
допускаются некоторые вольности - &lt;strong&gt;rel&lt;/strong&gt; и &lt;strong&gt;class&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="chto-zhe-mozhet-dat-osmyslennost-razmetki"&gt;Что же может дать осмысленность разметки?&lt;/h3&gt;
&lt;p&gt;В перспективе вся эта затея направлена на повышение качества сервисов,
предоставляемых в Сети. На данный момент большая часть сервисов,
основанных на анализе данных расположенных в Сети, способна лишь на
частичное использование разметки документа для уточнения смысла той или
иной информации. Показать это лучше всего на примере: тэги &lt;code&gt;&amp;lt;em&amp;gt;&lt;/code&gt; и
&lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt; говорят о том, что содержащаяся внутри них информация
имеет некий смысловой акцент, но в то же время многие другие тэги не
несут за собой никакой дополнительной смысловой информации, помимо
содержащегося внутри них текста. Одним из таких тэгов является
&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, который говорит о наличии ссылки на некоторую
интернет-страницу, как-то связанную с текстом между открывающим и
закрывающим тэгами, а также расположенную по URL, указанному в атрибуте
&lt;code&gt;href&lt;/code&gt;, можно конечно к этому прибавить атрибут &lt;code&gt;title&lt;/code&gt;, но так или
иначе на этом информация о ресурсе, на который ссылается автор
документа, заканчивается. Один из микроформатов, позволяющих расширить
возможности простых ссылок, называется &lt;a href="https://www.insight-it.ru/goto/faee6117/" rel="nofollow" target="_blank" title="http://www.gmpg.org/xfn/"&gt;XFN&lt;/a&gt; и
предоставляет авторам документов возможность описать свое отношение к
другим авторам, на работы которых они ссылаются, выглядит это примерно
следующим образом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"http://www.my-friend.ru"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"friend"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Сайт моего друга
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь понять, что сайт, на который происходит ссылка, является сайтом
друга автора текущего документа, может не только читатель, но и
программа, занимающаяся индексированием страниц Сети для какого-либо
сервиса, например этот микроформат полезен для повышения качества работы
социальных сетей. Это была лишь небольшая часть возможностей
микроформата XFN, подробнее останавливаться на нем не буду - ведь каждый
из них явно заслуживает отдельной записи.&lt;/p&gt;
&lt;h3 id="klassifikatsiia"&gt;Классификация&lt;/h3&gt;
&lt;p&gt;Наверняка к Вам в голову приходила мысль: а почему необходимо
пользоваться именно вот этими микроформатами? Если в XHTML допускаются
любые значения тэгов &lt;code&gt;rel&lt;/code&gt; и &lt;code&gt;class&lt;/code&gt;, почему я не могу придумать
свои микроформаты и пользоваться ими? Ответ прост: микроформаты призваны
повысить качество Сети вцелом, а не какого-то конкретного сайта
отдельно. Только часть микроформатов получила широкое распространение, и
именно ими приходится пользоваться всем остальным сайтам под влиянием
&lt;em&gt;сетевого эффекта&lt;/em&gt; (т.е. того факта, что ценность технологии прямо
пропорциональна обширности ее применения, в нашем случае в рамках Сети),
просто чтобы быть совместимыми с остальной частью Интернета.&lt;/p&gt;
&lt;p&gt;Но не смотря на это - количество и разнообразие распространенных
микроформатов велико, и как-либо классифицировать их достаточно сложно.
Самым простым и точным вариантом можно назвать разделение по структуре
формата:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;элементарные&lt;/em&gt; - применимые только к одному конкретному типу тэгов.
    В эту группу попадают упомянутый выше &lt;strong&gt;XFN&lt;/strong&gt;, а также множество
    других, например &lt;em&gt;rel-tag&lt;strong&gt;, &lt;/strong&gt;rel-nofollow&lt;/em&gt;*, и так далее;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;композитные (или составные)&lt;/em&gt; - имеют более сложную структуру, и для
    своей реализации требуют модификации нескольких тэгов одного
    элемента. Микроформаты из этой категории предназначены для описания
    более сложной структуры, например &lt;strong&gt;hCard&lt;/strong&gt;, используемый для
    описания людей или организаций (можно посмотреть на пример его
    использования &lt;a href="https://www.insight-it.ru/author/"&gt;на моей странице "О себе"&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это пожалуй единственный общепринятый тип классификации микроформатов,
можно конечно попытаться провести границы по типам используемых
атрибутов или модифицируемых тэгов, но такого рода классификации
несущественны и не являются широко распространенными.&lt;/p&gt;
&lt;h3 id="primenenie-na-praktike"&gt;Применение на практике&lt;/h3&gt;
&lt;p&gt;Вариантов их применения на сегодняшний день не так уж и много. Как я уже
упоминал, эта технология еще находится лишь на пути к получению
повсеместной распространенности на просторах Сети, но уже сейчас они
проявили себя достаточно, чтобы оказывать влияние на многие аспекты сети
Интернет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Многие поисковые системы активно используют при составлении своего
    индекса микроформат &lt;strong&gt;rel-nofollow&lt;/strong&gt;, об этом мне уже &lt;a href="https://www.insight-it.ru/theory/2008/putevoditel-dlya-robotov/"&gt;доводилось
    упоминать в одной из предыдущих
    записей&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Plug-in для Firefox под названием
    &lt;a href="https://www.insight-it.ru/goto/c84adfbb/" rel="nofollow" target="_blank" title="https://addons.mozilla.org/en-US/firefox/addon/4106"&gt;&lt;em&gt;Operator&lt;/em&gt;&lt;/a&gt; -
    позволяет просматривать используемые на текущей странице
    микроформаты, а также предлагает небольшой ассортимент действий, с
    ними связанных. Например, &lt;strong&gt;hCard&lt;/strong&gt; предлагается экспортировать в
    адресную книгу, а для &lt;strong&gt;rel-tag&lt;/strong&gt; - осуществить поиск по скромному
    списку интернет-сервисов. &lt;img alt="Operator screenshot" class="right" src="https://www.insight-it.ru/images/firefox-operator.png" title="Operator menu"/&gt;
    Лично я уже достаточно его себе установил и всегда держу включенным,
    не для того, чтобы реально им пользоваться, а просто чтобы быть в
    курсе, что тот или иной ресурс вдруг начал поддерживать эту
    замечательную технологию;&lt;/li&gt;
&lt;li&gt;Появляется все больше и больше CMS, поддерживающих различные
    микроформаты "из коробки" или с помощью plug-in'ов, что ведет к все
    более активному расширению списка сайтов, следующих этим стандартам
    представления данных. &lt;a href="https://www.insight-it.ru/goto/92e8fc22/" rel="nofollow" target="_blank" title="http://wordpress.org"&gt;WordPress&lt;/a&gt;, &lt;del&gt;на которой работает этот блог&lt;/del&gt;, тоже относится к категории CMS, поддерживающих
    микроформаты, в чем вы можете убедиться, установив упомянутый в
    предыдущем пункте &lt;em&gt;Operator&lt;/em&gt;. Сам по себе этот факт какой-либо
    полезности не несет, но является лишним стимулом для разработчиков
    программного обеспечения и интернет-ресурсов, поддерживающих
    микроформаты.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Этот список можно было бы продолжать еще достаточно долго, так что
позволю себе остановиться, ограничившись лишь перечислением наиболее
актуальных с моей точки зрения аспектов применения микроформатов.&lt;/p&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;p&gt;По сути являясь своеобразной "надстройкой" над XHTML, микроформаты
создаются по принципу "чем проще - тем лучше", но в то же время
благодаря своей узкой специализации и простоте, каждый из них способен
быть составной частью модульной структуры форматов данных, способной
поднять Сеть на качественно новый уровень развития.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sun, 27 Jan 2008 19:31:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-01-27:theory/2008/mikroformaty/</guid><category>hcard</category><category>hreview</category><category>html</category><category>xfn</category><category>XHTML</category><category>интернет</category><category>Микроформаты</category><category>семантика</category><category>смысл</category><category>технология</category></item></channel></rss>