<?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; Groovy</title>
	<atom:link href="http://voituk.kiev.ua/category/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://voituk.kiev.ua</link>
	<description>while ( isAlive() ) {doCode(); doFun();}</description>
	<lastBuildDate>Wed, 02 Mar 2011 10:38:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Java + Groovy on Google App Engine</title>
		<link>http://voituk.kiev.ua/2009/04/08/java-groovy-on-google-app-engine/</link>
		<comments>http://voituk.kiev.ua/2009/04/08/java-groovy-on-google-app-engine/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 06:30:10 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=1000</guid>
		<description><![CDATA[Вот и свершилось то, чего так долго ждали и просили большевики прогрессивные ИТ-гики &#8211; Google добавляет поддержку Java (а вместе с ней и Groovy) в Google App Engine. Как сообщает в корпоративном блоге SpringSource Guillaume Laforge (project-manager проекта Groovy), последние несколько недель они работали совместно с командой Google App Engine над &#8220;правильным&#8221; запуском Groovy на [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Google App Engine Groovy" src="http://voituk.kiev.ua/wp-content/uploads/google-app-engine-groovy.png" alt="" width="250" height="202" />Вот и свершилось то, чего так долго <a href="http://voituk.kiev.ua/2008/04/14/java-groovy-on-google-appspot/">ждали и просили</a> <span style="text-decoration: line-through;">большевики</span> прогрессивные ИТ-гики &#8211; Google <a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">добавляет поддержку Java</a> (а вместе с ней и Groovy) в Google App Engine.</p>
<p>Как сообщает в корпоративном блоге SpringSource Guillaume Laforge <em>(project-manager проекта Groovy)</em>, последние несколько недель они работали совместно с командой Google App Engine над &#8220;правильным&#8221; запуском Groovy на GAE.</p>
<p>Совмесная работа вылилась в набор дополнений в реализацию security-модели Groovy.</p>
<p>Небольшая <a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/">заметка о том, как запустить Groovy приложение в среде Google App Engine</a> от того же Guillaume Laforge.</p>
<p>P.S. Что-то мне подсказывает что теперь GAE перестанет быть игрушкой для питонистов, а станет упрощенной версией Amazon AWS, тем самым накорню убив остальные Java in Cloud &#8211; сервисы а-ля <a href="http://voituk.kiev.ua/2008/12/26/running-java-in-a-cloud/">Stax</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2009/04/08/java-groovy-on-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java in a Cloud</title>
		<link>http://voituk.kiev.ua/2008/12/26/running-java-in-a-cloud/</link>
		<comments>http://voituk.kiev.ua/2008/12/26/running-java-in-a-cloud/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 13:49:25 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=891</guid>
		<description><![CDATA[Пока прогрессивное мировое ИТ-сообщество самозабвенно обсуждает особенности трендового термина cloud-computing, массово уговаривает Google сделать поддержку Java&#38;Groovy в Google App Engine, гадает будет или не будет в GAE поддержка Perl-а, небольшая компания из Вашингтона представила миру свое понимание cloud-computing в Java-мире. Речь идет о компании Stax Networks, 16 декабря уходящего года запустившей под лозунгом &#8220;Java applications [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://voituk.kiev.ua/wp-content/uploads/2008/stax.png" alt="" hspace="5" vspace="5" align="left" />Пока прогрессивное мировое ИТ-сообщество <a rel="nofollow" href="http://google.com/trends?q=Cloud+Computing">самозабвенно</a> обсуждает особенности трендового термина cloud-computing, массово <a href="http://voituk.kiev.ua/2008/04/14/java-groovy-on-google-appspot/">уговаривает Google сделать поддержку Java&amp;Groovy в Google App Engine</a>, гадает будет или не <a href="http://voituk.kiev.ua/2008/07/24/google-app-engine-perl-support/">будет в GAE поддержка Perl-а</a>, небольшая компания из Вашингтона представила миру свое понимание cloud-computing в Java-мире.</p>
<p>Речь идет о компании<a href="http://www.stax.net/"> Stax Networks</a>, 16 декабря уходящего года запустившей под лозунгом <em>&#8220;Java applications in the cloud&#8221;</em> свой аналог Google App Engine для Java-разработчиков, который предоставляет завершенную инфраструктуру для разработки, тестирования и развертывания масштабируемых Java WEB-приложений.</p>
<p>Технически решение Stax построено поверх Amazon EC2 и позволяет создавать приложения основанные Servlets/JSP, Struts, GWT, Wicket, JRuby, Jython, Flex, ColdFusion.<br />
В качестве СУБД в данный момент поддерживается только MySQL.</p>
<p>Инфраструктура Stax построена так, чтоб разработчику на этапе написания кода не нужно было думать о том, что находится на уроверь ниже чем Stax.<br />
Управление приложениями и базами данных производится через удобную web-консоль, а локальная разработка и отладка производится привычными методами (я использовал для этого Eclipse и консольную утилиту stax).</p>
<p>Чем ещё интересен данный стартап &#8211; так это то, что в данный момент они не взымают плату за использование, аргументируя это тем, что вырабатываю правильную бизнесс-модель.<br />
В итоге попробовать Stax в действии, в отличии от аналогов, можно абсолютно бесплатно и даже не имея кредитной карты.</p>
<p>Что я собственно уже и сделал: написал небольшое <a href="http://jabber2twitter.vadim.staxapps.net/">приложение, которое выводит список контактов из БД</a> и запустил его в cloud-е на 2х серверах.<br />
Под заголовком &#8220;Running Java in Cloud&#8221; можно увидеть IP и имя сервера в cloud-e, который обслуживает текущий запрос. И если понажимать F5 &#8211; можно заметить, что серверов всего-то 2.</p>
<p>В принципе идея предоставления Platform-as-a-Service (PaaS) далеко не новая, но более или менее популярных решений для Java мне пока не встречалось.</p>
<p>Аналогичные разработки:</p>
<ul>
<li><a rel="nofollow" href="http://code.google.com/appengine/">Google App Engine</a> (GAE) &#8211; самый известный из подобных app-хостингов.<br />
Пока поддерживает только Python и хранение данных в нереляционной БД Google BigTable.</li>
<li><a rel="nofollow" href="http://www.microsoft.com/azure/">Microsoft Azure</a> &#8211; аналогичный GAE сервис от Microsoft. Поддерживает .NET языки.</li>
<li><a rel="nofollow" href="http://www.salesforce.com/platform/">Salesforce.com</a> &#8211; CRM-хостинг для приложений написанных на проприетарном языке Apex</li>
<li><a rel="nofollow" href="http://heroku.com/">Heroku</a> &#8211; аналог Stax, построенный на Amazon EC2, но для RubyOnRails приложений</li>
<li><a rel="nofollow" href="http://www.10gen.com/">10Gen</a> &#8211; ещё одна платформа, поддерживающая Python, Ruby и ServerSide JavaScript, а также обьекную СУБД Mongo.</li>
</ul>
<p>P.S. В комплекте со Stax SDK идет Groovy древней версии 1.5.6</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/12/26/running-java-in-a-cloud/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>SpringSource покупает G2One</title>
		<link>http://voituk.kiev.ua/2008/11/11/springsource-acquires-g2one/</link>
		<comments>http://voituk.kiev.ua/2008/11/11/springsource-acquires-g2one/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 10:46:07 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=814</guid>
		<description><![CDATA[Всего пол-часа назад прочел в твиттере Guillaume Laforge (project-manager проекта Groovy), что компания SpringSource, разработчик популярнейших Java-фреймворков, купила компанию G2One, которая занимается разработкой, поддержкой и консалтингом в области Groovy/Grails. Сумма сделки не расглашается. Что же касается пользы от сделки для обеих сторон, то тут, думаю сомнений не возникает: G2One под крылом у &#8220;старшего брата&#8221; получает [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.springsource.com/files/u5/SpringSource-Acquires.png" alt="" align="left" />Всего пол-часа назад прочел в твиттере Guillaume Laforge (project-manager проекта Groovy), что компания SpringSource, разработчик популярнейших Java-фреймворков, купила компанию G2One, которая занимается разработкой, поддержкой и консалтингом в области Groovy/Grails.</p>
<p>Сумма сделки не расглашается.</p>
<p>Что же касается пользы от сделки для обеих сторон, то тут, думаю сомнений не возникает:<br />
G2One под крылом у &#8220;старшего брата&#8221; получает серьезную поддержку и немалое внимание на рынке JEE.<br />
SpringSource же при этом получает отличную разработку для небольших приложений, тем самым покрывая своими продуктами весь JEE-рынок, а также достаточно внушительное комьюнити.</p>
<p>На мой взгляд весьма интересно то, что компания <a href="http://voituk.kiev.ua/2007/10/11/g2one-first-groovy-grails-company/">G2One была создана</a> всего-то год назад (почти день-в-день).  А сам факт осуществления подобного приобритения &#8211; очереденой неслабый толчек для Groovy/Grails на пути к Java Enterprise среде.</p>
<p><noindex><a href="http://www.springsource.com/g2one" rel="nofollow">Текст анонса</a>,</noindex> там же ссылки на пресс-релиз, краткое FAQ, и анонсы в блогах CTO G2One и CTO Spring Source</p>
<p>P.S. Кстати в Spring Framework Groovy поддерживался ещё с незапамятных времен :)</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/11/11/springsource-acquires-g2one/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Groovy cheatsheet</title>
		<link>http://voituk.kiev.ua/2008/10/09/groovy-cheatsheet/</link>
		<comments>http://voituk.kiev.ua/2008/10/09/groovy-cheatsheet/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 12:13:43 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=696</guid>
		<description><![CDATA[DZone в своем refcards-разделе опубликовал небольшой (всего 7 страниц) CheatSheet по Groovy. Составителем шпаргалки выступил автор &#8220;Groovy in Action&#8221; Dierk König. Внутри краткая напоминалка по таким темам: Groovy / Java &#8211; интеграция Языковые конструкции Операторы Простые и комплексные типы данных Замыкания GDK Мета-программирование Hot tips Скачать можно здесь, или же по подписке на Refcardz.DZone.com]]></description>
			<content:encoded><![CDATA[<p>DZone в своем refcards-разделе опубликовал небольшой (всего 7 страниц) CheatSheet по Groovy.</p>
<p>Составителем шпаргалки выступил автор &#8220;Groovy in Action&#8221; Dierk König.</p>
<p>Внутри краткая напоминалка по таким темам:</p>
<ul>
<li>Groovy / Java &#8211; интеграция</li>
<li>Языковые конструкции</li>
<li>Операторы</li>
<li>Простые и комплексные типы данных</li>
<li>Замыкания</li>
<li>GDK</li>
<li>Мета-программирование</li>
<li>Hot tips</li>
</ul>
<p>Скачать можно <a href="http://voituk.kiev.ua/wp-content/uploads/2008/10/groovy_online_100.pdf ">здесь</a>, или же по подписке на Refcardz.DZone.com</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/10/09/groovy-cheatsheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails: Первая русская ласточка</title>
		<link>http://voituk.kiev.ua/2008/10/06/grails-pervaya-russkaya-lastochka/</link>
		<comments>http://voituk.kiev.ua/2008/10/06/grails-pervaya-russkaya-lastochka/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 13:27:02 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=690</guid>
		<description><![CDATA[Вот и дождались &#8211; первый публичный проект в Рунете написанный на Grails. Встречайте http://g2b.perm.ru/ &#8211; выглядит довольно таки современно и красиво, работает достаточно быстро. Конечно хотелось-бы в админку заглянуть, но видно не судьба. Подробнее тут http://community.livejournal.com/ru_grails/5391.html]]></description>
			<content:encoded><![CDATA[<p>Вот и дождались &#8211; первый публичный проект в Рунете написанный на Grails.</p>
<p>Встречайте <noindex><a rel="nofollow" href="http://g2b.perm.ru/">http://g2b.perm.ru/</a></noindex> &#8211; выглядит довольно таки современно и красиво, работает достаточно быстро.<br />
Конечно хотелось-бы в админку заглянуть, но видно не судьба.</p>
<p><noindex>Подробнее тут <a href="http://community.livejournal.com/ru_grails/5391.html">http://community.livejournal.com/ru_grails/5391.html</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/10/06/grails-pervaya-russkaya-lastochka/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Groovy @Bindable and @Vetoable annotations</title>
		<link>http://voituk.kiev.ua/2008/07/02/groovy-bindable-vetoable-annotations/</link>
		<comments>http://voituk.kiev.ua/2008/07/02/groovy-bindable-vetoable-annotations/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 20:48:12 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=499</guid>
		<description><![CDATA[Начиная с первых &#8220;бэт&#8221; версии 1.6 в Groovy были добавлены 2 встроенные аннотации (да-да! Groovy наконец-то полностью поддержирживает все возможности Java5!) : groovy.beans.Bindable и groovy.beans.Vetoable Обе аннотации содержат в себе функионал который призван заменить стандартные Java-интерфейсы java.beans.PropertyChangeListener и java.beans.VetoableChangeListener и избавить разработчика от обилия классов-слушателей (listeners) и декларации дополнительных интерфейсов для бина. Об этих нововведениях [...]]]></description>
			<content:encoded><![CDATA[<p>Начиная с первых &#8220;бэт&#8221; версии 1.6 в Groovy были добавлены 2 встроенные аннотации (да-да! Groovy наконец-то полностью поддержирживает все возможности Java5!) : groovy.beans.Bindable и groovy.beans.Vetoable</p>
<p>Обе аннотации содержат в себе функионал который призван заменить стандартные Java-интерфейсы java.beans.PropertyChangeListener и java.beans.VetoableChangeListener и избавить разработчика от обилия классов-слушателей (listeners) и декларации дополнительных интерфейсов для бина.</p>
<p>Об этих нововведениях и их назначении было напечатано/перепечатано в каждом обзоре новых &#8220;фич&#8221; версии 1.6, но при этом нигде не встречалось описания как же все-таки &#8220;повесить&#8221; свой обработчик событий (listener).</p>
<p>Немного поковырявшись в исходниках Groovy удалось узнать такое:<span id="more-499"></span></p>
<p>1. При использовании аннотации @Bindable, сообщение об изменении значния свойства обьекта передается в замыкание, указанное в специальном свойстве <strong>propertyChange</strong> (имя совпадает с именем метода в PropertyChangeListener), в пределах того же бина, в котором произошло изменение.<br />
При этом аргументом замыкания является экземпляр класса java.beans.PropertyChangeEvent.</p>
<p>2. Аналогично при использовании аннотации Vetoable используется замыкание, определенное в свойстве <strong>vetoableChange</strong> с тем же типом параметра замыкания (PropertyChangeEvent).</p>
<p>Пример использования аннотация @Bindable</p>
<pre><code class="java">import groovy.beans.Bindable

class MyClass {
  @Bindable int id
  @Bindable String name
  def MyClass() {
    //this.propertyChange = {
    //   println it.propertyName + " changed from " + it.oldValue + " to " + it.newValue
    //}
  }
}

def x = new MyClass()
x.propertyChange = {
    println it.propertyName + " changed from " + it.oldValue + " to " + it.newValue
}
x.id = 10
x.name = "Hello"</code></pre>
<p>Результат будет выглядеть так:<br />
<code>groovy Test.groovy<br />
id changed from 0 to 10<br />
name changed from null to Hello</code></p>
<p>Причем инициализацию свойства propertyChange можно проводить и в конструкторе (см. закомментированный код), но при этом нельзя восплользоваться статической инициализацией (почему? Не знаю).</p>
<p>Тоесть такой пример работать не будет:</p>
<pre><code class="java">class MyClass {
  def propertyChange = {println it}
  @Bindable int id
}
def x = new MyClass()
x.id = 10</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/07/02/groovy-bindable-vetoable-annotations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails at LinkedIn</title>
		<link>http://voituk.kiev.ua/2008/06/12/grails-a-linkedin/</link>
		<comments>http://voituk.kiev.ua/2008/06/12/grails-a-linkedin/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 16:03:05 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[LinkedIn]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=500</guid>
		<description><![CDATA[Когда-то, во время моего доклада на киевской встрече developers.org.ua, кто-то (кажется Алексей Колупаев) спросил где на реальных действующих проектах используется Groovy и Grails. Первое, что я ответил &#8211; это LinkedIn. Но вот конкретнее рассказать, где там Grails а где Java, в силу непричастности к разработке этой соц-сети &#8211; не смог. Теперь же инженеры LinkedIn сами [...]]]></description>
			<content:encoded><![CDATA[<p>Когда-то, во время моего доклада на <a href="http://voituk.kiev.ua/2008/02/02/developers-org-ua-meeting-video/">киевской встрече developers.org.ua</a>, кто-то (кажется Алексей Колупаев) спросил где на реальных действующих проектах используется Groovy и Grails.<br />
Первое, что я ответил &#8211; это LinkedIn. Но вот конкретнее рассказать, где там Grails а где Java, в силу непричастности к разработке этой соц-сети &#8211; не смог.</p>
<p>Теперь же инженеры LinkedIn сами поведали нам &#8220;где&#8221;, &#8220;как&#8221; и главное &#8220;зачем&#8221; у них используется Grails. Смотрим презентацию:<span id="more-500"></span><br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=grails-at-linkedinmay-5th-whotel2-1213010509637351-8" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=grails-at-linkedinmay-5th-whotel2-1213010509637351-8" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Некоторые keynotes, на которые сразу хочется обратить внимание:</p>
<ul>
<li>Grails используется в так называемых Corporate Solutions (партнерские сервисы компании) а также в построении инженерной инфраструктуры (continuous integration, automatic build, testing )</li>
<li>Высокая эфективность для новых разработок</li>
<li>При работе  с сущетствующей эко-системой высокие трудозатраты на интеграцию на первом проекте, что в дальнейшем окупается повышением продуктивности на последующих</li>
<li>Легко создавать и поддерживать бизнес-логику, но почти невозможен её reuse вне Grails</li>
<li>На начальных стадиях помогал внедрять Grails основатель проекта Грем Рошер</li>
<li>Динамический Groovy вынуждает повышать покрытие проектов тестами</li>
<li>Мобильная версия <span style="text-decoration: underline;">mobile.linkedin.com</span> и приложение Facebook работают на Ruby On Rails</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/06/12/grails-a-linkedin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Groovy Classpath &amp; Dynamic class loading</title>
		<link>http://voituk.kiev.ua/2008/06/04/groovy-classpath-dynamic-loading/</link>
		<comments>http://voituk.kiev.ua/2008/06/04/groovy-classpath-dynamic-loading/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 09:55:10 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=489</guid>
		<description><![CDATA[В Groovy подключить дополнительные Java-библиотеки и классы можно 3-мя способами: Дописыванием пути к jar-у или директории с классами в глобальную переменную CLASSPATH Указанием значение параметра -classpath (он же -cp) при запуске groovy, groovysh, и тд. Размещением необходимых jar-ов в директории ~/.groovy/lib При разработке небольшой утилиты парсинга и анализа лог-файлов мне необходимо было выбирать нужный jar-файл [...]]]></description>
			<content:encoded><![CDATA[<p>В Groovy подключить дополнительные Java-библиотеки и классы можно 3-мя способами:</p>
<ol>
<li>Дописыванием пути к jar-у или директории с классами в глобальную переменную CLASSPATH</li>
<li>Указанием значение параметра -classpath (он же -cp) при запуске groovy, groovysh, и тд.</li>
<li>Размещением необходимых jar-ов в директории <em>~/.groovy/lib</em></li>
</ol>
<p>При разработке небольшой утилиты парсинга и анализа лог-файлов мне необходимо было выбирать нужный jar-файл в зависимости от некоторых условий.<br />
Потому ни один из приведенных способов мне не подошел.<br />
К тому же мне необходимо было искать jar-файлы в директории, в которой находился сам скрипт, в то время как запускаться он мог из любой директории.</p>
<p>Вспомнив про черновик заметки о ClassLoader-ах, которую Юра все никак не соберется дописать и опубликовать,  получилось что-то вроде:</p>
<p>Простой прием, демонстрирующий определение местополжения класса и загрузку дополнительных JAR-ов</p>
<p>[java]</p>
<pre>def codebase = this.getClass().getProtectionDomain().getCodeSource().getLocation()
def f = new File(codebase as String)

def url = new URL(f.getParent()+"/commons-lang-2.3.jar")

this.getClass().getClassLoader().getRootLoader().addURL(url)

Class au = Class.forName("org.apache.commons.lang.StringUtils")

assert au.isEmpty(null) &#038;&#038; au.isEmpty("")</pre>
<p>[/java]</p>
<p>P.S. Кстати запускать groovy-скрипт в UNIX-среде можно точно так же, как и sh, perl, php, python скрипты &#8211; указанием в первой строке:<br />
<code>#!/usr/bin/env groovy</code></p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/06/04/groovy-classpath-dynamic-loading/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Заметил за собой&#8230;</title>
		<link>http://voituk.kiev.ua/2008/05/29/groovy-instead-php-cli/</link>
		<comments>http://voituk.kiev.ua/2008/05/29/groovy-instead-php-cli/#comments</comments>
		<pubDate>Thu, 29 May 2008 09:40:08 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=495</guid>
		<description><![CDATA[Только что заметил за собой что в случае, когда нужно быстро выполнить какой-либо код, перестал писать его на PHP, отдавая предпочтение Groovy. Т.е. если раньше писал что-то вроде: $ php -r 'echo strlen("0bed4ce7b082e0f1ca05")."\n";' или echo "0bed4ce7b082e0f1ca05" &#124; wc -c то теперь первое, что приходит в голову, это: groovy -e 'println "0bed4ce7b082e0f1ca05".size()' P.S. Пример, конечно же, [...]]]></description>
			<content:encoded><![CDATA[<p>Только что заметил за собой что в случае, когда нужно быстро выполнить какой-либо код, перестал писать его на PHP, отдавая предпочтение Groovy.</p>
<p>Т.е. если раньше писал что-то вроде:<br />
<code>$ php -r 'echo strlen("0bed4ce7b082e0f1ca05")."\n";'</code></p>
<p>или</p>
<p><code>echo "0bed4ce7b082e0f1ca05" | wc -c</code></p>
<p>то теперь первое, что приходит в голову, это:</p>
<p><code>groovy -e 'println "0bed4ce7b082e0f1ca05".size()'</code></p>
<p>P.S. Пример, конечно же, получился не очень показательный, но жизненный &#8211; проверял длину идентификатора для выделения для него поля в БД.</p>
<p>P.S.S. Это только у меня <code>echo "0bed4ce7b082e0f1ca05" | wc -c</code> выдает 21, в то время как PHP и Groovy &#8211; 20?</p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/05/29/groovy-instead-php-cli/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Groovy: Comparator closure &amp; currying</title>
		<link>http://voituk.kiev.ua/2008/05/12/comparator-closure-currying/</link>
		<comments>http://voituk.kiev.ua/2008/05/12/comparator-closure-currying/#comments</comments>
		<pubDate>Mon, 12 May 2008 20:41:39 +0000</pubDate>
		<dc:creator>Vadim Voituk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://voituk.kiev.ua/?p=484</guid>
		<description><![CDATA[Есть в Groovy такая возможность, как currying (каррирование что-ли?) замыканий. Само понятие прийшло из функционального программирования и означает преобразование функции с один количеством агрументов, в функцию меньшего количества путем &#8220;фиксации&#8221; значений некоторых аргументов. Например есть функция f(x,y,z), тогда её каррированием по фиксированному значению арргумента x=10 будет функция Λ(f)=f(10, y, z). Термин currying прозшел от имени [...]]]></description>
			<content:encoded><![CDATA[<p>Есть в Groovy такая возможность, как currying <em>(каррирование что-ли?)</em> замыканий.<br />
Само понятие прийшло из функционального программирования и означает преобразование функции с один количеством агрументов, в функцию меньшего количества путем &#8220;фиксации&#8221; значений некоторых аргументов.<br />
Например есть функция <em>f(x,y,z)</em>, тогда её каррированием по фиксированному значению арргумента <em>x=10 </em>будет функция Λ<em>(f)=f(10, y, z)</em>.<br />
Термин <em>currying</em> прозшел от имени известного математика Хаскеля Карри, и ещё иногда называется  <em>Шейнфинкелизацией</em> (от имени Украинского математика Моисея Шейфинкля, который изобрел это понятие)</p>
<p>Покажу небольшой пример того, как можно использовать каррирование замыканий в Groovy.<span id="more-484"></span></p>
<p>Предположим есть обычные POGO класс:</p>
<p>[java]</p>
<pre>class User {
    String name
    String emailAddress
    Date dateOfBirth
    int weight

    String toString() {
        name
    }
}
</pre>
<p>[/java]</p>
<p>И стоит задача реализовать сортировку списка обьектов этого класса по каждому из свойств (name, emailAddress, dateOfBirth, weight).<br />
Для выполнения сортировки списка можно использовать метод sort(), в какой необходимо передать свой экземпляр Comparator-а.<br />
Решением задачи &#8220;в лоб&#8221; будет реализация для каждого из сортируемых свойств отдельного Comparator-а.</p>
<p>Например для свойства <em>name</em> он будет выглядеть приблизительно так:<br />
[java]</p>
<pre>public class UserNameComparator implements Comparator&lt;User&gt; {

    public int compare(User a, User b) {
        def aValue = a.getName();
        def bValue = b.getName();

        if (!aValue &#038;&#038; !bValue)
            return 0;
        else if (!aValue)
            return -1;
        else if (!bValue)
            return 1;
        else
            return aValue.compareTo(bValue);
    }

}
</pre>
<p>[/java]</p>
<p>И так 4 раза (с)&#8230; Не много ли кода для такой мелочи как сортировка?</p>
<p>Теперь же попробуем реализовать подобный функционал с помощью замыканий Groovy.<br />
Создаем такое вот универсальное замыкание-компаратор <em>(а может функцию 3х аргументов?)</em>:</p>
<p>[java]</p>
<pre>def comparator = { attribute, a, b -&gt;
    def aValue = a.getProperty(attribute)
    def bValue = b.getProperty(attribute)

    if (!aValue &#038;&#038; !bValue)
        return 0
    else if (!aValue)
        return -1
    else if (!bValue)
        return 1
    else
        return aValue.compareTo(bValue)
}
</pre>
<p>[/java]</p>
<p>Теперь для сортировки по каждому свойствую обьекта User используем каррирование замыкания с фиксированием имени свойства:</p>
<p>[java]<br />
usersList.sort( comparator.curry(&#8220;name&#8221;)  )<br />
usersList.sort( comparator.curry(&#8220;emailAddress&#8221;)  )<br />
usersList.sort( comparator.curry(&#8220;dateOfBirth&#8221;)  )<br />
usersList.sort( comparator.curry(&#8220;weight&#8221;)  )<br />
[/java]</p>
<p>Вот так все просто и элегантно &#8211; немного функционального программирования, немного meta-программирования, немного duck typing-а.</p>
<p><noindex><strong>Ссылки</strong>:<br />
О понятии <a rel="nofollow" href="http://en.wikipedia.org/wiki/Currying">Currying в Wikipedia</a>.<br />
Англоязычная версия этой заметки в блоге <a rel="nofollow" href="http://blog.mustardgrain.com/2008/01/11/a-quick-catch-all-comparator-closure-for-groovy/">MustardGrain</a><br />
<em>Большинство языков программирования которые поддерживают замыкания поддерживают и каррирование:<br />
</em><a rel="nofollow" href="http://www.scala-lang.org/intro/currying.html">Currying в Scala</a> (функциональном языке для JVM), <a rel="nofollow" href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549">Currying в Python</a>, <a rel="nofollow" href="http://moonbase.rydia.net/mental/blog/programming/currying-in-ruby.html">Currying в Ruby</a>.</noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://voituk.kiev.ua/2008/05/12/comparator-closure-currying/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

