<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8016434493573285716</id><updated>2024-08-28T22:48:58.341+02:00</updated><category term="java"/><category term="php"/><category term="xml"/><category term="example"/><category term="j2se"/><category term="symfony 2"/><category term="ubuntu"/><category term="ооп"/><category term="пример"/><category term="doctrine 2"/><category term="encode"/><category term="forms"/><category term="j2ee"/><category term="linux"/><category term="mysql"/><category term="parser"/><category term="sax"/><category term="swing"/><category term="tdd"/><category term="test"/><category term="zend"/><category term="абстракции"/><category term="объекты"/><category term="парсер"/><category term="2D"/><category term="autoload"/><category term="bash"/><category term="crontab"/><category term="css"/><category term="cyrillic"/><category term="decode"/><category term="dependency injection"/><category term="doctione migrations"/><category term="dom"/><category term="domain"/><category term="driver"/><category term="graphic"/><category term="gui"/><category term="gwt"/><category term="highload"/><category term="ide"/><category term="jetbrains"/><category term="lesscss"/><category term="mail"/><category term="models"/><category term="nodejs"/><category term="nvidia"/><category term="photo"/><category term="production"/><category term="queue"/><category term="sample"/><category term="send"/><category term="server media linux home group-post"/><category term="sql"/><category term="swift mail"/><category term="utf8"/><category term="vlc remote web-interface media video player"/><category term="xmlunit"/><category term="xorg"/><category term="xrandr"/><category term="zend mail"/><category term="Крик души"/><category term="архитектура"/><category term="багфикс"/><category term="будильник"/><category term="вращение"/><category term="деревья"/><category term="классы"/><category term="кодировка"/><category term="костыль"/><category term="лекция"/><category term="метаописание"/><category term="названия"/><category term="оптимизация"/><category term="пользовательские интерфейсы"/><category term="разработка"/><category term="рекурсия"/><category term="уведомления"/><category term="хранимые процедуры"/><category term="юмор"/><title type='text'>Разработка ПО и многое другое</title><subtitle type='html'>Блог про разработку ПО, методики разработки ПО, парадигмы программирования, технологии(j2ee, j2se и т.п.), языки программирования (Java/Ruby/Php), фреймворки и многое другое</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-6337526231866891253</id><published>2016-12-20T07:28:00.000+02:00</published><updated>2016-12-20T07:28:24.781+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="разработка"/><category scheme="http://www.blogger.com/atom/ns#" term="юмор"/><title type='text'></title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Кратко о разработке, хороший разработчик всегда будет стремиться сделать более универсальное решение, чем это нужно.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://media.giphy.com/media/l0MYyJ2FoNIjOmN6U/giphy.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;https://media.giphy.com/media/l0MYyJ2FoNIjOmN6U/giphy.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Только менеджерам не показывайте, а то потом никакую фичу не продавишь. :)&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/6337526231866891253/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2016/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6337526231866891253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6337526231866891253'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2016/12/blog-post.html' title=''/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-8891480033394611457</id><published>2016-10-24T11:52:00.000+02:00</published><updated>2016-10-24T11:52:58.706+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Крик души"/><title type='text'>Замучали &quot;аналитики&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Замучали &quot;аналитики&quot;. Сначала спрашивают заказчика технические вещи, а потом когда какой-нибудь бухгалтер ответит что-то, выставлять это за требования к разработке.&lt;br /&gt;
&lt;br /&gt;
Сейчас сочинял рассказ аналитику, чтобы объяснить что он не прав.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Заказчик:&lt;/b&gt; надо сварить манную кашу&lt;br /&gt;
&lt;b&gt;Аналитик:&lt;/b&gt; вам кашу солить, перчить или посыпать сахаром?&lt;br /&gt;
&lt;b&gt;Заказчик:&lt;/b&gt; посыпать сахаром&lt;br /&gt;
&lt;b&gt;Аналитик:&lt;/b&gt; отлично описываю в ТЗ, варить кашу без соли, без перца, но с сахаром.&lt;br /&gt;
&lt;b&gt;Разработчик:&lt;/b&gt; Аналитики, да вы не правы, как же каша без соли? Так не делают...&lt;br /&gt;
&lt;b&gt;Аналитик:&lt;/b&gt; Ничего не знаю, так хочет заказчик, вот переписка. Делаем по постановке. Ну и идиоты эти заказчики.&lt;br /&gt;
&lt;b&gt;Тестирование:&lt;/b&gt; проверено, сварена одна порция каши, не соленая такая, что в рот не вотрешь. ... Зато по ТЗ ну и идиоты эти заказчики.&lt;br /&gt;
&lt;br /&gt;
-- отдали заказчику.&lt;br /&gt;
&lt;b&gt;Заказчик:&lt;/b&gt; Ваша каша дерьмо. Качество страдает (заказчик просто не понимает, что каша всего лишь не соленая). Ладно, отдаем в эксплуатацию, т. к. мы уже давно ждем вашу кашу...&lt;br /&gt;
&lt;b&gt;Заказчик:&lt;/b&gt; Пытались накормить одной порцией роту солдат, все остались голодные. Ваш продукт дерьмо, его использовать не возможно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS: Это не заказчик идиот.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/8891480033394611457/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2016/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8891480033394611457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8891480033394611457'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2016/10/blog-post.html' title='Замучали &quot;аналитики&quot;'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-5901402891611807203</id><published>2014-10-14T23:20:00.002+03:00</published><updated>2014-10-14T23:23:16.692+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="server media linux home group-post"/><title type='text'>Настройка домашнего медиа-сервера. Группировочный пост.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%!&lt;br /&gt;
&lt;br /&gt;
Сегодня хочу открыть этим постом серию записей о том, как я настраивал домашний медиа-сервер.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Постановка задачи:&lt;/h4&gt;
Хочу домашний сервер для своих задач. А именно:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;повесить где-нибудь в коридоре рядом с роутером, чтобы не гудел по ночам в комнате;&lt;/li&gt;
&lt;li&gt;запускать Web/Java/домашняя continues integration для своих проектов, либо для каких-то интересных решений (например, учет домашних финансов);&lt;/li&gt;
&lt;li&gt;файло-хранилище (&lt;strike&gt;помойка&lt;/strike&gt;). (Так уже сложилось, что объем фотографий не помещается целиком на ноуте, даже с дополнительным винчестером):&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;поэтому хочется хранить это всё на сервере, на клиенте просматривать;&lt;/li&gt;
&lt;li&gt;клиентов может быть много два ноута, телефоны, планшеты;&lt;/li&gt;
&lt;li&gt;у клиентов разные ОС. linux/windows/android/symbian;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;как решение NFS/Samba/webDav, может позже ещё чего придумается;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;медиа центр:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;музыка&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;подключу туда хорошие колонки (из-за нехватки места ноутбук всегда убирается в сумку), а музыку иногда хочется послушать в качественном звуке;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;видео и фото:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;выведу HDMI на телевизор;&lt;/li&gt;
&lt;li&gt;управлять буду беспроводной клавиатурой с тачпадом и телефоном;&lt;/li&gt;
&lt;li&gt;настрою интернет-телевидение (без приставки), т.к. у меня бесплатный пакет, а по факту нужен только один канал - &amp;nbsp;СОЮЗ.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;&quot;домашнее облако&quot;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;синхронизация фоток с телефона автоматом&lt;/li&gt;
&lt;li&gt;возможность &quot;расшарить&quot; что-то другим пользователям интернета&lt;/li&gt;
&lt;li&gt;возможность просмотра данных через web:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;медиа;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;просмотр фотографий;&lt;/li&gt;
&lt;li&gt;просмотр заранее скаченных мультфильмов для детей (чтобы не через ютуб с его агрессивной рекламой);&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;книжки;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;удобный анализатор и сортировщик коллекций домашнего фото и видео;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;автоматический конвертер видео файлов с фотоаппарата;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;... и т.д. (много можно ещё чего понаписать, ни одно облако сейчас такого не предоставляет, а я могу настроить всё, что захочу );&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;домашняя VPN-сеть:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;имею доступ к своим файлам откуда угодно с ноутбука;&lt;/li&gt;
&lt;li&gt;могу поставить клиент на работе куда хочу удаленно по RDP (teamviewer такому решению проигрывает по всем параметрам);&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;фильтры контента и контроль безопасности:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;при желании можно сервер поставить получать интернет и раздавать дальше (наверное, поэтому я заложился и купил маму с двумя сетевыми картами), а дальше настраиваем что хочется ;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Подборка железа:&lt;/h4&gt;
Любой сервер начинается с железки. Под него можно взять старенький ноутбук, у которого экран разбит, или старый комп. У меня такой железки под рукой не было, поэтому решил собрать себе мини-компьютер:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;простая мама + целерон;&lt;/li&gt;
&lt;li&gt;большой винт в 4Гб;&lt;/li&gt;
&lt;li&gt;SSD, чтобы по мелочам не напрягать большой винт и чтобы грузилось всё быстро;&lt;/li&gt;
&lt;li&gt;побольше памяти для memory дисков, чтобы поменьше ставить напрягать SSD&lt;/li&gt;
&lt;li&gt;корпус;&lt;/li&gt;
&lt;li&gt;беспроводная клавиатура с тачпадом.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Ссылки на мои решения:&lt;/h4&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://png-tech.blogspot.com/2014/10/vlc.html&quot; target=&quot;_blank&quot;&gt;Удаленный VLC&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/5901402891611807203/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2014/10/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/5901402891611807203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/5901402891611807203'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2014/10/blog-post.html' title='Настройка домашнего медиа-сервера. Группировочный пост.'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-7072354668516740033</id><published>2014-10-14T23:19:00.000+03:00</published><updated>2014-10-14T23:22:25.491+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="vlc remote web-interface media video player"/><title type='text'>Удаленный VLC</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Расскажу как настроить удаленное управление VLC.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Тут всё просто. Ставим VLC. Запускаем его скриптом&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
vlc /scripts/lantatv.m3u --http-host 0.0.0.0:8080 --extraintf=http --http-password &#39;mypasswd&#39;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
После этого открываем браузер и заходим на адрес медиа-центра&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
http://192.168.0.1:8080.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;Откроется примитивный web-интерфейс c basic-ауторизацией.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Поле логин оставляем пустым!&lt;/div&gt;
&lt;div&gt;
В поле пароль пишем указанный нами в скрипте пароль.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
через этот веб-интерфейс можно:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&amp;nbsp;изменять громкость;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;переключаться между каналами;&lt;/li&gt;
&lt;li&gt;ходить по файловой системе и открывать другие видео файлы на просмотр.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
PS: если запускать это всё на телефоне, то интерфейс будет другим, на некоторых телефонах может не запуститься флеш, но список нужный действий можно осуществить.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/7072354668516740033/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2014/10/vlc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7072354668516740033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7072354668516740033'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2014/10/vlc.html' title='Удаленный VLC'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-2839967520118768104</id><published>2012-08-17T08:50:00.000+03:00</published><updated>2012-08-17T08:56:49.374+03:00</updated><title type='text'>PlantUML интегрируется с JetBrains продуктами!</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%!&lt;br /&gt;
&lt;br /&gt;
Сегодня обнаружил, что мой любимый&amp;nbsp;&lt;a href=&quot;http://plantuml.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;PlantUml&lt;/a&gt;&amp;nbsp;теперь интегрируется с JetBrains Idea &amp;nbsp;и прочими JetBrains IDE. &amp;nbsp;Ура, удобно! Сам инструмент часто использую, чтобы быстро накидать &amp;nbsp;легкую UML.&lt;br /&gt;
&lt;br /&gt;
Список способов использования можно посмотреть &amp;nbsp;&lt;a href=&quot;http://plantuml.sourceforge.net/running.html&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
Сам плагин для Idea &lt;a href=&quot;http://plugins.jetbrains.com/plugin/?idea_ce&amp;amp;id=7017&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Для использования не забудьте поставить внешнюю утилиту &lt;a href=&quot;http://www.graphviz.org/&quot; target=&quot;_blank&quot;&gt;GraphViz&lt;/a&gt;, через нее PlantUml рисует картинки.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/2839967520118768104/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/08/plantuml-jetbrains.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2839967520118768104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2839967520118768104'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/08/plantuml-jetbrains.html' title='PlantUML интегрируется с JetBrains продуктами!'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-2961074159176094515</id><published>2012-08-02T08:21:00.001+03:00</published><updated>2012-09-18T14:54:57.448+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ide"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jetbrains"/><category scheme="http://www.blogger.com/atom/ns#" term="оптимизация"/><title type='text'>Оптимизируем работу JetBrains Idea продуктов</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%!&lt;br /&gt;
&lt;br /&gt;
Давно ничего не писал, т.к. не было особо времени. В последнее время моя Idea стала жутко тормозить. Настало время её как-то оптимизировать.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Для начала посмотрите в углу сколько в среднем памяти нужно вам под ваш проект.&amp;nbsp; Для себя я выбрал цифру 768 Мб.&lt;br /&gt;
&lt;div&gt;
В файл idea.exe.vmoptions (для windows систем) &amp;nbsp;и idea.vmoptions (для *nix систем) укажите следующие строки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
-Xms768m&lt;br /&gt;
-Xmx768m&lt;br /&gt;
-XX:MaxPermSize=512m&lt;br /&gt;
-XX:ReservedCodeCacheSize=64m&lt;br /&gt;
-XX:+UseParNewGC&lt;br /&gt;
-XX:ParallelGCThreads=4&lt;br /&gt;
-XX:MaxTenuringThreshold=1&lt;br /&gt;
-XX:SurvivorRatio=8&lt;br /&gt;
-XX:+UseConcMarkSweepGC&lt;br /&gt;
-XX:+CMSParallelRemarkEnabled&lt;br /&gt;
-XX:CMSInitiatingOccupancyFraction=65&lt;br /&gt;
-XX:+CMSScavengeBeforeRemark&lt;br /&gt;
-XX:+UseCMSInitiatingOccupancyOnly&lt;br /&gt;
-ea&lt;/blockquote&gt;
В итоге, я получил то, что моя Idea стала более быстро открываться и индексировать проект.&lt;br /&gt;
&lt;br /&gt;
Для пользователей RubyMine, PhpStorm, WebStorm &amp;nbsp;и прочих IDE от JetBrains настройки такие же, только файл настроек чуть другой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/2961074159176094515/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/08/jetbrains-idea.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2961074159176094515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2961074159176094515'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/08/jetbrains-idea.html' title='Оптимизируем работу JetBrains Idea продуктов'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-7992407196662795402</id><published>2012-04-15T20:41:00.000+03:00</published><updated>2012-04-15T20:41:09.577+03:00</updated><title type='text'>Закрыт баг с кодировкой utf8 в mysql для  Doctrine 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%!&lt;br /&gt;
Ранее я рассказывал &lt;a href=&quot;http://png-tech.blogspot.com/2011/09/utf8-doctrine-2.html&quot; target=&quot;_blank&quot;&gt;о баге&lt;/a&gt;, который нашел.&lt;br /&gt;
&lt;br /&gt;
Ура, мой баг закрыли. Это приятно.&lt;br /&gt;
Просто обновите Doctrine2 и скорректируйте настройки.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/7992407196662795402/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/04/utf8-mysql-doctrine-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7992407196662795402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7992407196662795402'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/04/utf8-mysql-doctrine-2.html' title='Закрыт баг с кодировкой utf8 в mysql для  Doctrine 2'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-1835100070869737042</id><published>2012-03-29T13:28:00.001+03:00</published><updated>2012-03-29T13:29:54.031+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="абстракции"/><category scheme="http://www.blogger.com/atom/ns#" term="архитектура"/><category scheme="http://www.blogger.com/atom/ns#" term="названия"/><category scheme="http://www.blogger.com/atom/ns#" term="объекты"/><category scheme="http://www.blogger.com/atom/ns#" term="ооп"/><title type='text'>Правильное именование классов как предмет хорошего ООП дизайна</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
На днях вникал в &amp;nbsp;&lt;a href=&quot;http://www.carlopescio.com/2011/04/your-coding-conventions-are-hurting-you.html&quot; target=&quot;_blank&quot;&gt;your-coding-conventions-are-hurting-you&lt;/a&gt;. Крайне рекомендую, чтобы потом задумываться о названиях классов и методов.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/1835100070869737042/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/1835100070869737042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/1835100070869737042'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/03/blog-post.html' title='Правильное именование классов как предмет хорошего ООП дизайна'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-706344624972631035</id><published>2012-02-06T12:50:00.001+03:00</published><updated>2012-02-08T12:30:21.095+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dom"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="parser"/><category scheme="http://www.blogger.com/atom/ns#" term="sample"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><category scheme="http://www.blogger.com/atom/ns#" term="парсер"/><category scheme="http://www.blogger.com/atom/ns#" term="пример"/><title type='text'>Java XML. DOM parser своими руками</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Сегодня делал простой DOM парсер на java. Навеяно&amp;nbsp;&lt;a href=&quot;http://javaswing.wordpress.com/2010/03/14/java_dom_xml/&quot; target=&quot;_blank&quot;&gt;этой статьей&lt;/a&gt;.&lt;br /&gt;
Материалов по теме достаточно, так что кидаю просто код.&lt;br /&gt;
&lt;br /&gt;
Идея примера - рекурсивно обойти DOM дерево и вывести все его атрибуты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть XML документ:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-attachment: initial; background-clip: initial; background-color: #f6f8ff; background-image: initial; background-origin: initial; color: #000020;&quot;&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt; &lt;span style=&quot;color: #004a43;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #008c00;&quot;&gt;&quot;1.0&quot;&lt;/span&gt; &lt;span style=&quot;color: #004a43;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;windows-1251&quot;&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt; &lt;span style=&quot;color: #474796;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Компьютерные сети&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Олифер&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt; &lt;span style=&quot;color: #474796;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Вычислительные сети сети&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Кто-то ещё&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Код обработки документа может выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;package png&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;samples&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;xml&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;domread&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;


