<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Tiago Romero Garcia</title>
	<atom:link href="http://tiagoromero.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tiagoromero.wordpress.com</link>
	<description>Pegue 1 xícara de leite, adicione capuccino, computação e mexa com bom humor.</description>
	<lastBuildDate>Fri, 18 Sep 2009 16:22:26 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='tiagoromero.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/42408a5426b3b3acae2554e8889c6ee1?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Tiago Romero Garcia</title>
		<link>http://tiagoromero.wordpress.com</link>
	</image>
			<item>
		<title>Vou me casar!</title>
		<link>http://tiagoromero.wordpress.com/2009/09/18/vou-me-casar/</link>
		<comments>http://tiagoromero.wordpress.com/2009/09/18/vou-me-casar/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 16:22:26 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[casamento]]></category>
		<category><![CDATA[Cíntia]]></category>
		<category><![CDATA[Tiago]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=541</guid>
		<description><![CDATA[Meus queridos leitores,
Já fazem vários meses que não posto aqui no blog, o motivo é esse: irei me casar!
E saibam que dá um trabalhão! Afinal, conseguir a felicidade eterna não é de graça né?? ;)
Quem quiser acompanhar a nossa saga, confira o blog do nosso casamento: sagasdecintiago.wordpress.com
Bem, eu continuo trabalhando para Favorpals e agora estamos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=541&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div id="attachment_543" class="wp-caption alignright" style="width: 210px"><a href="http://tiagoromero.files.wordpress.com/2009/09/img_8683.jpg"><img class="size-medium wp-image-543" title="Tiago e Cíntia" src="http://tiagoromero.files.wordpress.com/2009/09/img_8683.jpg?w=200&#038;h=300" alt="Tiago e Cíntia" width="200" height="300" /></a><p class="wp-caption-text">Tiago e Cíntia</p></div>
<p style="text-align:justify;">Meus queridos leitores,</p>
<p style="text-align:justify;">Já fazem vários meses que não posto aqui no blog, o motivo é esse: irei me casar!</p>
<p style="text-align:justify;">E saibam que dá um trabalhão! Afinal, conseguir a felicidade eterna não é de graça né?? ;)</p>
<p style="text-align:justify;">Quem quiser acompanhar a nossa saga, confira o blog do nosso casamento: <a href="http://sagasdecintiago.wordpress.com" target="_blank">sagasdecintiago.wordpress.com</a></p>
<p style="text-align:justify;">Bem, eu continuo trabalhando para <a href="http://www.favorpals.com" target="_blank">Favorpals</a> e agora estamos utilizando Spring 2.5 MVC, que foi um imenso avanço! Quando me der uma boa folga eu escrevo sobre ele.</p>
<p style="text-align:justify;">E além disso, estou construindo um ERP para a empresa do meu pai, e estou utilizando outras tecnologias interessantíssimas como JBoss Seam e RichFaces. Também quando puder eu escrevo sobre isto.</p>
<p style="text-align:justify;">Bem, é isso aí! Fiquei com Deus, um grande abraço!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/541/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/541/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/541/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/541/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/541/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/541/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/541/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/541/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/541/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/541/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=541&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/09/18/vou-me-casar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2009/09/img_8683.jpg?w=200" medium="image">
			<media:title type="html">Tiago e Cíntia</media:title>
		</media:content>
	</item>
		<item>
		<title>Proteja seu site contra SPAM e ajude a digitalização de livros com reCAPTCHA</title>
		<link>http://tiagoromero.wordpress.com/2009/02/27/proteja-seu-site-contra-spam-e-ajude-a-digitalizacao-de-livros-com-recaptcha/</link>
		<comments>http://tiagoromero.wordpress.com/2009/02/27/proteja-seu-site-contra-spam-e-ajude-a-digitalizacao-de-livros-com-recaptcha/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 20:50:14 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[digitalização]]></category>
		<category><![CDATA[livros]]></category>
		<category><![CDATA[recaptcha]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[validação]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=464</guid>
		<description><![CDATA[Resumo
Ainda hoje, SPAM é um problema altamente relevante. Desenvolvedores vêm tomando diversas medidas para tentar conter os prejuízos causados por SPAM. Hoje apresentarei reCAPTCHA, uma implementação CAPTCHA para neutralizar os ataques feitos por robôs, que ao mesmo tempo que realiza testes que apenas humanos conseguem resolver, contribui para a digitalização de livros antigos.
 


Conteúdo

Introdução
CAPTCHA
O Projeto reCAPTCHA
Como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=464&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><strong>Resumo</strong></p>
<p style="text-align:justify;">Ainda hoje, SPAM é um problema altamente relevante. Desenvolvedores vêm tomando diversas medidas para tentar conter os prejuízos causados por SPAM. Hoje apresentarei reCAPTCHA, uma implementação CAPTCHA para neutralizar os ataques feitos por robôs, que ao mesmo tempo que realiza testes que apenas humanos conseguem resolver, contribui para a digitalização de livros antigos.</p>
<p> </p>
<p style="text-align:justify;">
<hr /><a name="captcha0"></a></p>
<p style="text-align:justify;"><strong>Conteúdo</strong></p>
<ol>
<li><a href="#captcha1">Introdução</a></li>
<li><a href="#captcha2">CAPTCHA</a></li>
<li><a href="#captcha3">O Projeto reCAPTCHA</a></li>
<li><a href="#captcha4">Como reCAPTCHA funciona</a></li>
<li><a href="#captcha5">Como implementar reCAPTCHA em meu site</a></li>
<li><a href="#captcha6">Observações</a></li>
</ol>
<p> </p>
<p style="text-align:justify;">
<hr /><a name="captcha1"></a></p>
<p style="text-align:justify;"><strong>1. Introdução</strong></p>
<p>Não é de hoje que sites e sistemas web são vitimados por spammers e robôs que visam a proliferação de suas mensagens indesejadas. Esta prática é denominada SPAM: o abuso em sistemas eletrônicos de mensagens com respeito ao envio indiscriminado em massa de mensagens indesejadas. Existem várias formas de SPAM, apesar de que sua variante mais conhecida é o SPAM por e-mail. Teoricamente, qualquer sistema disponível publicamente (por exemplo, na internet) sem medidas anti-SPAM está sujeito a receber SPAM.  </p>
<p style="text-align:justify;">Neste cenário, vêm sendo trabalhadas algumas soluções para tentar impedir, ou ao menos diminuir o envio de SPAM. </p>
<p style="text-align:justify;">Hoje vou apresentar uma solução apresentada contra a ação de robôs. Robôs são softwares projetados para enviar SPAM automaticamente. Realizam tarefas como criar contas em sites, realizar login, enviar mensagens, etc. </p>
<p style="text-align:justify;"> </p>
<p><a name="captcha2"></a></p>
<p style="text-align:justify;"><strong>2. CAPTCHA</strong></p>
<p style="text-align:justify;">É sabido que robôs podem realizar ações de interação com a interface, como acessar caixas de texto, digitar texto, selecionar botões, clicar, etc. Mas há certas ações que apenas os seres humanos são capazes de realizar, como <span style="text-decoration:underline;">copiar texto distorcido</span>. Se o texto não estiver devidamente distorcido, o robô pode utilizar técnicas de OCR (<em><span style="font-style:normal;">Optical character recognition) para interpretar o texto, exatamente da mesma forma que os scanners trabalham para reconhecer páginas escaneadas, e assim copiá-lo.</span></em></p>
<p style="text-align:justify;">Esta solução se chama <a href="http://www.captcha.net/" target="_blank">CAPTCHA</a> (Completely Automated Public Turing Test To Tell Computers and Humans Apart), e busca proteger sites contra robôs através da geração e avaliação de testes que humanos conseguem realizar, mas softwares atuais não.</p>
<p style="text-align:justify;">E CAPTCHA tem sido adotada em massa. É comum de se encontrar, ao criar uma conta em algum site, um campo com letras distorcidas a serem copiadas, para verificar a autenticidade humana do usuário. Observemos que esta parece ser uma solução eficaz contra robôs.</p>
<p style="text-align:justify;">CAPTCHA é indicado especialmente para:</p>
<ul>
<li>Prever SPAM em comentários de blogs.</li>
<li>Proteger registros em sites.</li>
<li>Proteger endereços de email de spammers.</li>
<li>Enquetes on-line.</li>
<li>Prever ataques dicionário.</li>
<li>Robôs de mecanismos de busca.</li>
<li>Worms e SPAM.</li>
</ul>
<p>Pois bem, temos uma solução. E agora você se pergunta: como embutir esta funcionalidade em meu site?</p>
<p style="text-align:justify;">Felizmente, há diversas implementações de CAPTCHA disponíveis. Apresentarei a implementação mais popular de hoje em dia, o <a href="http://recaptcha.net/" target="_blank">Projeto reCAPTCHA</a>.</p>
<p style="text-align:justify;"> </p>
<p><a name="captcha3"></a></p>
<p style="text-align:justify;"><strong>3. O Projeto reCAPTCHA</strong></p>
<p style="text-align:justify;">O Projeto reCAPTCHA é uma implementação free, segura e disponível para WordPress, MediaWiki, Java, PHP, ASP.NET, Perl, Python e diversos outros ambientes. reCAPTCHA também realiza testes de áudio como uma alternativa a usuários deficientes de visão.</p>
<p style="text-align:justify;">Além disso, reCAPTCHA ajuda a digitalizar livros de <a href="http://www.archive.org/">Internet Archive</a> e edições antigas do <a href="http://www.nytimes.com/">New York Times</a>. A cada teste realizado com sucesso, mais uma palavra  é digitalizada.</p>
<p style="text-align:justify;">Este processo de digitalização ocorre da seguinte forma: cada palavra que não consegue ser reconhecida corretamente por OCR é enviada aos usuários de sites com reCAPTCHA em forma de um teste, junto com outra palavra já conhecida. O usuário deverá interpretar ambas palavras e enviar sua resposta. O sistema aprovará a resposta do usuário se ele digitou corretamente a palavra já conhecida. Aí, o sistema considerará a resposta dada à palavra desconhecida como uma candidata a ser o reconhecimento correto da palavra. Agora, o sistema enviará esta mesma palavra desconhecida a outras pessoas para determinar, com maior certeza, se a resposta candidata é realmente a correta.</p>
<p style="text-align:justify;">reCAPTCHA é utilizado por mais de 100 mil sites, incluindo <a href="http://www.facebook.com/" target="_blank">Facebook</a>, <a href="http://www.ticketmaster.com/" target="_blank">Ticketmaster</a>, e <a href="http://www.craigslist.com/" target="_blank">Craigslist</a>.</p>
<p style="text-align:justify;"> </p>
<p><a name="captcha4"></a></p>
<p style="text-align:justify;"><strong>4. Como reCAPTCHA funciona</strong></p>
<p style="text-align:justify;">O seguinte diagrama ilustra o funcionamento de reCAPTCHA.</p>
<p style="text-align:justify;"><img class="size-full wp-image-478 aligncenter" title="recaptcha-api-diagram" src="http://tiagoromero.files.wordpress.com/2009/02/recaptcha-api-diagram.gif?w=510&#038;h=237" alt="recaptcha-api-diagram" width="510" height="237" /></p>
<ol>
<li>O usuário carrega a página web com o código JavaScript para o teste reCAPTCHA embutido.</li>
<li>O browser requisita um teste ao servidor de API reCAPTCHA. O servidor fornece ao usuário um teste e um token que identificará o teste.</li>
<li>O usuário preenche o formulário na página web, e envia o resultado a seu servidor de aplicações, juntamente com o token do teste.</li>
<li>O servidor de aplicação envia a resposta do usuário para o servidor de verificação reCAPTCHA. Este a avaliará e retornará para o servidor de aplicações.</li>
<li>Se estiver correto, o servidor de aplicações irá permitir ao usuário acessar algum serviço ou informação. Se não estiver, poderá permitir ao usuário tentar novamente.</li>
</ol>
<p> 
<p style="text-align:justify;"></p>
<p><a name="captcha5"></a></p>
<p style="text-align:justify;"><strong>5. Como implementar reCAPTCHA em meu site</strong></p>
<p style="text-align:justify;">Para implementar reCAPTCHA, siga este processo:</p>
<ol style="text-align:justify;">
<li>Registre-se em <a href="http://recaptcha.net/api/getkey">reCAPTCHA Administration Portal</a> para obter um par de chaves pública/privada para cada domínio ou todos os domínios.<br />
Mais informações em <a href="http://recaptcha.net/apidocs/captcha/">http://recaptcha.net/apidocs/captcha/ </a><br />
  </li>
<li>Insira o código client-side na página desejada. Aqui será inserida sua chave pública. Você pode utilizar a API padrão (utiliza JavaScript), a API não-JavaScript e a API AJAX. Existem diversas opções para a customização do Look &amp; Feel e comportamento.<br />
Mais informações em <a href="http://recaptcha.net/apidocs/captcha/client.html">http://recaptcha.net/apidocs/captcha/client.html </a><br />
 </li>
<li>Escreva o código server-side que receberá a requisição, verificará o teste e retornará. Aqui será inserida sua chave privada. <br />
<span style="text-decoration:underline;">Em Java:</span> <a href="http://wheelersoftware.com/articles/recaptcha-java.html">http://wheelersoftware.com/articles/recaptcha-java.html</a></li>
</ol>
<p> 
<p style="text-align:justify;"></p>
<p><a name="captcha6"></a></p>
<p style="text-align:justify;"><strong>6. Observações</strong></p>
<p style="text-align:justify;">Implementei reCAPTCHA no projeto <a href="http://www.favorpals.com" target="_blank">Favorpals</a> e até agora tem sido bem satisfatório. Quem tiver algum comentário a fazer, ou experiência com reCAPTCHA ou outra implementação CAPTCHA, está convidado a comentar este post.</p>
<p>Inté =)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/464/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=464&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/02/27/proteja-seu-site-contra-spam-e-ajude-a-digitalizacao-de-livros-com-recaptcha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2009/02/recaptcha-api-diagram.gif" medium="image">
			<media:title type="html">recaptcha-api-diagram</media:title>
		</media:content>
	</item>
		<item>
		<title>Parametrizando código Ruby com YAML</title>
		<link>http://tiagoromero.wordpress.com/2009/02/21/parametrizando-codigo-ruby-com-yaml/</link>
		<comments>http://tiagoromero.wordpress.com/2009/02/21/parametrizando-codigo-ruby-com-yaml/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 12:27:41 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[properties]]></category>
		<category><![CDATA[serialização]]></category>
		<category><![CDATA[serialização de dados]]></category>
		<category><![CDATA[yaml]]></category>
		<category><![CDATA[yml]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=462</guid>
		<description><![CDATA[Acho que a maioria dos programadores Java, assim como eu, sempre que vão aderir a uma nova tecnologia, procuram abstrações similares às quais temos no mundo Java. 
Pois bem, me vi na necessidade de parametrizar um código escrito em Ruby. A primeira coisa que me veio na cabeça: ARQUIVO PROPERTIES! Seria maravilhoso se existisse em Ruby [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=462&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Acho que a maioria dos programadores Java, assim como eu, sempre que vão aderir a uma nova tecnologia, procuram abstrações similares às quais temos no mundo Java. </p>
<p style="text-align:justify;">Pois bem, me vi na necessidade de parametrizar um código escrito em Ruby. A primeira coisa que me veio na cabeça: <strong>ARQUIVO PROPERTIES</strong>! Seria maravilhoso se existisse em Ruby um conceito exatamente igual, de forma que não fosse necessário gastar muito tempo com isso.</p>
<p style="text-align:justify;">Foi aí que me deparei com o fato de que Ruby não tem um parser para arquivo properties! Pior que isso, nenhuma outra linguagem é obrigada a ter parser para arquivo properties, pois este tipo de arquivos foi criado no mundo Java! É claro que não é difícil de construir um no Ruby (mostrei uma implementação disso no post anterior <strong>10 boas práticas em Ruby WATIR,</strong> na <a href="http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/#boas9" target="_blank">Boa Prática 9 - Recuperar mensagens de arquivos de texto</a>), mas seria ideal se houvesse algum recurso similar nativo do Ruby&#8230;</p>
<p style="text-align:justify;">Então passei a conhecer YAML. YAML é mais uma daquelas siglas recursivas, e significa YAML Ain&#8217;t Markup Language. É uma especificação de um padrão de serialização de dados que seja amigável a humanos, e compatível com todas as linguagens de programação. Seu site oficial é <a href="http://www.yaml.org/">http://www.yaml.org/</a>.</p>
<p style="text-align:justify;">É um projeto muito bacana e simplório, tendo como objetivo fugir da complexidade das linguagens de marcação. Além disso, apresenta parsers para C/C++, Java, Python, Ruby, Perl, C#/.NET, PHP, Javascript, Actionscript e outros.</p>
<p style="text-align:justify;">E o melhor: em Ruby é incrivelmente fácil de se trabalhar com YAML! Veja só:</p>
<p style="text-align:justify;"><strong>a) Para carregar uma parametrização de um arquivo YAML em um dictionary:</strong></p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">require "yaml"

# (...)

  # This will load options.yml into config dictionary
  options_file = 'options.yml'
  config = YAML.load_file(options_file)

  # Now it has been loaded. This will get param1 parameter
  # into param1 variable.
  param1 = config['param1']</pre>
<p><strong>b) Para serializar dados de um dictionary e gravar em um arquivo YAML:</strong></p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">require "yaml"

# (...)

  config = {
    'param1' =&gt; 'value1',
    'param2' =&gt; 'value2',
    'param3' =&gt; 'value3'
  }

  File.open('options.yml', 'w') do |out|
    YAML.dump(config, out)
  end</pre>
<p style="text-align:justify;">Além disso, YAML pode também serializar dados de objetos, arrays, etc. E como possui parsers em diversas linguagens, agora ficou muito mais <strong>fácil </strong>e <strong>econômico </strong>para realizar serialização de dados entre sistemas construídos em linguagens diferentes, contrapondo o XML! YAML não causará o overhead causado por arquivos XML.</p>
<p style="text-align:justify;">É claro que YAML não tem todo o potencial de XML, pois é apenas um formato de serialização de dados. Outro contraponto é que YAML não possui parsers mais complexos como os parsers de XML em Java e .NET. Mas para muitos propósitos, YAML pode ser mais adequado que XML.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/462/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/462/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/462/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/462/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/462/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=462&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/02/21/parametrizando-codigo-ruby-com-yaml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>
	</item>
		<item>
		<title>Como manipular pop-ups javascript no Ruby WATIR (IE) e FireWatir (Firefox)</title>
		<link>http://tiagoromero.wordpress.com/2009/02/17/como-manipular-pop-ups-javascript-no-ruby-watir-ie-e-firewatir-firefox/</link>
		<comments>http://tiagoromero.wordpress.com/2009/02/17/como-manipular-pop-ups-javascript-no-ruby-watir-ie-e-firewatir-firefox/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 23:30:33 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[WATIR]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[estratégia]]></category>
		<category><![CDATA[firewatir]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[padrão de projeto]]></category>
		<category><![CDATA[strategy]]></category>
		<category><![CDATA[test case]]></category>
		<category><![CDATA[teste unitário]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=375</guid>
		<description><![CDATA[Hoje irei enfatizar a minha solução para escrever código que manipule pop-ups javascript no Ruby WATIR, observando a discrepância que existe na programação para IE e para Firefox.
Fato: muitas aplicações que realizam processamentos server-side costumam apresentar seus resultados por via de pop-ups javascript (isto é muito comum quando utiliza-se AJAX).
O grande problema que ocorre é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=375&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Hoje irei enfatizar a minha solução para escrever código que manipule pop-ups javascript no Ruby WATIR, observando a discrepância que existe na programação para IE e para Firefox.</p>
<p style="text-align:justify;">Fato: muitas aplicações que realizam processamentos server-side costumam apresentar seus resultados por via de pop-ups javascript (isto é muito comum quando utiliza-se AJAX).</p>
<p style="text-align:justify;">O grande problema que ocorre é que, devido ao modo pelo qual WATIR se comunica com cada browser (IE usa a API do Windows e Firefox usa o plugin JSSH), as maneiras que cada uma destas soluções foram desenvolvidas têm naturezas distintas.</p>
<p style="text-align:justify;">No post anterior <strong>10 boas práticas em Ruby WATIR</strong>, a <a href="http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/#boas5" target="_blank">Boa Prática 5 - Isolar a discrepância entre IE e Firefox em métodos polimórficos usando o design pattern Strategy</a> apresenta uma solução para este problema, utilizando um padrão de projeto GoF para favorecer isolamento de código e promover reutilização. Não vou repetir o post aqui, portanto verifique neste post a solução apresentada.</p>
<p style="text-align:justify;">Observe que, ainda assim, mensagens pop-up javascript contendo texto são uma fonte de problemas quando se deseja compatibilidade plena entre IE e Firefox. Isto se dá pois cada browser manipula de forma diferente seus pop-ups, e ainda assim em momentos diferentes!</p>
<p style="text-align:justify;">No post anterior <strong>10 boas práticas em Ruby WATIR</strong>, a <a href="http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/#boas7" target="_blank">Boa Prática 7 - Evitar ter de manipular mensagens pop-up javascript</a> enfatiza conseqüências e alternativas para isso.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/375/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/375/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/375/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=375&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/02/17/como-manipular-pop-ups-javascript-no-ruby-watir-ie-e-firewatir-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>
	</item>
		<item>
		<title>Visita a Vitória e Vila Velha</title>
		<link>http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/</link>
		<comments>http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 01:35:47 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Viagens]]></category>
		<category><![CDATA[convento]]></category>
		<category><![CDATA[convento da penha]]></category>
		<category><![CDATA[fábrica da garoto]]></category>
		<category><![CDATA[garoto]]></category>
		<category><![CDATA[penha]]></category>
		<category><![CDATA[vila velha]]></category>
		<category><![CDATA[vitória]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=410</guid>
		<description><![CDATA[Vila Velha e Vitória são as mais importantes cidades do Espírito Santo. Lugar lindo e agradável. Muito azul. Muito alegre. Modernidade e história vivendo lado a lado.
Andar lá é uma delícia. Pontes, vistas, portos, árvores e pedras. A sinalização do trânsito é um pouco confusa, mas nada que um capixaba não possa nos indicar. 
Um lugar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=410&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><a href="http://pt.wikipedia.org/wiki/Vila_Velha" target="_blank">Vila Velha</a> e <a href="http://pt.wikipedia.org/wiki/Vitória_(Espirito_Santo)" target="_blank">Vitória</a> são as mais importantes cidades do Espírito Santo. Lugar lindo e agradável. Muito azul. Muito alegre. Modernidade e história vivendo lado a lado.</p>
<p style="text-align:justify;">Andar lá é uma delícia. Pontes, vistas, portos, árvores e pedras. A sinalização do trânsito é um pouco confusa, mas nada que um capixaba não possa nos indicar. </p>
<p style="text-align:justify;">Um lugar bacana que deixa saudades.</p>

<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria35/' title='Vitória'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria35.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria301/' title='Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria301.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria34/' title='Vitória - Terminal Aquaviário'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria34.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória - Terminal Aquaviário" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria33/' title='Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria33.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria32/' title='Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria32.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria31/' title='Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria31.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria29/' title='Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria29.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria28/' title='Pontezinha de Vila Velha para Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria28.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Pontezinha de Vila Velha para Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria27/' title='Recepção da fábrica'><img width="150" height="121" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria27.jpg?w=150&#038;h=121" class="attachment-thumbnail" alt="" title="Recepção da fábrica" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria26/' title='Testando os produtos da fábrica'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria26.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Testando os produtos da fábrica" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria25/' title='Fábrica da Garoto'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria25.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Fábrica da Garoto" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria24/' title='Fábrica da Garoto'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria24.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Fábrica da Garoto" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria23/' title='Fábrica da Garoto'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria23.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Fábrica da Garoto" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria22/' title='Passarela da Fábrica da Garoto'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria22.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Passarela da Fábrica da Garoto" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria21/' title='Fachada da Fábrica da Garoto'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria21.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Fachada da Fábrica da Garoto" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria20/' title='Vila Velha - Fábrica da Garoto (não parece uma caixa gigante de chocolates Garoto?)'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria20.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vila Velha - Fábrica da Garoto (não parece uma caixa gigante de chocolates Garoto?)" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria19/' title='Convento de Nossa Senhora da Penha'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria19.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria18/' title='Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria18.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria17/' title='Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria17.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria16/' title='Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria16.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria15/' title='Graças de Nossa Senhora da Penha'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria15.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Graças de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria14/' title='Placa no Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria14.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Placa no Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria13/' title='Tarântula no Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria13.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Tarântula no Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria12/' title='Entrada do Convento de Nossa Senhora da Penha'><img width="118" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria12.jpg?w=118&#038;h=150" class="attachment-thumbnail" alt="" title="Entrada do Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria11/' title='Vila Velha'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria11.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Vila Velha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria10/' title='Vila Velha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria10.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vila Velha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria09/' title='Vila Velha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria09.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Vila Velha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria08/' title='Terceira Ponte'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria08.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Terceira Ponte" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria07/' title='Baía de Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria07.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Baía de Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria06/' title='Centro Comercial de Vitória'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria06.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Centro Comercial de Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria05/' title='Voando no Convento de Nossa Senhora da Penha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria05.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Voando no Convento de Nossa Senhora da Penha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria04/' title='Terceira Ponte'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria04.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Terceira Ponte" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria03/' title='Terceira Ponte - entre Vila Velha e Vitória'><img width="112" height="150" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria03.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="" title="Terceira Ponte - entre Vila Velha e Vitória" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria02/' title='Rodovia do Sol - Chegando em Vila Velha'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria02.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Rodovia do Sol - Chegando em Vila Velha" /></a>
<a href='http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/vitoria01/' title='Rodovia do Sol - Guarapari'><img width="150" height="112" src="http://tiagoromero.files.wordpress.com/2009/02/vitoria01.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="" title="Rodovia do Sol - Guarapari" /></a>

  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/410/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=410&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/02/16/visita-a-vitoria-e-vila-velha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>
	</item>
		<item>
		<title>10 boas práticas em Ruby WATIR</title>
		<link>http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/</link>
		<comments>http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 16:09:24 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[WATIR]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[test case]]></category>
		<category><![CDATA[teste unitário]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=366</guid>
		<description><![CDATA[Resumo
Eu tenho apenas 5 meses de experiência com WATIR, mas já me convenci de certas práticas de utilização que considero boas, e que de alguma forma estão trazendo resultados positivos.
Vale lembrar que são todas baseadas no bom-senso.
 

Conteúdo

Utilizar sempre a interface Watir::Browser
Buscar componentes HTML por id sempre que possível
Extrair dados de entrada/saída e mensagens em constantes
Quebrar a lógica [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=366&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><strong>Resumo</strong></p>
<p style="text-align:justify;">Eu tenho apenas 5 meses de experiência com WATIR, mas já me convenci de certas práticas de utilização que considero boas, e que de alguma forma estão trazendo resultados positivos.</p>
<p style="text-align:justify;">Vale lembrar que são todas baseadas no bom-senso.</p>
<p style="text-align:justify;"> </p>
<hr /><a name="boas0"></a></p>
<p style="text-align:justify;"><strong>Conteúdo</strong></p>
<ol>
<li><a href="#boas1">Utilizar sempre a interface Watir::Browser</a></li>
<li><a href="#boas2">Buscar componentes HTML por id sempre que possível</a></li>
<li><a href="#boas3">Extrair dados de entrada/saída e mensagens em constantes</a></li>
<li><a href="#boas4">Quebrar a lógica em métodos privados para promover reutilização</a></li>
<li><a href="#boas5">Isolar a discrepância entre IE e Firefox em métodos polimórficos usando o design pattern Strategy</a></li>
<li><a href="#boas6">Escrever no console mensagens de controle e andamento</a></li>
<li><a href="#boas7">Evitar ter de manipular mensagens pop-up javascript</a></li>
<li><a href="#boas8">Cuidado com inclusões de páginas</a></li>
<li><a href="#boas9">Recuperar mensagens de arquivos de texto</a></li>
<li><a href="#boas10">Ao testar inclusões com sucesso, realizar a limpeza depois</a></li>
</ol>
<p style="text-align:justify;"> </p>
<hr /><a name="boas1"></a></p>
<p style="text-align:justify;"><strong>1. Utilizar sempre a interface Watir::Browser</strong></p>
<p style="text-align:justify;">A partir da versão 1.6.2, foi introduzida a interface Watir::Browser, que veio para permitir o tratamento do browser genericamente, sem fazer referência a um browser específico como antigamente, quando eram instanciados objetos Watir::IE ou FireWatir::Firefox.</p>
<p style="text-align:justify;">É boa prática sempre instanciar objetos Watir::Browser, e deixar a definição de qual browser será utilizado fora de seu código-fonte, ou seja, esta decisão não deve ser hard-coded. Assim, pode-se alterar o browser a ser utilizado sem alterar o código-fonte, alavancando desta forma processos automáticos de execução de testes (como scripts ANT) alterarem o browser a ser testado em tempo de execução.</p>
<p style="text-align:justify;"> </p>
<p><a name="boas2"></a></p>
<p style="text-align:justify;"><strong>2. Buscar componentes HTML por <em>id </em>sempre que possível</strong></p>
<p style="text-align:justify;">Existem várias maneiras de se localizar um componente HTML em uma página, como se pode ver no link <a href="http://wiki.openqa.org/display/WTR/Methods+supported+by+Element" target="_blank">Methods Supported by Element.</a> Cada componente tem vários critérios de localização como <em>id</em>, <em>name</em>, <em>value</em>, <em>text</em>, <em>href</em>, <em>index</em>, <em>xpath</em>, <em>class</em>&#8230;</p>
<p style="text-align:justify;">No entanto, cada um destes critérios tem um motivo de estar sendo usado &#8211; e este motivo pode precisar de flexibilidade.</p>
<p style="text-align:justify;">Por exemplo, o critério <em>name</em> representa o nome deste componente em um formulário, e isto comumente é utilizado para refletir em propriedades de form beans do lado do servidor. Ou seja, pode ser um reflexo de uma lógica de negócio &#8211; que PODE MUDAR FACILMENTE!</p>
<p style="text-align:justify;">Outros exemplos:</p>
<ul style="text-align:justify;">
<li>o critério <em>href </em>representa uma URL &#8211; que PODE MUDAR FACILMENTE!</li>
<li>o critério <em>text </em>representa texto de página &#8211; que PODE MUDAR FACILMENTE!</li>
<li>o critério <em>value </em>representa o valor padrão de um componente &#8211; que PODE MUDAR FACILMENTE!</li>
</ul>
<p style="text-align:justify;">Todavia, o <em>id </em>não tem motivos para mudar facilmente assim, pois seu propósito é geralmente apenas identificar um componente HTML, o que teoricamente não sofre implicações da lógica de negócio. Portanto, é vantajoso localizar programaticamente por <em>id</em>, sempre que possível.</p>
<p style="text-align:justify;">Se o componente desejado não houver atributo <em>id</em>, criá-lo não causará impacto algum na página (ENTRETANTO, verifique se o <em>id </em>desejado já não foi utilizado em sua página ou em alguma página incluída dela). Recomendação: escolha o <em>id </em>longo, claro e baseado no propósito do componente, de forma a não sobrarem motivos para dar este mesmo <em>id </em>a outro componente.</p>
<p style="text-align:justify;">Ao mesmo tempo, essa prática de utilizar <em>id </em>em todos os componentes promove outro aspecto: melhora a legibilidade do código HTML, identificando cada componente quanto a seu propósito.</p>
<p style="text-align:justify;"> </p>
<p><a name="boas3"></a></p>
<p style="text-align:justify;"><strong>3. Extrair dados de entrada/saída e mensagens em constantes</strong></p>
<p style="text-align:justify;">Dados de entrada e saída de um teste geralmente não mudam durante sua execução. Nem mensagens  esperadas de sucesso ou falha.</p>
<p style="text-align:justify;">Desta forma, é uma boa prática extraí-los para constantes globais e colocar todos no início do código. Assim ganhamos performance, legibilidade e reuso.</p>
<p style="text-align:justify;">Constantes em Ruby são definidas simplesmente como variáveis que iniciam com letra maiúscula. Aqui no exemplo também começam com $ pois são globais.</p>
<p><strong>Antes:</strong></p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">-------------------- test.rb
# requires
require "test/unit"
require "watir"
require "watir/testcase"

##
# Test case for sign up scenarios
# @author Tiago Romero Garcia
#
class Test &lt; Watir::TestCase

  # Method for setting up a test method
  def setup
    @browser = Watir::Browser.start "http://localhost/myapp/index.jsp"
    @browser.maximize
  end

  # (...)

  # Method for testing sign up
  def test_sign_up

    # (...)       

    # tries to sign up
    @browser.text_field(:id, "emailId").set("test@provider.com")
    @browser.text_field(:id, "passwordId").set("testing")
    @browser.text_field(:id, "confirmPasswordId").set("testing")
    @browser.button(:name, "register").click

    # (...)

    # checks if sign up was successful
    test_condition = @browser.text.include?("Thank you for signing up")
    fail_message = "It should show this message:\n" +
                   "- Thank you for signing up"
    assert(test_condition, fail_message)

    # (...)

  end

  # (...) 

end
-------------------- end of test.rb</pre>
<p><strong>Depois:</strong></p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">-------------------- test.rb
# requires
require "test/unit"
require "watir"
require "watir/testcase"

# set variables
$Index_page = "http://localhost/myapp/index.jsp"
$New_email = "test@provider.com"
$New_password = "testing"

# messages
$Success_message = "Thank you for signing up"

# (...)

##
# Test case for sign up scenarios
# @author Tiago Romero Garcia
#
class Test &lt; Watir::TestCase

  # Method for setting up a test method
  def setup
    @browser = Watir::Browser.start $Index_page
    @browser.maximize
  end

  # (...)

  # Method for testing sign up
  def test_sign_up

    # (...)

    # tries to sign up
    @browser.text_field(:id, "emailId").set($New_email)
    @browser.text_field(:id, "passwordId").set($New_password)
    @browser.text_field(:id, "confirmPasswordId").set($New_password)
    @browser.button(:name, "register").click

    # (...)

    # checks if sign up was successful
    test_condition = @browser.text.include?($Success_message)
    fail_message = "It should show this message:\n" +
                   "- " + $Success_message
    assert(test_condition, fail_message)

    # (...)

  end

  # (...)

end
-------------------- end of test.rb</pre>
<p> <br />
<a name="boas4"></a></p>
<p style="text-align:justify;"><strong>4. Quebrar a lógica em métodos privados para promover reutilização</strong></p>
<p style="text-align:justify;">Esta prática é bem conhecida e utilizada em outras plataformas, e aqui não tem nada de novo: é boa prática que o desenvolvedor identifique blocos de código repetitivos, e extraia tais blocos em métodos privados que serão chamados por outros.</p>
<p style="text-align:justify;">Blocos de código repetitivos comuns em scripts WATIR: ação de login, ação de logoff, ação de clicar em um botão ou link e testar se houve sucesso, ação de preencher um determinado formulário e testar se houve sucesso, ação de aceitar a falta de certificado quando estiver usando HTTPS, etc.</p>
<p style="text-align:justify;">Mesmo que inicialmente não haja outros métodos chamando um bloco de código potencialmente repetitivo, ainda pode ser bom extrair para um método por motivos de legibilidade e mantenibilidade do código.</p>
<p style="text-align:justify;"> </p>
<p><a name="boas5"></a></p>
<p style="text-align:justify;"><strong>5. Isolar a discrepância entre IE e Firefox em métodos polimórficos usando o design pattern Strategy<br />
</strong></p>
<p style="text-align:justify;">A versão 1.6.2 introduziu um grau de proximidade nunca antes alcançado entre o código feito para o IE e Firefox. Entretanto, muitos detalhes ainda são dependentes de browser, principalmente devido ao modo pelo qual WATIR se comunica com cada browser (IE usa a API do Windows e Firefox usa o plugin JSSH).</p>
<p style="text-align:justify;">Desta forma, para determinadas operações, teremos que construir código específico de browser, como manipulação de pop-ups e DOM.</p>
<p style="text-align:justify;">Mesmo assim, é possível evitar de, para um mesmo teste, construir um test case para IE e outro para Firefox. A solução é simples: aplicação do design pattern Strategy (Estratégia).</p>
<p style="text-align:justify;">Para isto, basta fazer o seguinte:</p>
<ol style="text-align:justify;">
<li>Definir a Estratégia: Definir um método polimórfico que invocará a operação específica de browser, que será invocado na classe do test case. Lembre-se que em Ruby não existem interfaces como em Java, portanto para isto funcionar, basta escrever da mesma forma este método polimórfico nas classes que implementarem a Estratégia.</li>
<li>Escrever as Estratégias: Criar as classes que irão conter o código específico de browser, dentro do método polimórfico anteriormente definido (implementação da Estratégia).</li>
<li>Usar a Estratégia: Agora, a classe do test case deverá construir ou receber um objeto de uma classe que implementou a Estragégia. Com este objeto, invocar o método polimórfico ao invés dos trechos de código específico de browser.</li>
</ol>
<p style="text-align:justify;">Exemplo:</p>
<p style="text-align:justify;"><span style="text-decoration:underline;">1. Definir a Estratégia:</span> é necessário um método para clicar em um botão que exibirá um popup em javascript, e checar se este popup possui uma determinada mensagem. Nosso método será:</p>
<pre style="text-align:justify;">clickAndCheckPopup(message)</pre>
<p style="text-align:justify;"><span style="text-decoration:underline;">2. Escrever as Estratégias:</span> escreveremos 2 classes para manipular código específico, uma para IE e outra para Firefox:</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">-------------------- ie_handler.rb
require "Win32API"
require 'dl/import'
require 'dl/struct'
require "watir/win32"
require "watir/contrib/enabled_popup"

##
# Handler for IE-specific code (strategy design pattern).
# Its goal is to promove independency to test cases.
# They shall not know particularities from browsers.
#
# @author Tiago Romero Garcia
#
class IEHandler

private

  # Method for investigating a popup
  def popup_checker(button_text, message, waitTime=9)
    # get a handle if one exists
    hwnd = @browser.enabled_popup(waitTime)
    if (hwnd)  # yes there is a popup
      w = WinClicker.new

      # I put this in to see the text being input it is not necessary
      # to work "OK" or whatever the name on the button is
      test_condition = w.getStaticText_hWnd(hwnd).include?(message)
      w.clickWindowsButton_hwnd( hwnd, "#{button_text}" )

      # this is just cleanup
      w=nil    

      return test_condition
    end
  end

public

  def initialize(browser)
    @browser = browser
  end

  def clickAndCheckPopup(message)
    @browser.button(:id, "myButtonId").click_no_wait
    puts "Clicked on my button"

    popup_checker("OK", message, 7)
  end    

end
-------------------- end of ie_handler.rb

-------------------- firefox_handler.rb
require "test/unit"

##
# Handler for Firefox-specific code (strategy design pattern).
# Its goal is to promove independency to test cases.
# They shall not know particularities from browsers.
#
# @author Tiago Romero Garcia
#
class FirefoxHandler

public

  def initialize(browser)
    @browser = browser
  end

  def clickAndCheckPopup(message)
    @browser.startClicker("OK")
    @browser.button(:id, "myButtonId").click
    puts "Clicked on my button"

    popupText = @browser.get_popup_text
    popupText.include?(message)
  end    

end
-------------------- end of firefox_handler.rb</pre>
<p><span style="text-decoration:underline;">3. Usar a Estratégia:</span> a classe do test case ficará assim:</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;"># requires
require "test/unit"
require "watir"
require "watir/testcase"
require "tests/extras/ie_handler"
require "tests/extras/firefox_handler"

# set variables
$Index_page = "http://localhost/jsp/index.jsp"

$Success_message= "Sucessfully operation!"

##
# My test case
# @author Tiago Romero Garcia
#
class MyTest &lt; Watir::TestCase

# Define private methods
private    

  # Method for setting up a test method
  def setup
    puts "------------------------------------------------------------"
    @browser = Watir::Browser.start $Index_page
    @browser.maximize

    if @browser.kind_of?Watir::IE
      @browser_handler = IEHandler.new @browser
    else
      @browser_handler = FirefoxHandler.new @browser
    end
  end

  # Method for tearing down a test method
  def teardown
    @browser.close
  end

  # (...)  

# Define public methods
public      

  # Method for testing my stuff
  def test_my_stuff
    puts "TEST METHOD BEGIN - My stuff"

    # (...)

    test_condition = @browser_handler.clickAndCheckPopup $Success_msg
    fail_message = "It should show this string:" +
                   "\n-" + $Success_msg
    assert(test_condition, fail_message)    

    # (...)

    puts "TEST METHOD END WITH SUCCESS - My stuff"
  end

  # (...)

end</pre>
<p> <br />
<a name="boas6"></a></p>
<p style="text-align:justify;"><strong>6. Escrever no console mensagens de controle e andamento</strong></p>
<p style="text-align:justify;">Geralmente, para todo processo em lote é interessante exibir mensagens de controle e andamento (log). As principais vantagens dessa prática são:</p>
<ul style="text-align:justify;">
<li>Em caso de erro, saber qual o ponto da execução que originou o problema.</li>
<li>Ter mais detalhes ao acompanhar a execução do processo &#8220;ao vivo&#8221;.</li>
<li>Documentar todos os passos do processo.</li>
</ul>
<p style="text-align:justify;">Portanto, é boa prática escrever no console mensagens de texto detalhando o que acabou de ser feito. Isto é especialmente útil após ações como: carregar uma página, clicar em botão ou link, enviar formulário, escolher dentre uma lista de seleção, etc.</p>
<p><a name="boas7"></a><br />
<strong>7. Evitar ter de manipular mensagens pop-up javascript</strong></p>
<p style="text-align:justify;">Mensagens pop-up javascript contendo texto são uma fonte de problemas, quando se deseja compatibilidade plena entre IE e Firefox. Isto se dá pois cada browser manipula de forma diferente seus pop-ups, e ainda assim em momentos diferentes!</p>
<p style="text-align:justify;">Por exemplo, na boa prática n° 5, o código para IE dentro de<em> ie_handler.rb</em> executa um programa externo ao browser que será um listener de pop-ups javascript. Possui uma vantagem: consegue capturar pop-ups mesmo que o browser mude de página.</p>
<p style="text-align:justify;">Já o trecho para Firefox dentro de<em> firefox_handler.rb</em> realiza o listening dentro do código. Este não consegue capturar pop-ups se o browser mudar de página.</p>
<p style="text-align:justify;">A boa prática aqui é evitar o máximo possível de se usar este critério para avaliar os resultados de um teste. Em caso de ser uma mensagem revelando o resultado de algum processamento, verifique se após este processamento a página sofrerá alguma alteração. Se sofrer, ao invés de avaliar a mensagem do pop-up, pode-se avaliar se a página sofreu tal alteração.</p>
<p style="text-align:justify;"><strong><br />
</strong></p>
<p><a name="boas8"></a></p>
<p style="text-align:justify;"><strong>8. Cuidado com inclusões de páginas</strong></p>
<p style="text-align:justify;">Sites programados em linguagens de scripting server-side como JSP e PHP permitem a inclusão de páginas em outras. Esta é uma prática muito utilizada, especialmente para a reutilização de trechos estáticos do site como menu, cabeçalho e rodapé.</p>
<p style="text-align:justify;">Entretanto, isto pode bagunçar demais a cabeça do programador WATIR, pois pode ser que alguma página incluída tenha tags com as mesmas características que tags na página que as inclui. Assim, ao procurar por tags na página, pode ser que WATIR encontre primeiro tags das páginas incluídas! </p>
<p style="text-align:justify;">As boas práticas para evitar este problema são:</p>
<ul style="text-align:justify;">
<li>Quando lidar com páginas que incluam outras páginas, verifique o HTML gerado no browser se a tag que você quer achar será realmente identificada pelo critério que você escolheu. Exiba o código-fonte do browser e faça uma busca no texto para ver se não encontra outras tags com o mesmo critério.</li>
<li>Escreva tags com ids realmente &#8220;identificadores&#8221;, ou seja, que descrevam realmente o propósito da tag, mesmo que seja um nome longo. Por exemplo, ao invés de fazer
<pre>&lt;input type="text" id="name"&gt;</pre>
<p>prefira fazer</p>
<pre>&lt;input type="text" id="signupFormName"&gt;</pre>
<p style="text-align:justify;">Assim, você reduz a chance de acontecerem problemas assim.</p>
</li>
</ul>
<p style="text-align:justify;"> </p>
<p><a name="boas9"></a></p>
<p style="text-align:justify;"><strong>9. Recuperar mensagens de arquivos de texto<br />
</strong></p>
<p style="text-align:justify;">Aplicações web podem recuperar mensagens de arquivos de texto ou arquivos properties, principalmente quando utiliza-se internacionalização (i18n). Quando for este caso, é uma boa prática recuperar as mensagens diretamente destes arquivos, e não escrevê-las novamente na classe de teste. Quanto menos <em>hard-coded</em> puderem ser as mensagens, melhor!</p>
<p style="text-align:justify;">Eu utilizo para isto a seguinte classe leitora de arquivos properties de java, disponível <a href="http://devender.wordpress.com/2006/05/01/reading-and-writing-java-property-files-with-ruby/" target="_blank">neste link</a>. Agradeço a Devender Gollapally por permitir a reprodução e utilização de seu código aqui.</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">-------------------- java_props.rb
#
# Class for handling java-style properties files
# Author: Devender Gollapally
# From: http://devender.wordpress.com/2006/05/01/reading-and-writing-
java-property-files-with-ruby/
#
class JavaProps
  attr_reader :file, :properties

  #Takes a file and loads the properties in that file
  def initialize file
    @file = file
    @properties = {}
    IO.foreach(file) do |line|
      @properties[$1.strip] = $2
          if line =~ /([^=]*)=(.*)\/\/(.*)/ || line =~ /([^=]*)=(.*)/
    end
  end

  #Helpfull to string
  def to_s
    output = "File Name #{@file} \n"
    @properties.each {|key,value| output += " #{key}= #{value} \n" }
    output
  end

  #Write a property
  def write_property (key,value)
    @properties[key] = value
  end

  #Save the properties back to file
  def save
    file = File.new(@file,"w+")
    @properties.each {|key,value| file.puts " #{key}= #{value} \n" }
  end

end
-------------------- end of java_props.rb</pre>
<p style="text-align:justify;"> </p>
<p><a name="boas10"></a></p>
<p style="text-align:justify;"><strong>10. Ao testar inclusões com sucesso, realizar a limpeza depois</strong></p>
<p style="text-align:justify;">Quando é necessário testar uma página de inclusão, o fluxo principal deve ser testado, ou seja, uma inclusão deve ser feita com sucesso. Geralmente são utilizados dados de teste para isto.</p>
<p style="text-align:justify;">Isto tem uma contrapartida: os dados ficam armazenados no banco de dados, e isto representa lixo. Quanto mais vezes o teste for executado, mais lixo será gerado e assim vai&#8230;</p>
<p style="text-align:justify;">O ideal é que seja realizada uma limpeza imediatamente após o sucesso do teste. Deve ser projetada uma maneira segura para isto, que não coloque a integridade dos dados em risco.</p>
<p style="text-align:justify;">Uma possibilidade para isto é construir um processo de negócio para essa limpeza, e disponibilizar uma URL que delegue a chamada a este processo de negócio. Em uma arquitetura Java EE, o processo de negócio pode ser um método de um EJB, ou um serviço de um BusinessObject; e a URL pode chamar um servlet que invoque tal EJB ou BusinessObject.</p>
<p style="text-align:justify;">Sugiro as seguintes etapas:</p>
<ul style="text-align:justify;">
<li>Passagem por parâmetro da URL do identificador do dado recém-incluído</li>
<li>Autenticação do usuário de teste (ou do cliente que estiver chamando a URL)</li>
<li>Deleção do dado recém-incluído baseado no identificador</li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/366/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=366&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/02/10/10-boas-praticas-em-ruby-watirvari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>
	</item>
		<item>
		<title>Bacharel em Ciência da Computação!</title>
		<link>http://tiagoromero.wordpress.com/2009/01/14/bacharel-em-ciencia-da-computacao/</link>
		<comments>http://tiagoromero.wordpress.com/2009/01/14/bacharel-em-ciencia-da-computacao/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 18:59:52 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Ciência da Computação]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[bacharel]]></category>
		<category><![CDATA[formatura]]></category>
		<category><![CDATA[unifei]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=377</guid>
		<description><![CDATA[Olá! Antes de mais nada, feliz ano novo!
Fiquei 1 mês sem postar adequadamente devido a diversas ocupações que tive: SCWCD, Curso de EJB na SynOS, viagens de fim de ano e FORMATURA!
Finalmente, semana passada me formei Bacharel em Ciência da Computação! Nem é preciso dizer o tanto que teve bom. Depois de 5 anos ralando, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=377&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div id="attachment_378" class="wp-caption alignleft" style="width: 160px"><a href="http://tiagoromero.files.wordpress.com/2009/01/dsc02732.jpg"><img class="size-medium wp-image-378" title="Formado" src="http://tiagoromero.files.wordpress.com/2009/01/dsc02732.jpg?w=150&#038;h=196" alt="Formado" width="150" height="196" /></a><p class="wp-caption-text">Formado</p></div>
<p style="text-align:justify;">Olá! Antes de mais nada, feliz ano novo!</p>
<p style="text-align:justify;">Fiquei 1 mês sem postar adequadamente devido a diversas ocupações que tive: SCWCD, Curso de EJB na SynOS, viagens de fim de ano e FORMATURA!</p>
<p style="text-align:justify;">Finalmente, semana passada me formei Bacharel em Ciência da Computação! Nem é preciso dizer o tanto que teve bom. Depois de 5 anos ralando, cá estou bacharel.</p>
<p style="text-align:justify;">Agora de volta a rotina&#8230; Vou retomar alguns posts sobre Ruby WATIR e outras features que ando trabalhando. E também enviarei fotos de alguns lugares que visitei recentemente. :)</p>
<p style="text-align:justify;">Quem quiser ver fotos da formatura:</p>
<ul style="text-align:justify;">
<li><a href="http://picasaweb.google.com/tiagoromerogarcia/200901Formatura#" target="_blank">http://picasaweb.google.com/tiagoromerogarcia/200901Formatura#</a></li>
<li><a href="http://picasaweb.google.com/tabataaa/FormaturaDoTigo#" target="_blank">http://picasaweb.google.com/tabataaa/FormaturaDoTigo#</a></li>
<li><a href="http://picasaweb.google.com/rnmjunior/Formatura2008#" target="_blank">http://picasaweb.google.com/rnmjunior/Formatura2008#</a></li>
</ul>
<p style="text-align:justify;">Inté!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/377/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=377&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2009/01/14/bacharel-em-ciencia-da-computacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2009/01/dsc02732.jpg?w=225" medium="image">
			<media:title type="html">Formado</media:title>
		</media:content>
	</item>
		<item>
		<title>Como utilizar jssh_socket.send() para alterar o conteúdo de páginas no FireWatir</title>
		<link>http://tiagoromero.wordpress.com/2008/12/18/como-utilizar-jssh_socketsend-para-alterar-o-conteudo-de-paginas-no-firewatir/</link>
		<comments>http://tiagoromero.wordpress.com/2008/12/18/como-utilizar-jssh_socketsend-para-alterar-o-conteudo-de-paginas-no-firewatir/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 19:04:53 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[WATIR]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firewatir]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jssh]]></category>
		<category><![CDATA[watir]]></category>
		<category><![CDATA[whizzywig]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=313</guid>
		<description><![CDATA[Após 2 meses encarando o mesmo problema e bebendo muito café, finalmente consegui solucioná-lo, depois de muito desgaste e tentativas em vão,  e vou compartilhar o conhecimento convosco!
É o seguinte: trabalho em um projeto web e desenvolvo test cases em Ruby WATIR para a automação de testes de regressão.
E eis que fui incumbido de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=313&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Após 2 meses encarando o mesmo problema e bebendo muito café, finalmente consegui solucioná-lo, depois de muito desgaste e tentativas em vão,  e vou compartilhar o conhecimento convosco!</p>
<p align="justify">É o seguinte: trabalho em um projeto web e desenvolvo test cases em <a href="http://tiagoromero.wordpress.com/2008/10/20/ruby-watir/" target="_blank">Ruby WATIR</a> para a automação de testes de regressão.</p>
<p align="justify">E eis que fui incumbido de desenvolver o test case para uma determinada página de cadastro. Entretanto, tal página utiliza um componente de texto do tipo rich-text, que oferece certas funcionalidades de edição de texto, como formatação de fonte, parágrafo, cores de fundo, etc. Utilizamos uma biblioteca free para isto: <a href="http://www.unverse.net/whizzywig-cross-browser-html-editor.html" target="_blank">Whizzywig</a>.</p>
<p align="justify">Este componente é utilizado na nossa view como um componente HTML TEXTAREA, mas depois é executado um método em javascript que o transforma em um IFRAME criando uma nova sub-página com todas essas funcionalidades, da seguinte maneira:</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">&lt;textarea id="descriptionId" name="description"&gt;
   (...)
&lt;/textarea&gt;
&lt;script type="text/javascript"&gt;
   (...)
   makeWhizzyWig("descriptionId", "bold italic underline |
        left center right | number bullet indent outdent |
        undo redo | color hilite rule");
&lt;/script&gt;</pre>
<p align="justify">Nestas condições, para fazer o WATIR preencher o conteúdo deste componente, não é possível utilizar o seguinte código (considerando @browser como a instância de Watir::Browser):</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">@browser.text_field(:id, "descriptionId")</pre>
<p align="justify">Isto ocorre pois componentes rich-text têm a responsabilidade de escrever em HTML (para dar suporte à tais formatações), e para isto eles utilizam um IFRAME, e NÃO É POSSÍVEL PERMITIR AO USUÁRIO ESCREVER DIRETAMENTE NUM IFRAME. A mágica que ele faz para isto é a seguinte: é configurado um listener de teclado no IFRAME, e a cada tecla pressionada, ele programaticamente &#8220;digita&#8221; esta tecla no IFRAME, ou seja, ele escreve em seu conteúdo utilizando o DOM de sua página. O componente engana tão bem, que até tem o cursor de texto piscando à medida que o usuário &#8220;digita&#8221;.</p>
<p align="justify">Isto pode ser lindo, mas impossibilita nosso querido WATIR a setar o conteúdo deste campo TEXTAREA!</p>
<p align="justify">A solução que encontrei é navegar programaticamente até o conteúdo do IFRAME e alterar diretamente lá.</p>
<p align="justify">No Internet Explorer, eu naveguei no conteúdo HTML gerado (através do plugin IE Developer Toolbar) e consegui fazer isto sem muito esforço:</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">@browser.
      frame(:id, "whizzydescriptionId").
      locate_tagged_element("body", :id, "descriptionId").
      innerText = $Description</pre>
<p align="justify">Isto é possível pois o Internet Explorer é acessado pelo WATIR através da API do Windows.</p>
<p align="justify"><img class="alignleft size-medium wp-image-314" title="cafe" src="http://tiagoromero.files.wordpress.com/2008/12/0x0_642907.jpg?w=200&#038;h=154" alt="cafe" width="200" height="154" />Agora, no Firefox, a história já é completamente diferente! Pois o mesmo é acessado pelo WATIR através de um plugin chamado <a href="http://www.croczilla.com/jssh" target="_blank">JSSH</a>. Esse plugin abre uma sessão em um terminal, e responde a comandos próprios (que permitem mais ou menos utilizar javascript). O FireWatir trabalha enviando comandos via socket ao plugin JSSH do Firefox, que se encarrega de realizar o trabalho sujo com o browser.</p>
<p align="justify">Primeiramente, eu tentei utilizar todas as formas possíveis de javascripts para alterar o DOM da página em exibição, mas isto não alterava a página em tempo de execução, mas sim em uma nova página gerada.</p>
<p align="justify">Depois de muito quebrar a cabeça, mergulhei na API do JSSH (que tem documentação fraca), abri um terminal e comecei a tentar de tudo, comando por comando, até que uma hora cheguei à solução! E consegui alterar o conteúdo do IFRAME em tempo de execução, manipulando seu DOM!</p>
<p align="justify">O código que utilizei foi o seguinte:</p>
<pre style="background-color:#ffffff;border:thin solid #000000;padding:5px;">@browser.
      jssh_socket.send(
          "#{FireWatir::Firefox::DOCUMENT_VAR}.
          getElementsByTagName('iframe')[0].contentDocument.
          body.innerHTML = '" + $Description + "';\n", 0)
@browser.read_socket()</pre>
<p align="justify">O que ele faz é o  seguinte: envia um comando para o JSSH via socket, e depois lê a resposta socket (este comando não tem resposta, mas esta chamada é necessária, é como se fosse um flush).</p>
<p align="justify">Para localizar o objeto referente ao browser em execução, utilizamos a constante #{FireWatir::Firefox::DOCUMENT_VAR}. A partir daí entramos na API do JSSH, e navegando por vários atributos, chegamos a poder setar o conteúdo do IFRAME. Ufa!</p>
<p align="justify">Espero que isto seja útil a alguém! :)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/313/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=313&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2008/12/18/como-utilizar-jssh_socketsend-para-alterar-o-conteudo-de-paginas-no-firewatir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2008/12/0x0_642907.jpg?w=200" medium="image">
			<media:title type="html">cafe</media:title>
		</media:content>
	</item>
		<item>
		<title>Sun Certified Web Component Developer for the Java 2 Platform, Enterprise Edition</title>
		<link>http://tiagoromero.wordpress.com/2008/12/16/sun-certified-web-component-developer-for-the-java-2-platform-enterprise-edition/</link>
		<comments>http://tiagoromero.wordpress.com/2008/12/16/sun-certified-web-component-developer-for-the-java-2-platform-enterprise-edition/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 23:33:56 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Certificação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[el]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[jstl]]></category>
		<category><![CDATA[scwcd]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=308</guid>
		<description><![CDATA[Como eu havia dito no post anterior Livro Head First Servlets &#38; JSP, eu passei 1 mês me preparando para realizar a prova de certificação Sun Certified Web Component Developer for the Java 2 Platform, Enterprise Edition (SCWCD). Eu realizei a prova hoje e felizmente fui aprovado com 81%! :)
E vou contar nesse post como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=308&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Como eu havia dito no post anterior <a href="http://tiagoromero.wordpress.com/2008/12/10/livro-head-first-servlets-jsp/">Livro Head First Servlets &amp; JSP</a>, eu passei 1 mês me preparando para realizar a prova de certificação <a href="http://www.sun.com/training/certification/java/scwcd.xml" target="_blank">Sun Certified Web Component Developer for the Java 2 Platform, Enterprise Edition (SCWCD)</a>. Eu realizei a prova hoje e felizmente fui aprovado com 81%! :)</p>
<p style="text-align:justify;">E vou contar nesse post como que foi.</p>
<dl class="wp-caption alignleft">
<dt class="wp-caption-dt"><img class="size-full wp-image-309" title="SCWCD" src="http://tiagoromero.files.wordpress.com/2008/12/scwcd_logo.jpg?w=183&#038;h=125" alt="SCWCD" width="183" height="125" /></dt>
</dl>
<p style="text-align:justify;">Em primeiro lugar, eu já venho trabalhando com servlets e JSPs desde junho. E já tive experiência anterior com servlets. Isto me ajudou bastante para fixar o conteúdo.</p>
<p style="text-align:justify;">Apesar de ter feito a versão mais nova dessa certificação, referente à versão 5 do JEE, eu li o Head First Servlets referente à versão 1.4 e consegui fazer a prova numa boa! Segundo Bryan Basham, co-autor da prova e também do livro mencionado, as <a href="http://excusemeworld.com/sun-java-certifications/scwcd-14-vs-scwcd-15-scwcd-5-differences/" target="_blank">diferenças entre as 2 últimas versões</a> são as seguintes:</p>
<ol style="text-align:justify;">
<li>Não há diferenças nos objetivos do exame entre as versões.</li>
<li>O novo exame (SCWCD 5) é ainda baseado na versão J2EE 1.4 (com Servlet 2.5 e JSP 2.0). Os novos tópicos adicionados ou atualizados são: JSTL tags, dynamic attributes e um pouco mais de SingleThreadModel.</li>
<li>O exame SCWCD 5 não possui questões relacionadas a JSF, mas SCWCD 6 possuirá.</li>
<li>O exame SCWCD 5 tem questões baseadas em performance, diferentemente do teórico exame SCWCD 1.4.</li>
</ol>
<p style="text-align:justify;">Após ler o livro (e reler pontos que não tinham ficado muito claros), eu li bastante um ótimo resumo publicado por Daniel Martins em um artigo em <a href="http://blog.danielfmartins.com/" target="_blank">seu blog</a>, disponível <a href="http://blog.danielfmartins.com/artigos/" target="_blank">nesta página</a>.</p>
<p style="text-align:justify;">Depois disso, tirei o restante do tempo antes da prova em fazer vários simulados (os famosos mocks). Nos seguintes links há vários mocks bacanas, e melhor, FOR FREE (evite mocks do SCWCD da versão J2EE 1.3, eles podem confundir a cabeça):</p>
<ul style="text-align:justify;">
<li><a href="http://www.jdiscuss.com" target="_blank">http://www.jdiscuss.com/</a></li>
<li><a href="http://www.examulator.com/" target="_blank">http://www.examulator.com/</a></li>
<li><a href="http://faq.javaranch.com/java/ScwcdLinks" target="_blank">http://faq.javaranch.com/java/ScwcdLinks</a></li>
</ul>
<p style="text-align:justify;">No dia anterior, eu preferi não ocupar muito a minha cabeça e fiz apenas o coffee cream mock do final do livro Head First.</p>
<p style="text-align:justify;">E é isso aí. Ano que vem vamos ver se eu começo a estudar pras provas de SCBCD e SCEA :)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/308/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=308&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2008/12/16/sun-certified-web-component-developer-for-the-java-2-platform-enterprise-edition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2008/12/scwcd_logo.jpg" medium="image">
			<media:title type="html">SCWCD</media:title>
		</media:content>
	</item>
		<item>
		<title>Livro Head First Servlets &amp; JSP</title>
		<link>http://tiagoromero.wordpress.com/2008/12/10/livro-head-first-servlets-jsp/</link>
		<comments>http://tiagoromero.wordpress.com/2008/12/10/livro-head-first-servlets-jsp/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 19:35:12 +0000</pubDate>
		<dc:creator>Tiago</dc:creator>
				<category><![CDATA[Certificação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[el]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[jstl]]></category>
		<category><![CDATA[scwcd]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://tiagoromero.wordpress.com/?p=297</guid>
		<description><![CDATA[Faz tempo que não posto, é porque estou me preparando para realizar a certificação SCWCD (Sun Certified Web Component Developer) e estou lendo este ótimo livro: Head First Servlets &#38; JSP. Os autores do livro são co-autores da prova de certificação.
O livro cobre todo o conteúdo da prova de uma maneira bem-humorada  e não-cansativa.
Confesso que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=297&subd=tiagoromero&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><a title="Head First Servlets &amp; JSP" href="http://tiagoromero.files.wordpress.com/2008/12/headfirst.jpg" target="_blank"><img class="size-medium wp-image-298 alignleft" title="Head First Servlets &amp; JSP" src="http://tiagoromero.files.wordpress.com/2008/12/headfirst.jpg?w=200&#038;h=232" alt="Head First Servlets &amp; JSP" width="200" height="232" /></a>Faz tempo que não posto, é porque estou me preparando para realizar a certificação <a href="http://www.sun.com/training/certification/java/scwcd.xml" target="_blank">SCWCD (Sun Certified Web Component Developer)</a> e estou lendo este ótimo livro: Head First Servlets &amp; JSP. Os autores do livro são co-autores da prova de certificação.</p>
<p style="text-align:justify;">O livro cobre todo o conteúdo da prova de uma maneira bem-humorada  e não-cansativa.</p>
<p style="text-align:justify;">Confesso que virei fã da série Head First. A maneira que os conceitos são apresentados é muito interessante, o livro utiliza de recursos como personagens, diálogos, cenários da vida real, lembretes e outras coisas doidas e até mesmo idiotas que fazem o gosto de quem estuda computação.</p>
<p style="text-align:justify;">Realmente atingem o efeito de fixar o conceito e também fazem muitas divagações acerca do que é ensinado. Também tem muitos exercícios práticos e é necessário exercitar muito a imaginação.</p>
<p style="text-align:justify;">Uma dica: como qualquer livro de TI e computação, prefira sempre ler em <strong>inglês</strong>, pois traduções quase nunca ficam 100%, e além disso você já se acostuma com os termos utilizados na prova de certificação.</p>
<p style="text-align:justify;">Link para leitura on-line completa do livro: <a href="http://books.google.com.br/books?id=WoA3F0UQfvQC" target="_blank">http://books.google.com.br/books?id=WoA3F0UQfvQC</a></p>
<p style="text-align:justify;">Link para a compra do livro na Amazon: <a href="http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596005407" target="_blank">http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596005407</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagoromero.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagoromero.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagoromero.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagoromero.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagoromero.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagoromero.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagoromero.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagoromero.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagoromero.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagoromero.wordpress.com/297/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagoromero.wordpress.com&blog=5092458&post=297&subd=tiagoromero&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://tiagoromero.wordpress.com/2008/12/10/livro-head-first-servlets-jsp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5cac784a074b86d771fe768274f6860c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago</media:title>
		</media:content>

		<media:content url="http://tiagoromero.files.wordpress.com/2008/12/headfirst.jpg?w=200" medium="image">
			<media:title type="html">Head First Servlets &#38; JSP</media:title>
		</media:content>
	</item>
	</channel>
</rss>