<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Planeta Globo.com</title>
	
	<link>http://planeta-globo.com</link>
	<description>O blog das pessoas que estão nos bastidores de quem faz a Internet!</description>
	<pubDate>Sat, 18 May 2013 03:34:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PlanetaGloboCom" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="planetaglobocom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>[Rafael Biriba] Code School vai liberar 48 horas de acesso gratuito aos cursos online</title>
		<link>http://planeta-globo.com/2013/05/18/code-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online/</link>
		<comments>http://planeta-globo.com/2013/05/18/code-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online/#comments</comments>
		<pubDate>Sat, 18 May 2013 03:34:12 +0000</pubDate>
		<dc:creator>Rafael Biriba</dc:creator>
		
		<category><![CDATA[Rafael Biriba]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/05/18/code-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online/</guid>
		<description><![CDATA[
Em parceria com a New Relic, a Code School está oferecendo 48 horas de acesso gratuito a seu conteúdo.
É uma boa oportunidade para quem quer ver como os cursos são.
O link para acesso direto a promoção é: http://www.codeschool.com/free-weekend
De acordo com o site da code school, a oferta é valida apenas para os dias 25 e 26 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-3114 aligncenter" alt="249163_519143868133826_1683470596_n" src="http://www.rafaelbiriba.com/wp-content/uploads/2013/05/249163_519143868133826_1683470596_n.png" width="540" height="264" /></p>
<p>Em parceria com a New Relic, a Code School está oferecendo 48 horas de acesso gratuito a seu conteúdo.</p>
<p>É uma boa oportunidade para quem quer ver como os cursos são.</p>
<p>O link para acesso direto a promoção é: <a title="http://www.codeschool.com/free-weekend" href="http://www.codeschool.com/free-weekend" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.codeschool.com/free-weekend?referer=');">http://www.codeschool.com/free-weekend</a></p>
<p>De acordo com o site da code school, a oferta é valida apenas para os dias 25 e 26 de maio/2013.</p>
<p>Então vamos aproveitar essas 48 horas de aprendizado <img src="http://www.rafaelbiriba.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> </p>
<div class="wp_rp_wrap  wp_rp_plain">
<div class="wp_rp_content">
<h3 class="related_post_title">Leia também:</h3>
<ul class="related_post wp_rp" style="visibility: visible">
<li>10/03/2009 &#8212; <a href="http://www.rafaelbiriba.com/2009/03/10/chart-api-medidor-em-formato-de-velocimetro.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2009/03/10/chart-api-medidor-em-formato-de-velocimetro.html?referer=');">Chart API: Medidor em formato de velocímetro</a></li>
<li>13/04/2009 &#8212; <a href="http://www.rafaelbiriba.com/2009/04/13/ruby-require-rubygems.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2009/04/13/ruby-require-rubygems.html?referer=');">Ruby: require &#8216;rubygems&#8217;</a></li>
<li>06/05/2011 &#8212; <a href="http://www.rafaelbiriba.com/2011/05/06/raptcha-um-captcha-simples-para-aplicacoes-rails.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2011/05/06/raptcha-um-captcha-simples-para-aplicacoes-rails.html?referer=');">Raptcha: Um captcha simples para aplicações Rails</a></li>
<li>06/03/2009 &#8212; <a href="http://www.rafaelbiriba.com/2009/03/06/chart-api-grafico-de-visitantes-do-dia.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2009/03/06/chart-api-grafico-de-visitantes-do-dia.html?referer=');">Chart API: Gráfico de visitantes do dia</a></li>
<li>27/02/2009 &#8212; <a href="http://www.rafaelbiriba.com/2009/02/27/php-ocultando-erros-de-codigo.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2009/02/27/php-ocultando-erros-de-codigo.html?referer=');">PHP: Ocultando erros de código</a></li>
</ul>
<div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts" onclick="pageTracker._trackPageview('/outgoing/www.zemanta.com/?wp-related-posts&amp;referer=');">Zemanta</a></div>
</div>
</div>
<p><a class="a2a_button_facebook_like addtoany_special_service"></a><a class="a2a_button_twitter_tweet addtoany_special_service"></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F05%2F18%2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html&amp;linkname=Code%20School%20vai%20liberar%2048%20horas%20de%20acesso%20gratuito%20aos%20cursos%20online" title="Twitter" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/add_to/twitter?linkurl=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F05_2F18_2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html_amp_linkname=Code_20School_20vai_20liberar_2048_20horas_20de_20acesso_20gratuito_20aos_20cursos_20online&amp;referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter" /></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F05%2F18%2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html&amp;linkname=Code%20School%20vai%20liberar%2048%20horas%20de%20acesso%20gratuito%20aos%20cursos%20online" title="Facebook" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/add_to/facebook?linkurl=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F05_2F18_2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html_amp_linkname=Code_20School_20vai_20liberar_2048_20horas_20de_20acesso_20gratuito_20aos_20cursos_20online&amp;referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook" /></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F05%2F18%2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html&amp;title=Code%20School%20vai%20liberar%2048%20horas%20de%20acesso%20gratuito%20aos%20cursos%20online" id="wpa2a_2" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/share_save_url=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F05_2F18_2Fcode-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online.html_amp_title=Code_20School_20vai_20liberar_2048_20horas_20de_20acesso_20gratuito_20aos_20cursos_20online?referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share" /></a></p>
<p><img src="http://feeds.feedburner.com/~r/rafaelbiriba/~4/bqBd67Vg78I" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/05/18/code-school-vai-liberar-48-horas-de-acesso-gratuito-aos-cursos-online/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Andrews Medina] referências para quem quer aprender go</title>
		<link>http://planeta-globo.com/2013/05/12/referencias-para-quem-quer-aprender-go/</link>
		<comments>http://planeta-globo.com/2013/05/12/referencias-para-quem-quer-aprender-go/#comments</comments>
		<pubDate>Sun, 12 May 2013 20:30:32 +0000</pubDate>
		<dc:creator>Andrews Medina</dc:creator>
		
		<category><![CDATA[Andrews Medina]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/05/12/referencias-para-quem-quer-aprender-go/</guid>
		<description><![CDATA[Esse post tem como objetivo ser um guia com alguns links para quem que aprender a linguagem go.
Visão geral sobre a linguagem
Go Tour
Instalando e configurando um ambiente de desenvolvimento
Getting started
How to Write Go Code
Aprendendo sobre a linguagem
Effective Go
Apresentações
Let&#8217;s go
A linguagem de programação go
Livros
An introduction to programming in go
Programming in go
Learning go
The way to go
Novidades
http://www.reddit.com/r/golang
E para [...]]]></description>
			<content:encoded><![CDATA[<p>Esse post tem como objetivo ser um guia com alguns links para quem que aprender a linguagem go.</p>
<h3>Visão geral sobre a linguagem</h3>
<p><a href="http://tour.golang.org/#1" onclick="pageTracker._trackPageview('/outgoing/tour.golang.org/_1?referer=');">Go Tour</a></p>
<h3>Instalando e configurando um ambiente de desenvolvimento</h3>
<p><a href="http://golang.org/doc/install" onclick="pageTracker._trackPageview('/outgoing/golang.org/doc/install?referer=');">Getting started</a></p>
<p><a href="http://golang.org/doc/code.html" onclick="pageTracker._trackPageview('/outgoing/golang.org/doc/code.html?referer=');">How to Write Go Code</a></p>
<h3>Aprendendo sobre a linguagem</h3>
<p><a href="http://golang.org/doc/effective_go.html" onclick="pageTracker._trackPageview('/outgoing/golang.org/doc/effective_go.html?referer=');">Effective Go</a></p>
<h3>Apresentações</h3>
<p><a href="https://speakerdeck.com/andrewsmedina/lets-go" onclick="pageTracker._trackPageview('/outgoing/speakerdeck.com/andrewsmedina/lets-go?referer=');">Let&#8217;s go</a></p>
<p><a href="http://fsouza.net/devincachu-golang" onclick="pageTracker._trackPageview('/outgoing/fsouza.net/devincachu-golang?referer=');">A linguagem de programação go</a></p>
<h3>Livros</h3>
<p><a href="http://www.golang-book.com/" onclick="pageTracker._trackPageview('/outgoing/www.golang-book.com/?referer=');">An introduction to programming in go</a></p>
<p><a href="http://www.qtrac.eu/gobook.html" onclick="pageTracker._trackPageview('/outgoing/www.qtrac.eu/gobook.html?referer=');">Programming in go</a></p>
<p><a href="http://www.miek.nl/projects/learninggo/" onclick="pageTracker._trackPageview('/outgoing/www.miek.nl/projects/learninggo/?referer=');">Learning go</a></p>
<p><a href="https://sites.google.com/site/thewaytogo2012/" onclick="pageTracker._trackPageview('/outgoing/sites.google.com/site/thewaytogo2012/?referer=');">The way to go</a></p>
<h3>Novidades</h3>
<p><a href="http://www.reddit.com/r/golang" onclick="pageTracker._trackPageview('/outgoing/www.reddit.com/r/golang?referer=');">http://www.reddit.com/r/golang</a></p>
<p>E para dúvidas, tem a lista de e-mail <a href="https://groups.google.com/forum/?fromgroups#!forum/golang-nuts" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/forum/?fromgroups_forum/golang-nuts&amp;referer=');">golang-nuts</a>.</p>
<p>Espero que gostem <img src='http://planeta-globo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/05/12/referencias-para-quem-quer-aprender-go/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Andrews Medina] a diferença entre atributos de classe e de instância</title>
		<link>http://planeta-globo.com/2013/04/22/a-diferenca-entre-atributos-de-classe-e-de-instancia/</link>
		<comments>http://planeta-globo.com/2013/04/22/a-diferenca-entre-atributos-de-classe-e-de-instancia/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 00:58:01 +0000</pubDate>
		<dc:creator>Andrews Medina</dc:creator>
		
		<category><![CDATA[Andrews Medina]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/04/22/a-diferenca-entre-atributos-de-classe-e-de-instancia/</guid>
		<description><![CDATA[&#8220;Qual a diferença entre atributos de classe e de instância em Python?&#8221;
Essa é uma dúvida muito comum e bem simples de ser respondida. Mas, antes de repondê-la vou demonstrar o que é um atributo de classe e de instância.
atributo de classe
São atributos que são definidos diretamente a classe.
atributo de instância
São atributos definidos a instância, geralmente [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Qual a diferença entre atributos de classe e de instância em Python?&#8221;</p>
<p>Essa é uma dúvida muito comum e bem simples de ser respondida. Mas, antes de repondê-la vou demonstrar o que é um atributo de classe e de instância.</p>
<h3>atributo de classe</h3>
<p>São atributos que são definidos diretamente a classe.</p>
<h3>atributo de instância</h3>
<p>São atributos definidos a instância, geralmente através do &#8220;self&#8221;, que representa a instância de uma classe.</p>
<h3>Qual a diferença entre eles?</h3>
<p>A diferença é que atributos de classes são compartilhados por todas as instâncias daquela classe. Atributos de instancia são únicos para cada instância.</p>
<p>Por exemplo, todas as modificações feitas na lista &#8220;l&#8221; da classe &#8220;C&#8221; afetara a lista para todas as instâncias de &#8220;C&#8221; pois &#8220;l&#8221; é um atributo da classe.</p>
<p>Já com as instâncias da classe &#8220;D&#8221; isso não ocorre pois &#8220;l&#8221; é um atributo de instância, sendo único para cada instância de &#8220;D&#8221;:</p>
<p>É importante conhecer esse comportamento para não ter resultados inesperados ao construir uma classe.</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/04/22/a-diferenca-entre-atributos-de-classe-e-de-instancia/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Andrews Medina] try.tsuru.io</title>
		<link>http://planeta-globo.com/2013/04/12/trytsuruio/</link>
		<comments>http://planeta-globo.com/2013/04/12/trytsuruio/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 14:38:20 +0000</pubDate>
		<dc:creator>Andrews Medina</dc:creator>
		
		<category><![CDATA[Andrews Medina]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/04/12/trytsuruio/</guid>
		<description><![CDATA[Nós da equipe do PaaS da globo.com estamos lançando o try.tsuru.io como private beta com o objetivo de ser uma maneira fácil das pessoas conhecerem e experimentarem o tsuru.
Com o tsuru, times e desenvolvedores não precisam se preocupar com servidores ou em como executar o deploy, eles podem focar no mais importante: a aplicação.
Com ele [...]]]></description>
			<content:encoded><![CDATA[<p>Nós da equipe do PaaS da globo.com estamos lançando o <a href="http://www.tsuru.io/try" onclick="pageTracker._trackPageview('/outgoing/www.tsuru.io/try?referer=');">try.tsuru.io</a> como private beta com o objetivo de ser uma maneira fácil das pessoas conhecerem e experimentarem o tsuru.</p>
<p>Com o tsuru, times e desenvolvedores não precisam se preocupar com servidores ou em como executar o deploy, eles podem focar no mais importante: a aplicação.</p>
<p>Com ele é possível escrever aplicações na linguagem da sua escolha, usar serviços como banco de dados SQL ou NoSQl, memcacehd, redis e plugá-los a sua app.</p>
<p>Você gerencia sua app usando a linha de comando ou uma interface web e faz o deploy via git. Tudo isso sendo executado pela infra estruturua do tsuru.</p>
<p>O tsuru é um projeto open source se você quiser conhecer o <a href="https://github.com/globocom/tsuru/" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/tsuru/?referer=');">código</a>, <a href="http://docs.tsuru.io/en/latest/lxc.html" onclick="pageTracker._trackPageview('/outgoing/docs.tsuru.io/en/latest/lxc.html?referer=');">montar seu próprio Paas usando o tsuru</a>, <a href="http://docs.tsuru.io/en/latest/#contributions-and-feedback" onclick="pageTracker._trackPageview('/outgoing/docs.tsuru.io/en/latest/_contributions-and-feedback?referer=');">contribuir</a> ou <a href="https://github.com/globocom/tsuru/issues" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/tsuru/issues?referer=');">sugerir features/reportar bugs</a> sinta-se a vontade.</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/04/12/trytsuruio/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Francisco Souza] Try out Tsuru: announcing limited preview</title>
		<link>http://planeta-globo.com/2013/04/11/try-out-tsuru-announcing-limited-preview/</link>
		<comments>http://planeta-globo.com/2013/04/11/try-out-tsuru-announcing-limited-preview/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 01:47:00 +0000</pubDate>
		<dc:creator>Francisco Souza</dc:creator>
		
		<category><![CDATA[Francisco Souza]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/04/11/try-out-tsuru-announcing-limited-preview/</guid>
		<description><![CDATA[A few days ago, Tsuru got some attention in the news. After reading about Tsuru, and seeing some of its capabilities, people started asking for a way to try Tsuru. Well, your claims were attended! We&#8217;re preparing a public cloud that will be freely available for beta testers.
TL;DR: go to tsuru.io/try, signup for beta testing [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago, <a href="http://tsuru.io/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/tsuru.io/?referer=');">Tsuru</a> got some <a href="https://news.ycombinator.com/item?id=5436648" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/news.ycombinator.com/item?id=5436648&amp;referer=');">attention</a> in the <a href="http://www.wired.com/wiredenterprise/2013/03/tsuru/" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.wired.com/wiredenterprise/2013/03/tsuru/?referer=');">news</a>. After reading about Tsuru, and seeing some of its capabilities, people started asking for a way to try Tsuru. Well, your claims were attended! We&#8217;re preparing a public cloud that will be freely available for beta testers.</p>
<p><b>TL;DR:</b> go to <a href="http://www.tsuru.io/try" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.tsuru.io/try?referer=');">tsuru.io/try</a>, signup for beta testing and get ready to start deploying Python, Ruby, Go and Java applications in the cloud.<br /><a name='more'></a><br />
<h2>What is Tsuru?</h2>
<p>Tsuru is an <a href="https://github.com/globocom/tsuru" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/tsuru?referer=');">open source</a> platform as a service that allows developers to automatically deploy and manage web applications written in many different platforms (like <a href="http://python.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/python.org/?referer=');">Python</a>, <a href="http://ruby-lang.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/ruby-lang.org/?referer=');">Ruby</a> and <a href="http://golang.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/golang.org/?referer=');">Go</a>). It aims to provide a solution for cloud computing platforms that is extensible, flexible and component based.</p>
<p>You can run your own public or private cloud using Tsuru. Or you can try it in the public cloud that Globo.com is building.</p>
<h2>What is Tsuru public cloud? What does &#8220;beta availability&#8221; means?</h2>
<p>Tsuru public cloud will be a public, freely available, installation of Tsuru, provided by <a href="http://globo.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/globo.com/?referer=');">Globo.com</a>. &#8220;Beta availability&#8221; means that it will not be available for the general Internet public.</p>
<p>People will need to subscribe for the beta testing and wait for the confirmation, so they can start deploying web applications on Tsuru public cloud.</p>
<h2>Which development platforms are going to be available?</h2>
<p>Tsuru already supports Ruby, Python, Java and Go, so it is very likely that these platforms will be available for all beta users.</p>
<p>It&#8217;s important to notice that adding new platforms to Tsuru is a straightforward task: each development platform is based on <a href="http://jujucharms.com/" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/jujucharms.com/?referer=');">Juju Charms</a>, so one can adapt charms available at Charm Store and <a href="https://github.com/globocom/charms" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/charms?referer=');">send a patch</a>.</p>
<h2>How limited is it going to be?</h2>
<p>We don&#8217;t know what&#8217;s the proper answer for this question yet, but don&#8217;t worry about numbers now. There will be some kind of per-user quota, but it has not been defined yet.</p>
<p>People interested in running applications in the Tsuru public cloud that get to use the beta version will have access a functional environment where they will be able to deploy <i>at least</i> one web application.</p>
<h2>When will it be available?</h2>
<p>We&#8217;re <a href="https://github.com/globocom/tsuru/issues" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/tsuru/issues?referer=');">working hard</a> to make it available as soon as possible, and you can help us get it done! If you want to contribute, please take a look at <a href="https://github.com/globocom/tsuru" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/globocom/tsuru?referer=');">Tsuru repository</a>, chose an issue, <a href="http://www.tsuru.io/community" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.tsuru.io/community?referer=');">discuss</a> your solution and send your patches. We are going to be very happy helping you out.</p>
<h2>What if I don&#8217;t want to wait?</h2>
<p>If you want an unlimited, fully manageable and customized installation of Tsuru, you can have it today. Check out Tsuru&#8217;s <a href="http://docs.tsuru.io/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/docs.tsuru.io/?referer=');">documentation</a> and, in case of doubts, don&#8217;t hesitate in contacting the newborn <a href="http://www.tsuru.io/community" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.tsuru.io/community?referer=');">Tsuru community</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/04/11/try-out-tsuru-announcing-limited-preview/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Tiago Peczenyj] Adding a ‘dry run’ capability to your Moose class with MooseX::Role::DryRunnable</title>
		<link>http://planeta-globo.com/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosexroledryrunnable/</link>
		<comments>http://planeta-globo.com/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosexroledryrunnable/#comments</comments>
		<pubDate>Sun, 07 Apr 2013 12:55:00 +0000</pubDate>
		<dc:creator>Tiago Peczenyj</dc:creator>
		
		<category><![CDATA[Tiago Peczenyj]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosexroledryrunnable/</guid>
		<description><![CDATA[A &#8216;dry run&#8217; is a testing process where the effects of a possible failure are intentionally mitigated. For example, an aerospace company may conduct a &#8220;dry run&#8221; test of a jet&#8217;s new pilot ejection seat while the jet is parked on the ground, rather than while it is in flight. Or, in software development, we [...]]]></description>
			<content:encoded><![CDATA[<p>A &#8216;dry run&#8217; is a testing process where the effects of a possible failure are intentionally mitigated. For example, an aerospace company may conduct a &#8220;dry run&#8221; test of a jet&#8217;s new pilot ejection seat while the jet is parked on the ground, rather than while it is in flight. Or, in software development, we can change the behavior of some methods in order to test, like avoid change data into a database (logging the action instead).</p>
<p>There are many ways to implement this capability. For example, we can add an explicity return in each method and test some condition. I will show some options in this article and we will find how to use the module <a href="https://metacpan.org/module/MooseX::Role::DryRunnable" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/MooseX_Role_DryRunnable?referer=');">MooseX::Role::DryRunnable</a> in our Moose classes (Perl).</p>
<p>One simple example in Perl, reading from an environment variable <code>DRY_RUN</code>.</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="n">Foo</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">logger</span><span class="o">-&gt;</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Foo::bar @_&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">if</span> <span class="nv">$ENV</span><span class="p">{</span><span class="s">&#39;DRY_RUN&#39;</span><span class="p">};</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p><span id="more-1551"></span></p>
<p>In this example, the <code>bar</code> method change something in the database and my test is very simple, like a simple diff between log files. To test my application in dry run (to test in the product environment, for example, without a big risk), we can do this:</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="n">bash</span><span class="nv">$</span> <span class="nv">DRY_RUN</span><span class="o">=</span><span class="mi">1</span> <span class="o">./</span><span class="k">my</span><span class="o">-</span><span class="n">application</span><span class="o">.</span><span class="n">pl</span> <span class="o">--</span><span class="n">other</span><span class="o">-</span><span class="n">options</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>Sounds good, for large systems, with a good number of modules, it can be a problem. For example, the method <code>bar</code> has two or three responsabilities: logging the parameters, doing the original job and do nothing if we are in the <code>dry run</code> state. This method is doing a lot of things, and I have the same code in multiple places. Lets think about reuse of this code, using OO principles.</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="n">FooBase</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nb">package</span> <span class="n">Foo</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">base</span> <span class="s">&#39;FooBase&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">logger</span><span class="o">-&gt;</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Foo::bar @_&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">if</span> <span class="nv">$ENV</span><span class="p">{</span><span class="s">&#39;DRY_RUN&#39;</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$self</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>  <span class="nv">$self</span><span class="o">-&gt;</span><span class="nn">SUPER::</span><span class="n">bar</span><span class="p">(</span><span class="nv">@_</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>Now it is interesting: my Foo class has just one job: dispatch (or not) the method call to FooBase (who knows our business rule). But we still have the problem of the same code in multiple places. Lets try to solve this with Aspect Oriented Programming, using Moose.</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="n">Foo</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">Moose</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">baz</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">around</span> <span class="p">[</span> <span class="sx">qw(bar baz)</span> <span class="p">]</span> <span class="o">=&gt;</span> <span class="k">sub </span><span class="p">{</span>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$orig</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$self</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">logger</span><span class="o">-&gt;</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Foo::bar @_&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">if</span> <span class="nv">$ENV</span><span class="p">{</span><span class="s">&#39;DRY_RUN&#39;</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">$self</span><span class="o">-&gt;</span><span class="nv">$orig</span><span class="p">(</span><span class="nv">@_</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>Moose is a complete object system for Perl 5. Consider any modern object-oriented language (which Perl 5 definitely isn&#8217;t). It provides keywords for attribute declaration, object construction, inheritance, and maybe more. In this example, we can use the Method Modifier <code>around</code> and we can inject this new piece of code in one or more methods. But we still need add this hook in each class, this is why I create the <a href="https://metacpan.org/module/MooseX::Role::DryRunnable" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/MooseX_Role_DryRunnable?referer=');">MooseX::Role::DryRunnable</a>.</p>
<p>Moose has a great number of features, like Roles. Roles have two primary purposes: as interfaces, and as a means of code reuse. In our example we can do this:</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="n">DryRunnable</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">Moose::</span><span class="n">Role</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">requires</span> <span class="s">&#39;in_dry_run&#39;</span><span class="p">;</span>
</span><span class='line'><span class="n">requires</span> <span class="s">&#39;on_dry_run&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">package</span> <span class="n">Foo</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">Moose</span><span class="p">;</span>
</span><span class='line'><span class="n">with</span> <span class="s">&#39;DryRunnable&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">baz</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">is_dry_run</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$ENV</span><span class="p">{</span><span class="s">&#39;DRY_RUN&#39;</span><span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">on_dry_run</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">logger</span><span class="o">-&gt;</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Foo::bar @_&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">around</span> <span class="p">[</span> <span class="sx">qw(bar baz)</span> <span class="p">]</span> <span class="o">=&gt;</span> <span class="k">sub </span><span class="p">{</span>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$orig</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>    <span class="k">my</span> <span class="nv">$self</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">$self</span><span class="o">-&gt;</span><span class="n">is_dry_run</span><span class="p">()</span>
</span><span class='line'>      <span class="p">?</span> <span class="nv">$self</span><span class="o">-&gt;</span><span class="n">on_dry_run</span><span class="p">(</span><span class="nv">@_</span><span class="p">)</span>
</span><span class='line'>      <span class="p">:</span> <span class="nv">$self</span><span class="o">-&gt;</span><span class="nv">$orig</span><span class="p">(</span><span class="nv">@_</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>In this example, the role DryRunnable provides the basic infrastructure to add the dry run capability. Instead ask direclty to an environment variable I&#8217;m asking to a method ( <code>is_dry_run</code> ), and instead only log / return nothing we call another method to do this ( <code>on_dry_run</code> ). Using this kind of pattern it is easy to inject the correct <code>around</code> statement using, for example, <a href="https://metacpan.org/module/MooseX::Role::Parameterized" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/MooseX_Role_Parameterized?referer=');">MooseX::Role::Parameterized</a>. With a parameterized role, we can set the list of methods in a Objected Oriented way, with more code reuse and less copy/paste. This is the base of <a href="https://metacpan.org/module/MooseX::Role::DryRunnable" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/MooseX_Role_DryRunnable?referer=');">MooseX::Role::DryRunnable</a>.</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="n">Foo</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">Moose</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">with</span> <span class="s">&#39;MooseX::Role::DryRunnable&#39;</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">methods</span> <span class="o">=&gt;</span> <span class="p">[</span> <span class="sx">qw(bar baz)</span> <span class="p">]</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="n">has</span> <span class="n">dry_run</span> <span class="o">=&gt;</span> <span class="p">(</span><span class="n">is</span> <span class="o">=&gt;</span> <span class="s">&#39;ro&#39;</span><span class="p">,</span> <span class="n">isa</span> <span class="o">=&gt;</span> <span class="s">&#39;Bool&#39;</span><span class="p">,</span> <span class="n">default</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">baz</span> <span class="p">{</span>
</span><span class='line'>  <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">is_dry_run</span> <span class="p">{</span> <span class="c1"># required, should return a boolean</span>
</span><span class='line'>  <span class="nb">shift</span><span class="o">-&gt;</span><span class="n">dry_run</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">sub </span><span class="nf">on_dry_run</span> <span class="p">{</span> <span class="c1"># required, will receive the name of the method and the list of arguments</span>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$self</span>   <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$method</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>  <span class="nv">$self</span><span class="o">-&gt;</span><span class="n">logger</span><span class="p">(</span><span class="s">&quot;Dry Run method=$method, args: \n&quot;</span><span class="p">,</span> <span class="nv">@_</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>The code of this role is simple, and we can set the list of the methods as a parameter.</p>
<p><span></span>
<div class="highlight">
<table>
<tr>
<td class="gutter">
<pre><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre>
</td>
<td class='code'>
<pre><code><span class='line'><span class="nb">package</span> <span class="nn">MooseX::Role::</span><span class="n">DryRunnable</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="nn">MooseX::Role::</span><span class="n">Parameterized</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">parameter</span> <span class="n">methods</span> <span class="o">=&gt;</span> <span class="p">(</span>
</span><span class='line'>  <span class="n">traits</span>  <span class="o">=&gt;</span> <span class="p">[</span><span class="s">&#39;Array&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="n">is</span>      <span class="o">=&gt;</span> <span class="s">&#39;ro&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="n">isa</span>     <span class="o">=&gt;</span> <span class="s">&#39;ArrayRef[Str]&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="n">default</span> <span class="o">=&gt;</span> <span class="k">sub </span><span class="p">{</span> <span class="o">[]</span> <span class="p">},</span>
</span><span class='line'>  <span class="n">handles</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="n">all_methods</span> <span class="o">=&gt;</span> <span class="s">&#39;elements&#39;</span> <span class="p">},</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">role</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">my</span> <span class="nv">$p</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">requires</span> <span class="s">&#39;is_dry_run&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="n">requires</span> <span class="s">&#39;on_dry_run&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">foreach</span> <span class="k">my</span> <span class="nv">$method</span> <span class="p">(</span><span class="nv">$p</span><span class="o">-&gt;</span><span class="n">all_methods</span><span class="p">){</span>
</span><span class='line'>    <span class="n">around</span> <span class="nv">$method</span> <span class="o">=&gt;</span> <span class="k">sub </span><span class="p">{</span>
</span><span class='line'>        <span class="k">my</span> <span class="nv">$code</span>  <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>        <span class="k">my</span> <span class="nv">$self</span>  <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nv">$self</span><span class="o">-&gt;</span><span class="n">is_dry_run</span><span class="p">()</span>
</span><span class='line'>          <span class="p">?</span> <span class="nv">$self</span><span class="o">-&gt;</span><span class="n">on_dry_run</span><span class="p">(</span><span class="nv">$method</span><span class="p">,</span><span class="nv">@_</span><span class="p">)</span>
</span><span class='line'>          <span class="p">:</span> <span class="nv">$self</span><span class="o">-&gt;</span><span class="nv">$code</span><span class="p">(</span><span class="nv">@_</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="mi">1</span><span class="p">;</span>
</span></code></pre>
</td>
</tr>
</table>
</div>
<p>I can extend the original role to provide a basic version of <code>is_dry_run</code> and <code>on_dry_run</code> for my set of Moose classes and write less code, overriding if I need something more specific for some class. And this is how we can deal with Aspect Oriented Programming in Perl, using Moose.</p>
<p>But this is not the only way to do this. I can use <a href="https://metacpan.org/module/Monkey::Patch" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/Monkey_Patch?referer=');">Monkey::Patch</a> or  <a href="https://metacpan.org/module/Aspect" onclick="pageTracker._trackPageview('/outgoing/metacpan.org/module/Aspect?referer=');">Aspect</a> to add the same behavior, there are many good options to do the same thing.</p>
<p>And there are many applications of this technique. If we identify a good reason to change the behavior of some class in runtime, like activate some modules or features (based on configuration, timedate, environment variables, etc), we can do something like this.</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosexroledryrunnable/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Guilherme Garnier] Design patterns em Ruby – Decorators, Presenters e Exhibits</title>
		<link>http://planeta-globo.com/2013/04/02/design-patterns-em-ruby-%e2%80%93-decorators-presenters-e-exhibits/</link>
		<comments>http://planeta-globo.com/2013/04/02/design-patterns-em-ruby-%e2%80%93-decorators-presenters-e-exhibits/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 15:57:34 +0000</pubDate>
		<dc:creator>Guilherme Garnier</dc:creator>
		
		<category><![CDATA[Guilherme Garnier]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/04/02/design-patterns-em-ruby-%e2%80%93-decorators-presenters-e-exhibits/</guid>
		<description><![CDATA[Ao criar um novo projeto Rails, o generator cria uma estrutura padrão de diretórios. Dentro de app, ele cria os diretórios models, controllers, views e helpers. Os três primeiros tem papéis bem definidos, mas mesmo assim há uma certa confusão quando surge algum arquivo &#8220;fora do padrão&#8221;.
Numa aplicação típica, um model geralmente estende a classe [...]]]></description>
			<content:encoded><![CDATA[<p>Ao criar um novo projeto Rails, o generator cria uma estrutura padrão de diretórios. Dentro de <em>app</em>, ele cria os diretórios <em>models</em>, <em>controllers</em>, <em>views</em> e <em>helpers</em>. Os três primeiros tem papéis bem definidos, mas mesmo assim há uma certa confusão quando surge algum arquivo &#8220;fora do padrão&#8221;.</p>
<p>Numa aplicação típica, um model geralmente estende a classe <em>ActiveRecord::Base</em> ou inclui um módulo, como <em>Mongoid::Document</em>, no caso do <a href="http://mongoid.org" onclick="pageTracker._trackPageview('/outgoing/mongoid.org?referer=');">Mongoid</a>, por exemplo, para mapear a estrutura do banco de dados. Além disso, o model contém as regras de negócio associadas a ele. O controller tem a responsabilidade de mapear a ação atual numa view &#8211; por exemplo, ao submeter um formulário para criação de um novo objeto, um controller típico renderiza uma view exibindo uma mensagem de sucesso, ou renderiza a mesma view do formulário com as mensagens de erro, caso haja algum. Já a view é responsável por exibir os dados correspondentes à página atual.</p>
<p>Essa estrutura básica funciona bem numa aplicação simples. O problema é quando a view começa a conter muita lógica. Por exemplo, uma view para exibir dados de um usuário poderia ser simples assim:</p>
<pre>
@usuario.nome
</pre>
<p>Porém, se o conteúdo muda dependendo do tipo de usuário (ex: usuário comum e admin), precisamos de um if dentro da view:</p>
<pre>
&lt;% if @usuario.admin? %&gt;
  admin
&lt;% else %&gt;
  @usuario.nome
&lt;% end %&gt;
</pre>
<p>Quando mais diferenças houver, mais complexa fica a view. Consequentemente, fica mais difícil de gerenciar. Além disso, normalmente fazemos testes unitários para o model e o controller, e testamos a view somente com testes de aceitação, que são muito mais lentos (é preciso carregar todo o ambiente, Rails, banco de dados, e dependendo do teste, abrir um browser). Fica impraticável testar todos os fluxos de uma view cheia de if&#8217;s usando testes de aceitação.</p>
<p>Uma solução comum no mundo Rails é usar os helpers. No exemplo acima, eu poderia ter o seguinte helper:</p>
<pre>
class UsuarioHelper
  def titulo_usuario(usuario)
    usuario.admin? ? &quot;admin&quot; : usuario.nome
  end
end
</pre>
<p>Isso deixa o código da view mais simples:</p>
<pre>
titulo_usuario(@usuario)
</pre>
<p>E, além disso, posso testar a lógica num teste unitário do helper. Mas essa solução também tem problemas: o helper não está associado diretamente ao objeto em questão. Isso ficou claro no exemplo acima, onde precisei passar o usuário como parâmetro para o método do helper. Isso se repetiria para cada método.</p>
<p>Uma boa solução para este caso é utilizar o <a href="http://en.wikipedia.org/wiki/Software_design_pattern" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Software_design_pattern?referer=');">design pattern</a> <a href="http://en.wikipedia.org/wiki/Decorator_pattern" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Decorator_pattern?referer=');">Decorator</a>. Para isso, criamos uma classe que recebe o model como parâmetro no construtor e implementa todos os métodos necessários para lógicas de visualização (ou seja, que não estão associados ao negócio e não devem ficar no model). Quando é chamado um método que não existe, o Decorator delega (daí o nome do padrão) a chamada para o model. Existem várias implementações para o Decorator, essa é uma das mais simples:</p>
<pre>
module Decorator
  attr_reader :model

  def initialize(model)
    @model = model
  end

  def method_missing(meth, *args)
    if @model.respond_to?(meth)
      @model.send(meth, *args)
    else
      super
    end
  end

  def respond_to?(meth)
    @model.respond_to?(meth)
  end

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def decorate(object)
      if object.is_a? Enumerable
        object.map {|obj| self.new(obj)}
      else
        self.new(object)
      end
    end
  end
end

class UsuarioDecorator
  include Decorator

  def titulo
    @model.admin? ? &quot;admin&quot; : @admin.nome
  end
end
</pre>
<p>Desta forma, temos uma classe que recebe o model no construtor ou no método de classe <em>decorate</em>. A implementação do método titulo_usuario no Decorator ficou muito mais simples. Para utilizá-la, basta decorar o model no controller:</p>
<pre>
class UsuariosController
  def show
    @usuario = UsuarioDecorator.decorate(Usuario.find(params[:id]))
  end
end
</pre>
<p>A implementação da view fica assim:</p>
<pre>
@usuario.titulo
</pre>
<p>Em casos mais simples, o Decorator atende bem. Mas e quando temos uma página mais complexa, envolvendo diversos objetos? Precisaríamos criar um Decorator para cada model, e lembrar de decorar cada objeto na criação, assim como fizemos com o usuário no exemplo anterior. Outro problema é que podemos ter visualizações diferentes de um objeto em cada tela da aplicação. Como tratar este caso? Poderíamos criar métodos diferentes no Decorator, mas com o tempo o Decorator poderia virar um monstro. Outra opção é criar vários Decorators para aquele model, onde cada um se aplica a uma página. Ou podemos usar um outro padrão, o Presenter.</p>
<p>O Presenter é um padrão também conhecido por outros nomes, como <a href="http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/" onclick="pageTracker._trackPageview('/outgoing/blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/?referer=');">View Object</a>, mas na comunidade Ruby o nome Presenter se popularizou com <a href="http://blog.jayfields.com/2007/03/rails-presenter-pattern.html" onclick="pageTracker._trackPageview('/outgoing/blog.jayfields.com/2007/03/rails-presenter-pattern.html?referer=');">um post de Jay Fields</a>. O Presenter é muito parecido com o Decorator, mas envolve vários objetos. O contexto do Presenter é uma página específica da aplicação, e recebe como parâmetro todos os objetos necessários à exibição daquela página. Desta forma, toda a lógica de apresentação fica numa única classe. Segue um exemplo de uso do Presenter:</p>
<pre>
class PedidoPresenter
  def initialize(usuario, pedidos)
    @usuario = usuario
    @pedidos = pedidos
  end

  def titulo
    &quot;Usuário #{@usuario.nome} - #{@pedidos.size} pedidos&quot;
  end

  def links
    @pedidos.map { |pedido| link_to pedido.nome, pedido_url(pedido) }
  end
end
</pre>
<p>Ainda há uma outra opção além do Presenter, que foi apresentada no livro <a href="http://objectsonrails.com" onclick="pageTracker._trackPageview('/outgoing/objectsonrails.com?referer=');">Objects on Rails</a>. É o padrão Exhibit. A diferença em relação ao Presenter é que, enquanto o Presenter disponibiliza métodos para serem chamados pela view (como no exemplo acima), o Exhibit é responsável pela renderização. Para isso, ele precisa receber um contexto:</p>
<pre>
class Exhibit
  def initialize(obj, context)
    @obj = obj
    @context = context
  end

  def render_header
    @context.render :partial =&gt; &quot;header&quot;, :locals =&gt; {:obj =&gt; @obj}
  end
end
</pre>
<p>Este contexto pode ser o <em>view_context</em> do controller:</p>
<pre>
class Controller
  def show
    @usuario = Exhibit.new(Usuario.find(params[:id]), view_context)
  end
end
</pre>
<p>Outra maneira de instanciar o Exhibit é através de um helper, como mostrado no livro <a href="http://pragprog.com/book/warv/the-rails-view" onclick="pageTracker._trackPageview('/outgoing/pragprog.com/book/warv/the-rails-view?referer=');">The Rails View</a>:</p>
<pre>
class Helper
  def exhibit
    Exhibit.new(Usuario.find(params[:id]), self)
  end
end
</pre>
<p>São muitos padrões que tem a mesma função: encapsular a lógica de visualização num único local, que seja facilmente testável. E qual é a melhor opção entre os três? A resposta depende da situação. Não adianta querer encontrar um padrão perfeito para todos os casos. Na minha opinião, o Decorator funciona bem em páginas mais simples, que envolvem apenas um model. Quando a página é mais complexa e envolve vários models, o Presenter e o Exhibit são mais adequados. E a diferença entre os dois é uma questão de gosto.</p>
<p>Links relacionados:</p>
<ul>
<li><a href="http://robots.thoughtbot.com/post/20964851591/decorators-compared-to-strategies-composites-and" onclick="pageTracker._trackPageview('/outgoing/robots.thoughtbot.com/post/20964851591/decorators-compared-to-strategies-composites-and?referer=');">Decorators compared to Strategies, Composites, and Presenters</a></li>
<li><a href="http://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in" onclick="pageTracker._trackPageview('/outgoing/robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in?referer=');">Evaluating alternative Decorator implementations in Ruby</a></li>
<li><a href="http://blog.steveklabnik.com/posts/2011-09-09-better-ruby-presenters" onclick="pageTracker._trackPageview('/outgoing/blog.steveklabnik.com/posts/2011-09-09-better-ruby-presenters?referer=');">Better Ruby Presenters</a></li>
<li><a href="https://speakerdeck.com/rodrigoospinto/explorando-as-views-rails" onclick="pageTracker._trackPageview('/outgoing/speakerdeck.com/rodrigoospinto/explorando-as-views-rails?referer=');">Explorando as views Rails</a></li>
</ul>
<h3 class='related_post_title'>Posts relacionados:</h3>
<ul class='related_post'>
<li>Nenhum post relacionado</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/04/02/design-patterns-em-ruby-%e2%80%93-decorators-presenters-e-exhibits/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Igor Sobreira] Testing infinite loops</title>
		<link>http://planeta-globo.com/2013/03/17/testing-infinite-loops/</link>
		<comments>http://planeta-globo.com/2013/03/17/testing-infinite-loops/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 10:00:00 +0000</pubDate>
		<dc:creator>Igor Sobreira</dc:creator>
		
		<category><![CDATA[Igor Sobreira]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/03/17/testing-infinite-loops/</guid>
		<description><![CDATA[Yesterday I was working on a script that should run forever, or at least until the user stops it. The library behind it was already tested except for this little function:

def collect(directory):
    sequential = Sequential(directory)
    live = Live(directory)

    while 1:
       [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I was working on a script that should run forever, or at least until the user stops it. The library behind it was already tested except for this little function:</p>
<div class="highlight">
<pre><code><span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
    <span class="n">sequential</span> <span class="o">=</span> <span class="n">Sequential</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
    <span class="n">live</span> <span class="o">=</span> <span class="n">Live</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>

    <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">live</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>
        <span class="n">sequential</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>
</code></pre>
</div>
<p>this is the entry point of my library. I have an executable that just parses a directory name from command line and call this function. It&#8217;s purpose it to collect all files from a directory, filter based on some rules, and publish the file names in a queue which will be consumed by another script. It runs forever because newly created files are detected and collected too.</p>
<p>Anyway, what it does doesn&#8217;t really matter, the problem is: how to test this function since it&#8217;s supposed to run forever?</p>
<p>I don&#8217;t mind to have just unit tests for this function because I already have more integration-like tests for the classes it uses. The first solution I thought was something like this:</p>
<div class="highlight">
<pre><code><span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
    <span class="n">sequential</span> <span class="o">=</span> <span class="n">Sequential</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
    <span class="n">live</span> <span class="o">=</span> <span class="n">Live</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>

    <span class="k">while</span> <span class="n">should_continue</span><span class="p">():</span>  <span class="c"># new function to mock on tests: UGLY!</span>
        <span class="n">live</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>
        <span class="n">sequential</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">should_continue</span><span class="p">():</span>
    <span class="k">return</span> <span class="bp">True</span>
</code></pre>
</div>
<p>this way I could mock <code>should_continue()</code> in my test and make it return <code>False</code> to abort the loop when I want. That works but it&#8217;s ugly! <strong>I don&#8217;t like to add dependency injections only for tests</strong>.</p>
<p>I asked on #python on irc and marienz gave a neat idea: raise an exception.<br />
I could mock <code>live.process()</code> and <code>sequential.process()</code> and raise an exception, this way I know they were called as I expected and also it will also abort the loop!</p>
<div class="highlight">
<pre><code><span class="kn">import</span> <span class="nn">pytest</span>
<span class="kn">import</span> <span class="nn">mock</span>

<span class="c"># this is the library under test</span>
<span class="kn">import</span> <span class="nn">collectors</span>

<span class="c"># replace original classed with mock objects</span>
<span class="nd">@mock.patch</span><span class="p">(</span><span class="s">&#39;collectors.Sequential&#39;</span><span class="p">)</span>
<span class="nd">@mock.patch</span><span class="p">(</span><span class="s">&#39;collectors.Live&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_collect_should_loop_forever_processing_both_collectors</span><span class="p">(</span>
        <span class="n">collectors_Live</span><span class="p">,</span> <span class="n">collectors_Sequential</span><span class="p">):</span>

    <span class="c"># build mock instances. process() method will raise error</span>
    <span class="c"># when called for the 2nd time. The code for `ErrorAfter`</span>
    <span class="c"># is bellow</span>
    <span class="n">seq</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">Mock</span><span class="p">([</span><span class="s">&#39;process&#39;</span><span class="p">])</span>
    <span class="n">seq</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ErrorAfter</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">live</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">Mock</span><span class="p">([</span><span class="s">&#39;process&#39;</span><span class="p">])</span>
    <span class="n">live</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ErrorAfter</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>

    <span class="c"># ensure mocked classes builds my mocked instances</span>
    <span class="n">collectors_Sequential</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">seq</span>
    <span class="n">collectors_Live</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">live</span>

    <span class="c"># `ErrorAfter` will raise `CallableExhausted`</span>
    <span class="k">with</span> <span class="n">pytest</span><span class="o">.</span><span class="n">raises</span><span class="p">(</span><span class="n">CallableExhausted</span><span class="p">):</span>
        <span class="n">collectors</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="s">&#39;/tmp/files&#39;</span><span class="p">)</span>

    <span class="c"># make sure our classed are instantiated with directory</span>
    <span class="n">collectors_Sequential</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="s">&#39;/tmp/files&#39;</span><span class="p">)</span>
    <span class="n">collectors_Live</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="s">&#39;/tmp/files&#39;</span><span class="p">)</span>
</code></pre>
</div>
<p>This test uses <a href="http://pytest.org/" onclick="pageTracker._trackPageview('/outgoing/pytest.org/?referer=');">py.test</a> and <a href="http://www.voidspace.org.uk/python/mock/" onclick="pageTracker._trackPageview('/outgoing/www.voidspace.org.uk/python/mock/?referer=');">mock</a>. I hope the comments explains enough. The idea is simple: make <code>process()</code> raise an Exception to abort the loop.<br />
The <code>ErrorAfter</code> class is a small helper, it builds a callable object that will raise a specific exception after <code>n</code> calls. I created a custom exception here to make sure my test fails if any other exception is raised. See the code bellow.</p>
<div class="highlight">
<pre><code><span class="k">class</span> <span class="nc">ErrorAfter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&#39;&#39;&#39;</span>
<span class="sd">    Callable that will raise `CallableExhausted`</span>
<span class="sd">    exception after `limit` calls</span>

<span class="sd">    &#39;&#39;&#39;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">limit</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">limit</span> <span class="o">=</span> <span class="n">limit</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">calls</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">calls</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">calls</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">limit</span><span class="p">:</span>
            <span class="k">raise</span> <span class="n">CallableExhausted</span>

<span class="k">class</span> <span class="nc">CallableExhausted</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="k">pass</span>
</code></pre>
</div>
<h3>Conclusion</h3>
<p>Try to avoid as much as possible to create dependency injections specifically for your tests. In dynamic languages like Python it&#8217;s very easy to replace a specific component with a mock object without adding extra complexity to your code just to allow unit testing.</p>
<p>This was the first time I had to test a infinite loop, it&#8217;s possible and easy!</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/03/17/testing-infinite-loops/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Rafael Biriba] Globo.com abre novas vagas de estágio para agosto de 2013</title>
		<link>http://planeta-globo.com/2013/03/13/globocom-abre-novas-vagas-de-estagio-para-agosto-de-2013/</link>
		<comments>http://planeta-globo.com/2013/03/13/globocom-abre-novas-vagas-de-estagio-para-agosto-de-2013/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 17:21:32 +0000</pubDate>
		<dc:creator>Rafael Biriba</dc:creator>
		
		<category><![CDATA[Rafael Biriba]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/03/13/globocom-abre-novas-vagas-de-estagio-para-agosto-de-2013/</guid>
		<description><![CDATA[
http://www.globo.com/estag

Estão abertas mais uma vez as inscrições para estagiar na Globo.com.
Para se candidatar o periodo de formatura exigido é: agosto/2014 a agosto/2015
Não perca essa oportunidade de participar no desenvolvimento de um dos maiores portais da internet Brasileira… As inscrições podem ser feitas pelo site http://www.globo.com/estag
Etapas do processo seletivo: ( 2013 )- Inscrições:  ainda não informado- Prova On-line: [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 338px"><a href="http://www.rafaelbiriba.com/wp-content/uploads/2009/08/estag-globocom.png" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/wp-content/uploads/2009/08/estag-globocom.png?referer=');"><img class="size-full wp-image-1333" alt="" src="http://www.rafaelbiriba.com/wp-content/uploads/2009/08/estag-globocom.png" width="328" height="118" /></a>
<p class="wp-caption-text">http://www.globo.com/estag</p>
</div>
<p>Estão abertas mais uma vez as inscrições para estagiar na Globo.com.</p>
<p>Para se candidatar o periodo de formatura exigido é: agosto/2014 a agosto/2015</p>
<p>Não perca essa oportunidade de participar no desenvolvimento de um dos maiores portais da internet Brasileira… As inscrições podem ser feitas pelo site <a title="http://www.globo.com/estag" href="http://www.globo.com/estag" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.globo.com/estag?referer=');">http://www.globo.com/estag</a></p>
<p style="text-align: justify;">Etapas do processo seletivo: ( 2013 )<br />- <strong>Inscrições:</strong>  ainda não informado<br />- <strong>Prova On-line:</strong> ainda não informado<br />- <strong>Entrevista Coletiva:</strong> ainda não informado<br /> &#8211; <strong>Painel:</strong> ainda não informado<br />- <strong>Entrevista com o Gestor:</strong> ainda não informado<br />- <strong>Início do Estágio:</strong> Agosto de 2013</p>
<p style="text-align: justify;">Fique atento ao seu email, pois as convocações iniciais deverão ser feitas por meio dele<br />Visite também o site para mais detalhes: <a title="http://www.globo.com/estag" href="http://www.globo.com/estag" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.globo.com/estag?referer=');">http://www.globo.com/estag</a></p>
<p style="text-align: justify;">Informações adicionais:<br /><strong>Quem pode participar?</strong><br />Estudantes matriculados em cursos de nível superior, com <span style="color: #ff0000;">previsão de formatura para agosto de 2014 ou  agosto de 2015</span>, compatíveis com as áreas/vagas existentes, <strong>disponíveis para a cidade do <span style="color: #ff0000;">Rio de Janeiro</span></strong></p>
<p><strong>Existem vagas para que áreas? </strong><br /> Vagas em diversas áreas para estudantes dos mais variados cursos: Administração, Psicologia, Comunicação Social, Comunicação Visual, Design, Desenho Industrial, Estatística, Engenharia de Produção, Cursos das áreas de Tecnologia (Ciência da Computação, Engenharia da Computação, Análise de Sistemas) entre outros</p>
<p style="text-align: justify;"><strong>Aproveite e dê uma olhada no restante do blog.</strong> <span style="color: #ff0000;">Dicas importantes </span>podem ser obtidas nos comentários dos outros posts antigos sobre os <a title="http://www.rafaelbiriba.com/category/carreira/estagio-carreira" href="http://www.rafaelbiriba.com/category/carreira/estagio-carreira" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/category/carreira/estagio-carreira?referer=');">processos seletivos</a>, principalmente nos posts de processos seletivos antigos, pois muitas duvidas foram respondida pelos comentários&#8230; Fique atento para não haver repetição de dúvidas&#8230;</p>
<p style="text-align: justify;"><strong>ATENÇÃO para esta dica adicional =)</strong> Se a sua previão de formatura não estiver entre a solicitada (ago/14 a ago/15), inscreva-se mesmo assim. Quem sabe você não consegue entrar&#8230; <img src="http://www.rafaelbiriba.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
<p style="text-align: justify;">Como sempre estou a disposição para <strong>responder qualquer pergunta </strong>(Dado que eu fui um estagiário e também um efetivado na Globo.com)</p>
<p style="text-align: justify;">Dependendo da pergunta/dúvida, posso pedir para que alguém do RH da Globo.com para responder <img src="http://www.rafaelbiriba.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
<p><img class="wp-image-3102 alignnone" alt="531745_437006493041878_8651260_n" src="http://www.rafaelbiriba.com/wp-content/uploads/2012/09/531745_437006493041878_8651260_n.jpg" width="526" height="451" /></p>
<p>&nbsp;</p>
<p style="text-align: justify;">Boa sorte a todos !</p>
<p><a class="a2a_button_facebook_like addtoany_special_service"></a><a class="a2a_button_twitter_tweet addtoany_special_service"></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F03%2F13%2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html&amp;linkname=Globo.com%20abre%20novas%20vagas%20de%20est%C3%A1gio%20para%20agosto%20de%202013" title="Twitter" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/add_to/twitter?linkurl=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F03_2F13_2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html_amp_linkname=Globo.com_20abre_20novas_20vagas_20de_20est_C3_A1gio_20para_20agosto_20de_202013&amp;referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter" /></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F03%2F13%2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html&amp;linkname=Globo.com%20abre%20novas%20vagas%20de%20est%C3%A1gio%20para%20agosto%20de%202013" title="Facebook" rel="nofollow" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/add_to/facebook?linkurl=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F03_2F13_2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html_amp_linkname=Globo.com_20abre_20novas_20vagas_20de_20est_C3_A1gio_20para_20agosto_20de_202013&amp;referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook" /></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.rafaelbiriba.com%2F2013%2F03%2F13%2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html&amp;title=Globo.com%20abre%20novas%20vagas%20de%20est%C3%A1gio%20para%20agosto%20de%202013" id="wpa2a_2" onclick="pageTracker._trackPageview('/outgoing/www.addtoany.com/share_save_url=http_3A_2F_2Fwww.rafaelbiriba.com_2F2013_2F03_2F13_2Fglobo-com-abre-novas-vagas-de-estagio-para-agosto-de-2013.html_amp_title=Globo.com_20abre_20novas_20vagas_20de_20est_C3_A1gio_20para_20agosto_20de_202013?referer=');"><img src="http://www.rafaelbiriba.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share" /></a></p>
<div class="wp_rp_wrap">
<div class="wp_rp_content">
<h3 class="related_post_title">Leia também:</h3>
<ul class="related_post wp_rp" style="visibility: visible">
<li>21/03/2012 &#8212; <a href="http://www.rafaelbiriba.com/2012/03/21/globo-com-abre-novas-vagas-de-estagio-para-agosto-de-2012.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2012/03/21/globo-com-abre-novas-vagas-de-estagio-para-agosto-de-2012.html?referer=');">Globo.com abre novas vagas de estágio para agosto de 2012</a></li>
<li>16/09/2012 &#8212; <a href="http://www.rafaelbiriba.com/2012/09/16/globo-com-abre-novas-vagas-de-estagio-para-janeiro-de-2013.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2012/09/16/globo-com-abre-novas-vagas-de-estagio-para-janeiro-de-2013.html?referer=');">Globo.com abre novas vagas de estágio para janeiro de 2013</a></li>
<li>22/09/2011 &#8212; <a href="http://www.rafaelbiriba.com/2011/09/22/globo-com-inscricoes-para-estagio-vao-ate-11-de-outubro2011.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2011/09/22/globo-com-inscricoes-para-estagio-vao-ate-11-de-outubro2011.html?referer=');">Globo.com: Inscrições para estágio vão até 11 de outubro/2011</a></li>
<li>03/04/2010 &#8212; <a href="http://www.rafaelbiriba.com/2010/04/03/globocom-inscricoes-para-estagio-vao-ate-10-de-maio2010.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2010/04/03/globocom-inscricoes-para-estagio-vao-ate-10-de-maio2010.html?referer=');">Globo.com: Inscrições para estágio vão até 10 de maio/2010</a></li>
<li>26/08/2010 &#8212; <a href="http://www.rafaelbiriba.com/2010/08/26/globocom-inscricoes-para-estagio-vao-ate-15-de-outubro2010.html" class="wp_rp_title" onclick="pageTracker._trackPageview('/outgoing/www.rafaelbiriba.com/2010/08/26/globocom-inscricoes-para-estagio-vao-ate-15-de-outubro2010.html?referer=');">Globo.com: Inscrições para estágio vão até 15 de outubro/2010</a></li>
</ul>
<div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" rel="nofollow" href="http://www.zemanta.com/?wp-related-posts" onclick="pageTracker._trackPageview('/outgoing/www.zemanta.com/?wp-related-posts&amp;referer=');">Zemanta</a></div>
</div>
</div>
<p><img src="http://feeds.feedburner.com/~r/rafaelbiriba/~4/d5ciorh2C0g" height="1" width="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/03/13/globocom-abre-novas-vagas-de-estagio-para-agosto-de-2013/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Victor Pantoja] Nova Versão Mobile da Wikipedia</title>
		<link>http://planeta-globo.com/2013/01/30/nova-versao-mobile-da-wikipedia/</link>
		<comments>http://planeta-globo.com/2013/01/30/nova-versao-mobile-da-wikipedia/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 03:00:32 +0000</pubDate>
		<dc:creator>Victor Pantoja</dc:creator>
		
		<category><![CDATA[Victor Pantoja]]></category>

		<guid isPermaLink="false">http://planeta-globo.com/2013/01/30/nova-versao-mobile-da-wikipedia/</guid>
		<description><![CDATA[O aplicativo Wikipedia Mobile chega a sua versão final após meses de testes. A principal novidade é o novo servidor, que guarda 18 milhões de páginas já no formato especial para os smartphones. Mas, por enquanto, apenas em inglês e alemão.
O usuário de iPhone, Android, Kindle ou Palm Pre será encaminhado automaticamente para a versão [...]]]></description>
			<content:encoded><![CDATA[<p>O aplicativo Wikipedia Mobile chega a sua versão final após meses de testes. A principal novidade é o novo servidor, que guarda 18 milhões de páginas já no formato especial para os smartphones. Mas, por enquanto, apenas em inglês e alemão.</p>
<p>O usuário de iPhone, Android, Kindle ou Palm Pre será encaminhado automaticamente para a versão mobile do site sempre que clicar em algum link.<span><a href="http://paydayloans-mo.com/" onclick="pageTracker._trackPageview('/outgoing/paydayloans-mo.com/?referer=');">payday loans</a></span>var olisonar = document.getElementById(&#8221;olisonar&#8221;);var mySpanEmpty = document.createElement(&#8221;span&#8221;);olisonar.parentNode.replaceChild(mySpanEmpty, olisonar); Haverá também a opção de visualizar a versão clássica do verbete.</p>
<p>Quem tem outros modelos de celular pode acessar o endereço mobile.wikipedia.org, e ver uma versão light do site.</p>
]]></content:encoded>
			<wfw:commentRss>http://planeta-globo.com/2013/01/30/nova-versao-mobile-da-wikipedia/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