&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; org&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;w3c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;dom&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Document&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; org&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;w3c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;dom&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;NamedNodeMap&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; org&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;w3c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;dom&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Node&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; org&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;w3c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;dom&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;NodeList&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; org&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;xml&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;sax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;SAXException&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; javax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;xml&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;parsers&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;DocumentBuilder&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; javax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;xml&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;parsers&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;DocumentBuilderFactory&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; javax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;xml&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;parsers&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;ParserConfigurationException&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;IOException&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class XmlDomReadSample &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #400000;&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #603000;&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;]&lt;/span&gt; args&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; throws IOException&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; SAXException&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; ParserConfigurationException &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        DocumentBuilderFactory f &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; DocumentBuilderFactory&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;newInstance&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        f&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;setValidating&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;false&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        f&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;setIgnoringElementContentWhitespace&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;true&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        DocumentBuilder builder &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; f&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;newDocumentBuilder&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        Document doc &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; builder&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;parse&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;/pre&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;          XmlDomReadSample&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;class&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getResourceAsStream&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;dom-read-sample-xml.xml&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        
        printDom&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;doc&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getFirstChild&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;void&lt;/span&gt; printDom&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #603000;&quot;&gt;String&lt;/span&gt; prefix&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Node node&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        
        &lt;span style=&quot;color: #603000;&quot;&gt;String&lt;/span&gt; text &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; node&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getNodeValue&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;text &lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null &lt;span style=&quot;color: #808030;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;text&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;isEmpty&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            System&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;prefix &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; value = &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; text &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        NamedNodeMap attributes &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; node&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getAttributes&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;attributes &lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; attributes&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getLength&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                Node attr &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; attributes&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;item&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;i&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                System&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;prefix &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;
                        &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; attr = &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; attr&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getNodeName&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;  &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;
                        &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; value = &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; attr&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getTextContent&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;toString&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

        NodeList children &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; node&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getChildNodes&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; children&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getLength&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            printDom&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;prefix &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; node&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getNodeName&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; children&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;item&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;i&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
Этот же код этого файла на github можно скачать здесь:&amp;nbsp;&lt;a href=&quot;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/domread/XmlDomReadSample.java&quot;&gt;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/domread/XmlDomReadSample.java&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Поясняю. printDom - та самая рекурсивная функция, которая реализует обход.&lt;br /&gt;
Берем файл из ресурсов, парсим его стандартными средствами Java, отдаем рекурсивной функции на вывод.&lt;br /&gt;
&lt;br /&gt;
Ранее я писал статью про &lt;a href=&quot;http://png-tech.blogspot.com/2011/08/sax-java.html&quot;&gt;SAX&lt;/a&gt;. Обращу внимание ещё раз на то, что через DOM парсить, легче (меньше логики), но когда возникают вопросы производительности, то лучше SAX.&lt;br /&gt;
&lt;br /&gt;
Кроме того, для упрощения работы советую разработчикам затачивать структуру XML документа под используемый способ анализа.&lt;br /&gt;
Для SAX анализа:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;делайте меньшую вложенность (в идеале документ должен быть линейным насколько это возможно);&lt;/li&gt;
&lt;li&gt;больше условий выносите в аттрибуты.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
Для DOM &amp;nbsp;анализа:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Лишняя иерархия тоже будет лишней, но и линейность будет ещё хуже. Лучше всего золотая середина: &lt;b&gt;умная иерархия.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Исходный код примера, смотрим здесь:&lt;br /&gt;
&amp;nbsp;&lt;a href=&quot;https://github.com/png-tech/PngJavaSamples/tree/master/SimpleExamples/src/png/samples/xml/domread&quot;&gt;https://github.com/png-tech/PngJavaSamples/tree/master/SimpleExamples/src/png/samples/xml/domread&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/706344624972631035/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/02/dom-parser.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/706344624972631035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/706344624972631035'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/02/dom-parser.html' title='Java XML. DOM parser своими руками'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-6595403285036385236</id><published>2012-02-05T18:20:00.002+03:00</published><updated>2012-02-07T15:02:04.694+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="абстракции"/><category scheme="http://www.blogger.com/atom/ns#" term="классы"/><category scheme="http://www.blogger.com/atom/ns#" term="лекция"/><category scheme="http://www.blogger.com/atom/ns#" term="объекты"/><category scheme="http://www.blogger.com/atom/ns#" term="ооп"/><title type='text'>Тезисы для лекции &quot;Объекты и типы&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span id=&quot;internal-source-marker_0.01803795574232936&quot; style=&quot;text-align: -webkit-auto;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h1 dir=&quot;ltr&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: small;&quot;&gt;&lt;span style=&quot;font-weight: normal; white-space: pre-wrap;&quot;&gt;Привет, %username%.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Были времена, когда я преподавал курс ООП в вузе. На каждую лекцию старался писать план или конспект. В основном оно всё было достаточно кратко и не представляет какого-либо интереса. Наиболее подробно прорабатывал вводное занятие&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&quot;Лекция 1. Объекты и типы&quot;.  Цель лекции &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial; white-space: pre-wrap;&quot;&gt;объяснить студентам, знающим только функциональное программирование (да и то не все), что такое объекты, классы, абстракции. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial; white-space: pre-wrap;&quot;&gt;Не стоит этот материал рассматривать как законченную лекцию, это просто тезисы, кое-где с примерами. Каждый пункт - это просто повод для разговора с аудиторией.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Итак, далее тезисы для  лекции 1: &quot;Объекты и типы&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h1 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: large; white-space: pre-wrap;&quot;&gt;Лекция 1. Объекты и их типы&lt;/span&gt;&lt;/h1&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Объекты реального мира&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-style: italic; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Объектно-ориентированное программирование (ООП)&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - это парадигма программирования, которая в настоящее время стала стандартом разработки программного обеспечения.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Что же это за объекты и почему мы должны на них ориентироваться? &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Прежде всего стоит ответить себе на вопрос: &lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;что мы понимаем под объектами реального мира? &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;То есть - что есть объект?&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Рассмотрим на примерах: &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Пример 1:&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; Объект - это стул, стол, а так же любая другая вещь. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Пример 2: &lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;А философия является объектом? Вообще, да. Потому что о ней можно говорить, она имеет четкое определение и характеристики. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Пример 3:&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; Цифра - это объект? ДА. 1 бит - это тоже объект!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Пример 4:&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; Представим себе голодного студента. Студент - это объект? ДА! &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;А о чем он думает?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;О том, чтобы поесть. Заметьте, он думает не об объекте еде, а об действии над этим объектом. О нем можно думать, говорить, оно может иметь конкретные характеристики. Можно сказать ел ложкой, или ел вилкой, или вообще пил чай.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Объект&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - это: предмет материального или не материального мира, а так же действие над другими объектами. Другими словами:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;ВСЁ ЕСТЬ ОБЪЕКТ!&lt;/span&gt;&lt;br /&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Модели в программах&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Из математики или физики мы знаем о существовании математических или физических моделей. Их цель описать процессы реального мира, чтобы решить какую-нибудь задачу. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Любая модель обладает следующими свойствами:&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;она упрощенное представление реального мира&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;она направленна на решение конкретного круга задач&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;точность представления зависит от решаемой задачи&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Так или иначе, каждая программа содержит внутри себя модель реального мира, которая сочетает в себе свойства математических и физических моделей. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Глобальная цель любой программы - упрощение жизни пользователя, автоматизация. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Задача языка программирования - предоставить средство для качественного описания модели программы.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Важный вывод: у каждой модели могут быть разные уровни детализации&lt;/span&gt;&lt;br /&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Типы объектов&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Например, необходимо описать &amp;nbsp;группу объектов. Пусть это будут геометрические фигуры. Описание может иметь следующий вид - фигура 1, фигура 2, фигура 3, … фигура 1000. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Получается достаточно трудоемкая задача. Объектов может быть много, некоторые однотипны, некоторые различны. Можно условно объединить однотипные объекты в группы, для их описания. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Например, 10 кругов различного радиуса, 5 квадратов, 985 многоугольников. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Такое описание гораздо компактней, сразу понятно что это и что с этим можно сделать. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Так рождается понятие типа объекта(класса).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Класс(тип объекта) - это описание характеристик группы объектов. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Далее мы будем о классе, но будем подразумевать, что можно есть и объект(объекты) этого класса, и наоборот, говорить об объекте(объектах), но описывая их, фактически описывать класс.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Красивое сравнение: класс - это чертеж, объект класса - это реальный объект, созданный по чертежам.&lt;/span&gt;&lt;br /&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Состояние объекта &lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Вернемся к примеру с голодным студентом. После того как он поест, он перестает быть голодным, он уже сытый студент. Отметим, что объект студент - тот же. Но в разные моменты времени - у него было различное поведение. &lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Голодный студент - нервный и раздражительный&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Сытый студент - добрый и сонный&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Таким образом, в разных состояниях один и тот же объект может вести себя по разному. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Другой пример, объект ручка. &lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Состояние 1. Новая ручка со стержнем. Пишет хорошо и тонко&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Состояние 2. Ручка исписанная на половину. Шарик разболтался и в результате ручка пишет, но “мажет” чернилами&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: disc; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Состояние 3. Стерженть ручки кончился. Ручка уже не пишет, но это всё таже ручка. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Из этого стоит сделать важный вывод: &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;каждый объект может &lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;иметь внутренне состояние&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; и &lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;совершать действия&lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;, которые зависят от его состояния.&lt;/span&gt;&lt;br /&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;


