<?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>Lucas Teixeira</title>
	<atom:link href="http://lucastex.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Tue, 09 Mar 2010 03:46:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Unboxing do meu iMac de 27&#8243;</title>
		<link>http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/</link>
		<comments>http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 03:46:11 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[imac]]></category>
		<category><![CDATA[unboxing]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=326</guid>
		<description><![CDATA[
Enfim chegou meu novo PC. Faz um tempo já que estava adiando comprar um computador de mesa para desenvolver e ficar mais a vontade em casa. Com o uso intensivo apenas de  notebook a alguns anos, meu pescoço e minhas costas começaram a reclamar feio esse ano.
Resolvi aproveitar a promoção de lançamento do site do [...]]]></description>
			<content:encoded><![CDATA[
<p>Enfim chegou meu novo PC. Faz um tempo já que estava adiando comprar um computador de mesa para desenvolver e ficar mais a vontade em casa. Com o uso intensivo apenas de  notebook a alguns anos, meu pescoço e minhas costas começaram a reclamar feio esse ano.</p>
<p>Resolvi aproveitar a promoção de lançamento do site do carrefour, que dava 20% de desconto em qualquer produto do site e comprei o tão sonhado iMac de 27&#8243;. 20% de desconto em cima do preço da Apple Store fez uma grande diferença, pode acreditar :) Cheguei de viagem este fim de semana e enfim hoje uma notícia boa, chegou meu iMac. :)</p>
<p>Ponto mega-positivo: Tela. Não podia imaginar a qualidade desse display de LED. É fantástico. Em relação a tamanho, já estava usando um Samsung de 24&#8243;, mas o brilho, a definição do display de LED da Apple é fora de sério. Tirando ainda a resolução alcançada, de <strong>2560</strong> por <strong>1440</strong>.</p>
<p>Preciso agora encontrar uma maneira efetiva de manter um sincronismo REAL entre os dados do iMac e do MacBook. Não queria nem algo web-based como dropbox ou sugarsync, seria alguma coisa normal mesmo, talvez até quem sabe um rsync possa ajudar. Se você tiver alguma opinião ou sugestão, me salve :)</p>
<p>Sobre o problema de flickering reportado por aí a alguns meses, achei que pudesse estragar a minha alegria, mas não, logo que liguei, junto com as atualizações, já veio um firmware do LED pra deixar tudo OK. :)</p>
<p>Segue algumas fotos do unboxing.</p>

<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-0/' title='Foto 1'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-0-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 1" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-1/' title='Foto 2'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-1-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 2" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-2/' title='Foto 3'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-2-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 3" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-3/' title='Foto 4'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-3-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 4" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-6/' title='Foto 5'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-6-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 5" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-7/' title='Foto 6'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-7-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 6" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-8/' title='Foto 7'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-8-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 7" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-9/' title='Foto 8'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-9-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 8" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-10/' title='Foto 9'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-10-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 9" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-12/' title='Foto 10'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-12-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 10" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-13/' title='Foto 11'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-13-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 11" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-14/' title='Foto 12'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-14-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 12" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-15/' title='Foto 13'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-15-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 13" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-16/' title='Foto 14'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-16-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 14" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-17/' title='Foto 15'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-17-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 15" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto1/' title='Foto 16'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto1-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 16" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto2/' title='Foto 17'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto2-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 17" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto3/' title='Foto 18'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto3-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 18" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto4/' title='Foto 19'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto4-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 19" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-18/' title='Foto 20'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-18-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 20" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-19/' title='Foto 21'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-19-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 21" /></a>
<a href='http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/foto-20/' title='Foto 22'><img width="150" height="150" src="http://lucastex.com.br/wp-content/uploads/2010/03/foto-20-150x150.jpg" class="attachment-thumbnail" alt="" title="Foto 22" /></a>


]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/03/09/unboxing-do-meu-imac-de-27/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Como, e por que usar um DataSource JNDI.</title>
		<link>http://lucastex.com.br/2010/03/04/como-e-por-que-usar-um-datasource-jndi/</link>
		<comments>http://lucastex.com.br/2010/03/04/como-e-por-que-usar-um-datasource-jndi/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 06:36:04 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[configuracao]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[datasou]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[infra]]></category>
		<category><![CDATA[jndi]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=312</guid>
		<description><![CDATA[
Recebi uma pergunta esses dias por aqui.
Lucas,
gostaria de saber como trabalhar com arquivos .properties pra conexão com o banco de dados.
No Grails a gente nota que a conexão fica no código-fonte (DataSorce.class)&#8230;
Estou tentando descobrir como faço para ter um arquivo de propriedade com os parametros da conexão. Caso eu precise apontar para outro banco, não [...]]]></description>
			<content:encoded><![CDATA[
<p>Recebi uma pergunta esses dias por aqui.</p>
<blockquote><p>Lucas,<br />
gostaria de saber como trabalhar com arquivos .properties pra conexão com o banco de dados.<br />
No Grails a gente nota que a conexão fica no código-fonte (DataSorce.class)&#8230;<br />
Estou tentando descobrir como faço para ter um arquivo de propriedade com os parametros da conexão. Caso eu precise apontar para outro banco, não terei que recoompilar tudo.</p></blockquote>
<div>Quem enviou foi o <strong>Felipe Juliani</strong>.</div>
<p></p>
<div>Neste caso, devemos usar ao invés das conexões declaradas no DataSource.groovy, uma declaração de conexão com banco de dados via <a href="http://pt.wikipedia.org/wiki/JNDI" target="_blank">JNDI</a>.</div>
<p></p>
<div>JNDI é uma árvore de &#8216;nomes&#8217; que referenciam &#8216;recursos externos&#8217;. O que isso quer dizer? Basicamente, que a sua aplicação poderá pegar uma configuração de fora da aplicação, diretamente de um &#8220;lugar&#8221; na JVM que alguém colocou. Seria mais ou menos um clipboard compartilhado, só que de objetos é claro :)</div>
<p></p>
<div>Então para o caso acima, nada melhor que deixar toda essa &#8216;configuração&#8217; de conexão com o banco de dados do lado de fora da aplicação e fazer com que ela vá buscar apenas pelo &#8216;nome&#8217; desta conexão. Pronto, desta maneira a configuração fica externa a nossa aplicação e feita diretamente no nosso container.</div>
<p></p>
<div>Bom, eu particularmente vejo três grandes razões para o uso de DataSources JNDI. A primeira é quando devemos tirar do desenvolvedor a (ir)responsabilidadade de dimensionar/configurar a utilização de banco de dados. Isso é um trabalho de infra estrutura, e se em algum determinado momento infra estrutura resolver aumentar o pool de conexões de banco da aplicação, consegue fazer isto sem encostar na aplicação, diretamente no container onde ela está rodando.</div>
<p></p>
<div></div>
<div>Outro motivo é a melhor utilização de recursos de banco de dados. Vamos imaginar um cluster de servidores de aplicação com 3 nós. Cada um dos nós roda uma instância da sua aplicação, que está configurada (diretamente no DataSources.groovy) com um pool de 10 conexões, ou seja, só de subir as aplicações, você terá 30 conexões com o banco já feitas. Com DataSources neste caso, todas as instâncias da aplicação poderiam ir buscar conexões com o banco de dados no mesmo DataSource, configurado uma única vez. Com isso, não precisamos necessariamente possuir 30 conexões abertas com o banco, pois quando uma instância necessita de todas elas, outra instância pode estar usando apenas 3 ou 4.  É claro que para isso, além dos servidores e da aplicação, o seu DataSource também precisa estar deployado no cluster todo.</div>
<p></p>
<div></div>
<div>E o terceiro motivo, é o apontado pelo Felipe acima, que precisa deixar uma maneira fácil de trocar o banco de dados da aplicação. Com estes DataSources JNDI fica fácil também, já que a url do banco, driver, e credenciais estão do lado de fora, na configuração do DataSource.</div>
<div></div>
<div>E para criar este DataSource?</div>
<div></div>
<div>Bom, o primeiro passo é levantar em que container você está rodando a sua aplicação, pois cada um tem a sua maneira particular de configuração, seja jetty, tomcat, jboss ou weblogic. Além das diferenças durante a criação do DataSource, temos também diferenças na &#8216;formação&#8217; do nome deles. No caso do weblogic por exemplo, o mais simplista neste quesito, você poderia ter um datasource com o nome de &#8220;PedidosDS&#8221;, já no JBoss, ele fica prefixado desta maneira: &#8220;java:&lt;nome_datasource&gt;&#8221;.</div>
<div></div>
<p></p>
<div>E depois disso, na configuração da sua aplicação Grails, na closure do environment específico que você quer, basta descrevê-lo desta maneira:</div>
<p></p>
<div>
<pre class="brush: groovy;">production {
   dataSource {
      jndiName = &quot;&lt;nome_datasource&gt;&quot;
   }
}</pre>
</div>
<p></p>
<div>Vale lembrar que estes dias postei sobre <a href="http://lucastex.com.br/2010/02/15/criando-um-datasource-jndi-no-jboss/" target="_blank">como criar um datasource no jboss e usá-lo em uma aplicação grails. Não deixe de ler também.</a></div>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/03/04/como-e-por-que-usar-um-datasource-jndi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[GSolr] Beans declarados automagicamente</title>
		<link>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/</link>
		<comments>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 02:18:23 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[GSolr]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=314</guid>
		<description><![CDATA[
GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: http://github.com/lucastex/gsolr.
Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração mágica de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos [...]]]></description>
			<content:encoded><![CDATA[
<p>GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: <a href="http://github.com/lucastex/gsolr" target="_blank">http://github.com/lucastex/gsolr</a>.</p>
<p>Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração <strong>mágica</strong> de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos imaginar que a configuração esteja declarando três servidores Solr que serão consultados:</p>
<pre class="brush: groovy;">gsolr {
   solr {
      produtos {
         (...)
      }
      noticias {
         (...)
      }
      usuarios {
         (...)
      }
   }
}</pre>
<p>Particularmente, achei bem interessante usar o nome da closure para o nome do servidor ao invés de termos um atributo <em>name = produtos</em> :)<br />
A mágica legal mesmo, é que o plugin vai ler esta configuração quando a aplicação for para o ar, e depois disso irá declarar / criar beans spring dinâmicamente, usando a Spring DSL. E os beans vão ter no nome a declaração feita na closure do usuário.</p>
<p>Ou seja, para os servidores <strong>solr</strong> declarados acima, o plugin irá declarar os Spring Beans <strong>produtosGSolr</strong>, <strong>noticiasGSolr</strong> e <strong>usuariosGSolr</strong> .</p>
<p>Desta maneira, vamos garantir que se você quiser o usar o plugin, o processo como um todo ficará o menos intrusivo possível, e você poderá usar os métodos (de pesquisa e outros) do GSolr apenas injetando o bean do servidor Solr que você quiser.</p>
<pre class="brush: groovy;">class PesquisaService {
   def noticiasGSolr

   def pesquisar = {
      (...)
   }
}</pre>
<p>Achei no mínimo, muito prático. Tudo isso graças a Spring DSL que temos em groovy. Com um pouco mais de tempo, coloco o procedimento passo a passo para declarar os beans desta maneira. Enquanto isso, conheça um pouco mais sobre a <a href="http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html#14.4%20The%20BeanBuilder%20DSL%20Explained" target="_blank">Spring DSL aqui</a>, ou veja o código fonte <a href="http://github.com/lucastex/gsolr/blob/master/GsolrGrailsPlugin.groovy" target="_blank">aqui</a> e também <a href="http://github.com/lucastex/gsolr/blob/master/src/groovy/org/gsolr/core/GSolrConfigParser.groovy" target="_blank">aqui</a>.</p>
<p>Tem alguma idéia ou sugestão para o plugin? Deixe um comentário!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Resolvendo dependências de sua aplicação Grails usando Ivy</title>
		<link>http://lucastex.com.br/2010/02/28/resolvendo-dependencias-de-sua-aplicacao-grails-usando-ivy/</link>
		<comments>http://lucastex.com.br/2010/02/28/resolvendo-dependencias-de-sua-aplicacao-grails-usando-ivy/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 04:45:14 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[ivy]]></category>
		<category><![CDATA[buildconfig]]></category>
		<category><![CDATA[dependencia]]></category>
		<category><![CDATA[libs]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=307</guid>
		<description><![CDATA[
Estamos fazendo o desenho do plugin do Solr para o Grails, e precisei das libs do solr/lucene. Dessa vez quis fazer diferente e usar o gerenciamento de dependências que o grails traz usando o ivy. Pra mim, que nunca tinha trabalhado com ivy antes, foi bem simples até.
Bastou eu levantar os grupos/artifactsId e versão do [...]]]></description>
			<content:encoded><![CDATA[
<p>Estamos fazendo o desenho do plugin do Solr para o Grails, e precisei das libs do solr/lucene. Dessa vez quis fazer diferente e usar o gerenciamento de dependências que o grails traz usando o ivy. Pra mim, que nunca tinha trabalhado com ivy antes, foi bem simples até.</p>
<p>Bastou eu levantar os grupos/artifactsId e versão do solr-core e do solrj (1.4) e adicionar no meu <strong>BuildConfig.groovy. </strong>Consegui estas informações no próprio <a href="http://wiki.apache.org/solr">wiki do solr,</a> nesta página: <a href="http://wiki.apache.org/solr/Solrj#Maven">http://wiki.apache.org/solr/Solrj#Maven</a></p>
<p>Depois disso, bastou adicionar um repositório para buscar os jars</p>
<pre class="brush: groovy;">repositories {
    mavenRepo &quot;http://mirrors.ibiblio.org/pub/mirrors/maven2&quot;
}</pre>
<p>E declarar as dependências que eu precisaria em runtime:</p>
<div id="_mcePaste">
<pre class="brush: groovy;">dependencies {
    runtime 'org.apache.solr:solr-core:1.4.0'
    runtime 'org.apache.solr:solr-solrj:1.4.0'
}</pre>
</div>
<div>Depois, foi só rodar a aplicação que os jars já estavam todos carregados e prontos para serem importados, ponto para o Grails.</div>
<div></div>
<div></div>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/28/resolvendo-dependencias-de-sua-aplicacao-grails-usando-ivy/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Grails e Solr juntos, o melhor dos mundos</title>
		<link>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/</link>
		<comments>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 18:11:42 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[nabble]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=304</guid>
		<description><![CDATA[
Tá rolando uma discussão legal na lista &#8220;grails-users&#8221; sobre Solr.
Estamos levantando alguns pontos que seriam essenciais e interessantes para um plugin grails que cuidasse disso. Se você gosta também de Solr, ou está interessado, acompanhe os e-mails na Grails-Users ou no nabble aqui.
Você usa solr? O que acha interessante nele que deva existir em um [...]]]></description>
			<content:encoded><![CDATA[
<p>Tá rolando uma discussão legal na lista &#8220;grails-users&#8221; sobre Solr.</p>
<p>Estamos levantando alguns pontos que seriam essenciais e interessantes para um plugin grails que cuidasse disso. Se você gosta também de Solr, ou está interessado, acompanhe os e-mails na <a href="http://n4.nabble.com/Grails-user-f1312389.html" target="_blank">Grails-Users</a> ou no <a href="http://n4.nabble.com/Discussion-on-a-Grails-Solr-Plugin-td1569847.html" target="_blank">nabble aqui</a>.</p>
<p>Você usa solr? O que acha interessante nele que deva existir em um plugin grails?</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Criando um DataSource JNDI no JBoss</title>
		<link>http://lucastex.com.br/2010/02/15/criando-um-datasource-jndi-no-jboss/</link>
		<comments>http://lucastex.com.br/2010/02/15/criando-um-datasource-jndi-no-jboss/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 02:08:03 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[jboss]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[jndi]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=296</guid>
		<description><![CDATA[
Ok, agora que temos uma aplicação grails rodando no ambiente jboss, temos que configurar um DataSource JNDI para ser usado, com isso evitamos que as credenciais e informações do banco fiquem diretamente configuradas em nossa aplicação.
Este procedimento é simples e facilmente descrito em dois simples passos:

Driver do banco de dados: Você deve copiar o jar [...]]]></description>
			<content:encoded><![CDATA[
<p>Ok, agora que <a href="http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/" target="_blank">temos uma aplicação grails rodando no ambiente jboss</a>, temos que configurar um DataSource JNDI para ser usado, com isso evitamos que as credenciais e informações do banco fiquem diretamente configuradas em nossa aplicação.</p>
<p>Este procedimento é simples e facilmente descrito em dois simples passos:</p>
<ol>
<li>Driver do banco de dados: Você deve copiar o jar do driver JDBC do seu banco de dados para dentro da pasta &lt;jboss_home&gt;/common/lib</li>
<li>Configuração do DataSource: No jboss ela é feita através de um arquivo XML. Após criar este arquivo, tenha certeza que o salvou dentro da pasta &lt;jboss_home&gt;/server/&lt;seu_server&gt;/deploy.</li>
</ol>
<p>No meu caso, o arquivo se chama <strong>database-ds.xml</strong> e possui as seguintes tags (são altamente descritivas, acredito não precisar detalhar):</p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;datasources&gt;
  &lt;local-tx-datasource&gt;
    &lt;jndi-name&gt;jdbc/databaseDS&lt;/jndi-name&gt;
    &lt;connection-url&gt;jdbc:mysql://localhost:3306/banco_dev&lt;/connection-url&gt;
    &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;
    &lt;user-name&gt;root&lt;/user-name&gt;
    &lt;password&gt;senha&lt;/password&gt;
    &lt;min-pool-size&gt;5&lt;/min-pool-size&gt;
    &lt;max-pool-size&gt;30&lt;/max-pool-size&gt;
    &lt;idle-timeout-minutes&gt;1&lt;/idle-timeout-minutes&gt;
    &lt;prepared-statement-cache-size&gt;32&lt;/prepared-statement-cache-size&gt;
  &lt;/local-tx-datasource&gt;
&lt;/datasources&gt;</pre>
<p>Agora para acessá-lo basta buscar pelo nome JNDI <strong>java:jdbc/databaseDS</strong>, ou no meu caso, como é uma aplicação grails, usar a declarativa no <strong>DataSources.groovy</strong></p>
<pre class="brush: groovy;">production {
  dataSource {
    jndiName = &quot;java:jdbc/databaseDS&quot;
    dbCreate = &quot;update&quot;
  }
}
</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/15/criando-um-datasource-jndi-no-jboss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como fazer o deploy de uma app grails no JBoss</title>
		<link>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/</link>
		<comments>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 12:51:56 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jar]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[validator]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=289</guid>
		<description><![CDATA[
Neste fim de semana quis fazer alguns testes pela primeira vez com uma aplicação grails no jboss.
Já tinha acompanhado na grails-users que existem alguns problemas para efetuar o deploy, e para cada um deles, uma sequência de passos obscuros para fazer o deploy acontecer com sucesso. Minha versão de grails neste procedimento é a 1.2.1 [...]]]></description>
			<content:encoded><![CDATA[
<p>Neste fim de semana quis fazer alguns testes pela primeira vez com uma aplicação grails no jboss.</p>
<p>Já tinha acompanhado na <strong>grails-users</strong> que existem alguns problemas para efetuar o deploy, e para cada um deles, uma sequência de passos obscuros para fazer o deploy acontecer com sucesso. Minha versão de grails neste procedimento é a 1.2.1 e do JBoss é a 5.1.0.GA</p>
<p>Efetivamente, o que acontece é que jboss traz junto com suas common libs vários jars que são empacotados juntamente com a sua aplicação quando você utiliza o comando <strong>grails war</strong>.</p>
<p>Existem alguns workarounds na internet que te mostram como modificar o <strong>BuildConfig.groovy</strong> (arquivo que define propriedades do empacotamento de sua app) para que após montar a estrutura de arquivos que irão ser empacotados, remova estes arquivos (principalmente o log4j onde o problema é mais aparente) do chamado <strong>stagingDir</strong> e os deixe de fora do pacote final.</p>
<p>Particularmente, achei a solução <a href="http://www.comerciaisnet.com.br/clientes/difermig_representacoes/minasul/marreta.jpg" target="_blank">um tanto quanto diferente</a> e acabei achando no <a href="http://www.grails.org/FAQ" target="_blank">FAQ do Grails</a> e depois com mais detalhes <a href="http://community.jboss.org/wiki/ClassLoadingConfiguration" target="_blank">nesta página</a> uma solução menos intrusiva ao pacote, que é definir a prioridade de carregamento dos jars da aplicação.</p>
<p>Bom, para isso, precisamos criar um arquivo <strong>jboss-web.xml</strong> dentro do diretório <strong>WEB-INF</strong> de nossa aplicação que irá mostrar ao jboss que queremos &#8220;blindar&#8221; nossa aplicação para utilizar os jars que estão dentro de seu lib, e que estes por sua vez não deverão ser sobrescritos pelos jars do classpath do servidor. O conteúdo do arquivo segue abaixo:</p>
<pre class="brush: xml;">&lt;jboss-web&gt;
   &lt;context-root&gt;/projeto&lt;/context-root&gt;
   &lt;class-loading java2ClassLoadingCompliance=&quot;false&quot;&gt;
      &lt;loader-repository&gt;
         projeto:archive=projeto.war
         &lt;loader-repository-config&gt;java2ParentDelegation=false&lt;/loader-repository-config&gt;
      &lt;/loader-repository&gt;
   &lt;/class-loading&gt;
&lt;/jboss-web&gt;</pre>
<p>Na tag <strong>context-root</strong> estamos apenas aproveitando que a aplicação terá seu arquivo de configuração específico para o jboss e definindo o contexto em que ela será publicada. Nas tags seguintes pedimos para o jboss criar o nosso classloader isolado, com o nome &#8220;projeto:archive=projeto.war&#8221;. Com este nome (que deve ser único, por isto leva em consideração o nome do projeto), garantimos que as classes pedidas pelo nosso projeto serão procuradas ali, e caso não encontradas, nos classpaths seguintes (common/lib, depois no tomcat).</p>
<p>Basicamente isto seria suficiente para conseguir que o projeto rodasse sem problemas. Porém no meu cenário de versões (grails 1.2.1 e jboss-5.1.0.GA) existe outro ponto de conflito. O Hibernate Validator que está junto ao jboss também difere em versão e gera conflito com o grails. Neste caso a solução é <a href="http://www.comerciaisnet.com.br/clientes/difermig_representacoes/minasul/marreta.jpg" target="_blank">ainda mais interessante</a> e simples que a anterior.</p>
<p>Para resolver o problema no deploy que indica claramente problema de versão no Hibernate Validator, basta que você faça o download da última versão deste jar (no meu caso, 4.0.2-GA) nesta url: <a href="https://www.hibernate.org/30.html" target="_blank">https://www.hibernate.org/30.html</a>. Depois disto, resta apenas colocar o jar do hibernate validator dentro da pasta <strong>&lt;jboss_home&gt;/common/lib</strong>.</p>
<p>Pronto, a aplicação está rodando e funcional dentro do jboss!</p>
<pre class="brush: plain;">10:36:32,815 INFO  [[/projeto]] Initializing Spring root WebApplicationContext
10:36:41,155 INFO  [[/projeto]] Initializing Spring FrameworkServlet 'grails'</pre>
<p>PS: Vale lembrar que o arquivo <strong>jboss-web.xml</strong> é padrão para arquivos <strong>war</strong>, se você quiser configurar a ordem do classpath para aplicações <strong>ear</strong> ou<strong> sar</strong>, consulte o link acima para entender as diferenças.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Como acessar uma taglib de dentro de um service</title>
		<link>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/</link>
		<comments>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 00:35:31 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[taglib]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=277</guid>
		<description><![CDATA[
Uma situação que acontece muito, é a reutilização das funções de taglibs dentro dos controllers de sua aplicação grails. Isso é muito fácil de se fazer, basta chamar o método usando o objeto com o nome do namespace da taglib.
Ou seja, para usar dentro do controller a função de formatação de números, definida pela função [...]]]></description>
			<content:encoded><![CDATA[
<p>Uma situação que acontece muito, é a reutilização das funções de taglibs dentro dos controllers de sua aplicação grails. Isso é muito fácil de se fazer, basta chamar o método usando o objeto com o nome do namespace da taglib.<br />
Ou seja, para usar dentro do controller a função de formatação de números, definida pela função formatNumber (<a href="http://grails.org/doc/latest/ref/Tags/formatNumber.html" target="_blank">taglib já no core do grails</a>), é só fazer a chamada assim:</p>
<pre class="brush: groovy;">def myAction = {
render g.formatNumber([number:5000.234, type: &quot;number&quot;, maxFractionDigits: 2])
}</pre>
<p>Esta função é equivalente a chamar a taglib de dentro de um gsp da seguinte maneira:</p>
<pre class="brush: xml;">&lt;g:formatNumber number=&quot;5000.234&quot; type=&quot;number&quot; maxFractionDigits=&quot;2&quot; /&gt;</pre>
<p>Mas quando precisamos fazer isto, por exemplo, dentro de um service, encontramos um probleminha chato, as taglibs não são injetadas automaticamente. Para contornar essa &#8220;<a href="http://upload.wikimedia.org/wikipedia/commons/7/7d/Bug.png" target="_blank">situação</a>&#8220;, temos que buscar a taglib manualmente, da seguinte maneira:</p>
<pre class="brush: groovy;">def myTag = grailsApplication.mainContext.
            getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')
def value = myTag.formatNumber([number:5000.234, type: &quot;number&quot;, maxFractionDigits: 2])</pre>
<p>Ahhh, para isso não se esqueca de injetar o objeto da grailsApplication da seguinte maneira</p>
<pre class="brush: groovy;">class MeuService {
   def grailsApplication
   (...)
}</pre>
<p>Bin-go.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/03/como-acessar-uma-taglib-de-dentro-de-um-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devolvendo um texto como attachment no response</title>
		<link>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/</link>
		<comments>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 12:48:52 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[attachment]]></category>
		<category><![CDATA[content disposition]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[response]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=271</guid>
		<description><![CDATA[
Me deparei com a seguinte situação em uma aplicação construída usando Grails.
O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:
def arquivo = Arquivo.get(params.id) [...]]]></description>
			<content:encoded><![CDATA[
<p>Me deparei com a seguinte situação em uma aplicação construída usando Grails.</p>
<p>O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:</p>
<pre class="brush: groovy;">def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
render arquivo.texto</pre>
<p>Legal, desta maneira (bem simples até), o conteúdo deste texto seria renderizado na página para o usuário poder salvá-la.</p>
<p>Imaginei que isto pudesse ser incrementado um pouco, e percebi que fazer com que o usuário tivesse que salvar a página (que continha apenas o XML) poderia se tornar um tanto chato com o passar do tempo. Resolvi alterar a action para devolver o texto em anexo ao response. Isso mesmo, com a caixinha para poder salvá-lo.</p>
<p>Olha que simples:</p>
<pre class="brush: groovy;">def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
response.setContentType &quot;text/xml&quot;
response.setHeader &quot;Content-Disposition&quot;, &quot;attachment;filename=\&quot;${arquivo.nome}.xml\&quot;&quot;
response &lt;&lt; arquivo.texto</pre>
<p>Simples, colocando a instrução no header para que a &#8220;disposição&#8221; da resposta seja &#8220;attachment&#8221; (anexo), o browser ao invés de renderizar apenas o conteudo, retorna um arquivo com este texto.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como definir o locale default de sua aplicação grails</title>
		<link>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/</link>
		<comments>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 12:05:33 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[bean]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[locale]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=266</guid>
		<description><![CDATA[
Graças ao ótimo suporte de internacionalização que o grails nos proporciona, podemos alterar o idioma corrente da app passando apenas o parametro lang na URL. Com isso, o locale é definido para o usuário e se sua aplicação recupera as mensagens com o g:message ou outros recursos de i18n, usará o locale indicado.
Caso queira definir [...]]]></description>
			<content:encoded><![CDATA[
<p>Graças ao ótimo <a href="http://grails.org/doc/1.1/guide/single.html#10.%20Internationalization" target="_blank">suporte de internacionalização</a> que o grails nos proporciona, podemos alterar o idioma corrente da app passando apenas o parametro <strong>lang</strong> na URL. Com isso, o locale é definido para o usuário e se sua aplicação recupera as mensagens com o <strong>g:message</strong> ou outros recursos de i18n, usará o locale indicado.</p>
<p>Caso queira definir um locale default para sua app, basta sobrescrever o bean <strong>localeResolver</strong> no seu beans.groovy como abaixo:</p>
<pre class="brush: groovy;">beans = {
  localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
    defaultLocale = new Locale(&quot;pt&quot;, &quot;BR&quot;)
    java.util.Locale.setDefault(defaultLocale)
  }
}</pre>
<p>Sim, estou trazendo aos poucos tópicos que estavam em meu outro blog, blog.lucastex.com, dê uma passada por lá.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/26/como-definir-o-locale-default-de-sua-aplicacao-grails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Usando JNDI na configuração do DataImportHandler</title>
		<link>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/</link>
		<comments>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:27:03 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[dataimporthandler]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[jndi]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=254</guid>
		<description><![CDATA[
Quer evitar que suas credenciais (usuário e senha) estejam abertas no seu data-config.xml? A melhor alternativa com certeza é usar um datasource JNDI para isso e manter usuário, senha e url de conexão do banco de dados dentro do cointainer.
Para isso, é só declarar a tag dataSource do data-config.xml desta maneira:
&#60;dataSource user=&#34;&#34; password=&#34;&#34; jndiName=&#34;JndiDoMeuDs&#34;
Sim, os [...]]]></description>
			<content:encoded><![CDATA[
<p>Quer evitar que suas credenciais (usuário e senha) estejam abertas no seu <strong>data-config.xml</strong>? A melhor alternativa com certeza é usar um datasource JNDI para isso e manter usuário, senha e url de conexão do banco de dados dentro do cointainer.</p>
<p>Para isso, é só declarar a tag <strong>dataSource</strong> do <strong>data-config.xml</strong> desta maneira:</p>
<pre class="brush: xml;">&lt;dataSource user=&quot;&quot; password=&quot;&quot; jndiName=&quot;JndiDoMeuDs&quot;</pre>
<p>Sim, os parametros <strong>user</strong> e <strong>password</strong> devem ser declados vazios, não se esqueça disso.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache Solr &#8211; Recomendação de livro</title>
		<link>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/</link>
		<comments>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 16:53:57 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Livros]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[indexa]]></category>
		<category><![CDATA[leitura]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[seach]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=238</guid>
		<description><![CDATA[
Pra quem gosta de busca e assuntos relacionados, um ótimo livro que recomendo é este: Solr 1.4 Enterprise Search Server.
Muito legal, bem abrangente, fala um pouco sobre cada coisa, desde implementações básicas necessárias de DataImportHandler, Transformers, Term-Suggest, Types e outros pontos.


Foi lançado um pouco antes da versão 1.4 estável sair (por todo aquele problema do [...]]]></description>
			<content:encoded><![CDATA[
<p>Pra quem gosta de busca e assuntos relacionados, um ótimo livro que recomendo é este: <strong>Solr 1.4 Enterprise Search Server.</strong></p>
<p>Muito legal, bem abrangente, fala um pouco sobre cada coisa, desde implementações básicas necessárias de DataImportHandler, Transformers, Term-Suggest, Types e outros pontos.</p>
<p><center><br />
<div id="attachment_239" class="wp-caption alignnone" style="width: 210px"><img class="size-full wp-image-239" title="Solr 1.4 - Enterprise Search Server" src="http://lucastex.com.br/wp-content/uploads/2010/01/Solr-1-4-Enterprise-Search-Server.jpg" border="0" alt="Solr 1.4 - Enterprise Search Server" width="200" height="247" /><p class="wp-caption-text">Solr 1.4 - Enterprise Search Server</p></div><br />
</center></p>
<p>Foi lançado um pouco antes da versão 1.4 estável sair (por todo aquele problema do último bug do lucene e etc), por 2 dos committers: David Smiley e Eric Pugh.</p>
<p>Está custando $40 diretamente no packetpub: A url para o produto é esta: <a href="http://www.packtpub.com/solr-1-4-enterprise-search-server/book" target="_blank">http://www.packtpub.com/solr-1-4-enterprise-search-server/book</a>. </p>
<p>Recomendo a todos que se interessam pelo assunto, e trabalham com isso, guia de consulta imprescindível :)</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Config.groovy &#8211; Cuidado ao manipular suas configurações</title>
		<link>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/</link>
		<comments>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 00:18:00 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Maldades do Groovy]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[grailsapplication]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[referencia]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=234</guid>
		<description><![CDATA[
Hum, reportando uma situação no mínimo inusitada que tive por aqui.
Acabei descobrindo, da maneira ruim, que no Grails, quando lêmos a configuração da aplicação (Config.groovy) através da referência grailsApplication.config estamos manipulando uma variável passível de alterações, ou seja, qualquer atributo que você recuperar de lá, e modificar, assim estará para toda a execução.
Na minha situação, [...]]]></description>
			<content:encoded><![CDATA[
<p>Hum, reportando uma situação no mínimo inusitada que tive por aqui.</p>
<p>Acabei descobrindo, da maneira ruim, que no Grails, quando lêmos a configuração da aplicação (Config.groovy) através da referência <strong>grailsApplication.config</strong> estamos manipulando uma variável passível de alterações, ou seja, qualquer atributo que você recuperar de lá, e modificar, assim estará para toda a execução.</p>
<p>Na minha situação, eu mantinha uma lista de e-mails lá no arquivo de configuração para que quando disparado, eu pudesse enviar o e-mail a estes destinatários somados ao e-mail do usuário, que tinha acabado de ser inputado no formulário. Tinha algo assim:</p>
<pre class="brush: groovy;">contato.destinatarios = [&quot;email1@xpto.com&quot;, &quot;email2@xpto.com&quot;, &quot;email3@xpto.com&quot;]</pre>
<p>E dentro do controller, usando o mail plugin (<a href="http://lucastex.com.br/2010/01/02/envio-de-e-mails-com-o-mail-plugin/">leia este post sobre o mail plugin</a>), executava o seguinte trecho de código:</p>
<pre class="brush: groovy;">def destinatarios = grailsApplication.config.contato?.destinatarios?.toArray()
destinatarios &lt;&lt; params.email
sendMail {
    to destinatarios
    subject &quot;Contato ...&quot;
    body &quot;......&quot;
 }</pre>
<p>Ou seja, quando eu pegava a referência dos destinatários do Config, eu mantinha essa referência em &#8216;destinatários&#8217;. Quando eu adicionava neste array o destinatário que vinha do formulários &#8220;params.email&#8221;, eu alterava a *instância* e referência da configuração da aplicação, e aquele e-mail ali ficava.</p>
<p>Resultado, no primeiro contato, receberam o e-mail a lista de destinatários e o primeirocontato@xpto.com, na segunda execução, todos eles da configuração, o primeirocontato@xpto.com e também o segundocontato@xpto.com foram copiados.</p>
<p>E assim sucessivamente.</p>
<p>Vivendo e aprendendo, tomem cuidado com isso!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Portal imobiliário usando Groovy e Grails</title>
		<link>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/</link>
		<comments>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 13:05:34 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[acegi]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[GORM]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[imob]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[locaweb]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[richui]]></category>
		<category><![CDATA[runtimelogging]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[sqlserver]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=220</guid>
		<description><![CDATA[
Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando Groovy e Grails, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;create [...]]]></description>
			<content:encoded><![CDATA[
<p>Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando <a href="http://lucastex.com.br/tag/groovy/" target="_blank">Groovy</a> e <a href="http://lucastex.com.br/tag/grails/" target="_blank">Grails</a>, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;<em>create app</em>&#8221; para produção em 2 meses. Esse é também o grande motivo para a falta de tempo de postar mais por aqui.</p>
<p>Trata-se dos sites <a href="http://www.imoveisnomorumbi.com.br" target="_blank">http://www.imoveisnomorumbi.com.br</a> e <a href="http://www.imoveisnopanamby.com.br" target="_blank">http://www.imoveisnopanamby.com.br</a>, site de duas imobiliárias do mesmo grupo, que negocia imóveis de alto padrão nestes dois bairros.</p>
<p>Algumas informações interessantes sobre o projeto:</p>
<p><strong>Tecnologia e Infraestrutura:</strong> O site antigo usava <a href="http://pt.wikipedia.org/wiki/Microsoft_SQL_Server" target="_blank">SQLServer</a> como banco de dados e tecnologia <a href="http://pt.wikipedia.org/wiki/ASP" target="_blank">ASP</a>. Como usamos Groovy e Grails, por trás temos uma JVM <a href="http://pt.wikipedia.org/wiki/Plataforma_Java">Java</a> em execução, e o banco de dados, o bom e velho <a href="http://pt.wikipedia.org/wiki/MySQL">MySQL</a>.</p>
<p>Antes, para suportar o ASP, o <a href="http://pt.wikipedia.org/wiki/IIS">IIS</a> era usado como web server, e agora Um <a href="http://pt.wikipedia.org/wiki/Servidor_Apache">apache</a> balanceia as requisições aos dois <a href="http://pt.wikipedia.org/wiki/Tomcat">Tomcats</a>. Tudo isto está deployado e rodando em um Cloud Server da Locaweb, por opção do cliente, onde já mantinha a conta antiga.</p>
<p><strong>Integração com o sistema legado:</strong> Para a integração do modelo de dados antigo e o novo modelo, construímos rotinas de importação dos dados usando <a href="http://docs.codehaus.org/display/GROOVY/Tutorial+6+-+Groovy+SQL" target="_blank">Groovy SQL</a>, uma maneira <span style="text-decoration: line-through;"> fácil, </span> muito fácil, de fazer rotinas em banco de dados.</p>
<p><strong>Plugins utilizados: </strong>Ahhh, os bons e velhos plugins do Grails, não canso de dizer que esta é a melhor parte do Grails! Foram usados os plugins:</p>
<p><a href="http://grails.org/plugin/mail" target="_blank"><strong>Grails-Mail</strong></a>, para envio dos e-mails e formas de contato do site<br />
<a href="http://grails.org/plugin/acegi" target="_blank"><strong>Grails-Acegi</strong></a>, para autenticação e segurança<br />
<a href="http://grails.org/plugin/cookie" target="_blank"><strong>Grails-Cookie</strong></a>, para manipulação dos cookies do cliente<br />
<a href="http://grails.org/plugin/navigation" target="_blank"><strong>Grails-Navigation</strong></a> para criação de menus/submenus da interface administrativa<br />
<a href="http://grails.org/plugin/richui" target="_blank"><strong>Grails-RichUi</strong></a> para alguns componentes gráficos como auto-complete e nuvem de tags<br />
<a href="http://grails.org/plugin/runtime-logging" target="_blank"><strong>Grails-RuntimeLogging</strong></a>, um ótimo plugin para moder trabalhar com o nível de log de cada artefato (controller, service, etc), da app em runtime<br />
<a href="http://grails.org/plugin/settings" target="_blank"><strong>Grails-Settings</strong></a> para algumas parametrizações da aplicação.</p>
<p>E com certeza, se eu tivesse pesquisado com um pouco mais de tempo, teria usado outros plugins para evitar algum trabalho que tenha feito na mão. E é claro, além disso, bastante (mesmo) <a href="http://www.jquery.com" target="_blank">jquery</a>, <a href="http://pt.wikipedia.org/wiki/AJAX_%28programa%C3%A7%C3%A3o%29" target="_blank">ajax</a> e <a href="http://pt.wikipedia.org/wiki/Json" target="_blank">json</a>.</p>
<p>É isso, qualquer dúvida sobre o projeto, como aconteceu, soluções e problemas, basta comentar!</p>
<p>Obrigado a todos!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Envio de e-mails com o Mail Plugin</title>
		<link>http://lucastex.com.br/2010/01/02/envio-de-e-mails-com-o-mail-plugin/</link>
		<comments>http://lucastex.com.br/2010/01/02/envio-de-e-mails-com-o-mail-plugin/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 03:43:10 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=211</guid>
		<description><![CDATA[
Enviar e-mails a partir de uma aplicação Grails é extremamente fácil. Tudo graças ao Mail Plugin. Sou um grande fã do mecanismo de plugins do Grails não só pela facilidade de criá-los, mas principalmente pelo espírito de compartilhamento de código que isto gera nos desenvolvedores. É bem simples, por exemplo, se eu preciso de alguma [...]]]></description>
			<content:encoded><![CDATA[
<p>Enviar e-mails a partir de uma aplicação <a href="http://grails.org" target="_blank">Grails</a> é extremamente fácil. Tudo graças ao <a href="http://grails.org/plugin/mail" target="_blank">Mail Plugin</a>. Sou um grande fã do mecanismo de plugins do Grails não só pela facilidade de criá-los, mas principalmente pelo espírito de compartilhamento de código que isto gera nos desenvolvedores. É bem simples, por exemplo, se eu preciso de alguma coisa que envie e-mails, vou construir isto separado da minha aplicação e distribuir para todos que precisem. Fácil, muito fácil!</p>
<p>Enfim, o Mail Plugin é um dos plugins mais antigos do Grails (acho que usei pela primeira vez em agosto de 2008), e um dos mais simples de ser usado. O primeiro passo é instalar o plugin como qualquer outro:</p>
<pre class="brush: groovy;">grails install-plugin mail</pre>
<p>Com isso as dependências serão baixadas e o plugin será instalado.</p>
<p>Após isso, você vai precisar configurar o envio de e-mail.<br />
De forma bem intuitiva novamente, diretamente em seu Config.groovy deverá setar as propriedades:</p>
<pre class="brush: groovy;">grails {
   mail {
      host     = &quot;smtp.meuservidor.com.br&quot;
      port     = 25
      username = &quot;usuario@provedor.com.br&quot;
      password = &quot;eusoul33t&quot;
      props    = [&quot;mail.smtp.auth&quot;: &quot;true&quot;, &quot;mail.smtp.socketFactory.port&quot;: &quot;587&quot;]
   }
}</pre>
<p>Ahhh, o exemplo acima já está pronto para usar validação de usuário e senha no envio, já que hoje (99%) dos servidores assim exigem. Pronto, com isso o plugin já consegue saber como o e-mail será enviado (por trás ele usa o envio de e-mails embutido no Spring, é claro).</p>
<p>Agora, quando for enviar um e-mail, basta usar a closure <strong>sendMail</strong> que é automaticamente adicionada em todos os seus controllers! Segue um exemplo:</p>
<pre class="brush: groovy;">sendMail {
   from &quot;lucas@testedoblog.com.br&quot;
   to &quot;dest1@email.com&quot;, &quot;dest2@email.com&quot;
   cc &quot;copia@email.com&quot;
   bcc &quot;oculto@email.com&quot;
   subject &quot;Enviando e-mails com Grails&quot;
   body &quot;&quot;&quot;
      E ai pessoal,
      Este e-mail foi enviado diretamente de um controller da minha
      aplicação Grails usando o Mail Plugin.

      Até mais.&quot;&quot;&quot;
}</pre>
<p>Pronto, agora é só checar as caixas de e-mail! Vale lembrar que as instruções <strong>cc</strong> e <strong>bcc</strong> não são obrigatórias!</p>
<p>O plugin suporta envio de anexos, conteúdo HTML e outras opções. Para mais detalhes, consulte a <a href="http://grails.org/plugin/mail" target="_blank">documentação oficial</a>, ou deixe um comentário aqui.</p>
<p>Ahh, e se quiser usar uma caixa do GMail para enviar as mensagens, use a configuração abaixo.</p>
<pre class="brush: groovy;">grails {
   mail {
      host     = &quot;smtp.gmail.com&quot;
      port     = 465
      username = &quot;seulogingmail@gmail.com&quot;
      password = &quot;suasenhadogmail&quot;
      props    = [&quot;mail.smtp.auth&quot;: &quot;true&quot;,
                  &quot;mail.smtp.socketFactory.port&quot;: &quot;465&quot;,
                  &quot;mail.smtp.socketFactory.class&quot;: &quot;javax.net.ssl.SSLSocketFactory&quot;,
                  &quot;mail.smtp.socketFactory.fallback&quot;: &quot;false&quot;]
   }
}</pre>
<p>Feliz 2010, ao som de &#8220;Dream Theater &#8211; Don&#8217;t look past me&#8221;.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/02/envio-de-e-mails-com-o-mail-plugin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Indexando vários campos com o mesmo conteúdo</title>
		<link>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/</link>
		<comments>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 18:15:22 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[schema]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=201</guid>
		<description><![CDATA[
Durante a definição schema do seu índice SOLR, muitas vezes precisamos armazenar o mesmo valor em diferentes campos (fields). Isto é necessário pelo fato de que cada field tem sua maneira de ser indexado, impactando diretamente no match deste documento em uma busca.
Por exemplo, temos o nome de um livro no nosso índice da biblioteca. [...]]]></description>
			<content:encoded><![CDATA[
<p>Durante a definição schema do seu índice SOLR, muitas vezes precisamos armazenar o mesmo valor em diferentes campos (fields). Isto é necessário pelo fato de que cada field tem sua maneira de ser indexado, impactando diretamente no match deste documento em uma busca.</p>
<p>Por exemplo, temos o nome de um livro no nosso índice da biblioteca. Este nome deve ser flexionado no maior número possível de formas para que seja encontrado, seja removendo acentos, usando o snowball, o tokenizando e etc. Porém, ele também será usado em uma feature de &#8220;ordenação alfabética&#8221;. Neste caso sabemos que o campo deve ser indexado como &#8220;string&#8221; sem tokenização ou flexão, ou o resultado pode virar uma bagunça.</p>
<p>Grande parte das pessoas, enviam o campo duas vezes para o Solr, em dois fields diferentes, por exemplo: &#8220;nome&#8221; e &#8220;nome_ord&#8221;. Com isso, deixamos de usar uma diretriz bem bacana do solr chamada <strong>copyField</strong> que serve para copiar o conteúdo de um campo para outro.</p>
<p>Imaginando que os campos estejam definidos da seguinte forma:</p>
<pre class="brush: xml;">&lt;field name=&quot;nome&quot; type=&quot;text&quot; indexed=&quot;true&quot; stored=&quot;true&quot; /&gt;
&lt;field name=&quot;nome_ord&quot; type=&quot;string&quot; indexed=&quot;true&quot; stored=&quot;false&quot; /&gt;</pre>
<p>E usar no fim do documento a instrução <strong>copyField</strong></p>
<pre class="brush: xml;">&lt;copyField source=&quot;nome&quot; dest=&quot;nome_ord&quot; /&gt;</pre>
<p>Desta forma não adicionamos nenhum overhead de parse de uma nova informação, diminuímos a quantidade de dados enviada para o Solr (muito importante se estiver usando HTTP para indexação) e garantimos que a informação será exatamente a mesma.</p>
<p>Uma outra funcionalidade (esta disponível apenas a partir do Solr 1.4) é o <strong>maxChars </strong>que pode ser usado para restringir a quantidade de caracteres que serão copiados. Neste meu exemplo poderia ser usado para criar um resumo da introdução desta maneira.</p>
<pre class="brush: xml;">&lt;copyField source=&quot;introducao&quot; dest=&quot;resumo&quot; maxChars=&quot;3000&quot; /&gt;</pre>
<p>Boa!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalando o JDeveloper no Mac</title>
		<link>http://lucastex.com.br/2009/11/11/instalando-o-jdeveloper-no-mac/</link>
		<comments>http://lucastex.com.br/2009/11/11/instalando-o-jdeveloper-no-mac/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 11:42:16 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=188</guid>
		<description><![CDATA[
Neste fim de ano, estarei me divertindo com um novo projeto por aqui.
Usaremos JDeveloper como IDE e JSF como framework web. Particularmente não tenho boas impressões de JSF nem do JDeveloper, mas como apenas conheço comentários e opiniões de amigos, acredito ser uma boa oportunidade para tentar entender e um pouco deles e poder formar [...]]]></description>
			<content:encoded><![CDATA[
<p>Neste fim de ano, estarei me <a href="http://cpantiguidade.files.wordpress.com/2009/10/abolicaoescravatura081.jpg" target="_blank">divertindo</a> com um novo projeto por aqui.</p>
<p>Usaremos JDeveloper como IDE e JSF como framework web. Particularmente não tenho boas impressões de JSF nem do JDeveloper, mas como apenas conheço comentários e opiniões de amigos, acredito ser uma boa oportunidade para tentar entender e um pouco deles e poder formar uma opinião própria com propriedade . Mas já adianto, não vou me apaixonar :)</p>
<p>Enfim, precisei já instalar o JDeveloper no meu Mac, e como várias coisas no mundo Oracle, precisam de alguns ajustes para rodar sem problemas no Mac.</p>
<p>O primeiro passo, é <a href="http://www.oracle.com/technology/software/products/jdev/index.html" target="_blank">baixar o produto diretamente do site</a>. O arquivo já vem no genérico .jar, então para rodar é na base do clássico</p>
<pre class="brush: xml;">java -jar jdevstudio11111install.jar</pre>
<p>Só que por <a href="http://i188.photobucket.com/albums/z99/fisicomaluco/semttulo-3.jpg" target="_blank">algum motivo</a> ele não identifica os JREs instaladas por default no mac, para isso, um <a href="http://legalzinho.files.wordpress.com/2007/06/30102006125200g.jpg" target="_blank">pequeno ajuste</a> deve ser feito, criando um link dentro da pasta onde a instalação do JDeveloper irá procurar o JRE.</p>
<p><strong>Lembre-se que este processo deve ser feito antes de executar a instalação do pacote. Se você já havia iniciado, encerre-a e comece novamente.</strong></p>
<pre class="brush: bash;">cd /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
sudo mkdir -p jre/lib
cd /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/classes/
sudo ln -s classes.jar ../Home/jre/lib/rt.jar</pre>
<p>Pronto, agora basta iniciar a instalação padrão do JDeveloper sem mais problemas.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/11/instalando-o-jdeveloper-no-mac/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Solr 1.4 &#8211; Feito o lançamento oficial</title>
		<link>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/</link>
		<comments>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:12:51 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[indexação]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=181</guid>
		<description><![CDATA[
Bom pessoal, como disse no post anterior, hoje foi lançado o Solr 1.4 versão final.
O link para download é: http://linorg.usp.br/apache/lucene/solr/1.4.0/
Segue abaixo o e-mail oficial de lançamento, que acabou de cair na Lista de e-mails do framework, enviado pelo Grant Ingersoll.
Apache Solr 1.4 has been released and is now available for public download!
http://www.apache.org/dyn/closer.cgi/lucene/solr/
Solr is the popular, [...]]]></description>
			<content:encoded><![CDATA[
<p>Bom pessoal, como disse no post anterior, hoje foi lançado o Solr 1.4 versão final.</p>
<p>O link para download é: <a href="http://linorg.usp.br/apache/lucene/solr/1.4.0/">http://linorg.usp.br/apache/lucene/solr/1.4.0/</a></p>
<p>Segue abaixo o e-mail oficial de lançamento, que acabou de cair na <a href="http://lucene.apache.org/solr/mailing_lists.html#Users" target="_blank">Lista de e-mails do framework</a>, enviado pelo <a href="http://lucene.grantingersoll.com/2009/11/10/apache-solr-1-4-0-offically-released/" target="_blank">Grant Ingersoll</a>.</p>
<blockquote><p>Apache Solr 1.4 has been released and is now available for public download!<br />
<a style="color: #074d8f;" href="http://www.apache.org/dyn/closer.cgi/lucene/solr/" target="_blank">http://www.apache.org/dyn/closer.cgi/lucene/solr/</a></p>
<p>Solr is the popular, blazing fast open source enterprise search<br />
platform from the Apache Lucene project.  Its major features include<br />
powerful full-text search, hit highlighting, faceted search, dynamic<br />
clustering, database integration, and rich document (e.g., Word, PDF)<br />
handling.  Solr is highly scalable, providing distributed search and<br />
index replication, and it powers the search and navigation features of<br />
many of the world&#8217;s largest internet sites.</p>
<p>Solr is written in Java and runs as a standalone full-text search server<br />
within a servlet container such as Tomcat.  Solr uses the Lucene Java<br />
search library at its core for full-text indexing and search, and has<br />
REST-like HTTP/XML and JSON APIs that make it easy to use from virtually<br />
any programming language.  Solr&#8217;s powerful external configuration allows it to<br />
be tailored to almost any type of application without Java coding, and<br />
it has an extensive plugin architecture when more advanced<br />
customization is required.</p>
<p>New Solr 1.4 features include<br />
- Major performance enhancements in indexing, searching, and faceting<br />
- Revamped all-Java index replication that&#8217;s simple to configure and<br />
can replicate config files<br />
- Greatly improved database integration via the DataImportHandler<br />
- Rich document processing (Word, PDF, HTML) via Apache Tika<br />
- Dynamic search results clustering via Carrot2<br />
- Multi-select faceting (support for multiple items in a single<br />
category to be selected)<br />
- Many powerful query enhancements, including ranges over arbitrary<br />
functions, and nested queries of different syntaxes<br />
- Many other plugins including Terms for auto-suggest, Statistics,<br />
TermVectors, Deduplication</p>
<p>Getting Started<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
New to Solr?  Follow the steps below to get up and running ASAP.</p>
<p>1. Download Solr at <a style="color: #074d8f;" href="http://www.apache.org/dyn/closer.cgi/lucene/solr/" target="_blank">http://www.apache.org/dyn/closer.cgi/lucene/solr/</a><br />
2. Check out the tutorial at <a style="color: #074d8f;" href="http://lucene.apache.org/solr/tutorial.html" target="_blank">http://lucene.apache.org/solr/tutorial.html</a><br />
3. Read the Solr wiki (<a style="color: #074d8f;" href="http://wiki.apache.org/solr" target="_blank">http://wiki.apache.org/solr</a>) to learn more<br />
4. Join the community by subscribing to <a style="color: #074d8f;" href="mailto:solr-user@lucene.apache.org" target="_blank">solr-user@lucene.apache.org</a><br />
5. Give Back (Optional, but encouraged!)  See <a style="color: #074d8f;" href="http://wiki.apache.org/solr/HowToContribute" target="_blank">http://wiki.apache.org/solr/HowToContribute</a></p>
<p>For more information on Apache Solr, see <a style="color: #074d8f;" href="http://lucene.apache.org/solr" target="_blank">http://lucene.apache.org/solr</a></p></blockquote>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Solr 1.4, mais que pronto</title>
		<link>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/</link>
		<comments>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 00:37:13 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[busca]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=173</guid>
		<description><![CDATA[
Pra quem acompanha a lista de discussões e o andamento do projeto, o Solr 1.4 já está prontinho para ser lançado tem algum tempo. O pessoal de dev estava apenas esperando o lançamento do Lucene 2.9 para oficializar o lançamento.
Quando então foi lançado, o pessoal do Solr empacotou o framework como RC, disponibilizou para download e [...]]]></description>
			<content:encoded><![CDATA[
<p>Pra quem acompanha a lista de discussões e o andamento do projeto, o Solr 1.4 já está prontinho para ser lançado tem algum tempo. O pessoal de dev estava apenas esperando o lançamento do Lucene 2.9 para oficializar o lançamento.</p>
<p>Quando então foi lançado, o pessoal do Solr empacotou o framework como RC, disponibilizou para download e na hora do lançamento (pra ser mais preciso, um dia antes), dois bugs significativos foram levantados no Lucene 2.9. A equipe do Solr os avaliou com calma, entrou em alinhamento com os devs do Lucene (alguns fazem parte de ambas as equipes) e decidiram por bem aguardar o Lucene 2.9.1 para efetuar o anúncio oficial do Solr 1.4.</p>
<p>Pois bem, com <a href="http://lucene.apache.org/java/docs/index.html#6+November+2009+-+Lucene+Java+2.9.1+available">o lançamento oficial do Lucene 2.9.1 hoje a tarde</a>, o pessoal do Solr já correu, e empacotou em uma versão final a release tão esperada, 1.4.</p>
<p><a href="http://twitter.com/gsingers/status/5568639566" target="_self">Amanhã, dia 07, será feito o lançamento final do Solr 1.4 sem mais delongas</a>. Pois bem, é só aguardar! Mas se você quiser dar uma olhadinha antes, é só baixar os pacotes antes de serem replicados para o mirror central entrando aqui: <a href="http://people.apache.org/~gsingers/solr/1.4.0/" target="_blank">http://people.apache.org/~gsingers/solr/1.4.0/</a>.</p>
<p>Eu, em uma olhada muito, mas muito rápida por cima de algumas funcionalidades do Solr 1.4 (direto no wiki), levantei alguns pontos e encaminhei na lista de e-mails dos colaboradores da empresa em que trabalho. Não estão agrupados, muito menos organizados, mas segue como esboço e rascunho de um post que valeria a pena.</p>
<ul>
<li>SolrServer &#8211; SolrJ HTTP
<ul>
<li>Configuração
<ul>
<li>Timeout</li>
<li>Quantidade de retentativas</li>
</ul>
</li>
<li>SolrJ altamente evoluído para criação da queries e integrado aos searchcomponents</li>
</ul>
</li>
<li>DataImportHandler
<ul>
<li>Transformers
<ul>
<li>Clob Transformer: Permite pegar dados direto de colunas clob no banco de dados</li>
<li>HTML Stripper: Atua em campos com conteúdo HTML, removendo tags e deixando apenas o conteúdo</li>
</ul>
</li>
<li>Agora é possível usar o DIH indexando até conteúdos de um &#8216;datasource&#8217; de e-mail, deixando ele fazer pooling em um e-mail e indexando o que chega.</li>
<li>Eventos callback após indexação</li>
</ul>
</li>
<li>Replicação
<ul>
<li>Configuração interna a aplicação &#8211; Funciona como um RequestHandler</li>
<li>Dashboard de administração, permite ver como estão as replicações, qual indice está em cada nó, status do download de novos indices</li>
<li>Permite replicação interna, via HTTP, não sendo mais necessário usar apenas rsync
<ul>
<li>Com isso, possibilidade de usar em windows</li>
<li>Menos configuração de infra estrutura</li>
<li>Maior visibilidade do status da replicação</li>
</ul>
</li>
</ul>
</li>
<li>Indexação
<ul>
<li>indexação de grandes quantidades de documentos via streaming
<ul>
<li>conexão é aberta com o master, e permanece assim enquanto necessário.</li>
</ul>
</li>
<li>Anotação @Field para poder adicionar um POJO direto ao índice, sem ter que transformar em SolrInputDocument</li>
</ul>
</li>
<li>Componentes de busca (alguns presentes no 1.3 completos, outros eram beta, outros nem existiam)
<ul>
<li>Sugestão de busca</li>
<li>Spelling</li>
<li>Highlight</li>
</ul>
</li>
<li>Resposta da busca em vários novos formatos
<ul>
<li>php nativo</li>
<li>json (já existia mas não era oficial)</li>
<li>xml (normal)</li>
<li>ruby</li>
</ul>
</li>
</ul>
<p>E muito mais&#8230;</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Visualizando XMLs no Safari de forma decente</title>
		<link>http://lucastex.com.br/2009/11/09/visualizando-xmls-no-safari-de-forma-decente/</link>
		<comments>http://lucastex.com.br/2009/11/09/visualizando-xmls-no-safari-de-forma-decente/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 18:08:33 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=162</guid>
		<description><![CDATA[
Se você usa um Mac e navega com o Safari, com certeza sofre pra visualizar XMLs nele, fica como o firefox antigo, uma bagunça.
Neste caso, acaba tendo que abrir o source da página para conseguir ler o conteúdo.
Este plugin do safari, chamado XMLView Plugin com certeza me ajuda muito e pode te ajudar. É muito [...]]]></description>
			<content:encoded><![CDATA[
<p>Se você usa um Mac e navega com o Safari, com certeza sofre pra visualizar XMLs nele, fica como o firefox antigo, uma bagunça.</p>
<p>Neste caso, acaba tendo que abrir o source da página para conseguir ler o conteúdo.</p>
<p><a href="http://www.entropy.ch/software/MacOSX/xmlviewplugin/">Este plugin do safari, chamado XMLView Plugin</a> com certeza me ajuda muito e pode te ajudar. É muito simples, basta descompactar seu conteúdo em <strong>$HOME/Library/Internet Plug-Ins</strong> e reiniciar o navegador.</p>
<p>Depois de reiniciar o Safari, abra <a href="http://www.entropy.ch/software/MacOSX/xmlviewplugin/test.xml">qualquer XML</a> e faça o teste! Use e abuse do layout bem definido e opções de expand/collapse dos nós. Veja abaixo um exemplo:</p>
<p style="text-align: center;">
<div id="attachment_169" class="wp-caption aligncenter" style="width: 669px"><img class="size-full wp-image-169 " title="Safari vendo XML com o plugin XMLView Plugin" src="http://lucastex.com.br/wp-content/uploads/2009/11/dih.png" alt="Safari vendo XML com o plugin XMLView Plugin" width="659" height="373" /><p class="wp-caption-text">Safari vendo XML com o plugin XMLView Plugin</p></div>
</p>
<p>Se gostou, me deve um real. :)</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/09/visualizando-xmls-no-safari-de-forma-decente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Manipulando combos dinamicamente com JQuery</title>
		<link>http://lucastex.com.br/2009/11/09/manipulando-combos-dinamicamente-com-jquery/</link>
		<comments>http://lucastex.com.br/2009/11/09/manipulando-combos-dinamicamente-com-jquery/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:45:41 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[layout]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=147</guid>
		<description><![CDATA[
Já precisou alterar as opções de uma combo com javascript? Pra variar, o JQuery tem algo pronto para isso, basta usar a função appendTo.
É como eu estava dizendo para a @loiane e para o @cmilfont no twitter sexta. Não tem nada mais poderoso que javascript. :)
//insere faixas de preço para compra
$(&#34;&#60;option value='0-200000'&#62;Até 200 mil&#60;/option&#62;&#34;).appendTo(&#34;#cmbValor&#34;);
$(&#34;&#60;option value='200000-300000'&#62;De [...]]]></description>
			<content:encoded><![CDATA[
<p>Já precisou alterar as opções de uma combo com javascript? Pra variar, o <a href="http://jquery.com/" target="_blank">JQuery</a> tem algo pronto para isso, basta usar a função <strong>appendTo</strong>.</p>
<p>É como eu estava dizendo para a <a href="http://twitter.com/loiane" target="_blank">@loiane</a> e para o <a href="http://twitter.com/cmilfont" target="_blank">@cmilfont</a> no twitter sexta. Não tem nada mais poderoso que javascript. :)</p>
<pre class="brush: jscript;">//insere faixas de preço para compra
$(&quot;&lt;option value='0-200000'&gt;Até 200 mil&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='200000-300000'&gt;De 200 mil a 300 mil&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='300000-400000'&gt;De 300 mil a 400 mil&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='400000-500000'&gt;De 400 mil a 500 mil&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='500000-700000'&gt;De 500 mil a 700 mil&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='700000-1000000'&gt;De 700 mil a 1 milhão&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='1000000-2000000'&gt;De 1 a 2 milhões&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
$(&quot;&lt;option value='2000000-0'&gt;Acima de 2 milhões&lt;/option&gt;&quot;).appendTo(&quot;#cmbValor&quot;);
</pre>
<p>Para limpar o conteúdo do select, basta definir o html interno como vazio.</p>
<pre class="brush: jscript;">$(&quot;#idDoMeuSelect&quot;).html(&quot;&quot;);</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/09/manipulando-combos-dinamicamente-com-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: O método &#8216;collect&#8217; das listas</title>
		<link>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/</link>
		<comments>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 00:28:40 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Maravilhas do Groovy]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=142</guid>
		<description><![CDATA[
Passei agora pela seguinte situação:
Possuía uma lista de objetos (pogos) com várias propriedades, e a partir desta lista, eu precisaria de uma nova lista com apenas os ids de cada um destes objetos, ao invés da clássica iteração para se resgatar os valores, acabei usando o método collect, que recebe uma closure, e para cada [...]]]></description>
			<content:encoded><![CDATA[
<p>Passei agora pela seguinte situação:</p>
<p>Possuía uma lista de objetos (pogos) com várias propriedades, e a partir desta lista, eu precisaria de uma nova lista com apenas os ids de cada um destes objetos, ao invés da clássica iteração para se resgatar os valores, acabei usando o método <strong>collect</strong>, que recebe uma closure, e para cada objeto da lista, aplica esta <a href="http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/" target="_blank">closure</a>!</p>
<p>Para quem conhece, funciona da mesma maneira que o <a href="http://java.sun.com/javase/6/docs/api/java/io/FileFilter.html" target="_blank">FileFilter</a> do Java, que é usado para <a href="http://java.sun.com/javase/6/docs/api/java/io/File.html#listFiles%28java.io.FileFilter%29" target="_blank">filtrar arquivos dentro de um diretório</a>.</p>
<pre class="brush: groovy;">def listaPogos = ...
def listaIds = listaPogos.collect { pogo -&gt;
   pogo.id
}</pre>
<p>Quer ver funcionando? <a href="http://groovyconsole.appspot.com/?id=36001" target="_blank">Clique aqui</a> para rodar o código no Groovy Web Console</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/06/maravilhas-do-groovy-o-metodo-collect-das-listas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Grails e GORM: Logando as consultas SQL no console</title>
		<link>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/</link>
		<comments>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 13:38:57 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[GORM]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=137</guid>
		<description><![CDATA[
Uma dica pra acompanhar o uso do seu banco de dados, e saber o que o hibernate e o gorm estão fazendo por trás dos panos, é logar as queries que estão sendo feitas.
Você pode acompanhar isto detalhadamente configurando seu DataSource.groovy para fazer isso com o parâmetro loggingSql. E o mais bacana na minha opinião [...]]]></description>
			<content:encoded><![CDATA[
<p>Uma dica pra acompanhar o uso do seu banco de dados, e saber o que o <a href="https://www.hibernate.org/" target="_blank">hibernate</a> e o <a href="http://grails.org/GORM" target="_blank">gorm</a> estão fazendo por trás dos panos, é logar as queries que estão sendo feitas.</p>
<p>Você pode acompanhar isto detalhadamente configurando seu <strong>DataSource.groovy </strong>para fazer isso com o parâmetro <strong>loggingSql</strong>. E o mais bacana na minha opinião é poder fazer isso de forma independente para cada ambiente. Lembre-se que por default esta configuração vem desligada.</p>
<pre class="brush: groovy;">environments {
  development {
    dataSource {
      url = &quot;...&quot;    //banco de dev
      loggingSql = true
    }
  }
  test {
    dataSource {
      url = &quot;...&quot; //banco de testes
    }
  }
  production {
    dataSource {
      url = &quot;...&quot; //banco de produção
    }
  }
}</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Renderizando um XML como resposta em grails</title>
		<link>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/</link>
		<comments>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:45:04 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=126</guid>
		<description><![CDATA[
Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.
No exemplo abaixo, um parâmetro nome é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.
def busca = [...]]]></description>
			<content:encoded><![CDATA[
<p>Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.</p>
<p>No exemplo abaixo, um parâmetro <em>nome</em> é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.</p>
<pre class="brush: groovy;">def busca = {
   def clientes = Cliente.findAllByNomeIlike(&quot;%${params.nome}%&quot;)

   render(contentType: &quot;text/xml&quot;) {
      results() {
         clientes.each {
            cliente -&gt; result() {
               id(cliente.id)
               nome(cliente.nome)
            }
         }
      }
   }
}</pre>
<p>Explicando o auto-explicativo:</p>
<p>Linha 2: Usamos um método dinâmico do grails (não, este método não existe na classe) que permite que eu localize todos os clientes (findAll) por seus nomes (byNome) Ilike (case insensitive) usando o parâmetro <em>nome</em> que veio no request. Esta lista é armazenada na referência clientes.</p>
<p>Linha 4: Pela funcão <em>render</em> deixamos claro que iremos renderizar um conteúdo <em>text/xml</em></p>
<p>Linha 5: Esta será a nossa tag root do xml: <strong>results</strong>. A <a href="http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/" target="_blank">closure</a> que se abre definirá os filhos deste nó.</p>
<p>Linha 6: Cada cliente na lista retornada&#8230;</p>
<p>Linha 7: Será um novo nó <strong>result</strong> do XML de resposta</p>
<p>Linhas 8 e 9: Os fois filhos de <strong>result</strong>, teremos o <strong>id</strong> do cliente e seu <strong>nome</strong>, suficiente para uma combo com auto-complete!<br />
O resultado foi como esperado, e o tempo de fazer o exemplo funcionar foi definitivamente menor que o de escrever este post!</p>
<pre class="brush: xml;">&lt;results&gt;
   &lt;result&gt;
      &lt;id&gt;313&lt;/id&gt;
      &lt;nome&gt;JOSE DA SILVA&lt;/nome&gt;
   &lt;/result&gt;
   &lt;result&gt;
      &lt;id&gt;817&lt;/id&gt;
      &lt;nome&gt;PATRICIA MARIA SILVA E SILVA&lt;/nome&gt;
   &lt;/result&gt;
   &lt;result&gt;
      &lt;id&gt;91&lt;/id&gt;
      &lt;nome&gt;MARCOS SILVINO&lt;/nome&gt;
   &lt;/result&gt;
&lt;/results&gt;</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Gerenciamento de dependências com Grape</title>
		<link>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/</link>
		<comments>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 17:47:25 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[dependencia]]></category>
		<category><![CDATA[ivy]]></category>
		<category><![CDATA[libs]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=112</guid>
		<description><![CDATA[
Mais uma maneira de se gerenciar dependências :)
Agora é a vez do Grape, um módulo construindo em Groovy que abstrai toda aquela configuração do maven/ivy que vc teria por padrão. O grande diferencial do Grape, é que ele traz essa configuração mais para perto de quem precisa dela, ou seja, no próprio código fonte!
Funciona basicamente [...]]]></description>
			<content:encoded><![CDATA[
<p>Mais uma maneira de se gerenciar dependências :)</p>
<p>Agora é a vez do <a href="http://groovy.codehaus.org/Grape" target="_blank">Grape</a>, um módulo construindo em <a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> que abstrai toda aquela configuração do maven/ivy que vc teria por padrão. O grande diferencial do Grape, é que ele traz essa configuração mais para perto de quem precisa dela, ou seja, no próprio código fonte!</p>
<p>Funciona basicamente assim, você anota o seu método que irá precisar da dependência com a anotação <strong>@Grab</strong> dizendo qual é o grupo, artefato e versão da biblioteca que você precisa e pronto! Quando a classe for carregada, esta anotação irá disparar o download desta dependência automaticamente. Os arquivos que são baixados via grape são guardados dentro do diretório do usuário na pasta <em>.groovy/grapes</em></p>
<p>Segue um simples exemplo que depende do commons-lang 2.4 e usa um método simples da classe StringUtils para trocar o case de uma string.</p>
<pre class="brush: groovy;">import org.apache.commons.lang.StringUtils

@Grab(group='commons-lang', module='commons-lang', version='2.4')
void testGrape() {

   def name = &quot;Lucas Frare Teixeira&quot;
   println StringUtils.swapCase(name) //lUCAS fRARE tEIXEIRA

}

//Chama a execução do método
testGrape()</pre>
<p>Veja que a únca coisa que precisamos fazer, é anotar o método com a dependência e ele fica responsável por fazer o download.</p>
<p>Mas, conversando com o <a href="http://www.twitter.com/paulosuzart" target="_blank">@paulosuzart</a> do <a href="http://codemountain.wordpress.com/" target="_blank">CodeMountain</a>, chegamos a conclusão, que sistemas de maior porte, merecem um controle de dependências mais centralizado e até por que não dizer, organizado.</p>
<p>Ou seja, fica a minha dica de uso do Grape para a distribuição de scripts e arquivos pequenos, para evitar aquela coisa chata de enviar jars, setar classpath, ou então ter arquivos pom que definem dependência e etc.</p>
<p>Para evitar esta dor de cabeça, sem dúvidas o <a href="http://groovy.codehaus.org/Grape">grape</a> é ideal!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Data corrente no nome do artefato gerado com ant</title>
		<link>http://lucastex.com.br/2009/10/28/data-corrente-no-nome-do-artefato-gerado-com-ant/</link>
		<comments>http://lucastex.com.br/2009/10/28/data-corrente-no-nome-do-artefato-gerado-com-ant/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 17:35:32 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Ant]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[timestamp]]></category>
		<category><![CDATA[versionamento]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=102</guid>
		<description><![CDATA[
Algumas pessoas costumam versionar (e manter guardado) o histórico de versões geradas pelo seu projeto. Uma coisa que não se deve esquecer, é de renomear os pacotes de modo que quando necessário encontrar um específico, seja fácil.
O que eu faço, é sempre renomear o pacote para: projeto-yyyyMMddHHmmss.[jar/war/ear] . Como ant, fica fácil fazer isso usando [...]]]></description>
			<content:encoded><![CDATA[
<p>Algumas pessoas costumam versionar (e manter guardado) o histórico de versões geradas pelo seu projeto. Uma coisa que não se deve esquecer, é de renomear os pacotes de modo que quando necessário encontrar um específico, seja fácil.</p>
<p>O que eu faço, é sempre renomear o pacote para: <strong>projeto-yyyyMMddHHmmss.[jar/war/ear]</strong> . Como ant, fica fácil fazer isso usando uma task chamada tstamp, que recupera o timestamp corrente e grava em uma variável seguindo o pattern que você escolher. Segue exemplo que uso aqui.</p>
<p>Armazenando valor:</p>
<pre class="brush: xml;">&lt;tstamp&gt;
   &lt;format property=&quot;build-datetime&quot; pattern=&quot;yyyyMMddHHmmss&quot;/&gt;
&lt;/tstamp&gt;</pre>
<p>Pronto, agora basta usar a variável build-datetime como outra qualquer,</p>
<pre class="brush: xml;">&lt;target name=&quot;dist&quot; depends=&quot;compile&quot; description=&quot;gera o jar com a distribuição&quot;&gt;
   &lt;jar jarfile=&quot;${dist}/${project}-${build-datetime}.jar&quot; basedir=&quot;${build}&quot;/&gt;
&lt;/target&gt;</pre>
<p>É uma boa também para guardar os arquivos em estruturas de pastas separadas por dia/mes/ano.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><span class="content"><span class="block" style="margin-left: 21px ! important;"><code class="string">yyyyMMddHHmmss</code></span></span></div>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/28/data-corrente-no-nome-do-artefato-gerado-com-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um Transformer customizado para o Solr</title>
		<link>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/</link>
		<comments>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 20:59:35 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[dataimporthandler]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[indexação]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=78</guid>
		<description><![CDATA[
Solr é um framework uma ferramenta para a construção de servidores de indexação e busca on top of índices lucene.
Possui todas as funcionalidades que existem em um sistema moderno de busca, como paginação, highlight de campos, flexão das palavras e etc. Na minha opinião, de tudo que trabalhei nos últimos anos, sem dúvida, formam o [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://lucene.apache.org/solr" target="_blank">Solr</a> é <span style="text-decoration: line-through;">um framework</span> uma ferramenta para a construção de servidores de indexação e busca <em>on top of</em> índices <a href="http://lucene.apache.org" target="_blank">lucene</a>.</p>
<p>Possui todas as funcionalidades que existem em um sistema moderno de busca, como paginação, highlight de campos, flexão das palavras e etc. Na minha opinião, de tudo que trabalhei nos últimos anos, sem dúvida, formam o conjunto mais poderoso de frameworks.</p>
<p>O Solr abstrai a camada Java do Lucene e disponibiliza uma interface http para a execução da consulta, fazendo com que fique <strong>muito</strong> fácil a integração com sistemas não-java.</p>
<p>Um dos recursos avançados de indexação com Solr são os <a href="http://wiki.apache.org/solr/DataImportHandler#Transformer" target="_blank">Transformers</a> a serem usados juntamente com o <a href="http://wiki.apache.org/solr/DataImportHandler">DataImportHandler</a>. Com eles, você pode processar o texto antes de ser indexado. (Um outro post sobre configuração básica de Solr e de DIH deve vir em breve).</p>
<p>Semana passada, precisei de um transformer que pudesse retirar todas as tags HTML do texto a ser indexado (malditos editores rich text em javascript). Como o projeto aqui está usando Solr 1.3 não tive a possibilidade de usar o <a href="http://wiki.apache.org/solr/DataImportHandler#HTMLStripTransformer" target="_blank">HTMLStripTransformer</a> que virá no Solr 1.4 (e está enroscado pra sair). Então acabei tendo que criar um semelhante para a funcionalidade.</p>
<p>A criação de transformers é muito simples (imho, simplista até demais, fazendo com que as vezes, o desenvolvedor se perca durante a implementação). Deve ser desenvolvida uma classe simples, que implementa um método com a seguinte assinatura:</p>
<pre class="brush: java;">public Map&lt;String, Object&gt; transformRow(Map&lt;String, Object&gt; aRow, Context context)</pre>
<p>Quando disse que é simplista demais, é pelo fato de que, (imho novamente), condições restritivas como esta deveriam estar documentadas em interfaces, mas não, quando necessário, o método é chamado via reflection, <a href="http://lucastex.com.br/wp-content/uploads/2009/10/1058unc.jpg" target="_blank">tendo certeza que ele está implementado</a>.</p>
<p>No meu caso, eu precisaria além de implementar o Transformer, deixar explícito no arquivo de configuração do DIH (<em>data-config.xml</em>) quais os campos que deveriam receber o tratamento desta tag, fiz isso adicionando a tag <strong>removeHtml</strong> no nó de cada campo (não, este xml não passa por validação).</p>
<pre class="brush: xml;">&lt;field name=&quot;txt&quot; column=&quot;texto&quot; removeHtml=&quot;true&quot; /&gt;</pre>
<p>Com isto, estamos deixando claro para o DIH que o valor que retornar da query na coluna <strong>texto</strong> será repassado ao Solr para indexação no field <strong>txt</strong> (definido no <em>schema.xml</em>) e terá processamento do meu HtmlTransformer. Ah, não podemos esquecer da declaração do transformer para a entidade:</p>
<pre class="brush: xml;">&lt;entity name=&quot;posts&quot; transformer=&quot;br.com.lucastex.dih.transformer.HtmlTransformer&quot; /&gt;</pre>
<p>Pronto, a classe está agora carregada e pronta para ser chamada quando um campo necessitar. Agora, vamos a implementação da classse. No meu caso, ela ficou bem trivial, pois o campo em questão nunca será multivalorado (ou seja, não preciso tratar a possibilidade do argumento ser um List, mas apenas uma String.</p>
<pre class="brush: java; gutter: true;">package br.com.lucastex.dih.transformer;

import java.util.Map;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.solr.handler.dataimport.Context;
import org.apache.solr.handler.dataimport.DataImporter;
import org.apache.solr.handler.dataimport.RegexTransformer;
import org.apache.solr.handler.dataimport.Transformer;

public class CopyOfHtmlTransformer extends Transformer {

  public static final String TAG = &quot;removeHtml&quot;;

  public Map&lt;String, Object&gt; transformRow(Map&lt;String, Object&gt; aRow, Context context) {

    for (Map&lt;String, String&gt; map : context.getAllEntityFields()) {
      if (!Boolean.TRUE.toString().equals(map.get(TAG)))
        continue;
      String columnName = map.get(DataImporter.COLUMN);
      String sourceColumnName = map.get(RegexTransformer.SRC_COL_NAME);
      if (sourceColumnName == null)
        sourceColumnName = columnName;
      Object value = aRow.get(sourceColumnName);
      if (value instanceof String) {
        String result = stripHtml((String) value);
        aRow.put(columnName, result);
      }
    }
    return aRow;
  }

  private String stripHtml(String text) {
    try {
      String cleanText = StringEscapeUtils.unescapeHtml(text.replaceAll(&quot;\\&lt;.*?\\&gt;&quot;, &quot; &quot;));
      cleanText = cleanText.trim().replaceAll(&quot;\n&quot;,&quot; &quot;);
      cleanText = cleanText.replaceAll(&quot;\t&quot;,&quot; &quot;);
      cleanText = cleanText.replaceAll(&quot;[\\s]+&quot;, &quot; &quot;);
      return cleanText;
    } catch (Exception e) {
      //trata exception de acordo com seu contexto solr
    }
    return text;
  }
}</pre>
<p>Bom, o código é bem auto-explicativo. Basicamente recebe o além do contexto em execução do Solr/DIH, um Map de String e Object, que contém todos os campos e valores da linha que está sendo analisada/indexada no momento. Vale lembrar que este modelo de passagem de parâmetro é feito <strong>exatamente</strong> como descrito no <a href="http://desciclo.pedia.ws/wiki/Gambi_Design_Patterns#BCDR_Pattern">Pattern BCDR</a>.</p>
<p>Enfim, as linhas 18 e 19 garantem que o código só será executado para campos que tenham declarado a tag <strong>removeHtml=true</strong> como descrito anteriormente.</p>
<p>A linha 24 recupera o valor original do campo, ou seja, o que foi retornado pela query no banco de dados, e nas linhas 26 e 27 o resultado é tratado (através da chamada para o método stripHtml) e devolvida ao Map.</p>
<p>Ou seja, este é o momento onde você tem acesso a todos os campos que estão vindo do banco antes de irem ao índice. É nesta hora que você duplica seus campos, faz tratamentos, aplica padrões e templates, enfim trabalha a informação bruta original do banco de dados.</p>
<p>Já o método de remoção de tags HTML, não é nada além de um conjunto de regexes encadeadas  com uma ajudinha do StringEscapeUtils (<a href="http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/" target="_blank">que saudade deste post</a>) do Commons-lang.</p>
<p>Simples como</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: A propriedade metaClass</title>
		<link>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/</link>
		<comments>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 14:55:53 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maravilhas do Groovy]]></category>
		<category><![CDATA[metaClass]]></category>
		<category><![CDATA[mop]]></category>
		<category><![CDATA[slug]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=70</guid>
		<description><![CDATA[
Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade metaClass dos objetos.
Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java [...]]]></description>
			<content:encoded><![CDATA[
<p>Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade <strong>metaClass</strong> dos objetos.</p>
<p>Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java com todos os métodos utilitários, mas com a metaprogramação, o mais usual passa a ser adicionar o métodos nas próprias classes que geram este comportamento.</p>
<p>No exemplo abaixo, eu adicionei o método slug() em runtime dentro da classe String e a partir de agora, qualquer objeto da classe java.lang.String possui o método slug(), com o comportamento descrito abaixo.</p>
<pre class="brush: groovy;">String.metaClass.slug { -&gt;
    def s = delegate.toLowerCase()
    s = s.replaceAll(/[^a-z0-9\s-]/, &quot;&quot;).replaceAll(/\s+/, &quot; &quot;).trim()
    if (s.length() &gt; 45)
        s = s.substring(0, 45).trim()
    s.replaceAll(/\s/, &quot;-&quot;)
 }</pre>
<p>Em primeiro, definimos uma varíavel interna &#8217;s&#8217; com o valor da própria string que está sendo usada (através da propriedade <em>delegate</em>), após isso, aplicamos a primeira regex de caracteres especiais, outra para substituir os espaços em excesso e cortamos a string caso ela tenha mais que 45 caracteres. Por fim, substituímos os espaços por dashes.</p>
<p>Você pode rodar este script <a href="http://groovyconsole.appspot.com/?id=28001" target="_self">neste endereço</a>, basta clicar em &#8220;Execute script&#8221;</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: Elvis Operator</title>
		<link>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/</link>
		<comments>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 14:09:42 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Maravilhas do Groovy]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=64</guid>
		<description><![CDATA[
Nova categoria de posts &#8220;Maravilhas do Groovy&#8221;, inspirada pelo MrHaki e seus posts sobre o diferencial e tricks que o groovy oferece.
O Elvis Operator é um operador em Groovy (já estará embutido no Java7) representado pelo &#8220;ponto de interrogação&#8221; seguido pelos caracteres &#8220;dois pontos&#8221; ou seja  ?:
O objetivo é fazer a comparação do valor de [...]]]></description>
			<content:encoded><![CDATA[
<p>Nova categoria de posts &#8220;Maravilhas do Groovy&#8221;, inspirada pelo MrHaki e seus posts sobre o diferencial e <em>tricks </em>que o groovy oferece.</p>
<p>O Elvis Operator é um operador em Groovy (já estará embutido no Java7) representado pelo &#8220;ponto de interrogação&#8221; seguido pelos caracteres &#8220;dois pontos&#8221; ou seja  <span style="color: #ff0000;"><strong>?:</strong></span></p>
<p>O objetivo é fazer a comparação do valor de uma referencia a <strong>null</strong>, para decidir sobre uma atribuição de valor. Um exemplo bem comum é comparar o um parametro que vem do request de qual página irá ser mostrada de uma lista de objetos, porém, caso a página não esteja presente, devemos sempre mostrar a primeira página.</p>
<p>Tradicionalmente, em java, com o operador ternário:</p>
<pre class="brush: java;">Integer pageParam = (...)
pageParam = (pageParam == null) ? 1 : pageparam;
</pre>
<p>Com o elvis operator, ele já faz esta comparação implicitamente e caso o valor da variável seja null, recebe o valor que está a direita do operador.</p>
<pre class="brush: groovy;">def pageParam = (...)
pageParam = pageParam ?: 1
</pre>
<p><em>&#8212; Post editado as 18:10 do dia 22/10 &#8212;</em><br />
Meu amigo <a href="http://twitter.com/paulosuzart" target="_blank">@paulosuzart</a> do <a href="http://codemountain.wordpress.com" target="_self">CodeMountain </a>fez um post sobre o Elvis Operator em Scala.<br />
A gente sabe que não existe, mas <a href="http://codemountain.wordpress.com/2009/10/22/sem-elvis-operator-crie-um/" target="_blank">ele criou um</a>. Vale a pena conferir. :)</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Não tenha medo das closures</title>
		<link>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/</link>
		<comments>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 13:55:24 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=26</guid>
		<description><![CDATA[
Você tem medo das closures? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho GOTO &#8211; veja uma ótima definição neste link).
Não eu não concordo, closures só querem o seu bem, eis a razão.
Bom, uma closure nada mais é que um trecho de [...]]]></description>
			<content:encoded><![CDATA[
<p>Você tem medo das <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closures</a>? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho <a href="http://i.techrepublic.com.com/blogs/goto.png">GOTO</a> &#8211; veja uma ótima definição neste link).</p>
<p>Não eu não concordo, closures só querem o seu bem, eis a razão.</p>
<p>Bom, uma closure nada mais é que um trecho de código! Mas o que difere este bloco de instruções chamado closure de um método? A grande diferença neste caso, é que as closures são um pouco mais flexíveis que os métodos, e por sua vez podem até ser passadas como parâmetro na chamada de outras funções, ou seja, podem ser atribuídas a uma variável.</p>
<p>Em <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">java</a> não temos closures nativas na linguagem, e uma das formas de tentar alcançar o objetivo é através do uso de <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html">classes anônimas</a>, o que particularmente não me agrada muito, pela sujeira que fica no código.</p>
<p>Em um primeiro exemplo, mais simples, segue como definir uma closure, associá-la a uma variável e depois executá-la. (exemplo em <a href="http://groovy.codehaus.org/">groovy</a>).</p>
<pre class="brush: groovy;">def c = {
    println &quot;Testando o uso de uma closure&quot;
}
c.call()</pre>
<p>Este é um exemplo simples, onde a frase acima será impressa no console.</p>
<p>Para incrementarmos um pouco, podemos fazer com que nossa closure receba um parâmetro para usá-lo dentro da execução, além de criar um método que faça o uso dela. O exemplo abaixo mostra isto.</p>
<pre class="brush: groovy;">//definição da closure para dizer oi
def ola = { nome -&gt;
    println &quot;E ai ${nome}, tudo bom?&quot;
}

//definição da closure para dizer tchau
def tchau = { nome -&gt;
    println &quot;To indo ${nome}, ate a proxima!&quot;
}

//criação do método que fará o uso da closure
void falar(Closure c, String paraQuem) {
    c.call(paraQuem)
}

//invoke do método com as closures de parametro
//note que a closure é passada como se fosse uma variável qualquer
falar(ola, &quot;Fulano&quot;)
falar(tchau, &quot;Ciclano&quot;)</pre>
<p>Mas uma das maiores vantagens que eu enxergo nas closures, é a possibilidade de definição delas em runtime. Isso mesmo, conforme você programa, pode criar uma nova closure e chamar uma função que precise dela! Vemos isso em ruby e groovy com frequência para métodos onde iteramos listas e mapas.</p>
<p>Por exemplo, as listas e arrays em groovy possuem um método each que recebe uma closure como parâmetro, esta closure define o que será feito com cada um dos items da lista/array em questão. O exemplo abaixo mostra a praticidade de se fazer a definição da closure inline, ou seja, sem criar uma variável para ela antes.</p>
<p>Em groovy</p>
<pre class="brush: groovy;">//groovy
def lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { equipe -&gt;
    println &quot;A equipe ${equipe} correu na #F1 em 2009&quot;
}</pre>
<p>Em ruby</p>
<pre class="brush: ruby;">
#ruby
lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { |equipe|
    puts &quot;A equipe #{equipe} correu na #F1 em 2009&quot;
}
</pre>
<p>Em scala</p>
<pre class="brush: scala;">//scala
val teams = List(&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;)
teams foreach {
   team =&gt; printf(&quot;A equipe %s correu na #F1 em 2009&quot;, team)
}
</pre>
<p>Dá pra perceber que a closure foi criada já no momento em que ela foi usada. Desta maneira, além de fácil, um código muito mais limpo e fácil de ser entendido.</p>
<p>Acredite, closures são suas amigas, e estão aqui pra te ajudar, então aproveite!</p>
<p>Ahh, e fica a dica de sempre: Ler a documentação:</p>
<p>Closures em Groovy <a href="http://groovy.codehaus.org/Closures" target="_blank">(wiki)</a> <a href="http://groovy.codehaus.org/api/groovy/lang/Closure.html">(groovydoc)</a> <a href="http://groovy.codehaus.org/Closures+-+Formal+Definition" target="_blank">(definição formal)</a><br />
Closures (Proc) em Ruby <a href="http://www.ruby-doc.org/core/classes/Proc.html" target="_blank">(doc)</a> <a href="http://c2.com/cgi/wiki?BlocksInRuby" target="_blank">(wiki)</a><br />
Closures em Scala <a href="http://www.scala-lang.org/node/138" target="_blank">(wiki)</a></p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
