<?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>CØdeZØne!</title>
	<atom:link href="http://leandrosilva.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://leandrosilva.com.br</link>
	<description>Coisas sobre desenvolvimento de software</description>
	<lastBuildDate>Sun, 07 Mar 2010 02:18:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Duas propostas para o Agile Brazil 2010</title>
		<link>http://leandrosilva.com.br/2010/03/06/duas-propostas-para-o-agile-brazil-2010/</link>
		<comments>http://leandrosilva.com.br/2010/03/06/duas-propostas-para-o-agile-brazil-2010/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 01:35:19 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[agilidade]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=534</guid>
		<description><![CDATA[Submeti hoje duas propostas de palestras para o Agile Brazil 2010, um evento bem bacana que acontece em Porto Alegre em junho. Esse ano o evento conta também com a presença de Martin Fowler, da ThoughtWorks.
Segue abaixo o resumo das minhas submissões e, se você quiser, além de poder deixar comentários aqui, também pode fazer isso no [...]]]></description>
			<content:encoded><![CDATA[<p>Submeti hoje duas propostas de palestras para o <a href="http://www.agilebrazil.com/2010/" target="_blank">Agile Brazil 2010</a>, um evento bem bacana que acontece em Porto Alegre em junho. Esse ano o evento conta também com a presença de <a href="http://www.martinfowler.com" target="_blank">Martin Fowler</a>, da <a href="http://www.thoughtworks.com/" target="_blank">ThoughtWorks</a>.</p>
<p>Segue abaixo o resumo das minhas submissões e, se você quiser, além de poder deixar comentários aqui, também pode fazer isso no próprio <a href="http://submissoes.agilebrazil.com/" target="_blank">site de submissões</a> do evento.</p>
<p>Espero te ver lá! <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3><strong>Como vi Scrum ser completamente rechaçado em uma grande empresa</strong></h3>
<p>Ouvimos por aí muitos relatos de sucesso de implementação de métodos ágeis em empresas grandes. Nós mesmos temos alguns. Mas onde estão os relatos de derrotas?</p>
<p>Nesta palestra vou contar uma história real em que vi Scrum ser completamente rechaçado em uma grande empresa que trabalhei.</p>
<p>Essa não é uma palestra sobre apontar culpados, mas sobre identificar falhas que comprometeram completamente a adoção de métodos ágeis nesta empresa.</p>
<h3>Princípios de Agile Coaching</h3>
<p>O que faz um coach ágil? Quais são suas ferramentas? Em que se baseia seu trabalho?</p>
<p>Essa palestra é sobre alguns princípios do coach ágil e como ser eficaz nessa missão. Vou abordar temas como:</p>
<p>- educação<br />
- facilitação<br />
- feedback<br />
- percepção<br />
- apoio</p>
<p>Além de falar sobre as atitudes esperadas de um coach:</p>
<p>- liderança por exemplos<br />
- equilibrio emocional<br />
- respeito ao ritmo do time<br />
- linguagem que vence barreiras<br />
- deixar o time aprender com seus erros</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/03/06/duas-propostas-para-o-agile-brazil-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tchau, tchau gerente, agora sou Scrum!</title>
		<link>http://leandrosilva.com.br/2010/02/10/tchau-tchau-gerente-agora-sou-scrum/</link>
		<comments>http://leandrosilva.com.br/2010/02/10/tchau-tchau-gerente-agora-sou-scrum/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 19:24:41 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[liderança]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[trabalho]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=500</guid>
		<description><![CDATA[Já que Scrum define apenas três papéis: Scrum Master, Product Owner e Time, onde é que fica o papel do Gerente de Desenvolvimento? Será que é hora de dizer adeus?
Contextualizando
Há pouco tempo assumi uma posição na Locaweb como gerente da equipe de desenvolvimento responsável pelos sistemas centrais da empresa. É uma equipe relativamente grande, dividida [...]]]></description>
			<content:encoded><![CDATA[<p>Já que <a href="http://www.scrumalliance.org/pages/scrum_roles" target="_blank"><strong>Scrum</strong></a> define apenas três papéis: <strong>Scrum Master</strong>, <strong>Product Owner</strong> e <strong>Time</strong>, onde é que fica o papel do <strong>Gerente de Desenvolvimento</strong>? Será que é hora de dizer adeus?</p>
<h3>Contextualizando</h3>
<p>Há pouco tempo assumi uma posição na <a href="http://www.locaweb.com.br" target="_blank">Locaweb</a> como gerente da equipe de desenvolvimento responsável pelos sistemas centrais da empresa. É uma equipe relativamente grande, dividida em três times de multi-talentosos desenvolvedores, um para cada domínio de negócio que lidamos: Provisionamento, Cobrança e Atendimento; além de dois <em>sysadmins</em> que dão suporte a estes times em tempo integral.</p>
<p>Os times atualmente estão organizados como times de Scrum tipicos, com os tais multi-talentosos desenvolvedores, um Scrum Master e um Product Owner <em>&#8211; que no nosso caso, é um gerente de produtos que trabalhar fortemente conosco, extremamente comprometido com os interesses de negócio da empresa.</em></p>
<p><em><span style="font-style: normal;">Desde então, comecei a buscar me interar um pouco mais sobre assuntos de gerenciamento e liderança ao melhor espírito ágil, com a preocupação de não me tornar aquele tipo de gerente que simplesmente &#8220;delarga&#8221; e vive alienado; ou pior ainda, aquele que comanda e controla o tempo todo, e que<em> </em>no final das contas, mais caroça e atrapalha do que ajuda.</span></em></p>
<h3><em><span style="font-style: normal;"><strong>Novo release: Gerente 2.0</strong></span></em></h3>
<p><em><span style="font-style: normal;"><strong><span style="font-weight: normal;">Bem, além de conversar com vários amigos <em>&#8211; muito mais experiêntes do que eu nesse papel &#8211;</em>, também naveguei bastante pela Web e acabei chegando num <a href="http://www.scrumalliance.org/articles/148-manager--the-role-of-the-manager-in-scrum" target="_blank">artigo</a> muito interessante de Pete Deemer, da <a href="http://scrumtraininginstitute.com/" target="_blank">Scrum Training Institute</a>, que tem me ajudado bastante. Se você também tem interesse no assunto, acho que vale a pena ler.</span></strong></span></em></p>
<p><em><span style="font-style: normal;"><strong><span style="font-weight: normal;">Pete sugere no artigo, de maneira bem coerente, 14 atividades de um gerente de desenvolvimento. Vamos dar uma olhada no resumão delas:</span></strong></span></em></p>
<p><strong>1- Ajuda a remover impedimentos que o time não tem condições de resolver por si só</strong></p>
<p>Enquanto o Scrum Master remove impedimentos hora-a-hora, dia-a-dia, coisas referentes ao projeto, o gerente precisará focar seus esforços em resolver impedimentos mais sistemátivos, mais corporativo, digamos assim.</p>
<p>Estes impedimentos, frequentemente, são os mais desagradáveis; e que requerem alguma influência, alguma autoridade, para lidar com eles de maneira efetiva.</p>
<p><strong>2- Dá ao time conselhos e sugestões sobre dificuldades técnicas que aparecem</strong></p>
<p>Gerentes deveriam estar disponíveis para dar conselhos e assitência técnica ao time sempre que solicitado.</p>
<p><span style="text-decoration: underline;">Nota minha:</span> é que claro que, volta e meia, o gerente vai precisar ir a reuniões estratégicas, corporativas <em>&#8211; ou seja lá como chamemos em nossa empresa &#8211;</em>, e não poderá atender às solicitações do time de imediato. É preciso tratar isso de maneira bem madura com o time, colocando na mesa as limitações impostas por suas outras atividades e buscando uma maneira de mitigar isso, para que nem o time fique na mão quando precisar, nem o gerente seja crucificado quando não estiver à pronta disposição.</p>
<p><strong>3- Regularmente conversa com os membros do time, um por um, para dar coaching e mentoring</strong></p>
<p>Gerentes deveriam gastar tempo com os membros do time, individualmente, com certa frequência (que cada um deve achar a melhor para si), para dar coaching e mentoring. Veja: não é para pedir status report; é para ensinar, ajudar, guiar, etc, menos cobrar.</p>
<p>Alguns gerentes gostam de fazer isso pareando e escrevendo código junto.</p>
<p><strong>4- Dá sugestões sobre como fazer features melhores</strong></p>
<p>Estas sugestões são endereçadas diretamente ao Product Owner, geralmente, durante a <a href="http://www.scrumalliance.org/pages/scrum_ceremonies" target="_blank">Sprint Review</a>.</p>
<p><span style="text-decoration: underline;">Nota minha:</span> o ideal é que isso aconteça sempre, mantendo o máximo de proximidade possível com o Product Owner. No meu caso, por exemplo, sento de frente para o gerente de produtos de sistemas centrais e bato-papo com ele o tempo todo. Ou seja, se tenho algo a sugerir, não preciso esperar a cerimonia de revisão.</p>
<p><strong>5- Mantem-se <em>pari passu</em> do desenvolvimento de ferramentas, tecnologias e técnicas que o time está usando</strong></p>
<p>Esta é uma atividade muito importante e frequentente negligenciada pelos gerentes. Gerentes não podem ficar congelados no tempo. Mesmo porque, a atividade 2 é sobre estar apto a dar conselhos técnicos ao time.</p>
<p><span style="text-decoration: underline;">Nota minha:</span> não tem coisa mais irritante do que um gerente que não entende nada do trabalho que você está fazendo, dando palpites furados, e ainda querendo que você explique para ele algo que ele não tem um mínimo de base técnica e conceitual para entender.</p>
<p><strong>6- Planeja treinamento e outros skills de desenvolvimento para os membros do time</strong></p>
<p>Gerentes deveriam pensar cuidadosamente sobre onde o time poderia usar seu skill; e também, cláro, que capacidades o time precisará ter quando for desenvolver determinados itens do <a href="http://www.scrumalliance.org/articles/39-glossary-of-scrum-terms#1125" target="_blank">Product Backlog</a>.</p>
<p><strong>7- Mantem-se atualizado sobre as novidades e evoluções da indústria</strong></p>
<p>Novamente, uma atividade importante, mas frequentemente neglienciada. Sem ela, a atividade 2 fica fortemente comprometida.</p>
<p><strong>8- Antecipa ferramentas, skills e futuras necessidades</strong></p>
<p>Outra atividade importante, que tem tudo a ver com a atividade 6, e que é frequentemente negligenciada. Converse com seu time a respeito, peça sugestões.</p>
<p><strong>9- Planeja e gerencie orçamento e caixa</strong></p>
<p>Outra vez, algo muito importante, mas muito negligenciado por diversos gerentes.</p>
<p><span style="text-decoration: underline;">Nota minha:</span> qual foi a última vez que você colocou no seu orçamento um din-din para cursos, eventos, livros, e outras coisas que melhoram o skill do seu time? Ou você é do tipo que não se preocupa com isso e que, pior ainda, até acha ruim que seu time vá a eventos, faça cursos ou leia livros no horário de trabalho?</p>
<p><strong>10- Dá sugestões de que features o time deveria construir</strong></p>
<p>Vale o mesmo comentário do item 4, não vale? Acho que sim, tem tudo a ver.</p>
<p><strong>11- Faz avalição de performance e dá feedback aos membros do time</strong></p>
<p>Isso é algo necessário em muitas empresas, apesar de bastante subjetivo. Mas o ponto aqui é que gerentes deveriam basear suas avaliações em suas próprias observações, bem como no feedback de outros membros de time.</p>
<p><strong>12- Faz planejamento e desenvolvimento de carreira com os membros do time</strong></p>
<p>Oportunidade de carreira é uma das mais significantes formas de compensar pessoas por seu trabalho. Além de din-din, é lógico!</p>
<p><strong>13- Recruta, entrevista e contrata novos membros para o time</strong></p>
<p>Uma das melhores (mas às vezes, aterrorizantes!) ações de gerenciamento é tomar decisões de contratação. Isso porque boas contratações dão lucro desde o primeiro dia, enquanto que más contratações são uma &#8220;taxa&#8221; invisivel na habilidade do time entregar valor de negócio.</p>
<p><strong>14- Remove membros que não são capazes de fazer um bom trabalho no time</strong></p>
<p>Se mesmo depois de extenso coaching um membro do time não é capaz de contribuir, de trabalhar harmoniosamente com os outros membros do time, ou de fazer seu trabalho na qualidade esperada, ele precisa ser removido do time, ou mesmo da empresa, rapidamente. Tipicamente, gerentes precisam guiar esse processo de maneira coordenada com o RH da empresa.</p>
<p><span style="text-decoration: underline;">Nota minha:</span> não deixe a moral do seu time e o dinheiro da sua empresa ir para o ralo. Cuidado! Há uma linha muito tênue entre <em>&#8220;vou dar mais uma chance&#8221; </em>e a omissão. Não tenha medo de fazer uma demissão, mesmo que tenha sido você que fez a má contratação. Contratações são quase que como loterias! Na verdade, quem fez a má contratação é o que menos importa; o que realmente importa é a performance e moral do time, que no final das contas, se traduz em mais dinheiro para a empresa.</p>
<h3>Conclusão</h3>
<p>O papel do gerente de desenvolvimento 2.0, como diz esse artigo de Pete Deemer, traz um mix de habilidades de <em>liderança técnica</em> e de <em>gerenciamento de pessoas </em><em>&#8211; pelo amor de Deus, <a href="http://gc.blog.br/2009/07/12/pessoas-nao-sao-recursos/" target="_blank">não chame as pessoas de recursos!</a></em></p>
<p>A mim faz todo sentido; e está bem alinhado com as atribuições que recebi, quando contratado pela Locaweb. Aliás, acho que vale citar que, uma das coisas que Pete diz no artigo é que esse &#8220;novo&#8221; papel do gerente de desenvolviemnto precisa ter uma bênção formal do diretor de direitor TI, ou alguém com poderes equivalentes.</p>
<p>Mas e você, o que acha? Deixe um comentário&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/02/10/tchau-tchau-gerente-agora-sou-scrum/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Geração e build de projetos Erlang/OTP</title>
		<link>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/</link>
		<comments>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 03:08:54 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[agilidade]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=489</guid>
		<description><![CDATA[OK. Hora do jabá&#8230;
Há alguns meses, quando comecei a mexer mais com Erlang/OTP, senti a necessidade de ter uma ferramenta que gerasse a estrutura dos projetos, bem como stubs dos módulos necessários. Não encontrei nenhuma que fosse realmente simples. O que fiz? Cocei minha própria coceira, crie o projeto otp_kickoff.
Agora, de saco cheio desconfortável de [...]]]></description>
			<content:encoded><![CDATA[<p>OK. Hora do jabá&#8230;</p>
<p>Há alguns meses, quando comecei a mexer mais com <a href="http://erlang.org/" target="_blank">Erlang/OTP</a>, senti a necessidade de ter uma ferramenta que gerasse a estrutura dos projetos, bem como stubs dos módulos necessários. Não encontrei nenhuma que fosse realmente simples. O que fiz? Cocei minha própria coceira, crie o projeto <a href="http://github.com/leandrosilva/otp_kickoff" target="_blank">otp_kickoff</a>.</p>
<p>Agora, <span style="text-decoration: line-through;">de saco cheio</span> desconfortável de usar <a href="http://www.gnu.org/software/make/manual/make.html" target="_blank">Make</a> para automatizar tarefas de build, resolvi coçar minha própria coceira novamente, crie o projeto <a href="http://github.com/leandrosilva/ebuilder" target="_blank">ebuilder</a>.</p>
<p>Se você também está mexendo com Erlang/OTP, sugiro que dê uma olhada nestes projetos, quem sabe eles também não facilitam sua vida, ahmmm?</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang/OTP no Caelum Tech Day 2009</title>
		<link>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/</link>
		<comments>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 01:14:20 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=480</guid>
		<description><![CDATA[Hoje aconteceu o Caelum Tech Day 2009, um evento de tecnologia voltado à própria galera que trabalha na Caelum, que ano passado contou com nada menos que Jim Weber falando de RESTful, com exclusividade, antes de sua fantástica palestra no Falando em Java.
O objetivo do evento é compartilharmos entre nós mesmos as coisas que estudamos [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje aconteceu o <strong>Caelum Tech Day 2009</strong>, um evento de tecnologia voltado à própria galera que trabalha na Caelum, que ano passado contou com nada menos que <a href="http://jim.webber.name/" target="_blank">Jim Weber</a> falando de RESTful, com exclusividade, antes de sua fantástica palestra no Falando em Java.</p>
<p>O objetivo do evento é compartilharmos entre nós mesmos as coisas que estudamos durante todo o ano. Levantamos então uma porção de assuntos que gostariamos de compartilhar, votamos nos que gostaríamos de ver, e no final, os mais votados são apresentados.</p>
<p>Este ano não tivemos o Jim, mas tivemos muita gente boa da Caelum falando sobre Ruby, JavaScript, Scala, Java, o <a href="http://guilhermesilveira.wordpress.com/" target="_blank">Guilherme Silveira</a> falando de<a href="http://www.slideshare.net/guilhermecaelum/caelum-2009-rest-ao-restful" target="_blank"> RESTful</a> junto com o Cauê Guerra e eu falando de <a href="http://erlang.org/" target="_blank">Erlang/OTP</a> junto com o Thadeu Russo.</p>
<p>Veja a nossa apresentação logo abaixo e divirtam-se com Erlang!</p>
<div id="__ss_2661328" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Erlang/OTP - Caelum Tech Day 2009" href="http://www.slideshare.net/leandrodoze/erlang-otp-caelum-tech-day-2009">Erlang/OTP &#8211; Caelum Tech Day 2009</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erlangotp-caelumtechday2009-091206134352-phpapp02&amp;stripped_title=erlang-otp-caelum-tech-day-2009" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erlangotp-caelumtechday2009-091206134352-phpapp02&amp;stripped_title=erlang-otp-caelum-tech-day-2009" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/leandrodoze">Leandro Silva</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enfim, me fui&#8230;</title>
		<link>http://leandrosilva.com.br/2009/12/06/enfim-me-fui/</link>
		<comments>http://leandrosilva.com.br/2009/12/06/enfim-me-fui/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 15:12:34 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[uncategorized]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=472</guid>
		<description><![CDATA[Depois de quase três anos bem divertidos na CVC Turismo, onde trabalhei como arquiteto de sistemas e incentivei bastante a adoção de práticas ágeis de desenvolvimento, resolvi partir para novos desafios e continuar a crescer.

Na semana que passou, parti da CVC Turismo &#8211; deixando muitos bons amigos e lembranças fantásticas &#8211; e me juntei à [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de quase três anos bem divertidos na <a href="http://www.cvc.com.br" target="_blank">CVC Turismo</a>, onde trabalhei como arquiteto de sistemas e incentivei bastante a adoção de práticas ágeis de desenvolvimento, resolvi partir para novos desafios e continuar a crescer.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.ibuster.com.br/br/porquecomprar/imagens/logo_locaweb.gif" alt="" width="100" height="83" /></p>
<p>Na semana que passou, parti da CVC Turismo <em>&#8211; deixando muitos bons amigos e lembranças fantásticas &#8211;</em> e me juntei à <a href="http://www.locaweb.com.br" target="_blank">Locaweb</a>, como gerente de desenvolvimento sistemas, no departamento de sistemas centrais, passando a liderar tecnicamente uma galera muito gente fina e tecnicamente ótima.</p>
<p>Fui muito bem recebido e minhas expectativas são enormes. Estou muito feliz mesmo.</p>
<p>Vejamos o que o futuro nos reserva&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/12/06/enfim-me-fui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo um tiquinho de self()</title>
		<link>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/</link>
		<comments>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 22:37:31 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[concorrência]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[programação funcional]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=457</guid>
		<description><![CDATA[Uma confusão bem comum quando se começa a escrever programas concorrentes em Erlang é quanto ao uso da BIF (built-in function) self(). Mais especificamente, quanto ao seu retorno.
A BIF self() é analoga ao this do Java, por exemplo, que é capaz de responder quem é o objeto contenedor do método atualmente em execução. Semelhantemente, em [...]]]></description>
			<content:encoded><![CDATA[<p>Uma confusão bem comum quando se começa a escrever programas concorrentes em Erlang é quanto ao uso da <em>BIF</em> (built-in function) <strong><code>self()</code></strong>. Mais especificamente, quanto ao seu retorno.</p>
<p>A <em>BIF</em> <strong><code>self()</code></strong> é analoga ao <strong><code>this</code></strong> do Java, por exemplo, que é capaz de responder quem é o objeto contenedor do método atualmente em execução. Semelhantemente, em Erlang, <strong><code>self()</code></strong> é capaz de dizer quem é o processo contenedor da função atualmente em <span style="text-decoration: line-through;">execução</span> avaliação. Assim, se você chamar <strong><code>self()</code></strong> no Erlang shell, você vai receber como retorno o <strong><code>Pid</code></strong> (identificador de processo) do próprio Erlang shell.</p>
<p>Faça um teste no seu Erlang shell:</p>
<pre class="brush: bash;">
1&gt; self().
</pre>
<p>Você deve ter recebido algo semelhante a <strong><code>&lt;0.31.0&gt;</code></strong> com retorno. Isto porque o Erlang shell nada mais é do que um processo Erlang com um comportamento <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop" target="_blank">REPL</a>.</p>
<p>Ok. Agora, o que acontece se você tiver um programa com um único módulo em que há duas funções que trocam mensagens entre dois processos? Qual seria o retorno de <strong><code>self()</code></strong> nestas duas funções?</p>
<h3>Um pequeno exemplo</h3>
<p><em> </em>Vejamos um exemplo bem simples deste caso extraído do livro <a href="http://www.amazon.com/gp/product/0596518188/ref=pd_lpo_k2_dp_sr_1?pf_rd_p=486539851&amp;pf_rd_s=lpo-top-stripe-1&amp;pf_rd_t=201&amp;pf_rd_i=193435600X&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=05FTR2BVN92ZF31Y1408" target="_blank">Erlang Programming</a>:</p>
<pre class="brush: java;">
-module(add_two).
-export([start/0, request/1, loop/0]).

start() -&gt;
  process_flag(trap_exit, true),
  Pid = spawn_link(add_two, loop, []),
  register(add_two, Pid),
  {ok, Pid}.

request(Int) -&gt;
  add_two ! {request, self(), Int},
  receive
    {result, Result}       -&gt; Result;
    {'EXIT', _Pid, Reason} -&gt; {error, Reason}
    after 1000             -&gt; timeout
  end.

loop() -&gt;
  receive
    {request, Pid, Msg} -&gt;
       Pid ! {result, Msg + 2}
  end,
  loop().
</pre>
<p>De maneira bem objetiva, o que este código faz é o seguinte:</p>
<p>1- Quando um <em>processo já existente</em> <em>&#8211; que no nosso caso será o próprio Erlang shell &#8211;</em> faz uma chamada à função <strong><code>start()</code></strong>, um <em>novo processo</em> é gerado, tendo como ponto de partida a função <strong><code>loop()</code></strong>, o seu identificador é associado à variável <strong><code>Pid</code></strong> e, por fim, ele recebe o apelido <strong><code>add_two</code></strong>.</p>
<p>2- Todas as vezes que a função <strong><code>request(Int)</code></strong> é chamada, uma mensagem é enviada para o processo <strong><code>add_two</code></strong>, para que este some 2 ao número passado como parâmetro e envie o resultado de volta ao processo solicitante.</p>
<p>3- Sempre que o processo <strong><code>add_two</code></strong> recebe uma nova mensagem, esta é capturada na sentença <strong><code>receive ... end</code></strong> da função <strong><code>loop()</code></strong>, que verifica se é um &#8220;pedido de soma&#8221;, e então, envia o resultado da soma ao processo solicitante, identificado por <strong><code>Pid</code></strong>.</p>
<h3>A confusão</h3>
<p>Bem simples mesmo, certo? Então, por que acontece a tal confusão?</p>
<p>A confusão acontece, porque o retorno de <strong><code>self()</code></strong> não é o mesmo em todas as funções deste módulo. Isto porque a função <strong><code>loop()</code></strong>, apesar de estar contida no mesmo módulo que as funções <strong><code>start()</code></strong> e <strong><code>request(Int)</code></strong>, não está <span style="text-decoration: line-through;">rodando</span> sendo avaliada no mesmo processo que elas estão. A função <strong><code>loop()</code></strong> está sendo avaliada no processo <strong><code>add_two</code></strong>, enquanto que <strong><code>start()</code></strong> e <strong><code>request()</code></strong> estão sendo avaliadas no primeiro processo <em>&#8211; o Erlang shell</em>. Assim, <strong><code>self()</code></strong> em <strong><code>loop()</code></strong> retorna um identificador de processo diferente do que retornaria as demais funções.</p>
<p>Quer tirar a prova?</p>
<h3>Mais um simples exemplo, só que desta vez, esclarecedor!</h3>
<p>Eu adicionei um bocado de &#8220;prints&#8221; no código que apresentei anteriormente e se você executá-lo agora, terá a prova do que foi discutido. <em>(Tá tudo bem, você não precisa de uma prova a estas alturas do campeonato, mas vai ser divertido.)</em></p>
<pre class="brush: java;">
-module(add_two).
-export([start/0, request/1, loop/0]).

start() -&gt;
io:format(&quot;: start -&gt; self() = ~w~n&quot;, [self()]),
  process_flag(trap_exit, true),
  Pid = spawn_link(add_two, loop, []),
  io:format(&quot;: start -&gt; Pid  = ~w~n&quot;, [Pid]),
  register(add_two, Pid),
  {ok, Pid}.

request(Int) -&gt;
  io:format(&quot;: request -&gt; self() = ~w~n&quot;, [self()]),
  add_two ! {request, self(), Int},
  receive
    {result, Result}       -&gt; Result;
    {'EXIT', _Pid, Reason} -&gt; {error, Reason}
    after 1000             -&gt; timeout
  end.

loop() -&gt;
  receive
    {request, Pid, Msg} -&gt;
       io:format(&quot;: loop/receive -&gt; self() = ~w~n&quot;, [self()]),
       io:format(&quot;: loop/receive -&gt; Pid    = ~w~n&quot;, [Pid]),
       Pid ! {result, Msg + 2}
  end,
  loop().
</pre>
<p>Após fazer a devida compilação, faz o seguinte teste no Erlang shell:</p>
<p>1- Veja o identificador de processo <em>(aka Pid)</em> do Erlang shell:</p>
<pre class="brush: bash;">
1&gt; self().
</pre>
<p>2- Inicie o processo <strong><code>add_two</code></strong>:</p>
<pre class="brush: bash;">
2&gt; add_two:start().
</pre>
<p>3- Chame a função <strong><code>request(Int)</code></strong>:</p>
<pre class="brush: bash;">
3&gt; add_two:request(10).
</pre>
<p>Executou? Comparou os <em>Pids</em>? Viu a diferença de escopo entre as três funções? Pois muito bem, então fica aqui a lição:</p>
<p><em>&#8220;Módulos servem para agrupar funções com um mesmo escopo conceitual, mas nem sempre com o mesmo escopo de processo&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Você deveria considerar Erlang para seu próximo grande projeto</title>
		<link>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/</link>
		<comments>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 02:49:44 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[concorrência]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[programação funcional]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=433</guid>
		<description><![CDATA[Ao ler o título deste post, talvez você esteja se perguntando: por que eu deveria considerar Erlang para meu próximo grande projeto? Bem, meu objetivo com este post é te apresentar alguns importantes motivos para fazer isto.

Erlang nasceu no laboratório de ciência da computação da Ericsson na década de 1980, influenciada por linguagens como ML, [...]]]></description>
			<content:encoded><![CDATA[<p>Ao ler o título deste post, talvez você esteja se perguntando: <em>por que eu deveria considerar </em><a href="http://en.wikipedia.org/wiki/Erlang_(programming_language)" target="_blank"><em>Erlang</em></a><em> para meu próximo grande projeto?</em> Bem, meu objetivo com este post é te apresentar alguns importantes motivos para fazer isto.</p>
<p><img class="aligncenter" src="http://erlang.org/images/erlang.gif" alt="" width="114" height="96" /></p>
<p>Erlang nasceu no laboratório de ciência da computação da Ericsson na década de 1980, influenciada por linguagens como ML, Ada, Module, Prolog e Smalltalk, quando um time de três cientistas <em>&#8211; entre eles, o grande <a href="http://armstrongonsoftware.blogspot.com/" target="_blank">Joe Armstrong</a> &#8211;</em> receberam a missão de descobrir qual seria a melhor linguagem de programação para escrever a próxima geração de sistemas de telecom. Após dois anos de investigação e prototipação, estes cientistas descobriram que nenhuma linguagem era completa o bastante para tal objetivo e, conclusivamente, decidiram criar uma nova linguagem. Nasceu então Erlang, <em>the Ericsson Language</em>.</p>
<p>De lá pra cá, Erlang tem sido evoluida e usada para escrever grandes sistemas críticos, porque é exatamente nesse cenário que Erlang faz mais sentido. Se seu projeto é construir um sistema crítico, altamente tolerante a falhas, com disponibilidade 24&#215;7 e veloz como o papa-léguas, sim, Erlang é para você. Mas se não é bem esta sua necessidade, se você quer apenas construir um pequeno sistema, com baixa concorrência, poucos usuários, pouca necessidade de performance e possibilidade de passar horas <em>down</em> em manutenção, não, você não precisa de Erlang. <span style="text-decoration: line-through;">Que tal Basic?</span></p>
<p>Diferente de algumas linguagens que nascem para encontrar um nicho, Erlang nasceu com um problema a ser resolvido, com requisitos a serem atendidos. Tolerância a falhas, concorrência realmente pesada, computação distribuída, atualização da aplicação sem derrubá-la, sistemas de tempo real, este é o nicho de Erlang; foi para isto que Erlang nasceu.</p>
<p><strong>Quem usa Erlang atualmente?</strong></p>
<p>Além da Ericsson, é lógico, há algumas outras grandes empresas e projetos usando Erlang, como por exemplo:</p>
<p>- <em>Facebook</em>, no backend de seu sistema de chat, lidando com 100 milhõs de usuários ativos;<br />
- <em>Delicious</em>, que tem mais de 5 milhões de usuários e mais de 150 milhões de bookmarks;<br />
- <em>Amazon SimpleDB</em>, o serviço de dados do seu poderoso EC2;<br />
- <em>Motorola</em>, <em>CouchDB</em>, <em>RabbitMQ</em>, <em>Ejabbed</em>, etc.</p>
<p><strong>Ok, mas Erlang é propriedade da Ericsson?</strong></p>
<p>Não, felizmente, não. Em 1998 a Ericsson tornou Erlang open source sob a licença EPL.</p>
<p>Quer mais uma boa notícia? Você não precisa de um servidor de aplicações para rodar sua aplicação Erlang, nem mesmo uma pesada IDE para escrevê-las. Tudo o que você precisa é de uma distribuição de Erlang para sua plataforma, seja Mac OS X, Linux, Windows, Solaris, ou qualquer outro sistema <em>Unix-like</em>, que traz consigo máquina virtual, compilador e vasta bibliotéca de módulos muito úteis <em>&#8211; além do banco de dados <a href="http://en.wikipedia.org/wiki/Mnesia" target="_blank">Mnesia</a></em>; e um editor de textos de sua preferência <em>&#8211; <a href="http://macromates.com" target="_blank">TextMate</a>, por exemplo, tem um ótimo bundle para Erlang.</em></p>
<p><strong>Algumas características de Erlang</strong></p>
<p><em>1- Expressividade e beleza</em></p>
<p>Há quem diga que não, mas Erlang é uma linguagem muito bonita &#8212; <em>ao menos pra mim.</em> Dado as já citadas influências de Erlang, ela é uma linguagem bem expressiva e declarativa, que encoraja a escrita de código simples e objetivo, o que certamente torna seu código fácil de ler, de escrever e de organizar [em módulos reutilizáveis]. O snippet abaixo é um exemplo de implementação do famoso fatorial:</p>
<pre class="brush: java;">
-module(sample1).
-export([fac/1]).

fac(0) -&gt; 1;
fac(N) -&gt; N * fac(N-1).
</pre>
<p><em>2- Forte uso de recursividade</em></p>
<p>Isto certamente é uma herança da veia funcional de Erlang que torna o código muito menos imperativo e mais declarativo. Mas além da beleza declarativa óbvia, é importante saber que Erlang foi projetada para lidar com iterações recursivas gigantescas sem qualquer degradação <em>&#8211; e sem estourar o &#8220;heap&#8221; de memória.</em></p>
<p><em>3- Livre de efeito colateral</em></p>
<p>Uma das grandes capacidades dadas por Erlang é a construção de sistemas altamente concorrentes rodando em processadores com multiplos núcleos. Isto não combina nada com efeito colateral, por isso, em Erlang, uma vez que um dado valor tenha sido atribuído a uma variável, esta não poderá mais ser modificada <em>&#8211; ou seja, estão mais para o que conhecemos por constantes do que para o que conhecemos por variaveis.</em></p>
<p>Se você já escreveu código concorrênte sabe o quanto tê-lo livre de efeitos colaterais te faz livre de dores de cabeça. Poucas coisas são tão deprimentes quanto debugar código concorrênte repleto de efeitos colaterais.</p>
<p><em>4- Pattern matching</em></p>
<p><a href="http://en.wikipedia.org/wiki/Pattern_matching" target="_blank">Pattern matching</a> em Erlang é usado para associar valores a variáveis, controlar fluxo de execução de programs, extrair valores de estruturas de dados compostas e lidar com argumentos de funções. Mais um ponto para código declarativo e expressividade. Vejamos o código abaixo:</p>
<pre class="brush: java;">
-module(sample2).
-export([convert_length/1]).

convert_length(Length) -&gt;
    case Length of
        {centimeter, X} -&gt;
            {inch, X / 2.54};
        {inch, Y} -&gt;
            {centimeter, Y * 2.54}
    end.
</pre>
<p>Fala por si, não?</p>
<p><em>5- Concorrência baseada em passagem de mensagens (a.k.a. Actors)</em></p>
<p>Acho que concorrência baseada em <a href="http://en.wikipedia.org/wiki/Message_passing" target="_blank">passagem de mensagem</a> entre <a href="http://en.wikipedia.org/wiki/Actor_model" target="_blank">atores</a> é uma das features mais populares de Erlang. Vejamos o porque com o famoso exemplo do Ping-Pong:</p>
<pre class="brush: java;">
-module(sample3).

-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) -&gt;
    Pong_PID ! finished,
    io:format(&quot;Ping finished~n&quot;, []);

ping(N, Pong_PID) -&gt;
    Pong_PID ! {ping, self()},
    receive
        pong -&gt;
            io:format(&quot;Ping received pong~n&quot;, [])
    end,
    ping(N - 1, Pong_PID).

pong() -&gt;
    receive
        finished -&gt;
            io:format(&quot;Pong finished~n&quot;, []);
        {ping, Ping_PID} -&gt;
            io:format(&quot;Pong received ping~n&quot;, []),
            Ping_PID ! pong,
            pong()
    end.

start() -&gt;
    Pong_PID = spawn(sample3, pong, []),
    spawn(sample3, ping, [3, Pong_PID]).
</pre>
<p>Neste pequeno snippet podemos observar algumas características de Erlang já citadas neste post, tal como <em>pattern matching</em> na captura das mensagens e recursividade no controle das iterações.</p>
<p>Agora, falando do aspecto concorrente em sim, algumas coisas são particularmente interessantes aqui:</p>
<p>a. Em Erlang, a concorrência acontece entre processos leves, diferente de linguagens como C++ e Java, que baseiam sua concorrência em threads nativas de sistema operacional [caríssimas];<br />
b. Em Erlang, há um tipo de dado chamado <em>PID</em>, o qual é o identificador do processo paralelo (mais conhecido como Actor) e para o qual as mensagens podem ser enviadas.</p>
<p>Releia o código acima com estas informações em mente e veja como concorrência em Erlang é algo completamente descomplicado e natural. Depois, pense no mesmo código implementado em C#, Java ou C++.</p>
<p><strong>Gostei de Erlang, há algum livro para eu começar a estudar?</strong></p>
<p>Sim, há dois livros excepcionais. <a href="http://www.amazon.com/Programming-Erlang-Software-Concurrent-World/dp/193435600X" target="_blank">Um</a>, do próprio criador da linguagem, Joe Armstrong:</p>
<p><img class="aligncenter" src="http://ecx.images-amazon.com/images/I/41XOOpdBzKL._SL500_AA240_.jpg" alt="" width="240" height="240" /></p>
<p>E <a href="http://www.amazon.com/Erlang-Programming-Francesco-Cesarini/dp/0596518188/ref=pd_sim_b_3" target="_blank">outro</a> de Francesco Cesarini e Simon Thompson:</p>
<p><a href="http://www.amazon.com/gp/reader/0596518188/ref=sib_dp_pt#reader-link" target="_blank"><img class="aligncenter" src="http://ecx.images-amazon.com/images/I/41K7VHZI3CL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg" alt="" width="240" height="240" /></a></p>
<p>Além disso, há o próprio <a href="http://erlang.org/starting.html" target="_blank">material on line</a> que é muito bom e barato. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Conclusão</strong></p>
<p>Erlang possui muitas outras características e informações bem interessantes, mas que me falta espaço neste post para citar e apresentar, senão ele ficará absurdamente gigantesco para o meu gosto. Mas acredito que pelo que já apresentei até aqui, você já tenha motivos suficientes para pensar em Erlang com carinho e conciderá-la para seu próximo grande projeto.</p>
<p>Em breve devo escrever algo sobre <a href="http://en.wikipedia.org/wiki/Open_Telecom_Platform_%28OTP%29" target="_blank">OTP</a>, já que neste post apresentei características mais inerentes à linguagem em si e nem tanto sobre a plataforma.</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>A Rails Rumble foi demais!</title>
		<link>http://leandrosilva.com.br/2009/09/06/a-rails-rumble-foi-demais/</link>
		<comments>http://leandrosilva.com.br/2009/09/06/a-rails-rumble-foi-demais/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 04:51:11 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[agilidade]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=426</guid>
		<description><![CDATA[Se eu tivesse que descrever a minha impressão sobre a Rails Rumble em uma frase apenas, certamente, eu usaria o título deste post, porque pra mim, a Rails Rumble foi demais mesmo.
Não ganhamos a competição, mas ganhamos muito participando da competição. Aprendemos muita coisa, fizemos amigos, nos divertimos bastante e fizemos umas das coisas que [...]]]></description>
			<content:encoded><![CDATA[<p>Se eu tivesse que descrever a minha impressão sobre a Rails Rumble em uma frase apenas, certamente, eu usaria o título deste post, porque pra mim, a Rails Rumble foi demais mesmo.</p>
<p>Não ganhamos a competição, mas ganhamos muito participando da competição. Aprendemos muita coisa, fizemos amigos, nos divertimos bastante e fizemos umas das coisas que mais gostamos de fazer: programamos pra caramba! <em>&#8211; dormi aproximadamente 5 horas durante as 48 horas de competição.</em></p>
<p><img class="aligncenter" src="http://farm3.static.flickr.com/2611/3850201766_5084d42941.jpg" alt="" width="500" height="375" /></p>
<p>Meus sinceros agradecimentos à galera do meu time: Anderson Leite (com quem pareei bastante), Rafael (que foi quem teve a brilhante idéia do projeto) e Douglas (o melhor sysadmin que eu conheço). Foi muito bom fazer parte do time com vocês.</p>
<p><strong>Nosso projeto</strong></p>
<p>Bem, o resultado final do nosso projeto é este: <a href="http://whatannoysus.com/" target="_blank">whatannoysus.com</a>. Não é tudo que nós gostaríamos que fosse, mas com certeza, já é um ótimo começo <em>&#8211; e vamos dar continuidade.</em></p>
<p>Nós o construímos em menos de 48 horas, usando <a href="http://rubyonrails.org" target="_blank">Ruby on Rails</a>, <a href="http://cukes.info" target="_blank">Cucumber</a> e <a href="http://www.mysql.com" target="_blank">MySQL</a>; e o botamos para rodar num <a href="http://www.ubuntu.com/products/whatIsubuntu/serveredition" target="_blank">Ubuntu Server</a> com <a href="http://www.modrails.com" target="_blank">Phusion Passenger</a> e <a href="http://nginx.net" target="_blank">Nginx</a>.</p>
<p><strong>Patrocínio</strong></p>
<p>Vida longa à <a href="http://gonow.com" target="_blank">Gonow</a>! <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A Gonow nos tratou muito bem, com tudo do bom e do melhor. Comida, camiseta Rails Rumble, hotel (que eu nem fui lá conhecer) e uma infra-estrutura de primeira.</p>
<p><img class="aligncenter" src="http://farm4.static.flickr.com/3542/3846827725_df47e12220.jpg" alt="" width="375" height="500" /></p>
<p>Muito obrigado mesmo, a todos da Gonow e, se precisarem de alguma coisa, é nóiz!</p>
<p><strong>Poder aos pares!</strong></p>
<p>Tenho que concordar com o <a href="http://blog.aspercom.com.br/2009/09/05/rails-rumble-09-retrospective/" target="_blank">Yoshima</a>, parear traz um ganho incrível no desenvolvimento. Ainda tem muita gente que acha que parear é reduzir o trabalho pela metada, afinal, são dois em um computador. Mas a real é que boa parte do nosso trabalho como programadores é pensar e conceber soluções que, em última instância, codificamos. E é aí que entra o ganho da programação em parte: duas cabeças pensam melhor do que uma <em>&#8211; e quatro olhos acham bugs mais rápido também.</em></p>
<p><strong>Outros relatos?</strong></p>
<p>É isso que eu [resumidamente] tinha a dizer. Se você quiser saber um pouco mais, conhecer outros relatos, veja os posts do <a href="http://andersonleiteblog.wordpress.com/2009/08/24/what-annoys-us-rails-rumble-09/" target="_blank">Anderson Leite</a> e do <a href="http://blog.aspercom.com.br/2009/09/05/rails-rumble-09-retrospective/" target="_blank">Rodrigo Yoshima</a>. E se houver algo que eu não mencionei e que você gostariam de saber, sinta-se à vontade para deixar um comentário.</p>
<p><img class="aligncenter" src="http://farm4.static.flickr.com/3468/3845474879_377d570e9f.jpg" alt="" width="375" height="500" /></p>
<p>Vou ficando por aqui e espero poder rever toda a galera <em>&#8211; que foi muito legal conhecer &#8211;</em> na <a href="http://www.railssummit.com.br" target="_blank">Rails Summit</a>.</p>
<p>Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/09/06/a-rails-rumble-foi-demais/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rails Rumble 2009: aqui vou eu!</title>
		<link>http://leandrosilva.com.br/2009/08/21/rails-rumble-2009-aqui-vou-eu/</link>
		<comments>http://leandrosilva.com.br/2009/08/21/rails-rumble-2009-aqui-vou-eu/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 22:38:37 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=416</guid>
		<description><![CDATA[
Daqui a poucos minutos sairei aqui do meu trabalho em direção à Gonow para dar início à minha participação na Rails Rumble 2009, junto com meus camaradas @qmx, @r4f4el e @anderson_leite. A emoção está a mil, pode ter certeza!
Serão 48 horas de programação frenética, muita risada, descontração&#8230; e mais programação frenética &#8212; até o último [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" src="http://www.rubyinside.com.br/wp-content/uploads/2009/08/logo.png" alt="http://www.gonow.com.br/rumble" width="224" height="100" /></p>
<p>Daqui a poucos minutos sairei aqui do meu trabalho em direção à <a href="http://www.gonow.com.br" target="_blank">Gonow</a> para dar início à minha participação na <a href="http://blog.railsrumble.com/" target="_blank">Rails Rumble 2009</a>, junto com meus camaradas <a href="http://twitter.com/qmx" target="_blank">@qmx</a>, <a href="http://twitter.com/r4f4e1" target="_blank">@r4f4el</a> e <a href="http://twitter.com/anderson_leite" target="_blank">@anderson_leite</a>. A emoção está a mil, pode ter certeza!</p>
<p>Serão 48 horas de programação frenética, muita risada, descontração&#8230; e mais programação frenética &#8212; até o último <em>git push</em>.</p>
<p>Desde de já, quero agradecer demais a <strong>Gonow</strong> por todo apoio, que até camiseta e <a href="http://www.gonow.com.br/rumble/" target="_blank">hotsite</a> fez para todos fiquem realmente no clima da competição. <a href="http://twitter.com/dcrec1" target="_blank">Diego</a>, valeu!</p>
<p>Torçam por nós!</p>
<p><strong>@codezone</strong><br />
<em>the_annoyers</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/08/21/rails-rumble-2009-aqui-vou-eu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5 minutos de CouchDB e CouchRest</title>
		<link>http://leandrosilva.com.br/2009/08/02/5-minutos-de-couchdb-e-couchrest/</link>
		<comments>http://leandrosilva.com.br/2009/08/02/5-minutos-de-couchdb-e-couchrest/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 16:05:47 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=374</guid>
		<description><![CDATA[Normalmente demoro um bom tempo para escrever um tutorial completo, mas dessa vez vou tentar ser o mais breve possível, tanto ao escrever, quanto no resultado final.
O tema é CouchDB, o revolucionario banco de dados orientado a documentos e com interface totalmente RESTful, e a Ruby gem CouchRest, que é uma verdadeira mão-na-roda. Obviamente que, [...]]]></description>
			<content:encoded><![CDATA[<p>Normalmente demoro um bom tempo para escrever um tutorial completo, mas dessa vez vou tentar ser o mais breve possível, tanto ao escrever, quanto no resultado final.</p>
<p>O tema é <strong><a href="http://couchdb.apache.org/" target="_blank">CouchDB</a></strong>, o revolucionario banco de dados orientado a documentos e com interface totalmente <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful</a>, e a Ruby gem <strong><a href="http://github.com/jchris/couchrest" target="_blank">CouchRest</a></strong>, que é uma verdadeira mão-na-roda. Obviamente que, em tão pouco tempo &#8212; até para cumprir a promessa inicial &#8211;, eu não vou explicar os fundamentos do CouchDB, mas você pode encontrar uma introdução interessante <a href="http://tapajos.me/2009/7/19/falando-um-pouco-sobre-couchdb" target="_blank">aqui</a>.</p>
<p>A primeira coisa que você precisa fazer é se certificar de que possui <a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> e CouchDB instalados. Caso você ainda não os possua, no Google você encontra inumeras receitas para todo sabor de sistema operacional. No meu caso, estou usando Mac OS X com <a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby EE</a> da <a href="http://www.phusion.nl/" target="_blank">Phusion</a> e CouchDB instalado via <a href="http://www.macports.org/" target="_blank">MacPorts</a> &#8212; que acho a maneira mais prática de instação de qualquer coisa; esforço zero.</p>
<pre class="brush: bash;">

$ sudo port install couchdb
</pre>
<p>De qualquer forma, se você quiser uma fonte rápida de informação sobre instalação do CouchDB no seu sistema operacional, consulte o apêndice do livro <a href="http://books.couchdb.org/relax" target="_blank">CouchDB: The Definitive Guide</a>. Lá você encontra um guia rápido para instalação em <a href="http://books.couchdb.org/relax/appendix/installing-on-windows" target="_blank">Windows</a>, <a href="http://books.couchdb.org/relax/appendix/installing-on-mac" target="_blank">Mac OS X</a>, <a href="http://books.couchdb.org/relax/appendix/installing-on-unix" target="_blank">Unix-like</a> e <a href="http://books.couchdb.org/relax/appendix/installing-from-source" target="_blank">a partir do fonte</a>.</p>
<p><strong>Mão na massa</strong></p>
<p>Bem, com todos os pré-requisitos OK, vamos por a mão na massa logo de uma vez!</p>
<p><strong>1- Instale a gem CouchRest</strong></p>
<pre class="brush: bash;">
$ sudo gem install jchris-couchrest
</pre>
<p><strong>2- Inicie o CouchDB</strong></p>
<pre class="brush: bash;">
$ sudo couchdb -b
</pre>
<p>Acesse <a href="http://localhost:5984/_utils/" target="_blank">http://localhost:5984/_utils</a>. Se você viu um camaradinha relaxando num sofá vermelho no canto superior direito da página, é porque está tudo certo com seu CouchDB. Vamos em frente.</p>
<p><strong>3- Abra um terminal IRB</strong></p>
<pre class="brush: ruby;">
require 'rubygems'
require 'couchrest'
</pre>
<p>Tudo requerido corretamente, hora de começar a brincar com nosso banco de dados. Mas antes, vamos criá-lo!</p>
<pre class="brush: ruby;">
db = CouchRest.database!('http://localhost:5984/my_db')
</pre>
<p>Agora vamos criar os atributos do <em>documento</em> que será gravado nesse banco.</p>
<pre class="brush: ruby;">
attributes = { &quot;name&quot; =&gt; &quot;Leandro Silva&quot;, &quot;blog&quot; =&gt; &quot;leandrosilva.com.br&quot;, &quot;titles&quot; =&gt; [&quot;System Architect&quot;, &quot;Blogger&quot;]}
</pre>
<p>Criado os atributos do documento, vamos gravá-lo.</p>
<pre class="brush: ruby;">
result = db.save_doc(attributes)
</pre>
<p>Documento criado! Você pode acessar novamente <a href="http://localhost:5984/_utils/" target="_blank">http://localhost:5984/_utils</a> e ver o que aconteceu até agora. Há um documento criado no banco my_db, com uma <em>revisão</em> apenas, contendo os dados que definimos no hash attributes.</p>
<p>Você também pode acessar informações resultantes da operação anterior através do hash result.</p>
<pre class="brush: ruby;">
result['id']
result['rev']
</pre>
<p>Viu? São as mesmas informações que você viu no gerenciador web do CouchDB.</p>
<p>Vamos continuar acessando estas informações [de maneira absurdamente fácil] através da CouchRest.</p>
<pre class="brush: ruby;">
record = db.get(result['id'])
</pre>
<p>Veja o hash record. Há duas chaves particularmente interessantes: <em>_id</em> e <em>_rev</em>. Estas duas chaves são equivalentes a <em>id</em> e <em>rev</em> do nosso hash anterior, o result.</p>
<p>Um teste? Compare os resultados abaixo.</p>
<pre class="brush: ruby;">
result['id']
record['_id']
</pre>
<pre class="brush: ruby;">
result['rev']
record['_rev']
</pre>
<p>Taí, simples assim. Viu a equivalência?</p>
<p>Vamos ver outros campos do nosso registro.</p>
<pre class="brush: ruby;">
record['titles']
</pre>
<p>Que tal adicionar mais um titulo?</p>
<pre class="brush: ruby;">
record['titles'] &lt;&lt; 'Polyglot Programmer'
</pre>
<p>Bem, acho que já é hora de salvar e ir adiante, porque este tutorial tem que ser breve. Vamos lá.</p>
<pre class="brush: ruby;">
result = db.save_doc(record)
</pre>
<p>Outra coisa interessante aqui. Vamos conferir a chave rev do nosso hash result.</p>
<pre class="brush: ruby;">
result['rev']
</pre>
<p>Diferente da primeira vez que vimos, não? Vá ao gerenciador web do CouchDB e veja se algo mudou. Sim, algo mudou. Agora você tem a opção de navegar pelas revisões do seu documento. Fantástico!</p>
<p>Legal, muito bem por hoje.</p>
<pre class="brush: ruby;">
db.delete_doc(record)
</pre>
<p>Agora volte ao gerenciador web do CouchDB e dê um refresh na página de visualização &#8212; caso você esteja nela.</p>
<p>O que aconteceu? Sumiu! O registro foi apagado.</p>
<p><strong>Finalizando</strong></p>
<pre class="brush: bash;">
$ sudo couchdb -d
</pre>
<p>Bem, por hoje é só pessoal. Espero que tenha sido realmente útil e que vocês tenham gostado.</p>
<p>Ah! E se gostaram, please, me deem um pontinho lá no <a href="http://workingwithrails.com/recommendation/new/person/16274-leandro-silva" target="_blank">WWRails</a>. =p</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/08/02/5-minutos-de-couchdb-e-couchrest/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
