<?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"
	>

<channel>
	<title>MouseOver Studio &#187; java</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/java/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Indexação de documentos em JRuby com ActiveLucene</title>
		<link>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:20:05 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Api]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[gem]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[jvm]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[active_lucene]]></category>

		<category><![CDATA[active_record]]></category>

		<category><![CDATA[engine]]></category>

		<category><![CDATA[full]]></category>

		<category><![CDATA[lucene]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[search]]></category>

		<category><![CDATA[Solr]]></category>

		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=192</guid>
		<description><![CDATA[ActiveLucene é uma interface para o Lucene similar com a interface do ActiveRecord e/ou ActiveModel.
Isso quer dizer que você pode gerar um scaffold numa aplicação Rails, ir no modelo, trocar ActiveRecord::Base por ActiveLucene::Document e tudo deveria continuar funcionando, com a diferença do modelo estar sendo salvo num índice do Lucene e não num banco de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/dcrec1/active_lucene">ActiveLucene</a> é uma interface para o <a href="http://lucene.apache.org/java/docs/index.html">Lucene</a> similar com a interface do <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord</a> e/ou <a href="http://github.com/rails/rails/tree/master/activemodel">ActiveModel</a>.</p>
<p>Isso quer dizer que você pode gerar um <a href="http://en.wikipedia.org/wiki/Scaffold_(programming)">scaffold</a> numa aplicação <a href="http://rubyonrails.org/">Rails</a>, ir no modelo, trocar ActiveRecord::Base por ActiveLucene::Document e tudo deveria continuar funcionando, com a diferença do modelo estar sendo salvo num índice do Lucene e não num banco de dados relacional.</p>
<p>Dado que os documentos são salvos num índice do Lucene, podemos procurar eles utilizando a <a href="http://lucene.apache.org/java/3_0_0/queryparsersyntax.html">sintaxe de query</a> do Lucene, sem esquecer que por ter uma interface similar à do ActiveRecord, podemos também procurar eles por um id.</p>
<p>A classe base do ActiveLucene se chama Document porque ao igual que os documentos de outros sistemas, não tem uma estrutura definida e todos os atributos são dinâmicos, pelo que você não tem que se preocupar com eles.</p>
<p>o ActiveLucene foi extraído do <a href="http://github.com/dcrec1/lunr">Lunr</a>, um servidor do qual vou falar num futuro post, mas hoje também pode ser utilizado em aplicações nas quais ter um banco de dados relacionais no faz muito sentido e especialmente nas quais se deseja procurar documentos por texto. </p>
<p>A restrição do ActiveLucene é que somente funciona com <a href="http://jruby.org/">JRuby</a>, dado que o Lucene é uma biblioteca em <a href="http://java.sun.com/">Java</a> que roda sobre a JVM. Mesmo assim, caso isso não for um problema, utilizar o ActiveLucene deve ser bem mais simples e leve que utilizar uma solução como o Sphinx ou o Solr, onde dependendo do caso pode resultar numa grande vantagem.</p>
<p>O Lucene tem um monte de funcionalidades e o ActiveLucene não suporta todas elas, mas dependendo das necessidades das pessoas elas serão indo adicionadas ao projeto. Hoje existe um suporte a highlighting e um pouco a paginação, como pode ser visto no seguinte video, junto com uma demonstração básica de como funciona a ferramenta:</p>
<p><object width="501" height="313"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9010209&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9010209&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="501" height="313"></embed></object>
<p><a href="http://vimeo.com/9010209">Full text search in JRuby with ActiveLucene</a> from <a href="http://vimeo.com/user1245982">Diego Carrion</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><em>Se você gostou do ActiveLucene, considera me <a href="http://www.workingwithrails.com/recommendation/new/person/13580-diego-carrion">recomendar</a> no <a href="http://workingwithrails.com/">Working With Rails</a>. Para ficar mais perto das novidades, não deixa de me <a href="http://twitter.com/dcrec1">seguir</a> no Twitter.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/01/27/indexacao-de-documentos-em-jruby-com-activelucene/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby vs Java e como a tartaruga venceu novamente a lebre</title>
		<link>http://www.mouseoverstudio.com/blog/2009/03/08/ruby-vs-java-e-como-o-coelho-venceu-novamente-a-lebre/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/03/08/ruby-vs-java-e-como-o-coelho-venceu-novamente-a-lebre/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 22:06:51 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=161</guid>
		<description><![CDATA[Trabalhei dois sprints de duas semanas num projeto programado em Java, junto a dois desenvolvedores mais. Antes de começar os sprints sugeri utilizar a arquitetura Ruby on Rails mas o cliente alegou que a performance era um fator importantíssimo. 
A escolha das ferramentas Java foi livre pelo que felizmente conseguimos pegar o que tem de [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhei dois sprints de duas semanas num projeto programado em Java, junto a dois desenvolvedores mais. Antes de começar os sprints sugeri utilizar a arquitetura Ruby on Rails mas o cliente alegou que a performance era um fator importantíssimo. </p>
<p>A escolha das ferramentas Java foi livre pelo que felizmente conseguimos pegar o que tem de melhor no mercado: <a href="http://www.vraptor.com.br/">VRaptor</a> e <a href="http://www.hibernate.org/">Hibernate</a>. Essas duas ferramentas nos ajudaram a acelerar bastante o tempo de desenvolvimento. Não esquecer que o projeto foi feito em 4 semanas, por tres desenvolvedores (guardar esses valores para mais tarde). </p>
<p>Somente como momento propaganda, a versão utilizada do VRaptor foi a <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLS</a>.</p>
<p>Uma vez terminado o ultimo sprint, dediquei um tempo à realizar uns testes de stress enquanto analisava tudo com o <a href="http://www.ej-technologies.com/products/jprofiler/overview.html">JProfiler</a>. A aplicação não possuía nenhum memory leak ou coisa similar, mas mesmo assim algumas alterações melhoraram a performance.</p>
<p>Foi realizado um novo deploy da aplicação no ambiente de produção e o cliente gostou do produto, pelo que foi mantido assim.</p>
<p>Uma semana depois aproveitei um tempo livre que teve para desenvolver a aplicação novamente, dessa vez utilizando Rails. Lembram quanto tempo demoro utilizando os frameworks Java? Utilizando Rails + plugins consegui desenvolver a mesma aplicação em somente duas horas!</p>
<p>Mas isso não é tudo, queria comparar a performance da aplicação feita em Rails com a feita em Java. Eu tinha um script que simulava diversos usuários utilizando a aplicação, o mesmo script que utilizei para realizar o profiling da aplicação Java, pelo que aproveitei ele para medir o tempo de execução frente as duas aplicações, uma rodando sobre o <a href="https://glassfish.dev.java.net/">Glassfish</a> e a outra sobre o <a href="http://www.modrails.com/">Passenger</a>.</p>
<p>Para surpresa de muitos, a aplicação Rails rodando sobre Passenger respondeu bem mais rápido às diferentes requisições que a aplicação Java (32 vs 60 segundos)! Isso pode surpreender a muitos, mas não é a primeira vez que algo assim acontece. No <a href="http://falandoemjava.com.br/">Falando em Java</a> 2008 o <a href="http://fabiokung.com/">Fabio Kung</a> mencionou que parte do <a href="http://www.guj.com.br">Guj</a> foi rescrito em Rails, ao mesmo tempo que a performance melhorou notavelmente. Mas sem lugar a dúvida, o exemplo maior de uma aplicação Java que foi rescrita em Rails sem perder a performance é o caso do <a href="http://www.yellowpages.com/">YellowPages.com</a>, aplicação com nada menos que 150 mil requisições por segundo. Mas detalhes sobre a rescrita podem ser vistos <a href="http://assets.en.oreilly.com/1/event/6/Surviving%20the%20Big%20Rewrite_%20Moving%20YELLOWPAGES_COM%20to%20Rails%20Presentation%201.pdf">aqui</a>.</p>
<p>Para ir terminando a historia, eu consegui gastar um bom tempo tunando a JVM e o servidor Glassfish, mas somente por diversão, como desafio, porque para o cliente não mudou nada! Não mudou nada porque a diferença somente pode ser percebida com MUITOS usuários, realizando MUITAS requisições, bem mais, mas bem mais mesmo das que a aplicação pretendia receber.</p>
<p>Se você é uma das pessoas responsáveis por escolher uma tecnologia num projeto e você pretende deixar de escolher Rails porque alega alguma coisa relacionada a performance, então você deve pensar no assunto uma vez mais. </p>
<p>Caso você seja uma rara exceção, vamos ser sinceros, tua aplicação bem desenvolvida nunca vai precisar da JVM e do servidor tunados ao máximo, nem sequer tunados ao ponto no qual uma aplicação em Rails não consiga chegar.  Isso considerando que a aplicação vai estar bem desenvolvida, mas provavelmente ela não vai estar. Na maioria dos casos as aplicações Java tem problemas de performance a nível de código. Os desenvolvedores escrevem tanto mas tanto código que terminam deixando brechas para poder acontecer um processamento elevado ou ate alguns memory leaks.</p>
<p>Quanto menos código você escrever e quanto mais simples ele for, menores vão ser as possibilidades de um problema acontecer, e isso é algo que ajuda as aplicações feitas em Rails a terem uma boa performance com esforço mínimo, as chances de errar são muito menores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/03/08/ruby-vs-java-e-como-o-coelho-venceu-novamente-a-lebre/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Demorou mas chegou: VRaptor Sexy URLs e RSpec::VRaptor</title>
		<link>http://www.mouseoverstudio.com/blog/2009/01/27/demorou-mas-chegou-vraptor-sexy-urls-e-rspecvraptor/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/01/27/demorou-mas-chegou-vraptor-sexy-urls-e-rspecvraptor/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 16:51:49 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[vraptor]]></category>

		<category><![CDATA[sexy-urls]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=160</guid>
		<description><![CDATA[A galera que me segue no Twitter já está sabendo da noticia mas para os que não, aqui vá:
VRaptor Sexy URLs
Estou publicando oficialmente o VRaptor Sexy URLs. O VRaptor Sexy URLs é um fork da versão oficial do VRaptor 2 que ao contrario de trabalhar sobre uma servlet, trabalha sobre um filtro, pelo que junto [...]]]></description>
			<content:encoded><![CDATA[<p>A galera que me segue no <a href="http://twitter.com/dcrec1">Twitter</a> já está sabendo da noticia mas para os que não, aqui vá:</p>
<p><strong>VRaptor Sexy URLs</strong></p>
<p>Estou publicando oficialmente o <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLs</a>. O <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLs</a> é um fork da versão oficial do <a href="http://www.vraptor.com.br/">VRaptor 2</a> que ao contrario de trabalhar sobre uma servlet, trabalha sobre um filtro, pelo que junto à outras configurações permite que chamemos nossas actions no estilo:</p>
<pre>http://my.host.com/controller/action</pre>
<p>Anteriormente tínhamos que chamar nossas actions de um jeito que, após trabalhar com <a href="http:/<br />
/rubyonrails.org/">Rails</a>, nunca mais considerei tão legal:</p>
<pre>http://my.host.com/controller.action.logic</pre>
<p>Eu me comuniquei com o <a href="http://fabiokung.com/">Fabio Kung</a> para tentar colocar minhas alterações no repositório oficial mas eles já estão trabalhando na mesma solução, implementada de outro jeito. Parece que na próxima versão do VRaptor essas implementações já estarão disponiveis, ate lá podem ir utilizando o <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">fork</a> que se encontra no <a href="https://github.com/">GitHub</a>.</p>
<p><strong>RSpec::VRaptor</strong></p>
<p>O <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> é talvez a melhor coisa que pode ser aproveitada ao utilizar o <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLs</a>. O <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> foi inspirado no <a href="http://rspec.info/rails/">RSpec::Rails</a> e funciona de forma muito similar.</p>
<p>Para os que não conhecem o <a href="http://rspec.info/rails/">RSpec::Rails</a>, ele é um plugin para<br />
o Rails que permite, entre outras coisas, testar os controllers dele sem ter que se preocupar por criar um monte de mocks que simulem o stack do Rails. Legal ne? O <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> faz o mesmo com o <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLs</a>.</p>
<p>Em poucas palavras, você pode testar seu controllers assim:</p>
<pre class="prettyprint">describe UserController do

  context "no serviço xpto" do

    before :all do
      get "/user/xpto", :request => {'param1' => 'value1'},
                        :session => {'login' => 'dcrec1'},
                        :inject => {'user' => User.new},
                        :headers => {'Host' => '20.85.17.10'}
    end

    it "deve enviar à view um atributo 'logado' como true" do
      @request.attributes['logado'].should be_true
    end

    it "deve retornar como código de resposta 203" do
      @response.status.should eql(203)
    end

    it "deve salvar na sessão o valor do param1" do
      @session.attributes['param1'].should eql('value')
    end

  end

end</pre>
<p>Acredito que não exista nenhuma solução na linguagem Java que permita criar testes funcionais tão elegantes. Se você é um programador Java e ainda não desenvolve em Ruby, essa aqui é uma excelente demostração de por que você deveria começar a aprender a linguagem. Pode ser que você não chegue a utilizar o <a href="http://github.com/dcrec1/vraptor2_sexy_urls/tree/master">VRaptor Sexy URLs</a>, mas você poderia criar algo similar para teu framework de preferencia.</p>
<p>Se nos dirigirmos à documentação do VRaptor, na parte de <a href="http://www.vraptor.org/testing.html">testes</a>, poderemos ver que eles sugerem testar os controllers instanciando eles e setando os parâmetros. Isso se deve a que as anotações não são interpretadas pelo que temos que realizar as injeções manualmente. Devemos modificar nosso código para que possa ser testável ate um certo ponto, dado que como as anotações não participam, não sabemos se colocamos elas certas ou se temos esquecido de alguma.</p>
<p>Com <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> não temos esse problema, devido a que as anotações e as rotas são interpretadas normalmente, como se a requisição tivesse vindo via http! Podemos também utilizar os parâmetros opcionais :request, :inject, :session e :headers para definir os parâmetros do request, injetar objetos no controller, modificar a sessão http e também alguns headers, respetivamente.  </p>
<p>Além de tudo isso também ganhamos as features do excelente RSpec, como os mocks, expectativas e a possibilidade de imprimir a saída dos testes em diversos formatos e poder integrar ele com ferramentas muito boas como o <a href="http://github.com/carlosbrando/autotest-notification/tree/master">autotest-notification</a> ou ate o <a href="http://github.com/aslakhellesoy/cucumber/tree/master">Cucumber</a>!</p>
<p>Tudo isto é possível por causa do <a href="http://jruby.codehaus.org/">JRuby</a>, excelente tecnologia que nos permite integrar as linguagens Ruby e Java. De novo, se você programa em Java e ainda não aprendeu Ruby, não perda mais tempo. Aprendendo Ruby você vai ser tornar também um melhor programador Java, vai poder utilizar o <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> é também as novas surpresas que estão por vir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/01/27/demorou-mas-chegou-vraptor-sexy-urls-e-rspecvraptor/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Implementando interfaces Java com JRuby (+ Bonus)</title>
		<link>http://www.mouseoverstudio.com/blog/2009/01/12/implementando-interfaces-java-com-jruby-bonus/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/01/12/implementando-interfaces-java-com-jruby-bonus/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 22:56:29 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=159</guid>
		<description><![CDATA[Caso estejam trabalhando com JRuby e queiram implementar uma interface Java podem fazê-lo com a instrução include:
class MockedHttpSession
  include javax.servlet.http.HttpSession
  ...
end
Bonus
Caso estejam estendendo uma classe Java com JRuby e desejem chamar no construtor um dos métodos já implementados pela classe pai deverão utilizar antes a instrução super:
class MockedUser < User
  def initialize(password)
 [...]]]></description>
			<content:encoded><![CDATA[<p>Caso estejam trabalhando com JRuby e queiram implementar uma interface Java podem fazê-lo com a instrução include:</p>
<pre class="prettyprint">class MockedHttpSession
  include javax.servlet.http.HttpSession
  ...
end</pre>
<p><strong>Bonus</strong></p>
<p>Caso estejam estendendo uma classe Java com JRuby e desejem chamar no construtor um dos métodos já implementados pela classe pai deverão utilizar antes a instrução <em>super</em>:</p>
<pre class="prettyprint">class MockedUser < User
  def initialize(password)
    super
    setPassword password
  end
  ...
end</pre>
<p>Caso não chamem a instrução <em>super</em> irão receber a seguinte mensagem de erro:</p>
</pre>
<pre class="prettyprint">invokee not a java object</pre>
<p>Ultimamente estou mexendo bastante com JRuby. Se for do teu interesse, pode me seguir no <a href="http://twitter.com/dcrec1">Twitter</a> para se manter ao tanto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/01/12/implementando-interfaces-java-com-jruby-bonus/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Testes legais com RSpec na plataforma Java/Maven agora possível com rspec-maven-plugin</title>
		<link>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 00:02:06 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Maven]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=158</guid>
		<description><![CDATA[Um pouco de historia
Os que me seguem no Twitter devem estar sabendo que nos últimos dias esteve trabalhando num projeto em Java porém utilizando RSpec para testar ele. Se você ainda testa código feito em Java utilizando Java, te recomendo sair dessa vida, gasta um dia ou o tempo que for necessário para poder criar [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Um pouco de historia</strong></p>
<p>Os que me seguem no <a href="http://twitter.com/dcrec1">Twitter</a> devem estar sabendo que nos últimos dias esteve trabalhando num projeto em Java porém utilizando <a href="http://rspec.info/">RSpec</a> para testar ele. Se você ainda testa código feito em Java utilizando Java, te recomendo sair dessa vida, gasta um dia ou o tempo que for necessário para poder criar testes utilizando RSpec e se feliz criando testes de qualidade.</p>
<p>No projeto mencionado, a maioria dos desenvolvedores se sentia confortável utilizando Maven pelo que teve que me adequar a essa ferramenta que eu tanto gosto (ironia mode on) e averiguar se existia algo que vinculasse ela ao RSpec.</p>
<p>Foi assim que achei esse <a href="http://www.fnokd.com/2008/09/18/maven-java-and-rspec/">post</a> onde Bob apresenta o plugin <a href="http://svn.codehaus.org/mojo/trunk/sandbox/rspec-maven-plugin/">rspec-maven-plugin</a> que permite executar os testes criados en RSpec ao executar o target <em>test</em> do Maven, todo o que eu queria.</p>
<p>Configurei o plugin no meu pom.xml, executei a target <em>test</em> e&#8230; não funcionou. Como todo problema é também algo bom porque oferece a oportunidade de fazer algo legal, decidi realizar um <a href="http://github.com/dcrec1/rspec-maven-plugin/tree/master">fork</a> do projeto e corrigir ele.</p>
<p><strong>O plugin</strong></p>
<p>Como o plugin não esta no repositório oficial, para instalar o plugin <a href="http://github.com/dcrec1/rspec-maven-plugin/tree/master">rspec-maven-plugin</a> deve ser executado:</p>
<pre class="prettyprint">git clone git://github.com/dcrec1/rspec-maven-plugin.git
cd rspec-maven-plugin
mvn install</pre>
<p>Caso não tenham o Git instalado, podem baixar as fontes de <a href="http://github.com/dcrec1/rspec-maven-plugin/tarball/master">aqui</a>.</p>
<p>Uma vez no repositório local, podem configurar o plugin adicionando o seguinte ao pom.xml:</p>
<pre><code class="prettyprint">&lt;plugin&gt;
    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
    &lt;artifactId&gt;rspec-maven-plugin&lt;/artifactId&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;test&lt;/id&gt;
            &lt;phase&gt;test&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;spec&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</code></pre>
<p>Depois disto, o único pre-requisito para executar o plugin é setar a variável de ambiente JRUBY_HOME.</p>
<p>Ao executar o target <em>test</em>, o Maven ira executar os testes dentro da pasta <em>spec</em>. </p>
<p>Obrigado <a href="http://jruby.codehaus.org/">JRuby</a>, happy testing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JVM Language Summit 2008</title>
		<link>http://www.mouseoverstudio.com/blog/2008/10/04/jvm-language-summit-2008/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/10/04/jvm-language-summit-2008/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 18:45:52 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[davinci]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[jvm]]></category>

		<category><![CDATA[parrot]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=131</guid>
		<description><![CDATA[No més passado ocorreu o JVM Language Summit, onde rolou tudo tipo de palestras relacionadas com a Java Virtual Machine, com grandes nomes como Charles Nutter, Ola Bini e Neal Gafter, entre outros.
Algo que não foi muito divulgado é que o material das palestras esta disponível no próprio site, especificamente aqui. Algumas palestras que acho [...]]]></description>
			<content:encoded><![CDATA[<p>No més passado ocorreu o <a href="http://openjdk.java.net/projects/mlvm/jvmlangsummit/">JVM Language Summit</a>, onde rolou tudo tipo de palestras relacionadas com a Java Virtual Machine, com grandes nomes como <a href="http://blog.headius.com/">Charles Nutter</a>, <a href="http://ola-bini.blogspot.com/">Ola Bini</a> e <a href="http://gafter.blogspot.com/">Neal Gafter</a>, entre outros.</p>
<p>Algo que não foi muito divulgado é que o material das palestras esta disponível no próprio site, especificamente <a href="http://openjdk.java.net/projects/mlvm/jvmlangsummit/agenda.html">aqui</a>. Algumas palestras que acho interessantes são: <a href="http://wiki.jvmlangsummit.com/DaVinciMachine">Da Vinci Machine</a>, <a href="http://wiki.jvmlangsummit.com/ParrotVM">Parrot VM</a> e  <a href="http://wiki.jvmlangsummit.com/JRuby">JRuby</a>.  As três palestras abordam o tema de executar linguagens de script na JVM, o que é muito favorável para linguagens como Ruby.</p>
<p>Particularmente achei a palestra sobre JRuby muito legal. Como era de esperar, o nível dos atendentes era muito alto e com isso o Charles Nutter conseguiu encaprichar para tocar assuntos de bem baixo nivel, coisas internas da implementação JRuby, vale a pena conferir.</p>
<p>Algumas coisas ficam difíceis de entender somente vendo os slides, mas ainda bem as palestras vão estar disponíveis de aqui a pouco na <a href="http://www.infoq.com/">InfoQ</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/10/04/jvm-language-summit-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Traduz teus objetos entre Ruby e Java com Rhyme</title>
		<link>http://www.mouseoverstudio.com/blog/2008/09/29/traduz-teus-objetos-entre-ruby-e-java-com-rhyme/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/09/29/traduz-teus-objetos-entre-ruby-e-java-com-rhyme/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 04:16:03 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[rhyme]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=129</guid>
		<description><![CDATA[O problema
Quando trabalhamos com JRuby é muito provável que tenhamos objetos de Ruby ou de Java e que queiramos chamar algum método da outra linguagem que esteja esperando um objeto de uma classe similar nessa linguagem. 
Isso acontece mesmo?
Um claro exemplo do problema acontece no Liquid4j, que foi apresentado no ultimo post. Na oportunidade mencionei [...]]]></description>
			<content:encoded><![CDATA[<p><strong>O problema</strong></p>
<p>Quando trabalhamos com JRuby é muito provável que tenhamos objetos de Ruby ou de Java e que queiramos chamar algum método da outra linguagem que esteja esperando um objeto de uma classe similar nessa linguagem. </p>
<p><strong>Isso acontece mesmo?</strong></p>
<p>Um claro exemplo do problema acontece no <a href="http://github.com/dcrec1/liquid4j/tree/master">Liquid4j</a>, que foi apresentado no ultimo <a href="http://www.mouseoverstudio.com/blog/2008/09/23/templates-seguros-em-java-com-liquid4j/">post</a>. Na oportunidade mencionei que o Liquid4j conta com um método em Java chamado de render que recebe um objeto do tipo java.util.HashMap com as chaves e valores do template a ser renderizado. Também mencionei que por detrás dos panos o método utiliza o JRuby para chamar um método Ruby chamado igualmente de render. O problema é que esse ultimo método espera um objeto do tipo Hash, pelo que o processo seria similar a realizar o seguinte:</p>
<pre class="prettyprint">require "rubygems"
require "liquid"
map = java.util.HashMap.new
Liquid::Template.parse("hi").render(map)</pre>
<p>que resultaria em:</p>
<pre class="prettyprint">Liquid::ArgumentError: Expect Hash or Liquid::Context as parameter</pre>
<p><strong>O que aconteceu?</strong></p>
<p>Liquid é um livraria feita unicamente para Ruby e por tanto trabalha com objetos Ruby, ela não sabe trabalhar com objetos Java. Liquid4j é uma livraria feita unicamente para Java, ela utiliza o JRuby mas à nível da API tudo acontece em Java: métodos e objetos. Se Liquid4j chamasse o método render do Liquid com o objeto que recebeu como parâmetro, Liquid não iria reconhecer o tipo dele, pelo que nao iria saber como trabalhar com ele e por isso iria lançar a excepção mostrada.</p>
<p><strong>&#8220;Ja chamei métodos Ruby a partir do Java e vice-versa e não precisei converter/traduzir nada!&#8221;</strong></p>
<p>Existem alguns tipos de objetos que são convertidos automaticamente. Esses tipos são os tipos primitivos, como pode ser conferido <a href="http://wiki.jruby.org/wiki/Calling_Java_from_JRuby#Conversion_of_Types">aqui</a>.</p>
<p><strong>Por que JRuby não converte então automaticamente outros tipos de objetos?</strong></p>
<p>Não seria uma boa idéia, porque por exemplo eu poderia querer criar uma função em Ruby que trabalhasse com o tipo java.lang.ArrayList.</p>
<p><strong>A solução</strong></p>
<p>Criei uma gem chamada <a href="http://rhyme.rubyforge.org/">Rhyme</a> que se encarrega de traduzir objetos entre Ruby e Java. Rhyme traduz o objeto passado como parâmetro no método translate, assim como todos os objetos dentro dele. Isso quer dizer que se por exemplo a gente tiver um objeto do tipo Array que tiver um Hash num dos índices e aquele Hash tiver diferentes objetos nas diferentes keys, todos os objetos a partir do Array irão ser traduzidos para a contraparte em Java, como mostra o seguinte exemplo:</p>
<pre class="prettyprint">dcrec1:rhyme dcrec1$ jirb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "rhyme"
=> true
irb(main):003:0> Rhyme.translate([{ "date" => Date.new}])[0]["date"].class
=> Java::JavaUtil::Date</pre>
<p><strong>Utilizacão</strong></p>
<p>Se estivermos no Ruby, precisaremos incluir a gem Rhyme no nosso código e interpretar ele com JRuby:</p>
<pre class="prettyprint">require "rubygems"
require "rhyme"
...
java_obj = Rhyme.translate(ruby_obj)</pre>
<p>Por outro lado, se estivermos programando em Java, precisaremos alem do engine do JRuby, os helpers em Java para o Rhyme. O código poderá então ser executado assim:</p>
<pre class="prettyprint">import com.mouseoverstudio.rhyme.Rhyme;
...
Object rubyObject = Rhyme.translate(javaObject)</pre>
<p><strong>Onde encontrar o helper do Java? Como contribuir?</strong></p>
<p>As <a href="http://github.com/dcrec1/rhyme/tree/master">fontes</a> do projeto estão hospedadas no GitHub. Caso queiram trabalhar com Java e nao estejam a fim de compilar as fontes, existe um jar disponível na pasta dist. As dependências para o helper em Java podem ser encontradas na pasta lib.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/09/29/traduz-teus-objetos-entre-ruby-e-java-com-rhyme/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Templates seguros em Java com Liquid4j</title>
		<link>http://www.mouseoverstudio.com/blog/2008/09/23/templates-seguros-em-java-com-liquid4j/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/09/23/templates-seguros-em-java-com-liquid4j/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 21:57:58 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[liquid]]></category>

		<category><![CDATA[liquid4j]]></category>

		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=126</guid>
		<description><![CDATA[O que é Liquid?
Como diz o próprio site, Liquid é uma livraria para renderizar templates seguros que não possam afetar a seguridade do servidor no qual a operação esta sendo realizada.
Ah?
Imaginemos que temos uma aplicação na qual nossos usuários podem criar templates personalizados com dados que disponibilizamos a partir do nosso controller. Por exemplo, no [...]]]></description>
			<content:encoded><![CDATA[<p><strong>O que é Liquid?</strong></p>
<p>Como diz o próprio site, <a href="http://www.liquidmarkup.org/">Liquid</a> é uma livraria para renderizar templates seguros que não possam afetar a seguridade do servidor no qual a operação esta sendo realizada.</p>
<p><strong>Ah?</strong></p>
<p>Imaginemos que temos uma aplicação na qual nossos usuários podem criar templates personalizados com dados que disponibilizamos a partir do nosso controller. Por exemplo, no nosso controller carregamos os produtos que certo usuário tem para vender e ele pode criar uma pagina do jeito que ele quiser com dados sobre esses produtos. Para isso ele teria que ter controle sobre uma variável que referenciasse aqueles produtos, de modo que possa pegar os atributos ou ate chamar alguns métodos, como por exemplo product.name() ou product.calculate_price() . Ate ai tudo bem, mas que aconteceria se o produto tivesse um método chamado destroy, sale_to ou qualquer outro que pudesse ter algum impacto no negocio? Vamos deixar o usuário poder chamar essas operações? Claro que não!</p>
<p><strong>Como Liquid soluciona o problema?</strong></p>
<p>Liquid trabalha com um hash de valores que são obtidos a traves do método to_liquid do objeto com o qual se esta trabalhado. Se o usuário tiver a disposição uma lista de produtos e ele solicitar o atributo xpto de um deles, Liquid ira chamar o método to_liquid do produto e do hash que devera voltar como resultado ele ira pegar o atributo xpto. Se chamarmos produto.cor, Liquid ira chamar produto.to_liquid[&#8221;cor&#8221;]. Como Liquid trabalha com hashes, o cliente não consegue executar operações, somente solicitar dados!</p>
<p><strong>Liquid em ação</strong></p>
<p>Ryan Bates criou um tempo atras um <a href="http://railscasts.com/episodes/118-liquid">screencast</a> onde fala um pouco sobre Liquid e demostra como é utilizado.</p>
<p><strong>Onde entra Liquid4j na historia?</strong></p>
<p><a href="http://github.com/dcrec1/liquid4j/tree/master">Liquid4j</a> permite utilizar todo o poder do Liquid na plataforma Java sem a necessidade de escrever uma linha de código Ruby. Isso quer dizer que se com Liquid utilizávamos a sintaxe:</p>
<pre class="prettyprint">result = Liquid::Template.parse("hi {{name}}").render("name" => "Diego")</pre>
<p>com Liquid4j podemos utilizar:</p>
<pre class="prettyprint">String result = Liquid4j.parse("hi {{name}}").render(map);</pre>
<p>onde map referencia uma variável que implementa a interface Map, por exemplo:</p>
<pre class="prettyprint">Map map = new HashMap();
map.put("name", "Diego");</pre>
<p>Para conseguir tal objetivo Liquid4j utiliza JRuby por debaixo dos panos como interpretador da API do Liquid.</p>
<p><strong>Onde aprender mais?</strong></p>
<p>Existe uma boa documentação sobre o Liquid no <a href="http://github.com/tobi/liquid/wikis">wiki</a> do projeto. Na seção <a href="http://github.com/tobi/liquid/wikis/liquid-for-designers">Liquid para desenhadores</a> existem um monte de exemplos sobre como utilizar Liquid nas views, exemplos que também são válidos para Liquid4j.</p>
<p><strong>Onde se encontra o projeto?</strong></p>
<p>As fontes do projeto estão <a href="http://github.com/dcrec1/liquid4j/tree/master">aqui</a>, no GitHub. Ainda não existe uma documentação la mas já ta vindo. Na pasta dist se encontra um arquivo jar funcional e na pasta lib as dependências do projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/09/23/templates-seguros-em-java-com-liquid4j/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gerenciando MBeans via JMX API</title>
		<link>http://www.mouseoverstudio.com/blog/2008/09/17/gerenciando-mbeans-via-jmx-api/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/09/17/gerenciando-mbeans-via-jmx-api/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 21:33:41 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jmx]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[mbean]]></category>

		<category><![CDATA[mbeans]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=124</guid>
		<description><![CDATA[Muitas vezes, por algum motivo ou outro, desejamos realizar alguma operação num certo Mbean, como dar um stop, um start ou simplesmente mudar algum atributo.
Para quem nunca realizou a atividade e estiver procurando algum artigo ou tutorial em português, a primeira vez pode ser muito complicada devido à falta de exemplos; depois da primeira vez [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes, por algum motivo ou outro, desejamos realizar alguma operação num certo <a href="http://en.wikipedia.org/wiki/Managed_Bean">Mbean</a>, como dar um stop, um start ou simplesmente mudar algum atributo.</p>
<p>Para quem nunca realizou a atividade e estiver procurando algum artigo ou tutorial em português, a primeira vez pode ser muito complicada devido à falta de exemplos; depois da primeira vez é só seguir a receita do bolo.</p>
<p>Vou postar aqui um exemplo de como criar uma conexão com um servidor de MBeans e invocar um método num Mbean determinado. No exemplo vou demonstrar como utilizar a API do JMX para cumprir nossos objetivos, mas para que a demonstração seja um pouco mais interessante, vou chamar a API a partir da linguagem Ruby, poder que o JRuby nos proporciona.</p>
<pre class="prettyprint">require "java"

import java.util.HashMap

import javax.management.MBeanServerConnection
import javax.management.ObjectName
import javax.management.remote.JMXConnector
import javax.management.remote.JMXConnectorFactory
import javax.management.remote.JMXServiceURL

environment = HashMap.new
credentials = ["system", "manager"].to_java
environment.put(JMXConnector::CREDENTIALS, credentials)
address = JMXServiceURL.new("service:jmx:rmi:///jndi/rmi://mouseoverstudio.com/JMXConnector")
connector = JMXConnectorFactory.connect(address, environment)
connection = connector.getMBeanServerConnection
name = "geronimo:J2EEServer=geronimo,name=com.mouseoverstudio/ejb-app/2.0.0.2/jar,J2EEApplication=null,j2eeType=EJBModule"
obj = ObjectName.new(name)
connection.invoke(obj, "doStop", nil, nil)</pre>
<p>O que basicamente fazemos no código é  criar um HashMap onde proximamente colocamos um array com nossas credenciais, as quais irão ser utilizadas na hora de realizar a conexão com o servidor. Na seguinte linha criamos um endereço da localização de serviço JMX (mais detalhes <a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/management/remote/JMXServiceURL.html">aqui</a>) e continuamente utilizamos esse endereço, junto com os credenciais, para criar uma conexão com o serviço.</p>
<p>Uma vez estabelecida a conexão com o serviço JMX, solicitamos uma conexão com o servidor de MBeans e indicamos que queremos executar o método doStop no objeto com o nome indicado pela variável name. Esse objeto representa um MBean no servidor. </p>
<p>Para conhecer o nome do MBean que desejam gerenciar podem acessar o console JMX do servidor sento utilizado. Para realizar esse exemplo eu utilizei o Geronimo (como podem apreciar no nome do MBean), mas o mesmo console existe também tanto como para JBoss como para Glassfish.</p>
<p>Caso a operação invoke precise de parâmetros, podemos indicar eles no terceiro parâmetro do método invoke, passando eles como um array de objetos. Eu não entendo direito o quarto parâmetro (talvez porque nunca precisei utilizar ele) e por tal motivo não vou dizer para que eu acho que existe, devido a que posso terminar confundindo alguém. O mais seguro é que vocês também não precisem utilizar ele, mas se alguem conhece bem sua funcionalidade, por favor me explique!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/09/17/gerenciando-mbeans-via-jmx-api/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Colocando mensagens no Webshpere MQ com JRuby</title>
		<link>http://www.mouseoverstudio.com/blog/2008/09/16/colocando-mensagens-no-webshpere-mq-com-jruby/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/09/16/colocando-mensagens-no-webshpere-mq-com-jruby/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 23:50:37 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[jms]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[mq]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[websphere]]></category>

		<category><![CDATA[wmq]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=122</guid>
		<description><![CDATA[Estava trabalhando com Websphere MQ e tinha um programinha em Java que colocava mensagens numa fila do servidor. Num dos momentos livres decidi brincar um pouco e portar o código para Ruby. O código ficou mais legal e foi um excelente exemplo do poder da combinação Ruby + Java que o JRuby oferece.
Quem for precisar [...]]]></description>
			<content:encoded><![CDATA[<p>Estava trabalhando com Websphere MQ e tinha um programinha em Java que colocava mensagens numa fila do servidor. Num dos momentos livres decidi brincar um pouco e portar o código para Ruby. O código ficou mais legal e foi um excelente exemplo do poder da combinação Ruby + Java que o JRuby oferece.</p>
<p>Quem for precisar mandar uma mensagem para um servidor WQM a partir de um script em Ruby tem aqui um exemplo que também é valido para qualquer programador Java, devido a que a sintaxe é bem fácil de seguir:</p>
<pre class="prettyprint">require "java"
require "com.ibm.mqjms.jar"

import com.ibm.mq.jms.MQQueueConnectionFactory
import com.ibm.mq.jms.JMSC
import javax.jms.Session

factory = MQQueueConnectionFactory.new
factory.setHostName "wmq1.mouseoverstudio.com"
factory.setPort 1414
factory.setTransportType JMSC::MQJMS_TP_CLIENT_MQ_TCPIP
factory.setQueueManager "mouseoverstudio.queue.manager"
factory.setChannel "channel1"

connection = factory.createConnection
connection.start

session = connection.createSession false, Session::AUTO_ACKNOWLEDGE

message = session.createTextMessage "calling WMQ from JRuby"

queue = session.createQueue "queue:///mouseoverstudio.queue"

sender = session.createProducer queue
sender.send message

sender.close
session.close
connection.close</pre>
<p>Para executar o programa acima o arquivo com.ibm.mqjms.jar deve estar dentro do classpath, o qual pode ser indicado com a variável de ambiente CLASSPATH.</p>
<p>Para os programadores Java que forem traduzir o programa, em Ruby <em>::</em> indica uma constante da classe, similar ao static do Java, pelo que Session::AUTO_ACKNOWLEDGE se traduziria em Java como Session.AUTO_ACKNOWLEDGE.</p>
<p>Para os que desejem uma implementação 100% Ruby também existe o <a href="http://rubywmq.rubyforge.org/">RubyWMQ</a>, porém não testei ele é não sei se é bou ou não.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/09/16/colocando-mensagens-no-webshpere-mq-com-jruby/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
