<?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/category/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.1</generator>
		<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>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>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>Singleton bobão</title>
		<link>http://plentz.org/2006/01/19/singleton-bobao/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=singleton-bobao</link>
		<comments>http://plentz.org/2006/01/19/singleton-bobao/#comments</comments>
		<pubDate>Fri, 20 Jan 2006 03:20:35 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://plentz.org/2006/01/19/singleton-bobao/</guid>
		<description><![CDATA[Dando uma lida poraí sobre Design Patterns, vi dois exemplos interessantes de Singleton&#8230;Em Java public class SingletonBobao{ private SingletonBobao(){} public static SingletonBobao getSingletonBobao(){ if (ref == null) // ok, pode chamar o construtor ref = new SingletonBobao(); return ref; } public Object clone() throws CloneNotSupportedException{ throw new CloneNotSupportedException(); } private static SingletonBobao ref; } E [...]]]></description>
			<content:encoded><![CDATA[<p>Dando uma lida poraí sobre <a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29">Design Patterns</a>, vi dois exemplos interessantes de <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton</a>&#8230;Em Java</p>
<pre>public class SingletonBobao{
  private SingletonBobao(){}

  public static SingletonBobao getSingletonBobao(){
    if (ref == null) // ok, pode chamar o construtor
        ref = new SingletonBobao();
    return ref;
  }

  public Object clone()	throws CloneNotSupportedException{
    throw new CloneNotSupportedException();
  }

  private static SingletonBobao ref;
}</pre>
<p>E em <a href="http://www.ruby-lang.org/en/">Ruby</a>&#8230;</p>
<pre>require 'singleton'
class SingletonBobinho
  include Singleton
end</pre>
<p>Hummmmm&#8230;</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=127&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2006/01/19/singleton-bobao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails</title>
		<link>http://plentz.org/2005/11/20/ruby-on-rails/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ruby-on-rails</link>
		<comments>http://plentz.org/2005/11/20/ruby-on-rails/#comments</comments>
		<pubDate>Sun, 20 Nov 2005 09:38:53 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://plentz.org/2005/11/20/ruby-on-rails/</guid>
		<description><![CDATA[Rails é uma alternativa às soluções padronizadas qualificadas como &#8220;empresariais&#8221;, que implicam enormes cargas de trabalho sob o custo da compatibilidade com o vicioso ciclo burocrático de consultoria e treinamento que afeta as grandes empresas. Rails tem como proposta remover várias camadas de complexidade, salientando a capacidade individual do desenvolvedor em detrimento dos requerimentos burocráticos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rubyonrails.com/"><img src="http://web.rubyonrails.com/images/rails_logo_remix.gif" style="float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p><a href="http://rubyonrails.com/">Rails</a> é uma alternativa às soluções padronizadas qualificadas como &#8220;empresariais&#8221;, que implicam enormes cargas de trabalho sob o custo da compatibilidade com o vicioso ciclo burocrático de consultoria e treinamento que afeta as grandes empresas. <a href="http://rubyonrails.com.br">Rails</a> tem como proposta remover várias camadas de complexidade, salientando a capacidade individual do desenvolvedor em detrimento dos requerimentos burocráticos de equipe. Isso não deve passar a impressão, entretanto, de que Rails não é adequado para o trabalho em equipe. Rails adere ao padrão MVC de forma pragmática o bastante para promover uma separação clara de papéis, e ainda facilita o emprego de técnicas de Agile e Test-Driven Development.</p>
<p>O objetivo deste texto não é comparar Ruby com outras linguagens, mas sim mostrar as principais vantagens que um desenvolvedor pode ter utilizando este framework.</p>
<p>Antes de começar a citar os pontos positivos, me deixem esclarecer uma coisa: o foco do Ruby on Rails não é aplicações mission critical, super-clusterizadas, mega-distribuídas. Não que seja impossível realizar estas tarefas com Rails, mas não é a ferramenta adequada para tal. Bom, começando:</p>
<p><strong>Simplicidade</strong> &#8211; esta é uma característica forte em Ruby, pois a solução de um problema, normalmente, é atingida de uma forma extremamente simples e clara, o que facilita o entendimento do código por outros programadores que tiverem que dar manutenção no futuro.</p>
<p><strong>Produtividade</strong> &#8211; se o desenvolvedor consegue resolver seu problema de uma forma mais simples, clara e concisa, tendo ferramentas que facilitem sua vida, o desenvolvimento se torna mais agradável. Programador feliz = programador mais produtivo.</p>
<p><strong>Convention over configuration</strong> &#8211; o Rails se baseia no princípio convenção sobre configuração. Ao invés de criar dezenas de XML&#8217;s para configuração, basta utilizar algumas conveções pré-definidas. Nada de XML.</p>
<p><strong>Maturidade</strong> &#8211; a linguagem que está cada vez mais madura (e não é nova, pois já existe a cerca de 10 anos, quando foi criada pelo japonês Yukihiro Matsumoto, a.k.a. Matz).</p>
<p><strong>Active Record</strong> &#8211; é o responsável pela persistência dos dados para quem utiliza Rails, sendo um <a href="http://www.theserverside.com/articles/article.tss?l=RailsHibernate">competidor à altura</a> do <a href="http://hibernate.org/">Hibernate</a>, seguindo uma abordagem <a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">um pouco diferente</a> da usada <a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html">pelo concorrente</a>. É compatível com os principais bancos de dados do mercado: Oracle, SQL Server, IBM DB2, MySQL, PostgreSQL, SQLite and Firebird.</p>
<p><strong>IDE&#8217;s</strong> &#8211; já possui uma boa gama de ferramentas, como <a href="http://www.radrails.org/">RadRails</a>, <a href="http://rubyeclipse.sourceforge.net/">RDT &#8211; Ruby Development Tools</a>, <a href="http://www.jedit.org/ruby/">Ruby Editor Plugin for JEdit</a>, <a href="http://freeride.rubyforge.org/wiki/wiki.pl">FreeRIDE</a>, <a href="http://www.mondrian-ide.com/">Mondrian IDE</a>, <a href="http://www.hyperionreactor.net/node/43">Ruby Emacs bindings</a>, <a href="http://macromates.com/">TextMate</a>, <a href="http://www.ruby-ide.com/ruby/ruby_ide_and_ruby_editor.php">ArachnoRuby</a>, <a href="http://www.zeusedit.com/ruby.html">Zeus</a>, <a href="http://www.activestate.com/Products/Komodo/">Komodo</a>.</p>
<p><strong>Suporte nativo para Ajax</strong> &#8211; Ruby on Rails vem por padrão com o framework Ajax <a href="http://script.aculo.us/">script.aculo.us</a>, que permite a adição de recursos de interface (como <a href="http://script.aculo.us/demos/ajax/autocompleter_customized">auto-complete para campos</a>, <a href="http://script.aculo.us/demos/shop">drag and drop&#8217;s</a>, <a href="http://wiki.script.aculo.us/scriptaculous/show/Demos">etc</a>) mais ricos e sem gastar horas desenvolvendo.</p>
<p><strong>Testing is built-in</strong> &#8211; <a href="http://junit.org/">JUnit</a>, <a href="http://testng.org/">TestNG</a>? Ruby on Rails já vem com tudo que você precisa para testar sua aplicação. E com o lançamento da versão 1.0 <a href="http://clarkware.com/cgi/blosxom/2005/10/24">ficará ainda mais fácil</a>. <a href="http://www.agiledata.org/essays/tdd.html">Test Driven Development</a> otimizado.</p>
<p><strong>Curva de aprendizado</strong> &#8211; aprender como funciona uma aplicação criada com Rails <a href="http://weblog.rubyonrails.com/archives/2005/10/28/comparing-technology-stacks-of-books">é mais simples que em outras tecnologias</a> com as quais já tive contato (Java, PHP, ASP(COM+), Coldfusion), como também para quem está querendo começar a desenvolver.</p>
<p><strong>Segurança</strong> &#8211; Rails tem todas as features que qualquer outro framework tem como suporte à LDAP, logging, etc.</p>
<p><strong>Cross-plataform</strong> &#8211; suporta Linux e outras variantes UNIX, BeOS, OSX, BSD e também, é claro, Windows.</p>
<p><strong>OpenSource</strong> &#8211; completamente código aberto, assim como 99% das libraries disponíveis para ele.</p>
<p><strong>Feedback instantâneo</strong> &#8211; edite o código, salve, dê refresh e a alteração está lá.</p>
<p><strong>Integração</strong> &#8211; de uma forma similar ao .NET, a maioria dos componentes do Rails se integra facilmente, o que facilita o desenvolvimento.</p>
<p><strong>Code generation</strong> &#8211; você não precisa criar sempre toda a estrutura de código, o que permite um desenvolvimento mais rápido.</p>
<p><strong><acronym title="Don't Repeat Yourself">DRY</acronym> principle</strong> &#8211; <strong>D</strong>on&#8217;t <strong>R</strong>epeat <strong>Y</strong>ourself é um conceito &#8216;criado&#8217; por Dave Thomas (autor do livro <a href="http://www.amazon.com/gp/product/020161622X/103-9776861-2339043?v=glance&#038;n=283155&#038;s=books&#038;v=glance&#038;tagActionCode=billvennersA">The Pragmatic Programmer</a>) que <a href="http://c2.com/cgi/wiki?DontRepeatYourself">parafraseando</a> significa:</p>
<blockquote><p>Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.</p></blockquote>
<p>Acredito que os itens acima já tenham sido suficientes para despertar a curiosidade para testá-lo. Se você estiver interessado em fazer alguém testar Ruby on Rails mas não quer ter muito trabalho, recomendo mostrar o vídeo <a href="http://www.rubyonrails.com/media/video/rails_take2_with_sound.mov">Take 2: Impressing with Rails 0.13</a>, criado originalmente para ser usado no <a href="http://chopin.softwarelivre.org/6.0/">FISL 6.0</a>,  onde <a href="http://www.loudthinking.com">David Heinemeier Hansson</a> mostra como criar um blog em 15 minutos.</p>
<p>Mas se você ainda não se convenceu que Ruby on Rails pode ser uma boa opção para seu projeto, abaixo seguem alguns links que reforçam o que eu falei:</p>
<p><a href="http://www.eweek.com/article2/0,1895,1880280,00.asp">Ruby on Rails: Making Programmers Happy</a><br />
Entrevista com <a href="http://www.loudthinking.com/">David Heinemeier Hansson</a> no site eWeek.</p>
<p><a href="http://blogs.zdnet.com/BTL/?p=2094">Making programmers more productive</a><br />
<a href="http://www.windley.com">Phil Windley</a> escreve sobre suas impressões sobre Rails.</p>
<p><a href="http://www.hackdiary.com/archives/000071.html">The BBC&#8217;s programme catalogue (on Rails)</a><br />
BBC está usando Rails para o seu catálogo com alguns milhões de shows.</p>
<blockquote><p>&#8230;BBC have allowed me to rapidly prototype and deploy this 7,000,000-row database-backed site in everyone&#8217;s new favourite web framework&#8230;</p></blockquote>
<p><a href="http://www-128.ibm.com/developerworks/linux/library/wa-rubyonrails/?ca=dgr-lnxw01RubyAndJ2EE">Ruby on Rails and J2EE: Is there room for both?</a><br />
Aaron Rustad faz uma comparação entre as principais features da arquitetura do Rails com os tradicionais frameworks J2EE</p>
<p><a href="http://jlaine.net/blog/83/interview-with-david-heinemeier-hansson">Interview with DHH</a><br />
Entrevista com <a href="http://www.loudthinking.com/">David Heinemeier Hansson</a>, criador do Rails.</p>
<p><a href="http://johnwlong.com/slides/gettothepoint/index.html">Get to the point!Development with Ruby and Rails</a><br />
Apresentação mostrando as principais features da linguagem (Ruby em si, não especificamente do framework Rails). Muito bom pra mostrar para seu chefe(desde que ele seja/tenha sido um progrmador).</p>
<p><a href="http://news.com.com/Ruby+on+Rails+chases+simplicity+in+programming/2100-1007_3-5920169.html?tag=nefd.lede">Ruby on Rails chases simplicity in programming</a><br />
Entrevista com <a href="http://www.loudthinking.com/">David Heinemeier Hansson</a>, criador do Rails (saiu também no <a href="http://news.zdnet.com/2100-3513_22-5920169.html?tag=nl.e589">ZDnet</a>).</p>
<p><a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/2111">SAP on Rails, and not on the skids</a><br />
Com apenas algumas linhas de código, <a href="https://weblogs.sdn.sap.com/pub/u/8630">Piers Harding</a> mostra como fazer integração com SAP, mostrando um pouco da flexibilidade do framework.</p>
<p><a href="http://rewrite.rickbradley.com/pages/moving_to_rails">Evaluation: moving from Java to Ruby on Rails for the CenterNet rewrite</a><br />
Case study muito interessante da migração do CenterNet(um grande aplicação da área de sáude) de Java para Ruby on Rails. E por ter sido feito em 6 vezes menos tempo (8 dias contra 6 semanas do Java) com uma redução de 20:1 para código, eu diria que sim, é uma redução <strong>bem</strong> relevante. Antes que alguns trolls apareçam criticando, sim, migrar uma aplicação é mais rápido do que desenvolver ela do zero, mas convenhamos, 20:1 é um número incontestável.</p>
<p><a href="http://www.onjava.com/lpt/a/6334">Ruby the Rival</a><br />
Entrevista com alguns desenvolvedores experientes, mostrando sua visão da linguagem Ruby.</p>
<p><a href="http://wiki.rubyonrails.org/rails/pages/RealWorldUsage">Ruby on Rail &#8211; Real World Usage</a><br />
Uma lista com algumas empresas que já estão usando Rails em aplicações reais.</p>
<p><a href="http://www.eweek.com/article2/0,1895,1880199,00.asp">Ruby on Rails Dev Framework on Track for Growth</a></p>
<p><a href="http://www-128.ibm.com/developerworks/linux/library/l-rubyrails/">Fast-track your Web apps with Ruby on Rails</a><br />
David Mertz demonstra através de uma mini-aplicação algumas vantagens do framework.</p>
<p>E isso pode ser o fim dos outros frameworks, seja Java, .Net, PHP, para desenvolvimento mainstream? Dificilmente. Que todo mundo abandonará Java e migrar para Rails? Com certeza, não.</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=123&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2005/11/20/ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://www.rubyonrails.com/media/video/rails_take2_with_sound.mov" length="54364199" type="video/quicktime" />
		</item>
		<item>
		<title>Webserver em 15 minutos</title>
		<link>http://plentz.org/2005/11/10/webserver-em-15-minutos/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=webserver-em-15-minutos</link>
		<comments>http://plentz.org/2005/11/10/webserver-em-15-minutos/#comments</comments>
		<pubDate>Thu, 10 Nov 2005 04:28:57 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=117</guid>
		<description><![CDATA[A idéia desse how-to é facilitar a vida de quem quer criar um ambiente de desenvolvimento bem estruturado e sem ter que perder dias pra fazer isso. Você não precisa necessariamente instalar tudo que é descrito abaixo, mas note que alguns são pré-requisitos para outros itens. Com certeza esta não é a única forma de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/persona/37201953/" title="Cisco"><img src="http://farm1.static.flickr.com/24/37201953_0ab41125fd_m.jpg" alt="Cisco" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;" /></a></p>
<p>A idéia desse how-to é facilitar a vida de quem quer criar um ambiente de desenvolvimento bem estruturado e sem ter que perder dias pra fazer isso. Você não precisa necessariamente instalar tudo que é descrito abaixo, mas note que alguns são pré-requisitos para outros itens.</p>
<p>Com certeza esta não é a única forma de integrar essa parafernalha toda, mas foi a melhor forma que eu achei (e consegui fazer funcionar). Se alguém tiver alguma sugestão/comentário, <a href="mailto: diego@this_site">drop me a line.</a></p>
<p>Muitos ao ler vão se perguntar, &#8220;mas por que ele usou o Apache ao invés de colocar somente o Tomcat?&#8221;, já que o Tomcat acompanha um webserver build-in. Bom, levando em conta que é infinitamente mais simples integrar isso tudo com o Apache ao invés do Tomcat(e existir muito mais documentação para isso), existem alguns outros motivos para isso, como (dependendo do caso) melhor performance, a utilização dos modules, como o mod_rewrite, mod_proxy, etc.</p>
<p>Uma observação importante antes de começar, não faça como eu quando estava começando a fazer meus testes, <strong>não</strong> coloque ponto-e-vírgula depois das variáveis de sistema *_home.</p>
<p>No início de cada &#8220;sessão&#8221; eu fiz uma listagem das variáveis de sistema que devem ser criadas para o funcionamento correto de cada instalação. <strong>Antes</strong> de iniciar cada instalação, crie <em>todas</em> as variáveis indicadas. Para criar elas (supondo que você está no Windows XP), clique com o botão direito em &#8220;Meu Computador&#8221; -> Propriedades -> Avançado -> Variáveis de sistema -> Clique em &#8220;Nova&#8221; -> Coloque o nome e valor que estão indicados e clique em Ok. No Windows XP elas são válidas a partir do momento que você criou, mas se você está com um prompt de comando aberto será necessário reiniciá-lo.</p>
<p>Cuidado: muitas aplicações precisam estar na variável PATH do Windows para funcionar corretamente, então quando você ver PATH, é para <em>adicionar</em> o caminho à sua PATH e não substituir o conteúdo da variável.</p>
<h3><a href="http://httpd.apache.org/" name="apache">Apache HTTP Server</a></h3>
<p>Arquivos:</p>
<ul>
<li><a href="http://linorg.usp.br/apache/httpd/binaries/win32/apache_2.2.13-win32-x86-no_ssl.msi">apache_2.2.13-win32-x86-no_ssl.msi</a></li>
</ul>
<p>- Antes de fazer qualquer outra coisa, verifique se você já não possui algum processo rodando na porta 80. Para isso, entre no console (run&#8230; &#8220;cmd&#8221;) e digite:</p>
<p><code>netstat -aon | find /i "listening" |find /i ":80"</code></p>
<p>Se encontrar algo, sua porta 80 está sendo usada. Pegue o ID encontrado, entre no task manager (ctrl+alt+del) -> processes -> view -> marque o check que diz PID e localize na lista o ID encontrado.</p>
<p>Dica: se você utiliza <a href="http://skype.com">Skype</a>, você precisa desabilitar <a href="http://www.google.com.br/search?q=skype+port+80">o uso da porta 80 por ele</a>, para poder utilizar corretamente o Apache. Para resolver isso, entre no Skype em Tools -> Options&#8230; -> Connection -> Desmarque a caixa &#8220;Use port 80 and 443 as alternatives for incomming connections&#8221;.</p>
<p>- Crie a pasta c:\dev\workspace\</p>
<p>- Entre no instalador: Next -> Marque &#8220;Accept&#8230;&#8221; -> Next -> Next -> Preencha com seus dados(não precisam ser dados reais) -> Next -> Marque &#8220;Custom&#8230;&#8221; -> Next -> Clique em &#8220;Change&#8230;&#8221; e digite &#8220;c:\dev&#8221;(ele coloca automaticamente dentro da pasta c:\dev\apache2\) -> Ok -> Next -> Install(espere instalar) -> Finish.</p>
<p>- Abra o arquivo c:\dev\apache2\conf\httpd.conf (recomendo criar um atalho pra ele enquanto você está configurando seu ambiente, você vai usá-lo bastante. E claro, a partir de agora, sempre que eu falar em http.conf você já sabe do que eu estou falando) e altere a linha que diz DocumentRoot para:</p>
<p><code># faz com que o apache tome como diretório raiz c:\dev\workspace<br />
DocumentRoot "c:/dev/workspace"</code></p>
<p>e altere a linha que diz</p>
<p><code>&lt;Directory "c:/dev/Apache2/htdocs"&gt;</code></p>
<p>para</p>
<p><code>&lt;Directory "c:/dev/workspace"&gt;</code></p>
<p>- Restarte o Apache clicando no ícone que foi criado no seu system tray e em seguida restart.</p>
<p>- Para testar, abra o seu <a href="http://getfirefox.com">browser favorito</a> e entre em <a href="http://localhost">http://localhost</a>. Você deve ver uma listagem do diretório c:\dev\workspace.</p>
<h3><a href="http://java.sun.com/" name="java">Java</a> + <a href="http://tomcat.apache.org/" name="tomcat">Tomcat</a></h3>
<p>Variáveis de sistema:</p>
<p><code>JAVA_HOME c:\dev\java\jdk<br />
CATALINA_HOME c:\dev\tomcat<br />
CLASSPATH .;%JAVA_HOME%;<br />
PATH %JAVA_HOME%\bin;</code></p>
<p>Arquivos:</p>
<ul>
<li><a href="http://java.sun.com/javase/downloads/index.jsp#jdk">jdk-6u16-windows-i586.exe</a></li>
<li><a href="http://ftp.unicamp.br/pub/apache/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.exe">apache-tomcat-6.0.20.exe</a></li>
<li><a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/mod_jk-1.2.28-httpd-2.2.3.so">mod_jk-1.2.28-httpd-2.2.3.so</a></li>
</ul>
<p>- Entre no instalador do Java: Marque &#8220;Accept&#8230;&#8221; -> Next -> Clique em &#8220;Change&#8230;&#8221; e digite &#8220;c:\dev\java\jdk&#8221; -> Ok -> Next -> Aguarde ele instalar o JDK -> Clique em &#8220;Change&#8230;&#8221; (agora é a pasta de instalação da JRE) e digite &#8220;c:\dev\java\jre&#8221; -> Ok -> Next -> Next -> Finish.</p>
<p>- Agora entre no instalador do Tomcat: Next -> I Agree -> Selecione a instalação &#8220;Full&#8221; -> Next -> Digite o seguinte endereço &#8220;c:\dev\tomcat&#8221; -> Next -> Next -> Install -> Aguarde a instalação -> Desmarque a opção &#8220;Show readme&#8221; -> Finish.</p>
<p>- Coloque o arquivo mod_jk-1.2.28-httpd-2.2.3.so dentro de c:\apache2\modules\ e mude o nome do arquivo para mod_jk.so.<a href="#p1" name="a1">[1]</a></p>
<p>- Para manter mais organizado vamos colocar as configurações do tomcat em um arquivo à parte. Adicione a linha à seguir no final do http.conf:</p>
<p><code>Include conf/tomcat.conf</code></p>
<p>- Agora crie um o tomcat.conf em C:\dev\apache2\conf com o seguinte conteúdo <a href="#p2" name="a2">[2]</a></p>
<p><code># carrega o connector<br />
LoadModule jk_module modules/mod_jk.so<br />
# faz com que o Apache também reconheça arquivos index.jsp como arquivo default para diretórios<br />
DirectoryIndex index.jsp<br />
# seta configurações de log<br />
JkLogFile c:/dev/apache2/logs/mod_jk.log<br />
JkLogLevel info<br />
# aqui você monta os contextos do Tomcat, você deve fazer isso para as aplicações que você criar.<br />
# Formato: JkMount URL_PREFIX WORKER_NAME<br />
# Onde:<br />
# URL_PREFIX é o caminho que vai ser acessado via browser. Ex: teste para http://localhost/<strong>teste</strong><br />
# WORKER_NAME no nosso exemplo sempre será ajp13<br />
JkMount /jsp-examples/* ajp13<br />
JkMount /servlets-examples/* ajp13<br />
JkMount /tomcat-docs/* ajp13</code></p>
<p>- Mova as três pastas C:\dev\tomcat\webapps\jsp-examples, C:\dev\tomcat\webapps\servlets-examples, c:\dev\tomcat\webapps\tomcat-docs para dentro de c:\dev\workspace</p>
<p>- Edite o arquivo c:\tomcat\conf\server.xml e procure por uma linha que diz</p>
<p><code>      &lt;Host name="localhost" appBase="webapps"<br />
       unpackWARs="true" autoDeploy="true"<br />
       xmlValidation="false" xmlNamespaceAware="false"&gt;</code></p>
<p>e altere para (copie junto a tag DefaultContext)</p>
<p><code>&lt;Host name="localhost" appBase="c:/dev/workspace"<br />
       unpackWARs="true" autoDeploy="true"<br />
       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
	  &lt;DefaultContext reloadable="true" /&gt;</code></p>
<p>- Feito isso, reinicie o Apache e depois o Tomcat.</p>
<p>- Para testar, entre em http://localhost/jsp-examples/ e http://localhost/servlets-examples/ e você deve ver os exemplos que acompanham o Tomcat (execute alguns exemplos para ter certeza que está tudo ok).</p>
<h3>Links relacionados:</h3>
<ul>
<li><a href="http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html">Tomcat Clustering/Session Replication HOW-TO</a></li>
</ul>
<h3><a href="http://www.php.net/" name="php">PHP</a></h3>
<p>Variáveis de sistema:<br />
<code>PHP_HOME c:\dev\php</code></p>
<p>Arquivos:</p>
<ul>
<li><a href="http://windows.php.net/downloads/releases/php-5.3.0-Win32-VC9-x86.zip">php-5.3.0-Win32-VC9-x86.zip</a></li>
</ul>
<p>- Descompacte o conteúdo do arquivo em c:\dev\php</p>
<p>- Entre em c:\dev\php\ e renomeie o arquivo &#8220;php.ini-recommended&#8221; para &#8220;php.ini&#8221;(mas se você quer algo mais próximo do que irá encontrar em um ambiente de produção, recomendo usar o &#8220;php.ini-dist&#8221; no lugar do &#8220;php.ini-recommended&#8221;).</p>
<p>- Abra o arquivo e procure pelas seguintes linhas alterando seu valor:</p>
<p><code>include_path = ".;c:\dev\php\includes"<br />
doc_root = "c:\dev\workspace"<br />
extension_dir = "c:\dev\php\ext"<br />
display_errors = On</code></p>
<p>- Para manter mais organizado vamos colocar as configurações do PHP em um arquivo à parte. Adicione a linha à seguir no final do http.conf:</p>
<p><code>Include conf/php.conf</code></p>
<p>- Agora crie o php.conf em C:\dev\apache2\conf com o seguinte conteúdo:</p>
<p><code># carrega o módulo do php<br />
LoadModule php5_module "c:/dev/php/php5apache2.dll"<br />
# adiciona o content type para os arquivos php<br />
AddType application/x-httpd-php .php<br />
# seta o home do php<br />
PHPIniDir "c:/dev/php"<br />
# faz com que o Apache também reconheça arquivos index.php como arquivo default para diretórios<br />
DirectoryIndex index.php</code></p>
<p>- Reinicie o Apache</p>
<p>- Para testar, entre em c:\dev\workspace e crie um arquivo phpinfo.php com o  conteúdo abaixo e acesse <a href="http://localhost/phpinfo.php">http://localhost/phpinfo.php</a></p>
<p><code>&lt;? php phpinfo () ;?&gt;</code></p>
<p>OBS: Se você deseja utilizar MySQL com o PHP, você deve utilizar a lib php_mysqli.dll <a href="#p3" name="a3">[3]</a>. Seguem as alterações que você deve fazer no seu php.ini:</p>
<p><code>extension=php_mysqli.dll<br />
mysqli.default_host = localhost<br />
mysqli.default_user = root</code></p>
<h3>Links relacionados:</h3>
<ul>
<li><a href="http://www.zend.com/php5/articles/php5-mysqli.php">Using ext/mysqli: Part I &#8211; Overview and Prepared Statements</a></li>
<li><a href="http://www.zend.com/php5/articles/php5-mysqli2.php">Using ext/mysqli: Part II &#8211; Extending mysqli</a></li>
</ul>
<h3><a href="http://www.mysql.com/" name="mysql">MySQL</a></h3>
<p>Variáveis de sistema:</p>
<p><code>MYSQL_HOME c:\dev\mysql<br />
PATH %MYSQL_HOME%\bin;</code></p>
<p>Arquivos:</p>
<ul>
<li><a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-essential-5.1.38-win32.msi/from/http://mysql.cce.usp.br/">mysql-essential-5.1.38-win32.msi</a></li>
<li><a href="http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r17-win32.msi/from/http://linorg.usp.br/mysql">mysql-gui-tools-5.0-r17-win32.msi</a></li>
</ul>
<p>- Entre no instalador: Next -> Marque &#8220;Custom&#8221; -> Next -> Clique em &#8220;Change&#8230;&#8221; e digite &#8220;c:\dev\mysql&#8221; -> Ok -> Next -> Install(espere instalar) -> Marque &#8220;Skip Sign-Up&#8221; -> Next -> Finish.</p>
<p>- O Instance Configuration Wizard será executado, continue a configuração: Next -> Next -> Next -> Next -> Next -> Next -> Next -> Selecione &#8220;Best Support For Multilingualism&#8221; -> Next -> Next -> Desmarque &#8220;Modify Settings&#8221; -> Next -> Execute -> Finish.</p>
<p>- Próximo passo é instalar o MySQL GUI Tools: Next -> Marque &#8220;I accept&#8230;&#8221; -> Next -> Clique em &#8220;Change&#8230;&#8221; e digite &#8220;c:\dev\mysql\tools&#8221; -> Ok -> Next -> Next -> Install -> Finish.</p>
<h3>Links relacionados:</h3>
<ul>
<li><a href="http://www.informit.com/articles/printerfriendly.asp?p=410743&#038;rl=1">An Overview of MySQL Query Browser&#8217;s Features and Capabilities</a></li>
</ul>
<p><a href="#a1" name="p1">[1]</a> O connector <a href="http://jakarta.apache.org/tomcat/connectors-doc/news/20041100.html#20041115.1">mod_jk2 foi descontinuado</a> por desinteresse dos desenvolvedores e também pelos usuários, já que era mais difícil de configurar. Mas se você quer mesmo, ou precisa, utilizar o mod_jk2, <a href="http://www.perfectreign.com/modules/articles/article.php?id=1">este tutorial</a> pode ajudar muito.</p>
<p><a href="#a2" name="p2">[2]</a> <a href="http://www.inf.ufsc.br/~leandro/apache-tomcat.html">Alguns tutoriais</a> fazem uso de um arquivo workers.properties para setar algumas configuraçãoes do connector, mas como o objetivo deste tutorial é apenas montar um ambiente rápido e prático para desenvolvimento, não utilizaremos esta abordagem.</p>
<p><a href="#a3" name="p3">[3]</a> Existe também o <a href="http://www.php.net/manual/en/ref.mysql.php">php_mysql.dll</a>, mas como o <a href="http://www.php.net/manual/en/ref.mysqli.php">php_mysqli.dll</a> (o &#8220;i&#8221; é de improved) é mais recente e melhor, utilize ele. Alguns tutoriais consideram a utilização dos dois, mas particularmente não vejo nenhum problema em usar somente o php_mysqli. Uma vantagem (se é que pode ser chamada de vantagem) é que com php_mysqli.dll você não precisa setar a porta default (3306).<br />
Mas cuidado, se você já possui uma aplicação e quer continuar o seu desenvolvimento, é recomendado dar uma boa verificada no código, já que existem incompatibilidades entre as libs.</p>
<blockquote><p>Be careful when porting from ext/mysql to ext/mysqli. The following functions return NULL when no more data is available in the result set (ext/mysql&#8217;s functions return FALSE): mysqli_fetch_row(); mysqli_fetch_array(); mysqli_fetch_assoc();</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=117&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2005/11/10/webserver-em-15-minutos/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>CJ &#8217;05</title>
		<link>http://plentz.org/2005/08/03/cj-05/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cj-05</link>
		<comments>http://plentz.org/2005/08/03/cj-05/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://plentz.org/wordpress/?p=116</guid>
		<description><![CDATA[20 e 21 de agosto tem Conexão Java &#8217;05 no Anhembi, você vai aparecer por lá também né? Eu ainda preciso de um ok da chefia, mas tudo indica que vou poder ir beber com o pessoal no O&#8217;Malley&#8217;s e &#8230; er, quer dizer, participar da excelente programação do evento. Ainda não se inscreveu? Ta [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.conexaojava.com.br/conexaojava05/images/cj05_logo.gif" style="float: left;"/>20 e 21 de agosto tem <a href="http://www.conexaojava.com.br/">Conexão Java &#8217;05</a> no Anhembi, você vai aparecer por <a href="http://www.conexaojava.com.br/conexaojava05/inscricao.jsp">lá também né</a>? Eu ainda preciso de um ok da chefia, mas tudo indica que vou poder ir beber com o pessoal no O&#8217;Malley&#8217;s e &#8230; er, quer dizer, participar da <a href="http://www.conexaojava.com.br/conexaojava05/programacao.jsp">excelente programação do evento</a>. Ainda não se inscreveu? <a href="http://www.conexaojava.com.br/conexaojava05/inscricao.jsp">Ta esperando o que einh?</a> O evento é gratuito, mas as inscrições terminam dia 16/8!</p>
<p>update: é&#8230;não vou mais, digamos que um carro se atravessou no caminho. Ano que vem talvez né?</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=116&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2005/08/03/cj-05/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
