<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Desabafo binário</title>
	<atom:link href="http://rodrigoramalho.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://rodrigoramalho.org</link>
	<description>Rodrigo Ramalho em</description>
	<lastBuildDate>Thu, 03 May 2012 10:39:35 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='rodrigoramalho.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/41955b3c68466d1f55cbe2371bae9769?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Desabafo binário</title>
		<link>http://rodrigoramalho.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://rodrigoramalho.org/osd.xml" title="Desabafo binário" />
	<atom:link rel='hub' href='http://rodrigoramalho.org/?pushpress=hub'/>
		<item>
		<title>Git como boa prática de consultoria</title>
		<link>http://rodrigoramalho.org/2012/04/01/git-como-boa-pratica-de-consultoria/</link>
		<comments>http://rodrigoramalho.org/2012/04/01/git-como-boa-pratica-de-consultoria/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 02:56:02 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[boas práticas consultoria]]></category>
		<category><![CDATA[consultoria]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=199</guid>
		<description><![CDATA[Últimamente tenho utilizado bastante o git, mas não usando convencionalmente versionando apenas projetos, mas sim diretórios que julgo que contenham arquivos que se modificados podem me render um bom trabalho, como o /etc por exemplo. Gostei tanto dessa utilização que resolvi adotar como uma boa prática de consultoria. É muito comum clientes se queixando que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=199&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Últimamente tenho utilizado bastante o git, mas não usando convencionalmente versionando apenas projetos, mas sim diretórios que julgo que contenham arquivos que se modificados podem me render um bom trabalho, como o <em>/etc</em> por exemplo.</p>
<p>Gostei tanto dessa utilização que resolvi adotar como uma boa prática de consultoria. É muito comum clientes se queixando que o que você deixou funcionando a algum tempo parou de funcionar e quando você começa a analisar o problema ,as vezes com bastante custo, descobre que alguém resolveu por algum motivo alterar um arquivo ou adicionar uma biblioteca que não deveria. Com o uso do git conseguimos contornar isso.</p>
<p>O git trabalha de maneira que os commits são feitos apenas localmente e só quando feito um <em>git push</em> que os arquivos versionados serão enviados ao servidor. Logo como não adicionamos nenhum servidor para fazer push e nem iremos tentar fazer push não corremos o risco desses arquivos serem publicados. Segue um exemplo básico:</p>
<p><pre class="brush: bash;">
cd /opt/jboss7

git init
Initialized empty Git repository in /opt/jboss7/.git/

git add *

git status

# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use &quot;git rm --cached &lt;file&gt;...&quot; to unstage)
#
# new file: LICENSE.txt
# new file: README.txt

.....

# new file: welcome-content/noconsole.html
# new file: welcome-content/noredirect.html

git commit -am 'Servidor de Aplicação Jboss AS 7.'

-a = all files
-m = commit message

</pre></p>
<p>Quando rodamos o <em>git init </em>o diretório oculto .git é criado de onde o comando foi invocado, é nesse diretório que ficam os metadados do git, logo vale a pena se atentar o tamanho que esse diretório pode ficar dependendo do tamanho do diretório é versionado, veja o tamanho que ficou para o versionamento do jboss7 completo.</p>
<p><pre class="brush: bash;">
[rodrigoramalho]  /opt/jboss7
du -sh .git/
75M .git/
</pre></p>
<p>Com o projeto versionado, se rodarmos um <em>git status</em> veremos que não há nada a ser comitado (se nada tiver sido alterado claro). Então é isso, a medida que alterações forem sendo feitas basta ir fazendo novos commits e quando acontecer a situação que mencionei no começo do post um simples <em>git status</em> já acusaria se algum arquivo foi adicionado/alterado/removido e ainda nos permitiria visualizar as alterações a até mesmo fazer um rollback.</p>
<p>Com os commits devidamente comentados caso outra pessoa assuma a consultoria, apenas pelos logs do git já consegue ter um bom resumo do que já foi feito.</p>
<p>Cola dos principais comandos:</p>
<pre># Exibe o log de uma forma melhor pra visualizar
<em>git log --oneline</em>

# Exibe o status de uma forma melhor pra visualizar
git status -s

<em>git diff &lt;commit hash&gt; &lt;filename&gt;</em>
# o commit hash é exibido no git log.

# Faz rollback no arquivo para a versão informada
<em>git reset &lt;commit hash&gt; &lt;filename&gt;</em></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/199/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=199&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/04/01/git-como-boa-pratica-de-consultoria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>
	</item>
		<item>
		<title>Remover Protetor de Link</title>
		<link>http://rodrigoramalho.org/2012/03/20/remover-protetor-de-link-8/</link>
		<comments>http://rodrigoramalho.org/2012/03/20/remover-protetor-de-link-8/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 23:57:09 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[desprotetor]]></category>
		<category><![CDATA[desprotetor de links]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[remover protetor de link]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/2012/03/20/remover-protetor-de-link-8/</guid>
		<description><![CDATA[Vira e mexe a gente se depara com uns problemas no dia dia bem irritantes, como por exemplo quando você vai baixar um episódio do seu seriado preferido abre uma página pedindo pra você cadastrar seu celular ou baixar um programa tipo &#8220;pcmegarápido&#8221; e só após disso o link para o download é disponibilizado: Então [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=193&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vira e mexe a gente se depara com uns problemas no dia dia bem irritantes, como por exemplo quando você vai baixar um episódio do seu seriado preferido abre uma página pedindo pra você cadastrar seu celular ou baixar um programa tipo &#8220;pcmegarápido&#8221; e só após disso o link para o download é disponibilizado:</p>
<p><a href="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-17-54-52.png"><img class="size-full wp-image" src="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-17-54-52.png?w=487" alt="Imagem" /></a></p>
<p><a href="http://desprotetorlink.com.br">Então fiz uma aplicação que descriptografa o link</a>, devolvendo um novo contendo o caminho direto para o download, ou seja, sem precisar cadastrar o bendito celular ou baixar o &#8220;pcmegarapido.exe&#8221;.</p>
<p><em><strong><a href="http://desprotetorlink.com.br">http://desprotetorlink.com.br</a></strong></em></p>
<p>Basta copiar a url &#8220;bloqueada&#8221; e colar no único campo que a aplicação apresenta.</p>
<p><a href="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-18-01-00.png"><img class="size-full wp-image" src="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-18-01-00.png?w=487" alt="Imagem" /></a></p>
<p>Enfim, quem tiver interesse em saber como funciona sugiro dar uma olhada no README e no <a href="http://github.com/hodrigohamalho/remove-link-guard">código no github</a>, sintam-se a vontade pra colaborar d;-)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/193/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=193&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/03/20/remover-protetor-de-link-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-17-54-52.png?w=487" medium="image">
			<media:title type="html">Imagem</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-20-c3a0s-18-01-00.png?w=487" medium="image">
			<media:title type="html">Imagem</media:title>
		</media:content>
	</item>
		<item>
		<title>Configurando proxy no Git</title>
		<link>http://rodrigoramalho.org/2012/03/14/configurando-proxy-no-git/</link>
		<comments>http://rodrigoramalho.org/2012/03/14/configurando-proxy-no-git/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 19:41:28 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=165</guid>
		<description><![CDATA[Quando estamos em ambientes corporativos é muito comum o uso de proxy e consequentemente acabamos tendo algum problema com o git. Aqui estão alguns passos para configurar proxy no git. git config &#8211;global http.proxy meu.servidor:8080 As vezes o github não consegue validar o certificado digital, para desabilitar: git config &#8211;global http.sslverify false Geralmente adicionamos a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=165&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quando estamos em ambientes corporativos é muito comum o uso de proxy e consequentemente acabamos tendo algum problema com o git. Aqui estão alguns passos para configurar proxy no git.</p>
<p><em><strong>git config &#8211;global http.proxy meu.servidor:8080</strong></em></p>
<p>As vezes o github não consegue validar o certificado digital, para desabilitar:</p>
<p><em><strong>git config &#8211;global http.sslverify false</strong></em></p>
<p>Geralmente adicionamos a url do repositório para usar o protocolo git (<em><strong>git remote add origin git@github.com:hodrigohamalho/blablabla.git</strong></em>), como setamos proxy apenas para http e https, se a url estiver para utilizar git devemos alterar.</p>
<p>Para visualizar a url atual:<br />
<em><strong>git remote show origin</strong></em></p>
<p>Para alterar:<br />
<em><strong>git remote set-url origin https://github.com:hodrigohamalho/blablabla.git</strong></em></p>
<p>Com essa alteração tudo já deveria estar funcionando.</p>
<p>Como as configurações são globais, todos os projetos irão utilizar o proxy setado, para remover utilize:<br />
<strong><em>git config &#8211;unset &#8211;global http.proxy</em></strong></p>
<p><em><strong><strong><em>git config &#8211;unset &#8211;global</em></strong> http.sslverify</strong></em></p>
<p>That&#8217;s all folks ;P</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=165&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/03/14/configurando-proxy-no-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>
	</item>
		<item>
		<title>Teste em aplicações Java com Rspec</title>
		<link>http://rodrigoramalho.org/2012/03/13/teste-em-aplicacoes-java-com-rspec/</link>
		<comments>http://rodrigoramalho.org/2012/03/13/teste-em-aplicacoes-java-com-rspec/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 17:57:35 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[teste unitário]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=153</guid>
		<description><![CDATA[Durante o período que trabalhei na SEA Tecnologia, fui apresentado ao desenvolvimento Ágil e o desenvolvimento de aplicações usando TDD. No início participei de alguns projetos em Java, posteriormente conheci o Ruby on Rails e comecei a fazer testes com o RSpec, confesso que fiquei fascinado com a integração, facilidade e clareza que essa ferramenta [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=153&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://haxorslab.files.wordpress.com/2012/03/jruby-rspec.png"><img class="size-thumbnail wp-image-160 alignright" title="jruby-rspec" src="http://haxorslab.files.wordpress.com/2012/03/jruby-rspec.png?w=150&h=85" alt="" width="150" height="85" /></a>Durante o período que trabalhei na <a href="http://seatecnologia.com.br/">SEA Tecnologia</a>, fui apresentado ao <a href="http://manifestoagil.com.br/" target="_blank">desenvolvimento Ágil</a> e o desenvolvimento de aplicações usando <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>. No início participei de alguns projetos em Java, posteriormente conheci o Ruby on Rails e comecei a fazer testes com o <a href="http://rspec.info/">RSpec</a>, confesso que fiquei fascinado com a integração, facilidade e clareza que essa ferramenta de testes apresenta. Com o JRuby, projeto que compila código Ruby pra bytecode Java, podemos não só executar Ruby através da JVM, como fazer a integração com código Java. Existe <a href="http://mojo.codehaus.org/rspec-maven-plugin/">um projeto</a> que permite essa integração (Java x Ruby) utilizando maven. Então meu objetivo com esse post é mostrar como fazer essa integração, e escrever alguns testes em Ruby testando classes Java.</p>
<p><strong>Pré requisito:</strong><br />
<a href="http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz">Maven</a></p>
<p><strong>Instalação </strong><a href="http://jruby.org/"><strong>Jruby</strong><br />
</a>Adicionar a variável de ambiente JRUBY_HOME<br />
Edite o arquivo <em><strong>~/.bash_profile</strong></em>, adicionando as seguintes linhas:</p>
<p><pre class="brush: plain;">
export JRUBY_HOME=/opt/jruby-1.3.1
</pre></p>
<p>Hands on, vamos começar a criação de um game, snake game o famoso jogo da cobrinha nos celulares mais antigos =P</p>
<p>Criando o projeto maven:</p>
<p><pre class="brush: plain;">
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.rodrigoramalho.snake-game -DartifactId=snake-game
# Quando aparecer essa linha, apenas aperte enter.
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 16:
# Nessa também
Define value for property 'version':  1.0-SNAPSHOT: :
</pre></p>
<p>Depois basta confirmar (Y) e pronto o projeto estará criado.<br />
Entre no diretório e execute a task do maven para gerar os arquivos necessários para importamos o projeto no eclipse.</p>
<p><pre class="brush: plain;">
cd snake-game/
mvn eclipse:eclipse
</pre></p>
<p>Já com o projeto importado no eclipse, ediciona o plugin do RSpec no pom.xml</p>
<p><pre class="brush: plain;">
&lt;build&gt;
&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
&lt;artifactId&gt;rspec-maven-plugin&lt;/artifactId&gt;
&lt;configuration&gt;
&lt;jrubyHome&gt;${env.JRUBY_HOME}&lt;/jrubyHome&gt;
&lt;sourceDirectory&gt;${basedir}/src/test/specs&lt;/sourceDirectory&gt;
&lt;outputDirectory&gt;${basedir}/target&lt;/outputDirectory&gt;
&lt;systemProperties&gt;
&lt;property&gt;
&lt;name&gt;testProp&lt;/name&gt;
&lt;value&gt;testValue&lt;/value&gt;
&lt;/property&gt;
&lt;/systemProperties&gt;
&lt;/configuration&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;id&gt;test&lt;/id&gt;
&lt;phase&gt;test&lt;/phase&gt;
&lt;goals&gt;
&lt;goal&gt;spec&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;
</pre></p>
<p>Crie o diretório <em><strong>&#8220;specs&#8221;</strong></em> dentro da pasta test.<br />
<em><strong>snake-game/src/test/specs</strong></em>  Pronto, chegando aqui seu ambiente já está (ou deveria estar, rs) configurado para começar o desenvolvimento. Então, go go go!</p>
<p>Criando a classe de testes em Ruby: (Como o eclipse não tem syntax highlight nativo pro Ruby, eu prefiro usar um editor de texto comum: vim, gedit, textmate)</p>
<p>snake-game/src/test/specs/snake_spec.rb</p>
<p><pre class="brush: ruby;">
import org.rodrigoramalho.snakegame.model.Snake;

describe Snake do

end
</pre></p>
<p>Para executar o teste, rode:</p>
<p><pre class="brush: bash;">
mvn test
</pre></p>
<p>O seguinte erro vai ocorrer:</p>
<p><strong><em>[INFO] Running RSpec tests from /Users/rodrigoramalho/Documents/workspace/snake-game/src/test/specs</em></strong><br />
<strong><em> /opt/jruby-1.3.1/lib/ruby/1.8/optparse.rb:605:in `get_proxy_or_package_under_package&#8217;: cannot load Java class org.rodrigoramalho.snakegame.model.Snake (NameError)</em></strong><br />
<strong><em> &#8230;.</em></strong></p>
<p>Então vamos criar a classe Snake.</p>
<p><pre class="brush: java;">

package org.rodrigoramalho.snakegame.model;

public class Snake {

}

</pre></p>
<p>Rodamos os testes novamente, com<strong><em> mvn test</em></strong>.</p>
<p><em><strong>[INFO]</strong></em><br />
<em><strong> [INFO] &#8212; rspec-maven-plugin:1.0-beta-6:spec (test) @ snake-game &#8212;</strong></em><br />
<em><strong> [INFO] Running RSpec tests from /Users/rodrigoramalho/Documents/workspace/snake-game/src/test/specs</strong></em><br />
<em><strong> =========================================</strong></em><br />
<em><strong> TOTAL: 0 passing; 0 failing; 0 pending</strong></em></p>
<p>Qualquer alteração feita nessa classe, não é necessário rodar a task &#8220;mvn test&#8221; novamente, dentro do diretório <em><strong>snake-game/target/</strong> </em>contém um arquivo com o nome de <em><strong>run-specs.sh</strong></em> que recompila as classes e executa os testes. Utilizando esse script é economizado um bom tempo, pois roda bem mais rápido que o &#8220;mvn test&#8221;.</p>
<p>Os relatórios dos testes são gerados no arquivo <strong>snake-game/target/rspec_report.html</strong><em><a href="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-12-c3a0s-11-17-39.png"><img class="aligncenter size-full wp-image-158" title="Captura de tela 2012-03-12 às 11.17.39" src="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-12-c3a0s-11-17-39.png?w=620&h=583" alt="" width="620" height="583" /></a></em>Depois de fazer alguns testes segue o código da classe ruby. (A identação desse plugin ta zuada :/)</p>
<p><pre class="brush: ruby;">

import org.rodrigoramalho.snakegame.model.Snake;
import org.rodrigoramalho.snakegame.model.Direcao;

describe Snake do

 before(:each) do
 @snake = Snake.new &quot;3 5 5 NORTE&quot;
 end

context &quot;com parametros válidos&quot; do

 it &quot;deveria receber o comprimento e as coordenadas iniciais&quot; do
 @snake.comprimento.should == 3
 @snake.posicao.x.should == 5
 @snake.posicao.y.should == 5
 @snake.posicao.direcao.should == Direcao::NORTE
 end

end

context &quot;com parametros invalidos&quot; do
 it &quot;direção inválida&quot; do
 expect{ Snake.new &quot;5 5 5 Rodrigo&quot; }.should raise_error(java.lang.IllegalArgumentException)
 end

 it &quot;comprimento negativo&quot; do
 expect{ Snake.new &quot;-5 5 5 NORTE&quot; }.should raise_error(java.lang.IllegalArgumentException)
 end

 it &quot;posicao x negativa&quot; do
 expect{ Snake.new &quot;5 -5 5 NORTE&quot; }.should raise_error(java.lang.IllegalArgumentException)
 end

 it &quot;posicao y negativa&quot; do
 expect{ Snake.new &quot;5 5 -5 NORTE&quot; }.should raise_error(java.lang.IllegalArgumentException)
 end
 end

 context &quot;movimentação&quot; do
 context &quot;com movimentos possiveis&quot; do
 it &quot;deveria virar para esquerda quando estiver na direcao norte&quot; do
 @snake.virarEsquerda();
 @snake.posicao.direcao.should == Direcao::OESTE
 end

 it &quot;deveria virar para esquerda quando estiver na direcao sul&quot; do
 @snake.posicao.direcao = Direcao::SUL
 @snake.virarEsquerda();
 @snake.posicao.direcao.should == Direcao::OESTE
 end

 it &quot;deveria continuar apontando para esquerda ao tentar virar para esquerda&quot; do
 @snake.posicao.direcao = Direcao::OESTE
 @snake.virarEsquerda();
 @snake.posicao.direcao.should == Direcao::OESTE
 end

 it &quot;deveria virar para direita quando estiver na direcao norte&quot; do
 @snake.virarDireita();
 @snake.posicao.direcao.should == Direcao::LESTE
 end
 end

 context &quot;com movimentos impossíveis&quot; do

 it 'quando apontando para o LESTE não deveria virar para a ESQUERDA' do
 @snake.posicao.direcao = Direcao::LESTE
 @snake.virarEsquerda();
 @snake.posicao.direcao.should == Direcao::LESTE
 end

 end
 end

end

</pre></p>
<p>Classe Java (Se quiser visualizar com detalhes, <a href="https://github.com/hodrigohamalho/snake-game">veja o fonte do código no github</a>)</p>
<p><pre class="brush: java;">

package org.rodrigoramalho.snakegame.model;

import org.rodrigoramalho.util.ValidacaoUtil;

public class Snake {

private Integer comprimento;

private Posicao posicao;

public Snake(){}

public Snake(String coordenadas){

String[] args = coordenadas.split(&quot; &quot;);

this.comprimento  = new Integer(args[0]);

getPosicao().setX(new Integer(args[1]));

getPosicao().setY(new Integer(args[2]));

getPosicao().setDirecao(Direcao.valueOf(args[3]));

if (ValidacaoUtil.isMenorQueZero(getComprimento(), getPosicao().getX(), getPosicao().getY()))

throw new IllegalArgumentException(&quot;Use apenas valores &gt; 0&quot;);

}

public void virarEsquerda(){

if (getPosicao().getDirecao() != Direcao.LESTE){

getPosicao().setDirecao(Direcao.OESTE);

}

}

public Integer getComprimento() { return comprimento; }

public void setComprimento(Integer comprimento) { this.comprimento = comprimento; }

public Posicao getPosicao() {

if (posicao == null)

posicao = new Posicao();

return posicao;

}
public void setPosicao(Posicao posicao) { this.posicao = posicao; }

}

</pre></p>
<p>É isso ai! Depois aconselho a explorarem mais os testes com RSpec porque tem bastante coisa legal, e ainda tem o poder de fazer os testes usando 100% código Ruby, desfrutando de vários benefícios como Closures por exemplo <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="https://github.com/hodrigohamalho/snake-game">Fonte do projeto de exemplo.</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/153/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=153&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/03/13/teste-em-aplicacoes-java-com-rspec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2012/03/jruby-rspec.png?w=150" medium="image">
			<media:title type="html">jruby-rspec</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2012/03/captura-de-tela-2012-03-12-c3a0s-11-17-39.png" medium="image">
			<media:title type="html">Captura de tela 2012-03-12 às 11.17.39</media:title>
		</media:content>
	</item>
		<item>
		<title>Inserir tag no cabeçalho html do Portal Gatein</title>
		<link>http://rodrigoramalho.org/2012/01/17/inserir-tag-no-cabecalho-html-do-portal-gatein/</link>
		<comments>http://rodrigoramalho.org/2012/01/17/inserir-tag-no-cabecalho-html-do-portal-gatein/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 19:45:25 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[exo]]></category>
		<category><![CDATA[gatein]]></category>
		<category><![CDATA[head element]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tag cabecalho]]></category>
		<category><![CDATA[tag head]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=131</guid>
		<description><![CDATA[Esses dias precisei inserir uma tag no cabeçalho de todas as páginas que estivessem no portal gatein. Existem duas maneiras de fazer isso: 1. Criando um portlet que insere essa tag no &#60;head&#62; da página, carregando pelo método doHeader. o código do portlet deverá ser semelhante a esse: Com isso basta colocar este portlet no [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=131&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Esses dias precisei inserir uma tag no cabeçalho de todas as páginas que estivessem no portal gatein.</p>
<p>Existem duas maneiras de fazer isso:</p>
<p>1. Criando um portlet que insere essa tag no &lt;head&gt; da página, carregando pelo método doHeader.</p>
<p>o código do portlet deverá ser semelhante a esse:</p>
<p><pre class="brush: java;">
public class HeaderExtension extends GenericPortlet {

@Override
protected void doHeaders(RenderRequest request, RenderResponse response) {
Element meta = response.createElement(&quot;meta&quot;);
meta.setAttribute(&quot;http-equiv&quot;, &quot;X-UA-Compatible&quot;);
meta.setAttribute(&quot;content&quot;, &quot;IE=edge&quot;);
response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, meta);
}

@Override
public void doView(RenderRequest request, RenderResponse response) {
PortletRequestDispatcher prd = getPortletContext().getRequestDispatcher(&quot;/jsp/index.jsp&quot;);
try {
prd.include(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
</pre></p>
<p>Com isso basta colocar este portlet no layout do site e ele irá colocar toda vez essa tag no cabeçalho da página. Pode ser usado também pra carregar css, javascript, etc.. (<a href="https://community.jboss.org/wiki/JQueryPortlet">Veja mais</a>)<br />
Porém com essa abordagem tudo que for inserido aparece no final da tag head, ou seja, próximo ao /head. As vezes é necessário que a tag esteja no começo do head, como no caso da tag:</p>
<p><pre class="brush: xml;">
 &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;/&gt;
</pre></p>
<p>Que é utilizada para compatibilidade com o Internet Explorer.<br />
Com este cenário temos que alterar o fonte do template groovy que o portal utiliza. O arquivo pode ser encontrado em:</p>
<p><pre class="brush: java;">
$JBOSS_EPP_HOME/server/$SERVER_NAME/deploy/gatein-wcm-extension-2.1.5-CP02.ear/ecm-wcm-extension.war/groovy/portal/webui/workspace/UIPortalApplication.gtmpl
</pre></p>
<p>Ps: É necessário explodir o arquivo gatein-wcm-extension-2.1.5-CP02.ear e o ecm-wcm-extension.war</p>
<p>Feita a alteração neste template groovy basta reiniciar o portal.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/131/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=131&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/01/17/inserir-tag-no-cabecalho-html-do-portal-gatein/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>
	</item>
		<item>
		<title>Autenticação pelo Google utilizando OpenID</title>
		<link>http://rodrigoramalho.org/2012/01/12/autenticacao-pelo-google-utilizando-openid/</link>
		<comments>http://rodrigoramalho.org/2012/01/12/autenticacao-pelo-google-utilizando-openid/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 04:00:36 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[login federado]]></category>
		<category><![CDATA[openid]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=121</guid>
		<description><![CDATA[&#8220;A API de login federado do Google, com base no protocolo OpenID 2.0, permite que os usuários façam login no seu site ou aplicativo da web com suas Contas do Google. Quando o Google autentica uma conta de usuário, ele retorna um ID de usuário para o seu aplicativo, o que permite que você colete [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=121&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8220;A API de login federado do Google, com base no protocolo OpenID 2.0, permite que os usuários façam login no seu site ou aplicativo da web com suas Contas do Google. Quando o Google autentica uma conta de usuário, ele retorna um ID de usuário para o seu aplicativo, o que permite que você colete e armazene informações do usuário. O Login federado também permite que você obtenha acesso a determinadas informações sobre a conta do usuário, com a aprovação dele.&#8221; <a href="http://code.google.com/intl/pt-BR/apis/accounts/" target="_blank">http://code.google.com/intl/pt-BR/apis/accounts/</a></p>
<p>Então&#8230; Hands ON! Cabe lembrar que da mesma maneira que faremos para o google podemos fazer para qualquer site que seja um provedor OpenID, como Yahoo, Flickr dentre outros.</p>
<p>Segue uma imagem que tenta representar como ficará o fluxo dessa autenticação.</p>
<p><a href="http://haxorslab.files.wordpress.com/2012/01/fluxo1.jpg"><img class="aligncenter size-full wp-image-125" title="fluxo" src="http://haxorslab.files.wordpress.com/2012/01/fluxo1.jpg?w=620&h=115" alt="" width="620" height="115" /></a></p>
<ol>
<li>O usuário entra na tela de login, seleciona o botão para fazer autenticação pelo google.</li>
<li>É feito um direcionamento para autenticação pela página do google.</li>
<li>Ao efetuar a autenticação ocorre o redirecionamento de volta para a página da aplicação.</li>
</ol>
<h3>1. SETUP</h3>
<p><a href="http://code.google.com/p/openid4java/downloads/list" target="_blank">Baixe a biblioteca openid4java</a>.</p>
<p><a href="http://blog.camilolopes.com.br/criando-dynamic-webproject-jee-%E2%80%93-eclipse/" target="_blank">No eclipse crie um projeto Dynamic Web Project.</a></p>
<p>Fiz comentários quase que linha a linha em todo o código para facilitar o entendimento.</p>
<h3>2. ResultType.java</h3>
<p>Criei um Enum pra indicar se a autenticação teve <strong>sucesso</strong>, <strong>não sucesso</strong> ou se foi <strong>redirecionada</strong>.</p>
<p><pre class="brush: java;">

package org.rodrigoramalho.openid.autenticacao;

public enum ResultType {

AUTH_SUCCESS, AUTH_FAILURE, REDIRECT_TO_OPENID_PROVIDER_FAILURE

}
</pre></p>
<h3>2. Consumer.java</h3>
<p>Éssa classe que será responsável pela autenticação utilizando o openid.</p>
<p>O método a seguir <strong>authRequest</strong> é o método responsável pela ação de quando o usuário clicar no botão de autenticação com o google, fazer o request OpenID e direcionar para a página de autenticação do google.</p>
<p><pre class="brush: java;">

public ResultType authRequest(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) throws IOException{

try{

// realm é a url da aplicação + porta ex: http://localhost:8080

String realm = getRealm(request);

// Definimos a url a qual o google deverá retornar após autenticar o usuário

String returnToUrl = new StringBuffer(realm).append(request.getContextPath()) + &quot;/Auth&quot;;

// &quot;descobre&quot; o OpenID do fornecedor

List discoveries = manager.discover(&quot;https://www.google.com/accounts/o8/id&quot;);
// Tentativa de se conectar com o provedor OpenID

// e acessar um endpoint service pra se autenticar

DiscoveryInformation discovered = manager.associate(discoveries);

// Obtém a requisição de autorização que será mandada para o provedor OpenID

AuthRequest authReq = manager.authenticate(discovered, returnToUrl);

// Informa quais atributos deverão ser 'requeridos'

FetchRequest fetch = FetchRequest.createFetchRequest();

fetch.addAttribute(&quot;email&quot;, &quot;http://axschema.org/contact/email&quot;, true);

fetch.addAttribute(&quot;firstName&quot;, &quot;http://axschema.org/namePerson/first&quot;, true);

fetch.addAttribute(&quot;lastName&quot;, &quot;http://axschema.org/namePerson/last&quot;, true);

authReq.addExtension(fetch);

authReq.setRealm(realm);

// coloca o objeto discovered na sessão do usuário

request.getSession().setAttribute(&quot;discovered&quot;, discovered);

request.getSession().setAttribute(&quot;checkResponse&quot;, true);

// Encaminha para a página de autenticação do google

response.sendRedirect(authReq.getDestinationUrl(true));

}

catch (OpenIDException e){

e.printStackTrace();

}

return ResultType.REDIRECT_TO_OPENID_PROVIDER_FAILURE;

}

</pre></p>
<p>Após fazer a autenticação pelo google, deve-se verificar se essa autenticação foi válida, para isso deve-se chamar o método <strong>verifyResponse </strong></p>
<p><pre class="brush: java;">

public ResultType verifyResponse(HttpServletRequest httpReq){

try{

// extrai os parametros que vem do HTTP request do OpenID provider.

ParameterList response = new ParameterList(httpReq.getParameterMap());

// Lembra que a gente colocou esse objeto na sessão?

DiscoveryInformation discovered = (DiscoveryInformation) httpReq.getSession().getAttribute(&quot;discovered&quot;);

// Extrai os parametros da url

StringBuffer receivingURL = httpReq.getRequestURL();

String queryString = httpReq.getQueryString();

if (queryString != null &amp;&amp; queryString.length() &gt; 0){

receivingURL.append(&quot;?&quot;).append(httpReq.getQueryString());

}

// Valida o response, verificar se o ConsumerManager é o mesmo que efetuou o request

VerificationResult verification = manager.verify(receivingURL.toString(), response, discovered);

// Analisa o resultado da verificação e extrai o identificador de verificação

Identifier verified = verification.getVerifiedId();

if (verified != null){

AuthSuccess authSuccess = (AuthSuccess) verification.getAuthResponse();

if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)){

// Extrai os atributos que fizemos a requisição (no fetchRequest)

FetchResponse fetchResp = (FetchResponse) authSuccess.getExtension(AxMessage.OPENID_NS_AX);

Map userAttributes = fetchResp.getAttributes();

User user = new User();

user.setEmail(userAttributes.get(&quot;email&quot;).toString());

String nome = userAttributes.get(&quot;firstName&quot;) + &quot; &quot;+ userAttributes.get(&quot;lastName&quot;);

user.setName(removeBrackets(nome));

// Coloca o usuário na sessão

httpReq.getSession().setAttribute(&quot;user&quot;, user);

}

return ResultType.AUTH_SUCCESS;  // success

}

}catch (OpenIDException e){

e.printStackTrace();

}

httpReq.getSession().removeAttribute(&quot;checkResponse&quot;);

return ResultType.AUTH_FAILURE;

}

</pre></p>
<h3>3. AuthServlet.java</h3>
<p><pre class="brush: java;">

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {

if (request.getParameter(&quot;logout&quot;) != null) {

logoutUser(request, response);

}else{

Consumer consumer = new Consumer();

HttpSession session = request.getSession();

boolean checkResponse = session.getAttribute(&quot;checkResponse&quot;) != null ? true : false;

if (!checkResponse){

consumer.authRequest(request, response, getServletContext());

}else{

consumer.verifyResponse(request);

RequestDispatcher dispatcher = request.getRequestDispatcher(&quot;login.jsp&quot;);

dispatcher.forward(request, response);

}

}

} catch (ConsumerException e) {

e.printStackTrace();

}

}

</pre></p>
<h3>4. login.jsp</h3>
<p><pre class="brush: java;">

&lt;body&gt;

&lt;%@page import=&quot;org.rodrigoramalho.openid.beans.User&quot;%&gt;

&lt;% User user = (User) request.getSession().getAttribute(&quot;user&quot;); %&gt;

&lt;% if ( user == null){ %&gt;

Sign in

&lt;hr/&gt;

&lt;div&gt;&lt;div id=&quot;login_por_terceiros&quot;&gt;

&lt;a href=&quot;Auth&quot;&gt;

&lt;div id=&quot;login_google&quot;&gt;&lt;/div&gt;

&lt;/a&gt;

&lt;/div&gt;&lt;/div&gt;

&lt;% } else {%&gt;

&lt;p&gt; Bem vindo &lt;%= user.getName() %&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;Auth?logout&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;

&lt;%} %&gt;

&lt;/body&gt;

</pre></p>
<p><a href="https://github.com/hodrigohamalho/openid-example" target="_blank">O código fonte do projeto.</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/121/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=121&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/01/12/autenticacao-pelo-google-utilizando-openid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2012/01/fluxo1.jpg" medium="image">
			<media:title type="html">fluxo</media:title>
		</media:content>
	</item>
		<item>
		<title>Bash Script find and replace</title>
		<link>http://rodrigoramalho.org/2012/01/03/bash-script-find-and-replace/</link>
		<comments>http://rodrigoramalho.org/2012/01/03/bash-script-find-and-replace/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 14:35:38 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Bash Script]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash script]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[renomear arquivos]]></category>
		<category><![CDATA[renomear diretórios]]></category>
		<category><![CDATA[replace]]></category>
		<category><![CDATA[substituir textos]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=110</guid>
		<description><![CDATA[Faz substituição no texto de arquivos. A linha de comando abaixo faz uma procura e substitui todas as ocorrências em arquivos textos da palavra &#8220;procure_por_isso&#8221; nos diretórios abaixo de &#8220;/home/meu_diretorio&#8221; e substitui por &#8221;substitua_por_isso&#8221;. . find "/home/meu_diretorio" -type f -exec sed -i "" -e s/procure_por_isso/"substitua_por_isso"/g {} \; . . Faz substituição no nome de arquivos e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=110&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="LC31"><strong>Faz substituição no texto de arquivos.</strong></div>
<div>A linha de comando abaixo faz uma procura e substitui todas as ocorrências em arquivos textos da palavra &#8220;procure_por_isso&#8221; nos diretórios abaixo de &#8220;/home/meu_diretorio&#8221; e substitui por &#8221;substitua_por_isso&#8221;.</div>
<div><span style="color:#ffffff;">.</span></div>
<pre>find "/home/meu_diretorio" -type f -exec sed -i "" -e s/procure_por_isso/"substitua_por_isso"/g {} \;
<span style="color:#ffffff;">.</span></pre>
<div><span style="color:#ffffff;">.</span></div>
<div><strong>Faz substituição no nome de arquivos e diretórios</strong></div>
<div>O script abaixo renomeia todos os arquivos e diretórios com o nome de &#8220;procure_por_isso&#8221; e substitui por &#8220;substitua_por_isso&#8221; a partir do diretório &#8220;/home/procure_por_aqui&#8221;</div>
<div><span style="color:#ffffff;">.</span></div>
<div>
<pre style="padding-left:30px;">  FILES=$(find /home/procure_por_aqui -name "procure_por_isso")</pre>
<pre style="padding-left:30px;">  for FILE in $FILES; do</pre>
<pre style="padding-left:30px;">    NAME="$FILE"</pre>
<pre style="padding-left:30px;">    NAME_REPLACED=$(echo $FILE | sed -e s/"procure_por_isso"/"substitua_por_isso"/g)</pre>
<pre style="padding-left:30px;">    mv $NAME $NAME_REPLACED</pre>
<pre style="padding-left:30px;">  done</pre>
</div>
<div><span style="color:#ffffff;">.</span></div>
<div></div>
<div>Cabe lembrar que caso queira pesquisar pela parte do nome, no parametro -name pode-se utilizar o: *</div>
<div>por exemplo:</div>
<div><span style="color:#ffffff;">.</span></div>
<pre style="padding-left:30px;">FILES=$(find /home/procure_por_aqui -name *procure_por_isso*)</pre>
<pre style="padding-left:30px;"><span style="color:#ffffff;">.</span></pre>
<div>Vai procurar por qualquer ocorrência de &#8220;procure_por_isso&#8221;. Segue um exemplo de alguns resultados possíveis:</div>
<div><span style="color:#ffffff;">.</span></div>
<div style="padding-left:30px;">abc_procure_por_isso</div>
<div style="padding-left:30px;">procure_por_isso_abc</div>
<div style="padding-left:30px;">procure_por_isso</div>
<div style="padding-left:30px;"><span style="color:#ffffff;">.</span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/110/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=110&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2012/01/03/bash-script-find-and-replace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>
	</item>
		<item>
		<title>Introdução a Cluster</title>
		<link>http://rodrigoramalho.org/2011/10/11/introducao-cluster/</link>
		<comments>http://rodrigoramalho.org/2011/10/11/introducao-cluster/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 17:04:08 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[cluster]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=73</guid>
		<description><![CDATA[Cluster ? Cluster é o ato de de rodar a mesma aplicação em vários servidores de aplicação simultaneamente com cada aplicação estando ciente das outras que estão no cluster. Um servidor de aplicação em um cluster é chamado de nó. Pra quê ? Creio que a melhor forma de entender o por que? é com [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=73&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="color:#000000;"><strong>Cluster ?</strong></span></p>
<p><span style="color:#000000;">Cluster é o ato de de rodar a mesma aplicação em vários servidores de aplicação simultaneamente com cada aplicação estando ciente das outras que estão no cluster. Um servidor de aplicação em um cluster é chamado de nó.</span></p>
<p><span style="color:#000000;"><strong>Pra quê ?</strong></span></p>
<p><span style="color:#000000;">Creio que a melhor forma de entender o por que? é com um exemplo, então:</span></p>
<p><span style="color:#000000;">O servidor em que minha aplicação está rodando suporta 1000 usuários simultâneos, porém hoje 2000 usuários simultâneos acessaram minha aplicação e o servidor caiu.</span><br />
<span style="color:#000000;">E agora José ? Temos 2 opções, ou adquiro recursos para o servidor que já está rodando ou adiciono outras máquinas para responderem esses requests, desafogando a primeiro servidor.</span></p>
<p><span style="color:#000000;"><strong>Cluster: Vertical x Horizontal</strong></span></p>
<p><span style="color:#000000;">Clusters podem ser formados com nós rodando em uma máquina ou em várias máquinas. Essa formação do cluster é comumente se referida como topologia.</span></p>
<ul>
<li><span style="color:#000000;">Horizontal: Quando os nós do cluster estão em diferentes máquinas.</span></li>
<li><span style="color:#000000;">Vertical: Quando os nós do clusters estão na mesma máquina</span></li>
</ul>
<p><span style="color:#000000;">No cluster horizontal  se acontece alguma falha com a máquina (ex: queda de energia, queimar algum periférico, etc) a outra máquina assume o cluster sem problemas. Se a máquina do cluster vertical ocorrer algum problema todos os servidores que estavam rodando nela, serão comprometidos. Em outras palavras um cluster horizontal é uma melhor opção para alta disponibilidade.</span></p>
<div><span style="color:#000000;"><a href="http://haxorslab.files.wordpress.com/2011/10/screenshot-5.png"><span style="color:#000000;"><img class="size-full wp-image-77 aligncenter" title="Cluster horizontal x Vertical" src="http://haxorslab.files.wordpress.com/2011/10/screenshot-5.png?w=620&h=270" alt="" width="620" height="270" /></span></a></span></div>
<p><span style="color:#000000;"><strong>Balanceamento de Carga</strong></span></p>
<p><span style="color:#000000;">Balanceamento de carga é a maneira de distribuir a carga de entrada entre os diferentes servidores de aplicação, fazendo com que sua aplicação seja escalável e tenha alta disponibilidade. Escalabilidade é o termo usado para descrever a habilidade de fazer com que sua aplicação manipule mais carga adicionando hardware e/ou criando instâncias redundantes sem alterar o código. Então um cluster sem balanceamento de carga faz pouco ou nenhum sentido.</span></p>
<p style="text-align:center;"><span style="color:#000000;"><a href="http://haxorslab.files.wordpress.com/2011/10/screenshot-41.png"><span style="color:#000000;"><img class="size-full wp-image-76 aligncenter" title="Load Balance" src="http://haxorslab.files.wordpress.com/2011/10/screenshot-41.png?w=620&h=281" alt="" width="620" height="281" /></span></a></span></p>
<p><span style="color:#000000;"><strong>Alta disponibilidade</strong></span></p>
<p><span style="color:#000000;">Caso se tenha uma aplicação que seja toda stateless, pode-se garantir alta disponibilidade apenas colocando um balanceador de carga na frente de vários servidores com a mesma aplicação deployada (note, sem cluster). Esse mecanismo é conhecido como <strong>Failover</strong>. Cabe a ressalva que no failover nenhum tipo de estado da aplicação é replicado.</span></p>
<p><span style="color:#000000;">Porém se a aplicação for stateful o problema é mais em baixo, imagine que você esteja em um site de compras o seu carrinho já possui 10 itens derrepente o servidor cai, você não vai gostar nada de quando clicar no próximo botão cair em um tela de login e o seu carrinho aparecer zerado. O <strong>failover </strong>não replica estado então não seria adequado para esse tipo de situação para isso temos o mecanismo a seguir:</span></p>
<p><span style="color:#000000;"><strong>Replicação e Tolerância a falhas </strong>(Replication e Fault Tolerance)</span></p>
<p><span style="color:#000000;">Um servidor com tolerância a falhas promove alta disponibilidade e continua se comunicando com o cliente mesmo que o servidor caia, ou seja o estado do cliente é mantido. Então no exemplo anterior se o cluster tiver tolerância a falhas então o servidor cairá o cliente será balanceado para outro nó e continuará logado na aplicação com seu carrinho de compras com todos os itens como se nada tivesse acontecido.</span><br />
<span style="color:#000000;"> Mas o que contém nesse estado do cliente?</span><br />
<span style="color:#000000;"> Basicamente duas coisas: Dados de sessão e de entidades.</span></p>
<p><span style="color:#000000;">Dados de sessão (Session data) são mantidos em memória pela aplicação ou por mecanismos de cache habilitados pelo servidor de aplicação.</span><br />
<span style="color:#000000;"> Dados de entidade (Entity data) são mantidos em banco de dados.</span></p>
<p><span style="color:#000000;">Para ser tolerante a falhas o estado associado a uma aplicação deve redundantemente disponível, ou seja, os nós devem replicar o estado entre cada nó do cluster</span></p>
<p><span style="color:#000000;">Fault tolerance = fail over + state replication</span><br />
<span style="color:#000000;"> <a href="http://haxorslab.files.wordpress.com/2011/10/screenshot-6.png"><span style="color:#000000;"><img class="size-full wp-image-78 aligncenter" title="Fault Tolerance" src="http://haxorslab.files.wordpress.com/2011/10/screenshot-6.png?w=620&h=299" alt="" width="620" height="299" /></span></a></span></p>
<p><span style="color:#000000;">É muito comum escutarmos conversas de pessoas pensando em cluster como uma forma de melhorar performance, e como podemos ver cluster é sinônimo de disponibilidade e dependendo do cluster pode é trazer défict de performance devido o fato do servidor de aplicação ter que ficar replicando estado, sincronizando cache, etc.</span></p>
<p><span style="color:#000000;">Existem diferentes formas dessa replicação de estado acontecer em um cluster, mas para não deixar o post muito longo vou encerrando por aqui.<br />
</span></p>
<p><span style="color:#000000;">Fonte:</span><br />
<span style="color:#000000;"> <a href="http://www.manning.com/jamae/"><span style="color:#000000;"> JBoss in Action &#8211; Chapter 12 &#8211; Understanding Cluster.</span></a></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=73&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2011/10/11/introducao-cluster/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2011/10/screenshot-5.png" medium="image">
			<media:title type="html">Cluster horizontal x Vertical</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2011/10/screenshot-41.png" medium="image">
			<media:title type="html">Load Balance</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2011/10/screenshot-6.png" medium="image">
			<media:title type="html">Fault Tolerance</media:title>
		</media:content>
	</item>
		<item>
		<title>jQuery placeholder plugin (Twitter Like)</title>
		<link>http://rodrigoramalho.org/2011/09/28/jquery-placeholder-plugin/</link>
		<comments>http://rodrigoramalho.org/2011/09/28/jquery-placeholder-plugin/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 06:32:34 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery placeholder]]></category>
		<category><![CDATA[jquery plugin]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=50</guid>
		<description><![CDATA[Recentemente programando com minha amiga Carolina Mascarenhas ela fez um placeholder bem parecido com o do twitter, apenas dei uma acabada no código e coloquei no formato de plugin. Placeholder é quando o label de um campo input está localizado dentro do pŕoprio input. Como podemos ver na imagem abaixo: &#160; &#160; Segue a página [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=50&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recentemente programando com minha amiga<a title="Carolina Mascarenhas" href="http://twitter.com/#!/anylyne" target="_blank"> Carolina Mascarenhas</a> ela fez um placeholder bem parecido com o do twitter, apenas dei uma acabada no código e coloquei no formato de plugin.</p>
<p>Placeholder é quando o label de um campo input está localizado dentro do pŕoprio input. Como podemos ver na imagem abaixo:</p>
<p><a href="http://haxorslab.files.wordpress.com/2011/09/screenshot-1.png"><img class="alignleft size-thumbnail wp-image-64" title="placeholder input" src="http://haxorslab.files.wordpress.com/2011/09/screenshot-1.png?w=200&h=35" alt="" width="200" height="35" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Segue a página contendo o exemplo: <a href="http://jspace.com.br/jquery-placeholder-plugin/" target="_blank">http://jspace.com.br/jquery-placeholder-plugin/</a></p>
<p>Como utilizar:</p>
<p>Adicionar os arquivos<strong> jquery.js</strong>, <strong>jquery.placeholder.js</strong> e o<strong> placeholder.cs</strong>s a página.</p>
<pre>&lt;script type="text/javascript" src="jquery.min.js" &gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.placeholder.js" &gt;&lt;/script&gt;
&lt;link href="placeholder.css" type="text/css" rel="stylesheet" /&gt;</pre>
<p>O html deve respeitar a seguinte estrutura:</p>
<pre>&lt;div class="holding username"&gt;</pre>
<pre style="padding-left:30px;">&lt;input type="text" id="username" name="username" /&gt;</pre>
<pre style="padding-left:30px;">&lt;span class="holder"&gt;Email&lt;/span&gt;
&lt;/div&gt;</pre>
<p>Onde o conteúdo que estiver dentro da tag &lt;span&gt; será o que aparecerá dentro do input.</p>
<p>Tendo isso como premissa, o código para adicionar o placeholder deverá ser o seguinte:</p>
<pre> jQuery(".username").placeholder();</pre>
<p>Onde &#8220;.username&#8221; é a classe da div. Também pode ser utilizado o id.</p>
<p>Algumas opções podem ser especificadas:</p>
<pre>jQuery(".username").placeholder({</pre>
<pre style="padding-left:30px;">color_onfocus: "b9b9b9",</pre>
<pre style="padding-left:30px;">color_background_onfocus: "white"
});</pre>
<p>Cabe lembrar que o HTML5 tem suporte nativo ao placeholder bastando apenas colocar a propriedade placeholder=&#8221;Rodrigo Ramalho&#8221; dentro do input.</p>
<p>exemplo:</p>
<pre>&lt;input type="text" name="exemplo" placeholder="Demonstrando placeholder" /&gt;</pre>
<p>Simples assim. Porém nem todos os browsers suportam HTML5 ainda.</p>
<p>Pra quem quiser contribuir e/ou entender melhor o projeto, o source está no meu github:</p>
<p><a href="https://github.com/hodrigohamalho/jquery-placeholder-plugin">https://github.com/hodrigohamalho/jquery-placeholder-plugin</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=50&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2011/09/28/jquery-placeholder-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>

		<media:content url="http://haxorslab.files.wordpress.com/2011/09/screenshot-1.png?w=150" medium="image">
			<media:title type="html">placeholder input</media:title>
		</media:content>
	</item>
		<item>
		<title>Cheat Sheets</title>
		<link>http://rodrigoramalho.org/2011/07/08/cheat-sheets/</link>
		<comments>http://rodrigoramalho.org/2011/07/08/cheat-sheets/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 04:32:53 +0000</pubDate>
		<dc:creator>Rodrigo Ramalho da Silva</dc:creator>
				<category><![CDATA[Cheat Sheet]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[cheat sheet]]></category>
		<category><![CDATA[commands]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://rodrigoramalho.org/?p=23</guid>
		<description><![CDATA[Para evitar o problema de ter que ficar dando uma googlada pra lembrar 'aquele' comando que está lhe falhando a memória,  basta aprender a explorar os "cheat sheets". Cheat sheet  é um resumo dos principais comandos de uma determinada API. Hoje precisei lembrar alguns comandos do heroku e achei esse cheat sheet no qual acrescentei [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=23&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<pre>Para evitar o problema de ter que ficar dando uma googlada pra lembrar 'aquele' comando
que está lhe falhando a memória,  basta aprender a explorar os <a title="cheat sheets" href="http://tinyurl.com/6zdx4pf" target="_blank">"cheat sheets"</a>. Cheat sheet 
é um resumo dos principais comandos de uma determinada API. Hoje precisei lembrar alguns
comandos do <a title="heroku" href="http://heroku.com" target="_blank">heroku</a> e achei esse <a title="cheat sheet" href="http://cheat.errtheblog.com/s/heroku/2" target="_blank">cheat sheet</a> no qual acrescentei algumas linhas.

<strong>Heroku Cheat Sheet </strong>
<strong>=== General Commands</strong>
 help                         # show this usage
 version                      # show the gem version

 list                         # list your apps
 create [&lt;name&gt;]              # create a new app

 keys                         # show your user's public keys
 keys:add [&lt;path to keyfile&gt;] # add a public key
 keys:remove &lt;keyname&gt;        # remove a key by name (user@host)
 keys:clear                   # remove all keys
 ps                           # display process

<strong>=== App Commands (execute inside a checkout directory, or use --app &lt;appname&gt;)</strong>

 info                         # show app info, like web url and git repo
 open                         # open the app in a web browser
 rename &lt;newname&gt;             # rename the app
 dynos &lt;qty&gt;                  # set the app to use the specified qty of dynos

 sharing:add &lt;email&gt;          # add a collaborator
 sharing:remove &lt;email&gt;       # remove a collaborator
 sharing:transfer &lt;email&gt;     # transfers the app ownership

 domains:add &lt;domain&gt;         # add a custom domain name
 domains:remove &lt;domain&gt;      # remove a custom domain name
 domains:clear                # remove all custom domains

 ssl:add &lt;pem&gt; &lt;key&gt;          # add SSL cert to the app
 ssl:remove &lt;domain&gt;          # removes SSL cert from the app domain

 rake &lt;command&gt;               # remotely execute a rake command
 console &lt;command&gt;            # remotely execute a single console command
 console                      # start an interactive console to the remote app

 restart                      # restart app servers
 logs                         # fetch recent log output for debugging
 logs:cron                    # fetch cron log output

 maintenance:on               # put the app into maintenance mode
 maintenance:off              # take the app out of maintenance mode

 config                       # display the app's config vars (environment)
 config:add key=val [...]     # add one or more config vars
 config:remove key [...]      # remove one or more config vars
 config:clear                 # clear user-set vars and reset to default

 db:pull [&lt;database_url&gt;]     # pull the app's database into a local database
 db:push [&lt;database_url&gt;]     # push a local database into the app's remote
 database
 db:reset                     # reset the database for the app
<strong>-- Postgres databases ---</strong>
 pg:info                      # show db info
 pgbackups                    # list postgres backups
 pgbackups:url id             # get url to download backup
 pgbackups:capture            # capture a new backup
 pgbackups:destroy id         # destroy bakup

 bundles                      # list bundles for the app
 bundles:capture [&lt;bundle&gt;]   # capture a bundle of the app's code and data
 bundles:download             # download most recent app bundle as a tarball
 bundles:download &lt;bundle&gt;    # download the named bundle
 bundles:animate &lt;bundle&gt;     # animate a bundle into a new app
 bundles:destroy &lt;bundle&gt;     # destroy the named bundle

 addons                       # list addons
 addons:add name [key=value]  # install addon (with zero or more config vars)
 addons:remove name           # uninstall an addons
 addons:clear                 # uninstall all addons

 destroy                      # destroy the app permanently

<strong>=== Example:</strong>

 rails myapp
 cd myapp
 git init
 git add .
 git commit -m "my new app"
 heroku create
 git push heroku master</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/haxorslab.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/haxorslab.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/haxorslab.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rodrigoramalho.org&#038;blog=22400385&#038;post=23&#038;subd=haxorslab&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rodrigoramalho.org/2011/07/08/cheat-sheets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5a8095b6b9b59ebe2001ddfccc86cbe7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigoramalhosilva</media:title>
		</media:content>
	</item>
	</channel>
</rss>
