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

<channel>
	<title>Blog do Rafa</title>
	<atom:link href="http://blog.rafaelmanoel.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rafaelmanoel.com.br</link>
	<description>Blog sobre tecnologia mobile e desenvolvimento de software</description>
	<lastBuildDate>Tue, 29 May 2012 21:37:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Automação do processo de deployment</title>
		<link>http://blog.rafaelmanoel.com.br/automacao-do-processo-de-deployment/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=automacao-do-processo-de-deployment</link>
		<comments>http://blog.rafaelmanoel.com.br/automacao-do-processo-de-deployment/#comments</comments>
		<pubDate>Tue, 29 May 2012 21:20:40 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=152</guid>
		<description><![CDATA[Já dizia um grande amigo meu: &#8220;Tudo na vida deve ser simples, a única coisa que tem licença para ser complexa é justamente o como tornar algo mais simples&#8221;. E no mundo de TI isso não é diferente, aliás, é ainda mais evidente. Quem já está há mais de 10 nos no mercado de trabalho, [...]]]></description>
			<content:encoded><![CDATA[<p>Já dizia um grande amigo meu: &#8220;Tudo na vida deve ser simples, a única coisa que tem licença para ser complexa é justamente o como tornar algo mais simples&#8221;. E no mundo de TI isso não é diferente, aliás, é ainda mais evidente.</p>
<p>Quem já está há mais de 10 nos no mercado de trabalho, provavelmente viu a máxima &#8220;convention over configuration&#8221; assassinar muitos XMLs e configurações desnecessárias; a época do &#8220;deve ser tudo customizável&#8221;, foi substituída por: &#8220;me dê um padrão que eu altero o que precisar&#8221;, e consequentemente aquele Dinossauro chamado Enterprise JavaBeans 2.X foi extinto (ok, ok, ainda deve existir algum exemplar em algum oceano beeeem profundo).</p>
<p>Depois veio o Rails com sua facilidade e simplicidade comovente e todos da comunidade Java começaram a se perguntar: &#8220;Será que precisa ser tudo tão complexo e burucrático ? &#8220;, e mais uma revolução veio e mudou inclusive a forma de pensarmos. Entretanto algumas coisas que fazemos ainda são jurássicas, exemplo: Deploy em produção!</p>
<p>Duas coisas na nossa vida que deveriam ser extremamente fáceis, e dificilmente o são (pelo menos em todos os lugares que eu trabalhei): Buildar o projeto na sua máquina e fazer o deploy em produção.</p>
<p>Quando um funcionário novo começa a trabalhar, tudo o que ele deveria fazer é baixar o código do SCM (subversion, git, etc.), dar um comando, ou um clique e estar pronto para contribuir escrevendo código. Traduzindo para o mundo Git + Java:</p>
<pre class="wp-code-highlight prettyprint">
git clone projeto_que_vou_contribuir
cd projeto_que_vou_contribuir
mvn clean install (ou ainda melhor: mvn clean tomcat:run)
</pre>
<p><em>e voilá!</em></p>
<p>Idealmente, o processo de deploy também deve ser simples, rápido, indolor e de fácil rollback, porque todos nós sabemos: &#8220;shit happens&#8221;. Sou adepto da filosofia &#8220;one click to rule them all&#8221;, ou seja, apenas um passo para ter tudo pronto. Claro, o processo de deploy depende muito de empresa para empresa, da tecnologia utilizada, se o dev tem acesso ao ambiente de produção ou não e mais uma porrada de outras variáveis, porém o importante é seguir a máxima: &#8220;1 clique para fazer o deploy&#8221;.</p>
<p>Nessa linha, recentemente li um livro que me ajudou muito: <a href="http://www.wakaleo.com/books/jenkins-the-definitive-guide" target="_blank">Jenkins the definitive guide</a>. Ok, sempre imaginei que o jenkins é completamente intuitivo de se usar e que não precisa de um livro, mas este livro conseguiu me supreender. Após a leitura comecei a ter várias idéias de como automatizar ainda mais o processo de deployment no meu trabalho, e acredito que cheguei em um panorama bem interessante, um passo importantíssimo rumo ao &#8220;continuous deployment&#8221; e que eu vou descrever os pontos mais importantes:</p>
<ul>
<li>Ter 1 job para fazer checkout do codigo no scm e gerar o artefato do maven (.war, .ear, etc.)</li>
<li>Ter 1 job separado para copiar o artefato do job anterior e fazer o deploy no artifactory</li>
<li>Ter X jobs (onde X é o número de servidores em prod) para copiar o artefato deployado no artifactory e fazer o deploy no servidor (tomcat no meu caso)</li>
<li>Ter 1 Jobs para fazer rollback (que chama os outros X jobs do passo anterior especificando uma versão).</li>
</ul>
<p>E para startar toda essa pilha de jobs, tudo o que preciso é fazer um git-push no meu branch <strong>production</strong>.</p>
<p><strong>Prós desta abordagem:</strong></p>
<ul>
<li>&#8220;1-click build&#8221;. Com apneas um push no branch production qualquer dev é capaz de fazer um deploy em prod, sem mesmo ter acesso ao ambiente de produção.</li>
<li>Temos no branch production o código exatamente como ele está em produção, para eventual bugtracking ou analise.</li>
<li>Fácil rollback. Com um clique, pela interface do jenkins é possível disparar um rollback</li>
<li>Rastreabilidade: pelo jenkins consigo saber exatamente o que está em produção.</li>
<li>Simplicidade</li>
</ul>
<p>Obviamente ainda há o que melhorar, como por exemplo uma forma de externalizar as configurações de ambiente, para que o mesmo WAR que vai para o ambiente de teste também vá para a produção, mas acredito que esse foi um importante passo. Inclusive, gostaria de deixar uma dica:</p>
<p>O dia que você se acomodar com a sua forma de trabalhar e parar de pensar em como poderia otimizar ainda mais o seu trabalho, duas coisas podem ter acontecido: Você perdeu a paixão pelo que faz e se tornou algum comum, ou você atingiu o nirvana.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/automacao-do-processo-de-deployment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Livros recomendados</title>
		<link>http://blog.rafaelmanoel.com.br/livros-recomendados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=livros-recomendados</link>
		<comments>http://blog.rafaelmanoel.com.br/livros-recomendados/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 01:23:24 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=146</guid>
		<description><![CDATA[No começo do ano um amigo foi para os States e me trouxe (obviamente após eu muito implorar) um Kindle. Devo dizer que o dispositivo é sensacional (mesmo ainda não sendo a versão touch ou com andróid que saiu recentemente) e que eu nunca li tantos livros como tenho lido ultimamente. &#160; Portanto, nada mais [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.rafaelmanoel.com.br/wp-content/uploads/2011/10/1304480337-19.jpg"><img class="alignleft size-medium wp-image-148" title="Leitura" src="http://blog.rafaelmanoel.com.br/wp-content/uploads/2011/10/1304480337-19-300x260.jpg" alt="Leitura" width="300" height="260" /></a>No começo do ano um amigo foi para os States e me trouxe (obviamente após eu muito implorar) um Kindle. Devo dizer que o dispositivo é sensacional (mesmo ainda não sendo a versão touch ou com andróid que saiu recentemente) e que eu nunca li tantos livros como tenho lido ultimamente.</p>
<p>&nbsp;</p>
<p>Portanto, nada mais justo do que uma recomendação dos últimos livros que li e que julgo serem fundamentais para qualquer programador que queira melhorar a qualidade do seu trabalho, ou melhor, da sua arte.</p>
<p>&nbsp;</p>
<ul>
<li><a title="Effective Java 2nd. Ed." href="http://www.amazon.com/gp/product/0321356683/ref=pd_lpo_k2_dp_sr_1?pf_rd_p=1278548962&amp;pf_rd_s=lpo-top-stripe-1&amp;pf_rd_t=201&amp;pf_rd_i=0201310058&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=1NFWYPX9XMZF1098FBK4" target="_blank">Effective Java 2nd. Edition</a> - Fundamental para qualquer programador java. (ponto !)</li>
</ul>
<ul>
<li><a title="Clean Code" href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1317777355&amp;sr=1-1" target="_blank">Clean Code</a> - Gostei muito deste livro. O Autor, Uncle Bob, escreve muito bem e é super didático em seus textos. Há algumas polêmicas, como por exemplo o capítulo de comentário, e o de TDD, mas em suma é um excelente livro. Altamente recomendado se você também acredita que programar é uma arte e que, como toda arte, pode ser melhorada continuamente.</li>
</ul>
<ul>
<li><a title="The Clean Coder" href="http://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/0137081073/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1317777411&amp;sr=1-1" target="_blank">The Clean Coder</a> - Estou quase terminando de ler, e também estou gostando muito. É do mesmo autor do livro acima, porém eu indicaria esse livro mais para líderes técnicos, pois fala muito sobre profissionalismo e a postura que um programador deve ter em relação ao trabalho, ao time de negócio / produto, etc.</li>
</ul>
<p>Se você acredita que já é bom o bastante, ou que aprende tudo o que quiser através do google, saiba que eu também tinha um pensamento parecido, e me surpreendi com os livros acima. Hoje posso dizer que a minha forma de programar, de pensar, minha política de sempre tentar melhorar um código que estou lendo e que não necessariamente escrevi (&#8220;boyscout rule&#8221; &#8211; Clean Code), e a minha postura profissional, evoluiu muito.</p>
<p>Com certeza o Rafael versão 2011 é bem melhor que o Rafael 2010, e também muito mais humilde =p.</p>
<p>Algum outro livro interessante para o meu Kindle ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/livros-recomendados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ainda estou vivo&#8230;</title>
		<link>http://blog.rafaelmanoel.com.br/ainda-estou-vivo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ainda-estou-vivo</link>
		<comments>http://blog.rafaelmanoel.com.br/ainda-estou-vivo/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 19:20:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=141</guid>
		<description><![CDATA[Após mais de um ano sem postar nada, resolvi tentar ressucitar o blog. Já atualizei a versão do wordpress e instalei um novo tema, só está faltando postar alguma coisa que preste, rs&#8230; Talvez amanhã&#8230;]]></description>
			<content:encoded><![CDATA[<p>Após mais de um ano sem postar nada, resolvi tentar ressucitar o blog. Já atualizei a versão do wordpress e instalei um novo tema, só está faltando postar alguma coisa que preste, rs&#8230;</p>
<p>Talvez amanhã&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/ainda-estou-vivo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diretamente do RailsSummit 2009</title>
		<link>http://blog.rafaelmanoel.com.br/diretamente-do-railssummit-2009/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=diretamente-do-railssummit-2009</link>
		<comments>http://blog.rafaelmanoel.com.br/diretamente-do-railssummit-2009/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 14:09:45 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[railssummit]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=138</guid>
		<description><![CDATA[Bom dia! Estou participando do RailsSummit, o maior evento de RoR da America Latina. A Infra estrutura está ótima e a palestra do Chad Fowler foi bem inspiradora. Acompanhe tudo o que está acontecendo através do meu twitter: @rafaelmanoel []&#8216;s Rafael]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.railssummit.com.br?utm_campaign=Railssummit&amp;utm_source=banner_parceiros&amp;utm_medium=banner&amp;utm_content=vouParticipar_125x125                     "><img class="alignleft" src="http://railssummit.com.br/images/banners/vouParticipar_125x125.jpg" alt="Rails Summit 2009" width="125" height="125" /></a></p>
<p>Bom dia! Estou participando do RailsSummit, o maior evento de RoR da America Latina. A Infra estrutura está ótima e a palestra do Chad Fowler foi bem inspiradora. Acompanhe tudo o que está acontecendo através do meu twitter: <a href="http://www.twitter.com/rafaelmanoel">@rafaelmanoel</a></p>
<p>[]&#8216;s<br />
Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/diretamente-do-railssummit-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Dia em que parei de utilizar Fixtures</title>
		<link>http://blog.rafaelmanoel.com.br/o-dia-em-que-parei-de-utilizar-fixtures/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=o-dia-em-que-parei-de-utilizar-fixtures</link>
		<comments>http://blog.rafaelmanoel.com.br/o-dia-em-que-parei-de-utilizar-fixtures/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 20:44:09 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=128</guid>
		<description><![CDATA[Ok, sempre vi por aí que o pessoal recomenda fortemente a utilização de factories de objetos ao invés de fixtures, porém as fixtures sempre serviram pra mim. Pelo menos até hoje. O Problema comecou quando eu tive que sair da convenção do Rails. Tenho uma classe, digamos Customer, por exemplo, que possui dois Addresses: class [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, sempre vi por aí que o pessoal recomenda fortemente a utilização de factories de objetos ao invés de fixtures, porém as fixtures sempre serviram pra mim. Pelo menos até hoje.</p>
<p>O Problema comecou quando eu tive que sair da convenção do Rails. Tenho uma classe, digamos <strong>Customer</strong>, por exemplo, que possui dois <strong>Addresses</strong>:</p>
<pre class="wp-code-highlight prettyprint">class Customer &amp;lt; ActiveRecord::Base

has_one :business_address, :class_name =&amp;gt; 'Address'
has_one :home_address, :class_name =&amp;gt; 'Address'

end</pre>
<p>Para os meus testes, criei os arquivos de fixtures</p>
<pre class="wp-code-highlight prettyprint"># addresses.yml

endereco_1:
street: Endereco 1

endereco_2:
street: Segundo Endereco

# customers.yml
rafael:
name: Rafael
business_address: endereco_1
home_address: endereco_2</pre>
<p>Com as novas sexy fixtures, acreditei que isso seria possível. Porém, as fixtures, por natureza, refletem o que está no banco de dados, e nao nos objetos. Não importa que a minha classe Customer tenha atributos business_address e home_address mapeando para a classe Address, o sistema de fixtures não irá conseguir vincular o meu endereco_1 e endereco_2 com o customer rafael. Eu teria que criar uma fixture da seguinte forma:</p>
<pre class="wp-code-highlight prettyprint"># customers.yml
rafael:
name: Rafael
business_address_id: 1
home_address_id: 2</pre>
<p>E com isso, perder toda a legibilidade. Imagina a bagunça que ficaria se todas as associações do meu modelo fossem com os ids. Quem conseguiria entender além do computador ?</p>
<p>Foi por isso que decidi utilizar o factory_girls. Com ele é possível fazer este tipo de associação sem ter que ficar fazendo<span style="text-decoration: line-through;"> macumba</span> <span style="text-decoration: line-through;">gambiarra</span> workarounds. Após a instalação da gem, e configuração (que pode ser vista <a href="http://wiki.github.com/thoughtbot/factory_girl">aqui</a>), basta criar um factories.rb da seguinte forma:</p>
<pre class="wp-code-highlight prettyprint">Factory.define :endereco_1, :class =&amp;gt; Address do |a|
a.street &quot;Endereco 1&quot;
end

Factory.define :endereco_2, :class =&amp;gt; Address do |a|
a.street &quot;Endereco 2&quot;
end

Factory.define :rafael, :class =&amp;gt; Customer do |c|
c.association :business_address, :factory =&amp;gt; endereco_1
c.association :home_address, :factory =&amp;gt; endereco_2
end</pre>
<p>E no seu teste:</p>
<pre class="wp-code-highlight prettyprint">rafael = Factory(:rafael)</pre>
<p>Simples, não ? E bem melhor&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/o-dia-em-que-parei-de-utilizar-fixtures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blocks x Proc x Lambda</title>
		<link>http://blog.rafaelmanoel.com.br/blocks-x-proc-x-lambda/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=blocks-x-proc-x-lambda</link>
		<comments>http://blog.rafaelmanoel.com.br/blocks-x-proc-x-lambda/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 13:15:26 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=121</guid>
		<description><![CDATA[Quem nunca se confundiu com isso, que atire a primeira pedra =p. Realmente, e pra quem está começando com Ruby, isso gera ainda mais confusão. Por isso, estou postando um artigo bem interessante que acabei de ler. Segue o link: http://www.neeraj.name/blog/articles/589-block-vs-lambda-vs-proc []&#8216;s Rafael]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://prettybychoice.files.wordpress.com/2007/05/confused.jpg" alt="" width="146" height="151" />Quem nunca se confundiu com isso, que atire a primeira pedra =p. Realmente, e pra quem está começando com Ruby, isso gera ainda mais confusão. Por isso, estou postando um artigo bem interessante que acabei de ler. Segue o link:</p>
<p><a href="http://www.neeraj.name/blog/articles/589-block-vs-lambda-vs-proc">http://www.neeraj.name/blog/articles/589-block-vs-lambda-vs-proc</a></p>
<p>[]&#8216;s</p>
<p>Rafael</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/blocks-x-proc-x-lambda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O seu código é bom o bastante ?</title>
		<link>http://blog.rafaelmanoel.com.br/o-seu-codigo-e-bom-o-bastante/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=o-seu-codigo-e-bom-o-bastante</link>
		<comments>http://blog.rafaelmanoel.com.br/o-seu-codigo-e-bom-o-bastante/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 09:00:55 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://blog.rafaelmanoel.com.br/?p=98</guid>
		<description><![CDATA[Quando escrevi o meu primeiro código executável (Visual Basic 3.0 em 1997) me perguntei se o havia feito do jeito &#8220;certo&#8221;, se era legível, se outras pessoas entenderiam, enfim, questionei-me se havia escrito o código da melhor maneira possível. Já se passaram 12 anos desde então e eu ainda tenho essa dúvida! Incrível, não ? [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="lei de demeter" src="http://tnlessone.files.wordpress.com/2007/10/simpson_demeterslaw.png" alt="" width="391" height="305" />Quando escrevi o meu primeiro código executável (Visual Basic 3.0 em 1997) me perguntei se o havia feito do jeito &#8220;certo&#8221;, se era legível, se outras pessoas entenderiam, enfim, questionei-me se havia escrito o código da melhor maneira possível.</p>
<p>Já se passaram 12 anos desde então e eu ainda tenho essa dúvida! Incrível, não ? Mas acho que isso é algo que levarei comigo para o túmulo. Evidentemente há várias técnicas para melhorar a qualidade (caramba, não queria utilizar esta palavra) do seu código. Ultimamente tenho estudando bastante isso e me forçado a não me corromper com códigos ruins, por conta de prazos apertadíssimos. Eis que cheguei em algumas conclusões:</p>
<ol>
<li> Tente não violar a <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Lei de Demeter</a>. Se você ainda não compreender a beleza por trás da sua simplicidade, não tem problema você pode segui-la mesmo assim, ou dar algumas cabeçadas e ver que o problema todo é que suas classes falam com muitas outras que não deveriam.</li>
<li><a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>! Ok, isso é polêmico, mas pense assim: Quando você se utiliza de TDD, você se torna o primeiro cliente do seu código, e acredite, você vai querer mudar bastante suas interfaces para agradar a você cliente.</li>
<li> Já que falei de interfaces, lembre-se: &#8220;Programe para interfaces!!!!&#8221; (ok, 4 exclamações acho que basta =p ).</li>
<li>Codifique pensando no teste (unitário) e teste pensando no código. Se a criação dos testes estiver se tornando uma tarefa árdua, há algo de errado no seu design <img src='http://blog.rafaelmanoel.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li>Nunca se acomode com o design de suas classes. Acredite, sempre pode ser melhorado.</li>
</ol>
<p>Acho que consegui resumir o que ando fazendo para tentar melhorar o meu jeito de codificar, de forma que a manutenção do código que eu escrevo não seja tao árdua. E agora, para finalizar, uma frase do Martin Fowler que eu adoro:</p>
<p><em>&#8220;Any fool can write code that a computer can understand. Good programmers write code that humans can understand.&#8221;</em></p>
<p>E é isso o que estou perseguindo. Um dia eu chego lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/o-seu-codigo-e-bom-o-bastante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integração contínua</title>
		<link>http://blog.rafaelmanoel.com.br/integracao-continua/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=integracao-continua</link>
		<comments>http://blog.rafaelmanoel.com.br/integracao-continua/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:32:47 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.rafaelmanoel.com.br/blog/?p=93</guid>
		<description><![CDATA[A cada dia que passa, evoluímos mais, aqui na empresa, para um cenário estável de integração contínua. O que isso quer dizer ? Bom, integração contínua, é você ter o status do seus sistema (testes, cobertura, javadoc, build, release, etc.) em um único ponto, e de fácil acesso. Com isso, fica simples ver quando alguém [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl class="wp-caption alignleft" style="width: 115px;">
<dt class="wp-caption-dt"><img title="Hudson" src="https://hudson.dev.java.net/images/user.gif" alt="Hudson" width="105" height="105" /></dt>
</dl>
</div>
<p>A cada dia que passa, evoluímos mais, aqui na empresa, para um cenário estável de integração contínua. O que isso quer dizer ? Bom, integração contínua, é você ter o status do seus sistema (testes, cobertura, javadoc, build, release, etc.) em um único ponto, e de fácil acesso. Com isso, fica simples ver quando alguém faz uma macacada e detona o software que você está fazendo.</p>
<p>Para atingir esse estado da arte de integração contínua, há vários métodos. Desde agendar tudo no crontab, criar scripts, ou utilizar softwares específicos para isso. Qua aliás, não faltam opções.</p>
<p>Aqui no <a href="http://www.uol.com.br">trabalho</a>, começamos a utilizar o <a href="http://continuum.apache.org/">continuum</a>, porém, há apenas uma máquina para gerar uma grande quantidade de builds, sem contar com os testes automáticos. Dado isso, resolvi, colocar na minha máquina mesmo, uma tarefinha no crontab para gerar a build e rodar os testes automatizados, o que leva mais ou menos 8 horas (por isso optei em rodar na minha máquina e não no continuum server da empresa =p).</p>
<p>Até então estava tudo indo bem, com relatórios diários do status dos testes. Mas isso me abriu um horizonte. De repente me peguei fazendo uns scripts (em Ruby, lógico) para gravar no banco o resultado dos testes, para conseguir fazer um tracking da evolução desta tarefa. Apesar de ser divertido, estava meio complicado fazer este script. E eis, que numa conversa no café, um amigo me sugere a utilização do <a href="https://hudson.dev.java.net/">Hudson</a>, que assim como o <a href="http://continuum.apache.org/">continuum</a> é um software para integração contínua.</p>
<p>Ainda está cedo para disponibilizar qualquer análise, mas estou gostando muito, principalmente da facilidade que o software proporciona. Em poucos cliques consegui fazer o hudson baixar o codigo do subversion, fazer a build, gerar relatorio dos testes unitários, e ainda rodar a suite de testes automatizados. Ah, e de graça consegui um gráfico que mostra a variaca na quantidade de testes (e de falhas e erros nos testes também), ou seja, tudo o que eu queria!</p>
<p>Bom, fica ai a dica de pelo menos experimentarem o <a href="https://hudson.dev.java.net/">Hudson</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/integracao-continua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crontab via Ruby</title>
		<link>http://blog.rafaelmanoel.com.br/crontab-via-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=crontab-via-ruby</link>
		<comments>http://blog.rafaelmanoel.com.br/crontab-via-ruby/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 16:07:51 +0000</pubDate>
		<dc:creator>rafael</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.rafaelmanoel.com.br/blog/?p=87</guid>
		<description><![CDATA[Aqui vai uma dica que vi no excelente blog rubyinside: Há um projeto no github, chamado whenever, que encapsula chamadas ao cron, utilizando a sitaxe e o jeitão do Ruby.  É possível fazer agendar tarefas no cron desta forma: every 3.hours do runner &#34;MyModel.some_process&#34; rake &#34;my:rake:task&#34; command &#34;/usr/bin/my_great_command&#34; end every 1.day, :at =&#38;gt; '4:30 am' [...]]]></description>
			<content:encoded><![CDATA[<p>Aqui vai uma dica que vi no excelente blog rubyinside:</p>
<p>Há um projeto no github, chamado whenever, que encapsula chamadas ao cron, utilizando a sitaxe e o jeitão do Ruby.  É possível fazer agendar tarefas no cron desta forma:</p>
<pre class="wp-code-highlight prettyprint">  every 3.hours do
    runner &quot;MyModel.some_process&quot;
    rake &quot;my:rake:task&quot;
    command &quot;/usr/bin/my_great_command&quot;
  end

  every 1.day, :at =&amp;gt; '4:30 am' do
    runner &quot;MyModel.task_to_run_at_four_thirty_in_the_morning&quot;
  end

  every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
    runner &quot;SomeModel.ladeeda&quot;
  end

  every :sunday, :at =&amp;gt; '12pm' do # Use any day of the week or :weekend, :weekday
    runner &quot;Task.do_something_great&quot;
  end</pre>
<p>Para saber mais, visite o site do <a href="http://github.com/javan/whenever/tree/master">projeto</a>, ou assista a este <a href="http://media.railscasts.com/videos/164_cron_in_ruby.mov">video</a>.</p>
<p>Fonte: http://www.rubyinside.com.br/whenever-uma-dsl-ruby-para-programar-tarefas-no-cron-1514</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/crontab-via-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://media.railscasts.com/videos/164_cron_in_ruby.mov" length="10803059" type="video/quicktime" />
		</item>
		<item>
		<title>Reebok 10k&#8230;</title>
		<link>http://blog.rafaelmanoel.com.br/reebok-10k/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reebok-10k</link>
		<comments>http://blog.rafaelmanoel.com.br/reebok-10k/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 19:24:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[evento]]></category>

		<guid isPermaLink="false">http://www.rafaelmanoel.com.br/blog/?p=82</guid>
		<description><![CDATA[&#8230;Porque nem só de programação vive um geek =p.Reebok 10k no sábado (20/06), na USP. Alguém mais vai ? Boa prova a todos! (e que eu consiga terminar os 10km&#8230;)]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl class="wp-caption alignleft" style="width: 362px;">
<dt class="wp-caption-dt"><img title="reebok10k" src="http://4.bp.blogspot.com/_LW-k8OqmW5k/Sdz53Z1IPAI/AAAAAAAABXA/r3fJTfw39i0/s400/reebok10k.jpg" alt="reebok10k" width="352" height="108" /></dt>
</dl>
</div>
<p>&#8230;Porque nem só de programação vive um geek =p.Reebok 10k no sábado (20/06), na USP. Alguém mais vai ?</p>
<p>Boa prova a todos!</p>
<p>(e que eu consiga terminar os 10km&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rafaelmanoel.com.br/reebok-10k/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
