<?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; java</title>
	<atom:link href="http://plentz.org/tag/java/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>Bad, bad class. No donut for you</title>
		<link>http://plentz.org/2008/12/30/bad-bad-class-no-donut-for-you/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=bad-bad-class-no-donut-for-you</link>
		<comments>http://plentz.org/2008/12/30/bad-bad-class-no-donut-for-you/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 13:44:32 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=238</guid>
		<description><![CDATA[Provavelmente quem já desenvolve em java à algum tempo, já passou por esse problema: UnsupportedClassVersionError. Ele acontece basicamente quando tentamos executar um .class compilado com uma versão superior à da JVM que estamos tentando executar (exemplo: rodar um .class compilado com java 1.6 em uma jvm 1.5). Hoje pela manhã estava enfrentando esse problema e [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/keesssss/2717166295/" title="BAD by !.keesssss.!"><img src="http://farm4.static.flickr.com/3213/2717166295_170710fee9_m.jpg" alt="BAD by !.keesssss.!" class="pc_img" height="150" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a><br />
Provavelmente quem já desenvolve em java à algum tempo, já passou por esse problema: <a href="http://java.sun.com/javase/6/docs/api/java/lang/UnsupportedClassVersionError.html">UnsupportedClassVersionError</a>. Ele acontece basicamente quando tentamos executar um .class compilado com uma versão superior à da JVM que estamos tentando executar (exemplo: rodar um .class compilado com java 1.6 em uma jvm 1.5). Hoje pela manhã estava enfrentando esse problema e não conseguia de jeito nenhum entender o porque.</p>
<p><code>java.lang.UnsupportedClassVersionError: Bad version number in .class file</code></p>
<p>Após decompilar uma classe (aproveitando, usei o <a href="http://java.decompiler.free.fr/">JD-GUI</a> que funcionou bem no MacOS) que estava rodando no servidor (e *MEH* eu não tinha o fonte), alterar, recompilar na minha máquina e jogar de volta pro servidor, comecei a receber a mensagem de erro. Após revisar todas as configurações do Eclipse (Java Compiler específico no projeto, JRE System Library correto) continuei recebendo o mesmo erro.</p>
<p>Depois de procurar muito, descobri que mesmo alterando todas as configurações no Eclipse, na pasta do projeto ainda ficou um arquivo configurado pra java 6.0. Então se enfrentar o mesmo problema, procure pelo arquivo:</p>
<p><code>$PROJECT_ROOT/.settings/org.eclipse.jst.common.project.facet.core.prefs</code></p>
<p>E edite alterando a JRE para a correta para o seu projeto.</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=238&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2008/12/30/bad-bad-class-no-donut-for-you/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tomcat is deprecated</title>
		<link>http://plentz.org/2008/10/03/tomcat-is-deprecated/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tomcat-is-deprecated</link>
		<comments>http://plentz.org/2008/10/03/tomcat-is-deprecated/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 17:29:38 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[outofmemory]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=204</guid>
		<description><![CDATA[Tomcat is deprecated. Use Jetty instead. É exatamente esse a impressão que eu tenho depois de migrar os nossos servidores para o Jetty. Depois de ver muita gente reclamando de OutOfMemory no Tomcat, inclusive aqui da empresa, resolvemos tentar o Jetty. A tempo que escutava o pessoal da Caelum (e principalmente o Kung) falando bem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/hockeylover/2870581459/" title="Marky is frustrated by Hockey.Lover"><img src="http://farm4.static.flickr.com/3185/2870581459_59a7e18b58_m.jpg" alt="Marky is frustrated by Hockey.Lover" class="pc_img" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a><br />
<a href="http://tomcat.apache.org/">Tomcat</a> is deprecated. Use <a href="http://www.mortbay.org/jetty/">Jetty</a> instead.</p>
<p>É exatamente esse a impressão que eu tenho depois de migrar os <a href="http://www.criterium.com.br">nossos servidores</a> para o Jetty. Depois de ver <strong>muita</strong> gente reclamando de <a href="http://wiki.apache.org/tomcat/OutOfMemory">OutOfMemory</a> no Tomcat, inclusive <a href="http://www.criterium.com.br">aqui da empresa</a>, resolvemos tentar o Jetty.</p>
<p>A tempo que escutava o pessoal da <a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">Caelum</a> (e principalmente o <a href="http://fabiokung.com/">Kung</a>) falando bem do Jetty, mas só quando se começa a usar que se percebe as vantagens. Como temos várias aplicações rodando (diferente do <a href="http://guj.com.br">GUJ</a>, que era só o <a href="http://www.jforum.net/">JForum</a>, acredito), imaginei que a troca não seria tão smooth <a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">assim</a>.</p>
<p>Claro que antes de sair trocando tudo, fizemos alguns testes pra ter certeza que tudo ia ocorrer bem. Por sinal, a troca foi <strong>bem</strong> tranquila do ponto de vista da aplicação, só tivemos que fazer alguns ajustes:</p>
<ul>
<li>o Jetty lança <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#unmodifiableMap(java.util.Map)">java.util.Collections$UnmodifiableMap</a> ao tentar modificar diretamente o (Hash)Map devolvido com <a href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getParameterMap()">request.getParameterMap()</a> ao invés de usar o método setAttribute() do request &#8211; coisa que o Tomcat deixa;</li>
<li>Diferenças ao tentar recuperar um resource do sistema utilizando como pasta base &#8220;.&#8221;, ou usar &#8220;..&#8221; pra navegar na estrutura de pastas. Para resolver, basta usar como pasta base &#8220;/&#8221; (ex: &#8220;/com/foo/resources/xpto.xml&#8221;) e colocar dentro do WEB-INF/classes;</li>
<li>E a última, mas simples de resolver, é que o Jetty deixa habilitado listagem de diretórios. Você pode alterar isso no etc/webdefault.xml, trocando o atributo dirAllowed para false;</li>
</ul>
<p>Feitos esses ajustes, chegou a vez de configurar o Jetty para atender aos diferentes domínios. E é aqui que vi uma das grandes vantagens do Jetty. A parte de configuração dele fica <strong>muito</strong> organizada. Fizemos da seguinte forma:</p>
<ul>
<li>Para cada aplicação (pra cada .war na pasta /webapps do Jetty), criamos um arquivo de contexto no /contexts (não é necessário, mas como temos urls diferentes e contextos diferentes, tivemos que customizar &#8211; e acabamos ganhando um brinde que conto depois)</li>
<li>Cada arquivo de context tem uma estrutura estupidamente simples:
<p><code><br />
&lt;?xml version="1.0"  encoding="ISO-8859-1"?&gt;<br />
&lt;!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"&gt;<br />
&lt;Configure class="org.mortbay.jetty.webapp.WebAppContext"&gt;<br />
&nbsp;&nbsp;&lt;Set name="contextPath"&gt;/&lt;/Set&gt;<br />
&nbsp;&nbsp;&lt;Set name="war"&gt;&lt;SystemProperty name="jetty.home" default="."/&gt;/webapps/demo_foo.war&lt;/Set&gt;<br />
&nbsp;&nbsp;&lt;Set name="defaultsDescriptor"&gt;&lt;SystemProperty name="jetty.home" default="."/&gt;/etc/webdefault.xml&lt;/Set&gt;<br />
<br />
&nbsp;&nbsp;&lt;Set name="virtualHosts"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Array type="String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Item&gt;demo.foo.com&lt;/Item&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Array&gt;<br />
&nbsp;&nbsp;&lt;/Set&gt;<br />
<br />
&lt;/Configure&gt;<br />
</code>
</li>
</ul>
<p>Explicando por partes:</p>
<ul>
<li><a href="http://docs.codehaus.org/display/JETTY/ContextDeployer">WebAppContext</a> é o tipo de contexto que você vai usar, estamos usando esse pois permite o hotdeploy</li>
<li>contextPath serve para dizer (óbvio) o contexto que quer que a aplicação fique disponível. Aqui prefirimos colocar todas no contexto / e configurar diferentes <a href="http://docs.codehaus.org/display/JETTY/Virtual+hosts">Virtual Hosts</a> pra cada aplicação.</li>
<li>a propriedade war só diz qual .war (que pode ser um exploded war também) que vai ser <em>deployado</em> naquele contexto</li>
<li>na seção que diz <a href="http://docs.codehaus.org/display/JETTY/Virtual+hosts">virtualHosts</a>, você pode configurar todos os endereços que quer que sua aplicacão responda. Para ela aceitar mais de um endereço, basta ir adicionando Item&#8217;s com as outras URLs. Aproveitando, no Jetty 7 será possível <a href="http://jira.codehaus.org/browse/JETTY-721">usar wildcards</a>!</li>
</ul>
<p>Com isso feito, ficou <strong>muito</strong> fácil configurar o deploy automático de todas nossas aplicações, pois basta substituir o arquivo .war e dar um <a href="http://en.wikipedia.org/wiki/Touch_(Unix)">touch</a> no arquivo de contexts que o Jetty faz reload do contexto (e esse é o brinde! )! Agora, com o Jetty combinado ao <a href="https://hudson.dev.java.net/">Hudson</a>, com um clique podemos fazer deploy de qualquer uma das nossas aplicações em um ambiente específico ou mesmo em todos, <strong>automaticamente</strong>. Mas <a href="https://hudson.dev.java.net/">isso</a> já é assunto para um outro post.</p>
<p></p>
<h3>Links Relacionados</h3>
<ul>
<li><a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">Melhorando o GUJ: Jetty, NIO e load balancing</a></li>
<li><a href="http://docs.codehaus.org/display/JETTY/Jetty+Documentation">Jetty Documentation</a></li>
<li></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=204&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2008/10/03/tomcat-is-deprecated/feed/</wfw:commentRss>
		<slash:comments>12</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>Vote for Eclipse!</title>
		<link>http://plentz.org/2007/04/12/vote-for-eclipse/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=vote-for-eclipse</link>
		<comments>http://plentz.org/2007/04/12/vote-for-eclipse/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 07:04:11 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/04/12/vote-for-eclipse/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href=""http://flickr.com/photos/silvia31163/250444001/" title="today i wear my sunday hat :)"><img src="http://farm1.static.flickr.com/83/250444001_6beae1b1a6_m.jpg" alt="today i wear my sunday hat :)" height="170" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Quem lê meu blog já à algum tempo, sabe que eu <a href="http://plentz.org/2005/02/27/eclipsed/">uso o Eclipse</a> como principal ferramenta de trabalho. O que poucos sabem é que todos podem colaborar nas decisões do projeto, e de quebra, priorizar as correções de bugs e melhorias. Pra dar um empurrãozinho nos preguiçosos, segue minha lista atual de votos.</p>
<h3>Community</h3>
<ul>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=71735">71735</a> &#8211; Eclipse source repository should convert to subversion. </li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177497">177497</a> &#8211; Bug status explanation page does not mention RESOLVED REMIND</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178923">178923</a> &#8211; Remove LATER and REMIND resolutions when Bugzilla 3.0 is released</li>
</ul>
<h3>JDT</h3>
<ul>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182064">182064</a> &#8211; Should be possible to &#8220;Migrate JAR File&#8221; in User Libraries  </li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182071">182071</a> &#8211; [1.5][compiler] Unnecessary cast detection fails on ternary operation</li>
</ul>
<h3>Platform</h3>
<ul>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=2009">2009</a> &#8211; [EditorMgmt] Need to sort out handling of out-of-synch resources (1GDFD96)</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=8009">8009</a> &#8211; [Editor Mgmt] Split File Editor</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=14916">14916</a> &#8211; [Navigator] How can I recover from a &#8220;resource is out of sync&#8221; problem ?</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=19419">19419</a> &#8211; [resources] Cancellation during file transfer leaves files out-of-sync</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=35973">35973</a> &#8211; [resources] Better project organization</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=46207">46207</a> &#8211; [Workbench] [Services] Combine, compose, nest workbenchparts and editorparts</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=52338">52338</a> &#8211; [find/replace] regex replace with newline doesn&#8217;t insert anything</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=92250">92250</a> &#8211; [Workbench] Excessive amount of Permanent Generation memory reported by the VM</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102527">102527</a> &#8211; [Wizards] Add support for projects refactoring (ie add/remove nature)</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118294">118294</a> &#8211; Renaming an External Tool Builder (set to run during Auto Builds) causes error</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134416">134416</a> &#8211; &#8220;Run As..&#8221; &#8211; &#8220;Ant Build&#8221; results in &#8220;Unable to find ant file to run&#8221;</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142364">142364</a> &#8211; Replacing a large number of files hangs Eclipse</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163714">163714</a> &#8211; Update manager interactively asks for mirror selection</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167660">167660</a> &#8211; Out of sync not refreshed after file is closed</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169121">169121</a> &#8211; cpu get &gt;50 when I did refactor to a method</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169386">169386</a> &#8211; [Edit] Local side of java compare should be more like java editor</li>
</ul>
<h3>Web Tools</h3>
<ul>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95450">95450</a> &#8211; add extract include file for JSP source refactoring</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100511">100511</a> &#8211; JavaScript refactoring and better code complete</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107052">107052</a> &#8211; jsp editor error if jsp is under a subdirectory</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119334">119334</a> &#8211; [jsp20] jsp:directive.tag import= list not recognized in .tagx XML tag files</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124288">124288</a> &#8211; [Plan] Improve JSP 2.0 support</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124796">124796</a> &#8211; [refactoring] moving a servlet is not reflected in web.xml  </li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136850">136850</a> &#8211; JSTL Code Assist from imported projects.</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157465">157465</a> &#8211; jsp fragment does not see any variables/tags from its parent</li>
<li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168538">168538</a> &#8211; &#8220;Convert to a Dynamic Web Project&#8221; should work for Java projects</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=157&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/04/12/vote-for-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate com PostGIS</title>
		<link>http://plentz.org/2007/03/28/hibernate-com-postgis/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hibernate-com-postgis</link>
		<comments>http://plentz.org/2007/03/28/hibernate-com-postgis/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 03:06:21 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[postgis]]></category>
		<category><![CDATA[postgre]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/03/28/hibernate-com-postgis/</guid>
		<description><![CDATA[Uns meses atrás tive um problema com o uso do Hibernate, em um caso um tanto quanto incomum: o projeto usava Ingres, um banco de dados muito pouco usado, e com algumas particularidades idiotas (sendo gentíl com eles). O tipo responsável por armazenar as datas no Ingres, diferentemente de todos os outros bancos que já [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/supriya/86805710/" title="Green pentagons"><img src="http://farm1.static.flickr.com/40/86805710_dbe9c536bf_m.jpg" alt="Green pentagons" height="180" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>Uns meses atrás tive um problema com o uso do <a href="http://hibernate.org/">Hibernate</a>, em um caso um tanto quanto incomum: o projeto usava <a href="http://www.ingres.com/">Ingres</a>, um banco de dados muito pouco usado, e com algumas particularidades idiotas (sendo gentíl com eles). O tipo responsável por armazenar as datas no Ingres, diferentemente de todos os outros bancos que já vi, aceita três &#8220;estados&#8221; nas colunas de data: uma data (óbvio), null, <strong>&#8221;</strong> &#8211; sim, uma <em>empty string</em>.</p>
<p>Com isto, eu não poderia usar as classes padrão para datas no Java, acabei criando uma classe Data para tratar desses estados. Como o tipo foi criado por mim, o Hibernate não oferece nada pronto (por razões óbvias), tive que achar uma alternativa.</p>
<p>Lendo um pouco <a href="http://hibernate.org/hib_docs/v3/reference/en/html_single/">a referência</a>, mais especificamente o capítulo <a href="http://hibernate.org/hib_docs/v3/reference/en/html_single/#mapping-types-custom"><em>Custom value types</em></a>, descobri que para esses casos especiais, onde muitos já apelariam para alguma forma menos ortodoxa, o Hibernate oferece um mecanismo muito poderoso : os <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/usertype/UserType.html">UserTypes</a>.</p>
<p>Um UserType é basicamente uma interface que permite a implementação de como um determinado tipo será recuperado e persistido no seu banco de dados. Este recurso é extremamente útil e me salvou graciosamente.</p>
<p>E porque estou escrevendo isso tudo? Recebi hoje uma dúvida bem interessante por mensagem privada no <a href="http://guj.com.br">GUJ</a>. O usuário perguntava se haveria possibilidade de usar Hibernate em conjunto com o banco <a href="http://postgis.refractions.net/">PostGIS</a> &#8211; focado em armazenar dados geométricos.</p>
<p>O principal desafio é como mapear os dados que são armazenados em Geometry, como são chamados os tipos geométricos no PostGIS. Como não existe nenhum tipo nativo do Java que seria correspondente (e nem a especificação do <a href="http://java.sun.com/javase/technologies/database/">JDBC</a> preve isso &#8211; tipos clob, lobs e variantes não contam!), o trabalho pode ser um pouco mais complicado que se imagina.</p>
<p>Dando uma pesquisada, acabei encontrado uma thread da lista de users do PostGIS que trata exatamente disso. <a href="http://www.nabble.com/PostGIS---hibernate---EJB3-t2064211.html">Nela</a> é apresentada uma solução elegante para o tratamento dos tipos no Hibernate &#8211; e que acabou virando parte do projeto. <a href="http://postgis.com/support/wiki/index.php?SpatialEJB3">SpatialEJB3</a> nada mais é que um UserType (<a href="http://svn.refractions.net/postgis/trunk/java/ejb3/src/org/postgis/hibernate/GeometryType.java">GeometryType</a> no caso) com a implementação responsável por tratar o tipo Geometry. Ele pode ser usadao tanto com Hibernate puro, quanto para EJB3. Só achei estranho que as classes ainda não estão no <a href=" http://postgis.refractions.net/download/postgis.jar">postgis.jar</a>.</p>
<p>Para usar o recurso, fica extremamente simples:</p>
<p><code>        @Type(type = "org.postgis.hibernate.GeometryType")<br />
        public Geometry getLocation(){<br />
                return location;<br />
        }</code></p>
<p>No site é possível encontrar a <a href="http://svn.refractions.net/postgis/trunk/java/ejb3/ejb3spatial.pdf">documentação do projeto</a>.</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=156&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/03/28/hibernate-com-postgis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hibernate: save() ou persist()?</title>
		<link>http://plentz.org/2007/02/13/hibernate-save-ou-persist/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hibernate-save-ou-persist</link>
		<comments>http://plentz.org/2007/02/13/hibernate-save-ou-persist/#comments</comments>
		<pubDate>Tue, 13 Feb 2007 15:28:43 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://plentz.org/2007/02/13/hibernate-save-ou-persist/</guid>
		<description><![CDATA[Por mais vasta que a documentação do Hibernate seja, sempre ficam pontos da API que precisam de melhorias na documentação. Um exemplo claro disso é esclarecer qual a diferença entre dois métodos da Session, o save() e o persist(). Ambos tem a mesma função: tornar uma instância transient em persistent. Segundo a doc da API: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/junieleong/195873892/" title="Hibernating Koala Bear"><img src="http://farm1.static.flickr.com/57/195873892_ea748faa3b_m.jpg" alt="Hibernating Koala Bear" height="180" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>Por mais vasta que a documentação do <a href="http://hibernate.org">Hibernate</a> seja, sempre ficam pontos da API que precisam de melhorias na documentação. Um exemplo claro disso é esclarecer qual a diferença entre dois métodos da <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html">Session</a>, o <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#save(java.lang.Object)">save()</a> e o <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#persist(java.lang.Object)">persist()</a>. Ambos tem a mesma função: tornar uma instância transient em persistent. Segundo a doc da API:</p>
<ul>
<li><em>persist()</em> &#8211; Make a transient instance persistent.</li>
<li><em>save()</em> &#8211; Persist the given transient instance, first assigning a generated identifier.</li>
</ul>
<p>O método persist(), não garante que será atribuito um id à instância imediatamente, sendo que a associação ocorrerá quando o <a href="http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-flushing">flush</a> ocorrer. Além disso, ele garante que só irá executar um insert se estiver dentro do contexto de uma transaction. Já o save(), atribui a chave imediatamente, não importando se isso exige um insert (no caso do <a href="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#mapping-declaration-id-generator">identity generator</a>) ou se existe um contexto de transação. Isso explica também porque o save() retorna o Id gerado e o persist() é void.</p>
<p>Mais informações podem ser encontradas no <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1273">Jira</a> e no <a href="http://forum.hibernate.org/viewtopic.php?t=951275">fórum</a> do Hibernate.</p>
<p><em>update</em>: não é somente eu que acha que a documentação precisa de melhorias nesse caso: <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682">HHH-1682</a></p>
<p><em>update 2</em>: acabei de comitar a alteração na documentação, para a próxima versão do Hibernate (3.2.5), a seção <a href="http://www.hibernate.org/hib_docs/reference/en/html/objectstate.html#objectstate-makingpersistent">Making objects persistent</a> irá trazer informações mais detalhadas sobre a diferença entre os dois métodos.</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=153&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2007/02/13/hibernate-save-ou-persist/feed/</wfw:commentRss>
		<slash:comments>7</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>Code contest #1</title>
		<link>http://plentz.org/2006/03/29/code-contest-1/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=code-contest-1</link>
		<comments>http://plentz.org/2006/03/29/code-contest-1/#comments</comments>
		<pubDate>Thu, 30 Mar 2006 02:07:41 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[Unsorted]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[coldfusion]]></category>
		<category><![CDATA[vb]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/03/29/code-contest-1-google-im-feeling-lucky/</guid>
		<description><![CDATA[Google I&#8217;m Feeling Lucky: fazer uma requisição para http://www.google.com.br, pesquisando pelo nome da linguagem(java,ruby,&#8230;). Exibir como retorno o endereço, título e descrição do primeiro resultado encontrado. Ruby (meu): require 'open-uri' open('http://www.google.com.br/search?q=ruby').read =~ %r{class=l href="(.*?)"&#62;(.*?)&#60;/a.*?j&#62;&#60;font.*?&#62;(.*?)&#60;br&#62;&#60;}m puts ($2 + "\n" + $1 + "\n" + $3 + "\n").gsub(/&#60;.*?\&#62;/, '') Java (do Giuliano, bastante melhorada depois pelo Urubatan): [...]]]></description>
			<content:encoded><![CDATA[<p>Google I&#8217;m Feeling Lucky: fazer uma requisição para <a href="http://www.google.com.br">http://www.google.com.br</a>, pesquisando pelo nome da linguagem(java,ruby,&#8230;). Exibir como retorno o endereço, título e descrição do primeiro resultado encontrado.</p>
<p>Ruby (meu):</p>
<pre>require 'open-uri'
open('http://www.google.com.br/search?q=ruby').read =~ %r{class=l href="(.*?)"&gt;(.*?)&lt;/a.*?j&gt;&lt;font.*?&gt;(.*?)&lt;br&gt;&lt;}m
puts ($2 + "\n" + $1 + "\n" + $3 + "\n").gsub(/&lt;.*?\&gt;/, '')</pre>
<p>Java (do Giuliano, bastante melhorada depois pelo <a href="http://www.urubatan.com.br/">Urubatan</a>):</p>
<pre>
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class HTTPSample {
       public static void main(String[] args) throws Exception {
               URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
               con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
               Scanner sc = new Scanner(con.getInputStream());
               System.out.println(sc.findWithinHorizon("&lt;a&gt;.*?&lt;/a&gt;", 0).replaceAll("&lt;a&gt;(.*?)&lt;/a&gt;", "$2=$1").replaceAll("", ""));
       }
}</pre>
<p>PHP (do <a href="http://charles.pilger.com.br/">Pilger</a>, com ajuste do <a href="http://fmeyer.org/">Fernando</a>):</p>
<pre>&lt;?php
  $html = implode('', file('http://www.google.com.br/search?q=php'));
  preg_match_all("|class=l href=\"(.*?)\"&gt;(.*?)&lt;/a.*?j&gt;&lt;font.*?&gt;(.*?)&lt;br&gt;&lt;|", $html, $out, PREG_SET_ORDER);
  echo $out[0][1]." ".$out[0][2]." ".$out[0][3];
?&gt;</pre>
<p>Python (do Salviato):</p>
<pre> import urllib
 import re

 class AppURLopener(urllib.FancyURLopener):
   version = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1"

 urllib._urlopener = AppURLopener()

 html = urllib.urlopen('http://www.google.com.br/search?q=python').read()
 out = re.search('class=l href="(.*?)"&gt;(.*?)&lt;/a.*?j&gt;&lt;font.*?&gt;(.*?)&lt;br&gt;&lt;', html, re.DOTALL)
 print re.sub('&lt;.*?&gt;', '', (out.group(1) + '\n' + out.group(2) + '\n' + out.group(3)))</pre>
<p>TCl/TK (do Salviato):</p>
<pre> package require http
 http::config -useragent {Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1}
 set html [http::data [http::geturl {http://www.google.com.br/search?q=tcl}]]
 set out [regexp -inline {class=l href="(.*?)">(.*?)<font .*?>(.*?)< } $html]
 puts [regsub -all {<.*?>} [concat "[lindex $out 1]\n[lindex $out 2]\n[lindex $out 3]"] "" ]</font></pre>
<p>VB (do Giuliano):</p>
<pre>   Dim http As New WinHttp.WinHttpRequest
   Dim re As New RegExp, matcher As Match
   Dim texto As String
   http.Open "GET", "http://www.google.com.br/search?q=java", False
   http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"
   http.Send
   texto = http.ResponseText
   re.Pattern = "class=l href=""(.*?)""&gt;(.*?)&lt;/a.*?j&gt;&lt;font.*?&gt;(.*?)&lt;br&gt;&lt;"
   re.Global = True
   re.IgnoreCase = True
   re.MultiLine = True
   For Each matcher In re.Execute(texto)
       Dim strSaida: strSaida = ""
       strSaida = matcher.SubMatches(0) + vbCrLf + matcher.SubMatches(1) + vbCrLf + matcher.SubMatches(2)
       MsgBox strSaida
       Exit For
    Next</pre>
<p>Coldfusion (do <a href="http://vardump.com/">Kenji</a>)</p>
<pre>
&lt;cfhttp url="http://www.google.com.br/search?q=coldfusion+mx"&gt;
&lt;cfset tmp = REFindNoCase('class=l href="(.*?)"&gt;(.*?)&lt;/a.*?j&gt;&lt;font.*?&gt;(.*?)&lt;br&gt;&lt;', cfhttp.filecontent,1,true)&gt;
&lt;cfoutput&gt;#mid(cfhttp.filecontent,tmp.pos[2],tmp.len[2])# #mid(cfhttp.filecontent,tmp.pos[3],tmp.len[3])# #mid(cfhttp.filecontent,tmp.pos[4],tmp.len[4])#&lt;/cfoutput&gt;
</pre>
<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=134&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/03/29/code-contest-1/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Code contest</title>
		<link>http://plentz.org/2006/03/29/code-contest/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=code-contest</link>
		<comments>http://plentz.org/2006/03/29/code-contest/#comments</comments>
		<pubDate>Thu, 30 Mar 2006 02:05:25 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[Unsorted]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/03/29/code-contest/</guid>
		<description><![CDATA[Buenas, semana passada no meu post &#8220;Ruby, less-code&#8221;, o Pilger deu a idéia de colocar os códigos lado-a-lado, até pra facilitar a comparação. Bom, conversando com o Giuliano este final de semana surgiu uma idéia: fazer uma espécie de &#8220;coding contest&#8221;. Claro, não vai valer nada. Todos os &#8220;desafios&#8221; vão ficar sob a tag &#8220;code [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/burakyilmaz61/200880717/" title="The Big Contest for Sheep :)"><img src="http://farm1.static.flickr.com/59/200880717_9ac311f389_m.jpg" alt="The Big Contest for Sheep :)" height="156" width="240"  style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>Buenas, semana passada no meu post <a href="http://plentz.org/2006/03/22/ruby-less-code/">&#8220;Ruby, less-code&#8221;</a>, o <a href="http://www.charles.pilger.com.br/">Pilger</a> deu a idéia de colocar os códigos lado-a-lado, até pra facilitar a comparação. Bom, conversando com o Giuliano este final de semana surgiu uma idéia: fazer uma espécie de &#8220;coding contest&#8221;. Claro, não vai valer nada. Todos os &#8220;desafios&#8221; vão ficar sob a tag &#8220;<a href="http://plentz.org/category/code-contest/">code contest</a>&#8220;</p>
<p>A idéia é essa: pegamos um problema qualquer e cada um resolve em uma linguagem. Ajuda a ver algumas vantagens/desvantagens de cada linguagem, e claro, da pra aprender muito também. A versão inicial de cada solução nós fazemos, se alguém sugerir alguma mudança/melhoria alteramos e publicamos(citando o autor, claro). A idéia é criar um problemas por semana em média.</p>
<p>Ah, se alguém tiver interesse de solucionar em alguma linguagem diferente e mandar, será muito bem vinda também. Seja ela Python (<a href="http://www.jonasgalvez.com/">Jonas</a>? <a href="http://lixo.org/">Carlos</a>?), Lisp (<a href="http://fragmental.com.br/">Shoes</a>? <a href="http://beam.to/taq/">Taq</a>?), C/C++(<a href="http://www.fmeyer.org/">Fernando</a>?), Groovy (<a href="http://nullability.org/">Daniel</a>?), PHP (<a href="http://www.charles.pilger.com.br/">Pilger</a>?), .Net, etc.</p>
<p>Como criar problemas não é nossa especialidade(e sim resolvê-los), sugestões de problemas também são bem vindas, mas por favor, nada de calcular órbitas e bizarrices do gênero. É só pra se divertir mesmo.</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=133&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/03/29/code-contest/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby, less-code</title>
		<link>http://plentz.org/2006/03/22/ruby-less-code/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ruby-less-code</link>
		<comments>http://plentz.org/2006/03/22/ruby-less-code/#comments</comments>
		<pubDate>Thu, 23 Mar 2006 02:41:55 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/03/22/ruby-less-code/</guid>
		<description><![CDATA[Algumas semanas atrás &#8211; antes de eu sair de férias &#8211; meu amigo Giuliano e eu estavamos um pouco no ócio durante o expediente, e começamos a discutir sobre linguagens. Eu estava recém começando a brincar com Ruby, mas ele já programa em Java à alguns anos. E-mail pra cá, e-mail pra lá&#8230; ele mandava [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.flickr.com/24/50555124_5ce789d3dd_m.jpg" style="float: right;padding-left:3px;" align="right"/>Algumas semanas atrás &#8211; antes de eu sair de <a href="http://plentz.org/2006/02/05/ferias/">férias</a> &#8211; meu amigo Giuliano e eu estavamos um pouco no ócio durante o expediente, e começamos a discutir sobre linguagens. Eu estava recém começando a brincar com Ruby, mas ele já programa em Java à alguns anos.</p>
<p>E-mail pra cá, e-mail pra lá&#8230; ele mandava algo em Java, eu entendia o problema e respondia com a solução em Ruby. E assim foi por um bom tempo.</p>
<p>Não nos limitamos somente à if/else&#8217;s e while&#8217;s. Fomos de estrutura de classes à threads, passando por I/O, requisições HTTP, regular expressions, etc.</p>
<p> O resultado foi interessante: em nenhum exemplo o código Java ficou menor. E o código não ficou somente menor, mas a clareza do que estava acontecendo também me agradou muito. O mais próximo que Java chegou foi em um pequeno exemplo em que quase empatou, mas&#8230; ficou no quase.</p>
<p>E ontem, estava fazendo umas experiências em casa com Ruby(novidade&#8230;) e acabei me lembrando do caso. Pergunta: alguém possui algum código em Java (hum, .net?) que não possa ser escrito de forma mais concisa em Ruby?</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=131&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/03/22/ruby-less-code/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Core Java</title>
		<link>http://plentz.org/2005/07/13/core-java/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=core-java</link>
		<comments>http://plentz.org/2005/07/13/core-java/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[books]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[book]]></category>

		<guid isPermaLink="false">http://plentz.org/wordpress/?p=115</guid>
		<description><![CDATA[Chegou ontem o Core Java 2: Volume I &#8211; Fundamentos (7ª Edição) e já começei a ler. E também já parei. Péssima diagramação, erros gritantes na tradução, dentre outros incovenientes. Não recomendo, mesmo. Falando nisso, não recomendo nenhum livro traduzido. Só pra deixar mais claro, a versão em português tem 424 páginas e a inglês, [...]]]></description>
			<content:encoded><![CDATA[<p>Chegou ontem o <a href="http://www.temporeal.com.br/produtos.php?id=169228"> Core Java 2: Volume I &#8211; Fundamentos (7ª Edição)</a> e já começei a ler. E também já parei. Péssima diagramação, erros gritantes na tradução, dentre outros incovenientes. Não recomendo, mesmo. Falando nisso, não recomendo nenhum livro traduzido. Só pra deixar mais claro, a versão em português tem 424 páginas e a inglês, 784.</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=115&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2005/07/13/core-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Eclipsed</title>
		<link>http://plentz.org/2005/02/27/eclipsed/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=eclipsed</link>
		<comments>http://plentz.org/2005/02/27/eclipsed/#comments</comments>
		<pubDate>Sun, 30 Oct 2005 00:11:53 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://plentz.org/wordpress/?p=106</guid>
		<description><![CDATA[Logo que comecei a programar, conheci o Dreamweaver. Achei ótimo clicar e arrastar componentes pra cá e pra lá, colocar formatação, tudo muito prático. Felizmente, as pessoas evoluem. Aos poucos começei a entender melhor o que acontecia por baixo dos panos, e entender também o significado daquela monstruiosidade de tags que eram criadas. Conforme fui [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/mark_k_nj/523623785/" title="Total Eclipse Of The Contrast"><img src="http://farm1.static.flickr.com/245/523623785_48da573b9b_m.jpg" alt="Total Eclipse Of The Contrast" height="167" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a></p>
<p>Logo que comecei a programar, conheci o <a href="http://www.macromedia.com/software/dreamweaver/">Dreamweaver</a>. Achei ótimo clicar e arrastar componentes pra cá e pra lá, colocar formatação, tudo muito prático. Felizmente, as pessoas evoluem. Aos poucos começei a entender melhor o que acontecia por baixo dos panos, e entender também o significado daquela monstruiosidade de tags que eram criadas. Conforme fui evoluindo, mais cresceu meu desafeto com ele, devido ao código porcalhão que ele gera. A facilidade de ver as alterações <em>on-the-fly</em> continuava lá, mas já começava a fazer tudo no braço.</p>
<p>A partir dai, cada vez mais busquei editores que facilitassem minha vida, não visualmente, mas que permitissem gerar um código elegante com maior velocidade e facilidade.</p>
<p>Experimentei de tudo, <a href="http://www.scintilla.org/">Scite</a> (recomendação do <a href="http://www.jonasgalvez.com/">Jonas</a>), <a href="http://www.crimsoneditor.com/">Crimson Editor</a>, <a href="http://www.ultraedit.com/">UltraEdit</a>, <a href="http://www.adobe.com/products/dreamweaver/">Dreamweaver</a>, entre muitos outros, mas sempre sentia falta de algo, fosse um <em>code completion</em> decente ou um syntax highlighter pra alguma linguagem. E ficar trocando de editor pra cada tipo de arquivo que for editar, além de ser improdutivo (você acaba não sabendo usar nenhum bem), obriga você a ter mais que um editor no computador &#8211; e pior, ficar alternando entre eles.</p>
<p>Felizmente, chegou ao meu conhecimento um editor que estava ganhando espaço &#8211; e fazendo bastante sucesso: o <a href="http://www.eclipse.org">Eclipse</a>. No começo, não me chamou a atenção, parecia ser mais um editor com uma interface legal e com um code complete aguçado. Pesquisando um pouco mais sobre ele, descobri que sabendo usá-lo corretamente &#8211; e por completo, pode fazer chover. Tirando proveito da plataforma super extensível dele, com alguns plugins ele pode ser tornar um ambiente de trabalho muito produtivo.</p>
<p>Antes de partir para os plugins, vou dar algumas dicas referentes ao funcionamento e utilização dele como um todo. Para começar, entre no site do <a href="http://www.eclipse.org">Eclipse</a>, e <a href="http://download.eclipse.org/eclipse/downloads/">faça o download dele</a>, selecionando conforme o seu sistema operacional. Feito isto, recomendo que descompacte ele em alguma pasta de fácil acesso (algo como c:\dev\eclipse\). Abra ele e use por um tempo, crie um projeto, alguns arquivos, altere as opções, salve, edite, bagunce mesmo &#8211; mas lembre-se, sempre tenha uma cópia do arquivo de instalação dele para um eventual “acidente&#8221;.</p>
<h3>Atalhos do editor</h3>
<p>* alguns funcionam somente no editor Java</p>
<ul>
<li>&lt;Ctrl&gt; + &lt;Space&gt; &#8211; Abre o code completion. Lembre-se, anote, marque na sua testa, control-espaço é seu amigo;</li>
<li>&lt;Ctrl&gt; + &lt;Shift&gt; + &lt;r&gt; &#8211; Open Resource. Abre uma janela para abrir qualquer arquivo (xml, properties, jsp, etc);</li>
<li>&lt;Ctrl&gt; + &lt;Shift&gt; + &lt;t&gt; &#8211; Open Type. Abre uma janela para pesquisa das classes disponíveis;</li>
<li>&lt;Ctrl&gt; + &lt;/&gt; &#8211; (des)Comenta bloco de código;</li>
<li>&lt;Alt&gt; + (&lt;up&gt; ou &lt;down&gt;) &#8211; Move bloco de código;</li>
<li>&lt;Shift&gt; + &lt;Enter&gt; &#8211; Insere linhas em branco abaixo da atual;</li>
<li>&lt;Ctrl&gt; + &lt;Shift&gt; + &lt;Enter&gt; &#8211; Insere linhas em branco acima da atual.</li>
<li>&lt;Ctrl&gt; + &lt;d&gt; &#8211; Remove linha atual;</li>
<li>&lt;Ctrl&gt; + &lt;1&gt; &#8211; Exibe possíveis soluções para um problema que ele encontrou no seu código;</li>
<li>&lt;Ctrl&gt; + &lt;Shift&gt; + &lt;o&gt; &#8211; Ajusta seus imports(no caso do Java ao menos);</li>
<li>&lt;Ctrl&gt; + &lt;Shift&gt; + &lt;f&gt; &#8211; Formata o código conforme configuração de padrão definida;</li>
<li>&lt;Ctrl&gt; + &lt;m&gt; &#8211; Altera entre maximizada/default para uma view, muito útil quando se está trabalhando com arquivo com muito código;</li>
<li>&lt;Ctrl&gt; + &lt;h&gt; &#8211; Busca por referências do elemento(método,atributo&#8230;) que o cursor está posicionado sobre, em todo projeto;</li>
<li>&lt;Ctrl&gt; + &lt;i&gt; &#8211; Corrige identação de um pedaço de código;</li>
<li>&lt;Ctrl&gt; + &lt;3&gt; &#8211; Quick Access&#8230; quase um <a href="http://www.blacktree.com/projects/quicksilver.html">Quicksilver</a> para o Eclipse;</li>
<li>&lt;Ctrl&gt; + &lt;3&gt; &#8211; Quick Outline&#8230; exibe a lista de métodos/atributos da classe. Se pressionado 2 vezes, exibe também das classes mães;</li>
</ul>
<h3>Eclipse Plugins</h3>
<p>Bom, depois de toda essa ladainha, vamos ao que interessa, os plugins. O Eclipse conta com uma estrutura muito boa no quesito extensibilidade &#8211; mesmo sua API sendo criticada por alguns. Pode-se adicionar features para praticamente qualquer propósito nele. A instalação de plugins é muito fácil e pode ser feita de duas maneiras:</p>
<ul>
<li>Via update site – abra o Eclipse, vá em “Help&#8221;, “Software Updates&#8230;&#8221;, “Find and Instal…&#8221; Na tela que abre, selecione a segunda opção e de next. Clique agora em “New Remote Site&#8230;&#8221;. No campo “Name&#8221; coloque o nome do plugin que será instalado, e no campo URL coloque o endereço do update site(quando existir um). Clique agora no íncone de “+&#8221; ao lado do nome do plugin e selecione o “pacote&#8221; que você deseja instalar. Clique em “Next&#8221;. Selecione a versão do plugin, dê “Next&#8221;, aceite os termos do plugin e vá em “Finish&#8221;. Ele vai baixar automaticamente os arquivos necessários e provavelmente vai pedir para você restartar o Eclipse.</li>
<li>Via download – entre no site do desenvolvedor do plugin, baixe o arquivo contendo o plugin e descompacte ele. Normalmente, os pluguins vem com uma ou duas pastas dentro: &#8220;plugins&#8221; e &#8220;features&#8221;. Coloque os arquivos nas suas devidas pastas e entre novamente no Eclipse.</li>
</ul>
<p>Procurei deixar os plugins com funcionalidades semelhantes próximos para facilitar a localização. O nome do plugin é também um link para o site do desenvolvedor/projeto, ficando ao seu lado o link para download ou update site, seguido de uma pequena descrição.</p>
<p><strong><a href="http://eclipse.org/webtools/">Eclipse Web Tools Plataform (WTP)</a></strong> &#8211; <a href="http://download.eclipse.org/webtools/downloads/">Download</a><br />
Provavelmente quem já usa o Eclipse à mais tempo deve conhecer o <a href="http://www.objectlearn.com/">Lomboz</a>. O WebTools na verdade é uma &#8220;continuação&#8221; do projeto <a href="http://www.objectlearn.com/">Lomboz</a>, mas agora como sub-projeto da Eclipse Foundation. Vem com editores para JSP, HTML, Javascript, CSS, SQL, XML, DTD, XSD e WSDL.</p>
<p><strong><a href="http://run-jetty-run.googlecode.com/">Run Jetty Run</a></strong> &#8211; <a href="http://run-jetty-run.googlecode.com/svn/trunk/updatesite">Update site</a><br />
Uma forma decente e simples de usar o <a href="http://www.eclipse.org/jetty/">Jetty</a> para desenvolvimento, já que o connector atual disponível pro WTP é uma piada de mal gosto.</p>
<p><strong><a href="http://www.aptana.com/">Aptana</a></strong> &#8211; <a href="http://update.aptana.com/update/">Update site</a><br />
Excelente plugin para coding e debug <a href="http://www.aptana.com/rails">Ruby + Rails (antigo RadRails)</a>, <a href="http://www.aptana.com/python">Python+Jython(antigo PyDev)</a>, <a href="http://www.aptana.com/jaxer">JavaScript/Ajax (Jaxer)</a>, <a href="http://www.aptana.com/php">PHP</a>, xHTML/RHTML e CSS, além de <a href="http://www.aptana.com/air">Adobe Air</a> e <a href="http://www.aptana.com/iphone">iPhone</a>. Seu <a href="http://www.aptana.tv/">site conta com diversos <em>screencasts</em></a> demonstrando a <a href="http://www.aptana.com/docs/">utilização do plugin</a>.</p>
<p><strong><a href="http://tools.hibernate.org">Hibernate Tools</a></strong> &#8211; <a href="http://download.jboss.org/jbosside/updates/development">Update site</a><br />
Auxilia o desenvolvedor que utiliza Hibernate na sua aplicação, facilitando <a href="http://www.hibernate.org/hib_docs/tools/viewlets/hbmxml_editing.htm">a edição dos hbm.xmls</a> (com syntax highlighting, <em>code-completion</em>), <a href="http://www.hibernate.org/hib_docs/tools/viewlets/entity_model_zoom_and_print.htm">permite navegação e impressão do <em>entity model</em></a>, <a href="http://www.hibernate.org/hib_docs/tools/viewlets/custom_reverse_engineering.htm">engenharia reversa e geração de código</a>,  <a href="http://www.hibernate.org/hib_docs/tools/viewlets/java_hql_editing_and_validation.htm"><em>code completion</em> para HQL/JPA-QL queries diretamente no editor Java</a>, editor para testes para <a href="http://www.hibernate.org/hib_docs/tools/viewlets/edit_and_run_criteria.htm"><em>Criteria queries</em></a> e <a href="http://www.hibernate.org/hib_docs/tools/viewlets/edit_and_run_hql.htm">HQL/JPA-QL queries</a>. A criação do <a href="http://www.hibernate.org/hib_docs/tools/viewlets/create_console_configuration_jpa.htm"><em>console configuration</em></a> para você poder utilizar o plugin também é mostrada no site.</p>
<p><strong><a href="http://springide.org/">Spring IDE</a></strong> &#8211; <a href="http://springide.org/updatesite">Update site</a><br />
Interface gráfica para trabalhar com arquivos de configuração do <a href="http://www.springframework.com/">Spring Framework</a>. Conta com diversas <a href="http://springide.org/project/wiki/SpringideFeatures">features</a> como <a href="http://springide.org/project/wiki/BeansXmlEditor">editor para os arquivos de configuração dos beans</a>, <a href="http://springide.org/project/wiki/BeansConfigValidator">validação dos arquivos de configuração</a>, etc.</p>
<p><strong><a href="http://www.eclipse.org/pdt/">Eclipse PDT</a></strong> &#8211; <a href="http://download.eclipse.org/tools/pdt/updates/2.0/releases/">Update site</a><br />
Plugin oficial da Eclipse Foundation para quem desenvolve PHP. <a href="http://www.zend.com/en/community/pdt">Inicialmente criado</a> pela Zend (empresa de dois grandes contribuidores do PHP).</p>
<p><strong><a href="http://www.phpeclipse.de/">PHPEclipse</a></strong> &#8211; <a href="http://update.phpeclipse.net/update/stable/1.2.x">Update site</a><br />
Pra quem desenvolve PHP, este plugin é uma legítima <a href="http://phpeclipse.de/tiki-browse_gallery.php?galleryId=1">mão na roda</a>. O code assist dele é ótimo, tendo praticamente todas (se não todas) as funções nativas. Possui integração com <a href="http://www.mysql.com/">MySQL</a> e com o <a href="http://httpd.apache.org/">Apache</a>. No seu site explica como instalar o <a href="http://dd.cron.ru/dbg/downloads.php">debbuger</a> e o pacotão <a href="http://www.apachefriends.org/en/xampp.html">WAMPP</a>. No <a href="http://www.plog4u.org/index.php/Using_PHPEclipse">Wiki do site Plog4u</a> existe um ótimo tutorial para este plugin.</p>
<p><strong><a href="http://groovy.codehaus.org/Eclipse+Plugin">Groovy Eclipse Plugin</a></strong> &#8211; <a href="http://dist.codehaus.org/groovy/distributions/update/">Update site</a><br />
Plugin para suporte à Groovy desenvolvido pelo pessoal da <a href="http://codehaus.org/">Codehaus</a>.</p>
<p><strong><a href="http://www.epic-ide.org/">EPIC &#8211; Eclipse Perl Integration</a></strong> &#8211; <a href="http://e-p-i-c.sf.net/updates">Update site</a><br />
Plugin bem completo para <a href="http://www.perl.com/">Perl</a>, vem com o mesmo tester de regular expressions do <a href="http://rubyeclipse.sourceforge.net/">Ruby Development Tools</a>(o código foi cedido por eles). Pra quem ainda usa Perl <a href="http://e-p-i-c.sourceforge.net/main.html#Features">é uma boa pedida</a>.</p>
<p><strong><a href="http://www.cfeclipse.org/">CFEclipse</a></strong> &#8211; <a href="http://www.cfeclipse.org/update">Update site</a><br />
Possui <a href="http://cfeclipse.tigris.org/images/winbeta.jpg">syntax<br />
 highlighting</a>, code insight, content outline e auxilia a encontrar problemas no código. Substitui perfeitamente qualquer editor proprietário da <a href="htttp://www.macromedia.com/">Macromedia</a> como o HomeSite, Dreamweaver e o próprio ColdFusion. Talvez o pessoal do <a href="http://www.cfgigolo.com/">CFGigolô</a> conheça.</p>
<p><strong><a href="http://www.eclipse.org/cdt/">C/C++ Development Tools</a></strong> &#8211; <a href="http://download.eclipse.org/tools/cdt/releases/eclipse3.1">Update site</a><br />
Adiciona funcionalidades para desenvolvimento em C/C++ ao Eclipse.</p>
<p><strong><a href="http://www.eclipse.org/subversive/">Subversive</a></strong> &#8211; <a href="http://download.eclipse.org/technology/subversive/0.7/update-site/">Update site</a> / <a href="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/">Connectors update site</a><br />
Oferece suporte ao <a href="http://subversion.tigris.org/">Subversion</a> de forma similar ao suporte à CVS que já vem integrado com o Eclipse. Conta com diversas <a href="http://www.polarion.org/index.php?page=features&#038;project=subversive">features</a> legais, além de ter uma <a href="http://www.polarion.org/index.php?page=screenshots&#038;project=subversive">interface</a> simples de usar.</p>
<p><strong><a href="http://eclipseme.org/">EclipseME</a></strong> &#8211; <a href="http://eclipseme.org/updates/">Update site</a><br />
Plugin para auxiliar no desenvolvimento de MIDlets <a href="http://java.sun.com/javame/">J2ME</a>, permitindo que o desenvolvedor se preocupe mais com o desenvolvimento da aplicação do que com requisitos específicos da plataforma J2ME.</p>
<p><strong><a href="http://quantum.sourceforge.net/">QuantumDB</a></strong> &#8211; <a href="http://quantum.sourceforge.net/update-site/">Update site</a><br />
Quantum é um plugin para acesso à banco de dados, através de um driver JDBC padrão. Sua interface mostra tabelas, views e sequences em <a href="http://quantum.sourceforge.net/perspective.html">formato de árvore</a> (como a maioria) e possui também um SQL editor com <a href="http://quantum.sourceforge.net/editor.html">syntax highlighting</a>.</p>
<p><strong><a href="http://www.azzurri.jp/en/clay">Clay Database Modeling</a></strong> &#8211; <a href="http://www.azzurri.jp/en/clay/download.html">Download</a><br />
O Clay é um plugin que ajuda no design de um banco de dados. Ele possui <a href="http://www.azzurri.jp/en/software/clay/screenshots.jsp">algumas features bem interessantes</a>, como: <a href="http://www.azzurri.jp/en/software/clay/images/clay_eclipse_1.png">interface super intuitiva</a>, <a href="http://www.azzurri.jp/en/software/clay/images/wiz_reverse_connection_list.png">engenharia</a> <a href="http://www.azzurri.jp/en/software/clay/images/wiz_reverse_tables.png">reversa</a> e <a href="http://www.azzurri.jp/en/software/clay/images/dialog_edit_fk_cols.png">editores gráficos</a>.</p>
<p><strong><a href="http://andrei.gmxhome.de/anyedit/">AnyEdit tools</a></strong> &#8211; <a href="http://andrei.gmxhome.de/eclipse/">Update site</a><br />
Adicionar algumas funções para facilitar o desenvolvimento, como conversão caracteres para entidades HTML, maiúscula/minúscula, espaços/tabulações, <a href="http://plentz.org/2005/09/17/remove-trailing-spaces/">remover espaços no final das linhas</a>.</p>
<p><strong><a href="http://www.eclipse.org/tptp/">TPTP Testing Tools</a></strong> &#8211; <a href="http://eclipse.org/tptp/updates/site.xml">Update site</a><br />
Como o nome sugere, o TPTP é um pacote de ferramentas voltadas para ciclos de testes, que se extende de testes manuais à testes para aplicações web. Possui integração com o JUnit.</p>
<p><strong><a href="http://pmd.sourceforge.net/">PMD</a></strong> &#8211; <a href="http://pmd.sourceforge.net/eclipse/">Update site</a><br />
Acredito que o PMD seja o plugin de verificação/análise de bugs e estilo de código <a href="http://www-128.ibm.com/developerworks/java/library/j-pmd/">mais usado na atualidade</a>. Possui uma série de verificações legais como busca por blocos vazios de try/catch/finally/switch, variáveis não usadas, entre outras. Dica de amigo: mantenha ele longe do seu analista se você não conhece o código à fundo.</p>
<p><strong><a href="http://eclipse-cs.sourceforge.net">Eclipse-CS</a></strong> &#8211; <a href="http://eclipse-cs.sourceforge.net/update">Update site</a><br />
O plugin integra o já famoso code analyzer <a href="http://checkstyle.sourceforge.net/">Checkstyle</a>, ferramenta para ajudar você a garantir que seu código Java adere à alguns padrões de codificação. O Checkstyle faz isso inspencionando seus códigos fontes e apontando os itens que foram selecionados no conjunto de regras disponíveis. Além disso, você pode usar o Checkstyle diretamente da linha de comando, ou como parte do seu nt build.</p>
<p><strong><a href="http://findbugs.sourceforge.net">Find Bugs</a></strong> &#8211; <a href="http://findbugs.cs.umd.edu/eclipse">Update site</a><br />
Ferramenta que ajuda à detectar bugs em potencial para códigos Java.</p>
<h3>Outras distribuições do Eclipse</h3>
<ul>
<li><a href="http://www.aptana.com/studio">Aptana Studio</a></li>
<li><a href="http://www.jboss.org/tools/">JBoss Tools</a></li>
<li><a href="http://www.myeclipseide.com/">MyEclipse</a></li>
<li><a href="http://www.ibm.com/software/rational/eclipse/">IBM Rational software</a></li>
<li><a href="http://www.bea.com/framework.jsp?CNT=index.htm&#038;FP=/content/products/workshop/">BEA Workshop Studio</a></li>
<li><a href="http://www.easyeclipse.org/">EasyEclipse</a></li>
<li><a href="http://www.exadel.com/">Exadel Studio</a></li>
<li><a href="http://www.yoxos.com/">Yoxos</a></li>
<li><a href="http://www.eclipsedownload.com/">Omondo UML</a></li>
</ul>
<h3>Dicas</h3>
<ul>
<li>Se você instalar dois ou mais plugins que possuam editor’s para o mesmo tipo de arquivo (ex: DBEdit e DBExplorer, para *.sql), você pode facilmente editar o default entrando em “Window” &gt;&gt; “Preferences” &gt;&gt; “Workbench” &gt;&gt; “File Associatons”. Selecione o tipo de arquivo que você deseja alterar o padrão e logo abaixo irá aparecer os editor’s disponíveis. Marque o desejado e clique em “Dafault”.</li>
<li>Uma coisa que quem está começando não sabe, é que o Eclipse não usa o CLASSPATH do sistema. Então para adicionar libs / classes / projetos, você precisa fazer isso diretamente na IDE. Clique com o botão direito do mouse no nome projeto, entre em Properties -&gt; Java Build Path -&gt; Libraries. Feito isso, entre em “Add class folder” para adicionar um diretório com .class, e “add jars / add external jars” para adicionar jars.</li>
<li>Quando você instalar um plugin, pode ser que o Eclipse não reconheca automaticamente, então você deve usar o parâmetro <em>-clean</em> (&#8220;C:\eclipse\eclipse.exe -clean&#8221; por exemplo). Utilizando este parâmetro, você estará forçando o Eclipse a reconstruir o repositório no qual ele armazena todos os plugin.xml&#8217;s (ele faz isso como uma forma de tornar o load inicial mais rápido).</li>
<li>Além do <em>-clean</em>, o Eclipse oferece uma <a href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/runtime-options.html">série de outros parâmetros</a> que podem ser utilizados na sua inicialização, que podem inclusive aumentar sua performance.</li>
</ul>
<h3>Links relacionados</h3>
<ul>
<li><a href="http://www.ubuntugeek.com/how-to-install-and-setup-eclipse-with-suns-java.html">How to Install and setup Eclipse with Sun’s Java &#8211; Ubuntu</a></li>
<li><a href="http://www-106.ibm.com/developerworks/library/os-ecref/">Refactoring for everyone</a></li>
<li><a href="http://www-106.ibm.com/developerworks/library/os-ecov/">Getting started with the Eclipse Platform</a></li>
<li><a href="http://www-106.ibm.com/developerworks/library/os-ecvisual/">Build GUIs with the Eclipse Visual Editor project</a></li>
<li><a href="http://www.devx.com/opensource/Article/21562/0">Extending Eclipse with Helpful Views</a></li>
<li><a href="http://www.eclipsecon.org/tutorials.php">EclipseCON Tutorials</a></li>
<li><a href="https://eclipse-tutorial.dev.java.net/visual-tutorials/part1.html">Java Code Templates</a></li>
<li><a href="http://www-106.ibm.com/developerworks/opensource/library/os-ecspy1/">Tune Eclipse’s startup performance, Part 1</a> &amp; <a href="http://www-106.ibm.com/developerworks/opensource/library/os-ecspy2/">Part 2</a></li>
<li><a href="http://www-128.ibm.com/developerworks/library/os-eclplgndep/">Finding unresolved Plug-in dependencies in Eclipse</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=106&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2005/02/27/eclipsed/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>