&lt;span style=&quot;font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Абстракции в разработке ПО&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Любая программа - это абстракция!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;программа на ассемблере - абстракция на команды процессора&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;программа на Си - абстракция на циклы, условия, переменные&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;программа на ООП-языке - набор абстракций, описывающих реальную задачу. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Основные инструменты языка - классы и объекты.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Почему популярно? Вся красота в ЛЕГО!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;Во многом, написание этих тезисов меня вдохновили первые главы книги &lt;a href=&quot;http://www.ozon.ru/context/detail/id/4073388/&quot; target=&quot;_blank&quot;&gt;Б Эккель Философия Java (Thinking in Java)&lt;/a&gt;. Там понятию ООП уделяется несколько первых глав. Вместо того, чтобы читать мою писанину, советую почитать эту книжку.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/6595403285036385236/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/02/username_05.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6595403285036385236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6595403285036385236'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/02/username_05.html' title='Тезисы для лекции &quot;Объекты и типы&quot;'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-869277012991534973</id><published>2012-02-05T17:53:00.000+03:00</published><updated>2012-02-06T17:47:46.187+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="forms"/><category scheme="http://www.blogger.com/atom/ns#" term="gwt"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><category scheme="http://www.blogger.com/atom/ns#" term="метаописание"/><category scheme="http://www.blogger.com/atom/ns#" term="пользовательские интерфейсы"/><title type='text'>Идеи по мета-программированию пользовательских интерфейсов</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Недавно задался вопросом автоматической генерации пользовательского интерфейса на основе мета описания в java.&lt;br /&gt;
&lt;br /&gt;
Спрашивается, а зачем!.На то есть две причины:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Автоматизация рутинных действий программиста (интерфейса может быть много)&lt;/li&gt;
&lt;li&gt;Вынос информации о типовом представлении (view) в область модели (model) в рамках логики MVC. По сути дела информация о структуре представления данных - это тоже данные, которые могут меняться, а точных представлений может быть несколько.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Далее покажу свои мысли и что нарыл на просторах интернета.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Итак, &amp;nbsp;все началось с того, что я задумал проект, который будет иметь несколько разных отображений одного и того же функционала. Например, есть функционал, он реализован в:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;desktop-исполнении (пусть для примера будет swing);&lt;/li&gt;
&lt;li&gt;web-исполнении (пусть для примера будет gwt);&lt;/li&gt;
&lt;li&gt;сервис исполнении (пусть для примера будет REST-сервис);&lt;/li&gt;
&lt;li&gt;jabber-исполнении (jabber-бот воспринимающий команды);&lt;/li&gt;
&lt;li&gt;консольное исполнение (управление через команды командной строки);&lt;/li&gt;
&lt;li&gt;ну и что-нибудь ещё, на что фантазии хватит.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Вопрос встал такой, хочется, чтобы весь функционал описывался лишь в одном месте(метаописание), а в представлениях прописывались лишь детали реализации.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Такую проблему решал не один я, поэтому обратимся к интернету:&lt;/div&gt;
&lt;div&gt;
Получилась целая куча решений. Кидаю подборку ссылок:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://stackoverflow.com/questions/1999182/java-swing-generating-dynamic-gui-forms-from-xml&quot;&gt;http://stackoverflow.com/questions/1999182/java-swing-generating-dynamic-gui-forms-from-xml&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.metawidget.org/&quot;&gt;http://www.metawidget.org/&lt;/a&gt;&amp;nbsp;&lt;b&gt;&amp;lt;=&amp;nbsp;похоже это то, что нужно (описание &lt;a href=&quot;http://habrahabr.ru/blogs/java/114146/&quot;&gt;тут&lt;/a&gt;)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://code.google.com/p/swing-formbuilder/&quot;&gt;http://code.google.com/p/swing-formbuilder/&lt;/a&gt;&amp;nbsp;&lt;b&gt;&amp;lt;= &amp;nbsp;и это тоже зачетно (описание &lt;a href=&quot;http://habrahabr.ru/blogs/java/126579/&quot;&gt;тут&lt;/a&gt; )&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.swixml.org/&quot;&gt;http://www.swixml.org/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://cookxml.yuanheng.org/cookswing/&quot;&gt;http://cookxml.yuanheng.org/cookswing/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://jfcml.sourceforge.net/&quot;&gt;http://jfcml.sourceforge.net/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://java-source.net/open-source/xml-user-interface-toolkits&quot;&gt;http://java-source.net/open-source/xml-user-interface-toolkits&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.jeasy.de/JEasyquestions.htm&quot;&gt;http://www.jeasy.de/JEasyquestions.htm&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/869277012991534973/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2012/02/username.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/869277012991534973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/869277012991534973'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2012/02/username.html' title='Идеи по мета-программированию пользовательских интерфейсов'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-2285565422625464449</id><published>2011-12-20T21:38:00.000+03:00</published><updated>2012-01-29T19:57:40.014+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mail"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="queue"/><category scheme="http://www.blogger.com/atom/ns#" term="send"/><category scheme="http://www.blogger.com/atom/ns#" term="swift mail"/><category scheme="http://www.blogger.com/atom/ns#" term="symfony 2"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><category scheme="http://www.blogger.com/atom/ns#" term="zend mail"/><title type='text'>Размышления о правильной отправке почты в вашем PHP приложении или Swift Mail изнутри</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Если ты использовал Symfony 2.0, то наверняка некоторые фичи захотелось бы вытащить и использовать в другом, не symfony2, проекте. Сегодня мы поговорим об отправке почты.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Краткая справка как правильно.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Как известно, PHP уже имеет встроенную &lt;a href=&quot;http://php.net/manual/ru/function.mail.php&quot;&gt;функцию отправки почты&lt;/a&gt;. Она использует sendmail. И в принципе, там почти всё есть. Почему же появляются разные библиотеки, типа Zend_Mail или Swift_Mail ?&lt;br /&gt;
&lt;br /&gt;
ИХМО, ответ прост:&lt;br /&gt;
&lt;i&gt;отправка сообщений, это не только непосредственная отправка данных почтовому серверу, а так же ещё комплекс мероприятий по формированию данных для отправки.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Общий алгоритм отправки сообщения:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Формируем данные(текст или HTML), заголовки(тема и прочие параметры), вложенные файлы.&lt;/li&gt;
&lt;li&gt;отправляем их mail-серверу&lt;/li&gt;
&lt;li&gt;если отправка по каким-либо причинам не удалась, то через некоторое время пункт 2 следует повторить&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Отметим, что пункт 3 просто не обходим, т.к на момент отправки могут быть проблемы с интернетом, или с сервером. Исходя из описанной стратегии, очевидно, что пункты 2-3 нужно выполнять в фоне.&lt;br /&gt;
&lt;br /&gt;
У нас есть функция, которая делает пункт 2. И только! А остальную логику писать надо самим. Плюс не слишком удобный процедурный синтаксис заставляет нас делать одни и те же действия постоянно.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Чего ещё не хватает?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;реализации пункта 2-3 алгоритма отправки в одной логике&lt;/li&gt;
&lt;li&gt;SMTP-протокол&lt;/li&gt;
&lt;li&gt;Вложения более простым способом&amp;nbsp;&lt;/li&gt;
&lt;li&gt;И прочих фишек и плюшек, далее перечислять лень, всё-равно что-нибудь забуду...&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Общий алгоритм действий&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Формируем данные и кладем их в очередь&lt;/li&gt;
&lt;li&gt;Пускаем &lt;a href=&quot;http://ru.wikipedia.org/wiki/Cron&quot;&gt;крон&lt;/a&gt; (процесс-задание, выполняемое периодически), который&amp;nbsp;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;вытаскивает пачку данных из очереди (например, 10 писем, будем слать по N штук за раз)&lt;/li&gt;
&lt;li&gt;отсылает их на mail сервер&lt;/li&gt;
&lt;li&gt;в случае успеха удаляет их из очереди&lt;/li&gt;
&lt;li&gt;выходит, чтобы запуститься через некоторое время снова.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Что предлагают нам сторонние библиотеки?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
Как всегда, не очень хочется изобретать велосипед. Причем, по началу у всех они кривы на столько, что хочется выкинуть и переписать заново.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://framework.zend.com/manual/ru/zend.mail.html&quot;&gt;Zend&lt;/a&gt;, конечно, предлагает&amp;nbsp;&amp;nbsp;достаточно сильный вариант, но логику 3 придется делать самим, тем более механизм для этой логики они тоже &lt;a href=&quot;http://framework.zend.com/manual/ru/zend.queue.html&quot;&gt;дают: очереди&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
ИХМО, Zend - это библиотека-конструктор, она дает много мелких кубиков, из которых можно собрать что угодно. Надо всего лишь только собрать. Так и тут, даны очереди и функция отправки почты, остальное господа разработчики напишите сами.&lt;br /&gt;
Скажу, честно: Zend мне не очень нравится, т.к. его кубики слишком&amp;nbsp;ароматны, их сложно наследовать и расширять. Местами без методики &lt;a href=&quot;http://habrahabr.ru/blogs/complete_code/112276/&quot;&gt;COPY-PASTE&lt;/a&gt;&amp;nbsp;обойтись практически не возможно. Часто приходится делать практически одно и тоже из проекта в проект.&lt;br /&gt;
Если же вы разрабатываете на Zend, то вы обречены на ковыряние с кубиками разной формы.&amp;nbsp;Местами у меня складывается впечатление, что у&amp;nbsp;разработчиков&amp;nbsp;Zend туговато с принципами ООП и с пониманием, что такое фреймворк.&lt;br /&gt;
&lt;br /&gt;
И так кубики, от Zend:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Делаем кубик с данными (все данные необходимые для отправки)&lt;/li&gt;
&lt;li&gt;Кладем в его в очередь&amp;nbsp;&lt;/li&gt;
&lt;li&gt;В кроне:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;достаем N кубиков из очереди (Zend_Queue)&lt;/li&gt;
&lt;li&gt;формируем для каждого из них письмо через Zend_Mail&lt;/li&gt;
&lt;li&gt;Отправляем, если успешно, удаляем из очереди&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Другой популярный фреймворк:&amp;nbsp;&lt;a href=&quot;http://symfony.com/doc/2.0/cookbook/email.html&quot;&gt;Symfony 2&lt;/a&gt; предлагает использовать удобную библиотеку swift_mail. Эта же библиотека предлагает &lt;a href=&quot;http://symfony.com/doc/2.0/cookbook/email/spool.html&quot;&gt;решение-очередь&lt;/a&gt;. Повторяться как его делать я не буду, т.к. в&amp;nbsp;&lt;a href=&quot;http://symfony.com/doc/2.0/cookbook/email.html&quot;&gt;документации&lt;/a&gt;, всё подробно описано.&lt;br /&gt;
&lt;br /&gt;
Решение swift_mail более привлекательно потому, что кубика с данными (как в случае Zend) нам уже не нужно, его функцию выполняет само письмо, положенное в spool. Таким образом удается убрать лишний слой абстракции и упростить немного конечное приложение. А как известно, чем проще код, тем лучше.&lt;br /&gt;
&lt;br /&gt;
В реализации отправки почты в symfony2, мы просто пишем код создания письма и прописываем команду в crontab. Я как разработчик должен закодировать формирование данных письма, а остальную рутинную работу за меня делает фреймворк.&lt;br /&gt;
И это приятно.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;http://swiftmailer.org/&quot;&gt;Swift Mail&lt;/a&gt; изнутри&lt;/span&gt;&lt;br /&gt;
Если хочется, иметь swift_mail в вашем другом проекте, то библиотеку SwiftMail можно использовать отдельно. Давайте посмотрим на эту&lt;a href=&quot;https://github.com/swiftmailer/swiftmailer&quot;&gt; библиотеку изнутри&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Ставим её при помощи &lt;a href=&quot;http://pear.swiftmailer.org/&quot;&gt;PEAR&lt;/a&gt;,&amp;nbsp;или качаем c &lt;a href=&quot;https://github.com/swiftmailer/swiftmailer&quot;&gt;github&lt;/a&gt;, или вообще грузим архив с &lt;a href=&quot;http://swiftmailer.org/&quot;&gt;официального сайта&lt;/a&gt;.&lt;br /&gt;
Библиотека написана с использованием PHP 5.2. Это замечательно, т.к. не всегда есть возможность использовать PHP 5.3.&amp;nbsp;Документация и код сайта говорит о двух основных уровнях абстракции:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Первый - транспорт. Это группа объектов, объединенных интерфейсом, которые позволяют определить различные настройки отправки почты. за подробностями &lt;a href=&quot;https://github.com/swiftmailer/swiftmailer/blob/master/doc/overview.rst&quot;&gt;отошлю к документации&lt;/a&gt;&amp;nbsp;(cм. заголовок - Transport).&lt;/li&gt;
&lt;li&gt;Второй - почтовик. Это объект, который предоставляет API по созданию любых почтовых сообщений.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Очереди почтовых сообщений&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Такая функциональность как очередь почтовых сообщений на отправку реализована как подтип &amp;nbsp;транспорта. Для продакшена рекомендую использовать&amp;nbsp;&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; text-align: -webkit-auto;&quot;&gt;Swift_FileSpool. Для тестирования логики приложения, лучше использовать&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; text-align: -webkit-auto;&quot;&gt;&amp;nbsp;Swift_MemorySpool, которая в свою очередь обертывает простой массив.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; text-align: -webkit-auto;&quot;&gt;&lt;span style=&quot;font-family: inherit; font-size: large;&quot;&gt;Пример отправки почты через очереди&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;span style=&quot;color: #222222; font-family: inherit;&quot;&gt;Скрипт для отправки сообщений в очередь сообщений.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #5f5035;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: dimgrey;&quot;&gt;//require_once &#39;lib/swift_init.php&#39;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: dimgrey;&quot;&gt;// тут аутолоадер свой подключается. &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;require_once&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;swift_required.php&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: dimgrey;&quot;&gt;//Create the Transport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_FileSpool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #400000;&quot;&gt;realpath&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #400000;&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #7d0045;&quot;&gt;__FILE__&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;/../spool&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$transport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_SpoolTransport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;newInstance&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: dimgrey;&quot;&gt;//Create the Mailer using your created Transport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$mailer&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_Mailer&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;newInstance&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$transport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$message&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_Message&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;newInstance&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;Тест!&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;Тест-тест!&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;txt/text&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;cp1251&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setFrom&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;test1@mail.ru&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;Васька Пупкин&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setTo&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;test2@mail.ru&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;Петька&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;test3@mail.ru&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;Петрович&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: dimgrey;&quot;&gt;//Send the message&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$numSent&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$mailer&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$message&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #222222; font-family: inherit;&quot;&gt;Обратите внимание, создаем очередь. Подпихиваем её в специальный транспорт, который понимает интерфейс очередей и шлет в очередь данные. А далее как по маслу: через API шлем почту, а почта складывается в очереди.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #222222; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #222222; font-family: inherit;&quot;&gt;А теперь рассмотрим скрипт -крон непосредственной отправки писем:&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;pre style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #5f5035;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$messageLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #008c00;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$timeLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;require_once&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;swift_required.php&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_FileSpool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #400000;&quot;&gt;realpath&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #400000;&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #7d0045;&quot;&gt;__FILE__&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;/spool&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$transportReal&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; Swift_SmtpTransport&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;newInstance&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;smtp.mail.ru&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #008c00;&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setUsername&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;robot@mail.ru&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setPassword&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;pass&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setMessageLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$messageLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;setTimeLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$timeLimit&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$sent&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$spool&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;flushQueue&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$transportReal&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: maroon; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #400000;&quot;&gt;sprintf&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #0000e6;&quot;&gt;&#39;sent %s emails&#39;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #797997;&quot;&gt;$sent&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial;&quot;&gt;&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: black;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-color: #ffffe8; background-image: initial; background-origin: initial; color: #5f5035;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Здесь мы делаем два транспорта, один очередь, а другой реальный. И по 10 штук шлем из одного в другой.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;На этом всё. Надеюсь, я кому-нибудь помог. Всем спасибо за внимание..&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/2285565422625464449/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/12/php-swift-mail.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2285565422625464449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2285565422625464449'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/12/php-swift-mail.html' title='Размышления о правильной отправке почты в вашем PHP приложении или Swift Mail изнутри'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-6765705095396377450</id><published>2011-11-17T18:54:00.001+03:00</published><updated>2012-01-29T19:59:13.889+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="doctrine 2"/><category scheme="http://www.blogger.com/atom/ns#" term="forms"/><category scheme="http://www.blogger.com/atom/ns#" term="models"/><category scheme="http://www.blogger.com/atom/ns#" term="symfony 2"/><title type='text'>Symfony 2 Фиктивные модели для форм</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Обещал в блоге писать про яву, но так получилось, что сейчас разбираюсь с Symfony2 + Doctrine 2. Поэтому пишу что нарыл. 

