<?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>Valério Farias &#187; Ruby</title>
	<atom:link href="http://valeriofarias.com/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://valeriofarias.com</link>
	<description>(Tecnologia + Negócios) = :)</description>
	<lastBuildDate>Tue, 29 Mar 2011 21:07:52 +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>Linguagem Ruby e Educação: um acordo feito no céu (tradução)</title>
		<link>http://valeriofarias.com/linguagem-ruby-e-educacao-um-acordo-feito-no-ceu-traducao/</link>
		<comments>http://valeriofarias.com/linguagem-ruby-e-educacao-um-acordo-feito-no-ceu-traducao/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 11:11:33 +0000</pubDate>
		<dc:creator>Valério Farias</dc:creator>
				<category><![CDATA[Pra refletir]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[aprender]]></category>
		<category><![CDATA[computação]]></category>
		<category><![CDATA[criatividade]]></category>
		<category><![CDATA[diversão]]></category>
		<category><![CDATA[educação]]></category>
		<category><![CDATA[faculdade]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[primeira]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://valeriofarias.com/?p=366</guid>
		<description><![CDATA[É importante não generalizar a linguagem Ruby como se fosse algo que resolverá todos os seus problemas. Ela tem propósito geral, mas será adequada em determinados contexto e outros não, como todas as outras linguagens. O propósito desse post do Kate Cunningham que eu traduzi é mostrar que as características do Ruby são muito harmônicas [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>É importante não generalizar a linguagem Ruby como se fosse algo que resolverá todos os seus problemas. Ela tem propósito geral, mas será adequada em determinados contexto e outros não, como todas as outras linguagens. O propósito desse post do Kate Cunningham que eu traduzi é mostrar que as características do Ruby são muito harmônicas com as características necessárias em um ambiente efetivo de aprendizado. Isso não quer dizer que o aluno deva estacionar no Ruby. Ele terá o caminho facilitado para o mundo da programação com Ruby, mas isso será só o primeiro passo. Ele deverá sim, aprender outras linguagens, pois é a única forma de se aprimorar como profissional de uma área tão dinâmica. O texto original você encontra <a href="http://rubylearning.com/blog/2010/08/11/ruby-programming-and-education-a-match-made-in-heaven/">aqui</a>. Fique agora com a tradução:</p></blockquote>
<p>A linguagem Ruby tem recebido muita atenção na última década, especialmente com o advento do Ruby on Rails em 2005. Enquanto a blogosfera está utilizando Ruby a muito tempo, vamos nos perguntar como, exatamente, a linguagem Ruby é propícia para um ambiente educacional.</p>
<div id="attachment_369" class="wp-caption alignright" style="width: 254px"><a href="http://valeriofarias.com/wp-content/uploads/2010/08/ruby-logo-r.png"><img class="size-full wp-image-369" title="ruby-logo-r" src="http://valeriofarias.com/wp-content/uploads/2010/08/ruby-logo-r.png" alt="Ruby Programming Language" width="244" height="299" /></a><p class="wp-caption-text">Copyright (C) 2008 Ruby Association LLC</p></div>
<p>Claro, podemos ir para a relevância da linguagem Ruby, pois se você está recebendo treinamento em um ambiente educacional para se tornar um programador de computador, e você não sabe o Ruby, então você está ficando cada vez mais fora do circuito. No entanto, linguagens de programação vêm e vão, e educação não é sobre as tendências, é sobre as idéias que sustentam o valor no decorrer dos anos.</p>
<p>Vamos então olhar para a filosofia de linguagem Ruby e ver como é propício à aprendizagem. Por um lado, Ruby é flexível. Ele não tem a rigidez de Java ou PHP. Em um ambiente que maximiza o aprendizado, a flexibilidade é fundamental. E Ruby é tão flexível quanto possível. Yukihiro Matsumoto, o  criador da linguagem Ruby, notou o que ele estava pensando quando ele começou a trabalhar com linguagem de programação: &#8220;É engraçado, quando eu usei PHP para desenvolver ou as coisas que eu fiz em Java, eu estava sempre à procura de algo mais.&#8221;</p>
<p>Outra grande coisa sobre Ruby é seu reforço da capacidade para a criatividade. Como muitos programadores Ruby notaram, Ruby é mais alinhado com o pensamento humano. Desta forma, é muito fácil de usar. E precisamente porque é mais fácil de usar, é mais versátil quando se trata de ser criativo.</p>
<p>A apresentação de <a href="http://www.slideshare.net/vishnu/the-ruby-programming-language-or-why-are-you-wasting-brain-power">slides sobre a linguagem Ruby</a> explica como Ruby auxilia a criatividade. Afirma que os seres humanos perdem produtividade quando são forçados por &#8220;tarefas repetitivas, tarefas desnecessariamente complexas  e resolvendo problemas que não estão dentro do domínio de aplicação.&#8221; Desde que Ruby efetivamente se livra dessas tarefas repetitivas e de tarefas voltadas para máquinas, há mais espaço aberto para ser criativo. Com os alunos, especialmente, a produção criativa é a chave para a aprendizagem de forma eficaz.</p>
<p>Um aspecto do processo de aprendizagem que é absolutamente crítico para a eficácia educacional é diversão. Nós geralmente não pensamos sobre a diversão quando nós pensamos sobre a educação. Mas reflita sobre seus próprios anos escolares no passado. Se você pensar bem, você percebe que os assuntos que você aprendeu mais e reteve o conteúdo eram aqueles em que você estava se divertindo. Este divertimento, claro, resulta em parte da criatividade. Quando você está sendo produtivo, você está se divertindo.</p>
<p>Ao contrário de outras linguagens de programação, você pode fazer muita coisa com Ruby, mesmo se você está apenas nos estágios iniciais de aprendizagem. Para os estudantes, o processo de aprendizagem é frustrante e é um pouco prejudicado quando pequenos erros aparecem no caminho de chegar aos conceitos maiores. Linguagens de programação como C++ podem dificultar o aprendizado dos conceitos maiores porque pequenos erros no código sempre aparecem durante o processo. Já usando o  Ruby o aluno não passa por essas pequenas dificuldades quando está iniciando o aprendizado.</p>
<p>Naturalmente, estes são apenas indicações básicas de que Ruby é a melhor ferramenta de aprendizagem para os interessados em programação de computadores, especialmente os iniciantes. No entanto, assim como na educação como um todo, em que mudanças conceituais básicas no processo de aprendizagem levam os alunos para as melhores práticas na aprendizagem,  Ruby oferece a possibilidade de uma aprendizagem fácil, divertida, criativa, por força da simples virtude de que a linguagem foi feita para pragmaticamente funcionar dessa forma. Em análise final, Ruby foi feito para estudantes, jovens e idosos, iniciantes e mais avançados.</p>
<p>Por Kate Cunningham</p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/linguagem-ruby-e-educacao-um-acordo-feito-no-ceu-traducao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aprenda BDD Jogando Dados &#8211; ebook</title>
		<link>http://valeriofarias.com/aprenda-bdd-jogando-dados-ebook/</link>
		<comments>http://valeriofarias.com/aprenda-bdd-jogando-dados-ebook/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 15:46:31 +0000</pubDate>
		<dc:creator>Valério Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[diversão]]></category>
		<category><![CDATA[Rspec]]></category>
		<category><![CDATA[Shoes]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://valeriofarias.com/?p=339</guid>
		<description><![CDATA[Olá entusiasta do Ruby! Olá entusiasta de BDD!  Te convido a ler, baixar, modificar, clonar ou fazer o que quiser com o livro: Aprenda BDD jogando Dados!
Esse mini-livro é uma jornada linha a linha, teste por teste, utilizando a técnica do Desenvolvimento Orientado a Comportamento (Behavior Driven Development) em um projeto muito interessante: Simulação dos [...]]]></description>
			<content:encoded><![CDATA[<p>Olá entusiasta do Ruby! Olá entusiasta de BDD!  Te convido a ler, baixar, modificar, clonar ou fazer o que quiser com o livro: Aprenda BDD jogando Dados!</p>
<p>Esse mini-livro é uma jornada linha a linha, teste por teste, utilizando a técnica do Desenvolvimento Orientado a Comportamento (Behavior Driven Development) em um projeto muito interessante: Simulação dos dados do jogo War!</p>
<p>Eu escrevi esse pequeno livro para aprender BDD e RSpec, por isso eu tinha que falar sobre algo simples e de preferência que fosse divertido. Então eu pensei: Por que não jogar dados! Porque não jogar dados do jogo War!<br />
Então aqui está: Aprenda BDD jogando dados!</p>
<p>A aplicação que nós criaremos juntos usa duas classes: Dice e WarDice. No primeiro capítulo eu construo o arquivo RSpec da classe Dice e a classe Dice simultaneamente e passo a passo até todos os testes tornarem-se verdes.</p>
<p>No segundo capítulo eu continuo o desenvolvimento com a classe WarDice, aquela que fará a simulação de cada dado do jogo war!</p>
<p>Finalmente, no terceiro capítulo eu uso as classes criadas em uma divertida aplicação feita em shoes. A filosofia desse livro é aprender fazendo coisas divertidas. Em uma palavra: Experimentação.</p>
<p>Então eu espero que você aproveite esse livro simples mas também muito instrutivo. Os testes usados nesse livro não são uma solução definitiva. Eles são somente possibilidades no meio de outras. Como eu disse, eu o escrevi para aprender RSpec. Você pode enviar sugestões, clonar o projeto, modificá-lo e codificá-lo de outra forma. Quem sabe não faremos juntos a versão 2.0 desse livro <img src='http://valeriofarias.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Fique agora com o livro:</p>
<div id="__ss_4798578" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Aprenda bdd-jogando-dados-ebook" href="http://www.slideshare.net/valeriofarias/aprenda-bddjogandodadosebook">Aprenda bdd-jogando-dados-ebook</a></strong><object id="__sse4798578" 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=aprenda-bdd-jogando-dados-ebook-100720143458-phpapp01&amp;stripped_title=aprenda-bddjogandodadosebook" /><param name="name" value="__sse4798578" /><param name="allowfullscreen" value="true" /><embed id="__sse4798578" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=aprenda-bdd-jogando-dados-ebook-100720143458-phpapp01&amp;stripped_title=aprenda-bddjogandodadosebook" name="__sse4798578" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/valeriofarias">Valério  Farias</a>.</div>
</div>
<p>O código fonte completo da aplicação você pode baixar em:<br />
<a href="http://github.com/valeriofarias/shoes-war-dice">http://github.com/valeriofarias/shoes-war-dice</a></p>
<p>O texto completo do livro e o código fonte do gerador de livros você pode baixar em:<br />
<a href="http://github.com/valeriofarias/learn-bdd-playing-dice-book">http://github.com/valeriofarias/learn-bdd-playing-dice-book</a></p>
<p>se preferir pode também baixar a <strong>versão em inglês</strong> do livro:<br />
<a href="http://valeriofarias.com/learn-bdd-playing-dice-ebook/">http://valeriofarias.com/learn-bdd-playing-dice-ebook/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/aprenda-bdd-jogando-dados-ebook/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Learn BDD Playing Dice &#8211; ebook</title>
		<link>http://valeriofarias.com/learn-bdd-playing-dice-ebook/</link>
		<comments>http://valeriofarias.com/learn-bdd-playing-dice-ebook/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 15:32:10 +0000</pubDate>
		<dc:creator>Valério Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Dice]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Rspec]]></category>
		<category><![CDATA[Shoes]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://valeriofarias.com/?p=332</guid>
		<description><![CDATA[Hello Ruby enthusiast! Hello BDD enthusiast! Welcome to this journey line by line, test by test, using the Behaviour Driven Development technique in a interesting project: War Dice Simulation!
I wrote this tiny book to learn BDD and RSpec for myself. I would want to start with a little example. And if was possible with a [...]]]></description>
			<content:encoded><![CDATA[<p>Hello Ruby enthusiast! Hello BDD enthusiast! Welcome to this journey line by line, test by test, using the Behaviour Driven Development technique in a interesting project: War Dice Simulation!</p>
<p>I wrote this tiny book to learn BDD and RSpec for myself. I would want to start with a little example. And if was possible with a funny example too. Then I thought: Why not playing dice! Why not playing war dice! Then there you are: Learning BDD playing dice!</p>
<p>The app that we&#8217;ll create together uses two classes: Dice and WarDice.</p>
<p>The first chapter I start to construct the RSpec file of Dice class and the Dice class simultaneously and step by step until all of the tests become green.</p>
<p>The second chapter I go on with the WarDice class, that is a simulation of each dice of war game!</p>
<p>Finally, the third chapter I use the classes in a funny shoes application.</p>
<p>The philosophy of this book is to learn making funny things. In one word: Experimentation. Then I hope you enjoy this simple but also instructive book.</p>
<p>The tests used in this book aren&#8217;t a silver bullet. They are only a way between some others. How I told, I made to learn RSpec. You can send suggests, clone the project, modify it and codify in other ways. Who knows we&#8217;ll playing together in the 2.0 version of this book <img src='http://valeriofarias.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Now just read the book and have fun!</p>
<div id="__ss_4798538" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Learn bdd-playing-dice-book" href="http://www.slideshare.net/valeriofarias/learn-bddplayingdicebook">Learn bdd-playing-dice-book</a></strong><object id="__sse4798538" 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=learn-bdd-playing-dice-book-100720142952-phpapp01&amp;stripped_title=learn-bddplayingdicebook" /><param name="name" value="__sse4798538" /><param name="allowfullscreen" value="true" /><embed id="__sse4798538" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=learn-bdd-playing-dice-book-100720142952-phpapp01&amp;stripped_title=learn-bddplayingdicebook" name="__sse4798538" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/valeriofarias">Valério  Farias</a>.</div>
</div>
<p>The complete source code of application you can download in<br />
<a href="http://github.com/valeriofarias/shoes-war-dice/tree">http://github.com/valeriofarias/shoes-war-dice/tree</a></p>
<p>The complete ebook text and source code you can download in:<br />
<a href="http://github.com/valeriofarias/learn-bdd-playing-dice-book">http://github.com/valeriofarias/learn-bdd-playing-dice-book</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/learn-bdd-playing-dice-ebook/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programação Funcional e Looping (tradução)</title>
		<link>http://valeriofarias.com/programacao-funcional-e-looping/</link>
		<comments>http://valeriofarias.com/programacao-funcional-e-looping/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 01:54:35 +0000</pubDate>
		<dc:creator>Valério Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[each]]></category>
		<category><![CDATA[iterações]]></category>
		<category><![CDATA[linguagem funcional]]></category>
		<category><![CDATA[loop]]></category>

		<guid isPermaLink="false">http://valeriofarias.com/?p=314</guid>
		<description><![CDATA[Quem vem linguagens como C, Java, Delphi, C# e usa a linguagem Ruby pela primeira vez, tende a programar em Ruby do mesmo jeito que programava na linguagem que já era fluente. Lendo o post abaixo você perceberá que linguagens que tem características  funcionais, como o Ruby, possibilitam formas próprias de organizar o código (Jeito [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Quem vem linguagens como C, Java, Delphi, C# e usa a linguagem Ruby pela primeira vez, tende a programar em Ruby do mesmo jeito que programava na linguagem que já era fluente. Lendo o post abaixo você perceberá que linguagens que tem características  funcionais, como o Ruby, possibilitam formas próprias de organizar o código (Jeito Ruby) , mais especificamente nesse texto, escrito por Jon Dahl, você verá as formas mais eficientes de fazer iterações (loops) em Ruby. A versão original você encontra <a href="http://railspikes.com/2008/7/29/functional-loops-in-ruby-each-map-inject-select-and-for">aqui</a>. Fique agora com a tradução:</p></blockquote>
<p>Se você é um programador, você provavelmente já trabalhou com um ou mais  livros que te ensinava a sintaxe de uma nova linguagem. Eu tive essa  experiência com uma meia dúzia de linguagens, como C, Javascript e Perl.<br />
Estes livros tipicamente introduzem loops no meio da discussão de  sintaxe, depois de tipos de dados e controle de fluxo, mas antes de I/O e  de recursos avançados.</p>
<p>Loops são quase sempre apresentadas de  acordo com esta fórmula:</p>
<p>Texto introdutório: &#8220;E se você quiser fazer uma operação mais de uma  vez&#8221;?<br />
Introduz o loop while, mostrando a diferença entre do while e  while do.<br />
Apresenta o laço for, o primo louco do while.</p>
<p>(Bonus)  Introduz o laço foreach se a linguagem é suficientemente de alto nível.  E é isso &#8211; você sabe como fazer um loop através de código e é hora de  seguir em frente.</p>
<p>Não tão rápido. Se você for sortudo o bastante para usar uma  linguagem que possui traços de programação funcional, você não deve usar  um laço dessa maneira.</p>
<p><strong>O ponto</strong><br />
De agora em diante, eu vou  usar Ruby para exemplos, mas este artigo não é sobre Ruby. É sobre a  transição de loops primitivos para iterar usando coleções, e sobre a  transição de funções genéricas (como each) para funções mais específicas  (como map).</p>
<p><strong>De loops para métodos que percorrem a própria lista</strong><br />
Durante os  últimos meses, estive trabalhando no Tumblon, uma aplicação Rails de porte  médio. Eu trabalhei em 15-20 aplicações Ruby nos últimos três anos,  provavelmente, totalizando 50.000 linhas de código Ruby.</p>
<p>Eu só usei um laço primitivo uma vez.</p>
<p>Esse laço primitivo era  um loop{} loop, sempre percorrer uma lista tarefas à procura do que  executar. Em outras palavras, um laço sem nenhuma condição de saída além  de ^C, ou uma falha do servidor.</p>
<p>Eu só usei um loop simples em um caso porque o conceito each  geralmente é uma opção melhor. Essa implementação Ruby será familiar  para quem já viu código Ruby antes:</p>
<pre class="brush: ruby; ">

[&quot;horse&quot;, &quot;pig&quot;, &quot;cow&quot;].each  do |animal|
puts &quot;Old MacDonald has a #{animal}&quot;
end
</pre>
<p>(Sim, eu tenho uma  criança pequena.)</p>
<p>Isto é muito mais enxuto do que as alternativas  usando for e while. Ele representa melhor o que estamos fazendo: não  estamos iterando com uma condição de saída, estamos interagindo entre os  elementos de uma matriz. Mas e se você quiser fazer algo um número fixo  de vezes? Você pode interpretar isso como percorrer a seguinte lista:  [1,2,3,4,5,6,7,8,9,10].each{}. Mas claro que Ruby dispõe de uma versão  mais simples para isso: 10.times{}.</p>
<p>Portanto, se seu loop rodar através de uma lista de algum tipo, each  é a melhor abstração para esse tipo de problema. E, na minha  experiência de construção de aplicações Ruby, a maioria dos loops  percorrem listas. Parsing XML? Iterando por uma lista. Somando números?  Iterando por uma lista. Leitura em um arquivo texto? Lendo o STDIN?  Trabalhando com linhas em um banco de dados? Iterando por uma lista.  Isso é o que o loop each faz bem.</p>
<p><strong>Além do arr.each</strong><br />
Mas each não é a palavra final. É um passo acima  das primitivas for ou while quando trabalha com o conjunto de valores,  mas muitos loops each devem ser substituídos por outros métodos de  array, como map, inject e select.</p>
<p>Quando each é útil? Simples: quando você quiser criar efeitos  externos ao array, como salvar no banco de dados, imprimir um resultado  na tela, ou enviar uma chamada de serviço web. Nestes casos, você não  está preocupado com o valor de retorno; você deseja alterar o estado na  tela, o disco, o banco de dados, ou outra coisa. Dê uma olhada neste  código.</p>
<pre class="brush: ruby; ">

User.find(:all).each do |user|
Notification.deliver_email_newsletter(user)
end
</pre>
<p>Você não necessita que o código acima retorne valor, você só precisa que o e-mail seja entregue.</p>
<p>Mas não use each se você quer extrair algum  valor novo de um array. Em vez disso, dê uma olhada em outros três  métodos poderosos: map, inject e select.</p>
<p>Para entender vamos analisar o código abaixo que itera por um array e  cria um novo array com elementos que correspondem a determinada  condição, usando each.</p>
<pre class="brush: ruby; ">

active_users = []
users.each do |user|
active_users &lt;&lt; user if user.active?
end
active_users
</pre>
<p>A primeira e última linhas são feias. Por  que você tem que inicializar e retornar active_users? Resposta: porque  este é um abuso (má utilização) do método each. Nesse caso é muito  melhor você usar select (ou seu equivalente, find_all):</p>
<pre class="brush: ruby; ">

users.select do |user|
user.active?
end
</pre>
<p>Usando  select o código fica menor, mais fácil de entender e menos propenso a  erros. E mais importante, ele claramente encapsula um uso comum de each  (e looping em geral).</p>
<p>Duas outras funções-chave: map e inject (ou reduce) &#8211; complementam  select e seguem um padrão semelhante. E não é de surpreender que eles  formam a base do paradigma mapreduce para processamento distribuído. Eu  escrevi mais sobre map e reduce em outro artigo, e aqui é um atalho para  saber quando usar essas funções:</p>
<table>
<tbody>
<tr>
<td><strong>Valor de retorno</strong></td>
<td><strong>Função</strong></td>
</tr>
<tr>
<td>Nova matriz com o mesmo número de valores</td>
<td>map</td>
</tr>
<tr>
<td>Nova matriz composta de uma parte da matriz velha</td>
<td>select</td>
</tr>
<tr>
<td>Valor único (embora este valor possa ser um array)</td>
<td>inject</td>
</tr>
<tr>
<td>Nenhum</td>
<td>each</td>
</tr>
</tbody>
</table>
<p><strong>Resumo</strong><br />
Use each para mudar o estado. Caso contrário use métodos  funcionais de matriz que retorna um valor. Dessa forma seu código ficará  mais limpo e menos propenso a falhas.</p>
<p><strong>Aprendendo a refatorar</strong></p>
<ol>
<li> Inicializar  um valor vazio, ou matriz, ou o que quiser (new_arr = [])</li>
<li> arr.each, alterando o valor inicializado</li>
<li> Devolver o valor (return  new_arr)</li>
</ol>
<p>Sempre que você detectar esse padrão, você sabe que existe um laço each que precisa ser substituído.</p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/programacao-funcional-e-looping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acessando o Twitter via Interactive Ruby Shell (irb)</title>
		<link>http://valeriofarias.com/twitter-via-irb-ruby/</link>
		<comments>http://valeriofarias.com/twitter-via-irb-ruby/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 05:36:40 +0000</pubDate>
		<dc:creator>Valrio Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[irb]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://geyserway.com/?p=127</guid>
		<description><![CDATA[Estava procurando por uma solução simples em Ruby para fazer o update de mensagens via irb.
Achei as seguintes opções de classes Ruby:

Twitter -&#62; John Nunemaker ( essa é a mais completa )
Twittery &#8211; uma classe bem simplista que faz upload de fotos pela TwitPic&#8217;s API. Esse projeto é administrado por Chris Ledet

Eu tomei como base [...]]]></description>
			<content:encoded><![CDATA[<p>Estava procurando por uma solução simples em Ruby para fazer o update de mensagens via irb.<br />
Achei as seguintes opções de classes Ruby:</p>
<ul>
<li><a href="http://twitter.rubyforge.org/">Twitter</a> -&gt; John Nunemaker ( essa é a mais completa )</li>
<li><a href="http://rubyforge.org/projects/twittery/">Twittery</a> &#8211; uma classe bem simplista que faz upload de fotos pela TwitPic&#8217;s API. Esse projeto é administrado por Chris Ledet</li>
</ul>
<p>Eu tomei como base para aprendizado, a classe do projeto Twittery, pois queria uma solução rápida e simples. Apesar dela não ter a segurança do protocolo de autenticação oAuth que já consta no projeto de John Nuremaker.</p>
<h2>A idéia foi a seguinte: colocar o código Ruby para ser pré-carregado no arquivo .irbrc toda vez que o irb for acionado via shell.</h2>
<p>Depois de vários teste o código final você pode ver abaixo:</p>
<pre class="brush: ruby; ">

# twitting by irb
require &#039;net/http&#039;

class Object
  def twitter_config(username, password)
    @username = username
    @password = password
  end

# the message must be between 1 and 160 characters
  def twitter(status = nil, format = &#039;json&#039;)
     if status.empty? or status.length &gt; 160
        puts &quot;twitter &#039;message with spaces&#039;             (IRB)&quot;
        puts &quot;Obs. (The message must been less than 160 characters and cannot be empty)&quot;
     else
        api_url = &#039;http://twitter.com/statuses/update.&#039; + format
        url = URI.parse(api_url)
        req = Net::HTTP::Post.new(url.path)
        req.basic_auth(@username, @password)
        req.set_form_data({ &#039;status&#039;=&gt; status }, &#039;;&#039;)
        res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
        puts res
     end
 end
alias :twit :twitter
end

twitter_config(&#039;username&#039;, &#039;password&#039;)
</pre>
<p>Os dados de usário e senha já são pré-carregados na inicialização do irb. A vantagem é que esses dados ficam ocultos no arquivo .irbrc, dando um pouquinho de privacidade, caso tenha alguém do lado. <img src='http://valeriofarias.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Para &#8220;twittar&#8221; é só usar o seguinte comando, a qualquer momento, dentro do irb:</p>
<pre class="brush: ruby; ">

irb&gt; twitter &quot;mensagem via irb&quot;

ou ainda

irb&gt; twit &quot;outra mensagem via irb&quot;
</pre>
<blockquote><p>Obs.: Esse exemplo usa a forma de autenticação mais simples, via HTTP. O twitter está em processo de mudança da autenticação para usar <a href="http://oauth.net/">oAuth</a>. A tendência é que a autenticação básica via HTTP deixe de ser usada, mas isso ainda vai demorar um pouco. Enquanto isso não acontece, vou continuar &#8220;twittando&#8221; por esse script via irb. <img src='http://valeriofarias.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p></blockquote>
<p>Fico por aqui.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/twitter-via-irb-ruby/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby + irb + utility-belt + gedit = :)</title>
		<link>http://valeriofarias.com/ruby-irb-utility-belt-gedit/</link>
		<comments>http://valeriofarias.com/ruby-irb-utility-belt-gedit/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 02:25:31 +0000</pubDate>
		<dc:creator>Valrio Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[irb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[utility-belt]]></category>

		<guid isPermaLink="false">http://geyserway.com/?p=105</guid>
		<description><![CDATA[Em setembro de 2008, Akita fez um post interessante sobre o utility-belt, uma gem
que adiciona várias funcionalidades ao irb (é algo parecido como dar Red Bull para o irb). Entre as várias funcionalidades temos:

 acionar o Vi ou o TextMate a partir do irb, permitindo que você escreva ou cole um código rapidamente, salve, feche [...]]]></description>
			<content:encoded><![CDATA[<p>Em setembro de 2008, Akita fez um <a href="http://www.akitaonrails.com/2008/9/21/ruby-irb-utility-belt">post interessante sobre o utility-belt</a>, uma gem<br />
que adiciona várias funcionalidades ao irb (é algo parecido como dar Red Bull para o irb). Entre as várias funcionalidades temos:</p>
<ul>
<li> acionar o Vi ou o TextMate a partir do irb, permitindo que você escreva ou cole um código rapidamente, salve, feche o editor e já possa testar no irb, sem precisar criar arquivo e salvar em diretório.</li>
<li> visualizar um histórico de comandos digitando &#8220;h&#8221;</li>
<li> abrir o histórico no TextMate ou Vi usando hvi ou hmate</li>
<li> assista ao <a href="http://www.akitaonrails.com/2008/9/21/ruby-irb-utility-belt">screencast</a> do Akita para ver o funcionamento</li>
</ul>
<p>Até aí tudo bem, mas o grande problema é que eu uso <strong>ubuntu</strong> com <strong>gedit</strong> para escrever códigos ruby. E o utility-belt não possui métodos específicos para acionar o gedit. O help do utility belt dá a opção edit_interactively(:gedit), mas é claro que eu não poderia me contentar com esse método, eu queria que funcionasse da mesma forma que funciona para o Vi ou TextMate.</p>
<p>Pesquisando um pouco, achei um artigo que mostra como  <a href="http://www.vanutsteen.nl/2008/05/12/interactiveinline-editor-in-irb/">abrir o editor nano do linux através do irb</a>, extendendo o utility-belt. A partir dele eu fiz algumas modificações no arquivo .irbrc que vocês verão na sequência do Post.</p>
<p>A primeira etapa é instalar o utility-belt:</p>
<pre class="brush: ruby; ">
git clone git://github.com/akitaonrails/utility-belt.git
cd utility-belt
gem build utility_belt.gemspec
sudo gem install utility_belt-1.0.12.gem
</pre>
<p>Agora é só editar o arquivo .irbrc no home do seu sistema e acrescentar as seguintes linhas:</p>
<pre class="brush: ruby; ">
require &#039;rubygems&#039;
require &#039;utility_belt&#039;

module InteractiveEditing
   def gedit
      edit_interactively(:gedit)
   end
end

class Object
   def history_to_gedit
      handling_jruby_bug do
         file = Tempfile.new(&quot;gedit_tempfile&quot;)
         get_lines(0..(Readline::HISTORY.size - 1)).each do |line|
            file &lt;&lt; &quot;#{line}\n&quot;
         end
         file.close
         system(&quot;gedit #{file.path}&quot;)
      end
   end
   alias :hgedit :history_to_gedit
end

UtilityBelt.equip(:all)
</pre>
<p>Depois disso é só salvar e partir para a execução!</p>
<p>Agora você pode usar o comando <strong>gedit</strong> direto do irb e também abrir o histórico no gedit usando <strong>hgedit</strong> ou <strong>history_to_gedit</strong>. Se quiser entender um pouco mais sobre os códigos leia os arquivos: interactive_editor.rb e command_history.rb na pasta: utility-belt/lib/utility_belt$</p>
<p>Para quem não utiliza o gedit, nem o Vi, nem o TextMate,  é só modificar esse código para o seu editor favorito!</p>
<p>Fico por aqui.</p>
<blockquote><p>Obs.:O primeiro teste que eu fiz não funcionou, pois estava faltando uma dependência no meu sistema. Era o xsel que é responsável para fazer cópias de texto do shell para clipboard. Resolvi esse problema usando: <strong>sudo apt-get install xsel</strong><br />
Para saber mais sobre o xsel acesse <a href="http://www.pgrs.net/2008/1/11/command-line-clipboard-access">aqui</a>.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/ruby-irb-utility-belt-gedit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como a Linguagem Ruby pode ajudar o Capitão Morrimento</title>
		<link>http://valeriofarias.com/como-a-linguagem-ruby-pode-ajudar-o-capitao-morrimento/</link>
		<comments>http://valeriofarias.com/como-a-linguagem-ruby-pode-ajudar-o-capitao-morrimento/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 06:34:09 +0000</pubDate>
		<dc:creator>Valrio Farias</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://valeriofarias.wordpress.com/2007/11/29/como-a-linguagem-ruby-pode-ajudar-o-capitao-morrimento/</guid>
		<description><![CDATA[Tudo bem Pessoal, já tinha feito uma comparação do ruby com o Pascal anteriormente e agora recebi um pedido para ajudar o Capitão Morrimento a selecionar seus aspirantes por meio de um software.
 
O problema é que o Capitão Morrimento precisou sair de férias do seu batalhão, mas mesmo assim quer garantir que a equipe [...]]]></description>
			<content:encoded><![CDATA[<p>Tudo bem Pessoal, já tinha feito uma <a href="http://valeriofarias.wordpress.com/2007/08/23/primeira-linguagem-de-programacao/">comparação do ruby com o Pascal</a> anteriormente e agora recebi um pedido para ajudar o Capitão Morrimento a selecionar seus aspirantes por meio de um software.</p>
<p> <a href='http://valeriofarias.files.wordpress.com/2007/11/capitaomorrimento.jpg' title='Capitão Morrimento'><img src='http://valeriofarias.files.wordpress.com/2007/11/capitaomorrimento.jpg' alt='Capitão Morrimento' /></a></p>
<p>O problema é que o Capitão Morrimento precisou sair de férias do seu batalhão, mas mesmo assim quer garantir que a equipe continue na linha e quer acompanhar os aspirantes para não ter problema com eles no futuro.</p>
<p>Para piorar a situação descobri que o Capitão Morrimento é muito extressado e não quer perder tempo com interface complexa. Ele tem conhecimento dos softwares básicos de escritório (somente o editor de texto). Então ele quer algo que se aproxime o máximo possível de copiar dos registros dos aspirantes que ele tem no seu PC e colocar em um campo que faça a verificação e diagnóstico do Aspira.</p>
<p>Sabendo da necessidade de criar algo simples, resolvi usar os conceitos de DSL (Linguagens Especificas de Domínio) do Ruby e fiz a seguinte classe para que ele pudesse entrar com dados no formato que ele usa no dia-a-dia dele:</p>
<blockquote><pre>def aspirante(nome, &amp;bloco)
		Aspirante.new(nome, &amp;bloco)
end

class Aspirante

	def initialize(nome, &amp;bloco)
		@nome = nome
		@dados = {
			:descricoes =&gt; [],
			:numero =&gt; nil
		}

		instance_eval(&amp;bloco)

	end

	def descricao(dados)
		@dados[:descricoes] &lt;&lt; dados
	end

	def numero(numero)
		@dados[:numero] = numero
	end

	def resultado()

		if @dados[:descricoes].include? "corrupto" then 5.times{ puts "PEDE PRA SAIR!"}

		elsif @dados[:numero] == 2 then 5.times{ puts "PEDE PRA SAIR! SEU 02! Tu e CORRUPTO!"}

		elsif @dados[:descricoes].include? "PM" then 2.times{ puts "NAO VAI SUBIR NINGUEM!"}

		elsif @dados[:descricoes].include? "dorminhoco" then 2.times{ puts "TRAGAM A GRANADA!..."}

		else puts "O senhor e um FANFARRAO seu #{@dados[:numero]}.\n Sera interrogado diretamente pelo CAPITAO."

		end
	end

end</pre>
</blockquote>
<p>Agora é só salvar esse código num arquivo e carregar (load class_aspirante.rb). Então O Capitão pode usar da seguinte forma:</p>
<blockquote><p>a1 = aspirante &#8220;José dos Azóis&#8221; do<br />
	numero = 04<br />
	descricao = &#8220;Disciplinado&#8221;<br />
        descricao = &#8220;Competente&#8221;<br />
        descricao = &#8220;etc&#8221;<br />
end</p></blockquote>
<p>a partir daí é só usar a1.resultado e obtém a resposta que queria.</p>
<p>Bom esse exemplo está em aberto, gostaria de dicas para melhorá-lo, porque, como falei antes, o capitão morrimento é muito esquentado e eu não quero ser chamado de Fanfarrão <img src='http://valeriofarias.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Quem puder contribuir com novas dicas de implementação para que a linguagem DSL Caveira fique mais intuitiva e eficiente fique à vontade para comentar.</p>
<p>Até logo.</p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/como-a-linguagem-ruby-pode-ajudar-o-capitao-morrimento/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby como primeira linguagem de programação!</title>
		<link>http://valeriofarias.com/primeira-linguagem-de-programacao/</link>
		<comments>http://valeriofarias.com/primeira-linguagem-de-programacao/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 14:15:24 +0000</pubDate>
		<dc:creator>Valrio Farias</dc:creator>
				<category><![CDATA[Pense nisso!]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://valeriofarias.wordpress.com/2007/08/23/primeira-linguagem-de-programacao/</guid>
		<description><![CDATA[Pois é, para alguns pode soar um pouco estranho, principalmente para os mais tradicionais, mas é o que estou propondo nesse post.
A minha experiência com primeira linguagem foi em 1997 com Pascal que foi uma linguagem criada em 1970 por Niklaus With com o objetivo principal de encorajar o uso do código estruturado (principalmente para [...]]]></description>
			<content:encoded><![CDATA[<p>Pois é, para alguns pode soar um pouco estranho, principalmente para os mais tradicionais, mas é o que estou propondo nesse post.</p>
<p>A minha experiência com primeira linguagem foi em 1997 com <a href="http://pt.wikipedia.org/wiki/Pascal_(linguagem_de_programa%C3%A7%C3%A3o)">Pascal</a> que foi uma linguagem criada em 1970 por Niklaus With com o objetivo principal de encorajar o uso do código estruturado (principalmente para o ensino).</p>
<p>Vamos ver um pequeno exemplo de teste lógico em Pascal:</p>
<blockquote><pre>program Testelogico;

var a,b:integer;

uses crt;

begin
   clrscr;
   writeln ('Digite um número para A');
   readln (a);
   writeln ('Digite o número para B');
   readln (b);

   if (a = b) then
       writeln ('A é igual a B')
   else
       if (a &lt; b) then
           writeln ('B é maior que A')
       else
           writeln ('A é maior que B');
end.</pre>
</blockquote>
<p>Podemos perceber nesse código a necessidade de aprendizado de vários conceitos voltados para a própria estrutura da linguagem ao invés de se focar no problema. Como exemplo temos a exigência dos parênteses e o ponto e vírgula no final de bloco, além da regra clássica: antes de else não se usa ponto e vírgula, pois o ponto e vírgula é utilizado para finalizar blocos de programação.</p>
<p><a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa%C3%A7%C3%A3o%29">Ruby</a> é uma linguagem criada por Yukihiro Matsumoto, projetada para programação em grande escala unido de codificação rápida. Vamos ver o mesmo exemplo anterior feito em Ruby:</p>
<blockquote><pre>print "Entre com o valor de A:"
a = gets

print "Entre com o valor de B:"
b = gets

if a == b
   print "A é igual a B"
elsif a &lt; B
   print "B é maior que A"
else
    print "A é maior que B"
end</pre>
</blockquote>
<p>Além da quantidade de código diminuir tornando-o mais simples, a curva de aprendizado também tende a ser menor, pois agora não temos mais que garantir regras voltadas para a estrutura da linguagem. o bloco if-else faz o que tem que ser feito sem precisar está se preocupando se está faltando ou não ponto e vírgula.</p>
<p>Podemos ver um exemplo ainda mais convincente com estruturas de repetição com final conhecido. Vejam um exemplo em Pascal que mostra 10 vezes na tela a palavra &#8220;teste&#8221;:</p>
<blockquote><pre>Program repeticao

var
   i : integer;

begin

   for i:= 1 to 10 do
       writeln("teste");

end
</pre>
</blockquote>
<p>Para fazer esse exemplo simples precisei seguir a burocracia de criar o nome do programa criar a variável e só depois criar a rotina. Vamos ver no Ruby o mesmo exemplo:</p>
<blockquote><pre>10.times do
  puts "teste"
end</pre>
</blockquote>
<p>Ou ainda:</p>
<blockquote><p>10.times { puts &#8220;teste&#8221; }</p></blockquote>
<p>Deu para perceber a simplificação absurda do código no Ruby? Em algumas rotinas assemelha-se a criação de um texto em inglês (linguagem humana). Ao invés de precisar saber que a repetição será a variação do valor de uma variável i de 1 a 10, simplesmente peço para imprimir 10 vezes a palavra &#8220;teste&#8221;.</p>
<p>Aliando essa simplicidade à característica de ser totalmente orientada a objetos. Além de, junto com o framework <a href="http://pt.wikipedia.org/wiki/Ruby_on_Rails">rails</a> permitir a utilização profissional no desenvolvimento de sistemas web. Já acho que são argumentos suficientes para aposentar de vez o Pascal  <em>(ainda bastante utilizado no ambiente acadêmico e em cursos técnicos como primeira linguagem de programação complementando a disciplina de algoritmos)</em> e seguir com uma linguagem simples, produtiva, de <a href="http://www.rubyonbr.org/articles/2007/04/29/ruby-alem-do-usual/">utilização geral</a> e até divertida como o Ruby.</p>
<p>Lembrando que estou sugerindo como primeira linguagem, para depois continuar com ela ou não. Sempre que possível é muito importante <a href="http://www.akitaonrails.com/articles/2007/03/14/off-topic-um-desabafo">aprender outras linguagens</a> para obter outros pontos de vista.</p>
<p>Um grande abraço e até o próximo Pense nisso!</p>
]]></content:encoded>
			<wfw:commentRss>http://valeriofarias.com/primeira-linguagem-de-programacao/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

