<?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>mnemetica &#187; java</title>
	<atom:link href="http://www.leal.eng.br/mnemetica/categorias/tech/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.leal.eng.br/mnemetica</link>
	<description>A Linguagem enquanto um vírus...</description>
	<lastBuildDate>Mon, 07 Jun 2010 19:44:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Desenhando e Andando</title>
		<link>http://www.leal.eng.br/mnemetica/2009/11/11/947/desenhando-e-andando.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2009/11/11/947/desenhando-e-andando.html#comments</comments>
		<pubDate>Wed, 11 Nov 2009 21:59:43 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sys/net]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/?p=947</guid>
		<description><![CDATA[Costumava me referir ao NetBeans como o &#8220;Paintbrush4J&#8221;: Basicamente, só servia para Desenhar.
Hoje, porém, parte do meu dia (eletrizante, até) envolveu uma atividade boba, revelou um insight genial:
No Linux, eu precisava desenhar um diagrama de blocos. Tentei com InkScape, e funcionava, com um detalhe: Sendo um editor de SVG, eu precisava criar 2 objetos (Retângulo [...]]]></description>
			<content:encoded><![CDATA[<p>Costumava me referir ao NetBeans como o &#8220;Paintbrush4J&#8221;: Basicamente, só servia para Desenhar.</p>
<p>Hoje, porém, parte do meu dia (eletrizante, até) envolveu uma atividade boba, revelou um insight genial:</p>
<p>No Linux, eu precisava desenhar um diagrama de blocos. Tentei com InkScape, e funcionava, com um detalhe: Sendo um editor de SVG, eu precisava criar 2 objetos (Retângulo e Texto), selecionar ambos, alinhar os centros e agrupá-los. Resumindo: Contraproducente.</p>
<p>Depois do InkScape, tentei Kivio &#8211; Que ao contrário do original, não possui um único stensil de retângulo. Game Over, K.</p>
<p>Tentei outro no Ubuntu: Karbon (antigamente, KIllustrator). Mesmo sintoma do Inkscape.</p>
<p>Procurando várias alternativas, li em algum lugar que o OpenOffice permitia.</p>
<p>E fez bem e consegui concluir os diagramas.</p>
<p>Mais tarde, refletindo com um colega de trabalho, permitimos um padrão:</p>
<ul>
<li>O Java surgiu como basicamente um GIF Animado;</li>
<li>O NetBeans é ótimo quando o assunto se limita apenas a Swing</li>
<li>JavaFX é uma segunda tentativa da Sun reaver a posição de melhor animador de GIF depois do Flash</li>
<li>OpenOffice Draw me permitiu desenhar como eu queria</li>
</ul>
<p>Em suma: A Sun faz software sério, até (Java, JXTA, OpenSolaris), mas ela queria mesmo era achar-se a Adobe. Só pode.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2009/11/11/947/desenhando-e-andando.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Zero (ou WebSphere sMash) &#8211; Porqu&#234;, pra qu&#234;, o que, quando, e como? (E o que que &#233; mesmo?)</title>
		<link>http://www.leal.eng.br/mnemetica/2009/05/20/931/project-zero-ou-websphere-smash-porqu-pra-qu-o-que-quando-e-como-e-o-que-que-mesmo.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2009/05/20/931/project-zero-ou-websphere-smash-porqu-pra-qu-o-que-quando-e-como-e-o-que-que-mesmo.html#comments</comments>
		<pubDate>Wed, 20 May 2009 11:42:16 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[domesticos]]></category>
		<category><![CDATA[estudante profissional]]></category>
		<category><![CDATA[histórias]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pessoal]]></category>
		<category><![CDATA[pessoas, projetos, e problemas]]></category>
		<category><![CDATA[sys/net]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2009/05/20/931/project-zero-ou-websphere-smash-porqu-pra-qu-o-que-quando-e-como-e-o-que-que-mesmo.html</guid>
		<description><![CDATA[Um bate-bola rápido sobre o ProjectZero, o meu ambiente favorito pra desenvolvimento atualmente.
A História da Web: Relembrar é Entender
Acompanhar a Web envolve um pouco da própria natureza da tecnologia: Novas demandas, novos desafios, e a constante necessidade de manter tudo alinhado com o que já existia, oferecendo recursos que originalmente sequer foram imaginados. Basicamente, as [...]]]></description>
			<content:encoded><![CDATA[<p><em>Um bate-bola rápido sobre o ProjectZero, o meu ambiente favorito pra desenvolvimento atualmente.</em></p>
<h2>A História da Web: Relembrar é Entender</h2>
<p>Acompanhar a Web envolve um pouco da própria natureza da tecnologia: Novas demandas, novos desafios, e a constante necessidade de manter tudo alinhado com o que já existia, oferecendo recursos que originalmente sequer foram imaginados. Basicamente, as principais tecnologias que compõem a Web, entre 1990 a 2000, surgiram da necessidade de resolver os seguintes problemas:</p>
<table cellspacing="2" cellpadding="2" width="507" border="1">
<tbody>
<tr>
<td valign="top" width="264">Problema / Necessidade</td>
<td valign="top" width="235">Solução</td>
</tr>
<tr>
<td valign="top" width="264">Ambiente Hipermídia Cliente-Servidor</td>
<td valign="top" width="235">HTTP / HTML</td>
</tr>
<tr>
<td valign="top" width="264">Controle de Acesso</td>
<td valign="top" width="235">Autenticação HTTP</td>
</tr>
<tr>
<td valign="top" width="264">Preencher e Editar Campos, Interação com Bancos de Dados</td>
<td valign="top" width="235">Formulários HTML, CGI</td>
</tr>
<tr>
<td valign="top" width="264">Gerência de Sessão</td>
<td valign="top" width="235">Cookies</td>
</tr>
<tr>
<td valign="top" width="264">Segurança de Tráfego</td>
<td valign="top" width="235">SSL</td>
</tr>
<tr>
<td valign="top" width="264">Conteúdo Rico</td>
<td valign="top" width="235">Applets Java, ActiveX, JavaScript</td>
</tr>
<tr>
<td valign="top" width="264">Separação de Conteúdo e Apresentação</td>
<td valign="top" width="235">CSS</td>
</tr>
<tr>
<td valign="top" width="264">Integração entre Serviços</td>
<td valign="top" width="235">XMLRPC / SOAP</td>
</tr>
</tbody>
</table>
<p>Agora repare esta tabela com um olhar crítico: Dentro da visão original da Web, ela buscava apenas ser um repositório online de documentos, o que basicamente envolve HTTP e HTML. Ou seja, apenas o primeiro item da lista.</p>
<p>Todas estas necessidades transformaram a mesma em um ambiente dinâmico de troca de informações. Os documentos não eram mais arquivos em uma pasta: Tornaram-se registros complexos em grandes bancos de dados, constantemente acessados e modificados.</p>
<p>A solução Java, àquiela época, eram os Servlets, que buscavam apenas a geração de conteúdo dinâmico. Ela se situa no tempo um pouco depois do conteúdo rico na linha do tempo. Era uma solução adequada? Bem, não muito, mas o Java Server Pages, em 1998, ajudou a aliviar e torná-la mais agradável.</p>
<p>Mas acompanhando esta corrida, perceba que surgiram requisitos implícitos: Bancos de Dados, Logs, Gerência de Concorrência, Pooling de Recursos. Performance e Elegância.</p>
<h2>Complexidade</h2>
<p>Esta complexidade minou inicialmente o poder do Java. As soluções saiam, mas jamais dentro de padrões aceitáveis de performance. A Lei de Moore ajudou e hoje Java está entre as plataformas mais adequadas em termos de performance, e relação custo-benefício adequadas a maioria das corporações.</p>
<p>Perceba a ressalva acima: Corporações. Ela ainda estava – e ainda está – inacessível a maioria dos desenvolvedores. Desenvolver em casa e publicar na web uma aplicação Java envolve um pouco de esforço em achar soluções de hospedagem, devido a natureza do negócio de hospedagem.</p>
<p>Em paralelo, ambientes como Perl e PHP trouxeram uma outra visão: Ambientes Interpretados, leves, com valores diferentes do que o público-alvo do java buscava. Isto gerou uma impedância entre os ambientes que até hoje persiste: A maioria dos ambientes de hospedagem é capaz de rodar Perl e PHP, mas não Java. Isto criou uma cultura e uma divisão: Programadores PHP acham Java Complexo demais, e Programadores Java consideram PHP inadequado para fazer aplicações dentro das necessidades da sua empresa.</p>
<h2>AOP, IOC, DI e ORM: Abordando os Problemas sob outro Ponto de Vista</h2>
<p>Estamos em 2004. Nesta época, as soluções Java já estavam sendo questionadas quanto a sua capacidade de manterem-se adequadas aos requisitos modernos. O AOP criou um novo paradigma de programação, mas o conceito de Injeção de Dependências e Inversão de Controle, popularizados pelo Spring, e o de Mapeamento Objeto-Relational (Hibernate) mostraram que desenvolver em Java era possível – apenas não estavam sendo feito de uma forma efetiva.</p>
<p>Em paralelo, o Struts tornava-se norma, enquanto buscava-se ao JSF a agilidade e leveza que o ASP.NET trazia.</p>
<h2>Ruby on Rails – Uma Nova Abordagem (e Valores)</h2>
<p>O Ruby on Rails é um divisor de águas: Com um novo jogo de valores (YAGNI, DRI), ele buscou a simplicidade e jogou outro requisito na roda: Interatividade. Muitos (bons) programadores Java, Perl, Python e PHP foram para o Ruby on Rails.</p>
<h2>Web 2.0</h2>
<p>Em paralelo, cunhou-se o termo “Web 2.0”. Redes, Ajax, Mashups. Novos requisitos na roda.</p>
<h2>Recomeçando</h2>
<p>Neste ponto, haviam 3 grandes problemas:</p>
<ul>
<li>Haviam basicamente 2 tribos de desenvolvedores Web: Os programadores de Scripting (PHP/Perl/Python), com ambientes interpretados, dinâmicos e leves, e os programadores Java, compilados e exigindo mais memória;</li>
<li>As soluções interpretadas forneciam aplicações com grande demanda (CMS), enquanto as Java eram orientadas ao ambiente enterprise. Porém, isso não impedia que soluções de CMS open source fossem viáveis para corporações, mas o temor natural de integrar uma aplicação PHP com uma base de dados manipulada por uma aplicação Java inibia a sua adoção, resultando em vários CMS Java de uso interno – causando diariamente a reinvenção da roda nas empresas;</li>
<li>Haviam outras maneiras de se fazer as coisas, e mais atrativas que em Java;</li>
</ul>
<p>No ambiente Java, criou-se um claro conflito de valores: Como produzir mais e ao mesmo tempo, integrar com o que eu tenho?</p>
<p>Esta proposta foi a premissa para a IBM inaugurar o Project Zero.</p>
<h2>O Conceito:</h2>
<p>O Project Zero busca trazer leveza, reuso, simplicidade e agilidade para o desenvolvimento web. As seguintes premissas foram adotadas:</p>
<ul>
<li>O Java permite o uso de linguagens Interpretadas;</li>
<li>O Ambiente Servlet/JSP é complexo, e isto causa problemas;</li>
<li>O conceito dos Archives J2EE &#8211; EAR, WAR, RAR não provê a reusabilidade necessária para as aplicações, trazendo retrabalho;</li>
<li>O ambiente deve ser flexível, permitindo que vários meios sejam usados para desenvolver um website;</li>
<li>O Open Source é uma realidade, e não pode ser ignorado;</li>
</ul>
<p>Desta forma, a proposta do Zero procura englobar estes fatores em uma solução onde:</p>
<ul>
<li>O open source seja uma realidade, e que a equipe interaja com a comunidade buscando uma solução não apenas com massa crítica, mas focada em um objetivo comum;</li>
<li>Linguagens como Groovy e PHP possam integrar-se com o Java;</li>
<li>O reuso de aplicações Web seja uma coisa possível</li>
<li>O desenvolvimento pode ser feito a partir de um runtime pequeno (2MB), podendo ser feito pela linha de comando, IDE (Eclipse), ou até pelo Browser (AppBuilder);</li>
<li>As abstrações de acesso a dados (arquivos locais e remotos, e-mail, e Web) sejam vistos como recursos REST, abstraindo a complexidade de uma forma homogênea</li>
</ul>
<p>O Zero possui um <a href="http://projectzero.org/" target="_blank">website</a>, com <a href="http://www.projectzero.org/blog/" target="_blank">blog</a>, <a href="http://www.projectzero.org/forum" target="_blank">forum</a>, <a href="http://www.projectzero.org/bugzilla/" target="_blank">issue tracking</a>, <a href="http://www.projectzero.org/wiki/bin/view/Development" target="_blank">área de desenvolvimento</a>, <a href="http://www.projectzero.org/download/" target="_blank">downloads</a> e <a href="http://www.projectzero.org/documentation/" target="_blank">documentação</a>. Tudo rodando no runtime do Zero, e mantido pela equipe do Zero. </p>
<h2>Aplicações:</h2>
<p>O meu tcc foi feito no Zero. Ambora me arrependa de ter tido uma abordagem mais monolítica (evitando o PHP e Groovy), comparar a sua performance (Spring + Hibernate) contra um servidor J2EE equivalente demonstrou uma performance superior. Lembra quando falei de um runtime leve? Pois então.</p>
<p>Outro ponto forte é integração: Vamos supor que você possui na intranet um portal <a href="http://en.wikipedia.org/wiki/Mediawiki" target="_blank">MediaWiki</a>, e gostaria de integrar a sua autenticação com algum sistema proprietário da empresa. Ou o seu blog (em <a href="http://en.wikipedia.org/wiki/Wordpress" target="_blank">WordPress</a>) necessita de alguma integração com o seu CMS Java? Pois – mesmo sendo PHP, o Zero integra com eles de uma forma genial.</p>
<h2>E o sMash? </h2>
<p>Ah sim, o sMash é a versão comercial do Zero, e é disponível pela IBM. Mas a mesma é baseada no Zero e na sua comunidade.</p>
<h2>Concluindo</h2>
<p>Então fica o convite: Veja os links acima e julgue se a Web não precisa de um curto-circuito. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2009/05/20/931/project-zero-ou-websphere-smash-porqu-pra-qu-o-que-quando-e-como-e-o-que-que-mesmo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LogBack on Zero</title>
		<link>http://www.leal.eng.br/mnemetica/2008/11/06/912/logback-on-zero.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2008/11/06/912/logback-on-zero.html#comments</comments>
		<pubDate>Thu, 06 Nov 2008 06:06:35 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2008/11/06/912/logback-on-zero.html</guid>
		<description><![CDATA[(Another tech post. Yes, I’ve been all about logging frameworks lately. If you think I should start another blog, this time on tech in plain english, feedback on the comments section.)
Ok, now that zero.firephp is here, its time to dissect ProjectZero itself. It was not pleasant to deal with the ivy files, so lets get [...]]]></description>
			<content:encoded><![CDATA[<p><em>(Another tech post. Yes, I’ve been all about logging frameworks lately. If you think I should start another blog, this time on tech in plain english, feedback on the comments section.)</em></p>
<p>Ok, now that <a href="http://www.projectzero.org/blog/index.php/2008/10/25/firephp-on-zero/">zero.firephp</a> is here, its time to dissect <a href="http://www.projectzero.org/">ProjectZero</a> itself. It was not pleasant to deal with the <a href="http://ant.apache.org/ivy/">ivy files</a>, so lets get started before I remember how painful it was to deal with a cheap <a href="http://maven.apache.org/">M2</a> rip-off.</p>
<h1>Java Logging 101: The History</h1>
<p><em>(Skip to the next section if you already know about this)</em></p>
<p>In the end, there was System.out. And this was good.</p>
<p>People then started to wonder that if would be helpful to separate logging statement from application output. Thus, Unix programmers quickly rushed to System.err, already in the knowledge it was a safe harbor. So now people could enable and disable logging. And that was good as well.</p>
<p>However, people started to notice that when logging was on, performance was down while copious amounts of logging data were written as well. So, Java people borrowed the concept of Logging Levels and started put simple statements to test before logging.</p>
<p>Then, people wanted to have the ability to save output into a file. Perhaps for daemons, or perhaps just to keep a copy handy to look and compare with other. Thus, the logging flags to file output were born.</p>
<p>Then, Ceki Gülcü (aka “The God of Logging ”) came and thought it was a good idea to mix the hierarchy java uses in the package system, mix levels, analyze and came up with <a href="http://logging.apache.org/log4j/">Log4J</a>. <em>That was excellent</em>, and several other frameworks were made after his one.</p>
<p>Soon, a company with the Stock Symbol “JAVA” on NASDAQ thought it would be good to bless. What a mess (it rhymed!)… The <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/package-summary.html">java.util.logging</a> package was born, and this was not good, culminating in flame wars (vi-versus-emacs-style) in Apachia, a small micronation on the internets.</p>
<p>The overlords at <a href="http://commons.apache.org/">commonia</a>, a small county within Apachia , in an attempt to restore peace and ensure Apachia’s economical growth, devised <a href="http://commons.apache.org/logging/">commons-logging</a>, an ill-fated that while good in nature (trying to automagically bridge logging requests between log4j and java.util.logging), in truth created another layer of abstraction which is still useful today, but creating a third logging API which also brought some nasty classloading issues.</p>
<p>Ceki Gülcü left apache, and log4j 1.3 was soon left deprecated. 2.0 is said to be still in the works. Meanwhile, Ceki came back and revised the concepts between commons-logging and log4j, creating <a href="http://slf4j.org">slf4j</a> and <a href="http://logback.qos.ch/">logback</a>, respectively, trying to narrow the gap and bring his vision back to the world. It also includes libraries to bridge java.util.logging and plug-in replacements for log4j as well as commons-logging.</p>
<p>In the end, we have 5 apis, all of them completely different.</p>
<p><em>Oh god… I miss System.out.</em></p>
<h1>Zero</h1>
<p>Zero uses java.util.logging. Being a good citizen of the Java World, seems fine. But if you want to use logback, its possible. In particular, <a href="http://www.leal.eng.br/files/logback-for-zero.zip">download this file</a>, unpack and keep going, as I will outline the steps required to enable logback and, as a bonus, see zero logging under <a href="http://lilith.huxhorn.de/">Lilith</a>, a handy logging viewer for logback.</p>
<h2>Step #1: Declare the Dependencies</h2>
<p>Take the enclosed ivy.xml. Merge the section outlined below into your ivy.xml:</p>
<p><img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="120" alt="image" src="http://www.leal.eng.br/mnemetica/wp-content/uploads/LogBackonZero_2B89/image32087deb721646a78ec02896de22bb42.png" width="244" border="0" /> </p>
<p>You’re inserting the APIs required slf4j&#160; (transitively, from jul-to-slf4j), as well as logback-classic (which also includes core). However, you’re excluding some dependencies which are not needed for logback. Change them if you need (specially janino).</p>
<h2>Step #2: Declare the java.util.logging Bridge</h2>
<p>Simply copy the contents from logging.properties into your project.</p>
<h2>Step #3: Modify zero.config as you need</h2>
</p>
</p>
<p>In particular, the /config/logging/levels setting. The one declared is set as the root appender. But the syntax is “logger” : “level”, where you put the desired logging levels.</p>
<p>The one declared in the file is pretty verbose, which may be undesirable. I use those settings:</p>
<p><font face="Courier New">/config/logging/levels += {     <br />&#160; &quot;*&quot; : &quot;ALL&quot;,      <br />&#160; &quot;zero.network&quot; : &quot;OFF&quot;,      <br />&#160; &quot;zero.core.context.zones.UserZoneHandler&quot; : &quot;INFO&quot;      <br />}</font></p>
<h2>Step #4: Logback</h2>
<p>Declare a logback.xml file. The enclosed one should work with <a href="http://lilith.huxhorn.de/">lilith</a>. You can also use <a href="http://logback.qos.ch/consolePlugin.html">logback’s Eclipse Plug-In</a> instead. </p>
<h2>Step #5: Lilith</h2>
<p>Open, Unpack, Run.</p>
<h2>Step #6: The result</h2>
<p>Here is the result, in all of its glory!</p>
<p><img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="190" alt="image" src="http://www.leal.eng.br/mnemetica/wp-content/uploads/LogBackonZero_2B89/imagea4c32fe76640450bb329d57c02f16447.png" width="244" border="0" /> </p>
<h2>Beyond logback and java.util.logging: commons-logging and log4j</h2>
<p>You can also declare the compatible counterparts for integrating commons-logging and log4j into the slf4j/logback combo as well. Check <a href="http://slf4j.org">the slf4j web site</a> for more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2008/11/06/912/logback-on-zero.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some JXTA / JXME / CLDC / JSE Notes</title>
		<link>http://www.leal.eng.br/mnemetica/2008/01/01/863/some-jxta-jxme-cldc-jse-notes.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2008/01/01/863/some-jxta-jxme-cldc-jse-notes.html#comments</comments>
		<pubDate>Tue, 01 Jan 2008 07:55:42 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[sys/net]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[jxse jxme jxta midp java p2p cldc]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2008/01/01/863/some-jxta-jxme-cldc-jse-notes.html</guid>
		<description><![CDATA[I've written some notes on making JXME work, as well as making it work under Java SE as well.]]></description>
			<content:encoded><![CDATA[<p>(Sim, outro post técnico. Pule este, ok?)</p>
<p>I&#8217;ve written some notes on making <a href="https://jxta-jxme.dev.java.net/">JXME</a> work, as well as making it work under Java SE as well. </p>
<p>Bearing in mind I&#8217;m not your best JXTA/CLDC/JSE source, feel free to <a href="http://www.leal.eng.br/wiki/codigo:java:jxme-4-se">take a look</a>. Thank you. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2008/01/01/863/some-jxta-jxme-cldc-jse-notes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criatividade com Hor&#225;rio: Isto existe?</title>
		<link>http://www.leal.eng.br/mnemetica/2007/09/10/854/criatividade-com-horrio-isto-existe.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2007/09/10/854/criatividade-com-horrio-isto-existe.html#comments</comments>
		<pubDate>Mon, 10 Sep 2007 06:18:33 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2007/09/10/854/criatividade-com-horrio-isto-existe.html</guid>
		<description><![CDATA[A Criatividade em si, é paradoxal: Nada realmente é original atualmente, e tudo vem de idéias herdadas anteriormente, apenas com pequenas digressões em cima da anterior.]]></description>
			<content:encoded><![CDATA[<p><a href="http://joseoliveira.com/2007/09/09/ele-quer-trabalhar-em-uma-fabrica-de-software/">Este post</a> incendiou <a href="http://www.jroller.com/vfpamp/entry/entrei_em_colapso">uma discussão interessante</a>:</p>
<blockquote><p>Piorou quando diz que para programar não é preciso inspiração. Isso é verdade se você for um <a href="http://en.wikipedia.org/wiki/Web_monkey">macaco que escreve código</a>, mas para quem vai um pouco além disso, programar é muito de inspiração (além de concentração). E convenhamos que inspiração olhando apenas para IDE não é exatamente fácil de alcançar, por isso eu defendo que dispersar os pensamentos as vezes é benéfico para quem está programando.</p>
</blockquote>
<p>O que eu penso? Bem, penso que superestimamos a criatividade. Semestre passado, me dediquei a repensar a maneira com a qual eu lidava com os meus processos criativos. Particularmente, produzir trabalhos pra faculdade e entregar código. Não preciso descrever toda a minha produção semestre passado, mas posso sumarizar: Foi imensa.</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="image" src="http://www.leal.eng.br/mnemetica/wp-content/uploads/CriatividadecomHorrioIstoexiste_2E79/image878bff97da39483aacba413f26b7c8d8.png" align="right" border="0"/> Mas e afinal, o que ela teve de tão milagroso ou ímpar para justificar este meu post? Método. A Criatividade em si, é paradoxal: Nada realmente é original atualmente, e tudo vem de idéias herdadas anteriormente, apenas com pequenas digressões em cima da anterior. Logo, o chave neste processo criativo, na minha opinião, está em compreender todas as variáveis envolvidas, decidir quais realmente importam, e aonde mexer, à partir de um modelo original.</p>
<p>Soa familiar? É exatamente este a origem dos <a href="http://en.wikipedia.org/wiki/Design_Patterns">Design Patterns</a>. Mas não se limita a isso: Parte chave de um processo criativo envolve em constantemente aumentar o seu vocabulário de idiomas. E quanto a isto, ler códigos-fonte e aprender novas abstrações e implementações é, sem dúvida, o segredo de um código rápido, elegante, curto, e de sucesso.</p>
<p>Horários Ajudam: Na minha experiência, estabelecer um horário e criar disciplina ajudou, na medida que eu condicionava o cérebro a trabalhar apenas naquele momento. Eu desplugava, e era o inconsciente que me dava dicas, orientando quanto ao que seria necessário fazer. Lembre-se: Você não precisa saber o caminho aonde chegar lá (mapa / bussóla), quando você pode ter um conjunto de pontos a serem atingidos. Eis porque sempre chegamos tendo apenas a relação de pontos a serem atingidos. Cognição é a chave.</p>
<p>Em tempo: No meu caso do semestre passado, mapas mentais e notas (organizadas ao mesmo tempo usando o <a href="http://www.microsoft.com/onenote">OneNote</a>, <a href="http://onfolio.net/">OnFolio</a>, <a href="http://www.jhorman.org/wikidPad/">WikidPad</a>, <a href="http://trac.edgewall.com/">Trac</a>, e <a href="http://trac.edgewall.com/">dokuwiki</a>, de acordo com o contexto) foram ferramentas de um valor incalculável. Mas não esqueça: A ferramenta não é nada sem o domínio do processo. E, portanto, a disciplina.&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2007/09/10/854/criatividade-com-horrio-isto-existe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: Screencasts e Primeiros Passos com o Eclipse</title>
		<link>http://www.leal.eng.br/mnemetica/2007/08/16/839/java-screencasts-e-primeiros-passos-com-o-eclipse.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2007/08/16/839/java-screencasts-e-primeiros-passos-com-o-eclipse.html#comments</comments>
		<pubDate>Thu, 16 Aug 2007 06:17:17 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[pessoal]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2007/08/16/839/java-screencasts-e-primeiros-passos-com-o-eclipse.html</guid>
		<description><![CDATA[Eu não nego que sou fã incondicional do Eclipse em Java. A facilidade de navegar e depurar programas é, de longe, a feature que eu mais sou fanático nele. Então, seguem três screencasts, para que você possa aprender como navegar pela interface, pelo código, e como depurar...]]></description>
			<content:encoded><![CDATA[<p>Produzi este material para o grupo de estudos para o próximo ICPC, pelo CESUPA. Porém, julguei que o conteúdo era bastante legal, e que merecia ser publicado na forma de screencasts.</p>
<p>Eu não nego que sou fã incondicional do Eclipse em Java. A facilidade de navegar e depurar programas é, de longe, a feature que eu mais sou fanático nele. Então, seguem três screencasts, para que você possa aprender como navegar pela interface, pelo código, e como depurar:</p>
<p>Obs: Eu parto da premissa que você instalou o <a href="http://www.eclipse.org/download/">Eclipse</a> e o <a href="http://java.sun.com/">JDK</a>. :)</p>
<h2>Parte 1: <a href="http://www.leal.eng.br/mnemetica/wp-content/screencasts/Eclipse-Perspectivas.swf">Navegando pela Interface</a></h2>
<p>
<div id="flashcontent-1">This text is replaced by the Flash movie. </div>
<p> <script type="text/javascript">
   var so = new SWFObject("http://www.leal.eng.br/mnemetica/wp-content/screencasts/Eclipse-Perspectivas.swf", "Perspectivas", "640", "550", "8", "#336699");
   so.write("flashcontent-1");
</script>  </p>
</p>
<h2>Parte 2: <a href="http://www.leal.eng.br/mnemetica/wp-content/screencasts/Eclipse-Navegacao.swf">Navegando pelo Fonte</a></h2>
<p>
<div id="flashcontent-2">This text is replaced by the Flash movie. </div>
<p> <script type="text/javascript">
   var so = new SWFObject("/mnemetica/wp-content/screencasts/Eclipse-Navegacao.swf", "Navegação", "640", "550", "8", "#336699");
   so.write("flashcontent-2");
</script>  </p>
</p>
<h2>Parte 3: <a href="http://www.leal.eng.br/mnemetica/wp-content/screencasts/Eclipse-Debugging.swf">Debugging</a></h2>
<p>
<div id="flashcontent-3">This text is replaced by the Flash movie. </div>
<p> <script type="text/javascript">
   var so = new SWFObject("/mnemetica/wp-content/screencasts/Eclipse-Debugging.swf", "Debugging", "640", "550", "8", "#336699");
   so.write("flashcontent-3");
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2007/08/16/839/java-screencasts-e-primeiros-passos-com-o-eclipse.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Momento Jabá: Sonatype</title>
		<link>http://www.leal.eng.br/mnemetica/2007/04/19/742/momento-jaba-sonatype.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2007/04/19/742/momento-jaba-sonatype.html#comments</comments>
		<pubDate>Thu, 19 Apr 2007 04:26:16 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2007/04/19/742/</guid>
		<description><![CDATA[Obviamente eu evito falar da minha vida profissional, mas hoje acho que vou dar uma folga. O clima é de revelação, afinal de contas.
Sou um dos integrantes da Sonatype, uma startup envolvendo as figuras chave envolvidas no Maven 2. Se você não conhece o Maven, então acho que compensa você dar uma visitada em http://maven.apache.org/.
Após [...]]]></description>
			<content:encoded><![CDATA[<p>Obviamente eu evito falar da minha vida profissional, mas hoje acho que vou dar uma folga. O clima é de revelação, afinal de contas.</p>
<p>Sou um dos integrantes da <a href="http://www.sonatype.com/">Sonatype</a>, uma startup envolvendo as figuras chave envolvidas no Maven 2. Se você não conhece o Maven, então acho que compensa você dar uma visitada em <a href="http://maven.apache.org/">http://maven.apache.org/</a>.</p>
<p>Após alguns meses de trabalho, finalmente fomos autorizados a revelar o lançamento da Sonatype. Uma boa introdução é o post do <a href="http://handyande.co.uk/Coding_News/_articles/26.html">Andrew Williams</a> e o do <a href="http://blogs.maven.org/jvanzyl/2007/04/18/1176905394766.html">Jason Van Zyl</a>.</p>
<p>Por hora, é só. Continuem ligados.</p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2007/04/19/742/momento-jaba-sonatype.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I told you! I told you! I told you!!!1!</title>
		<link>http://www.leal.eng.br/mnemetica/2006/12/27/690/i-told-you-i-told-you-i-told-you1-2.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/12/27/690/i-told-you-i-told-you-i-told-you1-2.html#comments</comments>
		<pubDate>Wed, 27 Dec 2006 16:52:15 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA["-Posso blogar?"]]></category>
		<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[dialogos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[sys/net]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/12/27/690/</guid>
		<description><![CDATA[Conversando sobre pocketserver-bootstrap e o seu fino pom.xml: 
&#60;cobalt60&#62; Not really. The overrall idea is to be based off the Profile being used&#60;cobalt60&#62; The Real pocketserver will use it, for sure :))&#60;cobalt60&#62; If you want to see the gory details, jump to pocketserver-bootstrap's pom. You'll be scared :)&#60;yart&#62; hehe, just trying first to start it [...]]]></description>
			<content:encoded><![CDATA[<p>Conversando sobre pocketserver-bootstrap e <a href="http://trac.modafocas.org/pocketserver/browser/trunk/pocketserver-bootstrap/pom.xml?rev=93">o seu fino pom.xml</a>: </p>
<p><code><cobalt60>&lt;cobalt60&gt; Not really. The overrall idea is to be based off the Profile being used<br />&lt;cobalt60&gt; The Real pocketserver will use it, for sure :))<br />&lt;cobalt60&gt; If you want to see the gory details, jump to <a href="http://trac.modafocas.org/pocketserver/browser/trunk/pocketserver-bootstrap/pom.xml?rev=93">pocketserver-bootstrap's pom</a>. You'll be scared :)<br />&lt;yart&gt; <yart>hehe, just trying first to start it and see what it can do <br />&lt;yart&gt;&nbsp;started mnv install - junit.framework.AssertionFailedError: No tests found in org.modafocas.pocketserver.m2.PocketServerMojoTest<br />&lt;cobalt60&gt; <cobalt60>It won't work, really <br />&lt;cobalt60&gt; just look&nbsp;<a href="http://trac.modafocas.org/pocketserver/browser/trunk/pocketserver-bootstrap/pom.xml?rev=93">at the pom, you'll really be scared</a> :)<br />&lt;yart&gt; uhuhuhuhuh<br />&lt;cobalt60&gt; I told you! I told you! I told you! <br />&lt;cobalt60&gt; (mind if I blog this tiny snippet? :))<br />&lt;yart&gt; <yart>maybe not even think to try :) <br />&lt;yart&gt; Just aks later the questions about the plexus when I will have :)<br />&lt;cobalt60&gt; this pom is a rarity :) <br />&lt;cobalt60&gt; It asks <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">antrun</a> which in turn asks <a href="http://maven.apache.org/ant-tasks.html">maven tasks for ant</a> (thus embedding maven within maven), but after having another bootstrap script written by a <a href="http://groovy.codehaus.org/">groovy</a> <a href="http://groovy.codehaus.org/Groovy+Ant+Task">ant task</a> :) </yart></cobalt60></yart></cobalt60></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/12/27/690/i-told-you-i-told-you-i-told-you1-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empacotando Nemo</title>
		<link>http://www.leal.eng.br/mnemetica/2006/12/15/686/empacotando-nemo.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/12/15/686/empacotando-nemo.html#comments</comments>
		<pubDate>Fri, 15 Dec 2006 19:52:33 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[sys/net]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/12/15/686/</guid>
		<description><![CDATA[(Post técnico &#8211; Vida pessoal ainda vegetativa)
No meu entretenimento atual (breve a ser apresentado ao grande público &#8211; stay tuned!), um detalhe me chamou a atenção: O quanto realmente perdemos de espaço, em aplicações java. E o quanto ainda temos que aprender (a despeito de inúmeras soluções de gerência integrada de artefatos e dependências encontradas [...]]]></description>
			<content:encoded><![CDATA[<p>(Post técnico &#8211; Vida pessoal ainda vegetativa)</p>
<p><a href="http://trac.modafocas.org/pocketserver/">No meu entretenimento atual</a> (breve a ser apresentado ao grande público &#8211; stay tuned!), um detalhe me chamou a atenção: O quanto realmente perdemos de espaço, em aplicações java. E o quanto ainda temos que aprender (a despeito de inúmeras soluções de gerência integrada de artefatos e dependências encontradas por aí).</p>
<p>Ok, antes disso, um prólogo: Parte da idéia do meu projeto é demonstrar a viabilidade técnica do que eu chamo de aplicações pervasivas. Sabe aquele programinha útil que você sempre mantém no seu pendrive ou CD? Então, isto é um nicho interessantíssimo.</p>
<p>Na maioria absoluta dos casos, as aplicações que empacotam tem uma característica de executáveis desktop. E porque não aplicações web? Bem, isto envolve a necessidade de pensar sobre as seguintes coisas:</p>
<ul>
<li>Aonde persistir os dados? No disco rígido, na mídia móvel, em rede,&nbsp;ou em lugar algum?</li>
<li>Como integrar os zilhões de dependências de uma pilha Web necessita, de forma portável? Isto é, como consigo empacotar o servidor, seus logs, sua área de comunicação inter-processo, e seus módulos nativos para outras linguagens?</li>
<li>Além disso, será que cabe neste espaço disponível?</li>
</ul>
<p>Com relação aos isso, decidi basear a solução nas seguintes premissas </p>
<ul>
<li><a href="http://plexus.codehaus.org/">Uso de um bom container genérico de componentes</a>, permitindo a inclusão e a exclusão de features através de componentes;</li>
</ul>
<p>Assim, com este container, todos os aspectos ficam gerenciáveis a partir de descritores. Uma nova necessidade, um novo componente. E assim a solução se ajusta.</p>
<p>Que tipos de abstrações são necessárias? As principais são: Serviços de Persistência (RDBMS, FileSystem, Configuração, Propriedades), Serviços de Conectividade (SSH, HTTP, SMTP), e Serviços&nbsp;de Localização e Publicação de Recursos (LiveTribe, Bonjour, Container), Logging, Cache, entre outros. Em suma: Tudo aquilo que, em um ambiente de servidor, é tido como de facto, fica sujeito a questionamentos. Como gosto e questionar, acho que a abordagem é válida.</p>
<p>A partir deste container, permitir que os diversos aspectos (storage, logging, IPC, JNI) sejam abstraídos conforme a disponibilização destes componentes;</p>
<ul>
<li>Fatorar a questão do storage</li>
</ul>
<p>Minhas propriedades podem ficar num lugar (persistido na memória, carregado via HTTP, serializado via SFTP), a base em outro (Embedded, ou via um Tunnel SSH), e a aplicação pode continuar no pendrive. Porque não, portanto, permitir que sejam criadas &#8220;Zonas&#8221; de Storage, como componentes, e disponíveis para os outros serviços? No caso particular, isto é feito através do <a href="http://jakarta.apache.org/commons/vfs/">commons-vfs</a>.</p>
<ul>
<li>Gerência de Dependência (ainda indefinido &#8211; mantenha-se alerta!)</li>
</ul>
<p>Este conceito é relativamente novo, mas popularizado por idéias como o <a href="http://maven.apache.org/">Maven</a> (particularmente, o Maven 2),&nbsp;<a href="http://www.dpml.net/transit/concepts/index.html">Transit</a>, e agora, o <a href="http://incubator.apache.org/projects/ivy.html">Ivy</a>. Consiste em gerenciar quais classes devem ser carregadas para atender as necessidades de outra e, além disso, permitir a sua resolução dinâmica através de repositórios). Ainda não cheguei a um consenso sobre a isto.</p>
<ul>
<li><a href="http://java.sun.com/j2se/1.5.0/docs/guide/deployment/deployment-guide/pack200.html">Empacotamento</a> de Aplicações Java usando <a href="http://tonicsystems.com/products/jarjar/">técnicas agressivas</a> de <a href="http://sfx4j.dev.java.net/">otimização</a>&nbsp;de espaço, ou, empacotamento de forma clássica (arquivo zip);</li>
</ul>
<p>Já ouviu falar no Pack200? Bem, vamos a alguns números, relativos a um <a href="http://trac.modafocas.org/pocketserver/browser/trunk/pocketserver-bootstrap/">stub de carga/resolução de artefatos mínimo para o pocketserver</a>:</p>
<p>Arquivo .jar, sem a inclusão das dependências:</p>
<p><font face="Lucida Console">-rw-r&#8211;r&#8211; 1 aldrin aldrin&nbsp;&nbsp;&nbsp; 8150 2006-12-15 12:05 pocketserver-bootstrap-0.0.1-SNAPSHOT.jar</font></p>
<p>Nada mal, ok? Aplicando o Jar Jar Links (<a href="http://en.wikipedia.org/wiki/Jar_Jar_Binks">não esse</a>, <a href="http://tonicsystems.com/products/jarjar/">mas esse</a>), eu consigo fazer com que as dependências sejam embutidas como um subpacote do pacote principal. Resultado? Isto:</p>
<p><font face="Lucida Console">-rw-r&#8211;r&#8211; 1 aldrin aldrin 3290958 2006-12-15 12:05 pocketserver-bootstrap-0.0.1-SNAPSHOT-full.jar</font></p>
<p>3.3 Mib? Não era 8K? Era&#8230; Ok, vamos refazer o jar, porém aplicando alguma filtragem, e excluindo pacotes que serão desnecessários:</p>
<p><font face="Lucida Console">-rw-r&#8211;r&#8211; 1 aldrin aldrin 1182446 2006-12-15 12:26 pocketserver-bootstrap-standalone-0.0.1-SNAPSHOT.jar</font></p>
<p>Melhorou. Agora, pack200 para o tiro de misericórdia. Vou pular os detalhes (exige uma explicação sobre compressão lossy, teoria da informação, e compressão/arquivamento). Mas, se queres uma boa noção, ele é uma compressão lossy (estilo .jpg e .mp3, aonde a descompactação não é necessariamente fiel ao arquivo de origem), alinhado com a lógica de compressão após arquivo (i.e., &#8220;-Porque meu .tar.gz é menor que o meu .zip&#8221;):</p>
<p><font face="Lucida Console">-rw-r&#8211;r&#8211; 1 aldrin aldrin&nbsp; 184475 2006-12-15 12:26 pocketserver-bootstrap-0.0.1-SNAPSHOT-optimized-full.pack.gz</font></p>
<p>Mas pera, não é um jar. Sim, com razão. O pack200 foi feito para ser usado basicamente pelo JNLP (i.e., Java WebStart). Porém, com alguns ajustes (em breve &#8211; caaaalma!), <a href="http://trac.modafocas.org/pocketserver/browser/trunk/pocketserver-pack200-vfs-provider/">meu módulo de Pack200 pra Jar para o commons-vfs</a> deve reproduzir o efeito desejado). Sem perda de performance, um ganho de mais de 20x em relação ao primeiro jar completo.</p>
<p><em>E aí fica a dúvida? Será que estamos preparados para isso?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/12/15/686/empacotando-nemo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eu vou ficar rico as minhas custas!</title>
		<link>http://www.leal.eng.br/mnemetica/2006/09/29/576/eu-vou-ficar-rico-as-minhas-custas.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/09/29/576/eu-vou-ficar-rico-as-minhas-custas.html#comments</comments>
		<pubDate>Sat, 30 Sep 2006 02:38:42 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA["-Posso blogar?"]]></category>
		<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[dialogos]]></category>
		<category><![CDATA[histórias]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[pessoal]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/09/29/576/</guid>
		<description><![CDATA[
No Contexto: Como troubleshooting é uma tarefa corriqueira, mas os 95% não percebem, e como otimizar o processo de identificação / resolução de problemas. Anteriormente, um e-mail de despedida alertando que o msn do júlio não é google.
Aldrin Leal said:Taí, cria um modo psicoterapeuta (estilo M-x Doctor do emacs) como bot do MSN, e que [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>No Contexto: Como troubleshooting é uma tarefa corriqueira, mas os 95% não percebem, e como otimizar o processo de identificação / resolução de problemas. Anteriormente, um e-mail de despedida alertando que o msn do júlio não é <a href="http://www.google.com/">google</a>.</p>
<p><em>Aldrin Leal said:<br /></em>Taí, cria um modo psicoterapeuta (estilo M-x Doctor do emacs) como bot do MSN, e que também avalie potenciais respostas no google. se depois de 3 frases o mesmo hit aparecer, ele sugere conferir no google<br /><em>Julio said:<br /></em>hehehe boa<br /><em>Aldrin Leal said:<br /></em><a href="http://www.alicebot.org/">http://www.alicebot.org/</a><br /><em>Aldrin Leal said:<br /></em><a href="http://www.robotinvaders.com/">http://www.robotinvaders.com/</a><br /><em>Julio says (23:36):<br /></em>po manero<br /><em>Aldrin Leal says (23:36):<br /></em>Égua, curti. Os caras tem XML pra alimentar os bots.<br /><em>Aldrin Leal says (23:36):<br /></em>VAMO FAZER UM ALDRINLEALBOT AGORA!<br /><em>Aldrin Leal says (23:36):<br /></em>(posso blogar?)<br /><em>Julio says (23:36):<br /></em>nem<br /><em>Julio says (23:36):<br /></em>eu vou pra farra<br /><em>Julio says (23:36):<br /></em>pode blogar sim<br /><em>Julio says (23:36):<br /></em>tira o nem e bota vamos la so tu <br /><em>Julio says (23:36):<br /></em>ahehae</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/09/29/576/eu-vou-ficar-rico-as-minhas-custas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eu amo jEdit!</title>
		<link>http://www.leal.eng.br/mnemetica/2006/08/27/535/eu-amo-jedit.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/08/27/535/eu-amo-jedit.html#comments</comments>
		<pubDate>Sun, 27 Aug 2006 10:26:14 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/08/27/535/</guid>
		<description><![CDATA[
Pois afinal de contas, poucos são os editores que tem a coragem de fatorar o seu engine de Syntax Highlighting, permitindo que eu reuse (sob domínio público e/ou licença MIT), e gerar um Dump como este:
&#160;
package&#160;jEdit.Syntax;
import&#160;java.io.CharArrayWriter;import&#160;java.io.FileInputStream;import&#160;java.io.IOException;
import&#160;org.apache.commons.io.IOUtils;
public&#160;class&#160;TestTokenMarker&#160;{&#160;&#160;&#160;&#160;public&#160;static&#160;void&#160;main(String[]&#160;args)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CharArrayWriter&#160;caw&#160;=&#160;new&#160;CharArrayWriter();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;(int&#160;i&#160;=&#160;0;&#160;i&#160;&#60;&#160;args.length;&#160;i++)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;file&#160;=&#160;args[i];&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;FileInputStream&#160;fis&#160;=&#160;null;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fis&#160;=&#160;new&#160;FileInputStream(file);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOUtils.copy(fis,&#160;caw);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;catch&#160;(IOException&#160;e)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;finally&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOUtils.closeQuietly(fis);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOUtils.closeQuietly(caw);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;char[]&#160;buf&#160;=&#160;caw.toCharArray();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;highlight(buf);&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;private&#160;static&#160;void&#160;highlight(char[]&#160;buf)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;str&#160;=&#160;new&#160;String(buf);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Segment&#160;sourceSegment&#160;=&#160;new&#160;Segment(buf,&#160;0,&#160;buf.length);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TokenMarker&#160;tk&#160;=&#160;new&#160;JavaTokenMarker();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String[]&#160;lines&#160;=&#160;str.split(&#8220;\\n&#8221;);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tk.insertLines(0,&#160;lines.length);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Token&#160;rootToken&#160;=&#160;tk.markTokens(sourceSegment,&#160;0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int&#160;pos&#160;=&#160;0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;while&#160;(null&#160;!=&#160;rootToken)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(&#8220;id:&#160;&#8221;&#160;+&#160;rootToken.id&#160;+&#160;&#8220;;&#160;len=&#8221;&#160;+&#160;rootToken.length&#160;+&#160;&#8220;:&#160;&#8221;&#160;+&#160;new&#160;String(buf,&#160;pos,&#160;rootToken.length));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pos&#160;+=&#160;rootToken.length;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rootToken&#160;=&#160;rootToken.next;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;}}
&#160;
]]></description>
			<content:encoded><![CDATA[</p>
<div class="sourceCode"><font color="#ff00ff"><strong></strong></font>Pois afinal de contas, poucos são os editores que tem <a href="http://syntax.jedit.org/">a coragem de fatorar o seu engine de Syntax Highlighting</a>, permitindo que eu reuse (sob domínio público e/ou licença MIT), e gerar um Dump como este:</div>
<div class="sourceCode">&nbsp;</div>
<div class="sourceCode"><font color="#ff00ff"><strong>package</strong></font>&nbsp;jEdit.Syntax;</p>
<p><font color="#ff00ff"><strong>import</strong></font>&nbsp;java.io.CharArrayWriter;<br /><font color="#ff00ff"><strong>import</strong></font>&nbsp;java.io.FileInputStream;<br /><font color="#ff00ff"><strong>import</strong></font>&nbsp;java.io.IOException;</p>
<p><font color="#ff00ff"><strong>import</strong></font>&nbsp;org.apache.commons.io.IOUtils;</p>
<p><font color="#ff0000"><strong>public</strong></font>&nbsp;<font color="#9600">class</font>&nbsp;TestTokenMarker&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>public</strong></font>&nbsp;<font color="#ff0000"><strong>static</strong></font>&nbsp;<font color="#9600">void</font>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharArrayWriter&nbsp;caw&nbsp;=&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;CharArrayWriter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>for</strong></font>&nbsp;(<font color="#9600">int</font>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;=&nbsp;args[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;=&nbsp;<font color="#650099"><strong>null</strong></font>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>try</strong></font>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis&nbsp;=&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;FileInputStream(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.copy(fis,&nbsp;caw);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<font color="#ff0000"><strong>catch</strong></font>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<font color="#ff0000"><strong>finally</strong></font>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.closeQuietly(fis);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.closeQuietly(caw);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#9600">char</font>[]&nbsp;buf&nbsp;=&nbsp;caw.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlight(buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>private</strong></font>&nbsp;<font color="#ff0000"><strong>static</strong></font>&nbsp;<font color="#9600">void</font>&nbsp;highlight(<font color="#9600">char</font>[]&nbsp;buf)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;String(buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Segment&nbsp;sourceSegment&nbsp;=&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;Segment(buf,&nbsp;0,&nbsp;buf.length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TokenMarker&nbsp;tk&nbsp;=&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;JavaTokenMarker();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;lines&nbsp;=&nbsp;str.split(<font color="#650099">&#8220;\\n&#8221;</font>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tk.insertLines(0,&nbsp;lines.length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Token&nbsp;rootToken&nbsp;=&nbsp;tk.markTokens(sourceSegment,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#9600">int</font>&nbsp;pos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>while</strong></font>&nbsp;(<font color="#650099"><strong>null</strong></font>&nbsp;!=&nbsp;rootToken)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#650099">&#8220;id:&nbsp;&#8221;</font>&nbsp;+&nbsp;rootToken.id&nbsp;+&nbsp;<font color="#650099">&#8220;;&nbsp;len=&#8221;</font>&nbsp;+&nbsp;rootToken.length&nbsp;+&nbsp;<font color="#650099">&#8220;:&nbsp;&#8221;</font>&nbsp;+&nbsp;<font color="#ff0000"><strong>new</strong></font>&nbsp;String(buf,&nbsp;pos,&nbsp;rootToken.length));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;+=&nbsp;rootToken.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rootToken&nbsp;=&nbsp;rootToken.next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>
<div class="sourceCode">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/08/27/535/eu-amo-jedit.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A personal report, and a cry for help&#8230;</title>
		<link>http://www.leal.eng.br/mnemetica/2006/07/31/515/a-personal-report-and-a-cry-for-help.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/07/31/515/a-personal-report-and-a-cry-for-help.html#comments</comments>
		<pubDate>Mon, 31 Jul 2006 22:09:23 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/07/31/515/</guid>
		<description><![CDATA[(Nota: Este post está em Inglês pelo seu conteúdo excessivamente técnico e pela minha própria necessidade de obter-se um feedback. Você pode ignorá-lo. Fui criado pra ser nerd, lembra?)
Lately, I´ve refactoring a very specific section on my job&#8217;s internal information system: Reporting. But first, a small background:
I parachute-landed at my current employer&#8217;s project, as a [...]]]></description>
			<content:encoded><![CDATA[<p>(Nota: Este post está em Inglês pelo seu conteúdo excessivamente técnico e pela minha própria necessidade de obter-se um feedback. Você pode ignorá-lo. Fui criado pra ser nerd, lembra?)</p>
<p>Lately, I´ve refactoring a very specific section on my job&#8217;s internal information system: Reporting. But first, a small background:</p>
<p>I parachute-landed at my current employer&#8217;s project, as a refactoring/rescue measure. As a solution, I chose key issues to deal with, mostly related to SCM and System Management (e.g., Administrivia). In geek-ese, this means <a href="http://subversion.tigris.org/">subversion</a>, <a href="http://trac.edgewall.com/">trac</a>, <a href="http://logging.apache.org/log4j/">log4j</a>, <a href="http://maven.apache.org/">maven</a>, <a href="http://lucene.apache.org/">more</a> <a href="http://jakarta.apache.org/commons/lang/">great </a><a href="http://jakarta.apache.org/commons/beanutils/">stuff</a> <a href="http://jakarta.apache.org/commons/logging/">from</a> <a href="http://jakarta.apache.org/commons/io/">Apache</a> <a href="http://jakarta.apache.org/commons/vfs/">Jakarta</a>, and <a href="http://jug.safehaus.org/">some</a> <a href="http://backport175.codehaus.org/">other</a> <a href="http://xdoclet.codehaus.org/">great</a> <a href="http://groovy.codehaus.org/">ones</a> from the haus, <a href="http://itext.sourceforge.net/">and</a> <a href="http://beanlib.sourceforge.net/">sourceforge</a>, <a href="http://asm.objectweb.org/">objectweb</a>, and <strike>IBM </strike><a href="http://www.aspectj.org/">Eclipse Foundation</a>. Before, there were only, <a href="http://www.hibernate.org/">Hibernate</a>, <a href="http://www.junit.org/">jUnit</a> and <a href="http://struts.apache.org/">Struts</a>.</p>
<p>Apart from the framework and build environment department, my key goals was to agressively refactor key parts of system. Testing stuff, Hibernate code, SQL handling, and the usual code sniffing cycle (find some random snippet. Smells bad? Think, find similar ocurrences, plan, concept-test, document and deploy a solution. Rinse and repeat). And yes, it works well.</p>
<p>On the improvement room, I also manage some of the operational aspects. We have some <a href="http://cruisecontrol.sourceforge.net/">schweet </a>tools for improving our ability to prevent some and <a href="http://www.trac-hacks.org/wiki/EmailtoTracScript">react</a> to issues as they come, and we&#8217;re <a href="http://www.openqa.org/">still</a> <a href="http://www.nagios.org/">planning</a> <a href="http://www.jmock.org/">for</a> <a href="http://cobertura.sourceforge.net/">more</a>.</p>
<p>Now that you got a glimpse of my project setup, perhaps you might think: Damnit, looks a nightmare to manage. Of course, <a href="http://jira.codehaus.org/browse/BP-50">sometimes the integration breaks</a>. I keep a policy of, before discarding something, grok at the sources, trying to solve&#8217;em myself and documented when needed. But overrall, it hasn&#8217;t been very hard. Except for the usual reluctancy of adopting a new framework (the <a href="http://www.joelonsoftware.com/articles/fog0000000007.html">infamous NIH symdrome</a>, more on this soon), and my usual answer: to learn to write good code, is to know how to read good code.</p>
<p>BTW, time for a quick Maven-and-Eclipse Tip: Do you need to read your project dependencies source code? Say, for a given artifact in ~/.maven/repository/groupId/<b>jars/artifactId-version.jar</b> (M1, of course), their source code location always gets overriden whenever you do a eclipse:generate-classpath goal, right? Yes, unless you place the zip source code as ~/.maven/repository/groupId/<b>src/artifactId-version.zip</b>. The eclipse plugin expects this form in order to hook&#8217;em up correctly. Never mind about setting it manually again!</p>
<p>Back to the NIH stuff. As an afterthought, now I am clearly convinced that, unless that&#8217;s core stuff, you can safely borrow from the OSS community.</p>
<p>One of the most underlooked components is our document engine. As a government institution, we have to issue documents of all sorts and purposes. In a structural side, they&#8217;re simply servlets which extend from a abstract and utility class which implements all the features they need to handle.</p>
<p>Internal users need to change some documents before to sign and ship to customers, so we resorted to the RTF file format. In practise, it&#8217;s easier for them for manually set page-breaks and add minor corrections. We ask them to turn on change tracking and send us a copy, just to correct minor issues and to inspect the need to alter records on our database on a manual basis.</p>
<p>Lately, I&#8217;ve had been assigned the task to generate some reports. Remember when I said underlooked? Well, welcome to my current karma payables assignment: The reporting system uses iText for the bulk of its document-generation needs. In a nutshell, iText generates html, rtf, pdf, and a internal Xml format, suitable regeneration with some command-line tools. On an use-case basis, creating a Document with iText looks a lot like dealing with Swing/AWT stuff: You create small instances, plug&#8217;em together. On an internal basis, iText <b>*DOES NOT*</b> stores the Document data internally like a DOM Tree. Instead, it relies on their Listeners which, say, map a given Paragraph to a RTF internal structure which gets dumped when the document is set as finished.</p>
<p>If you didn&#8217;t use/remember Swing back in the 90&#8217;s, pretend you wrote swing applications without a GUI. Forget Matisse, Netbeans, and VE. Such a bad thought, eh? But, apart from Form initialization stuff, and perhaps some Event Handling, it was nice. But you always end up thinking about some way to delegate it to something a <a href="http://thinlet.com/">bit easier</a>. </p>
<p>Lets make it worse: Pretend you need to maintain a enterprise-wide application with lots of different swing forms. Do yes scare you? God yes. Lots of small, tiny objects tied together waiting for you to break upon a minimal change? You bet.</p>
<p>It became personal, then I decided to do a little research, trying to find suitable ways to work around the need to maintain a java codebase for the sole purpose of document generation. Say, looks easier to manage a velocity template file, or <a href="http://www.dom4j.org/">manipulate</a> <a href="http://www.jdom.org/">as a tree</a>.</p>
<p>On this process,&nbsp; I ended up looking a&nbsp; lot at iText code. From a developers&#8217; viewpoint, it lacks enough docs (apart from the tutorial and javadocs), completely lacks tests, and its source is a complete mess (multiple constructors point to a single one, which in turns calls its super constructor. Such a hard to decide which one is better to call). To make it worse, accessors didn&#8217;t even follow the standard naming conventions. They&#8217;re really not your standard POJO.</p>
<p>Resorting to B plan: I decided to completely ignore their XML interface, and stuck at asm for implementing instrumentation was a basis for tracing their calls. asm is awesome, but not for beginners who needs its real soon now. However, it was a nice experience to deal with: Their event-based mechanism really lets you think how, sometimes, small and minimalistic is beautiful.</p>
<p>B Plan, reloaded: Obcessed with the instrumentation idea, I resorted to the man&#8217;s best know log generator: AspectJ. And it (kinda worked). I mean, now I have an small aspect which yields java code suitable for inserting into a java file which, in turn, yields the very same document which was advised by the aspect. </p>
<p>(Mental Note: The idea of capturing events on a class basis isn&#8217;t very new but, surprisingly, it looks there&#8217;s no real thing to play with. There&#8217;s a really bright and colorful rainbow out there to the ones who follow it and came up with an Abstract Aspect to let you track how a given codebase invokes/uses another)</p>
<p>I consider it a hack, but I&#8217;ll let you reproduce my weekend lab experiment (under the assumption you&#8217;re a <a href="http://www.eclipse.org/">Eclipse 3.2</a> user):</p>
<p>1) First, <a href="http://www.lowagie.com/iText/download.html">download iText&#8217;s source code</a>, and install <a href="http://www.aspectj.org/ajdt/">AJDT</a>. Also, download the binaries jarfiles for <a href="http://logging.apache.org/log4j/">log4j</a> and <a href="http://jakarta.apache.org/commons/lang/">commons-lang</a> and <a href="http://jakarta.apache.org/commons/logging/">commons-logging</a>.<br />2) Create a project, import/unpack the source code and enable AspectJ support. Link the dependencies together with the project.<br />3) Create com.lowagie.text.Trace.aj aspect <a href="http://www.leal.eng.br/mnemetica/wp-contest/source/Trace.aj">[link]</a> and com.lowagie.text.TraceDecorator.java <a href="http://www.leal.eng.br/mnemetica/wp-contest/source/TraceDecorator.java">[link]</a><br />4) In the root directory, create a minimal log4j.xml like this one <a href="http://www.leal.eng.br/mnemetica/wp-content/source/log4j.xml">[link]</a><br />5) Create another project, linking to iText&#8217;s one outlined in step 2. Create a small test harness, like <a href="http://itextdocs.lowagie.com/tutorial/">the ones from the iText Tutorial</a>. But be careful, as <a href="http://itextdocs.lowagie.com/examples/com/lowagie/examples/directcontent/coordinates/Transformations.java">some might lead you</a> into problems&#8230;<br />6) Fire up your harness. And check trace.log (you used my log4j.xml from step 4, right? :])<br />7) Paste up the contents from trace.log into a new classfile. However, insert the following snippet just after your Document() constructor:</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileOutputStream os = new FileOutputStream(&#8220;rtfDoc.rtf&#8221;, false);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; com.lowagie.text.rtf.RtfWriter2.getInstance(obj24561483, os);</p>
<p>Replace obj24561483 with your own object instance symbol. On the end, call close():</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; java.io.FileOutputStream os = new java.io.FileOutputStream(&#8220;rtfDoc.rtf&#8221;, false);</p>
<p>There should be some minor issues. Remember, this is not a production-ready build, but a quick proof-of-concept.</p>
<p>As you might conclude, there&#8217;s a small room for improvement, like:<br />- Aspect Reusability: Why not generalize and build a framework for black box reverse engineering?<br />- TraceDecorator refactoring: This is my current goal. To refactor TraceDecorator into a Listener/Adapter paradigm, thus generating more than just java code (hint: A &#8220;Spring-i-ficator&#8221; emitting a beans.xml-like output for Spring Users)<br />- Better handling: Currently, there are only basic functionality covered. Although it (nicely) suits my needs.</p>
<p>Ideas are strongly welcome. That&#8217;s why I&#8217;m still awake doing this post. To help me leverage key issues and future directions. Please, be my guest :)</p>
<p>And now I&#8217;m (kinda) done, albeit tired. Remember, I not only created, but bred a monster out of my own ideas. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/07/31/515/a-personal-report-and-a-cry-for-help.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Gente reclama, mas também tem a fama&#8230;</title>
		<link>http://www.leal.eng.br/mnemetica/2006/07/18/508/a-gente-reclama-mas-tambem-tem-a-fama.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/07/18/508/a-gente-reclama-mas-tambem-tem-a-fama.html#comments</comments>
		<pubDate>Tue, 18 Jul 2006 20:55:38 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[dialogos]]></category>
		<category><![CDATA[histórias]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notas mentais]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/07/18/508/</guid>
		<description><![CDATA[Surpreendido durante um chat:
Aldrin Leal says:o iText é bom no propósito, mas como framework, deixa a pecar em vários pontos.Aldrin Leal says:Do modo como é implementado até a completa ausência de testcases. Seu único recurso quando a documentação falha é o fonte, que não é nada simples.Paulo says:é um fonte a la aldrin leal? :)Aldrin [...]]]></description>
			<content:encoded><![CDATA[<p>Surpreendido durante um chat:</p>
<p>Aldrin Leal says:<br />o iText é bom no propósito, mas como framework, deixa a pecar em vários pontos.<br />Aldrin Leal says:<br />Do modo como é implementado até a completa ausência de testcases. Seu único recurso quando a documentação falha é o fonte, que não é nada simples.<br />Paulo says:<br />é um fonte a la aldrin leal? :)<br />Aldrin Leal says:<br />Você já leu fontes meus? Daonde soube da minha fama? :)</p>
<p><i>Um fonte Aldrin Leal não possui expressões simples, tende a ser extremamente curto (Porque Densidade de Código é o Nome do Jogo), não possuir expressões simples, e sem contar o completo abandono de comentários. E costuma ser em alguma linguagem ainda emergente ou pouco conhecida (como Java era na época que eu fiz o código que, coincidentemente, meu interlocutor teve que manter).</p>
<p></i></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/07/18/508/a-gente-reclama-mas-tambem-tem-a-fama.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integração Contínua para Loiras</title>
		<link>http://www.leal.eng.br/mnemetica/2006/07/03/501/ci-intro.html</link>
		<comments>http://www.leal.eng.br/mnemetica/2006/07/03/501/ci-intro.html#comments</comments>
		<pubDate>Mon, 03 Jul 2006 18:22:49 +0000</pubDate>
		<dc:creator>Aldrin Leal</dc:creator>
				<category><![CDATA[alimento pra mente]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://www.leal.eng.br/mnemetica/2006/07/03/501/</guid>
		<description><![CDATA[(Não, não há nenhuma sacanagem implícita no título acima)
Se você já programou algo na vida, sabe que o compilador é uma espécie de D&#8217;us no Antigo Testamento: Cheio de Regras e ai de você se você se esquecer de uma.

Mas ele (o compilador) é implacável, e sequer o parabeniza quando você acerta (perverso ele, não?). [...]]]></description>
			<content:encoded><![CDATA[<p>(Não, não há nenhuma sacanagem implícita no título acima)</p>
<p>Se você já programou algo na vida, sabe que o compilador é uma espécie de D&#8217;us no Antigo Testamento: Cheio de Regras e ai de você se você se esquecer de uma.</p>
<p><span id="more-501"></span></p>
<p>Mas ele (o compilador) é implacável, e sequer o parabeniza quando você acerta (perverso ele, não?). Mas isso é só o começo: O fato *DO SEU CÓDIGO COMPILAR* não significa que ele irá fazer o que realmente precisa ser feito.</p>
<p>Essa &#8220;frustração conceitual&#8221; (i.e., o resultado não corresponde ao esperado pelo conceito) é o bug que todos nós vemos. Aquela mensagem de erro inexplicável, aquela situação que dura um tempo considerável pra acabar, ou simplesmente aquele botão que não faz o que tá descrito no manual são bugs. Ou &#8220;comportamentos inesperados&#8221;, ou qualquer outro eufemismo que você prefira.</p>
<p>O fato é: Se formos classificá-los os erros, basicamente possuímos dois tipos de erro:</p>
<ul>
<li>Erros de Compilação, que são gerados quando o compilador olha o seu código fonte;</li>
<li>Erros de Execução, que são as exceptions e aquela &#8220;alguma coisa que está errada pois não está certa&#8221;</li>
</ul>
<p>Se você decidiu tomar a profissão como caminho pra pagar seus pecados (como eu, diga-se de passagem), com o tempo aprendeu a interpretar e a resolver estes tipos de erro, principalmente os de compilação. Uma minoria aprendeu a evitar os de execução não apenas executando os programas, mas <a href="http://www.junit.org/">aplicando testes de unidade</a>, introduzindo <a href="http://findbugs.sourceforge.net/">ferramentas de alerta de possíveis problemas</a>, <a href="http://subversion.tigris.org/">sistemas de gerência de alteração</a>, <a href="http://trac.edgewall.com/">bugtracking</a> e <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">uma centena de outros mecanismos e ferramentas para reduzir a incidência dessa turma</a>.</p>
<p>Isso é certamente ótimo quando o seu problema é limitado à uma pessoa e um problema simples, trivial, pontual, e outros &#8216;al&#8217; que sejam pejorativos. A coisa começa a ficar mais interessante à partir do ponto em que você possui um sistema de controle de fonte *E* mais de uma pessoa envolvida. A partir deste ponto, o ideal é que você passe a se preocupar com que a estabilidade do sistema permaneça inalterada. Afinal de contas, qual a utilidade de uma versão que não compila ou que possui erros graves?</p>
<p>Além disso, é bastante interessante que você consiga compilar a sua aplicação de maneira automática, e, se possível, integrando-se com os testes de unidade. Não apenas no IDE, portanto. Para isso, temos ferramentas como o <a href="http://www.gnu.org/software/make/">make</a>, <a href="http://ant.apache.org/">ant</a>, e <a href="http://maven.apache.org/">maven</a>, feitas no intuito de automatizar cada tarefa necessária para que todo o seu projeto seja compilável e configurável a partir de um único ponto central.</p>
<p>Mas ainda assim, há a possibilidade de automatizar o processo ainda mais, fazendo com que toda a compilação e teste seja feita a partir de outra cópia de trabalho da árvore de checkout, afim de conferir mais segurança ao software.</p>
<p>E então entramos na idéia da Integração Contínua: Um processo que recompile/execute os testes a cada commit (ou alteração) que surja no seu sistema.</p>
<p>Soa idéia mirabolante? Dependendo do ponto de vista, realmente o é. Mas, de forma nenhum, é uma idéia nova. É público e notório que a Microsoft mantém áreas específicas para coordenar a compilação do Windows, e que na política da empresa existem regras (informais, obviamente) estabelecendo penalidades para quem for o responsável por introduzir uma falha na compilação (penalidade essa que deve ser bastante dolorida quando o software contém 25 milhões de linhas de código, como o Windows 2000 tinha :])</p>
<p>E, por onde começar com a CI? Bem, se você é devoto do Java, sugiro começar com o <a href="http://cruisecontrol.sf.net/">CruiseControl</a>. Apesar da configuração dele parecer um pouco amedrontadora, experimente também usá-la em conjunto com o <a href="http://cc-config.sourceforge.net/">CruiseControl-Config</a>, que então sua barra fica mais leve. :)</p>
<p>Espero postar algumas configurações do cruisecontrol nos próximos dias, pra demonstrar algumas idéias legais dele.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leal.eng.br/mnemetica/2006/07/03/501/ci-intro.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
