<?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/page/3/?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>Decompilando Java com Eclipse e JAD</title>
		<link>http://www.mouseoverstudio.com/blog/2008/03/08/decompilando-java-com-eclipse-e-jad/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/03/08/decompilando-java-com-eclipse-e-jad/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 19:19:46 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

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

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

		<category><![CDATA[programação]]></category>

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=70</guid>
		<description><![CDATA[Por motivos X que não devem acontecer, o código fonte de uma livraria Y foi perdido, ficando somente o Java Archive (JAR). 
Ouvi que existe um método de recuperar um código fonte, utilizando decompiladores. Possivelmente não se consiga recuperar o código das classes em um 100%, mas muita coisa deve dar para recuperar, dependendo do [...]]]></description>
			<content:encoded><![CDATA[<p>Por motivos X que não devem acontecer, o código fonte de uma livraria Y foi perdido, ficando somente o Java Archive (JAR). </p>
<p>Ouvi que existe um método de recuperar um código fonte, utilizando decompiladores. Possivelmente não se consiga recuperar o código das classes em um 100%, mas muita coisa deve dar para recuperar, dependendo do caso.</p>
<p>Pesquisei um pouco e ao parecer o melhor decompilador e o mais popular é o <a href="http://www.kpdus.com/jad.html">Jad</a>. Existem muitos outros mas parecem estar bem desatualizados e somente dão suporte ate a versão 1.3 do Java. Mesmo o Jad sendo o mais atualizado dos que encontrei, a noticia mais nova no site e do dia 2 de Julho de 2006.</p>
<p>Uma coisa que me fez pegar confiança no Jad é que existem um monte de ferramentas com interface gráfica que utilizam o Jad por detrás e também existe um plugin do Jad para o Eclipse chamado <a href="http://sourceforge.net/projects/jadclipse">JadClipse</a>, que é o que vou utilizar agora. A última versão é para o Eclipse Europa e foi lançada em Maio do 2007.</p>
<p>Baixei o plugin, coloquei ele na pasta plugins da minha instalação do Eclipse e abri o mesmo.</p>
<p>Ao abrir o Eclipse não apareceu nada diferente, mas sim nas preferências. No menu <em>Java</em> foi adicionado um submenu <em>JadClipse</em>, com muitas opções para configurar o plugin. Eu deixei as preferências no padrão. Em <em>General > Editors > File Associations</em> da para apreciar que existe uma asociação entre os arquivos .class e o <em>JadClipse Class File Viewer</em>.</p>
<p>Num dos projetos que estavam atualmente no Working Set tinha um que utilizava algumas livrarias do JBoss. Naveguei dentro de um  arquivo .jar ate achar um arquivo .class e dei duplo click nele. Parece que nesse momento o Jad decompila o arquivo e deveria mostrar o resultado, mas ele mostrou para mim o seguinte:</p>
<blockquote><p>DECOMPILATION REPORT</p>
<p>	Decompiled from: /home/dcrec1/workspace/jboss-4.2.2.GA/server/default/lib/mail.jar<br />
	Total time: 2 ms<br />
	Jad reported messages/errors:<br />
	Exit status: 0<br />
	Caught exceptions:<br />
java.io.IOException: java.io.IOException: jad: not found<br />
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)<br />
       &#8230;<br />
</init></p></blockquote>
<p>Parece que por algum motivo o programa Jad não esta sendo encontrado. É obvio, não instalei ele!</p>
<p>Baixei a ultima versão do Jad e coloquei o arquivo <em>jad</em> dentro da pasta <em>/usr/bin</em> . Repeti o processo e o resultado foi o mesmo. </p>
<p>Voltei nas configurações do JadClipse e nelas existe um campo chamado <em>Path to decompiler</em>. Escrevi <em>/usr/bin/jad</em> como valor, apliquei as mudanças e repeti o processo de decompilação. A nova mensagem foi a seguinte:</p>
<blockquote><p>DECOMPILATION REPORT</p>
<p>	Decompiled from: /home/dcrec1/workspace/jboss-4.2.2.GA/server/default/lib/mail.jar<br />
	Total time: 25 ms<br />
	Jad reported messages/errors:<br />
/usr/bin/jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory<br />
	Exit status: 127</p></blockquote>
<p>O erro se deu porque faltam livrarias no meu ambiente. Resolvi o problema no Ubuntu instalando o pacote <em>libstdc++2.10-glibc2.2</em>.</p>
<p>Repeti por terceira vez o processo e funcionou uma beleza! O código decompilado apareceu rapidamente e no final do código apareceu o seguinte texto como comentário:</p>
<blockquote><p>DECOMPILATION REPORT</p>
<p>	Decompiled from: /home/dcrec1/workspace/jboss-4.2.2.GA/server/default/lib/mail.jar<br />
	Total time: 45 ms<br />
	Jad reported messages/errors:<br />
The class file version is 48.0 (only 45.3, 46.0 and 47.0 are supported)<br />
	Exit status: 0<br />
	Caught exceptions:</p></blockquote>
<p>Ao parecer aconteceu algum erro mas não da para ser identificado a simples vista. Me parece que não daria para descobrir que o código gerado foi decompilado, os nomes das variáveis não apresentam caracteres estranhos nem as propriedades ou algum método.</p>
<p>Agora somente falta fazer testes para ver que tão parecido fica o código decompilado com o pre-compilado. Mesmo podendo não recuperar a classe em um 100%, acho que o JadClipse vai me ajudar bastante quando utilize ele na segunda-feira com a livraria mencionada no começo do post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/03/08/decompilando-java-com-eclipse-e-jad/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Profiling em Java com JProfiler</title>
		<link>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 18:09:12 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

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

		<category><![CDATA[otimização]]></category>

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=67</guid>
		<description><![CDATA[Um profiler é uma ferramenta que informa sobre o comportamento de uma aplicação em tempo de execução. 
Depois de pesquisar sobre diversos profilers para analisar uma aplicação Java, cheguei na conclusão que o JProfiler é o melhor. O único problema do JProfiler ate agora é que ele é pago. 
Vamos instalar uma versão trial dele [...]]]></description>
			<content:encoded><![CDATA[<p>Um profiler é uma ferramenta que informa sobre o comportamento de uma aplicação em tempo de execução. </p>
<p>Depois de pesquisar sobre diversos profilers para analisar uma aplicação Java, cheguei na conclusão que o <a href="http://www.ej-technologies.com/index.html">JProfiler</a> é o melhor. O único problema do JProfiler ate agora é que ele é pago. </p>
<p>Vamos instalar uma versão trial dele e ver o que podemos fazer com ele. Para descarregar o trial do JProfiler primeiro temos que acesar essa <a href="http://www.ej-technologies.com/download/jprofiler/trial.php">pagina</a> e preencher o formulário. Um key para poder testar a ferramenta por dez dias será enviado. Seguidamente podemos entrar na <a href="http://www.ej-technologies.com/download/jprofiler/files_trial.php">área de downloads</a> e baixar a versão desejada. A versão que eu estarei baixando é a 5.1.2, versão instalação executável. </p>
<p>A descarga finalizou e também chegou meu key, agora vou instalar. Vou ir no console na pasta onde descarreguei o arquivo e dar um <em>./jprofiler_linux_5_1_2.sh</em>. Seguidamente é aberto um wizard onde aceitamos os termos do programa e indicamos onde queremos instala-lo. </p>
<p>Ao abrir o programa pela primeira vez é apresentado outro wizard, dessa vez uma wizard de configuração. Nesse wizard devemos inserir nossa key, escolher a VM que desejamos utilizar, indicar se queremos integrar o JProfiler com algum IDE e escolher nosso browser, é um processo bem simples. </p>
<p>Uma vez terminado o segundo wizard aparece um terceiro onde podemos indicar qual aplicação queremos que o profiler analise. Podemos também configurar para fazer que esse wizard apareça toda vez que abrirmos o programa ou não. Eu escolhi para aparecer toda vez porque é um wizard muito simples e faz que em um tempo muito pequeno tenhamos um profiler trabalhando com nossa aplicação escolhida.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler1.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler1_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Nessa oportunidade, vou utilizar o profiler com uma aplicação web minha que estou fazendo. A aplicação e muitos simples e possivelmente não vamos poder descobrir picos de garrafa, mas vamos poder obter uma idéia do que podemos fazer com o JProfiler. Justamente pelo que vou analizar uma aplicação web vou escolher no wizard a opção <em>An application server, locally or remotely</em>. Vou dar <em>next</em> e seguidamente vou escolher a versão do servidor de aplicação que vou utilizar, JBoss 4.x no meu caso. <em>Next</em> novamente, escolho que o servidor de aplicação esta nessa máquina e dou next novamente. Agora vou indicar qual é o arquivo que levanta o servidor. No meu caso ele se encontra na pasta <em><jboss -home>/bin/</jboss></em> e se chama <em>run.sh</em>. Passos seguintes são escolher a máquina virtual a utilizar, a porta desejada para a conexão do profiler e decidir se queremos que nosso servidor de aplicação espere por uma conexão do profiler antes de inicializar ou não. Vou escolher a opção <em>Wait for connection from the JProfiler GUI</em> que quer dizer que quero que espere e avançar para o próximo passo. No seguinte passo é visualizado um resumo do que foi configurado e no ultimo temos a opção de escolher se queremos inicializar o servidor agora ou deixar isso para mais tarde. Vou escolher que quero inicializar agora escolhendo a opção <em>Yes, start the application server for profiling</em>. </p>
<p>Uma vez finalizado o wizard apareceu para mim uma janela indicando que minha versão e de evaluação. Tenho a opção de inserir uma key pagar. Vou fazer click em <em>Evaluate</em> para evaluar somente porque não comprei nada.</p>
<p>Antes de iniciar o servidor aparece uma janelha onde podemos fazer umas ultimas configurações. Também é indicado o nivel de CPU e memória que o JProfiler precisara de acordo com o configurado. Eu quero que tudo seja gravado então vou escolher as opções <em>Record CPU data on startup</em> e <em>Record allocations on startup</em> que vão a analizar quando cpu e quanta memória o servidor utiliza para inicializar.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler2.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler2_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Vou mudar a configuração do meus filtros porque não quero que todas as classes sejam analisadas, somente as classes do pacote com.mouseoverstudio . Na seção <em>Filter settings</em> vou fazer click em <em>Edit</em>. Por default, nos filtros ja vem configura um filtro para excluir do analise um monte de classes. Vou deixar as coisas mas simples apagando esse filtro e incluindo um novo do tipo inclusivo com o valor com.mouseoverstudio . </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler3.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler3_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Seguidamente <em>ok</em> na janela e <em>ok</em> novamente na outra janela.</p>
<p>É aberto uma console com o debug do JBoss onde podemos ver que ele esta inicializando.</p>
<p>Durante a inicialização podemos ir no JProfiler na opção <em>VM Telemetry Views</em> e ver a memoria ram que esta sendo consumida em tempo real e ao longo de tempo de vida do nosso servidor:</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler4.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler4_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Na parte inferior aparecem umas abas. Se fizermos click na aba <em>Recorded Objects</em> podemos visualizar a quantidade de objetos que residem na memória. Nas outras abas podemos analisar a quantidade de objetos criados e liberados da memória (Recorded Throughtput), a atividade do Garbage Collector (GC Activity), a quantidade de classes sendo analisadas pelo profiler (Classes), os Threads (Threads) e a carga do cpu (CPU Load).</p>
<p>Vou navegar um pouco na minha aplicação, vou selecionar uma funcionalidade pesada e durante sua execução vou me dirigir no JProfiler. Na opção <em>Memory Views</em> podemos ver o numero de instâncias existentes na memória, agrupadas por classes, pacotes ou componentes e quanta memória esse número de instâncias estão utilizando. Num primeiro momento é mostrada informação sobre todas as classes do sistema. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler5.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler5_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Como eu quero ver somente informação sobre minhas classes, vou me dirigir para <em>View Filters</em> e digitar <em>com.mouseoverstudio</em> . Ao dar <em>enter</em> são filtradas as classes que não pertencem ao pacote <em>com.mouseoverstudio</em> .</p>
<p>Essa funcionalidade é muito legal. Nessa semana estava analisando a aplicação de um cliente quando vi que ao acessar uma funcionalidade x, eram criadas muitas instâncias de um objeto o qual não deveria ter mais de uma por usuário. Depois de analisar o código com os desenvolvedores a gente percebeu que estava sendo criada a instância de um classe dentro de um loop, quando deveria ser fora de acordo com a lógica do negocio. </p>
<p>Eu sabia que estavam sendo criadas muitas instâncias de um classe, mas como saber onde eram criadas estas instâncias? Na seção <em>CPU Views</em> podemos visualizar uma árvore de chamadas sendo realizadas na VM. Dentro da informação se encontra o peso de aquela chamada em relação as outras, o tempo que demorou e o numero de invocações que teve. Podemos agrupar as chamadas novamente por métodos, classes, pacotes ou componentes, filtras informação de certo pacote ou de certa thread.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler6.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler6_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Na aba <em>Hot Spots</em> temos informação parecida, mas partindo de outras fontes, chamadas Hot Spots. Eu estou na dúvida sobre se sei corretamente o que é um Hot Spot e o que representa mas sei que a informação apresentada parte deles. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler7.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler7_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Se fizermos click direito numa classe dentro da árvore e selecionarmos <em>Show Call Graph</em> vamos poder visualizar a informação desejada mas de um modo gráfico, podendo escolher um layout hierárquico, ortogonal ou orgânico.  Nesse gráfico é apresentada a mesma informação e podemos ir navegando por ele e abrindo conexões, podendo apreciar como as classes estão se relacionando entre sim.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler8.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler8_t.jpg" alt="" /></a><br /></center></p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler9.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler9_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Foi assim que no caso do cliente eu escolhi uma classe de partida que eu sabia que a requisição tinha passado por ali e fui navegando ate achar a classe que criava aquela quantidade enorme de instâncias. </p>
<p>JProfiler tem muita outra informação a oferecer, mas como eu sou ainda novato com a ferramenta, não entendo toda ela corretamente e poderia confundir as pessoas se tratasse de explica-las. Porém, com o que eu tenho aprendido e tentado explicar nesse post ja da para fazer muito análise de uma aplicação e tirar uso da ferramenta. Justamente com aquele uso e que se vão aprendendo novas coisas e conforme eu for aprendendo vou ir postando aqui.</p>
<p>Qualquer informação a mais por favor deixar-las nos comentários.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Aprendendo a desenvolver com JRuby (Parte 1: Configurando o ambiente)</title>
		<link>http://www.mouseoverstudio.com/blog/2008/02/04/aprendendo-a-desenvolver-com-jruby-parte-1-configurando-o-ambiente/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/02/04/aprendendo-a-desenvolver-com-jruby-parte-1-configurando-o-ambiente/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 20:55:11 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=65</guid>
		<description><![CDATA[Vou começar a mexer com JRuby nesse momento.
Depois de pesquisar sobre o melhor IDE para trabalhar com JRuby cheguei a conclusão que o melhor é o NetBeans 6. O NetBeans é da Sun e os desenvolvedores do JRuby trabalham para a Sun então tem lógica. Para saber mais sobre NetBeans e Ruby/JRuby ingressar aqui. 
Baixando [...]]]></description>
			<content:encoded><![CDATA[<p>Vou começar a mexer com JRuby nesse momento.</p>
<p>Depois de pesquisar sobre o melhor IDE para trabalhar com JRuby cheguei a conclusão que o melhor é o NetBeans 6. O NetBeans é da Sun e os desenvolvedores do JRuby trabalham para a Sun então tem lógica. Para saber mais sobre NetBeans e Ruby/JRuby ingressar <a href="http://www.netbeans.org/features/ruby/index.html">aqui</a>. </p>
<p><em>Baixando NetBeans 6.0 Installer for Linux/English (en) netbeans-6.0-linux.sh (168.6 MB) MD5: 6b072e5e4baba945f48b7837cb944d93 &#8230;</em></p>
<p>O NetBeans baixou, fui no console e rodei ./netbeans-6.0-linux.sh , logo next next next. Foi criado um atalho no meu escritório, dois clicks e o NetBeans esta aberto. </p>
<p>Dentro do NetBeans, File > New Project . Na janela aberta escolhi Ruby como categoria e Rails Project como projeto. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jruby3.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jruby3_t.jpg" alt="" /></a><br /></center></p>
<p></p>
<p>Fiz click em Next. Apareceu uma janela perguntando sobre qual interpretador queria utilizar. Escolhi JRuby e depois de dar ok escolhi um nome de projeto, a base de dados com a qual ia trabalhar e novamente click em next. A janela mostrou que tinha a versão 1.2.5 do Rails. Fiz click no botão Update Rails para atualizar o Rails.</p>
<p><em>Atualizando Rails &#8230;</em></p>
<p>Opa! deu um erro: Exception in thread &#8220;main&#8221; java.lang.OutOfMemoryError: Java heap space . Vou dar click em close e tentar de novo.</p>
<p><em>Atualizando Rails &#8230;</em></p>
<p>A segunda tentativa deu erro também. Vou instalar na mão. No console mandei <em>gem install rails &#8211;include-dependencies</em> e vixi: <em>The program &#8216;gem&#8217; is currently not installed.  You can install it by typing: sudo apt-get install rubygems</em> . Esta bom então, mandei <em>sudo apt-get install rubygems</em> e seguidamente <em>gem install rails &#8211;include-dependencies</em> novamente.</p>
<p><em>Bulk updating Gem source index for: http://gems.rubyforge.org</em></p>
<p>Ahhh como assim, apareceu o erro <em>ERROR:  While executing gem &#8230; (Gem::GemNotFoundException) Could not find rails (> 0) in any repository</em> . Google agora!</p>
<p>Abdul Qabiz <a href="http://www.abdulqabiz.com/blog/archives/2007/10/">falou</a> que se rodar <em>sudo gem update</em> meu problema estaria resolvido, então vamos la. <em>sudo gem update</em>, seguido de <em>gem install rails &#8211;include-dependencies</em> novamente (terceira vez) e esperando.</p>
<p>Taráaaa! Agora sim:</p>
<p><em>Successfully installed rails-2.0.2<br />
Successfully installed activeresource-2.0.2<br />
Installing ri documentation for activeresource-2.0.2&#8230;<br />
Installing RDoc documentation for activeresource-2.0.2&#8230;</em></p>
<p>Vou fechar o NetBeans, entrar de novo e repetir o processo. Antes disso, vou tunar um pouco o NetBeans mexendo no arquivo /etc/netbeans.conf, seguindo a lógica descrita nesse <a href="http://www.mouseoverstudio.com/blog/?p=44">post</a>. </p>
<p>Abri o NetBeans, fiz o processo novamente e continuava aparecendo uma versão antiga do Rails. Ao tentar atualizar acontecia o mesmo erro relacionado a memória. Depois de mexer por aqui e por la e pesquisar um monte descobri que o erro se dava por causa de um <a href="http://www.netbeans.org/issues/show_bug.cgi?id=122593">bug</a> do NetBeans. A resolução do ticket estava como fixed então fui no trunk do NetBeans e puxei a <a href="http://bits.netbeans.org/download/trunk/nightly/latest/">ultima versão</a>, lançada hoje. Instalei, executei, repeti o processo e dessa vez tudo saiu bem, a versão de Rails registrada era a 2.0.2 . Dei click em finish e projeto criado. <img src='http://www.mouseoverstudio.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Fiz um click direito no nome do meu projeto e selecionei Run para ver se tudo estava funcionando perfeitamente. Foi aberta uma aba no output do NetBeans para o servidor WEBrick (que é o que vem por default) e apareceu o seguinte erro: <em>rubygems.rb:379:in `report_activate_error&#8217;: Could not find RubyGem ActiveRecord-JDBC (>= 0) (Gem::LoadError)</em>.</p>
<p>Não tenho muito interesse agora em tentar concertar o erro porque não quero utilizar WEBrick, quero utilizar Mongrel porque em tudo lugar vejo falar que é muito bom e uma das melhores coisas que o Ruby tem. </p>
<p>Acessei <em>Tools > Ruby Gems</em> e percebi que existiam gems instalados desatualizados, assim que antes de fazer outro movimento, atualizei. Agora vou tentar instalar o Mongrel. Me dirigi na aba <em>New Gems</em> e procurei mongrel na lista gigante que apareceu. Seguidamente selecionei ele e click em Install. Escolhi para incluir as dependências e click em Ok.</p>
<p><em>INFO:  `gem install -y` is now default and will be removed<br />
INFO:  use &#8211;ignore-dependencies to install only the gems you list<br />
Successfully installed gem_plugin-0.2.3<br />
Successfully installed mongrel-1.1.3-java<br />
2 gems installed</em></p>
<p>Mongrel instalado, click em Close.</p>
<p>Acho que o Mongrel não esta instalado ou não corretamente. Fiz o processo de criar um novo projeto para ver se aparecia Mongrel na combo de servidores e não aparecia. Tentei rodar <em>mongrel_rails</em> no console para ver o que dava e o que deu foi um <em>command not found</em>. <img src='http://www.mouseoverstudio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Vou instalar o Mongrel na mão mandando executar <em>sudo gem install mongrel</em>.  Para variar um pouco, apareceu o seguinte erro:</p>
<p><em>Building native extensions.  This could take a while&#8230;<br />
ERROR:  Error installing mongrel:<br />
        ERROR: Failed to build gem native extension.</p>
<p>/usr/bin/ruby1.8 extconf.rb install mongrel<br />
extconf.rb:1:in `require&#8217;: no such file to load &#8212; mkmf (LoadError)<br />
        from extconf.rb:1</p>
<p>Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/fastthread-1.0.1 for inspection.<br />
Results logged to /usr/lib/ruby/gems/1.8/gems/fastthread-1.0.1/ext/fastthread/gem_make.out<br />
</em></p>
<p>Felizmente consegui achar a solução rapidamente <a href="http://railsclones.com/2008/1/1/setting-up-mongrel-in-a-ubuntu-system/">aqui</a>. Segui o processo especificado no post e depois o console ja estava reconhecendo o comando mongrel_rails. Mongrel instalado agora sim!</p>
<p><em>Reiniciando NetBeans &#8230;</em></p>
<p>Fiz o procedimento de criar um novo projeto e Mongrel apareceu nas opções de servidor. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jruby4.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jruby4_t.jpg" alt="" /></a><br /></center></p>
<p></p>
<p>Isso é bom, esta instalado corretamente e o NetBeans reconheceu ele. O problema é que não sei como fazer para que meu projeto rode no Mongrel e não mais no WEBrick. Fiz um click direito no nome do meu projeto e vi que tinha uma opção chamada Find, acessei ela e procurei por webrick, esperando que exista um arquivo de configuração onde e definido o servidor. Efetivamente parece que existe este arquivo, chamado private.properties, que tem uma propriedade chamada rails.servertype. Vou mudar o valor de WEBRICK para MONGREL, rodar o projeto e ver que acontece.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jruby2.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jruby2_t.jpg" alt="" /></a><br /></center></p>
<p></p>
<p>A boa noticia é que o projeto iniciou sobre o Mongrel. A ma noticia é que deu o erro <em>Could not find RubyGem ActiveRecord-JDBC</em>. Imagino que não tenho o gem ActiveRecord-JDBC na minha maquina então vou fazer um <em>sudo gem install ActiveRecord-JDBC</em> e ver que rola.</p>
<p>Instalou corretamente :D, versão 0.5. Vou tenta rodar novamente minha aplicação. Não deu certo. Acessei <em>Tools > Ruby Gems</em> e vi que ActiveRecord-JDBC não estava na aba Installed. Fui na aba New Gems, procurei ele e dei click em Install. Ou output da janela de instalação foi o mesmo do output do console, quando tentei instalar por ali. A diferença e que agora sim ActiveRecord-JDBC apareceu na aba Installed. Vou tentar rodar minha aplicação de novo.</p>
<p>Agora sim deu certo! A janela do output não apresentou nenhum erro e ao acessar http://0.0.0.0:3000/ foi apresentada uma pagina com o título:</p>
<blockquote><p><strong>Welcome aboard</strong><br />
You’re riding Ruby on Rails!</p></blockquote>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jruby1.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jruby1_t.jpg" alt="" /></a><br /></center></p>
<p></p>
<p>A página diz que ainda tenho que fazer algumas coisas, mas ficara pro próximo post. O preview do WordPress não esta funcionando e não sei se o texto esta muito longo ou não.</p>
<p>De qualquer jeito, ate a próxima parte!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/02/04/aprendendo-a-desenvolver-com-jruby-parte-1-configurando-o-ambiente/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Recompilação dos últimos links interessantes</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/19/recompilacao-dos-ultimos-links-interessantes/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/19/recompilacao-dos-ultimos-links-interessantes/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 14:24:15 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

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

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

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

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

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

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

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

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

		<category><![CDATA[programação]]></category>

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=52</guid>
		<description><![CDATA[Nesses ultimos dias, a IBM publicou alguns artigos interessantes como os chamados Generar aplicações web Ajax J2EE com jpa2web, Criar aplicações ricas com JavaFX Script, a segunda parte da serie Aplicações Ajax sólidas: Construindo back ends ou Comezando com Grails: Construindo tua primeira aplicação Grails.
Também nesses últimos dias chegamos a conhecer alguns projetos interessantes como [...]]]></description>
			<content:encoded><![CDATA[<p>Nesses ultimos dias, a IBM publicou alguns artigos interessantes como os chamados <a href="http://www.ibm.com/developerworks/web/library/wa-aj-jpa2web/index.html?ca=drs-">Generar aplicações web Ajax J2EE com jpa2web</a>, <a href="http://www.ibm.com/developerworks/web/library/j-javafx/index.html?ca=drs-">Criar aplicações ricas com JavaFX Script</a>, a <a href="http://www.ibm.com/developerworks/web/library/wa-aj-backend/index.html?ca=drs-">segunda parte da serie Aplicações Ajax sólidas: Construindo back ends</a> ou <a href="http://www.ibm.com/developerworks/web/library/j-grails01158/index.html?ca=drs-">Comezando com Grails: Construindo tua primeira aplicação Grails</a>.</p>
<p>Também nesses últimos dias chegamos a conhecer alguns projetos interessantes como o <a href="http://josql.sourceforge.net/">JoSQL</a> que nos permite executar código SQL para selecionar coleções de objetos, similar ao LINQ da plataforma .NET e o <a href="http://www.trentrichardson.com/jsonsql/">JsonSQL</a> que funciona similar mas para objetos em JavaScript, notação Json. Outros trabalhos interessante são os feitos na livraria <a href="http://vikjavev.no/highslide/">Highslide JS</a> que nos ajuda a simular o efeito do conhecido lightbox nas nossas aplicações, o <a href="http://www.crap4j.org/">Crap4j</a> que se encarrega de qualificar nosso código Java em função a diferentes métricas, o <a href="http://www.creamtec.com/products/ajaxswing/">AjaxSwing</a>, que magicamente converte nossos projetos em Swing para aplicações web Ajax, o <a href="http://code.google.com/p/cajuscript/">CajuScript</a>, uma simples e poderosa implementação de script para usar com Java feito no território nacional, o <a href="http://www.mibbit.com/">Mibbit</a>, um chat que trabalha com o protocolo IRC e desenvolvido com Ajax e finalmente o <a href="http://jiggyapp.com/">Jiggy</a>, que nos permite criar aplicações para o iPhone de maneira muito simples e fácil. </p>
<p>Algumas leituras interessantes sobre Java e Design Patterns foram selecionadas também. Uma de elas é a conversação que se deu no forum GUJ chamada <a href="http://www.guj.com.br/posts/list/13316.java">Então você gostaria de saber sobre AOP?</a> que trata sobre a programação orientada a aspectos ou as que encontramos no site <a href="http://www.corej2eepatterns.com/Patterns2ndEd/index.htm">Core J2EE Patterns</a>, com muita informação sobre os diferentes design patterns da especificação J2EE. Outro site interessante é <a href="http://www.domaindrivendesign.org/">Domain Driven Design</a>, com muita informação sobre o tema que leva o mesmo nome.</p>
<p>Alguns tutoriais e artigos técnicos interessantes que chamaram nossa atenção foram aqueles chamados <a href="http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/">Autotestando JavaScript em Rails</a>, de Dr. Nic, que explica como testar nossos scripts em JavaScript desde um script em Rails, <a href="http://blog.morrisjohns.com/javascript_closures_for_dummies">Clousures do JavaScript para Dummies</a>, de Morris Johns, que ensina de maneira muito clara como funcionam os poderosos clousures em JavaScript, um excelente <a href="http://www.eustaquiorangel.com/downloads/tutorialruby.pdf">tutorial sobre Ruby</a> escrito por Eustaquio Rangel no seu periodo de aprendizagem da linguagem e <a href="http://www.jboss.org/?module=bb&#038;op=viewtopic&#038;t=75697">Ultimo tutorial JAAS para comunicação com a base de dados</a> que partiu de uma duvida no forum do JBoss sobre como implementar a especificação de seguridade e autenticação JAAS utilizando a base de dados num servidor de aplicação JBoss.</p>
<p>Também relacionado com JBoss, seguridade e autenticação são os wiki <a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=SecureJBoss">SecureJBoss</a> que é uma fonte de conhecimento compartilhada sobre como configurar o JBoss para máxima seguridade e a definicação na Wikipedia de <a href="http://en.wikipedia.org/wiki/Single_sign_on">Single sign-on (SSO)</a> que consiste em criar um único sistema de autenticação para diferentes aplicações.</p>
<p>O software livre não ficou atrás e assim chegamos a conhecer o <a href="http://www.winlibre.com/en/">WinLibre</a>, um portal com muito software livre para o sistema operativo Windows. Os que deixaram Windows atrás ficaram contentes ao ver o post chamado <a href="http://www.vagabondodigitale.com/2008/01/10-sites-offering-free-linux-courses-online.html">10 sites oferecendo cursos de Linux online de graça</a>, do blog italiano Vagabondo Digitale, que recompilo alguns sites como o da IBM ou da Novell com excelentes cursos. Para os que gostam de especialmente Ubuntu, foi interessante conhecer a revista <a href="http://fullcirclemagazine.org/">Full Circle Magazine</a> que trata sobre tudo o relacionado com o sistema operativo Ubuntu e também o programa <a href="http://ubuntu-tweak.com/downloads">Ubuntu Tweak</a>, que oferece muitas opções para alterar o mesmo. Muita gente pode estar querendo instalar o Java 6 no Ubuntu para treinar para alguma prova e o processo fica muito fácil depois de ler o artigo do Mundo Hev chamado <a href="http://mundohev.com/2007/12/28/instalando-java-16-no-ubuntu/">Instalando Java 6 (1.6) no Ubuntu</a>. Uma vez o Java corretamente instalado, a <a href="http://www.javaranch.com/roundup.jsp">pagina sobre as certificações Java</a> no portal JavaRanch pode nos ajudar bastante.</p>
<p>Voltando aos browsers, foi muito legal ver a <a href="http://www.amaltas.org/svgapp/">aplicação de demonstração de SVG</a> criada por Amaltas, o <a href="http://docs.jquery.com/Release:jQuery_1.2.2">release 1.2.2 do jQuery</a>, a <a href="http://extjs.com/blog/2007/07/10/css-selectors-speed-myths/">comparação dos diferentes CSS Selectors</a> em torno a velocidade realizada pelo pessoal do Ext JS e também a enorme quantidade (perto de 1000) de exemplos sobre Ajax, JavaScript e Dhtml que encontramos no site <a href="http://www.ajaxrain.com/">AjaxRain</a>.</p>
<p>Finalmente, outros dois links interessantes foram o do <a href="http://www.redmonk.com/cote/2007/12/12/eclipse-rap-overview-and-demo-screencast/">Overview sobre Eclipse RAP e o Screencast de demostração</a> criado por Michael Coté e o artigo escrito por Daniel Tenner chamado <a href="http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/">Como reconhecer um bom programador</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/19/recompilacao-dos-ultimos-links-interessantes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Grupo de estudios GUJ - SCJP</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/04/grupo-de-estudios-guj-scjp/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/04/grupo-de-estudios-guj-scjp/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 19:10:30 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=42</guid>
		<description><![CDATA[Anderson_pqdt esta prestes a tirar a prova de certificação Java SCJP 1.6 . Na sua preparação, ele teve uma excelente idéia e no fórum GUJ ele sugeriu criar um grupo de estudos.  Como muitos membros do fórum se encontram na mesma situação (eu também), a idéia foi bem recebida e rapidamente o grupo foi [...]]]></description>
			<content:encoded><![CDATA[<p>Anderson_pqdt esta prestes a tirar a prova de certificação Java SCJP 1.6 . Na sua preparação, ele teve uma excelente idéia e no <a href="http://www.guj.com.br/forums/list.java">fórum GUJ</a> ele <a href="http://www.guj.com.br/posts/list/78237.java">sugeriu criar um grupo de estudos</a>.  Como muitos membros do fórum se encontram na mesma situação (eu também), a idéia foi bem recebida e rapidamente o grupo foi criado. </p>
<p>O grupo foi criado hoje e ja conta com 12 membros. Foi decidido que ira ser estudado um capitulo do livro Kathy Sierra <a href="http://books.google.com/books?id=pERFblHvR_oC&#038;dq=SCJP+Sun+Certified+Programmer+for+Java+5+Study+Guide&#038;ots=XD_--uoSuI&#038;sig=Nh7fp6eM9I29emihvHx114icP8Q&#038;hl=en&#038;prev=http://www.google.com/search?q=SCJP+Sun+Certified+Programmer+for+Java+5+Study+Guide&#038;ie=utf-8&#038;oe=utf-8&#038;rls=org.mozilla:en-US:official&#038;client=firefox-a&#038;sa=X&#038;oi=print&#038;ct=title&#038;cad=one-book-with-thumbnail">SCJP Sun Certified Programmer for Java 5 Study Guide</a> por semana e a metodologia de estúdios vai ser decidida ate o final da semana.</p>
<p>Para entrar no grupo basta com enviar uma mensagem privada a pardal_nb indicado o seu email e ele respondera com um convite para entrar nele. Para poder enviar a mensagem, a pessoa devera estar registrada no fórum. Se a pessoa não estiver registrada, é uma excelente oportunidade :).</p>
<p>Para terminar, fico com a frase de Anderson_pqdt :</p>
<blockquote><p>&#8220;Nenhum de nós é tão bom quanto todos nós juntos&#8221;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/04/grupo-de-estudios-guj-scjp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Eclipse, JBoss, Struts2, EJB3.0 na mesma máquina: começar assim!</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/02/eclipse-jboss-struts2-ejb30-na-mesma-maquina-comecar-assim/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/02/eclipse-jboss-struts2-ejb30-na-mesma-maquina-comecar-assim/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 11:28:53 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

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

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

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

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

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

		<category><![CDATA[ejb3.0]]></category>

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=39</guid>
		<description><![CDATA[Faz pouco tempo quis começar um projeto que utilizasse o application server e o web server ou web container na mesma máquina, no mesmo domínio. Não passou muito tempo ate descobrir que não ia dar certo do jeito que eu estava fazendo.
O que eu tinha feito foi criar uma Dynamic Web Application no Eclipse e [...]]]></description>
			<content:encoded><![CDATA[<p>Faz pouco tempo quis começar um projeto que utilizasse o application server e o web server ou web container na mesma máquina, no mesmo domínio. Não passou muito tempo ate descobrir que não ia dar certo do jeito que eu estava fazendo.</p>
<p>O que eu tinha feito foi criar uma Dynamic Web Application no Eclipse e seguidamente organizar meus pacotes. O problema era que no processo de deploy da minha aplicação, ela era compactada como um arquivo .war e por tal motivo JBoss não fazia o deploy dos meus EJB’s, esperando que eles estejam num arquivo .jar . Tentei então exportar minhas classes na mão para um arquivo .jar e ver que dava. Efetivamente o JBoss fez o deploy de meus EJB’s, mas aconteceu um problema: as classes ficaram repetidas no classpath, pelo que começaram a aparecer erros de CastException.</p>
<p>Comecei a pesquisar e pesquisar e terminei descobrindo que a solução era muito simples (e eu achando que ia ser complicado). A solução a meu problema consistia em criar dois projetos: um projeto EJB e um segundo projeto Dynamic Web Application, incluindo o primeiro no Class Path.</p>
<p>A continuação segue um possível caminho a seguir para começar a desenvolver uma aplicação com Eclipse, Struts2 e EJB utilizando JBoss desde o zero. No caso que alguma pessoa se encontre perdida num problema similar a o que eu teve, esta guia vai poder ajudar. Qualquer duvida por favor perguntar nos comentários. Estarei utilizando Eclipse Europa, JBoss v4.2, Struts2 e EJB3.0.</p>
<p>Dentro do Eclipse, começamos assim:</p>
<ol>
<li>
		File > New > Other.. . Dentro da pasta Web escolher Dynamic Web Project e fazer click em Next.
	</li>
<li>
		Escolher o nome do nosso projeto web server, o Target Runtime (JBoss v4.2 no meu caso) e fazer click em Finish. No caso de não tiver nenhum runtime configurado, passar para o ponto 2.1. Caso contrario, ir para o ponto 3.
<p />
<ol>
<li>
				Para configurar o runtime fazer click em New e dentro da pasta JBoss escolher JBoss v4.2. Seguidamente, fazer click em Next.<br />
				<center><br />
					<a href="/blog/tutoriales/3/1.jpg" rel="lightbox" class="imagelink"><br />
						<img alt="" src="/blog/tutoriales/3/1_t.jpg"/><br />
					</a><br />
				</center>
			</li>
<li>
				Escolher o JRE a utilizar e o diretório onde foi instalado o servidor. Terminar o processo de configuração do runtime fazendo click em Finish.
			</li>
</ol>
</li>
<li>
		File > New > Other.. . Dentro da pasta EJB escolher EJB Project e fazer click em Next. Escolher o nome do nosso projeto application server, o Target Runtime (o mesmo que no ponto 2) e fazer click em Finish.
	</li>
<p>	<center><br />
		<a href="/blog/tutoriales/3/2.jpg" rel="lightbox" class="imagelink"><br />
			<img alt="" src="/blog/tutoriales/3/2_t.jpg"/><br />
		</a><br />
	</center></p>
<li>
		Dentro do projeto do application server, click direito na pasta ejbModule > New > Interface . Escolher como nome do pacote com.mouseoverstudio.com.ejb e como nome da interface Teste. Fazer click em Finish. Nossa interface ficara da seguinte maneira:</p>
<pre class="prettyprint">
package com.mouseoverstudio.com.ejb;

import javax.ejb.Local;

@Local
public interface Teste {

    public String getMensagem();

}
</pre>
</li>
<li>
		Click direito na pasta ejbModule > New > Class. Escolher novamente como package com.mouseoverstudio.com.ejb e TesteBean como nome da classe. Fazer click em Add e escolher a interface Teste, dentro do pacote atual. Seguidamente fazer click em Ok e logo em Finish. Nossa classe TesteBean ficara assim:</p>
<pre class="prettyprint">
package com.mouseoverstudio.com.ejb;

import javax.ejb.Stateless;

@Stateless
public class TesteBean implements Teste {

    public String getMensagem() {
	return “EJB3.0@MouseOver Studio”;
    }

}
</pre>
</li>
<li>
		Copiar os arquivos .jar localizados na pasta lib dentro do diretório do Struts e colocar eles dentro da pasta /mos-web-server/WebContent/WEB-INF/lib
	</li>
<li>
		No projeto web server, click direito na pasta principal > Build Path > Configure Build Path… . Escolher a aba Projects seguidamente de Add… , escolher o projeto application server, fazer click em Next e terminar o processo de importação fazendo click em Next novamente.
	</li>
<li>
		Abrir para edição o arquivo WebContent/WEB-INF/web.xml dentro do projeto web server e adicionar o seguinte código dentro do nodo web-app. Seguidamente salvar.</p>
<pre>
<code class="prettyprint">
&lt;filter&gt;
        &lt;filter-name&gt;struts2&lt;/filter-name&gt;
        &lt;filter-class&gt;
            org.apache.struts2.dispatcher.FilterDispatcher
        &lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
        &lt;filter-name&gt;struts2&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</code>
</pre>
</li>
<li>
		Dentro da pasta src, criar o arquivo struts.xml:<br />
<code class="prettyprint"><br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE struts PUBLIC &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot; &quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;&gt;<br />
&lt;struts&gt;<br />
        &lt;package name=&quot;main&quot; namespace=&quot;/&quot; extends=&quot;struts-default&quot;&gt;<br />
                &lt;action name=&quot;teste&quot; class=&quot;com.mouseoverstudio.action.TesteAction&quot;&gt;<br />
                        &lt;result name=&quot;input&quot;&gt;/main.jsp&lt;/result&gt;<br />
                &lt;/action&gt;<br />
        &lt;/package&gt;<br />
&lt;/struts&gt;<br />
</code>
	</li>
<li>
		Click direito na pasta src > New > Other… . Dentro da pasta Java escolher Class e fazer click em Next. O nome do package sera com.mouseoverstudio.action e o nome da classe TesteAction. Seguidamente fazer click em Finish. Segue o código da nova classe:</p>
<pre class="prettyprint">
package com.mouseoverstudio.action;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.mouseoverstudio.com.ejb.Teste;
import com.opensymphony.xwork2.ActionSupport;

public class TesteAction extends ActionSupport {

        private String mensagem;

        public String execute() throws NamingException {
                System.out.println("Executando TesteAction.execute");
                InitialContext ctx = new InitialContext();
                Teste t = (Teste) ctx.lookup("TesteBean/local");
                mensagem = t.getMensagem();
                return INPUT;
        }

        public String getMensagem() {
                return mensagem;
        }

}
</pre>
</li>
<li>
		Dentro da pasta WebContent, criar o arquivo main.jsp com o seguinte modelo:<br />
<code class="prettyprint"><br />
&lt;%@ taglib prefix=&quot;s&quot; uri=&quot;/struts-tags&quot; %&gt;<br />
&lt;html&gt;<br />
        &lt;head&gt;MouseOver Studio&lt;/head&gt;<br />
        &lt;body&gt;<br />
                &lt;s:property value=&quot;mensagem&quot;/&gt;<br />
        &lt;/body&gt;<br />
&lt;/html&gt;<br />
</code>
	</li>
<li>
		Acessar File > New > Other… . Dentro da pasta Server escolher Server e fazer click em Next. Dentro da pasta JBoss escolher Boss v4.2 e fazer click em Next duas vezes. Selecionar os projetos criados e fazer click em Add. Terminar o processo fazendo click em Finish.
	</li>
<li>
		Acessar Window > Show View > Other… . Dentro da pasta Server escolher Servers e fazer click em Ok.
	</li>
<li>
		Na aba Servers, fazer click direito no servidor JBoss e despois na opção start.
	</li>
<li>
		Quando o server terminar de iniciar, acessar http://localhost:8080/mos-web-server/teste.action
	</li>
</ol>
<p>Isso foi tudo, não esqueçam de perguntar sobre qualquer dúvida. Ate mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/02/eclipse-jboss-struts2-ejb30-na-mesma-maquina-comecar-assim/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RPC muito muito fácil com dojo.rpc e Struts 2 JSON</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 17:57:36 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

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

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

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

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

		<category><![CDATA[programação]]></category>

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=36</guid>
		<description><![CDATA[De acordo com a definição da Wikipedia, RPC ou Chamada de Procedimento Remoto é
 (&#8230;) o tipo de protocolo para chamada remota de procedimentos em qualquer lugar da rede ou uma chamada de função para o método de transferência de controle de parte de um processo para outra, permite a divisão de um software em [...]]]></description>
			<content:encoded><![CDATA[<p>De acordo com a <a href="http://pt.wikipedia.org/wiki/Chamada_de_procedimento_remoto">definição da Wikipedia</a>, RPC ou Chamada de Procedimento Remoto é</p>
<blockquote><p> (&#8230;) o tipo de protocolo para chamada remota de procedimentos em qualquer lugar da rede ou uma chamada de função para o método de transferência de controle de parte de um processo para outra, permite a divisão de um software em várias partes, (&#8230;)</p></blockquote>
<p>Em outras palavras, com o protocolo RPC podemos ter em distintas maquinas objetos com métodos que ao ser chamados vão ser executados num lugar remoto. </p>
<p>Quando trabalhamos com aplicações web, normalmente temos funções e métodos em JavaScript. Podemos querer executar aqueles métodos e funções no servidor por vários motivos, como por exemplo porque são muito custosos e no browser a execução vai ficar muito lenta, porque precisam de uma lógica de negocio e não queremos expor nossa lógica ao cliente ou porque o método ou função precisa de acesso a recursos que o browser não pode oferecer diretamente.</p>
<p>A solução mais comum seria implementar as funções para que quando sejam chamadas, elas se comuniquem com o servidor mediante Ajax e consigam o resultado. Teríamos algo assim:</p>
<pre class="prettyprint">
function x() {
    /* Ajax para chamar x no servidor */
}

function y() {
    /* Ajax para chamar y no servidor */
}
</pre>
<p>Rapidamente podemos perceber de vários problemas com esta solução. Primeiramente, o código fica muito repetitivo e muito sujeito a erros. Segundamente, precisamos definir uma função local para cada função remota que a gente tiver. Terceiramente, não tem como a gente saber se a função local que a gente esta chamando esta implementada no servidor ou não.</p>
<p>Felizmente com dojo.rpc podemos criar uma solução mais flexível e segura. dojo.rpc.JsonService é uma classe local que representa uma classe remota. O construtor de JsonService recebe uma definição da classe remota e a partir dela ira criar os diferentes métodos.</p>
<p>Struts 2 JSON é um plugin para o Struts que converte o resultado de uma Action em Struts em formato JSON. O resultado de uma Action que devolve um objeto com propriedades chamadas doubleValue do tipo Double, nestedBean do tipo Object, list do tipo List e array do tipo Array ficaria assim:</p>
<pre class="prettyprint">
{
   "doubleValue": 10.10,
   "nestedBean": {
      "name": "Mr Bean"
   },
   "list": ["A", 10, 20.20, {
      "firstName": "El Zorro"
   }],
   "array": [10, 20]
}
</pre>
<p>O mais legal do Struts 2 JSON é que ele foi feito pensando no dojo.rpc e cria uma url com a definição das nossas classes configuradas para trabalhar com ele, de modo que possam ser interpretadas pelo construtor de JsonService.</p>
<p>Vou aproveitar o projeto web criado <a href="http://www.mouseoverstudio.com/blog/?p=39">aqui</a> para implementar uma classe no servidor que possa ser representada no cliente, uma solução RPC.</p>
<p>O primeiro passo é descarregar o plugin e colocar ele na pasta WebContent/WEB-INF/lib . A versão 0.19 do plugin pode ser baixada de <a href="http://jsonplugin.googlecode.com/files/jsonplugin-0.19.jar">aqui</a>.</p>
<p>Seguidamente devemos criar nossa Action. Não sempre todos os métodos da nossa Action precisam estar também no cliente, pelo que colocamos a anotação @SMDMethod nos que efetivamente precisam. SMD é a abreviatura de Simple Method Definition, que seria nossa definição da classe remota. Nossa Action fica assim:</p>
<pre class="prettyprint">
package com.mouseoverstudio.action;

import com.googlecode.jsonplugin.annotations.SMDMethod;
import com.opensymphony.xwork2.Action;

public class TesteStruts2JSON {

	public String execute() {
		return Action.SUCCESS;
	}

	@SMDMethod
	public String getStringResult() {
		String result = new String("MouseOver Studio");
		return result;
	}

	@SMDMethod
	public Integer getIntegerResult(String i) {
		Integer result = new Integer(i);
		return result;
	}
}
</pre>
<p>Vamos mapear agora nossa nova Action. Para isso, adicionamos no arquivo struts.xml o seguinte código:</p>
<p><code class="prettyprint"><br />
&lt;package name=&quot;struts2json&quot; extends=&quot;json-default&quot;&gt;<br />
	&lt;action name=&quot;TesteRPC&quot;<br />
		class=&quot;com.mouseoverstudio.action.TesteStruts2JSON&quot;&gt;<br />
		&lt;interceptor -ref name=&quot;json&quot;&gt;<br />
			&lt;param name=&quot;enableSMD&quot;&gt;true&lt;/param&gt;<br />
		&lt;/interceptor&gt;<br />
		&lt;result type=&quot;json&quot;&gt;<br />
			&lt;param name=&quot;enableSMD&quot;&gt;true&lt;/param&gt;<br />
		&lt;/result&gt;<br />
	&lt;/action&gt;<br />
&lt;/package&gt;<br />
</code></p>
<p>A parte do servidor ja esta feita. Vamo agora trabalhar no cliente. Precisamos da livraria de JavaScript Dojo. Podem baixar ela de <a href="http://dojotoolkit.org/downloads">aqui</a>. Vamos criar uma página que crie uma instância da nossa classe definida no Action e execute os dois métodos dela. Seguidamente vamos utilizar o Firebug para validar a resposta do servidor.</p>
<p><code class="prettyprint"><br />
&lt;%@ taglib prefix=&quot;s&quot; uri=&quot;/struts-tags&quot; %&gt;<br />
&lt;html&gt;<br />
	&lt;head&gt;<br />
		&lt;script type=&quot;text/javascript&quot; src=&quot;./dojo-1.x/dojo/dojo.js&quot;<br />
				djConfig=&quot;isDebug:true&quot;&gt;&lt;/script&gt;<br />
		&lt;s :url id=&quot;url&quot; action=&quot;TesteRPC&quot; /&gt;<br />
		&lt;script type=&quot;text/javascript&quot;&gt;<br />
    		dojo.require(&quot;dojo.rpc.JsonService&quot;);<br />
    		var service = new dojo.rpc.JsonService(&quot;${url}&quot;);<br />
    		service.getStringResult().addCallback(console.log);<br />
    		service.getIntegerResult(&quot;1337&quot;).addCallback(console.log);<br />
		&lt;/script&gt;<br />
	&lt;/head&gt;<br />
	&lt;body&gt;&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code></p>
<p>No resultado podemos apreciar como o Struts 2 JSON cria uma definição da nossa Action e também como o resultado de nossos métodos e convertido para formato JSON.</p>
<p><center><br />
<a class="imagelink" rel="lightbox" href="/blog/tutoriales/4/result.jpg"><br />
<img src="/blog/tutoriales/4/result_tn.jpg" alt="" /><br />
</a><br />
</center></p>
<p>Trabalhar com RPC utilizando dojo.rpc e Struts 2 JSON e um processo muito simples que facilita muito o desenvolvimento de aplicações web. Para mas informação, podem como sempre perguntar ou se desejar, se referir ao seguintes links:</p>
<p>http://cwiki.apache.org/S2PLUGINS/json-plugin.html</p>
<li>http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/ajax-transports/remote-procedure-call-rpc</li>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
