<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Garbage Collector</title>
	
	<link>http://garbage-collector.ru</link>
	<description>Журнал о Flash, Flex, AIR, Grails и разработке Rich Internet Applications в условиях, приближенных к реальным</description>
	<lastBuildDate>Sat, 06 Mar 2010 16:30:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/garbage_collector" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="garbage_collector" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Проголосуйте за баг в Adobe Jira</title>
		<link>http://garbage-collector.ru/2010/03/bug-request-needed.html</link>
		<comments>http://garbage-collector.ru/2010/03/bug-request-needed.html#comments</comments>
		<pubDate>Sat, 06 Mar 2010 10:54:14 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Adobe is one big bag]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Лучи ненависти]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=703</guid>
		<description><![CDATA[Linux &#8212; хорошая система для разработчика. В ней есть много &#171;полезностей&#187;, которых нет под другими платформами. Но вот с разработкой Flash/Flex-приложений в ней есть определенные трудности. Это связанно с тем, что Debug Flash Player под Linux-ом завершает дебаг-сессию через 2-60 секунд после ее запуска. Согласитесь, что не очень удобно разрабатывать приложения, не имея возможности толком [...]]]></description>
			<content:encoded><![CDATA[<p>Linux &mdash; хорошая система для разработчика. В ней есть много &laquo;полезностей&raquo;, которых нет под другими платформами. Но вот с разработкой Flash/Flex-приложений в ней есть определенные трудности. Это связанно с тем, что Debug Flash Player под Linux-ом завершает дебаг-сессию через 2-60 секунд после ее запуска. Согласитесь, что не очень удобно разрабатывать приложения, не имея возможности толком их продебажить.</p>
<p>Больше года назад (а конкретнее 2 февраля 2009 года) в <a href="http://bugs.adobe.com/jira/">Adobe Jira</a> был создан <a href="http://bugs.adobe.com/jira/browse/FP-1421">таск с описанием этого бага</a>. С тех пор разработчики Flash Player не сделали в этом направлении <em>ни-че-го</em>. Поэтому я обращаюсь ко всем, кого заботит этот вопрос. Давайте дружно проголосуем за <a href="http://bugs.adobe.com/jira/browse/FP-1421">этот баг</a> и попытаемся таким образом общими усилиями собрать <del datetime="2010-03-06T10:42:36+00:00">сто тыщ мильонов</del> хотя бы сотню голосов, чтобы разработчики наконец-то обратили свое внимание на него, изменили его приоритет с &laquo;None&raquo; на &laquo;Normal&raquo; и взялись за его исправление.</p>
<p>Заранее спасибо всем поддержавшим.</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=703&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/7Bnxt6Tu4NQFXvCshEKra7HvaY0/0/da"><img src="http://feedads.g.doubleclick.net/~a/7Bnxt6Tu4NQFXvCshEKra7HvaY0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7Bnxt6Tu4NQFXvCshEKra7HvaY0/1/da"><img src="http://feedads.g.doubleclick.net/~a/7Bnxt6Tu4NQFXvCshEKra7HvaY0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/03/bug-request-needed.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Установка нескольких экземпляров Apache Tomcat 6 в виде сервисов под Windows Server 2003</title>
		<link>http://garbage-collector.ru/2010/02/install-several-instances-of-apache-tomcat-on-windows-server.html</link>
		<comments>http://garbage-collector.ru/2010/02/install-several-instances-of-apache-tomcat-on-windows-server.html#comments</comments>
		<pubDate>Thu, 18 Feb 2010 07:56:00 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Материалы]]></category>
		<category><![CDATA[Apache Tomcat]]></category>
		<category><![CDATA[regedit]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Server 2003]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=687</guid>
		<description><![CDATA[Недавно столкнулся со следующей задачей: на одном веб-сервере под управлением Windows Server 2003 необходимо было установить несколько экземпляров Apache Tomcat 6 для того, чтобы в каждом из них «крутилось» свое собственное приложение. Установить нужно было таким образом, чтобы каждый из этих сервлет-контейнеров являлся в системе обособленным сервисом со своей конфигурацией, параметрами автозапуска, отдельным пунктом в [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно столкнулся со следующей задачей: на одном веб-сервере под управлением Windows Server 2003 необходимо было установить несколько экземпляров Apache Tomcat 6 для того, чтобы в каждом из них «крутилось» свое собственное приложение. Установить нужно было таким образом, чтобы каждый из этих сервлет-контейнеров являлся в системе обособленным сервисом со своей конфигурацией, параметрами автозапуска, отдельным пунктом в списке установленных программ системы, ну и, в качестве бонуса, собственной иконкой в трее. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://garbage-collector.ru/wp-content/uploads/2010/02/tray.png"><img src="http://garbage-collector.ru/wp-content/uploads/2010/02/tray.png" alt="Windows Server 2003 tray" title="Tray" width="155" height="121" class="alignleft size-full wp-image-697" /></a></p>
<p>Посмотрев решения подобной задачи в интернете, обнаружил, что, пожалуй, единственным способом ее решения будет самостоятельная правка реестра системы. Это связано с тем, что стандартный инсталлятор Apache Tomcat 6 не поддерживает возможности его установки в виде нескольких сервисов и не позволяет разнести настройки каждого из экземпляров по отдельным веткам реестра.</p>
<p>Здесь я хочу сделать важное предупреждение. Описываемая в статье техника является работоспособной и проверенной мной на собственном опыте и на реальном рабочем сервере. Она даже не является хаком, поскольку, будь инсталлятор немного более грамотным, он бы выполнял ее автоматически. Я не проверял, но скорее всего эта техника будет работать и на Windows Server 2008. Выполняемые процедуры не затрагивают никаких других настроек и веток реестра, кроме тех, которые непосредственно относятся к каждому отдельному сервису Apache Tomcat. Однако я не несу никакой ответственности за возможный ущерб, связанный с непосредственным, а так же с неосторожным или неправильным применением этой техники. Используйте ее на свой страх и риск. И не забудьте сделать резервную копию важных данных перед началом процедуры. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Итак, поехали.</p>
<ol>
<li>Установите первый экземпляр Apache Tomcat в отдельную директорию, например, в <code>C:\Tomcat6_1</code>. На последнем шаге мастера установки нужно убрать галочку <strong>Run Tomcat</strong>.</li>
<li>Откройте редактор реестра regedit: <strong>Start</strong> &rarr; <strong>Run…</strong> &rarr; <code>regedit</code> &rarr; нажмите <strong>Enter</strong>.</li>
<li>Переместитесь к ветке реестра <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tomcat6</code> и переименуйте ее из <code>Tomcat6</code> в <code>Tomcat6_1</code>.</li>
<li>Здесь же измените значение свойства <code>DisplayName</code> с <code>Apache Tomcat</code> на <code>Apache Tomcat 6 (1)</code>.  Именно под этим именем теперь будет отображаться сервис в списке локальных служб системы. Чтобы посмотреть список служб вашей системы выполните следующую последовательность действий: кнопка <strong>Start</strong> &rarr; <strong>Run…</strong> &rarr; <code>services.msc</code> &rarr; клавиша <strong>Enter</strong>.</li>
<p><a href="http://garbage-collector.ru/wp-content/uploads/2010/02/services.png"><img src="http://garbage-collector.ru/wp-content/uploads/2010/02/services-150x150.png" alt="System services" title="Services" width="150" height="150" class="alignleft size-thumbnail wp-image-696" /></a></p>
<li>Теперь измените часть значения свойства <code>ImagePath</code> с <code>…//RS//Tomcat6</code> на <code>…//RS//Tomcat6_1</code>. Именно с этим именем будет запускаться экземпляр службы. Это значение понадобится нам в шаге 9.</li>
<li>Далее переходим к ветке <code>HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6</code> и переименовываем ее в <code>Tomcat6_1</code>. В дальнейшем это позволит нам установить новый экземпляр Apache Tomcat без перезаписи настроек устанавливаемого в настоящий момент экземпляра.</li>
<li>По тем же самым причинам меняем название ветки <code>HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat\6.0</code> на <code>6.0_1</code>.</li>
<li>Теперь переходим к ветке <code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run</code> и меняем <strong>имя</strong> ключа с <code>ApacheTomcatMonitor</code> на  <code>ApacheTomcatMonitor_1</code>. Это имя приложения по управлению службой. Его изменение позволяет нам избежать перезаписи этого ключа при установке следующих экземпляров Tomcat и управлять каждым из сервисов при помощи отдельного окна приложения.</li>
<p><a href="http://garbage-collector.ru/wp-content/uploads/2010/02/service_monitor.png"><img src="http://garbage-collector.ru/wp-content/uploads/2010/02/service_monitor-150x150.png" alt="Service monitor" title="Service monitor" width="150" height="150" class="alignleft size-thumbnail wp-image-695" /></a></p>
<li>Теперь изменим завершающую часть <strong>значения</strong> этого ключа с <code>…Tomcat6</code> на <code>…Tomcat6_1</code>. Внимание: это значение должно совпадать с тем, которое мы присвоили ключу <code>ImagePath</code> в шаге 5.</li>
<li>Для того, чтобы иметь возможность потом деинсталлировать по отдельности каждый из установленных экземпляров Tomcat, мы должны перейти в ветку реестра <code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Apache Tomcat 6.0</code> и изменить ее название на <code>Apache Tomcat 6.0_1</code>. Это позволит нам избежать перезаписи данных, необходимых для деинсталляции приложения, во время установки последующих экземпляров Apache Tomcat. Здесь же можно изменить значение ключа <code>DisplayName</code> на <code>Apache Tomcat 6.0 (1)</code>.</li>
<p><a href="http://garbage-collector.ru/wp-content/uploads/2010/02/uninstall.png"><img src="http://garbage-collector.ru/wp-content/uploads/2010/02/uninstall-150x150.png" alt="Installed applications" title="Installed applications" width="150" height="150" class="alignleft size-thumbnail wp-image-698" /></a></p>
<li>Перезагрузите систему, чтобы изменения вступили в силу.</li>
<li>Для того чтобы распределить установленные экземпляры Tomcat по разным локальным портам, мы должны правильно сконфигурировать каждый из них. Открываем файл C:\Tomcat6_1\conf\server.xml и меняем значения следующих узлов:
<ol>
<li><code>&lt;Server port="8005" shutdown="SHUTDOWN"&gt;</code> на <code>8001</code> (для каждого из последующих сервлет-контейнеров мы будем использовать порты <code>8002</code>, <code>8003</code> и т.д.).</li>
<li><code>&lt;Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" /&gt;</code> на <code>8081</code> (далее будем использовать <code>8082</code>, <code>8083</code> и т.д.).</li>
</ol>
</li>
<li>Выполните инструкции с 1 по 12 для каждого из последующих экземпляров Apache Tomcat, используя для разделения каждого из них увеличенное значение индекса. Допустим, второй экземпляр должен быть установлен в папку <code>C:\Tomcat6_<strong>2</strong></code>, ветка реестра из шага 3 должна быть переименована в <code>Tomcat_<strong>2</strong></code>, а ключ <code>DisplayName</code> в шаге 4 изменен на <code>Apache Tomcat (<strong>2</strong>)</code> и т.п.</li>
<li>Перезагрузите систему, чтобы удостовериться в том, что разные экземпляры Tomcat нормально запускаются во время старта Windows.</li>
</ol>
<p>На этом все на сегодня. Буду надеяться, что заметка окажется вам полезной. Удачного вам дня! <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=687&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/m58FS2yPtCA6XNwUUDnLCrdBa3k/0/da"><img src="http://feedads.g.doubleclick.net/~a/m58FS2yPtCA6XNwUUDnLCrdBa3k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/m58FS2yPtCA6XNwUUDnLCrdBa3k/1/da"><img src="http://feedads.g.doubleclick.net/~a/m58FS2yPtCA6XNwUUDnLCrdBa3k/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/02/install-several-instances-of-apache-tomcat-on-windows-server.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пост вопросов и ответов об Intellij IDEA</title>
		<link>http://garbage-collector.ru/2010/01/intellij-idea-questions-and-answers.html</link>
		<comments>http://garbage-collector.ru/2010/01/intellij-idea-questions-and-answers.html#comments</comments>
		<pubDate>Sat, 23 Jan 2010 22:04:41 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Материалы]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[IntelliJ IDEA]]></category>
		<category><![CDATA[Аукцион невиданной щедрости]]></category>
		<category><![CDATA[Вопрос-ответ]]></category>
		<category><![CDATA[Помощь]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=676</guid>
		<description><![CDATA[В этом посте каждый может задать вопрос, каким-либо образом относящийся к среде разработки Intellij IDEA, и получить на него вразумительный ответ. На русском. Развернуто и актуально.  
Если вы уже давно присматриваетесь к этой среде разработки, либо даже пробовали перевести свой рабочий процесс на разработку в ней, но что-то у вас не получалось, не выходило, [...]]]></description>
			<content:encoded><![CDATA[<p>В этом посте каждый может задать вопрос, каким-либо образом относящийся к среде разработки <a href="http://www.jetbrains.com/idea/">Intellij IDEA</a>, и получить на него вразумительный ответ. На русском. Развернуто и актуально. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Если вы уже давно присматриваетесь к этой среде разработки, либо даже пробовали перевести свой рабочий процесс на разработку в ней, но что-то у вас не получалось, не выходило, не настраивалось, вызывало недоумение, приводило в шок; и в результате чего вы так и не смогли взять этот неприступный бастион, этот редут интеллекта, этот ларец, доверху наполненный изумрудами программерской мудрости, и вынуждены были отказаться от использования среды на долгие месяцы и годы, то &laquo;вэлкам&raquo; внутрь поста. Попробуем вместе решить вашу проблему.</p>
<p>Со временем, если накопится достаточное количество вопросов, то на их основе будет создан Intellij IDEA FAQ, который, я думаю, окажется небесполезным многим разработчикам.</p>
<p>Ну а для начала, всем интересующимся этой темой я рекомендую ознакомиться вот с <a href="http://refcardz.dzone.com/refcardz/intellij-idea">этим PDF-документом</a>, полным цветных картинок и изумительных комментариев к ним (правда на английском). Ну и не забывайте задавать свои вопросы. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=676&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/rlB-KMdnADI5U2LDcH9jt25DUP0/0/da"><img src="http://feedads.g.doubleclick.net/~a/rlB-KMdnADI5U2LDcH9jt25DUP0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rlB-KMdnADI5U2LDcH9jt25DUP0/1/da"><img src="http://feedads.g.doubleclick.net/~a/rlB-KMdnADI5U2LDcH9jt25DUP0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/01/intellij-idea-questions-and-answers.html/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Нужны Flex/Flash и Java программисты. Москва</title>
		<link>http://garbage-collector.ru/2010/01/flex-and-java-developers-needed-in-moscow.html</link>
		<comments>http://garbage-collector.ru/2010/01/flex-and-java-developers-needed-in-moscow.html#comments</comments>
		<pubDate>Fri, 15 Jan 2010 12:36:13 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Вакансии]]></category>
		<category><![CDATA[Москва]]></category>
		<category><![CDATA[Работа]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=664</guid>
		<description><![CDATA[Хорошие люди попросили разместить объявление, что я и сделал.  
В компанию &#171;Датэк&#187; для работы над проектом &#171;COMDI&#187; требуются хорошие программисты:
Flex/Flash программист

Хорошее знание ActionScript3, Flex.
Опыт разработки полноценных веб-приложений
Желателен опыт работы с медиа серверами (FMS, Wowza).

JAVA программист

Опыт разработки апплетов, работа с изображениями.
Желательно, опыт работы с JNI.
Необходимо представление о работе WinAPI, cетевых протоколах, желательно P2P.
Придется разрабатывать системы [...]]]></description>
			<content:encoded><![CDATA[<p>Хорошие люди попросили разместить объявление, что я и сделал. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>В компанию &laquo;<a href="http://www.datech.ru">Датэк</a>&raquo; для работы над проектом &laquo;<a href="http://www.comdi.com">COMDI</a>&raquo; требуются хорошие программисты:</p>
<p><strong>Flex/Flash программист</strong></p>
<ul>
<li>Хорошее знание ActionScript3, Flex.</li>
<li>Опыт разработки полноценных веб-приложений</li>
<li>Желателен опыт работы с медиа серверами (FMS, Wowza).</li>
</ul>
<p><strong>JAVA программист</strong></p>
<ul>
<li>Опыт разработки апплетов, работа с изображениями.</li>
<li>Желательно, опыт работы с JNI.</li>
<li>Необходимо представление о работе WinAPI, cетевых протоколах, желательно P2P.</li>
<li>Придется разрабатывать системы скриншаринга, удаленного управления рабочим столом, работа с веб-камерами, p2p соединения и т.д.</li>
</ul>
<p>Работа постоянная в современном офисе, в районе ВДНХ. Уровень ЗП &#8211; 70,000-100,000.<br />
Резюме присылайте на <a href="mailto:egor.voronin@gmail.com">egor.voronin@gmail.com</a></p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=664&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/dzPSUz6SDBOH3BXq6WowN5SjXIU/0/da"><img src="http://feedads.g.doubleclick.net/~a/dzPSUz6SDBOH3BXq6WowN5SjXIU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/dzPSUz6SDBOH3BXq6WowN5SjXIU/1/da"><img src="http://feedads.g.doubleclick.net/~a/dzPSUz6SDBOH3BXq6WowN5SjXIU/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/01/flex-and-java-developers-needed-in-moscow.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Приведение объекта к булеву значению, а так же к любому другому типу в Groovy</title>
		<link>http://garbage-collector.ru/2010/01/object-casting-to-boolean-and-any-type-in-groovy.html</link>
		<comments>http://garbage-collector.ru/2010/01/object-casting-to-boolean-and-any-type-in-groovy.html#comments</comments>
		<pubDate>Sat, 09 Jan 2010 20:17:31 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Материалы]]></category>
		<category><![CDATA[asBoolean]]></category>
		<category><![CDATA[asType]]></category>
		<category><![CDATA[Boolean]]></category>
		<category><![CDATA[Casting]]></category>
		<category><![CDATA[Do you know...]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[toString]]></category>
		<category><![CDATA[Types]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=657</guid>
		<description><![CDATA[Все мы знаем, о таком замечательном методе, как toString(), имеющемся у любого объекта в языках, подобных Java и ActionScript. При попытке работы объектом, как со строкой, будет использовано возвращаемое именно этим методом значение. Поэтому мы можем в своих классах переопределять поведение метода, имеющееся у объекта по умолчанию, и возвращать свои собственные специализированные значения.
В этом отношении [...]]]></description>
			<content:encoded><![CDATA[<p>Все мы знаем, о таком замечательном методе, как <code>toString()</code>, имеющемся у любого объекта в языках, подобных Java и ActionScript. При попытке работы объектом, как со строкой, будет использовано возвращаемое именно этим методом значение. Поэтому мы можем в своих классах переопределять поведение метода, имеющееся у объекта по умолчанию, и возвращать свои собственные специализированные значения.</p>
<p>В этом отношении <a href="http://groovy.codehaus.org/">язык Groovy</a> не стал исключением &mdash; в нем тоже все объекты имеют метод <code>toString()</code>, логику которого можно переопределять, как в собственных классах пользователя, так и в любом другом из уже имеющихся классов и объектов программы, при помощи свойства <code>metaClass</code>. Однако Groovy шагнул дальше &mdash; он позволяет нам похожим образом приводить объекты и к булеву значению, и, кроме того, к любому другому типу объектов в приложении.</p>
<p>Рассмотрим для начала ситуацию приведения объекта к булеву значению. Все просто &mdash; берете и переопределяете в своем классе (или посредством поля <code>metaClass</code> в объекте или классе, доступа к исходному коду которого у вас нет) метод <code>asBoolean()</code>:</p>
<div class="igBar"><span id="lgroovy-3"><a  href="#" onclick="javascript:showPlainTxt('groovy-3'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-3">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> User <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> username</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3ABoolean+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> active</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3ABoolean+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> asBoolean<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; active</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">assert <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">'mrFreeman'</span>, active: <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">assert !<span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">'mrFreeman'</span>, active: <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// Переопределяем метод в существующем классе посредством свойства metaClass.</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a>.<span style="color: #006600;">metaClass</span>.<span style="color: #006600;">asBoolean</span> = <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; delegate == /groovy/</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">assert !<span style="color: #ff0000;">'true'</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">assert <span style="color: #ff0000;">'groovy'</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ну и, как вы уже могли догадаться, аналогичным способом мы переопределяем метод <code>asType()</code>, чтобы тем самым сделать возможным приведение нашего объекта к любому нужному нам типу:</p>
<div class="igBar"><span id="lgroovy-4"><a  href="#" onclick="javascript:showPlainTxt('groovy-4'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-4">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a>.<span style="color: #006600;">metaClass</span>.<span style="color: #006600;">asType</span> = <span style="color: #66cc66;">&#123;</span><span style="color: #000000; font-weight: bold;">Class</span> type -&gt;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>type == User<span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: delegate<span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">null</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">assertEquals <span style="color: #ff0000;">'test'</span>, <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'true'</span> <span style="color: #b1b100;">as</span> User<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">username</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Вот такие очень гибкие возможности предоставляет нам Groovy.</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=657&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/AsvcaOcEbc3DkB9BhuNqnK8Ecl0/0/da"><img src="http://feedads.g.doubleclick.net/~a/AsvcaOcEbc3DkB9BhuNqnK8Ecl0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/AsvcaOcEbc3DkB9BhuNqnK8Ecl0/1/da"><img src="http://feedads.g.doubleclick.net/~a/AsvcaOcEbc3DkB9BhuNqnK8Ecl0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/01/object-casting-to-boolean-and-any-type-in-groovy.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Поддержка UML диаграмм для ActionScript/Flex-проектов в Intellij IDEA 9</title>
		<link>http://garbage-collector.ru/2010/01/actionscript-flex-uml-support-in-intellij-idea-9.html</link>
		<comments>http://garbage-collector.ru/2010/01/actionscript-flex-uml-support-in-intellij-idea-9.html#comments</comments>
		<pubDate>Fri, 08 Jan 2010 10:32:00 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IntelliJ IDEA]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=653</guid>
		<description><![CDATA[Если кто не в курсе, то уже почти месяц как Intellij Idea 9 имеет возможность просмотра UML-диаграмм для ActionScript и Flex классов, а это значит, что у нас есть возможность анализировать код своих Flex проектов при помощи UML диаграм классов.
]]></description>
			<content:encoded><![CDATA[<p>Если кто не в курсе, то уже почти месяц как <a href="http://www.jetbrains.com/idea/">Intellij Idea 9</a> имеет возможность <a href="http://blogs.jetbrains.com/idea/2009/12/actionscriptflex-uml-class-diagrams-in-intellij-idea-9/">просмотра UML-диаграмм для ActionScript и Flex классов</a>, а это значит, что у нас есть возможность анализировать код своих Flex проектов при помощи UML диаграм классов.</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=653&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/eHlti0nzoxOsbmbd7K_s9yRHpg0/0/da"><img src="http://feedads.g.doubleclick.net/~a/eHlti0nzoxOsbmbd7K_s9yRHpg0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/eHlti0nzoxOsbmbd7K_s9yRHpg0/1/da"><img src="http://feedads.g.doubleclick.net/~a/eHlti0nzoxOsbmbd7K_s9yRHpg0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/01/actionscript-flex-uml-support-in-intellij-idea-9.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Grails-плагин Magic Numbers</title>
		<link>http://garbage-collector.ru/2010/01/grails-plugin-magic-numbers.html</link>
		<comments>http://garbage-collector.ru/2010/01/grails-plugin-magic-numbers.html#comments</comments>
		<pubDate>Wed, 06 Jan 2010 15:34:59 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Active Support]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Integer]]></category>
		<category><![CDATA[Long]]></category>
		<category><![CDATA[Number]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=648</guid>
		<description><![CDATA[Вы все еще нежитесь на новогодних каникулах? А вот Бьёрн Вильмсман (Björn Wilmsmann) уже вовсю занимается разработкой. Именно по этой причине он 2 января зарелизил и сразу же обновил до версии 0.2.2 небольшой, но замечательный плагин для Grails платформы под названием «Magic Numbers».
Плагин замечателен тем, что, основываясь на методологии библиотеки Active Support в Ruby on [...]]]></description>
			<content:encoded><![CDATA[<p>Вы все еще нежитесь на новогодних каникулах? А вот <a href="https://www.xing.com/profile/Bjoern_Wilmsmann">Бьёрн Вильмсман</a> (Björn Wilmsmann) уже вовсю занимается разработкой. Именно по этой причине он 2 января зарелизил и сразу же обновил до версии 0.2.2 небольшой, но замечательный плагин для Grails платформы под названием «<a href="http://grails.org/plugin/magic-numbers/">Magic Numbers</a>».</p>
<p>Плагин замечателен тем, что, основываясь на методологии библиотеки <a href="http://as.rubyonrails.org/">Active Support</a> в <a href="http://rubyonrails.org/">Ruby on Rails</a>, он расширяет классы Long и Integer специальными методами, позволяющими на более простом и понятном уровне производить различные числовые операции над датами и битами в приложении. Посмотрите, например, на следующие варианты использования:</p>
<div class="igBar"><span id="lgroovy-7"><a  href="#" onclick="javascript:showPlainTxt('groovy-7'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-7">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">2</span>.<span style="color: #006600;">minutes</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">1</span>.<span style="color: #006600;">hour</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">4</span>.<span style="color: #006600;">weeks</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">2</span>.<span style="color: #006600;">months</span>.<span style="color: #006600;">fromNow</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">6</span>.<span style="color: #006600;">years</span>.<span style="color: #006600;">ago</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">3</span>.<span style="color: #006600;">fortnights</span>.<span style="color: #006600;">ago</span>.<span style="color: #006600;">toDate</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #cc66cc;color:#800000;">640</span>.<span style="color: #006600;">kilobytes</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Замечательно, не находите? <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Более подробная информация доступна на <a href="http://grails.org/plugin/magic-numbers/">странице плагина</a>. Установка плагина производится через стандартный Grails-репозитарий посредством выполнения следующей команды:</p>
<div class="igBar"><span id="lcode-8"><a  href="#" onclick="javascript:showPlainTxt('code-8'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-8">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">grails install-plugin magic-numbers </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=648&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/8Q8iNYYiX15lE-bUS1d0vJ4p4PA/0/da"><img src="http://feedads.g.doubleclick.net/~a/8Q8iNYYiX15lE-bUS1d0vJ4p4PA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8Q8iNYYiX15lE-bUS1d0vJ4p4PA/1/da"><img src="http://feedads.g.doubleclick.net/~a/8Q8iNYYiX15lE-bUS1d0vJ4p4PA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2010/01/grails-plugin-magic-numbers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Типы HTTP-запросов</title>
		<link>http://garbage-collector.ru/2009/12/http-request-types.html</link>
		<comments>http://garbage-collector.ru/2009/12/http-request-types.html#comments</comments>
		<pubDate>Sun, 27 Dec 2009 16:25:26 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Ссылки]]></category>
		<category><![CDATA[Client/Server]]></category>
		<category><![CDATA[DELETE]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[POST]]></category>
		<category><![CDATA[PUT]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=639</guid>
		<description><![CDATA[Вдруг кто-нибудь из вас подзабыл или до сих пор не знал различия между типами запросов GET/POST/PUT/DELETE и других в протоколе HTTP. Рекомендую в таком случае вернуться к истокам и прочитать статью «Типы HTTP-запросов и философия REST», в которой хабрапользователь indigo простым и понятным языком раскрывает основы этой темы.
]]></description>
			<content:encoded><![CDATA[<p>Вдруг кто-нибудь из вас подзабыл или до сих пор не знал различия между типами запросов <code>GET</code>/<code>POST</code>/<code>PUT</code>/<code>DELETE</code> и других в протоколе HTTP. Рекомендую в таком случае вернуться к истокам и прочитать статью «<a href="http://habrahabr.ru/blogs/webdev/50147/">Типы HTTP-запросов и философия REST</a>», в которой хабрапользователь <a href="http://indigo.habrahabr.ru/">indigo</a> простым и понятным языком раскрывает основы этой темы.</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=639&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/-2xaoo8KMeyWAgn1jle1xBxH_CU/0/da"><img src="http://feedads.g.doubleclick.net/~a/-2xaoo8KMeyWAgn1jle1xBxH_CU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-2xaoo8KMeyWAgn1jle1xBxH_CU/1/da"><img src="http://feedads.g.doubleclick.net/~a/-2xaoo8KMeyWAgn1jle1xBxH_CU/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2009/12/http-request-types.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>В чем разница между интеграционными и Unit-тестами в Grails?</title>
		<link>http://garbage-collector.ru/2009/12/grails-difference-between-integration-and-unit-tests.html</link>
		<comments>http://garbage-collector.ru/2009/12/grails-difference-between-integration-and-unit-tests.html#comments</comments>
		<pubDate>Mon, 14 Dec 2009 00:13:47 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Материалы]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Integration-tests]]></category>
		<category><![CDATA[Unit-tests]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=635</guid>
		<description><![CDATA[Должно быть каждый Grails-программист, только начавший постигать премудрости метода «разработки приложения посредством тестирования», задается вопросом: «Для чего же в Grails существуют две разновидности тестов, и какая между ними разница?». Ведь на первый взгляд очевидной разницы между ними нет, кроме того, что Unit-тесты создаются в папке test/unit приложения, а интеграционные &#8212; в test/integration.
Однако все не так [...]]]></description>
			<content:encoded><![CDATA[<p>Должно быть каждый Grails-программист, только начавший постигать премудрости метода «разработки приложения посредством тестирования», задается вопросом: «Для чего же в Grails существуют две разновидности тестов, и какая между ними разница?». Ведь на первый взгляд очевидной разницы между ними нет, кроме того, что Unit-тесты создаются в папке <code>test/unit</code> приложения, а интеграционные &mdash; в <code>test/integration</code>.</p>
<p>Однако все не так просто, как могло бы показаться. Начнем с Unit-тестов. Они потому так и называются, что производят тестирование очень маленьких частей приложения, единиц или <em>юнитов</em> функциональности: отдельных классов и их методов. Интеграционные тесты же специально разработаны для тестирования достаточно крупных частей приложения: таких, как контроллеры и <em>все</em> их зависимости. Но главное же отличие между этими разновидностями тестов заключается в том, что интеграционные тесты выполняются в <em>контексте запущенного приложения</em>  &mdash; с одновременным запуском базы данных и доступом ко всем динамическим свойствам и методам, в которых может нуждаться тестируемый код. Т.е. буквально, интеграционные тесты <em>интегрируются</em> в запущенное приложение во время его тестирования. Поэтому отпадает необходимость в моккинге (англ. «mock» - имитирование, подражание).</p>
<p>Давайте рассмотрим более подробно, что будет, и что не будет работать при интеграционном тестировании:</p>
<ul>
<li>все плагины, у которых не исключена возможность интеграционного тестирования, будут загружены;</li>
<li>код в классе <code>BootStrap</code> будет выполнен. Контекст Spring-приложения будет полностью развернут;</li>
<li>доменные классы будут взаимодействовать с реальной базой данных (по умолчанию, на этапе тестирования используется временная база данных HSQLDB);</li>
<li>все динамические свойства и методы, впрыскиваемые Spring, доступны на этапе тестирования;</li>
<li>будут использованы «моккнутые» версии свойств <code>request</code> (<code>GrailsMockHttpServletRequest</code>), <code>response</code> (<code>GrailsMockHttpServletResponse</code>) и <code>session</code> (<code>MockHttpSession</code>);</li>
<li>фильтры не будут работать;</li>
<li>URL-mapping не производит никакого эффекта;</li>
<li>нет поддержки тестирования видов (GSP-страниц).</li>
</ul>
<p>Важной особенностью является то, что интеграционным тестам требуется гораздо больше времени для выполнения, чем Unit-тестам, поскольку в этом случае перед тем, как непосредственно выполнить интеграционные тесты, Grails необходимо осуществить запуск и развертывание приложения. Поэтому, из-за достаточно серьезной экономии времени, Unit-тесты являются более предпочтительными. Однако не стоит относиться с пренебрежением и к интеграционным тестам. Вот список тех ситуаций, когда они могут оказаться просто незаменимыми:</p>
<ul>
<li>когда у вас нет возможности протестировать что-то посредством Unit-тестов;</li>
<li>когда вы хотите протестировать взаимодействия между различными объектами в приложении;</li>
<li>когда проще протестировать какой-либо функционал, взяв реальные данные из базы, чем «моккать» все подряд в приложении.</li>
</ul>
<p>На этом все. Удачного вам погружения в физику и магию тестирования!</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=635&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/StkLYCFWlZuZEtocvB38Rc4WKGI/0/da"><img src="http://feedads.g.doubleclick.net/~a/StkLYCFWlZuZEtocvB38Rc4WKGI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/StkLYCFWlZuZEtocvB38Rc4WKGI/1/da"><img src="http://feedads.g.doubleclick.net/~a/StkLYCFWlZuZEtocvB38Rc4WKGI/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2009/12/grails-difference-between-integration-and-unit-tests.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Проблема с циклическими зависимостями между сервисами в Grails</title>
		<link>http://garbage-collector.ru/2009/12/grails-circular-service-dependencies.html</link>
		<comments>http://garbage-collector.ru/2009/12/grails-circular-service-dependencies.html#comments</comments>
		<pubDate>Sat, 12 Dec 2009 23:43:14 +0000</pubDate>
		<dc:creator>Юрий Яровой</dc:creator>
				<category><![CDATA[Материалы]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Services]]></category>

		<guid isPermaLink="false">http://garbage-collector.ru/?p=631</guid>
		<description><![CDATA[Представим себе типичную ситуацию. Пусть в составе нашего приложении имеются два сервиса:
ТЕКСТ&#160;С&#160;ПОДСВЕТКОЙ
GROOVY:




class PersonService


&#123;


&#160; &#160; def postService


&#160; &#160; void foo&#40;&#41;


&#160; &#160; &#123;


&#160; &#160; &#160; &#160; // …


&#160; &#160; &#125;


&#125; 






и
ТЕКСТ&#160;С&#160;ПОДСВЕТКОЙ
GROOVY:




class PostService


&#123;


&#160; &#160; def personService


&#160; &#160; void bar&#40;&#41;


&#160; &#160; &#123;


&#160; &#160; &#160; &#160; personService.foo&#40;&#41;


&#160; &#160; &#125;


&#125; 






Как мы видим, оба этих сервиса нуждаются во взаимной инъекции экземпляра [...]]]></description>
			<content:encoded><![CDATA[<p>Представим себе типичную ситуацию. Пусть в составе нашего приложении имеются два сервиса:</p>
<div class="igBar"><span id="lgroovy-13"><a  href="#" onclick="javascript:showPlainTxt('groovy-13'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-13">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> PersonService</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">def</span> postService</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">void</span> foo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// …</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>и</p>
<div class="igBar"><span id="lgroovy-14"><a  href="#" onclick="javascript:showPlainTxt('groovy-14'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-14">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> PostService</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">def</span> personService</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">void</span> bar<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; personService.<span style="color: #006600;">foo</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Как мы видим, оба этих сервиса нуждаются во взаимной инъекции экземпляра другого сервиса и сохранении его в виде внутреннего свойства. С виду все правильно, однако, если мы попытаемся запустить наше приложение, то  получим ошибку следующего характера:</p>
<div class="igBar"><span id="lcode-15"><a  href="#" onclick="javascript:showPlainTxt('code-15'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-15">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Error creating bean with name <span style="color:#CC0000;">'(inner bean)'</span>: Initialization of bean failed; </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">nested exception is org.<span style="">springframework</span>.<span style="">beans</span>.<span style="">factory</span>.<span style="">BeanCurrentlyInCreationException</span>: </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Error creating bean with name <span style="color:#CC0000;">'postService'</span>: </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">org.<span style="">springframework</span>.<span style="">beans</span>.<span style="">factory</span>.<span style="">FactoryBeanNotInitializedException</span>: </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FactoryBean is not fully initialized yet </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ошибка связана с тем, что Spring не может проинициализировать свойство, в которое требуется поместить ссылку на экземпляр объекта, нуждающийся в обратной ссылке на текущий объект. Классическая ситуация «курицы и яйца», по-другому не назовешь. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Как же решить проблему? Снимем обязанность по инъекции в одном из классов со Spring и прибегнем к ленивой инициализации свойства. А еще точнее в одном из сервисов сам процесс инъекции поместим в соответствующий геттер. Посмотрите на следующий листинг:</p>
<div class="igBar"><span id="lgroovy-16"><a  href="#" onclick="javascript:showPlainTxt('groovy-16'); return false;"><span id='text_content'>ТЕКСТ&nbsp;С</span>&nbsp;<span id='text_p'>П</span><span id='text_o'>О</span><span id='text_d'>Д</span><span id='text_c'>С</span><span id='text_v'>В</span><span  id='text_e'>Е</span><span id='text_t'>Т</span><span id='text_k'>К</span><span  id='text_o2'>О</span><span id='text_y'>Й</span></a></span></div>
<div class="syntax_hilite"><span class="langName">GROOVY:</span>
<div id="groovy-16">
<div class="groovy">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #a1a100;">import org.springframework.context.ApplicationContext</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #a1a100;">import org.springframework.context.ApplicationContextAware</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">class</span> PostService <span style="color: #000000; font-weight: bold;">implements</span> ApplicationContextAware</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; ApplicationContext applicationContext</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; PersonService getPersonServiceBean<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; applicationContext.<span style="color: #006600;">getBean</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"personService"</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> PersonService</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">void</span> bar<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; personServiceBean.<span style="color: #006600;">foo</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Итак, что же мы сделали:</p>
<ol>
<li>В сервисе <code>PostService</code> мы имплементировали интерфейс <code>ApplicationContextAware</code>.</li>
<li>Добавили в класс инъекцию <code>ApplicationContext</code>.</li>
<li>Вместо инъекции <code>personService</code> мы создали метод-геттер <code>getPersonServiceBean</code>, в котором посредством метода <code>applicationContext.getBean()</code> возвращаем ссылку на экземпляр нужного нам сервиса.</li>
<li>В методе <code>bar</code> к экземпляру сервиса обращаемся посредством свойства <code>personServiceBean</code>, которое, по сути дела, является аналогом вызова геттера <code>getPersonServiceBean()</code>. Обратите внимание, что названием геттера является <code>getPersonServiceBean</code>, а не <code>getPersonService</code>. Тем самым при помощи переименовывания мы пресекаем любые попытки инъекций этого свойства со стороны Spring.</li>
</ol>
<p>Код сервиса <code>PersonService</code> мы оставляем без изменений &mdash; с односторонними зависимостями Spring справляется очень даже хорошо. <img src='http://garbage-collector.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Тестируем приложение и проверяем, что теперь оно запускается без ошибок.</p>
<p>Вот и все на сегодня. Удачного вам дня!</p>
<img src="http://garbage-collector.ru/?ak_action=api_record_view&id=631&type=feed" alt="" />
<p><a href="http://feedads.g.doubleclick.net/~a/mZKfkI3DdiQTXPPreEq2tK7OA4Y/0/da"><img src="http://feedads.g.doubleclick.net/~a/mZKfkI3DdiQTXPPreEq2tK7OA4Y/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mZKfkI3DdiQTXPPreEq2tK7OA4Y/1/da"><img src="http://feedads.g.doubleclick.net/~a/mZKfkI3DdiQTXPPreEq2tK7OA4Y/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://garbage-collector.ru/2009/12/grails-circular-service-dependencies.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
