<?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; ruby</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/ruby/?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>Anotações em Ruby</title>
		<link>http://www.mouseoverstudio.com/blog/2010/05/01/anotacoes-em-ruby/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/05/01/anotacoes-em-ruby/#comments</comments>
		<pubDate>Sat, 01 May 2010 23:03:37 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Annotations]]></category>

		<category><![CDATA[Meta Programming]]></category>

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=194</guid>
		<description><![CDATA[Na mundo da programação, uma anotação é um jeito de marcar o código que esta embaixo dele para diversos fins. No Cucumber, as tags que ele utiliza são uma espécie de anotação para poder aplicar callbacks e classificar algumas funcionalidades e cenários:

@billing
Feature: Verify billing

  @important
  Scenario: Missing product description

  Scenario: Several products

No [...]]]></description>
			<content:encoded><![CDATA[<p>Na mundo da programação, uma anotação é um jeito de marcar o código que esta embaixo dele para diversos fins. No <a href="http://cukes.info/">Cucumber</a>, as tags que ele utiliza são uma espécie de anotação para poder aplicar callbacks e classificar algumas funcionalidades e cenários:</p>
<p><code>
<pre class="prettyprint">@billing
Feature: Verify billing

  @important
  Scenario: Missing product description

  Scenario: Several products</pre>
<p></code></p>
<p>No caso do <a href="http://vraptor.caelum.com.br">VRaptor</a> temos anotações para poder classificar um controller como recurso <a href="http://pt.wikipedia.org/wiki/REST">REST</a> ou especificar o acesso a uma action:</p>
<p><code>
<pre class="prettyprint">@Resource
public class ShoppingCartController {
    ...
}

public class ProductsController {
    @Post
    @Path("/products")
    public void add(Product product) {...}
    ...
}</pre>
<p></code></p>
<p>Em <a href="http://www.ruby-lang.org">Ruby</a>, duas anotações que utilizamos bastante são os métodos <a href="http://ruby-doc.org/core/classes/Module.html#M001641">private</a> e <a href="http://ruby-doc.org/core/classes/Module.html#M001640">protected</a>, que sem argumentos restringem a visibilidade dos métodos definidos embaixo deles:</p>
<p><code>
<pre class="prettyprint">class User
  def jump; end;

  protected
  def eat; end;
  def flirt; end;

  private
  def sleep; end;
  def dream; end;
end</pre>
<p></code></p>
<p>Dependendo do caso, podemos querer anotar nosso código nesse estilo, como por exemplo para especificar que um método esta depreciado, funcionalidade que podemos obter com a gem <a href="http://github.com/qmx/canivete">Canivete</a> do <a href="http://twitter.com/qmx">Douglas Campos</a>:</p>
<p><code>
<pre class="prettyprint">class Bomb
  deprecate
  def explode; end
end</pre>
<p></code></p>
<p>No código acima, quando alguém chamar o método Bomb#explode, o interpretador ira efetivamente executar o método, mas além disso ira imprimir: <em>Warning: calling deprecated method Bomb.explode</em>.</p>
<p>Esse comportamento pode ser obtido por causa do método <a href="http://ruby-doc.org/core/classes/Module.html#M001662">method_added</a>, presente em todos os módulos do Ruby, que é chamado toda vez que um método e definido, recebendo o nome do mesmo como parâmetro.</p>
<p>Podemos utilizar esse método então por exemplo para criar uma anotação que serva para especificar que os métodos declarados após ela somente podem ser chamados por um admin, algo assim:</p>
<p><code>
<pre class="prettyprint">class Module
  def method_added(name)
    unless @_admin_only.nil? or @_proxy_method
      @_proxy_method = true
      alias_method "_admin_#{name}", name
      module_eval <<-STRING
        def #{name}(*args, &amp;block)
          _admin_#{name}(*args, &amp;block) if admin?
        end
      STRING
      @_proxy_method = false
    end
  end

  def admin_only
    @_admin_only = true
  end
end

class User
  def admin?
    [true, false][rand(2)]
  end

  admin_only

  def update_password
    puts "password updated"
  end

  def restart_server
    puts "server restarted"
  end
end</pre>
<p></code></p>
<p>Nó código acima, #admin? ira devolver verdadeiro ou falso aleatoriamente e dependendo do resultado, o método chamado ira ser executado ou não.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/05/01/anotacoes-em-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Acompanhando projetos no Pivotal Tracker com Kilt</title>
		<link>http://www.mouseoverstudio.com/blog/2010/03/22/acompanhando-projetos-no-pivotal-tracker-com-kilt/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/03/22/acompanhando-projetos-no-pivotal-tracker-com-kilt/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 22:38:36 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Kilt]]></category>

		<category><![CDATA[Pivotal Tracker]]></category>

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=193</guid>
		<description><![CDATA[Eu sou fan do Pivotal Tracker. Quando utilizava ele na Gonow, a equipe na qual eu estava ficava sentada toda numa unica mesa e isso era muito legal porque mesmo utilizando a ferramenta, era muito fácil avisar todo mundo que um estava pegando certa tarefa ou entregando aquela.
Quando utilizei o Pivotal com uma equipe remota [...]]]></description>
			<content:encoded><![CDATA[<p>Eu sou fan do <a href="http://www.pivotaltracker.com/">Pivotal Tracker</a>. Quando utilizava ele na <a href="http://www.gonow.com.br">Gonow</a>, a equipe na qual eu estava ficava sentada toda numa unica mesa e isso era muito legal porque mesmo utilizando a ferramenta, era muito fácil avisar todo mundo que um estava pegando certa tarefa ou entregando aquela.</p>
<p>Quando utilizei o Pivotal com uma equipe remota senti falta de saber o que estava acontecendo em tempo real, pelo que decidi criar o <a href="http://github.com/dcrec1/kilt">Kilt</a>.</p>
<p>O <a href="http://github.com/dcrec1/kilt">Kilt</a> é um daemon criado em Ruby que fica solicitando as atualizações dos projetos do usuário configurado e mostra uma notificação de alerta para cada uma recebida:</p>
<p><img src="http://img684.imageshack.us/img684/4875/screenshot20100319at349.png" alt="Kilt" /></p>
<p>Com o <a href="http://github.com/dcrec1/kilt">Kilt</a> consigo ficar programando e ao mesmo tempo ficar sabendo de tudo o que esta acontecendo com os projetos nos quais estou envolvido no Pivotal.</p>
<p>Para instalar o <a href="http://github.com/dcrec1/kilt">Kilt</a> basta baixar a gem e chamar kilt-install com o token do usuário desejado:</p>
<pre class="prettyprint"><code>sudo gem install kilt
kilt-install TOKEN</code></pre>
<p>Caso não conheçam o token do usuário, podem executar:</p>
<pre class="prettyprint"><code>curl -u USERNAME:PASSWORD -X GET https://www.pivotaltracker.com/services/v3/tokens/active</code></pre>
<p>o que devolvera um documento xml com o id e o token do usuário. Caso desejem outro método para solicitar o token, podem se referir à <a href="http://www.pivotaltracker.com/help/api?version=v3#retrieve_token">documentação</a> do Pivotal.</p>
<p>Uma vez instalado o <a href="http://github.com/dcrec1/kilt">Kilt</a>, para rodar ele basta executar:</p>
<pre class="prettyprint"><code>kilt-app</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/03/22/acompanhando-projetos-no-pivotal-tracker-com-kilt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Acessando variáveis nos filtros Liquid</title>
		<link>http://www.mouseoverstudio.com/blog/2009/05/26/acessando-variaveis-nos-filtros-liquid/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/05/26/acessando-variaveis-nos-filtros-liquid/#comments</comments>
		<pubDate>Tue, 26 May 2009 19:35:17 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Markup]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=171</guid>
		<description><![CDATA[Se por acaso precisarem acessar alguma variável a partir de um filtro do Liquid podem utilizar a variável de instancia context.
Tal comportamento pode ser desejado ao querer implementar algo similar ao asset_url do Shopify:
module SitesFilter
  def asset_url(input)
    "/system/assets/#{@context['company'].id}/#{input}"
  end
end

Liquid::Template.register_filter(SitesFilter)
]]></description>
			<content:encoded><![CDATA[<p>Se por acaso precisarem acessar alguma variável a partir de um filtro do <a href="http://www.liquidmarkup.org/">Liquid</a> podem utilizar a variável de instancia <em>context</em>.</p>
<p>Tal comportamento pode ser desejado ao querer implementar algo similar ao <a href="http://wiki.shopify.com/Asset_url">asset_url</a> do <a href="http://www.shopify.com/">Shopify</a>:</p>
<pre class="prettyprint">module SitesFilter
  def asset_url(input)
    "/system/assets/#{@context['company'].id}/#{input}"
  end
end

Liquid::Template.register_filter(SitesFilter)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/05/26/acessando-variaveis-nos-filtros-liquid/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>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>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>
		<item>
		<title>Apresentando CompiledScript e Compilable para melhorar a performance de teus programas JRuby e similares</title>
		<link>http://www.mouseoverstudio.com/blog/2008/08/31/apresentando-compiledscript-e-compilable-para-melhorar-a-performance-de-teus-programas-jruby-e-similares/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/08/31/apresentando-compiledscript-e-compilable-para-melhorar-a-performance-de-teus-programas-jruby-e-similares/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 04:05:14 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=119</guid>
		<description><![CDATA[Quando avaliamos alguma script na JVM utilizando o método eval da classe javax.script.ScriptEngine basicamente são realizadas duas tarefas: a compilação do script e a execução dele.
Caso queiramos avaliar x vezes o mesmo script e estejamos chamando o método eval mencionado, o script ira ser compilado x vezes.
O mesmo script precisa ser compilado x vezes?
Não!
O que [...]]]></description>
			<content:encoded><![CDATA[<p>Quando avaliamos alguma script na JVM utilizando o método <em>eval</em> da classe <em>javax.script.ScriptEngine</em> basicamente são realizadas duas tarefas: a compilação do script e a execução dele.</p>
<p>Caso queiramos avaliar x vezes o mesmo script e estejamos chamando o método <em>eval</em> mencionado, o script ira ser compilado x vezes.</p>
<p><strong>O mesmo script precisa ser compilado x vezes?</strong></p>
<p>Não!</p>
<p><strong>O que fazer ao respeito?</strong></p>
<p>A especificação JSR-233 conta com uma classe chamada <em>CompiledScript</em> que como o mesmo nome diz, representa um script compilado, de modo que quando queiramos avaliar o script o único que vamos ter que fazer é executar ele.</p>
<p>Para compilar um script primeiro temos que realizar um casting do engine para a interfase Compilable e logo chamar o metodo <em>compile</em>:</p>
<pre class="prettyprint">CompiledScript compiledScript = ((Compilable) engine).compile(script)</pre>
<p>Logo, quando queiramos avaliar o script compilado o único que vamos ter que fazer e chamar o método <em>eval</em>, passando como parâmetro o contexto (opcional):</p>
<pre class="prettyprint">Object result = compiledScript.eval(context)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/08/31/apresentando-compiledscript-e-compilable-para-melhorar-a-performance-de-teus-programas-jruby-e-similares/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
