<?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; Java</title>
	<atom:link href="http://artamonov.ru/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://artamonov.ru</link>
	<description>Посмотрим, глубока ли кроличья нора</description>
	<lastBuildDate>Wed, 01 Feb 2012 11:35:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JavaScript vs. Google Webtoolkit</title>
		<link>http://artamonov.ru/2011/01/10/javascript-vs-google-webtoolkit/</link>
		<comments>http://artamonov.ru/2011/01/10/javascript-vs-google-webtoolkit/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 04:31:08 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=582</guid>
		<description><![CDATA[Несколько лет назад появился Google Webtoolkit, для меня в тот момент это казалось прорывной технологий. Главная идея была в том чтобы писать код web приложения, или его части, на Java, который потом компилируется в HTML + JavaScript. В чем было преимущество? В том что для java в то время уже была создана очень мощная система [...]]]></description>
			<content:encoded><![CDATA[<p>Несколько лет назад появился <a href="http://code.google.com/intl/ru/webtoolkit/">Google Webtoolkit</a>, для меня в тот момент это казалось прорывной технологий. Главная идея была в том чтобы писать код web приложения, или его части, на Java, который потом компилируется в HTML + JavaScript. В чем было преимущество? В том что для java в то время уже была создана очень мощная система поддержки разработки: интеллектуальная среда разработки, средства рефакторинга, юнит тестирование с кучей дополнений, автоматический анализ кода и code coverage, документирование и пр. и пр. Да до сих пор тут нет ей равных. Ну и сам язык, с понятным синтаксисом, типизированный (в данном случае это было плюсом) и пр.</p>
<p>А вот в JavaScript тогда не было ничего. FireBug только появлялся, jQuery не было. Отладка была лишь за счет alert&#39;ов. Серьезный процесс разработки на этом не построишь.</p>
<p>В GWT тоже было куча минусов, результат компиляции был довольно массивным, и HTML представлял собой десятки вложенных друг в друга таблиц. Но тем не менее.</p>
<p>А в прошлом году происходил какой-то фантастический рост использования JavaScript. Появились тысячи библиотек. Благодаря jQuery код писать становится на порядок проще, появились средства разработки (IDEA стала ничуть не хуже работать с HTML/JavaScript/CSS), firebug вырос, и пр. Теперь все совсем наоборот, разработка на JavaScript стала гораздо проще чем на GWT, разрабатывать действительно быстрее и результат получается качественней. Есть, конечно, еще куча вещей которые нужно сделать, но уже вполне неплохо. И как минимум позволило ему стать лидером прошлого года, помимо возросшей востребованности.</p>
<p>Я в данном случае не эксперт, но похоже как-то так. А вы что скажете? Вырос ли javascript до уровня серьезной разработки? Какие полезные инструменты порекомендуете? И в каких случаях есть смысл использовать gwt?</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2011/01/10/javascript-vs-google-webtoolkit/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Spring-Data</title>
		<link>http://artamonov.ru/2010/09/29/spring-data/</link>
		<comments>http://artamonov.ru/2010/09/29/spring-data/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 18:35:38 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=434</guid>
		<description><![CDATA[Вчера беседовал с Марком Полаком из SpringSource и узнал что они сейчас занимаются, помимо прочего, проектом Spring Data. Это будет некий ORM. Так что, во-первых, все недовольные Hibernate и пр. могут иметь ввиду. А во-вторых эта штука делается и для NoSQL решений, что для моих проектов очень интересно. Стабильное решение будет не скоро, проект в [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера беседовал с <a href="http://www.springsource.com/people/mpollack">Марком Полаком</a> из <a href="http://www.springsource.com/">SpringSource</a> и узнал что они сейчас занимаются, помимо прочего, проектом <a href="http://git.springsource.org/spring-data">Spring Data</a>. Это будет некий ORM. Так что, во-первых, все недовольные Hibernate и пр. могут иметь ввиду. А во-вторых эта штука делается и для NoSQL решений, что для моих проектов очень интересно. </p>
<p>Стабильное решение будет не скоро, проект в самом начале пути, нет ни плана, ни майлстоунов, ни объявлений, но есть надежда что выкатят летом-осенью следующего года. Ну а сейчас, говорит, уже работает для Neo4J и MongoDB.</p>
<p>Там, кстати, Gitorius. Так что можете поучаствовать, если хочется использовать пораньше, ну или можно найти что-нибудь другое, интересное вам: <a href="http://git.springsource.org/">http://git.springsource.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2010/09/29/spring-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VMForce</title>
		<link>http://artamonov.ru/2010/04/27/vmforce/</link>
		<comments>http://artamonov.ru/2010/04/27/vmforce/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 20:07:15 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Бизнес]]></category>
		<category><![CDATA[Новые технологии]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[enterprise 2.0]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[vmforce]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=384</guid>
		<description><![CDATA[VMWare только что показали презентацию своего VMForce, платформу для приложений внутри SalesForce, на основе Spring Framework. Презентация была, к сожалению, совсем не бизнесовая, а техническая. Зачем то показывали примеры кода и пр., но не рассказали зачем это. Но общую идею, конечно, можно понять. VMForce это PaaS для реализации своих приложений, интегрированных в инфраструктуру Salesforce, работающую [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://vmware.com">VMWare </a>только что показали презентацию своего <a href="http://vmforce.com">VMForce</a>, платформу для приложений внутри <a href="http://www.salesforce.com">SalesForce</a>, на основе Spring Framework.</p>
<p>Презентация была, к сожалению, совсем не бизнесовая, а техническая. Зачем то показывали примеры кода и пр., но не рассказали зачем это. Но общую идею, конечно, можно понять. VMForce это PaaS для реализации своих приложений, интегрированных в инфраструктуру Salesforce, работающую на их серверах, с их базой данных и их клиентами. Видимо деньги за использование будут будут тоже как-то пилиться между вендорами и salesforce, но вот эту часть вообще мимо обошли, как и много другое.</p>
<p>А вообще вот презентация (это не то что было на официальном представлении, но суть передает):<br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/LpO6whOCAmQ&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/LpO6whOCAmQ&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"></embed></object></p>
<p>Да, все идет к этому, к SaaS, PaaS, Enterpise 2.0, интеграции приложений под одним зонтом и пр. Мы собственно сейчас занимаемся тем же самым, посмотрим кто кого <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  VMForce что-то реальное собирается показать во второй половине года, мы надесь тоже.</p>
<p>P.S. Но суть презентации я не понимаю, хоть убей, что они хотели сказать то? Все сводилось к лозунгу что &laquo;Java может работать в облаке&raquo;. И чо? Кто-то разве сомневался? Не объяснили ни зачем это нужно бизнесу, ни зачем это нужно вендорам, ни что вообще хотят сделать. И вообще трансляция была полуработающая <img src='http://artamonov.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Такое ощущение что им срочно нужно было хоть что-то сказать, но времени на полноценную подготовку не было.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2010/04/27/vmforce/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Swarm DPL</title>
		<link>http://artamonov.ru/2009/10/02/swarm-dpl/</link>
		<comments>http://artamonov.ru/2009/10/02/swarm-dpl/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 09:51:46 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[gridgain]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=258</guid>
		<description><![CDATA[Нашел интересный прототип фреймворка для распределенных вычислений: Swarm-DPL Основная идея в том что код выполняется как можно ближе к данным, и даже больше, он постоянно мигрирует между разными машинами, старясь быть ближе к ним, без остановки основного вычислительного алгоритма. В общем это continuations с переносом состояния между нодами. Это в пику подходу map-reduce когда у [...]]]></description>
			<content:encoded><![CDATA[<p>Нашел интересный прототип фреймворка для распределенных вычислений: <a href="http://code.google.com/p/swarm-dpl/">Swarm-DPL</a> </p>
<p>Основная идея в том что код выполняется как можно ближе к данным, и даже больше, он постоянно мигрирует между разными машинами, старясь быть ближе к ним, <u>без остановки</u> основного вычислительного алгоритма. В общем это <a href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5">continuations</a> с переносом состояния между нодами. Это в пику подходу map-reduce когда у нас именно данные гоняются между нодами. Код все таки меньше места занимает, должно быть быстрее, это не гигабайты данных по сети гонять. </p>
<p>Рекомендую посмотреть презентацию:<br />
<object width="400" height="270"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6614042&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=6614042&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="270"></embed></object>
<p><a href="http://vimeo.com/6614042">Swarm: Distributed Computation in the Cloud</a> from <a href="http://vimeo.com/user2266455">Ian Clarke</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Реализовано на Scala, хотя думаю что никто не мешает реализовать идею на другом языке, и тем более уж под JVM. Автор, правда, утверждает обратное, но причина в том что в Scala все уже есть для этого, уже сейчас, и для прототипа как раз подходит. Ну и насколько я понимаю подобную оптимизацию можно реализовать в GridGain и сейчас, <a href="http://www.gridgainsystems.com/wiki/display/GG15UG/GridAffinityLoadBalancingSpi">указав ноды для MR</a>, но тут идея более интересная.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/10/02/swarm-dpl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Spring + VMWare</title>
		<link>http://artamonov.ru/2009/08/14/spring-vmware/</link>
		<comments>http://artamonov.ru/2009/08/14/spring-vmware/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 13:14:35 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[gridgain]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[mule esb]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=248</guid>
		<description><![CDATA[Наверное все в курсе произошедшей на этой недели покупки SpringSource компанией VMWare. Меня, например, это сильно удивило, совсем не ожидал. Судя по прессрелизу все ради того чтобы обосноваться в нише cloud computing. Ну в общем да, на уровне инфраструктуры виртуализации у VMWare все хорошо, даже очень, а вот в остальном видимо решили докупиться (к тому [...]]]></description>
			<content:encoded><![CDATA[<p>Наверное все в курсе произошедшей на этой недели покупки <a href="http://www.springsource.com/">SpringSource</a> компанией <a href="http://www.vmware.com/">VMWare</a>. Меня, например, это сильно удивило, совсем не ожидал. Судя по <a href="http://www.vmware.com/company/news/releases/springsource.html">прессрелизу</a> все ради того чтобы обосноваться в нише cloud computing. Ну в общем да, на уровне инфраструктуры виртуализации у VMWare все хорошо, даже очень, а вот в остальном видимо решили докупиться (к тому же виртуализацией как таковой сейчас занялись очень многие, надо идти дальше, предлагать платформу).</p>
<p>И я их наверное начинаю понимать, cloud computing это довольно специфичная область. <span id="more-248"></span>Позиционируется чаще всего как средство экономии, гибкости и удобства с технической стороны. Но для серьезного enterprise это ведь совсем не главный критерий, ну поставят они еще пару стоек под свой старый или новый софт, это ведь не критично, это всего лишь деньги. И техническая сторона тоже не критична, не будет большой заказчик с открытым ртом смотреть в сторону гибкости, удобства, экономии, ну и open-source, его вполне устраивают WebSphere+EJB+JSF+Oracle, пусть это гораздо дороже, дольше делается и переделывается, но в этом случае риски отдаются на сторону зарекомендовавшего себя вендора. А вот SpringSource как раз позиционирует себя как альтернатива всему этому тяжеловесному j2ee, как легкий j2ee лицом к разработчику. Как и cloud computing. Видимо и рынок тут ожидается другой, меньше жирных клиентов, а больше развивающихся, и набирающие темпы web-приложения хотят подхватить. В последних так вообще все очень гибко и динамично, редко где java промелькнет, все больше php, ruby, python и прочие динамические и гибкие технологии. Так что хоть VMWare и Spring совсем разные вещи, но обладают общим духом.</p>
<p>Получается что теперь есть комплект из:</p>
<ul>
<li>Spring Framework как общая архитектура приложений, гибкая, &laquo;лицом к разработчику&raquo; и т.д.</li>
<li>Grails для быстрой разработки web-приложений</li>
<li>Tomcat (точнее tm и dm Server&#39;а) как application-сервер</li>
<li>Hiperic для мониторингов и прочего управления софтом в кластере</li>
<li>и сам VMWare, конечно, с виртуализацией и прочим, без чего cloud computing толком не организовать</li>
<li>ничего больше не забыл? Spring в последнее время тоже неплохо расширялся, а за VMWare я не следил</li>
</ul>
<p>Вот только меня смущает что хоть Spring Source и ложится в эту теорию, но чего то не хватает для полного стека, наверное еще что-то будут докупать? Возможно</p>
<ul>
<li>не хватает SOA и прочей интеграции приложений, и я даже думаю конкретно про <a href="http://www.mulesource.com/">Mule ESB</a>, потому что он тесно связан с Spring Framework, и хорошо ложится в общий стек. Хотя сам по себе он излишне усложнен по сравнению с вышеперечисленными, и не совсем похож на остальные ESB, выбрал немного свой путь. Последнее может и плюс в данном случае.</li>
<li>платформы для вычислений в облаке, и тут имхо очень напрашивается <a href="http://gridgain.com/">GridGain</a>, который тоже очень хорошо с Spring связан, и тоже очень прагматичный и гибкий.</li>
<li>наверное еще что-то напрашивается, что мне в голову не приходит? Продукты Apache и JBoss&#39;а не рассматриваю, просто потому что их вряд ли купишь вот таким образом, да и незачем имхо, хотя Hibernate красиво смотрелся бы в этой компании, но с ним отдельная история</li>
</ul>
<p>Так что есть надежда что Spring&#038;Co не загнется, а наоборот расцветет всеми красками и вырастит в сторону очень интересных направлений.  Если, конечно, vmware не закроет исходники. Посмотрим.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/08/14/spring-vmware/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Колоночные базы данных</title>
		<link>http://artamonov.ru/2009/02/17/column-oriented-databases/</link>
		<comments>http://artamonov.ru/2009/02/17/column-oriented-databases/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 14:19:20 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[column oriented]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hbase]]></category>
		<category><![CDATA[Kdb]]></category>
		<category><![CDATA[key value]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[rdbms]]></category>
		<category><![CDATA[simpledb]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=185</guid>
		<description><![CDATA[Меня, если честно, всегда смущал тот факт что Oracle пихают во все задачи, куда только можно, бытует мнение что &#171;БД это Оракл&#187;. Я лично не думаю что это прям такая &#171;серебряная пуля&#187;. MySQL занимает те же позиции немного на другом фронте. Да, Oracle в частности, MySQL, и реляционные БД в общем, это отличный инструмент, но [...]]]></description>
			<content:encoded><![CDATA[<p>Меня, если честно, всегда смущал тот факт что Oracle пихают во все задачи, куда только можно, бытует мнение что &laquo;БД это Оракл&raquo;. Я лично не думаю что это прям такая &laquo;серебряная пуля&raquo;. MySQL занимает те же позиции немного на другом фронте. Да, Oracle в частности, MySQL, и реляционные БД в общем, это отличный инструмент, но для случая когда у нас реально востребована эта реляционность.</p>
<p>Но ведь Оракл используют независимо от того нужна ли нам реляционность, просто по привычке, и потому что <em>&laquo;все так делают&raquo;</em>. Я за все свое время редко встречал нормализованные структуры, и даже больше, часто встречал таблицы БД с колонками вида col_1, col_2, col_N и пр. нарушениями всех форм, когда также разрезали таблицы на отдельные, в том числе отдельные инстансы БД. Встречал также когда в Oracle складывали черт знает что, когда использовали как хранилище лога операций, десятки гигабайт логов, ну и т.д.  И никакого серьезного положительного эффекта от реляционных возможностей во всех этих случаях не было.</p>
<p>Не знаю может это мне так всегда везло и в других проекта все всегда &laquo;красиво&raquo;, не нарушается ни одной из &laquo;нормальных форм&raquo; и пр, но у меня опыт вот такой.</p>
<p>Под реляционностью в данном случае я подразумеваю не только то что данных хранятся в виде таблице (с заранее четко оговоренным списком атрибутов). Я имею ввиду все что вертится вокруг этого: нормальные формы, внешние ключи, связи и ограничения, acid, собственно реляционная алгебра и все прочее предназначенное для облегчения хранения и соблюдения целостности структурированных данных.</p>
<p>В общем я не сторонник использования реляционной БД всегда и везде, на любой чих. Это хорошая технология, спасающая в огромном множестве случаев, но RDBMS это совсем не серебряная пуля.</p>
<p>Поэтому хотел бы обратить внимание на другой тип баз, на колоночные БД.<br />
<span id="more-185"></span></p>
<h1>Основная идея колоночных БД</h1>
<p>Вообще базовая идея колоночных БД всего лишь в том что физически (на жестком диске) данные хранятся в другом порядке. Т.е. если обычная (рядная) БД будет все хранить построчно, то в данном случае по колонкам, в начале все данные первой колонки, потом второй, потом третьей и т.д. В рядном харнении все ячейки строки хранятся рядом, и обычно могут быть прочитаны с диска за одну операцию чтения. В колоночной наоборот, значения ячеек разнесены на разные блоки, и за одну операцию мы читаем несколько подряд идущих значений идной колонки.</p>
<p>Казалось бы мелочь, но все это не просто так, и действительно подобная организация хранения данных на самом деле не такое уж из ряда вон выходящее дело. И тот же Оракл, да и прочие РСУБД, используют и этот подход, как минимум для хранения блобов. Как правильно указали мне в комментариях на самом деле есть и традиционно реляционные СУБД, хранящие данные в колоночном виде, все таки одно другому не мешает, но это скорее редкость (об исключениях см. в списке примеров и в комментариях к записи) и все равно они обладают почти теми же свойствами (реляционность скорее из маркетинговых побуждений), а разделение на реляционные и неряляционные будет более глобально, поэтому я позволил себе разделить этот мир именно по критерию рядного vs колоночного хранения данных.</p>
<p>Дело в том что тут скорее задается начальный вектор архитектуры БД, а те задачи в которых востребован такой способ хранения также имеют свои специфические потребности, поэтому эта мелочь выливается в довольно интересные системы.</p>
<p>Перечислю что у нас обычно присуще колоночными базами данных (хочу подчеркнуть что обычно, но не все это обязательно каждой конкретно):</p>
<h2>Позднее связывание</h2>
<p>Данные у нас хранятся в виде группы полей (строка в таблице), так вот при обработке этой группы можно всегда использовать всю строку (все ячейки), или лишь ту колонку которая нам нужна в данный момент. В случае традиционной БД она хранит и читает всю строку целиком, они лежат подряд, никуда не денешься, колоночная же читает данные лишь из нужной колонки, и лишь только когда находит подходящую [по критерию] строку дочитывает для этой строки значения из недостающих колонок.</p>
<p>Например для запроса <code>select col_1 from table where col_2 = 10</code> традиционная БД будет читать все строки, проверяя каждую на условие во второй колонке, и для совпавших вернет значение первой ячейки этих строк. При этому если у нас в таблице десяток колонок то будет прочитано куча лишних данных (в данном примере что-то около 80% мусора). Чтобы такого перерасхода вычислительных ресурсов не было нужно добавить индекс, который сразу ограничит набор нужных строк. Этот индекс и есть та самая дополнительная колонка, через которую пройдет позднее связывание в традиционной БД. В случае колоночной БД будет читаться лишь 2я колонка, и при совпадении условия к ней будет привязано значение из первой колонки. Очень похоже на то что у нас вся таблица состоит лишь из индексов по колонкам.</p>
<p>Как результат это то что мы можем иметь огромное количество колонок. Если для реляционной БД больше пары десятков колонок уже начинаются проблемы (неэффективное использование чтения с диска и памяти), то для колоночной таблицы имеющие сотни и тысячи колонок это вполне нормально.</p>
<p>Получается что рядная БД удобна когда нам обычно нужно использовать данные всей строки (в условиях и связях при селекте, апдейте и пр.), а колоночная когда данных много, но обычно используется лишь небольшая их часть.</p>
<h2>Разная структура данных</h2>
<p>Связанные данные хранят в одной таблице (не забываем что при этом можно использовать огромное количество колонок), а связи между таблицами здесь не приживаются, по многим причинам. Но! здесь можно не боятся хранить сложные структуры в ячейках, в том числе вложенные списки, подтаблицы, структуры XML, JSON и пр.</p>
<p>Размер отдельной ячейки часто можно не обращать внимания, пусть даже каждая ячейка столбца имеет свой размер, тут это не особо сильно влияет, в итоге не обязательно изначально жестко типизировать колонки таблицы, пусть в одной строке будет int, в другой string, а в третьей бинарная картинка в несколько мегабайт, и весь этот разброд может быть вдоль одной колонки, если, конечно, такое востребовано. К тому же вполне мы спокойно храним null значения, они просто пропускаются, тогда как рядная БД никуда не денется&nbsp;&mdash; место на диске займет, но оставит его пустым, но при обработке дополнительные затраты.</p>
<p>Одним из применений этого подходя является ответвление БД имеющих всего одну колонку, помимо ключа, в которой и хранится все что нужно. Внешне все это выглядит как огромный HashTable. Такие БД еще называют key-value storage или document oriented database.</p>
<h2>Сжатие данных</h2>
<p>Очень распространенная штука это использование сжатия данных. Тут возможно не заслуга использования колоночности, а больше того как именно такие БД используют, но факт что это популярно и дает вполне неплохой эффект, при этом для того класса приложений где это нужно обычно лишь при незначительной потере в производительности.</p>
<h2>Большие объемы данных</h2>
<p>По вышеуказанным причинам получается что в такой структуре удобно хранить огромные объемы данных, а шардинг и реплиция обычно из коробки, как само собой разумеющееся. Возможно это и не следствие колоночноый архитектуры, а даже наоборот причина, но в общем будем иметь ввиду что &laquo;большие объемы&raquo; и &laquo;колоночное хранение&raquo; идут бок о бок. Конечно же тут сразу появляются различные возможности для параллельной обработки хранимых данных, например используя подход mapreduce и пр.</p>
<h2>Доступ</h2>
<p>Подобная БД обычно востребована при хранении и обработки больших объемов данных, поэтому в данном случае и язык запросов может быть весьма далек от стандартного SQL, и даже вовсе не иметь оного. И конечно никакой тебе реляционности, да и транзакции так себе поддерживаются. Доступ к данным будет через какойто специфичный API, что с другой стороны позволяет более тесную интеграцию приложения и хранимых данных.</p>
<p>Но получается что средства доступа по универсальности и скорости разработки/использования выглядят обычно хуже возможностей предоставляемых Oracle и компании.</p>
<h1>Сравнение с RDBMS</h1>
<h2>RDBMS:</h2>
<ul>
<li>соблюдается целостность данных (foreign keys, транзакционность)</li>
<li>четко структурированные данные</li>
<li>запросы по всей структуре БД, используя стандартизованный язык</li>
<li>результат запроса это небольшой (относительно БД) кусок данных</li>
<li>быстрое извлечение нужной структуры (в том числе быстрая реализация запроса)</li>
</ul>
<h2>Колоночные БД:</h2>
<ul>
<li>хранят большие объемы данных, упрощеный шардинг, репликация и пр.</li>
<li>данные гораздо менее структурированы</li>
<li>данные обрабатываются большим блоком (параллельно, massive parallel processing), или вообще сразу вся база</li>
<li>оптимальным будет индивидуальный подход к обработке, тесная интеграция с данными</li>
<li>худшая (ручная) поддержка целостности данных</li>
</ul>
<h2>Где стоит использовать</h2>
<p>Может хранить огромные объемы слабоструктурированных данных, спокойно смасштабируется на большой кластер и запросы будет обрабатывать параллельно по всему кластеру.</p>
<p>Здесь достаточно просто хранить большие блоки данных, документов (в документ-ориентированных БД) и/или сложных структур. Также довольно распространено хранилище данных вида &laquo;Ключ-Значение&raquo; (aka Properties Pattern, Хэш-таблица) с большими группами которых идет различная работа. Отлично подходит для задач, которые я привел в записи &laquo;<a href="http://artamonov.ru/2009/01/19/storage-for-data-mining/">Хранилище для обработки данных</a>&raquo;. Ну и также это хранилище логов и прочее в этом духе. Особенно хорошо если данные лишь дописываются, а не изменяются существующие.</p>
<p>Больший выигрыш будет если храним много, но в реальных операциях используется лишь часть колонок, или вовсе одна, помимо идентификатора конечно.</p>
<p>При таком хранении гораздо проще бежать вдоль столбца, выполняя нужные операции. Причем операции лучше независимые, или групповые, и когда они затрагивают большой блок хранимых данных. К примеру брать большими кусками и агрегировать результат&nbsp;&mdash; самое оно. Это такие задачи как обработать лог отдельных операций, и просуммировать результаты в течении каждого отдельного периода (что вообще запросто превратить в mapreduce обработку). В случае лога веб-серверов это может быть агрегация посещений по браузерам (т.е. используется отдельная колонка). Или иным образом разбивая данные независимо, и обрабатывая эти сгруппированные данные параллельно, например mapreduce&#39;ом.</p>
<h2>Где не стоит использовать</h2>
<p>Не стоит использовать когда нам нужна именно классическая реляционная структура, и когда у нас данные (и связи) постоянно меняются. Под &laquo;меняются&raquo; я подразумеваю изменение и удаление существующих данных, смену связей между ними. Хотя если данные лишь дополняются, то уже стоит подумать.</p>
<p>Так же не подойдет если у нас много колонок, и мы оперируем в основном всей строкой, нет особого смысла менять тип БД. Хотя в большинстве случаев, как я уже упоминал, значения в нескольких колонкам, которые нам нужно обрабатывать одновременно, даже удобней объединить в общую структуру, к примеру в список имя/значений, или превратив в xml, yaml или json, по вкусу.</p>
<p>Также не пойдет вариант когда операции проводятся лишь небольшом объеме базы, здесь мы просто не получим никакого выигрыша (или точнее наступим на грабли колоночных БД), и больше вероятность что хранение по строкам будет гораздо удобнее.</p>
<p>Ну и конечно не подойдет когда нам нужны классические SQL запросы. Что-то &laquo;в стиле SQL&raquo; они часто имеют, но это уже на самом деле другой подход и по другому выполняется.</p>
<h1>Реализации</h1>
<p><strong><a href="http://hadoop.apache.org/hbase/">HBase</a></strong>&nbsp;&mdash; представляет собой часть Apache Hadoop, можно сказать классическая реализация Гуглового Bigtable, рассчитана в первую очередь на большие объемы данных, и на хранение этих данных в большом кластере. Типы данных ничем не ограниченны. Я именно именно на hbase ориентировался когда приводил приводил основные тонкости/отличия, но не ограничивался им.</p>
<p>Из возможностей: сразу учтено что каждая колонка может иметь несколько ячеек (получается что помимо того что в строке несколько строк, в колонке тоже несколько ячеек, этакое минидерево, для хранения списочных и связанных данных), может хранить любые бинарные данные, может хранить одновременно несколько версии (версионность из коробки), поддерживает фильтры Блума, rest интерфейс доступа (помимо java api) и пр.</p>
<p>Но, как минимум в данный момент, не имеет индексов, кроме как по ключу. Если честно, как и сам Hadoop эта база еще развивается, поэтому БД в данный момент достаточно сырая.</p>
<p>Прочие</p>
<dl>
<dt><a href="http://couchdb.apache.org/">CouchDB</a></dt>
<dd>реализация на Erlang. Не совсем колоночная, это документная БД (document oriented DB), но по сути внутри одна большая колонка, и все приемы соответствующие. БД, конечно, не привязана к определенной платформе (т.е. к Эрлангу). Запросы пишутся на Javascript (!) в виде mapreduce операций, доступ через REST. Благодаря отказоустойчивости самого Erlang&#39;а&nbsp;&mdash; очень интересное решение</dd>
<dt><a href="http://hypertable.org/">Hipertable</a></dt>
<dd>реализация bigtable на С, изначально как основная альтернатива Hadoop HBase, именно так себя позиционировали. Причем хранение так же было организовано поверх Hadoop HDFS. Как там сейчас обстоит дело не знаю.</dd>
<dt><a href="http://code.google.com/p/the-cassandra-project/">The Cassandra Project</a></dt>
<dd>реализация от Facebook, тоже базируется на идеях Google BigTable и поэтому похожа на HBase.</dd>
<dt><a href="http://project-voldemort.com/">Project Voldermort</a></dt>
<dd>распределенный key-value storage, на java.</dd>
<dt><a href="http://www.kx.com/">Kdb+</a></dt>
<dd>коммерческая БД и язык обработки, заточенные под time-series data. Это всевозможные логи, биллинг, биржы и пр. Язык обработки имеет очень сильную базу для обработки массивов (БД в данном случае является отдельным огромным многомерным массивом) и особенно распределенных во времени. В результате многие узкоспециализированные задачи (всяческие кубы, временные данные) выполняются в разы быстрее. Как минус&nbsp;&mdash; БД и все вокруг нее являются излишне закрытыми от людей извне</dd>
<dt><a href="http://www.luciddb.org/">LucidDB</a></dt>
<dd>Open Source реляционная СУБД с основой на колоночной структуре. Расчитывается в первую очеред на аналитику, bi и пр.</dd>
<dt><a href="http://www.sybase.ru/products/sybase_iq">Sybase IQ</a></dt>
<dd>Еще одна реляционная колоночная СУБД, для нужд аналитики. В этот раз коммерческая</dd>
<dt>Amazon SimpleDB, Google BigTable, Yahoo Everest</dt>
<dd>закрытые внутренние реализации от монстров интернета.</dd>
</dl>
<h2>Ссылки</h2>
<ul>
<li><a href="http://cs-www.cs.yale.edu/homes/dna/papers/abadi-sigmod08.pdf">PDF&nbsp;&mdash; &laquo;Column-Stores vs. Row-Stores: How Different Are They Really?&raquo;</a></li>
<li><a href="http://www.databasecolumn.com/2008/12/debunking-yet-another-myth-col.html">Debunking Yet Another Myth: Column-Stores As A Storage-Layer Only Optimization</a> (и предыдущие в цикле статей)</li>
<li><a href="http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php">Is the Relational Database Doomed?</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/02/17/column-oriented-databases/feed/</wfw:commentRss>
		<slash:comments>19</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&#160;&#8212; платформа для реализации cloud вычислений. На мой взгляд очень серьезная платформа, вполне стабильная (если это имеет значение то версия, например, уже 2.1.0) имеет открытый код, на java, интегрируется с огромным количеством внешний систем. В отличие от пока академического Apache Hadoop здесь уже все более практично. А разобраться и запустить можно за пару часов, в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gridgain.com/">GridGain</a>&nbsp;&mdash; платформа для реализации cloud вычислений. На мой взгляд очень серьезная платформа, вполне стабильная (если это имеет значение то версия, например, уже 2.1.0) имеет открытый код, на java, интегрируется с огромным количеством внешний систем. В отличие от пока академического Apache Hadoop здесь уже все более практично. А разобраться и запустить можно за пару часов, в отличии от...</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&#39;е, что, возможно, даже практичней. Я не хочу сказать что для больших объемов эта платформа не подойдет, просто при большом объеме данных (а не вычислений над ними) все упирается уже в хранилище данных, и они этим сознательно не занимались, но в случае когда это нужно&nbsp;&mdash; можно всегда использовать и внешнюю БД и даже Hadoop HDFS/HBase. </p>
<p>Для многих случаев это очень удобный вариант, отличная альтернатива hadoop&#39;у, ну в самом деле не обязательно у нас что-то грандиозное, вполне может быть у нас пара тысяч независимых операций и cloud из нескольких серверов, и этот самый простой способ распараллелить все.  Если основной упор на вычисления, например параллельно обработать несколько тысяч url&#39;ов, на каждый по 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>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, как язык&#160;&#8212; ничего особо выдающегося. Да даже тот же C# внешне выглядит приятней, что уж говорить о многих динамических языках. Хотя, если насчет самого синтаксиса Java, то тут тоже наметилась тенденция, уже есть вполне неплохие JRuby, Groovy, Scala и Clojure, выбирай по вкусу. Так вот, хоть как язык Java и проигрывает, но она имеет [...]]]></description>
			<content:encoded><![CDATA[<p>Java, как язык&nbsp;&mdash; ничего особо выдающегося. Да даже тот же 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>Главное&nbsp;&mdash; это все таки сколько у тебя за спиной готовых, зарекомендовавших себя и переиспользуемых решений. А что до производительности и требования к ресурсам, так с этим уже давно все хорошо, все работает достаточно быстро, если написать конечно как положено, а не как обычно. Да и в последнее время это уже неактуальная проблема, сейчас в цене не производительность, а масштабируемость.</p>
<p>Поэтому нравится java или нет, но... но чаще всего выбирать и не из чего.</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>Я не знаю 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&raquo;, что еще было обязательным года 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/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 [...]]]></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&raquo; в каждой из позиций к вероятности &frac12; тем лучше.<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 &lt;&lt; 6) + (hash &lt;&lt; 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 &lt;&lt; 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&nbsp;&mdash; номер бита, по 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>
	</channel>
</rss>