Про формы symfony 2 можно почитать &lt;a href=&quot;http://symfony.com/doc/current/book/forms.html&quot;&gt;здесь&lt;/a&gt;.  

Правда там не всё, что нужно. Для простой формочки хватает, а когда начинаешь делать что-то по сложнее - то возникают проблемы. 

Проблема первая. 
Есть модель(entity). Нужно сделать форму определенного вида. Причем элементы модели не совпадают с элементами формы. 
Долго мучался, с мануалами и стилями, что-то получилось, а что-то оказалось сделать вообще не возможно.&lt;br /&gt;
Посмотрим что из этого получилось.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
Опишу возможные выходы из ситуации:

&lt;br /&gt;
&lt;h2&gt;
Решение первое. Уродское&lt;/h2&gt;
Делаем форму руками, получаем сырые данные, пихаем в модель. 
Решение работоспособное, но очень не красивое. Мне оно не нравится. 

&lt;br /&gt;
&lt;h2&gt;
Решение второе. Красивое&lt;/h2&gt;
Заводим новую модель, которая не привязана в БД. У этой модели прописываем нужные поля и нужные типы - такие как у формы. Пишем класс FormType, который построит форму. 
Стилями выровняем её вид. 

А далее как в мануале. В конце осталось скопировать данные из дополнительной модели в основную. 

Плюс такого подхода в том, что не нужно работать с сырыми данными. А переливание данных из модели можно проверить UNIT-тестами. 
А так же мы используем ООП на полную катушку и работаем с объектами.

Хочется как-нибудь написать более развернутую статью про это с примерами. Если я всё-же её сделаю, то поставлю сюда ссылку.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/6765705095396377450/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/11/symfony-2.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6765705095396377450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6765705095396377450'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/11/symfony-2.html' title='Symfony 2 Фиктивные модели для форм'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-8592141667232413486</id><published>2011-11-11T20:38:00.001+03:00</published><updated>2012-01-29T20:00:11.977+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="lesscss"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><title type='text'>Истории про lesscss</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%!&lt;br /&gt;
Хочу поделиться опытом в области прикручивания компилятора less к symfony2.&lt;br /&gt;
Во-первых, есть такая надстройка над css &lt;a href=&quot;http://lesscss.org/&quot;&gt;less&lt;/a&gt;.

Для компиляции через php есть библиотека &lt;a href=&quot;http://leafo.net/lessphp/docs/&quot;&gt;lessphp&lt;/a&gt;.
Она имеет не достаток - не поддерживает директиву @import.

Если очень нужно, то можно использовать компилятор на nodejs. 
Есть клиентский (на лету в браузере), есть серверный. 

