<?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>Diego Plentz &#187; coding</title>
	<atom:link href="http://plentz.org/category/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://plentz.org</link>
	<description>plentiful thoughts from my empty head</description>
	<lastBuildDate>Sat, 03 Jul 2010 06:17:13 +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>jQuery maskMoney plugin</title>
		<link>http://plentz.org/2009/10/29/jquery-maskmoney-plugin/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=jquery-maskmoney-plugin</link>
		<comments>http://plentz.org/2009/10/29/jquery-maskmoney-plugin/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 02:02:41 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[clientside]]></category>
		<category><![CDATA[currency]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mask]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=313</guid>
		<description><![CDATA[Hey pessoal, quick post: acabei de jogar no github mais um projeto que uso a tempo e contribui com algum código: o jquery-maskMoney plugin. É basicamente um plugin pra fazer o trabalho chato de ficar controlando formatação de campos numéricos(com ou sem precisão decimal). Pra usar ele é mega simples: &#60;script src=&#34;jquery.js&#34; type=&#34;text/javascript&#34;&#62;&#60;/script&#62; &#60;script src=&#34;jquery.maskMoney.js&#34; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/dborman2/3258378233/" title="Money, Money, Money by borman818"><img src="http://farm4.static.flickr.com/3439/3258378233_46ac9b316d_m.jpg" width="193" height="240" alt="Money, Money, Money by borman818"  class="pc_img" border="0" style="border: 2px solid rgb(0, 0, 0); float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Hey pessoal, quick post: acabei de jogar no <a href="http://github.com/">github</a> mais um projeto que uso a tempo e contribui com algum código: o <a href="http://github.com/plentz/jquery-maskmoney">jquery-maskMoney plugin</a>. É basicamente um plugin pra fazer o trabalho chato de ficar controlando formatação de campos numéricos(com ou sem precisão decimal). </p>
<p>Pra usar ele é mega simples:</p>
<p><code>&lt;script src=&quot;jquery.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;jquery.maskMoney.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script&gt;<br />
$(function(){<br />
&nbsp;&nbsp;$(&quot;#currency&quot;).maskMoney();<br />
&nbsp;&nbsp;$(&quot;#real&quot;).maskMoney({symbol:&quot;R$&quot;, decimal:&quot;,&quot;, thousands:&quot;.&quot;});<br />
&nbsp;&nbsp;$(&quot;#precision&quot;).maskMoney({precision:3})<br />
})<br />
function removeMask(){<br />
&nbsp;&nbsp;$(&quot;#currency&quot;).unmaskMoney();<br />
}<br />
&lt;/script&gt;</code></p>
<p>Dúvidas, sugestões, críticas, etc, basta entrar em contato, abrir uma issue no projeto ou deixar um comentário!</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=313&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2009/10/29/jquery-maskmoney-plugin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Update Cadabra!</title>
		<link>http://plentz.org/2009/07/19/update-cadabra/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=update-cadabra</link>
		<comments>http://plentz.org/2009/07/19/update-cadabra/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 01:57:32 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[util]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[macports]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=291</guid>
		<description><![CDATA[Faz um bom tempo que tenho uma mania chata: gosto de ter tudo sempre atualizado. Confesso que é quase uma frescura (nada de piadinhas sobre gaúchos, ok?), mas automatizando um pouco, é um vício que da pra conviver. Para as apps do Mac OS X eu uso o AppFresh, que funciona muito bem e tem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/kt/120468504/" title="Caution: Magician Ahead! by The Rocketeer"><img src="http://farm1.static.flickr.com/43/120468504_c68075f6d7_m.jpg" width="240" height="201" alt="Caution: Magician Ahead! by The Rocketeer" style="border: 2px solid rgb(0, 0, 0); float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Faz um bom tempo que tenho uma mania chata: gosto de ter <strong>tudo</strong> sempre atualizado. Confesso que é quase uma frescura (nada de piadinhas sobre gaúchos, ok?), mas <a href="http://gc.blog.br/2009/04/15/louco-por-automatizacao/">automatizando um pouco</a>, é um vício que da pra conviver. Para as apps do Mac OS X eu uso o <a href="http://metaquark.de/appfresh/">AppFresh</a>, que funciona muito bem e tem integração com o <a href="http://osx.iusethis.com/iconbonanza/plentz">iUseThis</a>. Mas ainda tinham algumas coisas que eu ainda fazia manualmente: MacPorts e RubyGems eram duas delas.</p>
<p>Depois do post que fiz sobre o <a href="http://plentz.org/2008/10/19/rmagick-cadabra/">rmagick-osx-installer</a> tive a idéia de fazer um script que fizesse o trabalho sujo por mim também. E depois de muita procastinação: <a href="http://github.com/plentz/update_cadabra/">update_cadabra</a>!</p>
<p>É basicamente, um script bash que roda os comandos pra atualização do <a href="http://rubygems.org/">Ruby Gems</a>+gems+<a href="http://www.macports.org/">MacPorts</a>+ports &#8211; e de quebra, ainda faz uma faxina no que está sobrando. Espero que usem, sugiram coisas novas e poupem ainda mais nosso tempo.</p>
<p>Pra usar, é só baixar o script, dar permissão de execução pro script e executá-lo:</p>
<p><code>chmod u+x update_cadabra.sh<br />
sudo update_cadabra.sh</code></p>
<p>ps: se você por algum motivo não pode atualizar suas gems, ou ainda tem algumas gems antigas instaladas para algum sistema legado, não recomendo usar o script<br />
ps2: use por sua conta e risco <img src='http://plentz.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=291&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2009/07/19/update-cadabra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A dieta do programador</title>
		<link>http://plentz.org/2009/05/10/a-dieta-do-programador/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=a-dieta-do-programador</link>
		<comments>http://plentz.org/2009/05/10/a-dieta-do-programador/#comments</comments>
		<pubDate>Mon, 11 May 2009 01:50:41 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[practices]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=277</guid>
		<description><![CDATA[Todo dia, milhares de programadores (desenvolvedores, arquitetos, engenheiros de software, nerds, rock stars, dê o nome que achar melhor) se alimentam porai de forma errada. Tenho percebido isso a cada projeto que entro. Meu objetivo aqui não é colocar ninguém em uma dieta spartana, somente apontar algumas formas de deixar sua alimentação diária mais saudável [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://plentz.org/photos/dubby/2422215232/" title="Petrus: Mutton by dubbie"><img src="http://farm4.static.flickr.com/3270/2422215232_1d8dfdd8be_m.jpg" alt="Petrus: Mutton by dubbie" class="pc_img" height="240" width="160" style="border: 2px solid rgb(0, 0, 0); float: right; margin-left: 10px; margin-bottom: 10px;"/></a>Todo dia, milhares de programadores (desenvolvedores, arquitetos, engenheiros de software, nerds, rock stars, dê o nome que achar melhor) se alimentam porai de forma errada. Tenho percebido isso a cada projeto que entro. Meu objetivo aqui não é colocar ninguém em uma <a href="http://www.google.com.br/search?q=spartan+diet">dieta spartana</a>, somente apontar algumas formas de deixar sua alimentação diária mais saudável e nutritiva.</p>
<ul>
<li>Cuidado com os getters e setters: tentadores, eles tem preparo extremamente simples (ainda mais com ferramentas como o <a href="http://plentz.org/2005/02/27/eclipsed/">Eclipse</a> e o <a href="www.jetbrains.com/idea/">IntelliJ</a>), porém, assim como a gordura, se consumidas em excesso são prejudiciais a saúde, então, moderação!</li>
<li>As saborosas interfaces: são deliciosas e extremamente nutritivas. Porém, cuidado: elas não são adequadas pra todas as ocasiões. Porque iriamos colocar interfaces onde vamos ter <a href="http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused">apenas uma implementação</a>?</li>
<li>Não coma somente pra agradar os outros: quem nunca teve uma tia que ofereceu uma porção de um prato que você não suporta e acaba comendo só pra agradar? Se você se flagra frequentemente alterando xmls, pare um pouco e pense se aquilo é realmente necessário ou se você não está fazendo só pra agradar o framework.</li>
<li>Evite repetir: a feijoada da vovó é <strong>bem</strong> tentadora einh? Mas repetir pode resultar em uma indigestão enorme. Código repetido também <a href="http://c2.com/cgi/wiki?DontRepeatYourself">não desce bem.</a></li>
<li>Experimente antes de servir: essa é uma dica que serve mais quando você está cozinhando. Mesmo os mais experientes cozinheiros, experimentam sua comida <strong>durante</strong> o preparo. Você <a href="http://c2.com/cgi/wiki?TestDrivenDevelopment">deveria fazer o mesmo</a>.</li>
<li>Menos é mais: a cozinha francesa tem a fama de ser a mais saborosa do mundo &#8211; e também por servir pratos com quantidades bem reduzidas. Guarde bem: mais essência, menos quantidade.<br />
<blockquote>Success only grows when work(pain, strain, effort) decreases and non-work (fun, love, effort-lessness) increases. &#8211; Fred Gratzon, The lazy way to success</p></blockquote>
</li>
<li>Prefira um bom restaurante à um posto de conveniências: prefira comer um bom prato em um restaurante do que um hamburguer em um posto de conveniências. Usar herança pode parecer mais prático que usar interfaces, mas seu estômago <a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/">prefere as interfaces</a>.</li>
</ul>
<p>Com o tempo (e com os comentários relevantes), vou adicionando novas dicas para que todos (inclusive eu), tenhamos uma vida mais saudável.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=277&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2009/05/10/a-dieta-do-programador/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Updating Gems</title>
		<link>http://plentz.org/2008/10/16/updating-gems/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=updating-gems</link>
		<comments>http://plentz.org/2008/10/16/updating-gems/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 03:47:29 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[macosx]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=213</guid>
		<description><![CDATA[Hoje resolvi fazer uma atualização do Rails e cia aqui e dei de cara com um problema chato de resolver. Além de instalar as versões novas dos gems, queria me livrar as antigas. Mas sempre que tentava fazer o gem cleanup, recebia o seguinte erro: ~ plentz$ sudo gem cleanup Cleaning up installed gems... Attempting [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/richlegg/84028300/" title="How many steps can I go? by LeggNet"><img src="http://farm1.static.flickr.com/38/84028300_3f2ea22ed6_m.jpg" alt="How many steps can I go? by LeggNet" class="pc_img" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Hoje resolvi fazer uma atualização do <a href="http://www.rubyonrails.org/">Rails</a> e cia aqui e dei de cara com um problema chato de resolver. Além de instalar as versões novas dos <a href="http://www.rubygems.org/">gems</a>, queria me livrar as antigas. Mas sempre que tentava fazer o <em>gem cleanup</em>, recebia o seguinte erro:<br />
<code><br />
~ plentz$ sudo gem cleanup<br />
Cleaning up installed gems...<br />
Attempting to uninstall mongrel-1.0.1<br />
ERROR:  While executing gem ... (Gem::InstallError)<br />
    Unknown gem mongrel = 1.0.1<br />
</code><br />
Depois de fazer um <em>find</em> (<em>find . -iname mongrel*</em> mesmo) no / inteiro, descobri um diretório com vários gems antigos. Ele fica em:</p>
<p><code>/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8</code></p>
<p>Entrei nele e fiz literalmente um limpa. Apaguei todos arquivos dentro das pastas specifications, doc, cache e gems. Então se quizer deixar sua instalação 100% fresh, rode os comandos abaixo, e caso encontre algum problema, siga a dica acima:<br />
<code><br />
sudo gem update --system<br />
sudo gem update<br />
sudo gem cleanup<br />
</code><br />
Depois confira que você ficou só com as últimas versões rodando: <em>gem list</em>.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=213&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2008/10/16/updating-gems/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Give It a Try</title>
		<link>http://plentz.org/2008/04/10/give-it-a-try/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=give-it-a-try</link>
		<comments>http://plentz.org/2008/04/10/give-it-a-try/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 02:34:20 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=169</guid>
		<description><![CDATA[Não lembro exatamente onde li, ou quem vi falando essa semana sobre uma versão do &#8220;Pragmatic Version Control with *&#8221; voltada para Git. E parece que estavam prevendo, porque depois de todo o auê que ele tem causado os Pragmatic Programmers anunciaram hoje o Pragmatic Version Control using Git. E não é a toa. A [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/kruse/91118309/" title="Pragmatic Version Control Using Git"><img src="http://www.pragprog.com/images/covers/190x228/tsgit.jpg" alt="Pragmatic Version Control Using Git" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a><br />
Não lembro exatamente onde li, ou quem vi falando essa semana sobre uma versão do &#8220;Pragmatic Version Control with *&#8221; voltada para <a href="http://git.or.cz/">Git</a>. E parece que estavam prevendo, porque depois de todo o <a href="http://www.google.com/search?q=git">auê que ele tem causado</a> os <a href="http://pragprog.com/">Pragmatic Programmers</a> anunciaram hoje o <a href="http://pragprog.com/titles/tsgit">Pragmatic Version Control using Git</a>. E não é a toa. A primeira vez que ouvi alguém falando do <a href="http://git.or.cz/">Git</a>, foi o próprio criador da criança, ninguém menos que <a href="http://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>, em <a href="http://youtube.com/watch?v=4XpnKHJAok8">uma apresentação dentro do Google</a>, quase um ano atrás. Na época não dei a devida importância, mas vale a pena dar algumas horinhas de atenção pra ler a respeito e tirar suas próprias conclusões.</p>
<p>Além disso, hoje também foi <a href="http://github.com/blog/40-we-launched">oficialmente lançado</a> o <a href="http://github.com/">Github</a>, que é basicamente um host especializado em Git. E quem acompanha blogs gringos porai, deve ter percebido que não param de pipocar posts em tudo quanto é lado, explicando como usar Git e porque git é melhor que Subversion (acho que ninguém tem coragem de tentar comparar Git com <a href="http://www.cvshome.org/">CVS</a> né?) então nem vou perder meu tempo escrevendo mais um. E como provavelmente daqui a algum tempo (pouco, inclusive), você vai estar <a href="http://git.or.cz/course/svn.html">abandonando seu querido Subversion</a>, siga os links do post e comece a usar. Não dói. <strong>G</strong>ive <strong>I</strong>t a <strong>T</strong>ry.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=169&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2008/04/10/give-it-a-try/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Collaboration</title>
		<link>http://plentz.org/2007/07/19/open-source-collaboration/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=open-source-collaboration</link>
		<comments>http://plentz.org/2007/07/19/open-source-collaboration/#comments</comments>
		<pubDate>Thu, 19 Jul 2007 22:00:48 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[news]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/07/19/open-source-collaboration/</guid>
		<description><![CDATA[Volta e meia vemos pela internet alguém falando que open source não dá dinheiro. Quem tem um pouco mais de conhecimento (e vivência) em ambientes desse tipo, sabe que muitas vezes o dinheiro pode não vir diretamente da empresa &#8220;guarda-chuva&#8221; do projeto, mas através de reconhecimento por se ter participado do desenvolvimento de algum software [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/kruse/91118309/" title="It's a Small World"><img src="http://farm1.static.flickr.com/41/91118309_95c43fefbf_m.jpg" alt="It's a Small World" height="180" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Volta e meia vemos pela internet alguém falando que open source não dá dinheiro. Quem tem um pouco mais de conhecimento (e vivência) em ambientes desse tipo, sabe que muitas vezes o dinheiro pode não vir diretamente da empresa &#8220;guarda-chuva&#8221; do projeto, mas através de reconhecimento por se ter participado do desenvolvimento de algum software que é usado por dezenas, centenas ou mesmo milhares de desenvolvedores. E com um pouco mais de dedicação(e expertise), é possível ser contrato pela empresa (e ainda ganhar um bom dinheiro). No Brasil mesmo, temos excelentes exemplos de gente trabalhando para projetos open source full time, como o <a href="http://fmeyer.org/">Fernando Meyer</a>, que trabalha no projeto <a href="http://labs.jboss.com/jbossrules/">Jboss Drools</a> contratado pela <a href="http://www.redhat.com/">RedHat</a> e também o <a href="http://www.kumpera.net/">Rodrigo Kumpera</a> (ou louds), trabalhando pela <a href="http://www.novell.com/">Novell</a> no projeto <a href="http://www.mono-project.com/">Mono</a>, ambos amigos pessoais. Além deles, com certeza devem existir outros que não conheço.</p>
<p>Pensando nesse pessoal, <a href="http://www.ohloh.net/accounts/1">Jason Allen</a> e Scott Collison criaram um site de relacionamentos para desenvolvedores: o <a href="http://www.ohloh.net/">Ohloh</a>. O nome é tão estranho quanto o &#8220;primo&#8221; famoso, <a href="http://www.orkut.com/">orkut</a>, mas o foco é bem diferente. O Ohloh oferece uma série de recursos para quem participa de projetos open source, como possibilidade de criar &#8220;profiles&#8221; dos seus projetos e indexar o código fonte, permitindo que os desenvolvedores linkem seu profile aos seus commits no repositório. Também é possível dar um kudo(segundo a definição que está no site: (ku·do) a statement of praise or approval; accolade; compliment.) como forma de demonstrar sua confiança/admiração em algum desenvolvedor. Excenlente oportunidade pra quem colabora em algum projeto mostrar seu trabalho. Quem se cadastrar e tiver curiosidade pode dar uma passada no <a href="http://www.ohloh.net/accounts/5517">meu profile</a> lá.</p>
<p>Na mesma linha, nas últimas semanas (ok, fazia meses que não postava), acabei ganhando alguns &#8220;pontos de confiança&#8221; em alguns projetos. Me tornei commiter (é, versão aportuguezada de quem pode dar commit no repositório), dos projetos <a href="http://hibernate.org/">Hibernate</a> (e seus subprojetos) e do <a href="http://www.vraptor.org/">Vraptor</a> (junto com o pessoal da <a href="http://www.caelum.com.br/">Caelum</a>) &#8211; tanto o <a href="http://www.ohloh.net/projects/55">Hibernate</a> quanto o <a href="http://www.ohloh.net/projects/3571">VRaptor</a> já estão indexados no Ohloh. Motivo à mais pra gatar um tempo extra codando na frente do micro <img src='http://plentz.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=166&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/07/19/open-source-collaboration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spin &#8211; Workshop on Software Trends</title>
		<link>http://plentz.org/2007/07/19/spin-workshop-on-software-trends/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=spin-workshop-on-software-trends</link>
		<comments>http://plentz.org/2007/07/19/spin-workshop-on-software-trends/#comments</comments>
		<pubDate>Thu, 19 Jul 2007 05:57:23 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[events]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/07/19/spin-workshop-on-software-trends/</guid>
		<description><![CDATA[Já estava com esse post em draft à séculos, mas como o tempo andava curto, acabava sempre procastinando de terminar. Algum tempo atrás (ok, bastante tempo, foi dia 30 de abril, 2007), ocorreu mais um encontro do Spin RS, fórum regional voltado para a melhoria das práticas de Engenharia de Software. Nessa edição em especial, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/leosagnotti/534349749/" title="Circolo di fotoamatori"><img src="http://farm2.static.flickr.com/1358/534349749_829a7306dc_m.jpg" alt="Circolo di fotoamatori" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Já estava com esse post em draft à séculos, mas como o tempo andava curto, acabava sempre procastinando de terminar. Algum tempo atrás (ok, bastante tempo, foi dia 30 de abril, 2007), ocorreu mais um encontro do <a href="http://www.esicenter.unisinos.br/frm_spinrs.php">Spin RS</a>, fórum regional voltado para a melhoria das práticas de Engenharia de Software. Nessa edição em especial, diversas &#8220;celebridades&#8221; da <a href="http://www.ieee.org/">IEEE</a> estavam presentes, então vale a pena dar uma olhada, mesmo que seja somente <a href="http://www.esicenter.unisinos.br/download/SPIN_30_04_2007.zip">nos slides</a> das palestras.</p>
<p><a href="http://www.wirfs-brock.com">Rebecca Wirfs-Brock</a>: sensacional. Candidata forte à melhor palestra. A palestra dela foi basicamente uma aula de como contar histórias (uma habilidade importantíssima pra quem desenvolve orientado à objetos, já que precisamos saber fazer um &#8220;roteiro&#8221; de como os objetos interagem, etc). O nome da palestra era &#8220;Trends on Object-Oriented Software Design&#8221;, mas acabou virando &#8220;The Art of Telling your Design Story&#8221;.<br />
PS: recomendo <em>mesmo</em> o livro da Rebecca, <a href="http://www.amazon.com/gp/product/0201379430">Object Design: Roles, Responsibilities, and Collaborations</a>.</p>
<p>Outra palestra bacana foi a do <a href="http://philippe.kruchten.com/">Philippe Kruchten</a>, sobre Arquitetura de software, onde ele levantou algumas questões sobre quem, como e quando deve fazer a arquitetura de um sistema. Mas a parte que mais me chamou atenção foi durante as perguntas da platéia, onde alguém perguntou alguma dica de como se tornar um bom arquiteto de software, e ele respondeu bem tranquilamente &#8220;troque muitas vezes de emprego&#8221;. <a href="http://www.flickr.com/photos/diegop/543111094/">Reações curiosas</a> puderam ser observadas.</p>
<p>Dessa vez só o <a href="http://blog.fragmental.com.br/">Phillip Calçado</a> e o Marcello Azambuja que <a href="http://www.flickr.com/photos/diegop/543113656/">vieram</a>, mas próxima vez espero ver mais gente por aqui, até para valorizar mais o evento (e também pra participar do churrasco pós-evento).</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=160&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/07/19/spin-workshop-on-software-trends/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Connection Leak Paradise</title>
		<link>http://plentz.org/2007/04/21/connection-leak-paradise/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=connection-leak-paradise</link>
		<comments>http://plentz.org/2007/04/21/connection-leak-paradise/#comments</comments>
		<pubDate>Sun, 22 Apr 2007 03:32:55 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jmx]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/04/21/connection-leak-paradise/</guid>
		<description><![CDATA[Quem programa em Java e nunca passou por esse problema? Você está desenvolvendo, tudo funciona perfeitamente, quando a aplicação vai para produção e os usuários começam a usar você percebe que o contador de conexões disponíveis no seu pool só diminui. As razões para isso podem ser as mais variadas (sendo a maioria deles problemas [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/dinerdog/189083353/" title="Leak"><img src="http://farm1.static.flickr.com/69/189083353_ef004f5c30_m.jpg" alt="Leak" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Quem programa em Java e nunca passou por esse problema? Você está desenvolvendo, tudo funciona perfeitamente, quando a aplicação vai para produção e os usuários começam a usar você percebe que o contador de conexões disponíveis no seu pool só diminui.</p>
<p>As razões para isso podem ser as mais variadas (sendo a maioria deles problemas da aplicação e não algo ligado ao data source, servidor de aplicação ou mesmo driver jdbc), mas as mais comuns são:</p>
<ul>
<li>ausência de chamada ao connection.close();</li>
<li>falta de um tratamento de excessões, e conseqüentemente, o método close() não é chamado;</li>
</ul>
<p>É importante saber, que sempre que você estiver lidando diretamente com Connection (o que não é algo muito aconselhável, sabendo que já existem diversos frameworks que abstraem/simplificam a utilização de jdbc), você deve fechar ela através do método close() e o mesmo deve estar dentro de um bloco finally{}, para que ele seja executado mesmo se ocorrer um problema durante a execução do seu código.</p>
<p>Mas e quando você já revisou &#8220;todo&#8221; seu código e mesmo assim as conexões continuam vazando? Você olha as conexões do seu pool e elas simplesmente parecem ir para o limbo. Aqui alguns já podem começar a se perguntar, &#8220;mas tem como eu monitorar as conexões do meu pool?&#8221;. E é aqui que entra um recurso não muito conhecido (e menos ainda, usado): <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">Java Management Extensions</a> ou simplesmente <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">JMX</a>.</p>
<p>Copiando o site da Sun:</p>
<blockquote><p>JMX technology provides the tools for building distributed, Web-based, modular and dynamic solutions for managing and monitoring devices, applications, and service-driven networks. By design, this standard is suitable for adapting legacy systems, implementing new management and monitoring solutions, and plugging into those of the future.</p></blockquote>
<p>A maioria (se não todos) dos application servers já vem com recursos  JMX prontos pra monitoramento e diagnóstico de connection leaks. Ativar o monitoramento do data source pode muitas vezes sacrificar um pouco da performance da aplicação (principalmente em um arquitetura Database-Centered), mas normalmente é um custo aceitável para descobrir os pontos de perda das conexões.</p>
<p>No <a href="http://labs.jboss.com/portal/jbossas/">JBoss</a>, servidor de aplicação que eu utilizo no meu atual projeto, ligar o monitoramento é bem simples. Quando ativo, ele basicamente armazena o stack trace de todos os pontos onde temos chamadas à getConnection(), até que essa conexão sehja devolvida ao pool. Para ligar o monitoramento, altere o arquivo de configuração do seu data source(provavelmente um *-ds.xml) adicionando a linha abaixo<br />
<code>  &lt;local-tx-datasource&gt;<br />
    .....<br />
    &lt;track-statements&gt;true&lt;/track-statements&gt;<br />
  &lt;/local-tx-datasource&gt;</code></p>
<p>Agora basta acessar o mbean <a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfigCachedConnectionManager">CachedConnectionManager</a> através da interface JMX do Jboss e invocar listInUseConnections() para ver o stack trace das conexões que não foram fechadas. Provavelmente vai ser algo semelhante à <a href="http://nome-do-servidor:8080/jmx-console/HtmlAdaptor?action=invokeOpByName&#038;name=jboss.jca%3Aservice%3DCachedConnectionManager&#038;methodName=listInUseConnections">essa</a>. Se você quizer apenas ver como anda seu pool, acesse o mbean <a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossJCAPooling">ManagedConnectionPool</a>, procurando principalmente pelos seguinte valores:</p>
<ul>
<li>AvailableConnectionCount &#8211; total de conexões disponíveis no pool</li>
<li>InUseConnectionCount &#8211; total de conexões sendo usadas atualmente</li>
<li>ConnectionCount &#8211; indica o total de conexões abertas atualmente no pool</li>
</ul>
<p>Utilizando esses recursos e tendo um pouco de paciência, fica bem mais fácil achar os pontos de vazamento da aplicação.</p>
<h3>Mais informações:</h3>
<ul>
<li><a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfigDataSources">Jboss DataSources</a></li>
<li><a href="http://blogs.sun.com/kshitiz/entry/connection_leak_tracing">Connection Leak Tracing &#8211; Sun Application Server</a></li>
<li><a href="http://edocs.bea.com/wls/docs100/ConsoleHelp/pagehelp/JDBCjdbcdatasourcesjdbcdatasourceconfigdiagnosticstitle.html#jdbc.datasources.jdbcdatasourceconfigdiagnostics.profiletype_conn_leak.label">Bea WebLogic &#8211; Profile Connection Leak</a></li>
<li><a href="http://publib.boulder.ibm.com/infocenter/ieduasst/v1r1m0/index.jsp?topic=/com.ibm.iea.was_v6/was/6.0/PD/WASv6_Connection_Leak_Diagnostics/player.html">IBM Web Sphere Aplication Server &#8211; Connection Leak Diagnostics</a></li>
<li><a href="http://www.javaddicts.net/blog/index.php/2005/08/08/the-joy-of-finding-connection-leaks/">The Joy of Finding Connection Leaks</a></li>
</ul>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=158&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/04/21/connection-leak-paradise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSUnit</title>
		<link>http://plentz.org/2007/02/09/jsunit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=jsunit</link>
		<comments>http://plentz.org/2007/02/09/jsunit/#comments</comments>
		<pubDate>Sat, 10 Feb 2007 01:14:23 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/02/09/js-tambem-precisa-de-teste-unitario/</guid>
		<description><![CDATA[Depois de quebrar a cabeça por um bom tempo, descobri que após adicionar a lib Prototype ao projeto, algumas validações javascript simplesmente deixaram de funcionar. O for in, que antes funcionava corretamente, muda seu comportamento devido à magia negra que o Prototype faz, adicionando algumas propriedades extras aos objetos (e também à arrays). Se eu [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/joomanji/153911268/" title="Crash Test Anyone?"><img src="http://farm1.static.flickr.com/72/153911268_7ba3fcbdc3_m.jpg" alt="Crash Test Anyone?" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Depois de quebrar a cabeça por um bom tempo, descobri que após adicionar a lib <a href="http://prototypejs.org/">Prototype</a> ao projeto, algumas validações javascript simplesmente deixaram de funcionar. O <em>for in</em>, que antes funcionava corretamente, muda seu comportamento devido à magia negra que o <a href="http://prototypejs.org/">Prototype</a> faz, adicionando algumas propriedades extras aos objetos (e também à arrays).</p>
<p>Se eu tivesse feito uma dúzia de <a href="http://jsunit.net/">JSUnit</a>s teria evitado mais de duas horas de tempo perdido, literalmente.</p>
<p>O que antes era:</p>
<p><code>  o.isCNPJ = function(){<br />
    var d = this.split("");<br />
    var m1 = [d[0]*5,d[1]*4,d[2]*3,d[3]*2,d[4]*9,d[5]*8,d[6]*7,d[7]*6,d[8]*5,d[9]*4,d[10]*3,d[11]*2];<br />
    var s1 = 0;<br />
    for(i in m1){ s1 += m1[i]; }<br />
    var d1 = (s1%11&lt;2)?0:11-(s1%11);<br />
    var m2 = [d[0]*6,d[1]*5,d[2]*4,d[3]*3,d[4]*2,d[5]*9,d[6]*8,d[7]*7,d[8]*6,d[9]*5,d[10]*4,d[11]*3,d1*2];<br />
    var s2 = 0;<br />
    for(i in m2){ s2 += m2[i]; }<br />
    var d2 = (s2%11&lt;2)?0:11-(s2%11);<br />
    return (d1 == d[12] &#038;&#038; d2 == d[13])? true: false;<br />
  } </code></p>
<p>Teve que virar:</p>
<p><code>o.isCNPJ = function(){<br />
  var d = this.split("");<br />
  var m1 = [d[0]*10,d[1]*9,d[2]*8,d[3]*7,d[4]*6,d[5]*5,d[6]*4,d[7]*3,d[8]*2];<br />
  var s1 = 0;<br />
  for(var i=0;i < m1.length; i++){ s1 += m1[i]; }<br />
  var d1 = (s1 % 11 < 2)?0:11-(s1 % 11);<br />
  var m2 = [d[0]*11,d[1]*10,d[2]*9,d[3]*8,d[4]*7,d[5]*6,d[6]*5,d[7]*4,d[8]*3,d1*2];<br />
  var s2 = 0;<br />
  for(var i=0;i < m2.length; i++){ s2 += m2[i]; }<br />
  var d2 = (s2%11&lt;2)?0:11-(s2%11);<br />
  return (d1 == d[9] &#038;&#038; d2 == d[10])? true: false;<br />
}</code></p>
<p>Nessas horas que vemos que <a href="http://martinfowler.com/bliki/TestDrivenDevelopment.html">testes unitários</a> sempre se pagam.</p>
<p></code></p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=151&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/02/09/jsunit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Static reflection</title>
		<link>http://plentz.org/2006/11/26/static-reflection/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=static-reflection</link>
		<comments>http://plentz.org/2006/11/26/static-reflection/#comments</comments>
		<pubDate>Sun, 26 Nov 2006 10:19:49 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/11/26/static-reflection/</guid>
		<description><![CDATA[O Villela recém postou no seu blog, um pequeno recado pro pessoal do JCP, que espero que seja lido, re-lido e repassado até que alguém lá da nave-mãe veja: static reflection. A idéia seria prover alguma forma de reflexão estaticamente, algo do tipo: Foo.class.instanceMethods.bar(String.class) Ócio criativo faz bem para qualquer linguagem.]]></description>
			<content:encoded><![CDATA[<p> <a href="http://www.flickr.com/photos/sesameellis/43824225/" title="photo sharing"><img src="http://static.flickr.com/27/43824225_380ab3aee9_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>O <a href="http://lixo.org/">Villela</a> recém postou no seu blog, um pequeno recado pro pessoal do JCP, que espero que seja lido, re-lido e repassado até que alguém lá da nave-mãe veja: <a href="http://www.lixo.org/archives/2006/09/25/java-feature-request-static-reflection/">static reflection</a>. A idéia seria prover alguma forma de reflexão estaticamente, algo do tipo:</p>
<p><code>Foo.class.instanceMethods.bar(String.class)</code></p>
<p>Ócio criativo faz bem para qualquer linguagem.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=145&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/11/26/static-reflection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hot Swap</title>
		<link>http://plentz.org/2006/11/26/hot-swap/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hot-swap</link>
		<comments>http://plentz.org/2006/11/26/hot-swap/#comments</comments>
		<pubDate>Sun, 26 Nov 2006 10:15:29 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/11/26/hot-swap/</guid>
		<description><![CDATA[Segundo a Wikipedia, Hot swapping can also refer to the ability to alter the running code of a program without having to interrupt its execution, although only a few languages support it. Those that do include Lisp, Erlang, and Smalltalk. The Java programming language also supports this technology, but only through the Java Platform Debugger [...]]]></description>
			<content:encoded><![CDATA[<p> <a href="http://www.flickr.com/photos/flowerchild75/306731577/" title="photo sharing"><img src="http://static.flickr.com/100/306731577_7ee75adf7f_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Segundo a <a href="http://en.wikipedia.org/wiki/Hot_swap">Wikipedia</a>,</p>
<blockquote><p>Hot swapping can also refer to the ability to alter the running code of a program without having to interrupt its execution, although only a few languages support it. Those that do include <a href="http://en.wikipedia.org/wiki/Lisp_programming_language" title="Lisp programming language">Lisp</a>, <a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29" title="Erlang (programming language)">Erlang</a>, and <a href="http://en.wikipedia.org/wiki/Smalltalk_%28programming_language%29" title="Smalltalk (programming language)">Smalltalk</a>. The <a href="http://en.wikipedia.org/wiki/Java_programming_language" title="Java programming language">Java programming language</a> also supports this technology, but only through the <a href="http://en.wikipedia.org/wiki/JPDA" title="JPDA">Java Platform Debugger Architecture (JPDA)</a>&nbsp;: it is only possible to change the code while the program is in the control of a <a href="http://en.wikipedia.org/wiki/Debugger" title="Debugger">Debugger</a>. <a href="http://en.wikipedia.org/wiki/Interactive_programming" title="Interactive programming">Interactive programming</a> is a paradigm that makes extensive use of hot swapping so that the programming activity becomes part of the program flow itself.</p>
</blockquote>
<p>O post do <a href="http://nullability.org/">Daniel</a> (<a href="http://nullability.org/?p=70">Hot Code Replacement</a>), contando como fazer hot swap de classes com o <a href="http://www.oracle.com/technology/tech/java/oc4j/index.html">OC4J</a>, me fez pensar numa coisa: será que realmente são poucos que conhecem a “feature” de trocar classes em tempo de execução, sem parar sua aplicação, e nem a VM?</p>
<p>Bom, mesmo sem ter 1/3 de conhecimento sobre VMs que o <a href="http://www.kumpera.net/blog">Rodrigo</a> (louds), por exemplo, vou tentar explicar. Parada para comentário de utilidade pública: se você não assina o blog dele, faça um favor a si mesmo e <a href="http://www.kumpera.net/blog">vai lá</a>. Hoje mesmo <a href="http://www.kumpera.net/blog/index.php/2006/09/15/rapidinhas/">ele anunciou</a> que vai liberar os fontes da máquina virtual que ele começou a desenvolver. </p>
<p>Voltando ao assunto, desde a <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jpda/enhancements.html#hotswap">JDK 1.4</a> (sim, hot swap é relativamente velho), é possível trocar a implementação de métodos sem reiniciar a aplicação. Notem bem, implementação, ou seja, se você trocou qualquer coisa na assinatura de um método, criou algum novo, adicionou uma variável de instância da classe, você precisa parar a VM, compilar a classe, e iniciar novamente.</p>
<p>No entando, linguagens dinâmicas, como <a href="http://www.ruby-lang.org/en/">Ruby</a> (com site novo), permitem trocar trocar <strong>qualquer coisa</strong> das suas classes em tempo de execução, seja métodos, atributos, whatever. Parece covardia comparar, né?</p>
<p>Porém, lendo um pouco mais à respeito, fazer com que a JVM suporte isso também é perfeitamente possível tecnicamente (louds!!), mas precisariam ser feitas enormes mudanças no seu funcionamento, e acredito que seja esse, um dos principais motivos de não terem feito nos primórdios do hot swap &#8211; JDK 1.4.</p>
<p>O assunto parece estar realmente chamando ateção, pois acabou de sair um artigo no Artima, <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=176597">The JVM as an (Un)Common Language Runtime</a>, e um dos pontos que o autor destaca como sendo um dos principais desafios para a implementação de linguagens dinâmicas na JVM:</p>
<blockquote><p><strong>Hotswapping</strong>: The main idea is to allow code changes on the fly, while they are running. The full capability of hotswapping implies any kind of change to be supported, addition/modification/removal of methods and attributes including changes in inheritance hierarchy.</p>
</blockquote>
<p>Se isso não fosse suficiente, existe um tópico na SDN, <a href="http://forum.java.sun.com/thread.jspa?forumID=47&amp;threadID=572396">Hotswap support for schema / shape changes</a> discutindo o assunto, e o bug report <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4910812">4910812 &#8211; Enhance Hot Code Replacement</a> com 300+ votos.</p>
<p>Isso permitiria baixar para praticamente zero o turnaround de desenvolivmento de aplicações, dando um grande fôlego para Java como linguagem, pois já aumentaria significantemente a velocidade de desenvolvimento, evitando a perda de minutos que já estamos acostumados entre parar servidor de aplicação, fazer re-deploy, iniciar aplicação, …</p>
<blockquote><p>Classloader tricks only take you so far.</p>
</blockquote>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=143&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/11/26/hot-swap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Domain specific languages</title>
		<link>http://plentz.org/2006/04/23/domain-specific-languages/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=domain-specific-languages</link>
		<comments>http://plentz.org/2006/04/23/domain-specific-languages/#comments</comments>
		<pubDate>Sun, 23 Apr 2006 08:03:16 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/04/23/domain-specific-languages/</guid>
		<description><![CDATA[Uma linguagem de programação deve seguir algumas premissas importantes: ajudar o desenvolvedor à resolver problemas de forma simples e tornar o desenvolvimento o mais agradável e produtivo possível. A escolha de uma linguagem de programação apropriada pode reduzir drasticamente o custo da construção de novas aplicações, como também na sua manutenção. Uma linguagem de programação [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/felixmeyer/224393430/" title="Faster surfing with DSL"><img src="http://farm1.static.flickr.com/90/224393430_03350012e0_m.jpg" alt="Faster surfing with DSL" height="159" width="240"  style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>Uma linguagem de programação deve seguir algumas premissas importantes: ajudar o desenvolvedor à resolver problemas de forma <b>simples</b> e tornar o desenvolvimento o mais agradável e produtivo possível. A escolha de uma linguagem de programação apropriada pode reduzir drasticamente o custo da construção de novas aplicações, como também na sua manutenção. Uma linguagem de programação eficiente pode aumentar incrivelmente a produtividade de um programador, permitindo que ele escreva código mais escalonável, genérico, legível e de fácil manutenção.</p>
<p>Linguagens não são somente ferramentas para comunicação. Mais que isso, são ferramentas para pensar, que influenciam na forma que as pessoas pensam. As linguagens de programação, assim como as outras linguagens naturais, tem o propósito de estabelecer uma comunicação – neste caso, entre o programador e o computador.</p>
<p>Uma DSL (<em>Domain specific language</em>) é uma linguagem dedicada à resolver uma problema específico, ou melhor, um problema referente à um domínio (seja ele uma área de negócio ou uma necessidade não funcional). Por ter esta característica de se aproximar mais do problema, uma DSL tende a trazer mais benefícios que em uma GPL (<em>General Purpose Language</em>), deixando o programador à vontade para se preocupar somente (ou o máximo possível) em resolver problemas ligados ao negócio – e não em atender necessidades do compilador.</p>
<blockquote><p>&#8220;Programming focuses on <strong>what</strong> to compute as opposed to <strong>how</strong> to compute.&#8221;</p></blockquote>
<p>Mais que isso, novas DSL&#8217;s podem ser usadas para melhorar aspectos da engenharia de software: domain-specific analysis, testes, manutenção, modelagem e rápida prototipação. O próprio desenvolvimento de uma DSL já é uma tarefa significante de engenharia de software, necessitando de considerável investimento de tempo e recursos, pois exige do desenvolvedor tanto conhecimento do domínio, quanto expertise para o desenvolvimento de uma linguagem. Poucos possuem ambos.</p>
<p>DSL&#8217;s vem sendo usadas em várias áreas como: computação gráfica, sistemas financeiros, protocolos, sistemas operacionais, robot languages, etc. Estas aplicações tem mostrado claramente vantagens das DSL&#8217;s sobre as GPL&#8217;s no que diz respeito à produtividade, confiabilidade e flexibilidade no domíno em questão. Alguns exemplos de DSL&#8217;s conhecidas são: SQL (database queries), HTML (hypertext web pages), Make (software building), Excel (spreadsheets), VHDL (hardware design).</p>
<p>Para praticamente qualquer implementação de um problema lógico existe um design pattern no qual ele se encaixa. A criação de uma DSL não é exceção: existem basicamente <a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4">oito design patterns</a> que abordam a implementação de uma DSL:</p>
<ul>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.1">Piggyback</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.2">Pipeline</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.3">Lexical Processing</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.4">Language Extension</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.5">Language Specialisation</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.6">Source to source transformation</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.7">Data Structure Representation</a></li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html#tth_sEc4.8">System Front-End</a></li>
</ul>
<p>Estes oito design patterns podem ser redistribuídos em três grupos maiores:</p>
<ul>
<li><strong>Domain-specific libraries / embedded languages</strong>: são provavelmente as DSL&#8217;s mais comuns. Nessa abordagem, ao invés de criar uma nova linguagem, com um compilador/interpretador, utiliza-se de uma GPL e cria-se extensões que atendam ao domínio em forma de funções e library&#8217;s, por exemplo.
</li>
<li><strong>Preprocessing / macro processing</strong>: nesta abordagem, basicamente são feitas &#8220;traduções&#8221; das sentenças da DSL para uma linguagem base por um preprocessasor. A principal vantagem desta abordagem é a simplicadade. Em contrapartida, a desvantagem é que o feedback para o usuário da DSL é obtido à nível da linguagem base ou mesmo em tempo de execução.</li>
<li><strong>Extensible compiler / interpreter</strong>: segue praticamente a mesma linha da anterior, mas com a vantagem que a fase de preprocessamento é integrada com o compilador.</li>
</ul>
<p>A definição de DSL em si, já se encaixa em um <a href="http://en.wikipedia.org/wiki/Gang_of_Four_(software)">GOF Design Pattern</a>: <a href="http://home.earthlink.net/~huston2/dp/interpreter.html">Interpreter</a>. As DSL&#8217;s também podem ser chamadas de litle languages, micro languages ou mesmo application languages.</p>
<p>Talvez você esteja se perguntando agora: &#8220;mas o que diferencia uma API de uma DSL?&#8221;. Para mim esta linha não está totalmente clara, porque você não poderia dizer : &#8220;se sua API contém menos que N aspectos que não são escíficos do domínio, então ela é uma DSL&#8221;.</p>
<p>DSL&#8217;s são abstrações. Você pode criar DSL&#8217;s melhores em linguagens(embedded DSL&#8217;s nesse caso) que provêm melhores maneiras de abstração. Algumas linguagens como Python, Ruby, Smalltalk e Lisp possuem um histórico bem sucedido na criação de DSL&#8217;s devido à sua simplicidade.</p>
<p>Como puderam ver, as DSL&#8217;s oferecem duas principais vantagens: granho de produtividade para o programador oferecendo facilitadores para a resolução dos problemas e provendo uma forma de aproximação entre o time de desenvolvimento e os conhecedores do domínio.</p>
<blockquote><p>Programming should be fun. Humans, should take care of human business and machines should take care of their side. &#8211; Yukihiro &#8220;Matz&#8221; Matsumoto</p></blockquote>
<p>Leia mais em:</p>
<ul>
<li><a href="http://jamis.jamisbuck.org/articles/2006/04/20/writing-domain-specific-languages">Writing Domain Specific Languages</a>, Jamis Buck</li>
<li><a href="http://peripateticaxiom.blogspot.com/2006/04/keywords-magic-and-edsls.html">Keywords, Magic and (E)DSLs</a>, Keith Braithwaite</li>
<li><a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">Domain Specific Language</a>, Martin Fowler</li>
<li><a href="http://homepages.cwi.nl/~arie/papers/dslbib/">Domain-Specific Languages: An Annotated Bibliography</a></li>
<li><a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language">Domain-specific programming language</a>, Wikipedia</li>
<li><a href="http://www.martinfowler.com/articles/languageWorkbench.html">Language Workbenches: The Killer-App for Domain Specific Languages?</a>, Martin Fowler</li>
<li><a href="http://www.dmst.aueb.gr/dds/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html">Notable Design Patterns for Domain-Specific Languages</a>, Diomidis Spinellis</li>
</ul>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=137&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/04/23/domain-specific-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coding is poetry</title>
		<link>http://plentz.org/2006/04/21/coding-is-poetry/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=coding-is-poetry</link>
		<comments>http://plentz.org/2006/04/21/coding-is-poetry/#comments</comments>
		<pubDate>Sat, 22 Apr 2006 00:19:17 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/04/21/coding-is-poetry/</guid>
		<description><![CDATA[irb(main):001:0&#62; def question? irb(main):002:1&#62; bb &#124;&#124; !bb irb(main):003:1&#62; end =&#62; shakespeare]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/tatianacardeal/86270932/" title="pagan poetry III"><img src="http://farm1.static.flickr.com/9/86270932_0ac918ce1f_m.jpg" alt="pagan poetry III" height="240" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>
<blockquote>
irb(main):001:0&gt; def question?<br />
irb(main):002:1&gt;   bb || !bb<br />
irb(main):003:1&gt; end<br />
=&gt; shakespeare
</p></blockquote>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=138&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/04/21/coding-is-poetry/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
