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

<channel>
	<title>Игорь Артамонов &#187; Программирование</title>
	<atom:link href="http://artamonov.ru/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://artamonov.ru</link>
	<description>Посмотрим, глубока ли кроличья нора</description>
	<lastBuildDate>Fri, 21 May 2010 11:51:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google App Engine</title>
		<link>http://artamonov.ru/2010/01/28/google-app-engine/</link>
		<comments>http://artamonov.ru/2010/01/28/google-app-engine/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 14:57:33 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[PaaS]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=371</guid>
		<description><![CDATA[Погоняв Google App Engine пару месяцев расскажу о впечатлениях от него.
Платформа несомненно интересная, и будет очень полезна startup&#8217;ам, т.к. позволяет сосредоточится на решении своих конкретных задач, отдав все что не является конкурентым преимущество на откуп платформе и её сервисам.
К сожалению прям вот взять любой сайт и запустить его на GAE не получится, нужно делать именно [...]]]></description>
			<content:encoded><![CDATA[<p>Погоняв <a href="http://code.google.com/appengine/">Google App Engine</a> пару месяцев расскажу о впечатлениях от него.<br />
Платформа несомненно интересная, и будет очень полезна startup&#8217;ам, т.к. позволяет сосредоточится на решении своих конкретных задач, отдав все что не является конкурентым преимущество на откуп платформе и её сервисам.</p>
<p>К сожалению прям вот взять любой сайт и запустить его на GAE не получится, нужно делать именно под него, на Python или JVM, и нужно хорошо понимать как это работает. Я смотрел лишь связку Python + <a href="http://code.google.com/p/google-app-engine-django/">Django</a>. Многие преимущества Django тут отсутствуют (например знаменитая <a href="http://code.google.com/p/google-app-engine-django/">админка django</a>), но тем не менее результат получается очень быстро и вполне качественно. Для JVM есть многообещающий <a href="http://gaelyk.appspot.com/">Gaelyk</a>, ну и куча прочих framework&#8217;ов.<br />
<span id="more-371"></span></p>
<h2>Плюсы</h2>
<ul>
<li>бесплатен для небольшого проекта, и очень подходит для стартапов, с непостоянной посещаемостью. 2-3 тысячи посетителей в день обошлись в 10 центов, на совершенно не оптимизированном сайте. На нормальном должно держать тысяч 5, хотя зависит от структуры сайта, на каком-то сайте и пара сотен упрется в такой предел</li>
<li>очень масштабируемо, автоматически. Мо;но не боятся слэшдот/дигг/хабра-эффектов, все выдержит.</li>
<li>готовая обвязка инструментами и сервисами:</li>
<ul>
<li>мониторинг текущей загрузки</li>
<li>версионность приложения (может работать одновременно несколько версий, можно к примеру тестировать новую версию, пока пользователи видят лишь предыдущую)</li>
<li>готова вся работа с пользователем (через Google Accounts), не нужно заморачиваться с регистрацией, защитой от ботов, сменой и восстановлением пароля и пр. пользовательских данных,проверкой прав и т.д.</li>
<li>cron, message queue, отправка писем, работа с графикой и web-ом</li>
</ul>
</li>
</ul>
<h2>Минусы</h2>
<ul>
<li>хостит только поддомен, т.е. домен второго уровня прицепить не получится. поэтому все сайты в виде www.* Причина в том что GAE распределенн по разным датацентрам, и автоматическую балансировку трафика они могут сделать лишь для поддомена. Не известно будут ли они решать эту проблему, это хоть и всем не нравится, но жить с этим вполне можно.</li>
<li>нет поиска, что для компании, изначально на это делающей ставку, вообще странно. Мне даже в голову не могло придти что у Google не будет поиска, и ничуть не смутило то что не увидел этого в презентациях, ведь это само собой разумеющееся. Но факт: поиска нет.</li>
<li>нет нормального админского инструмента для работы с БД. Есть некий GQL, но этого не достаточно, он не поможет если вам нужно быстро найти пару &laquo;плохих&raquo; записей чтобы поправить вручную. Не заработает, например, потому что скорее всего для вашей ситуации (условия выборки) не будет индекса, а без индекса запрос не выполнится. Нормально пролистать, отсортировать и пр. тоже не получится. В общем чтобы полноценно админить БД придется писать код, с нуля, так как стандартная админка Django не работает <img src='http://artamonov.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>нет полноценной отладки, не посмотреть логи с ошибкой. К тому же SDK и боевой сервер иногда по разному себя ведут на одном и том же коде, так что это проблема. Спасает лишь то что одновременно могут быть задеплоены несколько версий, одну видят обычные пользователи, вторую вы можете самостоятельно протестировать, не показывая пока не убедитесь что все работает.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2010/01/28/google-app-engine/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>GridGain</title>
		<link>http://artamonov.ru/2009/01/29/gridgain/</link>
		<comments>http://artamonov.ru/2009/01/29/gridgain/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 11:58:29 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[gridgain]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[mapreduce]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=177</guid>
		<description><![CDATA[GridGain &#8211; платформа для реализации cloud вычислений. На мой взгляд очень серьезная платформа, вполне стабильная (если это имеет значение то версия, например, уже 2.1.0) имеет открытый код, на java, интегрируется с огромным количеством внешний систем. В отличие от пока академического Apache Hadoop здесь уже все более практично. А разобраться и запустить можно за пару часов, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gridgain.com/">GridGain</a> &#8211; платформа для реализации cloud вычислений. На мой взгляд очень серьезная платформа, вполне стабильная (если это имеет значение то версия, например, уже 2.1.0) имеет открытый код, на java, интегрируется с огромным количеством внешний систем. В отличие от пока академического Apache Hadoop здесь уже все более практично. А разобраться и запустить можно за пару часов, в отличии от&#8230;</p>
<p>Самый известный, наверное, подход к cloud вычислениям это <a href="http://artamonov.ru/2008/09/16/mapreduce/">mapreduce</a>, и он прекрасно здесь организован. А так как этот mapreduce не всем понятен, да и не всегда нужен полностью, то здесь <u>помимо него</u> предлагается своя реализация java.lang.concurency.ExecutorService который разбрасывает переданные вычисления по кластеру.<br />
<span id="more-177"></span><br />
В отличии от того же <a href="http://hadoop.apache.org/">Hadoop</a> здесь не гнались за обязательной возможностью обрабатывать терабайты данных за один проход. GridGain удобней будет для длительных вычислений на объемах гораздо поменьше, по хорошему это то что можно передать между нодой в одном List&#8217;е, что, возможно, даже практичней. Я не хочу сказать что для больших объемов эта платформа не подойдет, просто при большом объеме данных (а не вычислений над ними) все упирается уже в хранилище данных, и они этим сознательно не занимались, но в случае когда это нужно &#8211; можно всегда использовать и внешнюю БД и даже Hadoop HDFS/HBase. </p>
<p>Для многих случаев это очень удобный вариант, отличная альтернатива hadoop&#8217;у, ну в самом деле не обязательно у нас что-то грандиозное, вполне может быть у нас пара тысяч независимых операций и cloud из нескольких серверов, и этот самый простой способ распараллелить все.  Если основной упор на вычисления, например параллельно обработать несколько тысяч url&#8217;ов, на каждый по 1-2 минуты, то GridGain предлагает очень удобное подспорье. И, кстати, очень просто организуется архитектура для случая когда есть несколько gui клиентов, на слабых компах, а все вычисления для них производятся в cloud.</p>
<p>Как я уже говорил платформа давно развивается (кстати нашими соотечественниками), хорошо документирована, внутренняя часть уже вполне стабильна, и к тому же хорошо развиты инструменты мониторинга, алгоритмы балансировки, восстановления после сбоя и пр. и пр. Для ознакомления стоит посмотреть скринкаст &laquo;<a href="http://www.gridgain.com/screencasts.html">Grid Application in 15 Minutes</a>&raquo; </p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/01/29/gridgain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Хранилище для обработки данных</title>
		<link>http://artamonov.ru/2009/01/19/storage-for-data-mining/</link>
		<comments>http://artamonov.ru/2009/01/19/storage-for-data-mining/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 11:16:08 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[text mining]]></category>
		<category><![CDATA[архитектура]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=151</guid>
		<description><![CDATA[Допустим у нас стоит задача: нужно собирать неструктурированные html данные и извлекать из них структуру, или, точнее, информацию, т.е. система Text Mining/Information Extraction.
Вcе элементы этого процесса, конечно, должны где то хранится. И если конечную информацию можно структурировать, завести с десяток таблиц в БД, настроить связи и складывать туда, то входная информация по определению у нас [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим у нас стоит задача: нужно собирать неструктурированные html данные и извлекать из них структуру, или, точнее, информацию, т.е. система Text Mining/Information Extraction.</p>
<p>Вcе элементы этого процесса, конечно, должны где то хранится. И если конечную информацию можно структурировать, завести с десяток таблиц в БД, настроить связи и складывать туда, то входная информация по определению у нас не структурирована, ну или, как минимум, слабо структурированная. Если делать сложную структуру то из-за специфики нашей задачи нам будет очень сложно отследить целостность данных.  К слову о сложности работы с такой структурированностью замечу что я попытался было нарисовать это подход, но не смог сделать чтобы это было внятно, без всего лишнего.</p>
<p>Поэтому нужно придумывать какое то простое и универсальное решения для этой задачи. Одна из них это структура когда у нас для всего выделена одна таблица, в первые колонки которой заливается начальная структура. Далее они обрабатываются нашей программой для структурирования, и результат складывается рядом, в следующие колонки. Причем если результат мы получаем не за один шаг, что чаще и бывает, то в таком случае мы последовательно выполняем все шаги, складывая новые данные правее от текущих.<br />
<span id="more-151"></span><br />
В итоге получаем примерно такие шаги:</p>
<ol>
<li>(первая колонка) список URL</li>
<li>выкачиваем документ по этому адресу, складываем в колонку 2</li>
<li>убираем весь мусор (стили, js, реклама и пр.) из html и кладем в колонку 3</li>
<li>вырезаем текстовые контент (убираем навигацию, и пр.), результат в колонку 4</li>
<li>делаем PDF, результат в колонку 5 </li>
</ol>
<div style="float: right; margin-left: 10px; font-style: italic; font-size: 10px;">
<img src="http://artamonov.ru/wp-content/uploads/2009/01/1to1struct.png" alt="1to1struct" title="1to1struct" width="212" height="158" /><br />
Рис 1. Таблица с несколькими колонками<br />
<img src="http://artamonov.ru/wp-content/uploads/2009/01/mtonstruct.png" alt="mtonstruct" title="mtonstruct" width="212" height="235" /><br />
Рис 2. Таблица с вертикальной обработкой
</div>
<p>Мы складываем в колонку справа если у нас идет обработка 1 к 1 (см. рис 1), если же у нас идет какая либо вертикальная агрегация (см. рис 2), то новые данные стоит записывать под текущим блоком, в той же колонке, что есть более универсальный подход. В случае СУБД у нас получается для первого варианта таблица с колонками <code>block_id</code>, <code>data_id</code>, <code>col_1...col_N</code>, для второго варианта <code>block_id</code>, <code>data_id</code>, <code>value</code>. Где </p>
<ul>
<li><code>block_id</code> это у нас идентификатор обрабатываемого блока,</li>
<li> <code>data_id</code> идентификатор элемента данных, которым мы оперируем,</li>
<li> и <code>col_1..col_n</code> или <code>value</code> это те данные которые нужно обработать.</li>
</ul>
<p>В случае файловой системы получается только второй вариант, идентификатором тут будет путь к файлу. Следуя этим подходам в <a href="http://hadoop.apache.org/">Apache Hadoop</a> есть HDFS для варианта хранения в файлах, и <a href="http://hadoop.apache.org/hbase/">HBase</a> для хранения в виде таблицы.</p>
<p>Наверное сразу возникает претензия что у нас всегда данные если не дублируются, то остается слишком много временных данных, старые на каждом этапе остаются, а новые (выведенные из предыдущих) складываются рядом. Зачем это? Затем что иначе нам нужно следить за транзакциями, усложнять процесс распараллеливания обработки. Гораздо проще складывать рядом, и когда придет время (например когда мы дойдем до конечного шага), можно будет выкинуть все лишнее. Если мы можем позволить себе это, то так получается гораздо удобнее. Дополнительные бонусы тут в том что на любом этапе мы можем переиграть обработку заново (как замена rollback&#8217;а) или сделать новую &laquo;ветку&raquo; обработки, выполнив другие функции. И, как минимум, всегда можем проследить историю операций.</p>
<p>Но еще более важно то что мы получаем независимые функции. Почти функции в том виде в котором они приняты в функциональном программировании. Т.е. у нас входные параметры и есть результат, и функция не должна больше ничего менять, не должна трогать входные данные, и не зависеть ни от каких данных кроме этих. Каждую из них может разрабатывать отдельный разработчик, не сильно заботясь об общей архитектуре приложения, и даже на совершенно разных языках можно писать, выбирая тот который больше подходит для конкретной задачи, которая к тому же имеет очень четкие границы.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/01/19/storage-for-data-mining/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jar с винтом</title>
		<link>http://artamonov.ru/2008/11/25/jar-s-vintom/</link>
		<comments>http://artamonov.ru/2008/11/25/jar-s-vintom/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 20:38:33 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Мысли]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[библиотеки]]></category>
		<category><![CDATA[языки]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=145</guid>
		<description><![CDATA[Java, как язык &#8211; ничего особо выдающегося. Да даже тот же C# внешне выглядит приятней, что уж говорить о многих динамических языках. Хотя, если насчет самого синтаксиса Java, то тут тоже наметилась тенденция, уже есть вполне неплохие JRuby, Groovy, Scala и Clojure, выбирай по вкусу.
Так вот, хоть как язык Java и проигрывает, но она имеет [...]]]></description>
			<content:encoded><![CDATA[<p>Java, как язык &#8211; ничего особо выдающегося. Да даже тот же C# внешне выглядит приятней, что уж говорить о многих динамических языках. Хотя, если насчет самого синтаксиса Java, то тут тоже наметилась тенденция, уже есть вполне неплохие <a href="http://jruby.codehaus.org/">JRuby</a>, <a href="http://groovy.codehaus.org/">Groovy</a>, <a href="http://www.scala-lang.org/">Scala</a> и <a href="http://clojure.org/">Clojure</a>, выбирай по вкусу.</p>
<p>Так вот, хоть как язык Java и проигрывает, но она имеет за плечами огромный набор библиотек, для решения почти всех востребованных задач. Я бы даже выразился так:</p>
<pre>
На каждую хитрую задачу найдется свой jar с винтом.
</pre>
<p>ну может не всегда именно jar, а скорее технология, протокол, спецификация, но суть в общем такая.</p>
<p>У всех остальных все хуже. Там или узкая заточенность под одни нужды (RoR), или единая линия партии (.Net), или просто полный хаос.</p>
<p>Главное &#8211; это все таки сколько у тебя за спиной готовых, зарекомендовавших себя и переиспользуемых решений. А что до производительности и требования к ресурсам, так с этим уже давно все хорошо, все работает достаточно быстро, если написать конечно как положено, а не как обычно. Да и в последнее время это уже неактуальная проблема, сейчас в цене не производительность, а масштабируемость.</p>
<p>Поэтому нравится java или нет, но&#8230; но чаще всего выбирать и не из чего.</p>
<p>P.S.: Хотя, если честно, есть тут один минус: это то что привыкнув к этому все стараются делать &laquo;через жаву&raquo;, что не всегда верно, но это уже издержки производства.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/11/25/jar-s-vintom/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Map Reduce</title>
		<link>http://artamonov.ru/2008/09/16/mapreduce/</link>
		<comments>http://artamonov.ru/2008/09/16/mapreduce/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 09:21:32 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[data mining]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[mapreduce]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=122</guid>
		<description><![CDATA[
Подход mapreduce сейчас, с ростом объемов вычислений, стал очень популярен, но все упоминания какие то туманные, надо разложить все по полочкам. Начну с того что напомню о такой штуке как «закон Амдала». Он описывает ограничение роста производительности вычислительной системы с увеличением количества вычислителей, т.е. как мы можем ускорить вычисление увеличивая количество компьютеров в кластере. В [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://artamonov.ru/wp-content/uploads/2008/09/combines-1-150x150.jpg" alt="map reduce harvesters" title="mapreduce" width="150" height="150" class="size-thumbnail wp-image-126" style="float: left; padding: 5px"/><br />
Подход mapreduce сейчас, с ростом объемов вычислений, стал очень популярен, но все упоминания какие то туманные, надо разложить все по полочкам. Начну с того что напомню о такой штуке как «<a href="http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%90%D0%BC%D0%B4%D0%B0%D0%BB%D0%B0">закон Амдала</a>». Он описывает ограничение роста производительности вычислительной системы с увеличением количества вычислителей, т.е. как мы можем ускорить вычисление увеличивая количество компьютеров в кластере. В общем то тут все интуитивно понятно. <span id="more-122"></span> Математически он выражается в формуле:</p>
<div style="text-align:center; clear: both">
<img src="http://artamonov.ru/wp-content/uploads/2008/09/formula.png" alt="" title="formula" width="158" height="78" class="aligncenter size-full wp-image-123" />
</div>
<p>где:<br />
α — доля вычислений которые могут быть произведены только последовательно,<br />
p — размер кластера (ну или количество процессоров/вычислителей). </p>
<p>И чем меньше α тем ближе масштабируемость к линейной. При 10% последовательного кода, к примеру, выходит что больше чем 100 компьютеров использовать не имеет никакого смысла, никакого серьезного прироста не будет, хоть на 1000 запускай. И добиться этих 10% не всегда просто.</p>
<p>Понятно что для того чтобы мы могли ускорять программу добавляя процессоры она должна иметь минимум таких обязательно последовательных участков. Это, кстати, один из стопоров увеличения количества ядер, так как сейчас очень мало программ которые используют параллельное вычисление, α у большинства в районе единицы, и тут как не добавляй ядра, программа не заработает быстрее.</p>
<p>Так вот MapReduce это такой подход построения архитектуры при котором просто не получится написать не параллельное приложение, α будет близко к 0. Алгоритм разбивается на 2 слоя параллельных операций и, в итоге, очень хорошо масштабируется. Надо заметить что алгоритм в виде функции map+reduce может быть гораздо медленней чем он же в стандартном (имеющим последовательные участки) виде, но стандартный алгоритм будет иметь предел после которого добавляя процессоры мы не выигрываем в производительности, с map+reduce вариантом этот предел почти недостижим. Дополнительным плюсом здесь является независимость, и при сбое отдельного участка его можно вычислить заново, не перезапуская весь процесс.</p>
<p>Map в данном случае независимо обрабатывает входящие блоки данных. Но хоть сами входящие данные не зависят друг от друга, то результат обработки часто зависит от их связей между собой. Обработкой первоначально независимой информации занимается соответственно <code>Map</code>, он подготавливает блоки данных для обработки, обработкой итоговых, уже зависимых друг от друга, данных займется <code>Reduce</code>.</p>
<p>Один из классических примеров использования mapreduce &#8211; подсчитать распределение слов. В этом случае map обрабатывает входной текст, как независимые блоки. На выходе получаем пары «слово — кол-во употреблений» . В простейшем случае map не анализирует текст, а лишь разбивает по пробелам, в итоге из текста 5 раз содержащего слово «hello» на выходе будет не пара <code>«hello — 5»</code>, а 5 пар по <code>«hello — 1»</code>. Вот этот выхлоп уже связан друг с другом, и reduce обрабатывает эту связь. Ему на вход приходят блоки с одинаковым ключем пары, он в свою очередь суммирует цифровые значения этих пар. Поэтому обоих случаев наших <code>«hello — x»</code> он выдаст <code>«hello — 5»</code>. Основную работу тут выполняет reduce. Такой, не совсем простой, способ подсчета количества слов полезен когда объем анализируемого текста измеряется гигабайтами (и более). Map выдаст огромный файл отсортированных пар <code>«слово — количество»</code> Так как он отсортирован то пробегая по нему достаточно просто вызвать reduce для всех групп с одним ключом, и получить суммарное количество для каждого из слов. </p>
<p>Хочу заметить что mapreduce, конечно, не панацея, часто он совсем не оптимален, и для малых объемов вообще не имеет смысла, но это самое простое и универсальное решение для масштабируемых алгоритмов, хорошо подходящий для различных data mining решений.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/09/16/mapreduce/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Я не знаю EJB и JSF</title>
		<link>http://artamonov.ru/2008/08/06/ya-ne-znayu-ejb-i-jsf/</link>
		<comments>http://artamonov.ru/2008/08/06/ya-ne-znayu-ejb-i-jsf/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 08:39:48 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Мысли]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[архитектура]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=81</guid>
		<description><![CDATA[Как то так сложилось что при моем примерно 7-летнем опыте коммерческой разработки на Java я почти не имею опыта в EJB. Хотя это первое что спрашивают на собеседовании, я ведь проверял не так давно. Самое интересное, кстати, в том что многие собеседователи после кучи вопросов по опыту в EJB/WebSphere/JMS/пр., о том как это все им [...]]]></description>
			<content:encoded><![CDATA[<p>Как то так сложилось что при моем примерно 7-летнем опыте коммерческой разработки на Java я почти не имею опыта в EJB. Хотя это первое что спрашивают на собеседовании, я ведь проверял не так давно. Самое интересное, кстати, в том что многие собеседователи после кучи вопросов по опыту в EJB/WebSphere/JMS/пр., о том как это все им важно и пр., рассказывая о своих проектах, говорят что на практике все их проекты разрабатываются без какого либо EJB и прекрасно работают по Tomcat, а WebSphere получается лишь для веса. Возможно и потому что не серьезно сейчас предлагать решение без WebSphere/WebLogic + Oracle.</p>
<p>А мне всегда как то хватало связки Spring + Hibernate + Tomcat/JBoss, что в сущности дает тоже самое, но удобнее. Список можно продолжить добавив еще как минимум Acegi, AspectJ, и прочие решения умеющие хорошо и удобно решать свою отдельную задачу, многие легко взаимозаменяемы и дают очень неплохой синергетический эффект.<br />
<span id="more-81"></span><br />
EJB немного был когда я работал в Luxoft, но это почти мимо меня прошло. К EJB как таковому у меня отношение отрицательное из-за больших объемов лишней работы, я считаю что простые вещи должны делаться просто. Для EJB это не выполнялось, простые вещи делались сложно. Да и, честно говоря, сложные вещи делались не сложно, а очень сложно. Тоже самое касается и JSF. Система становится всеобъемлющей, делает все что можно, но, как результат комплексности, делает &laquo;все&raquo; одинаково плохо. Говорят с EJB 3.0 все лучше стало, т.к. изучили опыт аналогов (читай стараются догнать). Но это немного поздно, и с учетом инертности крупных разработчиков все совсем плохо.</p>
<p>Все это рассчитывалось на то что с этим сможет работать совершенно некомпетентный специалист, который возьмет какую либо GUI рисовалку и, не понимая базовых принципов, наклепает работающее приложение. В результате совершенно непонятно как вся эта хренотень может работать, и требует огромных компьютерных ресурсов. Хотя для последнего всегда проще купить HP Superdome и не парится (к тому же часто наоборот, сервера уже стоят, а загружены на 10%, но это уже решается другими методами). На самом деле я даже согласен, часто действительно лучше и гораздо дешевле поставить железо мощнее, но только когда это не вызвано уродством архитектуры. Т.е. когда мы пишем сервер на Ruby (например) и получаем красивое технологически решение, <u>поддерживаемое и легко расширяемое</u>, то потребность в больших ресурсах вполне себе оправдана, но когда говорят <em>&laquo;а нафиг нам пул соединений с БД? без него точно все работает, а с ним вдруг что случится? у нас сервер хороший и без пула потянет!&raquo;</em> то тут уже не сервер ставить, а архитектора увольнять. Хотя и мысль теоретически даже правильная, но не в том месте. </p>
<p>JSF больше страдает клиентской избыточностью, но для intranet на это еще можно забить. Я даже пару раз пытался использовать это, но так и не понял вкуса.  К тому же если нужно создавать хороший интерфейс не заморачиваясь с html/javascript, то надо использовать GWT, а не JSF. Но это, конечно, если нет в требованиях пункта &laquo;поддержка Netscape Navigator 3.0&#8243;, что еще было обязательным года 3 назад, надеюсь сейчас эти &laquo;компьютеры&raquo; уже окончательно доломались и на замену поставили те где можно поставить браузер посовременней. </p>
<p>А то к чему приводит разработка лишь на JSF могу проиллюстрировать тем что на очередном собеседовании с большим недоверием отнеслись к тому что я могу редактировать JSP/HTML в текстовом редакторе, вместо положенного WYSIWYG редактора. Очень удивились тому что я могу предполагать как изменится внешний вид в браузере после редактирования исходного HTML этой страницы. Я по своей наивности считал это вполне обыденной вещью, которую можно поручать даже школьнику-верстальщику. Ладно хоть не сказал что, к примеру, еще понимаю как HTTP протокол организован и на сайты хоть телнетом ходить могу.</p>
<p>Та вот, к чему я. В начале заголовок статьи был &laquo;Я не использую EJB и JSF&raquo;, сейчас заменил на &laquo;Я не знаю EJB и JSF&raquo;. Т.е. это скорее не принципиальное решение, а ситуация. Ведь может быть действительно моя проблема в том что я не знаю их? Может там есть очень серьезные плюсы? Серьезные выигрыши для проекта, для архитектуры, по сравнению с теми же Spring, Hibernate и пр.? Снижение каких то рисков? Если в случае EJB еще более-менее понятно, само по себе оно нужно, как минимум все части по отдельности востребованы. Вопрос в том нужны ли столь тяжеловесные решения иногда для простых задач, когда есть прекрасные и удобные альтернативы. Иногда конечно стоит взять готовую коробку от IBM, Oracle или BEA, вместо набора различных OS кубиков типа Mule, ActiveMQ, JBoss, Hibernate, Spring и т.д.  Это касается EJB, а вот в случае JSF мне вообще непонятно как оно до сих пор существует и кому это надо, неужели JSF дает что-то такое что разработка становится настолько дешевле? </p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/08/06/ya-ne-znayu-ejb-i-jsf/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Долги проектированию</title>
		<link>http://artamonov.ru/2008/05/16/design-debt/</link>
		<comments>http://artamonov.ru/2008/05/16/design-debt/#comments</comments>
		<pubDate>Fri, 16 May 2008 12:13:33 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Методология]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[проектирование]]></category>
		<category><![CDATA[рефакторинг]]></category>
		<category><![CDATA[управление]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=75</guid>
		<description><![CDATA[Все мы знаем что разработка приличного ПО это серьезные вложения, шестизначные суммы, в долларах. Но почему многие компании потом выкидывают результаты этих вложений? Почему выбрасывают существующую систему и переписывают все с нуля? Почему иногда отказываются от уже работающей и полезной системы?
Чаще всего такие решения принимают когда поддержка текущей программы становится слишком дорогой, т.к. со временем [...]]]></description>
			<content:encoded><![CDATA[<p>Все мы знаем что разработка приличного ПО это серьезные вложения, шестизначные суммы, в долларах. Но почему многие компании потом выкидывают результаты этих вложений? Почему выбрасывают существующую систему и переписывают все с нуля? Почему иногда отказываются от уже работающей и полезной системы?</p>
<p>Чаще всего такие решения принимают когда поддержка текущей программы становится слишком дорогой, т.к. со временем изменения становятся все дороже и дороже. Ну и в итоге цена изменений становится совсем высокой и компания вынуждена выкинуть текущий продукт, и переписать все заново.<br />
<span id="more-75"></span><br />
Причина роста стоимости изменений в снижении качества внутреннего дизайна, архитектуры проекта. Но т.к. выкинуть и переписать заново это большие денежные затраты, то значит никто не должен позволить испортится внутренней архитектуре то такого плохого состояния. Но это постоянно происходит, почему?</p>
<p>Метафора &laquo;Design debt/Долг проектированию&raquo; объясняет эту ситуацию. Когда команда работает под давлением сроков, то в первую очередь приносится в жертву архитектура приложения. Это как брать кредит по высокий процент. Команда получает ускорение в краткосрочном периоде, но с этого момента все изменения становятся дороже, эти изменения как бы выплачивают проценты по кредиту. Единственный способ перестать платить этот высокий процент, это исправить первопричину и сделать то что не было сделано когда решили отказаться от качественного дизайна.</p>
<p>Большинство команд, конечно, не думаю в понятиях &laquo;долга проектированию&raquo; и не пытаются выплатить &laquo;кредит&raquo;. Но если у вашего проекта очень сжатые сроки, то вы наверняка уже взяли этот кредит. И он уже начинает требовать бОльшие выплаты, которые опять же требуют взять очередной кредит, и т.д. по спирали, пока проект не задохнется от бремени долга.</p>
<p>Можно нарушить эту цепь, но это требует достаточно больших усилий. Начать нужно с того чтобы команда поняла что &laquo;кредит проектированию&raquo; неприменим в текущем проекте. Также всех нужно научить методам постепенного дизайна, рефакторинга, и пр. методам улучшения качества кода. Ну и, конечно, нужно выделить время на применения этих методов.</p>
<p>Только вот откажитесь от идеи остановить всю разработку и рефакторить несколько недель, приведя все в порядок. Даже самая хорошая команда переодически попадает в такие долги, поэтому нужно весь период, в течении которого идет разработка, часть времени уделять избеганию этой проблемы. Т.е. нужно каждый день, во время разработки, уделять небольшую часть времени на рефакторинг, а не попытаться сделать это за один раз и забыть до поры до времени. Как с тем же кредитом, нужно начать выплачивать большими суммами, чтобы быстрее погасить, а не попытаться выплатить весь долг за раз.</p>
<p>Кредит проектированию это как кредит по кредитной карте: легко получить, быстро помогает в текущей проблеме, но влечет большие проблемы, до тех пор пока все не выплатишь. Почти каждая команда сможет работать быстрее, когда расплатится с этим кредитом. Поэтому требуйте постоянного улучшения качества разрабатываемой системы. А эти &laquo;лишние&raquo; затраты времени окупятся в будущем.</p>
<p>Иногда сложно увидеть долг проектированию, но если вы встретите нижеуказанные проблемы, то вы уже увязли:</p>
<ul>
<li> Команда отзывается о программе с упоминанием оборотов &laquo;куча заплаток&raquo;,  &laquo;хак&raquo;,  &laquo;работает и не трогай&raquo;, &laquo;кто это понаписал!&raquo; и т.д.</li>
<li>Команда часто сталкивается с неожиданными проблемами.</li>
<li>После каждого исправления появляется череда новых ошибок.</li>
<li>Ошибки которые уже исправляли появляются снова, через некоторое время.</li>
</ul>
<p>Чтобы не залезть глубоко в долги старайтесь больше внимания уделять следующему:</p>
<ul>
<li>Увеличивайте время на разработку, ну или по крайней мере не подгоняйте и не урезайте сроки.</li>
<li>Настройте команду на постоянное улучшение качества кода проекта.</li>
<li>Постоянно занимайтесь рефакторингом, редизайном, код ревью и пр.</li>
<li>Возвращайте этот &laquo;кредит&raquo; постоянно и постепенно, не пытайтесь все вернуть за один подход.</li>
</ul>
<p>На основе:<br />
&laquo;<a href="http://jamesshore.com/Articles/Business/Software%20Profitability%20Newsletter/Design%20Debt.html">Design Debt</a>&laquo;, Software Profitability, February 2004, by Jim Shore</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/05/16/design-debt/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Выбор лучшего алгоритма хэширования строк</title>
		<link>http://artamonov.ru/2008/05/08/best-hashing-algorithm/</link>
		<comments>http://artamonov.ru/2008/05/08/best-hashing-algorithm/#comments</comments>
		<pubDate>Thu, 08 May 2008 13:35:47 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[DJB]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[int]]></category>
		<category><![CDATA[SDBM]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[алгоритм]]></category>
		<category><![CDATA[строки]]></category>
		<category><![CDATA[хэш]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=73</guid>
		<description><![CDATA[
Неоднократно слышал о том что метод вычисления хэша, реализованный по умолчанию, для строк в Java не совсем хороший. Якобы много коллизий и пр. На замену ему можно найти в интернете несколько иных алгоритмов, но тоже непонятно какой лучший.
Поэтому проведем экперимент, сравним алгоритм по умолчанию, и пару считающихся лучшими алгоритмов. Выберем, так сказать, the best of [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://artamonov.ru/wp-content/uploads/2008/05/t1-150x150.png" alt="Качество хэшей, отклонение от оптимального" title="Отклонения хэшей" width="150" height="150" style="float:left; margin-right:10px;"/><br />
Неоднократно слышал о том что метод вычисления хэша, реализованный по умолчанию, для строк в Java не совсем хороший. Якобы много коллизий и пр. На замену ему можно найти в интернете несколько иных алгоритмов, но тоже непонятно какой лучший.</p>
<p>Поэтому проведем экперимент, сравним алгоритм по умолчанию, и пару считающихся лучшими алгоритмов. Выберем, так сказать, the best of the best среди хэширования <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Конкретно для меня, это равная вероятность состояний отдельных бит, в 32х битном целом. Т.е. чем ближе вероятность появления &laquo;1&#8243; в каждой из позиций к вероятности 1/2 тем лучше.<br />
<span id="more-73"></span><br />
И так, помимо алгоритма по умолчанию решил попробовать SDBM:</p>
<pre class="code_java"><code>public int hash(String val) {
    int hash = 0;
    for (char c: val.toCharArray()) {
	hash = c + (hash << 6) + (hash << 16) - hash;
    }
    return hash;
}
</code></pre>
<p>и DJB2:</p>
<pre class="code_java"><code>public int hash(String val) {
    int hash = 0;
    for (char c: val.toCharArray()) {
	hash = ((hash << 5) + hash) + c;
    }
    return hash;
}
</code></pre>
<p>и подсчитал отклонение от середины для случайно сгенеренных слов (как коротких так и длинных), на английском, русском, смешанном, смешанном+случайный регистр.</p>
<p>И вот график среднего отклонения, по этим четырем тестам:<br />
<img src="http://artamonov.ru/wp-content/uploads/2008/05/t1.png" alt="Качество хэшей, отклонение от оптимального" title="Отклонения хэшей" class="aligncenter size-medium wp-image-74" /><br />
По оси X - номер бита, по Y отклонение от равномерного, среднее для 4х тестов.<br />
Видно что алгоритм по умолчанию, что DJB2 нормально работают лишь для первых 15 бит, дальше отклонения все больше и больше (на практике понижается вероятность заполнения бита по мере удаления от начала) В Java же int является 32х битным, поэтому в таком случае лучше использовать SDBM, который гораздо меньше отклоняется.</p>
<p>Да, кстати, для чисто русского текста результаты всегда получше чем для чисто английского и даже их смеси.</p>
<p>Количество коллизий я не замерял, но судя по <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/142054">некоторым тестам</a> sdbm здесь тоже себя хорошо ведет.</p>
<p>PS: это для моих потребностей важна именно равномерность, не буду утверждать что для всех остальных случаев SDBM алгоритм лучше/быстрее/пр., но вероятно что именно так.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/05/08/best-hashing-algorithm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Лаконичность кода или Java vs K или зачем нам JRuby и Groovy</title>
		<link>http://artamonov.ru/2008/04/24/lakonichnost-koda-ili-java-vs-k-ili-zachem-nam-jruby-i-groovy/</link>
		<comments>http://artamonov.ru/2008/04/24/lakonichnost-koda-ili-java-vs-k-ili-zachem-nam-jruby-i-groovy/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 15:38:07 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Мысли]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[codestyle]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[J]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[K]]></category>
		<category><![CDATA[Kdb]]></category>
		<category><![CDATA[Q]]></category>
		<category><![CDATA[ФЯ]]></category>

		<guid isPermaLink="false">http://artamonov.ru/2008/04/24/lakonichnost-koda-ili-java-vs-k-ili-zachem-nam-jruby-i-groovy/</guid>
		<description><![CDATA[Кто там говорит что perl-код не читабелен? Вот вам реализация soundex на языке K:
sdx:"bfpvcgjkqsxzdtlmnr"!(4#1),(8#2),(3 3 4 5 5 6)
nn:{d2:x where x > 0;r:d2 where d1:0w':d2}
soundex:{(x[0],(nn (sdx@1 _ x)),l:4#0)[til 4]}

угу, именно так&#8230; Похоже что клавиатуру протирали.
Теперь запускаем:
&#62;soundex "hellomyfriends"
("h";4;5;1)

А оно работает даже!
На самом деле из меня пока еще никакой специалист по K, и в действительности саму функцию [...]]]></description>
			<content:encoded><![CDATA[<p>Кто там говорит что perl-код не читабелен? Вот вам реализация soundex на языке <a href="http://en.wikipedia.org/wiki/K_programming_language">K</a>:</p>
<pre><code>sdx:"bfpvcgjkqsxzdtlmnr"!(4#1),(8#2),(3 3 4 5 5 6)
nn:{d2:x where x > 0;r:d2 where d1:0w<>':d2}
soundex:{(x[0],(nn (sdx@1 _ x)),l:4#0)[til 4]}
</code></pre>
<p>угу, именно так&#8230; Похоже что клавиатуру протирали.<br />
Теперь запускаем:<span id="more-72"></span></p>
<pre><code>&gt;soundex "hellomyfriends"
("h";4;5;1)
</code></pre>
<p>А оно работает даже!</p>
<p>На самом деле из меня пока еще никакой специалист по K, и в действительности саму функцию (т.е. последние 2 строки) наверняка можно переписать укоротив раза в 2-3, вообще для такой мелочи должно 1 строки кода хватать, так что мой пример нифига не лаконичен. Но идея думаю понятна. На Java тоже самое было бы гораздо длиннее, я приводить алгоритм soundex не буду, но можете посмотреть на другие <a href="http://www.cs.nyu.edu/~michaels/screencasts/Java_vs_K/Java_vs_K.html">сравнения синтаксиса Java и K</a></p>
<p>Честно говоря вся фишка языка K вовсе не в том что он такой компактный, а в <a href="http://kx.com/">Kdb+</a> и их совместных возможностях, но все же, я именно о синтаксисе. Для Java кода, при кодревью, я всегда помечал записи вида:</p>
<pre><code>x += isEmpty(s) || isDigit(s) ? 1 : 2;
</code></pre>
<p>и требовал что то вроде:</p>
<pre><code>if (isEmpty(s) || isDigit(s)) {
    x++;
} else {
    x += 2;
}
</code></pre>
<p>Что первый что второй вариант одинаковы понятны, хотя визуально второй прозрачней. K на самом деле тоже понятен, ну если его конечно изучить <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Вот только порог вхождения тут повыше, во многом из за того что сходу не получается читать примеры кода. Ну и опечатки гораздо менее заметны.</p>
<p>Так вот для человека, который не знает программирования, а тем более уж Java и K, оба языка покажутся &laquo;китайской грамотой&raquo;, и лишь для специалиста будет понятно, причем лишь тот пример на языке которого у него есть реальный опыт. </p>
<p>Еще в Java есть куча людей непонимающих вовсе как работает компьютер и что именно они пишут, а в K сплошь хакеры, поэтому для первых и делается попытка как можно больше упростить синтаксис, чтобы достаточно было знать даже не язык программирования, а английски язык. В результате получается что исправить ошибку или продолжить проект на java гораздо проще, возможно что даже если и опыт владения языками одинаков. Также на практике много раз убеждался что вполне можно сказать тестеру, аналитику или админу что и где нужно исправить, если возникла проблема а у вас нет возможности исправить в данный момент, и он исправит без проблем. В случае K объяснить будет на порядок сложнее, да даже слушать никто не станет, придется ехать и самому лезть в код, даже если надо всего лишь повернуть слэш в другую сторону <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>С другой стороны когда реализуешь алгоритм немного раздражает что пишешь сотни строк не относящихся напрямую к алгоритму (конечно постоянные Ctrl+Enter немного облегчают, но все же это не панацея), а после не можешь его окинуть взглядом и чтобы понять как оно работает появляются уродцы типа UML диаграмм. Ну и вообще пока описываешь эти бесконечные иерархии начинаешь забывать что собственно пишешь.  Кстати, а может устроить программирование как в шахматных партиях: 8 машинисток и идти вдоль ряда, лишь парой фраз указывая каждой что ей нужно писать? В случае Kdb+/K ходит история что некоторые, совсем уж хакеры, на ходу, собственно в процессе получения ТЗ от зрителей, за 1-1,5 часа пишут небольшую ERP.</p>
<p>Так вот, к чему я, если отвлечься от &laquo;java разработчика без проблем найти, а под K замучаешься&raquo;, то возникает вопрос: а все же как лучше? С одной стороны простота, с другой скорость реализации. Весь этот синтаксический overhead уже заставляет java разработчиков искать себя в ruby, python, groovy. Этакая золотая середина?</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/04/24/lakonichnost-koda-ili-java-vs-k-ili-zachem-nam-jruby-i-groovy/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>6 советов по проектированию XML документа</title>
		<link>http://artamonov.ru/2008/03/04/7-tips-for-xml-structure/</link>
		<comments>http://artamonov.ru/2008/03/04/7-tips-for-xml-structure/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 04:35:37 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[интеграция]]></category>
		<category><![CDATA[паттерны]]></category>
		<category><![CDATA[проектирование]]></category>
		<category><![CDATA[совет]]></category>

		<guid isPermaLink="false">http://artamonov.ru/2008/03/04/7-tips-for-xml-structure/</guid>
		<description><![CDATA[Приведу небольшой список правил, на которые можно разумно ориентироваться при проектировании новой XML структуры. Это конечно не &#171;истина в последней инстанции&#187;, и есть куча случаев когда некоторые из них совсем не подойдут, но в общем виде, как ориентир, ознакомится следует, чтобы не плодить xml документы с которыми невозможно работать.
1. Используйте атрибуты для одной группы
Выносите короткие [...]]]></description>
			<content:encoded><![CDATA[<p>Приведу небольшой список правил, на которые можно разумно ориентироваться при проектировании новой XML структуры. Это конечно не &laquo;истина в последней инстанции&raquo;, и есть куча случаев когда некоторые из них совсем не подойдут, но в общем виде, как ориентир, ознакомится следует, чтобы не плодить xml документы с которыми невозможно работать.</p>
<h2>1. Используйте атрибуты для одной группы</h2>
<p>Выносите короткие значения из одной группы в атрибуты.<br />
Лучше</p>
<pre class="xml">
&lt;user name="John" sname="Smith"/>
</pre>
<p>чем</p>
<pre class="xml">
&lt;user>
 &lt;name>John&lt;/name>
 &lt;sname>Smith&lt;/sname>
&lt;/user>
</pre>
<p><span id="more-64"></span></p>
<h2>2. Используйте CamelCase</h2>
<p>Лучше всего lowerCamelCase, хотя достаточно распространен вариант с UpperCamelCase для элементов и lowerCamelCase для атрибутов.</p>
<h2>3. Не используйте разделители</h2>
<p>Это конечно входит в совет по CamelCase, но скажу отдельно: не надо разделять слова с помощью тире или подчеркивания.<br />
Вместо</p>
<pre class="xml">
&lt;user_name>foo&lt;/user_name>
</pre>
<p>пишите</p>
<pre class="xml">
&lt;userName>foo&lt;/userName>
</pre>
<h2>4. Не используйте лишнюю нумерацию</h2>
<p>Если подразумевается что у элемента будет всегда несколько детей, то не надо их описывать как child1, child2 и т.д., опишите как они есть их позиция и будет этим номером. Для XSLT проще проверить функцию position(), чем делать всякие хаки для перехвата таких элементов. В крайнем случае можно добавить атрибут и именем index/position/x/и т.д. Работать с таким документом гораздо проще.<br />
Вместо</p>
<pre class="xml">
&lt;user>
  &lt;phone1>1234567890&lt;/phone1>
  &lt;phone2>0123456789&lt;/phone2>

  &lt;cell1>12&lt;/cell1>
  &lt;cell3>927&lt;/cell3>
&lt;/user>
</pre>
<p>напишите</p>
<pre class="xml">
&lt;user>
  &lt;phone>1234567890&lt;/phone>
  &lt;phone>0123456789&lt;/phone>

  &lt;cell index="1">12&lt;/cell>
  &lt;cell index="3">927&lt;/cell>
&lt;/user>
</pre>
<h2>5. Не надо тематических префиксов/окончаний</h2>
<p>Не нужно всех эти firstItem + secondItem, workPhone + homePhone и пр. Все также как и в предыдущем пункте, нужно вынести все это в атрибут, например type:</p>
<pre class="xml">
&lt;client>
 &lt;phone type="home">1234567890&lt;/phone>
 &lt;phone type="work">0123456789&lt;/phone>
&lt;/client>
</pre>
<h2>6. Опишите похожие структуры одинаковым элементом</h2>
<p>Многие различные элементы можно сократить до одного универсального. К примеру если элементы имеет множество однотипных подэлементов &laquo;параметров&raquo;, то можно сократить их до вида:</p>
<pre class="xml">
&lt;property name="xxx">value&lt;/property>
</pre>
<p>или </p>
<pre class="xml">
&lt;property name="xxx" value="value"/>
</pre>
<p>Т.е вместо:</p>
<pre class="xml">
&lt;user>
 &lt;src>1&lt;/src>
 &lt;load>Y&lt;/load>
&lt;/user>
</pre>
<p>написать</p>
<pre class="xml">
&lt;user>
&lt;property name="src" value="1"/>
&lt;property name="load" value="Y"/>
&lt;/user>
</pre>
<p>Не факт что получится сэкономить на объеме кода, даже наоборот, но обрабатывать опять же проще будет. В данном случае нужно выборочно подходить, в зависимости от назначения документа, от того как его обрабатывать. И не надо перегибать палку, а то таким образом весь документ можно описать, построчно.</p>
<h2>И напоследок: напишите XSD/DTD</h2>
<p>И все таки надо описывать структуру, ну хоть в базовом виде. Пример примером, но как дойдет дело до реального использования, до интеграции разных частей &#8211; начнутся проблемы. Даже с совсем базовым XSD хоть как то можно валидировать, в конце концов от опечаток спасет.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/03/04/7-tips-for-xml-structure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