С серверным недавно вышла проблема. компилятор работает только на версии nodejs 0.4.9. На nodejs 0.5.x и 0.6.x не подключается сама библиотека &lt;b&gt;lessc&lt;/b&gt;.&lt;br /&gt;
На этом всё, спасибо за внимание.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/8592141667232413486/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/11/lesscss.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8592141667232413486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8592141667232413486'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/11/lesscss.html' title='Истории про lesscss'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-3326007210443992771</id><published>2011-10-15T00:37:00.000+03:00</published><updated>2012-01-29T20:00:52.679+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="autoload"/><category scheme="http://www.blogger.com/atom/ns#" term="highload"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="production"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><title type='text'>Подготовка Zend к продакшену для highload проектов</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.
&lt;br /&gt;
Сегодня подниму вопрос о использовании Zend компонентов на production в highload проектах. 
&lt;br /&gt;
Проблема в том, что Zend достаточно тяжелый продукт, он содержит море классов. При оценке производительности приложения выясняется, что львиную долю времени занимают &quot;инклуды&quot; классов Zend .&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
Есть соответствующий &lt;a href=&quot;http://stackoverflow.com/questions/3777765/using-zend-framework-for-highload-projects&quot;&gt;вопрос на stackoverflow&lt;/a&gt;.
&lt;br /&gt;
Решение - удалить все инклуды и использовать механизма аутолодинга. 
Это поможет сделать следующий скрипт. Он взят с &lt;a href=&quot;http://framework.zend.com/manual/en/performance.classloading.html#performance.classloading.striprequires.sed&quot;&gt;официального сайта&lt;/a&gt; .
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;color: dimgrey;&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;# see &lt;/span&gt;&lt;span style=&quot;color: #5555dd;&quot;&gt;http://framework.zend.com/manual/en/performance.classloading.html#performance.classloading.striprequires.sed&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;# see &lt;/span&gt;&lt;span style=&quot;color: #5555dd;&quot;&gt;http://test.ical.ly/2011/02/24/using-zend-framework-components-in-a-symfony2-project/&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;# symfony 2.0 vendors &lt;/span&gt;
&lt;span style=&quot;color: #bb7977; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #40015a;&quot;&gt;/vendor/zf/library&lt;/span&gt;
find &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;.&lt;/span&gt; -name &lt;span style=&quot;color: #0000e6;&quot;&gt;&#39;*.php&#39;&lt;/span&gt; -not -wholename &lt;span style=&quot;color: #0000e6;&quot;&gt;&#39;*/Loader/Autoloader.php&#39;&lt;/span&gt; &lt;span style=&quot;color: #0f69ff;&quot;&gt;\&lt;/span&gt;
-not -wholename &lt;span style=&quot;color: #0000e6;&quot;&gt;&#39;*/Application.php&#39;&lt;/span&gt; -print0 &lt;span style=&quot;color: #e34adc;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color: #0f69ff;&quot;&gt;\&lt;/span&gt;
xargs -&lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #bb7977; font-weight: bold;&quot;&gt;sed&lt;/span&gt; --regexp-extended --&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;in&lt;/span&gt;-place &lt;span style=&quot;color: #0000e6;&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;require_once&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\/&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\1&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;&#39;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
После того, как сделал, стало чуть по легче. &lt;br /&gt;
Если всё-равно проблема остается, то весь Zend сливают в один файл. Кстати, некоторые аутолоадеры так и поступаю, при первом пробеге кешируют результат.&lt;br /&gt;
На этом всё. Спасибо за внимание.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/3326007210443992771/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/10/zend-highload.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/3326007210443992771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/3326007210443992771'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/10/zend-highload.html' title='Подготовка Zend к продакшену для highload проектов'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-278565273710865433</id><published>2011-09-27T09:32:00.002+03:00</published><updated>2012-04-15T20:37:28.932+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="doctione migrations"/><category scheme="http://www.blogger.com/atom/ns#" term="doctrine 2"/><category scheme="http://www.blogger.com/atom/ns#" term="encode"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="symfony 2"/><category scheme="http://www.blogger.com/atom/ns#" term="utf8"/><category scheme="http://www.blogger.com/atom/ns#" term="багфикс"/><category scheme="http://www.blogger.com/atom/ns#" term="кодировка"/><title type='text'>Багфикс кодировки utf8 для генерации таблиц в Doctrine 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.
&lt;br /&gt;
Иногда пользуюсь Docrine 2.1/Symfony 2.0. + doctrine migrations. В один прекрасный момент возникла проблема с кодировкой БД mysql при автоматическом создании таблиц. Покопавшить немного в &lt;a href=&quot;http://www.doctrine-project.org/projects/dbal&quot;&gt;Docrine DBAL&lt;/a&gt; выяснилось, что при создании схемы, параметры кодировки не учитываются.
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Схема БД генерится в примерно так:
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;color: dimgrey;&quot;&gt;/* было */&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;TABLE&lt;/span&gt; TABLENAME &lt;span style=&quot;color: purple;&quot;&gt;(&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;/* ... */&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;)&lt;/span&gt; ENGINE &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #074726;&quot;&gt;InnoDB&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
А нам нужно:
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;color: dimgrey;&quot;&gt;/* нужно */&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;TABLE&lt;/span&gt; TABLENAME &lt;span style=&quot;color: purple;&quot;&gt;(&lt;/span&gt;
&lt;span style=&quot;color: dimgrey;&quot;&gt;/* ... */&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #074726;&quot;&gt;DEFAULT&lt;/span&gt; &lt;span style=&quot;color: #bb7977;&quot;&gt;CHARACTER&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;SET&lt;/span&gt; utf8 COLLATE utf8_general_ci ENGINE &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #074726;&quot;&gt;InnoDB&lt;/span&gt;
&lt;/pre&gt;
Причем ни на какие настройки &lt;a href=&quot;http://www.doctrine-project.org/projects/dbal&quot;&gt;Docrine DBAL&lt;/a&gt; не реагировал. 

&lt;br /&gt;
&lt;h3&gt;

Решение проблемы:&lt;/h3&gt;
Открываем код. Находим файл doctrine-dbal/lib/Doctrine/DBAL/Schema/Schema.php
ищем строку &quot;new Table&quot;. Она там одна, код выглядит как-то так: 
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Create a new table&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param  string $tableName&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return Table&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; createTable&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$tableName&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; Table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$tableName&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;_addTable&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
Добавляем в конструктор объекта Table параметры: 
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;
&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;charset&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;utf8&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;collate&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;utf8_general_ci&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;
Получится что-то типа такого:
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Create a new table&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param  string $tableName&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return Table&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; createTable&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$tableName&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; Table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$tableName&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;charset&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;utf8&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;collate&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;utf8_general_ci&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;_addTable&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$table&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
После этого можете запускать &lt;b&gt;doctrine:migrations:diff&lt;/b&gt; и получать правильный SQL код.  

&lt;br /&gt;
&lt;b&gt;Написал мини патч, чтобы при каждом обновлении не править, написал патч:&lt;/b&gt;

&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;#!/usr/bin/php
&lt;span style=&quot;background-color: #ffffe8; color: #a65700;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;* Doctrine DBAL Patch&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;* &lt;/span&gt;&lt;span style=&quot;background-color: olive; color: white;&quot;&gt;fix table creation query encode&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;* (c) _Nicolay&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: dimgrey;&quot;&gt;&amp;nbsp;*/&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: #400000;&quot;&gt;system&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;cp ./vendor/doctrine-dbal/lib/Doctrine/DBAL/Schema/Schema.php ./vendor/doctrine-dbal/lib/Doctrine/DBAL/Schema/Schema.php.Orig&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #400000;&quot;&gt;file_get_contents&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;./vendor/doctrine-dbal/lib/Doctrine/DBAL/Schema/Schema.php&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #400000;&quot;&gt;str_replace&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&quot;new Table(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0f69ff;&quot;&gt;\$&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;tableName);&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&quot;new Table(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0f69ff;&quot;&gt;\$&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;tableName,array(),array(),array(),0,array(&#39;charset&#39;=&amp;gt;&#39;utf8&#39;,&#39;collate&#39;=&amp;gt;&#39;utf8_general_ci&#39;));&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #ffffe8; color: #400000;&quot;&gt;file_put_contents&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #0000e6;&quot;&gt;&#39;./vendor/doctrine-dbal/lib/Doctrine/DBAL/Schema/Schema.php&#39;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: purple;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffe8; color: black;&quot;&gt;&lt;/span&gt;
&lt;/pre&gt;
Про проблему &lt;a href=&quot;http://www.doctrine-project.org/jira/browse/DBAL-166&quot;&gt;создал задачу&lt;/a&gt;  на баг фикс.

На этом всё, надеюсь кому-нибудь помог. &lt;br /&gt;
&lt;br /&gt;
UPD:&lt;br /&gt;
&lt;br /&gt;
Ура, мой баг закрыли. Просто обновите Doctrine2 и посмотрите настройки внимательно.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/278565273710865433/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/utf8-doctrine-2.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/278565273710865433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/278565273710865433'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/utf8-doctrine-2.html' title='Багфикс кодировки utf8 для генерации таблиц в Doctrine 2'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-125541672316036333</id><published>2011-09-13T07:53:00.001+03:00</published><updated>2012-01-29T20:03:35.578+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><category scheme="http://www.blogger.com/atom/ns#" term="деревья"/><category scheme="http://www.blogger.com/atom/ns#" term="костыль"/><category scheme="http://www.blogger.com/atom/ns#" term="рекурсия"/><category scheme="http://www.blogger.com/atom/ns#" term="хранимые процедуры"/><title type='text'>Задача отображения деревьев в MySql. Способ отображения на хранимых процедурах.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h2&gt;
&lt;i&gt;Предисловие.&lt;/i&gt;&lt;/h2&gt;
&lt;i&gt;Эта статья когда-то(года этак 2 назад) публиковалась на &lt;a href=&quot;http://habrahabr.ru/&quot;&gt;habrahabr.ru&lt;/a&gt; от имени моего друга, т.к. тогда ещё у меня не было аккаунта на &lt;a href=&quot;http://habrahabr.ru/&quot;&gt;habrahabr&lt;/a&gt;. &lt;strike&gt;Потом друг убрал её из своих статей&lt;/strike&gt;. Не убрал,&lt;a href=&quot;http://habrahabr.ru/blogs/mysql/72700/&quot;&gt; вот она&lt;/a&gt;.  Публиковать повторно не хочется, поэтому чтобы материал не пропадал, публикую здесь. Поэтому сразу оговорюсь, что cтатья - не рекомендация к действию. Была конкретная проблема, конкретная задача, я её решил вот так. Потратил на это времени часа этак два. Если бы мне нужно было решать аналогичную задачу с нуля, то так я делать не стал бы уж точно. В итоге, получился такой добротный костыль. Привожу статью в том виде, как она была. Это одна из первых моих статей. 
&lt;br /&gt;
PS: я в курсе, что есть &lt;a href=&quot;http://en.wikipedia.org/wiki/Nested_set_model&quot;&gt;nested sets&lt;/a&gt; и другие способы организации иерархических данных.  Ещё раз напомню, мы сейчас говорим о костыле.
&lt;/i&gt;
&lt;br /&gt;
&lt;i&gt;&lt;/i&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;h2&gt;
Итак, поехали &quot;костылять&quot;&lt;/h2&gt;
Очень хотелось поднять вопрос о древовидных структурах в MySql. А конкретно о выборках и хранении данных..
Пользователям Oracle и PostgresSQL живется хорошо, в этих БД есть встроенные средства выборки рекурентных данных (см. &lt;a href=&quot;http://habrahabr.ru/blogs/sql/43955/&quot;&gt;Иерархические (рекурсивные) запросы&lt;/a&gt;).
Пользователям Mysql приходится работать уже с тем, что есть, то есть работа на стороне клиента. 
Поскольку эта тема не однократно поднималась, то я попробую рассказать о конкретной задаче и способе её решения.

&lt;br /&gt;
&lt;h2&gt;
Задача&lt;/h2&gt;
Есть проект на php, в нем двевовидная структура реализованнная в таблице mysql catalog (id int NOT NULL,pid int NOT NULL, ...) 
pid - это id родителя. То есть данные хранятся в одной таблице, каждая ячейка ссылается на родительскую. Таким образом формируется все дерево.
Естественно в таблице хранится куча связанных данных, описание которых я опущу, так как они на суть задачи не повлияют, а будут только мешаться.

Пример такого хранения данных:
&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;TABLE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;catalog&lt;/span&gt;(&lt;/li&gt;
&lt;li&gt; id &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NULL&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;PRIMARY&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; pid &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NULL&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; someData text &lt;span style=&quot;color: blue;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NULL&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;comment = &quot;табличка с рекурентной стркутурой&quot;; &lt;/li&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/ol&gt;
&lt;code&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;* This source code was highlighted with &lt;a href=&quot;http://virtser.net/blog/post/source-code-highlighter.aspx&quot;&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;

&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;border-collapse: collapse; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #cccccc;&quot;&gt;&lt;th&gt;id&lt;/th&gt;&lt;th&gt;pid&lt;/th&gt;&lt;th&gt;someData&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;Каталог&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Книга 1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Книга 2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Глава 1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Глава 2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Глава 3&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;img src=&quot;http://img5.imageshack.us/img5/232/treeug.png&quot; /&gt;&lt;br /&gt;
Производится выборка данных всего дерева рекурентно на стороне клиента. Общий объем базы 500Мб, и дальше будет только расти. Поскольку ветвей и узлов много, то общее количество запросов к базе на данный момент колеблется от 300 до 1000.

В результате рекурентной выборки формируется массив данных (зачем-то тоже рекурентного вида), который отдается на сьедение шаблонизатору.
Задача, оптимизировать выборку так, чтобы выдергивать необходимые данные одним запросом (ну или двумя-тремя, но не так, чтобы их было так много... )

Надо сказать, что структура хранения данных менять нельзя, т.к. под нее написано куча кода. Переписывать всё - долго. И написано всё так, что никакой абстракции не подставишь. 

&lt;br /&gt;
&lt;h2&gt;
Вариант решения&lt;/h2&gt;
Задача в целом тривиальна. Она неоднократно &lt;a href=&quot;&quot; hreg=&quot;http://habrahabr.ru/blogs/mysql/67722/&quot;&gt;решалась&lt;/a&gt;;. Вводятся &lt;strong&gt;дополнительные данные&lt;/strong&gt;, которые используются для ограничения выборки из таблицы. Весь вопрос сводится только к тому, что это за дополнительное поле (поля). Так или иначе дополнительные данные ведут к избыточности, а значит к накладным расходам по поддержке корректности данных.

В публикациях наиболее часто встречается решение с дополнительным поле типа varchar, в котором хранятся id-шники текстом, разделенные спецсимволом. По этому полю осуществляется сортировка и ограничение чем-нибудь типа like %...%.

В целом решение очень хорошее, но имеет свои недостатки:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; естественное ограничение на вложенность иерархии.&lt;/li&gt;
&lt;li&gt; накладные расходы и сложности по поддержке этого поля. (в моем случае если писать скрипт занимающийся поддержкой этого поля, то он будет просто виснуть по таймауту, а значит нужно делать эти действия в cron)&lt;/li&gt;
&lt;li&gt; серьезнная нагрузка на сеть, которая и является основой для постановки задачи, нагрузка не куда не делась, просто она в фоне, а сервер все-равно тормозит.&lt;/li&gt;
&lt;li&gt; в случае переноса узлов дерева нужно обновлять данные этого поля. &lt;/li&gt;
&lt;/ol&gt;
В итоге получаем достаточно тяжелое и сложное решение. Времени на его реализацию как всегда не было.

Чтобы решить все изложенные выше проблемы, необходимо действовать по другому. Во-первых, формирование дополнительных данных лучше делать там, где эти данные находятся, то есть на стороне базы данных. Во-вторых, поддержка дополнительных данных - накладная операция, поэтому лучше обновлять их каждый раз.

Эта концепция реализуется следующим образом: пишется не сложная процедура, которая бы формировала данные для временной таблички tmp__index, производя рекурентный обход дерева. 
Вот реальный код процедуры:

&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;
&lt;li&gt;DELIMITER $$&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;DROP&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;EXISTS&lt;/span&gt; `getIndexToTmpTable`$$&lt;/li&gt;
&lt;li&gt;/**&lt;/li&gt;
&lt;li&gt; main_id - идентификатор корня или метка поиска&lt;/li&gt;
&lt;li&gt; search_id - идентификатор для начала поиска&lt;/li&gt;
&lt;li&gt; zlevel - максимальный уровень вложенности, чтобы не упрыгать слишком глубоко,&lt;/li&gt;
&lt;li&gt; - установить -1 - чтобы отключить ограничение по вложенности&lt;/li&gt;
&lt;li&gt; sublevel - текущий уровень вложенности, для того чтобы складировать в базу&lt;/li&gt;
&lt;li&gt; - установить 1&lt;/li&gt;
&lt;li&gt; */&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;PROCEDURE&lt;/span&gt; `getIndexToTmpTable` (&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; main_id &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; search_id &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; zlevel &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; sublevel &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt; )&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;BEGIN&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;DECLARE&lt;/span&gt; done &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;DEFAULT&lt;/span&gt; 0;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;DECLARE&lt;/span&gt; catalog_id &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;DECLARE&lt;/span&gt; catalog_pid &lt;span style=&quot;color: blue;&quot;&gt;INT&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;DECLARE&lt;/span&gt; cur1 &lt;span style=&quot;color: blue;&quot;&gt;CURSOR&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;FOR&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;select&lt;/span&gt; id,pid &lt;span style=&quot;color: blue;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;catalog&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; pid=search_id;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;DECLARE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;CONTINUE&lt;/span&gt; HANDLER &lt;span style=&quot;color: blue;&quot;&gt;FOR&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;FOUND&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;SET&lt;/span&gt; done = 1;&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt; sublevel&amp;lt;=1 &lt;span style=&quot;color: blue;&quot;&gt;THEN&lt;/span&gt; /** чтобы установть только раз*/&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt; zlevel&amp;lt;=0 &lt;span style=&quot;color: blue;&quot;&gt;THEN&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; /** число наобум */&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;SET&lt;/span&gt; max_sp_recursion_depth= 15;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;ELSE&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;SET&lt;/span&gt; max_sp_recursion_depth= zlevel+1;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;OPEN&lt;/span&gt; cur1;&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt; main_id = search_id &lt;span style=&quot;color: blue;&quot;&gt;THEN&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; /** вставим саму запись, чтобы был полный боекомплект */&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;insert&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;into&lt;/span&gt; tmp__index &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; id = main_id,&lt;/li&gt;
&lt;li&gt; pid =(&lt;span style=&quot;color: blue;&quot;&gt;select&lt;/span&gt; pid &lt;span style=&quot;color: blue;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;catalog&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; id=main_id &lt;span style=&quot;color: blue;&quot;&gt;limit&lt;/span&gt; 1),&lt;/li&gt;
&lt;li&gt; rid =main_id,&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;level&lt;/span&gt; = sublevel-1;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; /** нужно влючить глубину рекурсии */&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; REPEAT&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;FETCH&lt;/span&gt; cur1 &lt;span style=&quot;color: blue;&quot;&gt;INTO&lt;/span&gt; catalog_id,catalog_pid;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;NOT&lt;/span&gt; done &lt;span style=&quot;color: blue;&quot;&gt;THEN&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; /** вставим текущую найденную запись */&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;insert&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;into&lt;/span&gt; tmp__index &lt;span style=&quot;color: blue;&quot;&gt;set&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; id = catalog_id,&lt;/li&gt;
&lt;li&gt; pid = catalog_pid,&lt;/li&gt;
&lt;li&gt; rid = main_id,&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;level&lt;/span&gt; = sublevel;&lt;/li&gt;
&lt;li&gt; /** спустимся по ниже */&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;call&lt;/span&gt; getIndexToTmpTable(main_id,catalog_id,zlevel,sublevel+1);&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;IF&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; UNTIL done &lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt; REPEAT;&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;CLOSE&lt;/span&gt; cur1;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;END&lt;/span&gt;$$&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt;DELIMITER ;&lt;/li&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/ol&gt;
&lt;code&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;* This source code was highlighted with &lt;a href=&quot;http://virtser.net/blog/post/source-code-highlighter.aspx&quot;&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;
Запуск процедуры предваряется созданием временной таблички, а затем простой селект выдирает необходимые данные.

&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;TEMPORARY&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;TABLE&lt;/span&gt; tmp__index(id &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;,pid &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; ,rid &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt;);&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;call&lt;/span&gt; getIndexToTmpTable(&lt;id_корня&gt;,&lt;id_корня&gt;,1,1);&lt;/id_корня&gt;&lt;/id_корня&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: blue;&quot;&gt;select&lt;/span&gt; c.* &lt;span style=&quot;color: blue;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;catalog&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; c &lt;span style=&quot;color: blue;&quot;&gt;join&lt;/span&gt; tmp__index &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; t &lt;span style=&quot;color: blue;&quot;&gt;on&lt;/span&gt; t.rid=c.id&lt;/li&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/ol&gt;
&lt;code&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;* This source code was highlighted with &lt;a href=&quot;http://virtser.net/blog/post/source-code-highlighter.aspx&quot;&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;
Остановимся на минуткуи и подумаем что мы сделали и на сколько это хорошо:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; делаем все 3-я запросами к БД &lt;/li&gt;
&lt;li&gt; избавились от проблем связанных с поддержкой дополнительного поля, так как все генерится динамически&lt;/li&gt;
&lt;li&gt; данная процедура не может зациклится, mysql ограничивает на глубину рекурсии &lt;/li&gt;
&lt;li&gt; мы можем сами контролировать насколько глубоко нужно обойти дерево (то есть до какого уровня)&lt;/li&gt;
&lt;li&gt; мы знаем о каждом элементе все, вплоть до того, на каком уровне он находится&lt;/li&gt;
&lt;li&gt; вторичное исполнение процедуры на одних и тех же данных можно устранить, используя локальный кеш результата запроса.&lt;/li&gt;
&lt;/ol&gt;
Честно говоря, меня очень удивило, что такой функционал так легко реализуется средствами БД. Однако идем дальше, задача до конца не решена. Теперь встает вопрос - что с этим массивом делать. Варианта всего два:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; переписать все шаблоны на новый лад.&lt;/li&gt;
&lt;li&gt; сделать древовидную структуру из линейной.&lt;/li&gt;
&lt;/ol&gt;
Я считаю, что если есть возможность, то лучше рефакторить шаблоны для того, чтобы они понимали линейную структуру данных. Это наиболее добротный путь. Но к сожалению в моем случае легче и быстрее сделать древодиную структуру, а не корячить весь проект...

Так что я сделал так: сформировал каракас дерева на основе ссылок, последовательно помещая ссылку на элемент-дитя в элемент-родитель. После формирования каркаса дерева я проходил по нему рекурентно и создавал уже дерево с реальными данными. 

&lt;br /&gt;
&lt;div style=&quot;float: right;&quot;&gt;
&lt;img src=&quot;http://img148.imageshack.us/img148/4025/treelink.png&quot; /&gt;&lt;/div&gt;
;
На рисунке показан вид получаемого мной каркаса. Я схематично указал там название поля, но реально там хранятся только идентификаторы в виде $id=&amp;gt;array(...), где $id - инедтификатор элемента, а массив содержит набор ссылок на корневые элементы массива. Важно понимать, что записи с одним и тем же именем ссылаются на одно и тоже место памяти. Общий объем хранимых в памяти данных - число элементов + накладные расходы нах хранение массива ссылок. 

Вот код преобразования, он в внутри класса. Прошу не судить строго, писалось быстро, из-под палки:

&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;protected&lt;/span&gt; $_idToData = &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;protected&lt;/span&gt; $_dataArray = &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;/**&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; * генерация рекурентно данных на основе дерева ссылок&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; * для работы заполнить дерево ссылок, массив связки с данными и массив данных&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; * $_idToData, $_data&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; *&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; * @param array&amp;amp; $curItemFrom&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; * @param array&amp;amp; $curItemTo&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: green;&quot;&gt; */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;function&lt;/span&gt; _recGenTreeResult(array&amp;amp;$curItemFrom,array&amp;amp;$curItemTo)&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt;($curItemFrom &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; $id=&amp;gt;&amp;amp;$list)&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(!isset($&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$id]) || !isset($&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$id] ]))&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; Exception(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;recursion build error!&#39;&lt;/span&gt;);&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; $curItemTo[] = $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$id] ];&lt;/li&gt;
&lt;li&gt; $i = count($curItemTo)-1;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(count($list))&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; $curItemTo[$i][&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dir&#39;&lt;/span&gt;] = array();&lt;/li&gt;
&lt;li&gt; $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_recGenTreeResult(&amp;amp;$list,&amp;amp;$curItemTo[$i][&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dir&#39;&lt;/span&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;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;function&lt;/span&gt; listToTree($dataArray)&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray = &amp;amp;$dataArray;&lt;/li&gt;
&lt;li&gt; $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData = array();&lt;/li&gt;
&lt;li&gt; $parentList = array();&lt;/li&gt;
&lt;li&gt; $rootIds = array();&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;// а теперь делаем рекурентную структуру для вывода&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;// сохраняем id-&amp;gt; num в массиве data для быстрого доступа&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt; ($&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; $k=&amp;gt;$d)&lt;/li&gt;
&lt;li&gt; $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;id&#39;&lt;/span&gt;]] = $k;&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt; ($&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; $k=&amp;gt;$d)&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;// делаем соотношения $pid=&amp;gt;array($id, ...), чтобы потом превратить его в дерево&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; $parentList[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]][$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;id&#39;&lt;/span&gt;]]= array();&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;// если есть, то значит у этого товарища есть родитель ... &lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(isset($&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]]))&lt;/li&gt;
&lt;li&gt; {&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: green;&quot;&gt;// берем его родителя и делаем в него ссылку на этого товарища&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(isset($parentList[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]] ][&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]]))&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(empty($parentList[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]] ][&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]][ $d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;] ]))&lt;/li&gt;
&lt;li&gt; $parentList[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_dataArray[ $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_idToData[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]] ][&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]][ $d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;] ] = &amp;amp;$parentList[$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;]];&lt;/li&gt;
&lt;li&gt; }&lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;else&lt;/span&gt; $rootIds [$d[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pid&#39;&lt;/span&gt;] ] = &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&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; $result = array();&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;foreach&lt;/span&gt;(array_keys($rootIds) &lt;span style=&quot;color: blue;&quot;&gt;as&lt;/span&gt; $pid)&lt;/li&gt;
&lt;li&gt; $&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt;-&amp;gt;_recGenTreeResult(&amp;amp;$parentList[$pid],&amp;amp;$result);&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;li&gt; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; $result;&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;/span&gt;&lt;/code&gt;&lt;/ol&gt;
&lt;code&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;* This source code was highlighted with &lt;a href=&quot;http://virtser.net/blog/post/source-code-highlighter.aspx&quot;&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;
В итоге, получили вполне работоспособную штуку. В случае большой базы и глубины рекурсии данному решению тоже может быть плохо. конкретно может быть плохо mySql-серверу. я бы решал эту проблему введением кеширующей таблицы (постоянной), которая бы хранила бы результаты спуска от начала определенного элемента, и копировала бы их во временную таблицу. То есть получался бы классический кеш рекурсии, только на SQL. Это близко к методам динамического программирования. Может быть когда-нибудь дореализую, если локального кеша не хватит на стабильную работу. Хотя я думаю, что хватит... 

&lt;br /&gt;
&lt;hr /&gt;
ссылки на то, что почитать:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation&quot; title=&quot;слайды по древовидным структурам&quot;&gt;Конференция php conf2 2008 - слайды по древовидным структурам&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html&quot; title=&quot;хранимые процедуры,официальная документация&quot;&gt;хранимые процедуры,официальная документация: http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/cursors.html&quot; title=&quot;курсоры, официальная документация&quot;&gt;курсоры, официальная документация: http://dev.mysql.com/doc/refman/5.1/en/cursors.html.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://habrahabr.ru/blogs/mysql/46333/&quot; title=&quot;статья про курсоры&quot;&gt;статья про курсоры: http://habrahabr.ru/blogs/mysql/46333/.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://php.su/learnphp/?re&quot; title=&quot;ссылкив в php&quot;&gt;ссылки в php: http://php.su/learnphp/?re.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://habrahabr.ru/blogs/sql/43955/&quot;&gt;Иерархические (рекурсивные) запросы.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot; hreg=&quot;http://habrahabr.ru/blogs/mysql/67722/&quot;&gt;Full Hierarchy иерархические структуры в базах данных.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/125541672316036333/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/mysql.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/125541672316036333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/125541672316036333'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/mysql.html' title='Задача отображения деревьев в MySql. Способ отображения на хранимых процедурах.'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-7152373775841380447</id><published>2011-09-13T07:33:00.000+03:00</published><updated>2011-09-25T13:15:55.932+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="j2ee"/><category scheme="http://www.blogger.com/atom/ns#" term="j2se"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="sax"/><category scheme="http://www.blogger.com/atom/ns#" term="tdd"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><category scheme="http://www.blogger.com/atom/ns#" term="xmlunit"/><title type='text'>Правильная проверка XML данных в java-проектах</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Недавно, опубликовал &lt;a href=&quot;http://habrahabr.ru/blogs/java/127473/&quot;&gt;свою&amp;nbsp;статью&lt;/a&gt;&amp;nbsp;&amp;nbsp;про валидацию XML-данных в java проектах. В статье я постарался рассказать немного о библиотеке &lt;a href=&quot;http://xmlunit.sourceforge.net/&quot;&gt;XmlUnit&lt;/a&gt; и о том как правильно с моей точки зрения писать &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot;&gt;тесты&lt;/a&gt; в таких случаях. Кому интересно, всех приглашаю &lt;a href=&quot;http://habrahabr.ru/blogs/java/127473/&quot;&gt;почитать&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;

UPD:

Краткий итог:
В начале поленился описывать возможности библиотеки, мол, если нужно, сами зайдут и почитают. В итоге, повалила куча вопросов, типа - а так можно. Пришлось дополнить статью парой ссылок и комментариями. В целом получилось не плохо. 
Благодаря комментариям узнал для себя новое, в XSD-схеме можно указывать обязательный &lt;a href=&quot;http://www.w3schools.com/schema/schema_complex_indicators.asp&quot;&gt;порядок тегов&lt;/a&gt;:
&lt;blockquote&gt;The indicator specifies that the child elements must appear in a specific order:&lt;/blockquote&gt;

Так что совет всем, читайте мануалы, оно полезно. 
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/7152373775841380447/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/xml-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7152373775841380447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7152373775841380447'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/xml-java.html' title='Правильная проверка XML данных в java-проектах'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-8556220770066178466</id><published>2011-09-04T17:50:00.000+03:00</published><updated>2012-01-29T20:05:12.432+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="xorg"/><category scheme="http://www.blogger.com/atom/ns#" term="xrandr"/><category scheme="http://www.blogger.com/atom/ns#" term="вращение"/><title type='text'>Поворачиваем монитор средствами xorg в ubuntu</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Делюсь рецептом - как удобно поворачивать монитор в ubuntu. &lt;br /&gt;
Перечитал кучу документации. Более всего понравился вариант с использованием утилиты xRandr.&lt;br /&gt;
Чтобы утилита работала верно, нужно включить соответствующую опцию &amp;nbsp;&lt;b&gt;&lt;i&gt;RandRRotation&lt;/i&gt;&lt;/b&gt; в /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
Например, кусочек моего xorg.conf:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Section &quot;Screen&quot;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; Identifier &amp;nbsp; &amp;nbsp; &quot;Screen0&quot;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; Device &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Device0&quot;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; Monitor &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Monitor0&quot;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; DefaultDepth &amp;nbsp; &amp;nbsp;24&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;background-color: #9fc5e8;&quot;&gt; Option &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;RandRRotation&quot; &quot;on&quot;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; SubSection &amp;nbsp; &amp;nbsp; &quot;Display&quot;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Depth &amp;nbsp; &amp;nbsp; &amp;nbsp; 24&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; EndSubSection&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;EndSection&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
После перегружаем X-сервер (для тех, кто не знает как это делать, можно перегрузить просто компьютер) и выполняем команду:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;xrandr -o right&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Если хотим вернуть всё на место, то пишем команду:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;xrandr -o normal&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
доступны так же опции:&amp;nbsp;&lt;i&gt;&lt;b&gt;normal,inverted,left,right&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
Ах да, xrandr - наверное ставить придется, он есть в репозиториях ubuntu, например.&lt;br /&gt;
Ну и наконец, скрин, как оно у меня выглядит:&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihpzXhydS2mi1nr242DbL5oKDysM7OXWxwlcZf7SHlPS_0WF171aBWuS_g5r1Oor0-gqpEOcJPFjYmeQ8P-Ad8vD9GGpxCJ9FiwLY_TiOLLjytJDCRR2ViX0Rgs0QULdrRsdTa5U-YJrc/s800/PICT2816.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihpzXhydS2mi1nr242DbL5oKDysM7OXWxwlcZf7SHlPS_0WF171aBWuS_g5r1Oor0-gqpEOcJPFjYmeQ8P-Ad8vD9GGpxCJ9FiwLY_TiOLLjytJDCRR2ViX0Rgs0QULdrRsdTa5U-YJrc/s640/PICT2816.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Мое рабочее место, когда я читаю статьи.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Я в таком виде читаю статьи, редактирую статьи, формулы, то есть всё то, где вертикальность приветствуется.&lt;br /&gt;
&lt;br /&gt;
PS: писать код так - не удобно, уж очень узко...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/8556220770066178466/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/xorg-ubuntu.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8556220770066178466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8556220770066178466'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/xorg-ubuntu.html' title='Поворачиваем монитор средствами xorg в ubuntu'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihpzXhydS2mi1nr242DbL5oKDysM7OXWxwlcZf7SHlPS_0WF171aBWuS_g5r1Oor0-gqpEOcJPFjYmeQ8P-Ad8vD9GGpxCJ9FiwLY_TiOLLjytJDCRR2ViX0Rgs0QULdrRsdTa5U-YJrc/s72-c/PICT2816.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-4813664317685628335</id><published>2011-09-02T09:59:00.001+03:00</published><updated>2011-09-02T10:02:42.237+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gui"/><category scheme="http://www.blogger.com/atom/ns#" term="j2se"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>java GUI</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Клевая ссылка про всё-всё.&lt;br /&gt;
&lt;br /&gt;
Рекомендую всем:&amp;nbsp;&lt;a href=&quot;http://habrahabr.ru/blogs/java/117430/&quot;&gt;http://habrahabr.ru/blogs/java/117430/&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/4813664317685628335/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/java-gui.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/4813664317685628335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/4813664317685628335'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/java-gui.html' title='java GUI'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-2861458166723262486</id><published>2011-09-02T07:52:00.001+03:00</published><updated>2011-09-02T07:52:41.709+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2D"/><category scheme="http://www.blogger.com/atom/ns#" term="graphic"/><category scheme="http://www.blogger.com/atom/ns#" term="j2se"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Java 2D графика</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
Скидываю набор ссылок по Java2D&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://habrahabr.ru/blogs/java/127518/&quot;&gt;http://habrahabr.ru/blogs/java/127518/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
TODO: чуть по позже положу сюда ещё ссылок&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/2861458166723262486/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/java-2d.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2861458166723262486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/2861458166723262486'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/java-2d.html' title='Java 2D графика'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-3036853770582781707</id><published>2011-09-01T09:56:00.000+03:00</published><updated>2012-01-29T20:06:11.034+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dependency injection"/><category scheme="http://www.blogger.com/atom/ns#" term="tdd"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><category scheme="http://www.blogger.com/atom/ns#" term="ооп"/><title type='text'>Ещё раз о тестировании кода</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Ещё раз о тестирование кода. Заметка навеяна: &amp;nbsp;&lt;a href=&quot;http://habrahabr.ru/blogs/tdd/127114/&quot;&gt;http://habrahabr.ru/blogs/tdd/127114/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Интересен не сам пост, а комментарии к нему. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;И ещё&amp;nbsp;&lt;a href=&quot;http://habrahabr.ru/blogs/tdd/111095/&quot; style=&quot;text-align: left;&quot;&gt;http://habrahabr.ru/blogs/tdd/111095/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Если кратко, то ИХМО:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: Arial, Helvetica, sans-serif; text-align: -webkit-auto;&quot;&gt;тесты — это лакмусовая бумажка гибкой и правильной архитектуры приложения.&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Arial, Helvetica, sans-serif; text-align: -webkit-auto;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: Arial, Helvetica, sans-serif; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Вам удобно писать тесты ? Они у вас не рушатся ?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Если да, то молодцы, если нет, то скорее всего вы делаете что-то не так.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Подробности:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://habrahabr.ru/blogs/tdd/127114/#comment_4202087&quot;&gt;http://habrahabr.ru/blogs/tdd/127114/#comment_4202087&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://habrahabr.ru/blogs/tdd/127114/#comment_4209375&quot;&gt;http://habrahabr.ru/blogs/tdd/127114/#comment_4209375&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://habrahabr.ru/blogs/tdd/127114/#comment_4202561&quot;&gt;http://habrahabr.ru/blogs/tdd/127114/#comment_4202561&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://blog.byndyu.ru/2010/02/tdd_18.html&quot;&gt;http://blog.byndyu.ru/2010/02/tdd_18.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;иньекция зависимостей.
&lt;br /&gt;&lt;a href=&quot;http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection&quot;&gt;http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;+ мне ещё нравится вот такое описания принципов проектирования ООП
&lt;br /&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://blog.byndyu.ru/2009/10/solid.html&quot;&gt;http://blog.byndyu.ru/2009/10/solid.html&lt;/a&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;И вот ссылка на английском про тестирование в тему:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://martinfowler.com/articles/mocksArentStubs.html&quot;&gt;http://martinfowler.com/articles/mocksArentStubs.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/3036853770582781707/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/3036853770582781707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/3036853770582781707'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/09/blog-post.html' title='Ещё раз о тестировании кода'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-6268582250580725060</id><published>2011-08-31T10:19:00.000+03:00</published><updated>2011-08-31T10:19:19.498+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="photo"/><title type='text'>Ссылка на курс цифровой фотографии</title><content type='html'>Классная ссылка про фотографию. Правда на английском:&lt;br /&gt;
&lt;a href=&quot;http://graphics.stanford.edu/courses/cs178-11/&quot;&gt;курс цифровой фотографии&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/6268582250580725060/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6268582250580725060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/6268582250580725060'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/08/blog-post.html' title='Ссылка на курс цифровой фотографии'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-8667287127691984050</id><published>2011-08-30T23:22:00.000+03:00</published><updated>2012-02-07T14:43:55.978+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="j2ee"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="parser"/><category scheme="http://www.blogger.com/atom/ns#" term="sax"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><category scheme="http://www.blogger.com/atom/ns#" term="парсер"/><category scheme="http://www.blogger.com/atom/ns#" term="пример"/><title type='text'>SAX парсер на Java своими руками.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет %username%.&lt;br /&gt;
&lt;br /&gt;
Сегодняшней темой будет парсинг XML. Существуют две стратегии обработки XML документов:&amp;nbsp;&lt;a href=&quot;http://ru.wikipedia.org/wiki/SAX&quot;&gt;SAX&lt;/a&gt;&amp;nbsp;и&amp;nbsp;&lt;a href=&quot;http://ru.wikipedia.org/wiki/Document_Object_Model&quot;&gt;DOM&lt;/a&gt;.&lt;br /&gt;
SAX парсеры предлагают потоковую обработку данных основанную на событиях.&lt;br /&gt;
DOM парсеры преобразуют XML &amp;nbsp;в дерево объектов, с которыми можно будет работать.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример простейшего SAX парсера.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть XML документ:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f6f8ff; color: #000020;&quot;&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt; &lt;span style=&quot;color: #004a43;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #008c00;&quot;&gt;&quot;1.0&quot;&lt;/span&gt; &lt;span style=&quot;color: #004a43;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;windows-1251&quot;&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt; &lt;span style=&quot;color: #474796;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Компьютерные сети&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Олифер&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt; &lt;span style=&quot;color: #474796;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Вычислительные сети сети&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;Кто-то ещё&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;autor&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Код обработки документа может выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f6f8ff; color: #000020;&quot;&gt;&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; javaxmltest&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; java&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;FileInputStream&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; java&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;FileNotFoundException&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; java&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;IOException&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; java&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;InputStream&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; javax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;parsers&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;ParserConfigurationException&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; javax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;parsers&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;SAXParserFactory&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; javax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;parsers&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;SAXParser&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: #595979;&quot;&gt;// SAX&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; org&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;sax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;Attributes&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; org&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;sax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;InputSource&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; org&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;sax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;SAXException&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt; org&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;sax&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;helpers&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #004a43;&quot;&gt;DefaultHandler&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: #3f7f8f;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;@author&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;nicolay&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&amp;nbsp;*/&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;class&lt;/span&gt; Main &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;

    &lt;span style=&quot;color: #3f7f8f;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;@param&lt;/span&gt;&lt;span style=&quot;color: #3f7f8f;&quot;&gt; args the command line arguments&lt;/span&gt;
&lt;span style=&quot;color: #3f7f8f;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; main&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;]&lt;/span&gt; args&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        SAXParserFactory factory &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; SAXParserFactory&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;newInstance&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

        factory&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;setValidating&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        factory&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;setNamespaceAware&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        SAXParser parser&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

        &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;InputStream&lt;/span&gt; xmlData &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;try&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
            xmlData &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;FileInputStream&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;books.xml&quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

            parser &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; factory&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;newSAXParser&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
            parser&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;parse&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;xmlData&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;new&lt;/span&gt; MyParser&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

            
        &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;FileNotFoundException&lt;/span&gt; e&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
            e&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;printStackTrace&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #595979;&quot;&gt;// обработки ошибки, файл не найден&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;ParserConfigurationException e&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
            e&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;printStackTrace&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #595979;&quot;&gt;// обработка ошибки Parser&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;SAXException e&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
            e&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;printStackTrace&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #595979;&quot;&gt;// обработка ошибки SAX&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;IOException&lt;/span&gt; e&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
            e&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;printStackTrace&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #595979;&quot;&gt;// обработка ошибок ввода&lt;/span&gt;
        &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; 

    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #595979;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #5555dd;&quot;&gt;http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html&lt;/span&gt;
&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;class&lt;/span&gt; MyParser &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;extends&lt;/span&gt; DefaultHandler &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;

    &lt;span style=&quot;color: #308080;&quot;&gt;@&lt;/span&gt;Override
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; startElement&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; uri&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; localName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; qName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt;
            Attributes attributes&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SAXException &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;Тег: &quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;qName&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;qName&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;equals&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;book&quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
            &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;id книги &quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;attributes&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;getValue&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #595979;&quot;&gt;//      System.out.println(attributes.getLength());&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;startElement&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;uri&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; localName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; qName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; attributes&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

        
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #308080;&quot;&gt;@&lt;/span&gt;Override
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; characters&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7779bb;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;]&lt;/span&gt; c&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;int&lt;/span&gt; start&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;int&lt;/span&gt; length&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; 
                                                 &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SAXException &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;characters&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;c&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; start&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt;  length&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7779bb;&quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt;start&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;i&lt;span style=&quot;color: #308080;&quot;&gt;&amp;lt;&lt;/span&gt; start&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;length&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;i&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;
            &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;err&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;print&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;c&lt;span style=&quot;color: #308080;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #308080;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
  
    &lt;span style=&quot;color: #308080;&quot;&gt;@&lt;/span&gt;Override
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; endElement&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; uri&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; localName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; qName&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; 
                                                    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SAXException &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        
        &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;Тег разобран: &quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;+&lt;/span&gt;qName&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;endElement&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;uri&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt;localName&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; qName&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #308080;&quot;&gt;@&lt;/span&gt;Override
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; startDocument&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SAXException &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;Начало разбора документа!&quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;startDocument&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #308080;&quot;&gt;@&lt;/span&gt;Override
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #7779bb;&quot;&gt;void&lt;/span&gt; endDocument&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SAXException &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;endDocument&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;out&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;println&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1060b6;&quot;&gt;&quot;Разбор документа окончен!&quot;&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
    
&lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
Код можно получить тут:&amp;nbsp;&lt;a href=&quot;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/saxread/XmlSaxReadSample.java&quot;&gt;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/saxread/XmlSaxReadSample.java&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Поясняю код. Мы описываем класс &amp;nbsp;&lt;span style=&quot;background-color: #f6f8ff; color: #000020; font-family: monospace; white-space: pre;&quot;&gt;MyParser&lt;/span&gt;, который будет обрабатывать события чтения данных.&amp;nbsp;Выделено 5 событий:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&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;заканчиваем обработку документа&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
SAX парсер постепенно читает файл XML. И когда набирается достаточное количество данных (считался тег с атрибутами) вызывает метод нашего класса. Когда данные уже отработаны, они в принципе не нужны и поэтому постепенно удаляются из памяти.&lt;br /&gt;
&lt;br /&gt;
Такая методика позволяет обрабатывать достаточно большие XML(возможно размером несколько мегабайт/гигабайт). Это главное достоинство SAX парсеров. Скорость и возможность обрабатывать большие объемы данных.&lt;br /&gt;
&lt;br /&gt;
Главный недостаток - &amp;nbsp;сложный код в случае сложной структуре XML файла. То есть если XML простой и линейный, то его легко анализировать SAX-парсером. Для XML со сложной структурой придется по возиться с алгоритмизацией.&lt;br /&gt;
&lt;br /&gt;
Вернемся к примеру.&lt;br /&gt;
&lt;b&gt;1-ое событие - начали обрабатывать документ.&lt;/b&gt; Наступает лишь раз в момент, когда мы начали анализировать файл. На этом этапе можно производить первичную инициализацию данных&lt;br /&gt;
&lt;b&gt;2-ое событие - открылся тег.&lt;/b&gt; На этом этапе мы знаем имя тега и его атрибуты. Мы не знаем ни как глубоко вложен элемент, ни сколько там ещё внутри. Если это надо, то нужно обрабатывать алгоритмически&lt;br /&gt;
&lt;b&gt;3-е событие &amp;nbsp;- данные.&lt;/b&gt; Реальные данные между открытым и закрытым тегами. Нам дают массив символов, делайте с ним что хотите&lt;br /&gt;
&lt;b&gt;4-ое событие - закрываем тег.&lt;/b&gt; Теперь мы знаем, тег закрыт, можем что-нибудь обработать алгоритмически&lt;br /&gt;
&lt;b&gt;5-ое событие - документ обработан.&lt;/b&gt; Освобождаем лишние ресурсы, делаем пост обработку, если она нужна. Короче радуемся жизни, т.к. мы такие молодцы - обработали документ.&lt;br /&gt;
&lt;br /&gt;
В итоге программа выведет :&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f6f8ff; color: #000020;&quot;&gt;Начало разбора документа&lt;span style=&quot;color: #308080;&quot;&gt;!&lt;/span&gt;
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; books

Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; book
id книги &lt;span style=&quot;color: #008c00;&quot;&gt;1&lt;/span&gt;
    
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; title
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; title
        Компьютерные сети
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; autor
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; autor
        Олифер
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; book
    
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; book
id книги &lt;span style=&quot;color: #008c00;&quot;&gt;2&lt;/span&gt;
    
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; title
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; title
        Вычислительные сети сети
Тег&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; autor
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; autor
        Кто&lt;span style=&quot;color: #308080;&quot;&gt;-&lt;/span&gt;то ещё
Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; book
    

Тег разобран&lt;span style=&quot;color: #308080;&quot;&gt;:&lt;/span&gt; books
Разбор документа окончен&lt;span style=&quot;color: #308080;&quot;&gt;!&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
Надеюсь пример кому-нибудь помог.&lt;br /&gt;
Спасибо за внимание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
UPD: Сделал репозиторий на github, где буду выкладывать примеры для статей.&lt;br /&gt;
&lt;br /&gt;
Исходники примера можно взять тут:&lt;br /&gt;
&lt;a href=&quot;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/saxread/XmlSaxReadSample.java&quot;&gt;https://github.com/png-tech/PngJavaSamples/blob/master/SimpleExamples/src/png/samples/xml/saxread/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/8667287127691984050/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/08/sax-java.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8667287127691984050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/8667287127691984050'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/08/sax-java.html' title='SAX парсер на Java своими руками.'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8016434493573285716.post-7238062524056289183</id><published>2011-08-30T22:29:00.001+03:00</published><updated>2012-02-07T14:43:17.615+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cyrillic"/><category scheme="http://www.blogger.com/atom/ns#" term="decode"/><category scheme="http://www.blogger.com/atom/ns#" term="domain"/><category scheme="http://www.blogger.com/atom/ns#" term="encode"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="пример"/><title type='text'>Работа с кириллическими доменам в Java</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет, %username%.&lt;br /&gt;
&lt;br /&gt;
На днях потребовалось работать с&amp;nbsp;кириллическими&amp;nbsp;доменами.&lt;br /&gt;
нужно было их из кодировки  &lt;a href=&quot;http://ru.wikipedia.org/wiki/Punycode&quot;&gt;PunyCode&lt;/a&gt; в обычную UTF8.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;и так поехали&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
добавляем зависимость в maven&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f6f8ff; color: #000020;&quot;&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;dependency&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
     &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;groupId&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;org.apache.httpcomponents&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;groupId&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
     &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;artifactId&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;httpclient&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;artifactId&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
     &lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;4.0.3&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #333385;&quot;&gt;dependency&lt;/span&gt;&lt;span style=&quot;color: #0057a6;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
пишем функцию преобразователь урлов&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #f6f8ff; color: #000020;&quot;&gt;&lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;class&lt;/span&gt; StringTools &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; fixCyrillicHostInUrl&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; stringUrl&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;URL&lt;/span&gt; url&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
          url &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;URL&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;stringUrl&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;MalformedURLException&lt;/span&gt; e&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #406080;&quot;&gt;{&lt;/span&gt;
       &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;return&lt;/span&gt; stringUrl&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; punycodeHost &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; url&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;getHost&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #6679aa; font-weight: bold;&quot;&gt;String&lt;/span&gt; unicodeHost &lt;span style=&quot;color: #308080;&quot;&gt;=&lt;/span&gt; Punycode&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;toUnicode&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;punycodeHost&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #200080; font-weight: bold;&quot;&gt;return&lt;/span&gt; stringUrl&lt;span style=&quot;color: #308080;&quot;&gt;.&lt;/span&gt;replaceFirst&lt;span style=&quot;color: #308080;&quot;&gt;(&lt;/span&gt;punycodeHost&lt;span style=&quot;color: #308080;&quot;&gt;,&lt;/span&gt; unicodeHost&lt;span style=&quot;color: #308080;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #406080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #406080;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
Используем на здоровье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://png-tech.blogspot.com/feeds/7238062524056289183/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://png-tech.blogspot.com/2011/08/username.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7238062524056289183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8016434493573285716/posts/default/7238062524056289183'/><link rel='alternate' type='text/html' href='http://png-tech.blogspot.com/2011/08/username.html' title='Работа с кириллическими доменам в Java'/><author><name>_Nicolay</name><uri>http://www.blogger.com/profile/03230796295591092477</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>