<?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>ArthurGeek.net &#187; ruby</title>
	<atom:link href="http://www.arthurgeek.net/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.arthurgeek.net</link>
	<description>Rails, Mac... e Rock'n Roll!</description>
	<lastBuildDate>Sat, 20 Dec 2008 23:25:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nyane: o framework insignificante</title>
		<link>http://www.arthurgeek.net/nyane-o-framework-insignificante/</link>
		<comments>http://www.arthurgeek.net/nyane-o-framework-insignificante/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 13:53:13 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[nyane]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/?p=124</guid>
		<description><![CDATA[Existem muitos frameworks Ruby por aí. Alguns são completos, outros são modulares e outros são minimalistas. Por quê mais um framework?
O Nyane nasceu depois que eu resolvi estudar o Rack, e me deparei com isto: Very Simple Rack Framework.
Construir um framework baseado no Rack, ao vivo, durante uma apresentação de 30 minutos? Não é possível! [...]]]></description>
			<content:encoded><![CDATA[<p>Existem <a title="Ruby on Rails" href="http://www.rubyonrails.com">muitos</a> <a title="Sinatra" href="http://sinatrarb.com">frameworks</a> <a title="Ruby" href="http://ruby-lang.org">Ruby</a> <a title="Ramaze" href="http://ramaze.net/">por</a> <a title="Merb" href="http://merbivore.com">aí</a>. Alguns são completos, outros são modulares e outros são minimalistas. Por quê mais um framework?</p>
<p>O <a href="http://github.com/arthurgeek/nyane/">Nyane</a> nasceu depois que eu resolvi estudar o <a href="http://rack.rubyforge.org/">Rack</a>, e me deparei com isto: <a href="http://refactormycode.com/codes/491-very-simple-rack-framework">Very Simple Rack Framework</a>.</p>
<p>Construir um framework baseado no Rack, ao vivo, durante uma apresentação de 30 minutos? Não é possível! Olha a sintaxe, tão bonitinha, como construir isso de maneira rápida e fácil de apresentar? Aquilo me deixou muito intrigado. Passei horas procurando na internet como construir um framework que fosse capaz de aceitar aquela sintaxe. Infelizmente, a documentação do Rack para este tipo de finalidade é quase nula.</p>
<p>Fui atrás de alguns frameworks simples baseados no Rack. O primeiro que eu encontrei foi o <a title="Coset" href="http://chneukirchen.org/repos/coset/">Coset</a>. Mas o código era meio difícil de entender. Quer dizer, <a href="http://chneukirchen.org/repos/coset/lib/coset.rb">o código do framework em si</a> não é complicado, acontece que eu não enxergava a ligação entre aquele código e o Rack. Iria precisar de algo bem mais simples pra começar.</p>
<p>Foi aí que eu encontrei <a href="http://yeahnah.org/files/rack-presentation-oct-07.pdf">algumas</a> <a href="http://chneukirchen.org/talks/euruko-2007/neukirchen07introducingrack.pdf">apresentações</a> sobre como construir aplicações Rack. Agora, todo aquele código começava a fazer sentido. Mesmo assim, eu queria algo mais simples. Foi quando eu encontrei o <a href="http://github.com/macournoyer/invisible/tree/master">Invisible</a>. A <a href="http://github.com/macournoyer/invisible/tree/4a00c623562bceaa74b78f24bb9af9bde97311e2">versão inicial</a> era ainda mais simples. Ótimo! Achei meu ponto de partida.</p>
<p><span id="more-124"></span></p>
<p>No final de semana passado, estava em um quarto de hotel sem internet. Resolvi começar a &#8220;brincar sério&#8221; com o Rack. Foi aí que me saí com isso:</p>
<pre class="ruby"><code><span class="kw1">class</span> Nyane
 
  <span class="kw1">def</span> initialize<span class="br0">(</span>&amp;block<span class="br0">)</span>
    <span class="re1">@actions</span> = <span class="br0">[</span><span class="br0">]</span>
    instance_eval<span class="br0">(</span>&amp;block<span class="br0">)</span>
  <span class="kw1">end</span>
 
  <span class="kw1">def</span> get<span class="br0">(</span>route, &amp;block<span class="br0">)</span>
    <span class="re1">@actions</span> &lt;&lt; <span class="br0">[</span>route, block<span class="br0">]</span>
  <span class="kw1">end</span>
 
  <span class="kw1">def</span> call<span class="br0">(</span>env<span class="br0">)</span>
    action = <span class="re1">@actions</span>.<span class="me1">detect</span> <span class="br0">{</span> |route, block| env<span class="br0">[</span><span class="st0">"PATH_INFO"</span><span class="br0">]</span>.<span class="me1">match</span><span class="br0">(</span><span class="kw4">Regexp</span>.<span class="me1">new</span><span class="br0">(</span><span class="st0">"^#{route}$"</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">}</span>
 
    <span class="kw1">if</span> action
      <span class="br0">[</span><span class="nu0">200</span>, <span class="br0">{</span><span class="st0">'Content-type'</span> =&gt; <span class="st0">'text/html'</span><span class="br0">}</span>, action.<span class="me1">last</span>.<span class="me1">call</span><span class="br0">]</span>
    <span class="kw1">else</span>
      <span class="br0">[</span><span class="nu0">404</span>, <span class="br0">{</span><span class="st0">'Content-type'</span> =&gt; <span class="st0">'text/plain'</span><span class="br0">}</span>, <span class="st0">"Not found"</span><span class="br0">]</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
 
<span class="kw1">end</span></code></pre>
<p> </p>
<p>22 linhas no total. 17 linhas de código. E mesmo assim, capaz de rodar isto:</p>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">"nyane"</span>
 
app = Nyane.<span class="me1">new</span> <span class="kw1">do</span>
  get <span class="st0">"/"</span> <span class="kw1">do</span>
    <span class="st0">"Hello!"</span>
  <span class="kw1">end</span>
 
  get <span class="st0">"/hello"</span> <span class="kw1">do</span>
    <span class="st0">"Hello, hello, hello!"</span>
  <span class="kw1">end</span>
 
  get <span class="st0">"/bye"</span> <span class="kw1">do</span>
    <span class="st0">"Goodbye!"</span>
  <span class="kw1">end</span>
<span class="kw1">end</span>
 
run app</code></pre>
<p> </p>
<p>Genial!</p>
<p>O código estava pronto. Queria liberar logo para que outras pessoas pudessem &#8220;brincar&#8221; com o Rack também. Conversando com o <a title="Simples Ideias" href="http://simplesideias.com.br">Nando</a>, ele disse que o framework teria que ter &#8220;uma razão pra existir&#8221;. Mesmo eu dizendo que não era algo pra ser levado a sério, era só pra estudo. Aí ele disse que se fosse pra desenvolver um framework, teria que ter um motivo e se diferenciar dos outros. E eu continuava dizendo que era algo insignificante! :P</p>
<p>Bom, se é preciso motivos, e diferenciá-lo, então eu farei! :)</p>
<p>A idéia do Nyane é ser um framework extremamente simples. Nada de helpers, layouts, partial. Nem mesmo suporte à cookies, sessions. Quer saber? Vou liberar sem suporte à POST! Aí está a diferença dele pros outros. Duvido que exista um framework que não suporte POST. :P</p>
<p>Depois disso, faltava um nome. Mas escolher um nome para um projeto que não devia ser levado a sério? Parecia demais para mim. Resolvi brincar com o nome. Nyane, quer dizer <em>insignificante</em> em <a href="http://en.wikipedia.org/wiki/Sesotho">Sesotho</a>. Sim, um framework insignificante. :P</p>
<p>Coloquei o código no GitHub no começo da semana. Mostrei apenas para alguns amigos. Apesar de ser algo bem simples e experimental, algumas pessoas se interessaram em usá-lo para alguma pequenas aplicações. Claro, você não vai construir nenhum site completo com ele, mas, quem sabe uma área do site que não necessite de sessões, cookies ou até mesmo POST. Quando eu construía este código, não via aplicação alguma, nem mesmo achava que pudesse ser usado em produção. Hoje, vejo algumas áreas (ou serviços) de sites maiores que podem ser reescritos sem a necessidade de nada acima, nem mesmo POST.</p>
<p>Sim, o suporte à POST pode ser algo que amplie o uso do framework, mas, qual seria a grande diferenciação dele para os outros? :P Bom, fica para uma próxima versão.</p>
<p>Melhor: que tal você experimentar um pouco com o código e implementar isto? Que acha? :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/nyane-o-framework-insignificante/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Usando o ruby-debug com Passenger</title>
		<link>http://www.arthurgeek.net/usando-o-ruby-debug-com-passenger/</link>
		<comments>http://www.arthurgeek.net/usando-o-ruby-debug-com-passenger/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:17:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/08/13/usando-o-ruby-debug-com-passenger</guid>
		<description><![CDATA[Já tem algum tempo que eu venho usando o Phusion Passenger no ambiente de desenvolvimento.
Um dos problemas que eu tinha era quando precisava usar o ruby-debug. Cheguei até a perguntar no IRC, mas ninguém sabia me dar uma resposta de como usá-lo em conjunto com o Passenger. Na época, resolvi usar o Mongrel para fazer [...]]]></description>
			<content:encoded><![CDATA[<p>Já tem algum tempo que eu venho usando o <a href="http://modrails.com/">Phusion Passenger</a> no ambiente de desenvolvimento.</p>
<p>Um dos problemas que eu tinha era quando precisava usar o ruby-debug. Cheguei até a perguntar no <span class="caps">IRC</span>, mas ninguém sabia me dar uma resposta de como usá-lo em conjunto com o Passenger. Na época, resolvi usar o Mongrel para fazer o debugging e nem me preocupei mais.</p>
<p>Hoje, precisei de novo. E não queria usar o Mongrel. Então, fui novamente atrás de uma solução. Vamos à ela:</p>
<p>No arquivo: <em>config/environments/development.rb</em> coloque o seguinte código:</p>
<pre><code class="ruby"># Load ruby-debug
require "ruby-debug"
Debugger.start_remote</code></pre>
<p>Este código ativa o modo remoto do ruby-debug.</p>
<p>Agora, vamos reiniciar o passenger:</p>
<pre><code>$ touch tmp/restart.txt</code></pre>
<p>Agora, vamos conectar remotamente ao ruby-debug através do terminal:</p>
<pre><code>$ rdebug -c
Connected.</code></pre>
<p>Pronto! Sempre que quiser depurar algum erro em sua aplicação, coloque a palavra chave <strong>debugger</strong> e espere o rdebug. Só não se esqueça dos testes para não depender tanto de debugging. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/usando-o-ruby-debug-com-passenger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyGems 1.1 no Mac OS X 10.5.2 Leopard</title>
		<link>http://www.arthurgeek.net/rubygems-1-1-no-mac-os-x-10-5-2-leopard/</link>
		<comments>http://www.arthurgeek.net/rubygems-1-1-no-mac-os-x-10-5-2-leopard/#comments</comments>
		<pubDate>Mon, 31 Mar 2008 20:37:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/03/31/rubygems-1-1-no-mac-os-x-10-5-2-leopard</guid>
		<description><![CDATA[No sábado, saiu a nova versão do RubyGems, o gerenciador de pacotes do mundo Ruby.
Para atualizar, é só rodar o comando:
sudo gem update --system
Pronto! Só que, aqui no Mac OS X, ele instala a nova versão, mas o comando gem ainda aponta para a versão antiga:
$ gem -v
1.1.0
$
Talvez seja porquê o RubyGems agora é incluído [...]]]></description>
			<content:encoded><![CDATA[<p>No sábado, saiu a nova versão do <a href="http://www.rubygems.org/">RubyGems</a>, o gerenciador de pacotes do mundo Ruby.</p>
<p>Para atualizar, é só rodar o comando:</p>
<pre><code>sudo gem update --system</code></pre>
<p>Pronto! Só que, aqui no Mac <span class="caps">OS X</span>, ele instala a nova versão, mas o comando gem ainda aponta para a versão antiga:</p>
<pre><code>$ gem -v
1.1.0
$</code></pre>
<p>Talvez seja porquê o RubyGems agora é incluído por padrão no Leopard. Porém, eu queria desfrutar da velocidade para instalar novas gems que a versão 1.1 possui. Aqui vai uma solução:</p>
<pre><code>$ sudo gem install rubygems-update
$ sudo update_rubygems</code></pre>
<p>Funciona! Para aqueles que não necessitam da versão 1.1 com urgência, recomendo esperar um update da Apple (que pode demorar).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/rubygems-1-1-no-mac-os-x-10-5-2-leopard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RejectConf&#8217;07</title>
		<link>http://www.arthurgeek.net/rejectconf-07/</link>
		<comments>http://www.arthurgeek.net/rejectconf-07/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 20:54:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2007/11/19/rejectconf-07</guid>
		<description><![CDATA[Neste final de semana aconteceu o RejectConf&#8217;07. Muitas palestras e cases de sucesso. Mas com certeza o melhor foi finalmente poder conhecer a galera da comunidade Ruby/Rails pessoalmente. Akita, Carlos Brando, Eduardo Fiorezi, o pessoal do Pagestackr, entre outros feras. Agora precisamos marcar um &#8220;Nerds On Beer&#8221; com essa galera para trocarmos mais idéias.
E que [...]]]></description>
			<content:encoded><![CDATA[<p>Neste final de semana aconteceu o RejectConf&#8217;07. Muitas palestras e cases de sucesso. Mas com certeza o melhor foi finalmente poder conhecer a galera da comunidade Ruby/Rails pessoalmente. <a href="http://www.akitaonrails.com">Akita</a>, <a href="http://www.nomedojogo.com/">Carlos Brando</a>, <a href="http://www.tudoquequerosaber.com">Eduardo Fiorezi</a>, o pessoal do <a href="http://www.pagestackr.com">Pagestackr</a>, entre outros feras. Agora precisamos marcar um &#8220;Nerds On Beer&#8221; com essa galera para trocarmos mais idéias.</p>
<p>E que venha a RailsConf Brasil! ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/rejectconf-07/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mostrando a Colocação do Brasil no Pan 2007, usando Ruby!</title>
		<link>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/</link>
		<comments>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 14:57:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2007/07/17/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby</guid>
		<description><![CDATA[Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais o quadro de medalhas do Terra. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?
Então, mãos à obra!

O que é preciso?
Vou usar a excelente biblioteca de parser HTML chamada Hpricot.
O [...]]]></description>
			<content:encoded><![CDATA[<p>Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais <a href="http://agendapan.terra.com.br/br/medalhas/medalheiro.html">o quadro de medalhas do Terra</a>. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?</p>
<p>Então, mãos à obra!</p>
<p><span id="more-71"></span></p>
<h3>O que é preciso?</h3>
<p>Vou usar a excelente biblioteca de parser <span class="caps">HTML</span> chamada <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a>.</p>
<h3>O código <span class="caps">HTML</span> do Terra</h3>
<p>Vamos analisar o código <span class="caps">HTML</span> da página que mostra <a href="http://agendapan.terra.com.br/br/medalhas/medalheiro.html">o quadro de medalhas do Terra</a>.</p>
<p>O quadro de medalhas está dentro de uma tabela com a classe: <em>tab_med</em></p>
<pre class="html4strict"><code><span class="sc2"><span class="kw2">&lt;table</span> <span class="kw3">width</span>=<span class="st0">"100%"</span> <span class="kw3">border</span>=<span class="st0">"0"</span> <span class="kw3">cellpadding</span>=<span class="st0">"0"</span> <span class="kw3">cellspacing</span>=<span class="st0">"1"</span> <span class="kw3">class</span>=<span class="st0">"tab_med"</span><span class="kw2">&gt;</span></span></code></pre>
<p>Dentro desta tabela, temos vários <em>tr’s</em> , com um <em>td</em> dentro, cuja classe é <em>pais</em>. É esse que nos interessa. Pois, aqui, vamos encontrar a colocação, e o nome do país.</p>
<p>O número de medalhas se encontra dentro de outros <em>td’s</em>, cuja classes são: <em>val_ouro</em>, <em>val_prata</em>, <em>val_bronze</em> e <em>val_tot</em> para medalhas de Ouro, Prata, Bronze e Totais, respectivamente.</p>
<h3>O código Ruby</h3>
<p>Primeiramente, vamos chamar as bibliotecas <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a>, e Open-URI (para abrir uma página Web).</p>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">'rubygems'</span>
<span class="kw3">require</span> <span class="st0">'hpricot'</span>
<span class="kw3">require</span> <span class="st0">'open-uri'</span></code></pre>
<p>Agora, vamos abrir a página que vamos fazer o parsing</p>
<pre class="ruby"><code>doc = Hpricot<span class="br0">(</span><span class="kw3">open</span><span class="br0">(</span><span class="st0">"http://agendapan.terra.com.br/br/medalhas/medalheiro.html"</span><span class="br0">)</span><span class="br0">)</span></code></pre>
<h3>Extraindo a colocação</h3>
<p>Vamos então, montar um código que passa por todos os <em>td’s</em> com a classe <em>pais</em>, e encontrar um link (<em>a</em>), que aponta para a <a href="http://agendapan.terra.com.br/br/medalhas/BRA/medalheiro_1.html">página específica de medalhas do Brasil</a>.</p>
<p>doc.search(&#8221;td.pais&#8221;).each do |pais|<br />
pais.search(&#8221;a[@href='/br/medalhas/BRA/medalheiro_1.html']&#8220;) do<br />
@colocacao = pais.inner_html[0..1].to_i<br />
end<br />
end</p>
<p>puts @colocacao</p>
<h3>As medalhas</h3>
<p>Após ter encontrado a colocação do Brasil, vamos exibir as medalhas ganhas até agora, encontrando o enésimo <em>tr</em> dentro de nossa tabela, usando a colocação como referência. Após isso, é só extrair o conteúdo dos <em>td’s</em> cuja classe sejam as das medalhas que procuramos.</p>
<pre class="ruby"><code>doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"table.tab_med"</span><span class="br0">)</span>.<span class="me1">at</span><span class="br0">(</span><span class="st0">"tr:nth-of-type(#{@colocacao})"</span><span class="br0">)</span> <span class="kw1">do</span> |medalhas|
  <span class="kw3">puts</span> <span class="st0">"Ouro: #{medalhas.search("</span>td.<span class="me1">val_ouro</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Prata: #{medalhas.search("</span>td.<span class="me1">val_prata</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Bronze: #{medalhas.search("</span>td.<span class="me1">val_bronze</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Total: #{medalhas.search("</span>td.<span class="me1">val_tot</span><span class="st0">").inner_html}"</span>
<span class="kw1">end</span></code></pre>
<h3>O código completo</h3>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">'rubygems'</span>
<span class="kw3">require</span> <span class="st0">'hpricot'</span>
<span class="kw3">require</span> <span class="st0">'open-uri'</span>
 
doc = Hpricot<span class="br0">(</span><span class="kw3">open</span><span class="br0">(</span><span class="st0">"http://agendapan.terra.com.br/br/medalhas/medalheiro.html"</span><span class="br0">)</span><span class="br0">)</span>
 
doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"td.pais"</span><span class="br0">)</span>.<span class="me1">each</span> <span class="kw1">do</span> |pais|
  pais.<span class="me1">search</span><span class="br0">(</span><span class="st0">"a[@href='/br/medalhas/BRA/medalheiro_1.html']"</span><span class="br0">)</span> <span class="kw1">do</span>
    <span class="re1">@colocacao</span> = pais.<span class="me1">inner_html</span><span class="br0">[</span><span class="nu0">0</span>..<span class="nu0">1</span><span class="br0">]</span>.<span class="me1">to_i</span>
  <span class="kw1">end</span>
<span class="kw1">end</span>
 
<span class="kw3">puts</span> <span class="re1">@colocacao</span>
 
doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"table.tab_med"</span><span class="br0">)</span>.<span class="me1">at</span><span class="br0">(</span><span class="st0">"tr:nth-of-type(#{@colocacao})"</span><span class="br0">)</span> <span class="kw1">do</span> |medalhas|
  <span class="kw3">puts</span> <span class="st0">"Ouro: #{medalhas.search("</span>td.<span class="me1">val_ouro</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Prata: #{medalhas.search("</span>td.<span class="me1">val_prata</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Bronze: #{medalhas.search("</span>td.<span class="me1">val_bronze</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Total: #{medalhas.search("</span>td.<span class="me1">val_tot</span><span class="st0">").inner_html}"</span>
<span class="kw1">end</span></code></pre>
<p>Mais um problema resolvido, usando Ruby! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Traduzindo Datas no Rails</title>
		<link>http://www.arthurgeek.net/traduzindo-datas-no-rails/</link>
		<comments>http://www.arthurgeek.net/traduzindo-datas-no-rails/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 15:50:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2007/06/23/traduzindo-datas-no-rails</guid>
		<description><![CDATA[Em alguns projetos, é necessário utilizar os nomes de meses, ou dias da semana em português. Eu sempre usei o método de sobrescrever as constantes que o Ruby usa, colocando o seguinte código no config/environment.rb:
silence_warnings do
  Date::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)
  Date::DAYNAMES [...]]]></description>
			<content:encoded><![CDATA[<p>Em alguns projetos, é necessário utilizar os nomes de meses, ou dias da semana em português. Eu sempre usei o método de sobrescrever as constantes que o Ruby usa, colocando o seguinte código no <em>config/environment.rb</em>:</p>
<pre class="rails"><code>silence_warnings <span class="kw1">do</span>
  <span class="re2">Date::MONTHNAMES</span> = <span class="br0">[</span><span class="kw2">nil</span><span class="br0">]</span> + %w<span class="br0">(</span>Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro<span class="br0">)</span>
  <span class="re2">Date::DAYNAMES</span> = %w<span class="br0">(</span>Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado<span class="br0">)</span>
  <span class="re2">Date::ABBR_MONTHNAMES</span> = <span class="br0">[</span><span class="kw2">nil</span><span class="br0">]</span> + %w<span class="br0">(</span>Jan Fev Mar Abr Mai Jun Jul Aug <span class="kw4">Set</span> Out Nov Dez<span class="br0">)</span>
  <span class="re2">Date::ABBR_DAYNAMES</span> = %w<span class="br0">(</span>Dom Seg Ter Qua Qui Sex Sab<span class="br0">)</span>
 
  <span class="re2">Time::MONTHNAMES</span> = <span class="re2">Date::MONTHNAMES</span>
  <span class="re2">Time::DAYNAMES</span> = <span class="re2">Date::DAYNAMES</span>
  <span class="re2">Time::ABBR_MONTHNAMES</span> = <span class="re2">Date::ABBR_MONTHNAMES</span>
  <span class="re2">Time::ABBR_DAYNAMES</span> = <span class="re2">Date::ABBR_DAYNAMES</span>
<span class="kw1">end</span></code></pre>
<p>Acontece, que quando usamos a função <em>strftime</em>, estes nomes não são traduzidos. Eles funcionam apenas nos helpers <em>date_select</em>, entro outros. Em um projeto meu, eu precisava usar estes nomes traduzidos, justamente com a função <em>strftime</em>, então, cheguei à este código:</p>
<pre class="rails"><code><span class="kw1">class</span> <span class="kw4">Time</span>
  <span class="kw1">alias</span> <span class="re3">:strftime_nolocale</span> <span class="re3">:strftime</span>
 
  <span class="kw1">def</span> strftime<span class="br0">(</span><span class="kw3">format</span><span class="br0">)</span>
    <span class="kw3">format</span> = <span class="kw3">format</span>.<span class="me1">dup</span>
    <span class="kw3">format</span>.<span class="kw3">gsub</span>!<span class="br0">(</span>/%a/, <span class="re2">Date::ABBR_DAYNAMES</span><span class="br0">[</span><span class="kw2">self</span>.<span class="me1">wday</span><span class="br0">]</span><span class="br0">)</span>
    <span class="kw3">format</span>.<span class="kw3">gsub</span>!<span class="br0">(</span>/%A/, <span class="re2">Date::DAYNAMES</span><span class="br0">[</span><span class="kw2">self</span>.<span class="me1">wday</span><span class="br0">]</span><span class="br0">)</span>
    <span class="kw3">format</span>.<span class="kw3">gsub</span>!<span class="br0">(</span>/%b/, <span class="re2">Date::ABBR_MONTHNAMES</span><span class="br0">[</span><span class="kw2">self</span>.<span class="me1">mon</span><span class="br0">]</span><span class="br0">)</span>
    <span class="kw3">format</span>.<span class="kw3">gsub</span>!<span class="br0">(</span>/%B/, <span class="re2">Date::MONTHNAMES</span><span class="br0">[</span><span class="kw2">self</span>.<span class="me1">mon</span><span class="br0">]</span><span class="br0">)</span>
    <span class="kw2">self</span>.<span class="me1">strftime_nolocale</span><span class="br0">(</span><span class="kw3">format</span><span class="br0">)</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>
<p>E funcionou!</p>
<p>Fica aqui a dica então, para quem estiver com este mesmo problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/traduzindo-datas-no-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Códigos mais claros usando Ruby!</title>
		<link>http://www.arthurgeek.net/codigos-mais-claros-usando-ruby/</link>
		<comments>http://www.arthurgeek.net/codigos-mais-claros-usando-ruby/#comments</comments>
		<pubDate>Tue, 22 May 2007 17:34:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/04/03/codigos-mais-claros-usando-ruby</guid>
		<description><![CDATA[Acabei de ler este artigo no blog Softies on Rails, e resolvi traduzí-lo. Sabe quando você conhece determinada função, e mesmo sabendo que ela é útil, nunca usa? É preciso ler um artigo pra &#8220;cair em si&#8221;, não é?. Então, este artigo é um deles. Pelo menos foi pra mim.

Segue tradução livre:
Uma das razões para [...]]]></description>
			<content:encoded><![CDATA[<p>Acabei de ler <a href="http://www.softiesonrails.com/2007/5/22/ruby-101-clear-code">este artigo</a> no blog <a href="http://www.softiesonrails.com/">Softies on Rails</a>, e resolvi traduzí-lo. Sabe quando você conhece determinada função, e mesmo sabendo que ela é útil, nunca usa? É preciso ler um artigo pra &#8220;cair em si&#8221;, não é?. Então, este artigo é um deles. Pelo menos foi pra mim.</p>
<p><span id="more-64"></span></p>
<p>Segue tradução livre:</p>
<p>Uma das razões para que eu ame Ruby é que o meu código normalmente pode ser lido como se fosse Inglês. Quando meu código se torna legível como uma sentença em Inglês, eu acredito que irei codificar exatamente aquilo que eu quero atingir. Código é mais fácil de entender e manter quando a intenção original do código é evidente. Eu acho que é por isso que Java e C# são tão atrativas se comparadas com C++. E porquê C++ é tão mais legal que C.</p>
<p>Ruby é uma grande linguagem, assim como Chicago é uma grande cidade. Porém hoje, eu gostaria de nos aventurarmos por uma rua transversal, pegar uma estrada menos usado por iniciantes em Ruby. Nós iremos aprender como usar modificadores na forma de algumas palavras reservadas Ruby muito bem conhecidas para melhorar a clareza do código.</p>
<h3>Diga xiiis</h3>
<p>Digamos que nós iremos escrever um código para operar uma câmera digital. Você tem métodos como <code>capture_image</code>, por exemplo, que captura uma imagem do sensor e gera um arquivo de imagem no cartão de memória (e se estivermos com sorte, emite um som de &#8220;click&#8221; para imitar uma câmera analógica). Vamos ver como você poderia escrever o código para quando o usuário pressionar o botão de disparar.</p>
<pre class="ruby"><code><span class="kw1">def</span> botao_de_disparo_clicado
  <span class="kw1">if</span> <span class="re1">@camera</span>.<span class="me1">desligada</span>? || <span class="re1">@camera</span>.<span class="me1">cartao_de_memoria_cheio</span>?
    <span class="kw2">return</span>
  <span class="kw1">end</span>
  capture_image
<span class="kw1">end</span></code></pre>
<p>Então, se a câmera estiver desligada ou se estivermos sem memória, não fazemos nada. Se tudo estiver bem, nós tiramos a foto. Este era o meu estilo quando eu comecei com Ruby, e se este código se parece com o que você faz também, então você está pronto para algo novo e recompensante.</p>
<p>A chave é saber que as palavras reservadas como <code>return</code>, <code>while</code>, <code>if</code>, <code>unless</code> e <code>until</code> podem ser usadas como modificadores. Isto quer dizer que você coloca a parte condicional depois da palavra reservada. Parece besta, e em algumas vezes realmente é. Porém, algumas vezes pode ser recompensador.</p>
<p>O código que escrevemos estava tentando verificar alguns requerimentos. Para poder tirar a foto, a câmera não pode estar desligada e o cartão de memória não pode estar cheio. Usando modificadores de forma para <code>return</code>, você pode reescrever o código acima assim:</p>
<pre class="ruby"><code><span class="kw1">def</span> botao_de_disparo_clicado
  <span class="kw2">return</span> <span class="kw1">if</span> <span class="re1">@camera</span>.<span class="me1">desligada</span>? || <span class="re1">@camera</span>.<span class="me1">cartao_de_memoria_cheio</span>?
  capture_image
<span class="kw1">end</span></code></pre>
<p>A primeira linha diz, retorne imediatamente se a câmera estiver desligada ou o cartão de memória estiver cheio. Se chegarmos até a segunda linha, nós podemos prosseguir e capturar a imagem. Leia o código acima em voz alta. Parece melhor, não?</p>
<p>Mas espere, nós podemos ir um passo à frente. Por exemplo, você poderia preferir isto:</p>
<pre class="ruby"><code><span class="kw1">def</span> botao_de_disparo_clicado
  capture_image <span class="kw1">unless</span> <span class="re1">@camera</span>.<span class="me1">desligada</span>? || <span class="re1">@camera</span>.<span class="me1">cartao_de_memoria_cheio</span>?
<span class="kw1">end</span></code></pre>
<p>Agora, leia alto novamente: &#8220;<em>Capture a imagem a não ser que a câmera esteja desligada ou o cartão de memória esteja cheio.</em>&#8220;.  Isto expressa a nossa intenção de uma maneira um pouco diferente. Quando lemos alto, a primeira coisa que ouvimos é &#8220;capture a imagem&#8221;. Eu acho mais vantajoso de ouvir isto primeiro, porquê é o que acontece em 90% dos casos em que o disparador é clicado. Escrevendo códigos desta maneira, nós emfatizamos o comportamento esperado. Nós usamos a cláusula  <code>unless</code> para guardar o comportamento com nossas regras de negócio. O código é mais transparente, fazendo com que os requerimentos sejam mais fáceis de visualizar. Este código é mais fácil de entender e manter.</p>
<p>Porém, vamos voltar ao código original por um minuto. Não existe maneira certa ou errado de fazer isto, e pode ser que você não tenha gostado do meu original.  Finalmente, ele tem este <code>return</code> desajeitado flutuando no espaço.Trocando o operador lógico de lugar, o código original poderia ficar assim:</p>
<pre class="ruby"><code><span class="kw1">def</span> botao_de_disparo_clicado
  <span class="kw1">if</span> <span class="re1">@camera</span>.<span class="me1">ligada</span>? &amp;&amp; <span class="re1">@camera</span>.<span class="me1">memoria_disponivel</span>?
    capture_image
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>
<p>Dessa maneira já se lê melhor. Porém, nós ainda temos esse sentimento if-then. Parece mais como código, e menos como Inglês. Que tal isso?</p>
<pre class="ruby"><code><span class="kw1">def</span> botao_de_disparo_clicado
  capture_image <span class="kw1">if</span> <span class="re1">@camera</span>.<span class="me1">ligada</span>? &amp;&amp; <span class="re1">@camera</span>.<span class="me1">memoria_disponivel</span>?
<span class="kw1">end</span></code></pre>
<p>De qualquer jeito, agora é com você. Eu escrevi código Ruby da &#8220;maneira antiga&#8221; por muito tempo, e foi somente nos últimos seis meses que eu mudei para os modificadores de formas. Somente use a forma que parece mais natural à você.</p>
<h3>Como se fosse 1999</h3>
<p>Agora suponha que você tem um novo requerimento que diz que a câmera deve ter a habilidade de tirar fotos sem-parar em uma maneira estroboscópica até todos os bytes da memória serem usados. (Você pede ao cliente, porquê, mas porquê alguém iria querer esta habilidade, porém é um &#8220;must-have&#8221;, uma habilidade que a câmera &#8220;absolutamente não pode deixar de ter&#8221;. Então, você prossegue.)</p>
<p>Na verdade, este parece ser um método fácil de escrever:</p>
<pre class="ruby"><code><span class="kw1">def</span> fique_louca
  <span class="kw1">while</span> <span class="br0">(</span>@camera.<span class="me1">memoria_disponivel</span>?<span class="br0">)</span>
    capture_image
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>
<p>Novamente &#8211; você vem escrevendo código assim por um bom tempo, e especialmente se você vem do VB.Net ou C# ou Java, este código provavelmente parece perfeitamente legível à você. Seu problema é que está na caverna por tanto tempo, que você acredita que a tocha na parede te dá luz suficiente. E se você pudesse escapar para o mundo e ver o sol? Olhe para:</p>
<pre class="ruby"><code><span class="kw1">def</span> fique_louca
    capture_image <span class="kw1">until</span> <span class="re1">@camera</span>.<span class="me1">cartao_de_memoria_cheio</span>?
<span class="kw1">end</span></code></pre>
<p>&#8220;<em>Capture Imagem até o cartão de memória esteja cheio.</em>&#8221; Ou se você preferir,</p>
<pre class="ruby"><code><span class="kw1">def</span> fique_louca
  capture_image <span class="kw1">while</span> <span class="re1">@camera</span>.<span class="me1">memoria_disponivel</span>?
<span class="kw1">end</span></code></pre>
<p>&#8220;<em>Capture imagem enqunato a memória estiver disponível.</em>&#8220;.</p>
<h3>Apenas faça isto</h3>
<p>Os modificadores de formas não são apenas sutilezas ou reconsiderações da linguagem. Eles estão lá por algum motivo. Tente usá-los por um tempo e veja se isto não melhora o seu estilo. Use-os onde e quando parecer apropriado à você. Deixe a intenção do seu código clara e óbvia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/codigos-mais-claros-usando-ruby/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Feed 89 FM</title>
		<link>http://www.arthurgeek.net/feed-89-fm/</link>
		<comments>http://www.arthurgeek.net/feed-89-fm/#comments</comments>
		<pubDate>Sun, 13 May 2007 21:32:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2007/06/11/feed-89-fm</guid>
		<description><![CDATA[Depois que eu comecei a usar FeedReaders online (primeiro usei o Bloglines agora migrei para o Google Reader) nunca mais visitei qualquer site para ir atrás de notícias, quer dizer, visitava apenas um: o site da 89 FM.
Sempre pensei em criar um feed para a seção Notas Musicais do site. Só que nunca fui atrás, [...]]]></description>
			<content:encoded><![CDATA[<p>Depois que eu comecei a usar FeedReaders online (primeiro usei o <a href="http://www.bloglines.com" title="Bloglines">Bloglines</a> agora migrei para o <a href="http://reader.google.com" title="Google Reader">Google Reader</a>) nunca mais visitei qualquer site para ir atrás de notícias, quer dizer, visitava apenas um: <a href="http://www.89fm.com.br" title="89, a rádio Rock">o site da 89 FM</a>.</p>
<p>Sempre pensei em criar um feed para a seção <a href="http://www.89fm.com.br/notas/">Notas Musicais</a> do site. Só que nunca fui atrás, por pura falta de tempo em procurar por bibliotecas que fizessem o Parsing em HTML, tanto em <a href="http://www.python.org">Python</a> ou <a href="http://www.php.net">PHP</a>.</p>
<p>Depois de conhecer <a href="http://www.ruby-lang.org">Ruby</a>, pensei em perder um tempinho, procurando alguma biblioteca que fizesse o Parsing HTML, e depois, construir o feed RSS. Fazer o Feed seria a parte mais fácil, graças à biblioteca <a href="http://builder.rubyforge.org/">Builder</a> usada para gerar arquivos XML.</p>
<p>O parsing ficaria à cargo da excelente <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a>. Porém, encontrei uma outra biblioteca, chamada <a href="http://termos.vemod.net/feedalizer">Feedalizer</a> que usa a Hpricot para criar feeds RSS. Menos trabalho que isso, impossível!</p>
<p>Então, aqui vai o código usada para gerar o feed da página:</p>
<pre class="ruby"><code><span class="co1">#!/usr/bin/env ruby</span>
&nbsp;
<span class="kw3">require</span> <span class="st0">&quot;rubygems&quot;</span>
<span class="kw3">require</span> <span class="st0">&quot;feedalizer&quot;</span>
<span class="kw3">require</span> <span class="st0">&quot;time&quot;</span>
&nbsp;
rss = <span class="kw4">File</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&quot;arthurgeek.net/89.xml&quot;</span>,<span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span>
&nbsp;
feedalize<span class="br0">&#40;</span><span class="st0">&quot;http://www.89fm.com.br/notas/&quot;</span><span class="br0">&#41;</span> <span class="kw1">do</span>
  feed.<span class="me1">title</span> = <span class="st0">&quot;89 FM Notas&quot;</span>
  feed.<span class="me1">about</span> = <span class="st0">&quot;...&quot;</span>
  feed.<span class="me1">description</span> = <span class="st0">&quot;Notícias do mundo musical da 89FM&quot;</span>
&nbsp;
  scrape_items<span class="br0">&#40;</span><span class="st0">&quot;a.formtextobranco&quot;</span><span class="br0">&#41;</span> <span class="kw1">do</span> |rss_item, html_element|
    rss_item.<span class="me1">link</span>  = <span class="st0">&quot;http://www.89fm.com.br&quot;</span> + html_element.<span class="me1">attributes</span><span class="br0">&#91;</span><span class="st0">&quot;href&quot;</span><span class="br0">&#93;</span>
    rss_item.<span class="me1">date</span>  = <span class="kw4">Time</span>.<span class="me1">parse</span><span class="br0">&#40;</span>html_element.<span class="me1">to_s</span><span class="br0">&#41;</span>
    rss_item.<span class="me1">title</span> = html_element.<span class="me1">inner_html</span>
&nbsp;
    rss_item.<span class="me1">description</span> = html_element.<span class="me1">inner_html</span>
  <span class="kw1">end</span>
&nbsp;
  output! rss
<span class="kw1">end</span>
&nbsp;
rss.<span class="me1">close</span></code></pre>
<p>O arquivo do feed está disponível <a href="http://www.arthurgeek.net/89.xml">aqui</a> e já estou usando-o há mais de 2 meses, e acredito, que não tem mais bugs, e pode agora, ser usado por qualquer um.</p>
<p>Ah, como eu gosto desta linguagem&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/feed-89-fm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploy Rails com: Apache  + mod_proxy_balancer + mongrel</title>
		<link>http://www.arthurgeek.net/configurando-rails-com-apache-2-2-x-mod_proxy_balancer-mongrel_cluster/</link>
		<comments>http://www.arthurgeek.net/configurando-rails-com-apache-2-2-x-mod_proxy_balancer-mongrel_cluster/#comments</comments>
		<pubDate>Sun, 13 May 2007 19:21:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mongrel]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/05/24/configurando-rails-com-apache-2-2-x-mod_proxy_balancer-mongrel_cluster</guid>
		<description><![CDATA[
[Update: Hoje em dia, o método preferido para deploy Rails + Apache é usando o Phusion Passenger, também conhecido como mod_rails. Para aprender como fazer um deploy com o mod_rails, leia este excelente artigo do Nando Vieira. :)]
Como eu havia dito, não achei artigos em português explicando como fazer o deploy de aplicações Rails usando [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right;"><script src="http://rec6.via6.com/link.php?action=widget&amp;url=http://www.arthurgeek.net/2007/5/13/configurando-rails-com-apache-2-2-x-mod_proxy_balancer-mongrel_cluster" type="text/javascript"></script></div>
<p>[<strong>Update</strong>: Hoje em dia, o método preferido para deploy Rails + Apache é usando o <a href="http://www.modrails.com">Phusion Passenger</a>, também conhecido como mod_rails. Para aprender como fazer um deploy com o mod_rails, leia <a href="http://simplesideias.com.br/instalando-o-mod_rails-phusion-passenger-no-mac-os-x-leopard/">este excelente artigo</a> do <a href="http://simplesideias.com.br">Nando Vieira</a>. :)]</p>
<p>Como eu havia dito, não achei artigos em português explicando como fazer o deploy de aplicações Rails usando mod_proxy_balancer e mongrel_cluster, por isso resolvi escrever um.</p>
<p>Os comandos a seguir foram testados em um Ubuntu 7.04 Server Edition, mas devem servir para qualquer distro Debian-based.</p>
<p>Será necessário ter instalado os seguintes programas:</p>
<ul>
<li>Apache 2.2.x</li>
<li>mod_proxy_balancer</li>
<li>mongrel</li>
<li>mongrel_cluster</li>
<li>Ruby</li>
<li>Rails</li>
</ul>
<p><span id="more-61"></span></p>
<h3>Preparando o terreno</h3>
<p>Instalando o compilador <span class="caps">GCC</span> e as ferramentas de desenvolvimento</p>
<pre><code>sudo apt-get install build-essential</code></pre>
<p>E agora o Ruby</p>
<pre><code>sudo apt-get install ruby ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8</code></pre>
<h3>Apache e seus módulos</h3>
<p>Instalando Apache</p>
<pre><code>sudo apt-get install apache2</code></pre>
<p>Configurando os módulos necessários</p>
<pre><code>sudo a2enmod proxy_balancer
sudo a2enmod proxy
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo a2enmod proxy_ftp
sudo a2enmod proxy_http
sudo a2enmod rewrite</code></pre>
<p>Reiniciando o Apache para que os módulos sejam habilitados</p>
<p> </p>
<p> </p>
<p> </p>
<p><code></p>
<pre>sudo /etc/init.d/apache2 force-reload</pre>
<p></code></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>MySQL</h3>
<p>Primeiramente, instale o MySQL</p>
<pre><code>sudo apt-get install mysql-server</code></pre>
<p>E agora, instale os bindings do MySQL para o Ruby</p>
<pre><code>sudo apt-get install libmysql-ruby1.8</code></pre>
<h3>RubyGems e Rails</h3>
<p>Vamos baixar a última versão do RubyGems e instalar</p>
<pre><code>wget http://rubyforge.org/frs/download.php/20585/rubygems-0.9.3.tgz
tar xvzf rubygems-0.9.3.tgz
cd rubygems-0.9.3
sudo ruby setup.rb</code></pre>
<p><code> </code></p>
<p> </p>
<p>Agora, o Rails</p>
<pre><code>sudo gem install rails -y</code></pre>
<h3>Mongrel e mongrel_cluster</h3>
<p>Ao ser perguntado por qual versão instalar, escolha a versão mais nova, que não seja a mswin32</p>
<pre><code>sudo gem install mongrel mongrel_cluster -y</code></pre>
<h3>Criando uma nova aplicação Rails e configurando o cluster</h3>
<p>Vamos criar uma aplicação Rails para teste:</p>
<pre><code>rails teste
cd teste</code></pre>
<p>E agora, vamos configurar o cluster mongrel</p>
<pre><code>mongrel_rails cluster::configure -e production -p 8000 -a 127.0.0.1 -N 3 -c /sua/app/rails/teste/</code></pre>
<p>Esta linha escreverá um arquivo chamado <em>mongrel_cluster.yml</em> dentro da pasta config, configurando nosso cluster para rodar em modo de produção (-e production), começando na porta 8000 (-p 8000), no endereço 127.0.0.1 (-a 127.0.0.1) com 3 instâncias do mongrel (-N 3). Dessa maneira, nossas instâncias só estarão disponíveis para ser acessadas através da máquina local, não é necessário expor o mongrel para toda a internet, já que é apenas o Apache rodando na máquina local que deverá ter acesso à eles.</p>
<p>Agora, vamos colocar nosso mongrel como um serviço que iniciará junto com nosso sistema. Primeiro, vamos copiar o arquivo de inicialização que a gem do mongrel_cluster disponibiliza pra gente</p>
<pre><code>sudo ln -s /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-0.2.1/resources/mongrel_cluster /etc/init.d/
sudo chmod +x /etc/init.d/mongrel_cluster</code></pre>
<p>Agora, vamos adicionar nosso script como um serviço do sistema</p>
<pre><code>sudo /usr/sbin/update-rc.d mongrel_cluster defaults</code></pre>
<p>O script de inicialização, procura por todos .yml dentre de: /etc/mongrel_cluster/, então, vamos criar este diretório e linkar nosso arquivo de configuração para lá</p>
<pre><code>sudo mkdir -p /etc/mongrel_cluster
sudo ln -s /sua/app/rails/teste/config/mongrel_cluster.yml /etc/mongrel_cluster/teste.yml</code></pre>
<h3>Configurando o Apache</h3>
<p>Vamos criar um novo VirtualHost no apache</p>
<pre><code>touch /etc/apache2/sites-available/rails
sudo a2ensite rails</code></pre>
<p>Use esta configuração para o arquivo que o apache acabou de criar em: /etc/apache2/sites-enabled/rails:</p>
<pre class="apache"><code>&lt;VirtualHost *&gt;
  <span class="kw1">ServerName</span> exemplorails.com.br
  <span class="kw1">ErrorLog</span> /sua/app/rails/teste/log/errors.log
  <span class="kw1">CustomLog</span> /sua/app/rails/teste/log/apache.log combined
 
  &lt;Directory <span class="st0">"/sua/app/rails/teste/public/"</span>&gt;
    <span class="kw1">Options</span> <span class="kw2">FollowSymLinks</span>
    <span class="kw1">AllowOverride</span> <span class="kw2">None</span>
    <span class="kw1">Order</span> <span class="kw1">allow</span>,<span class="kw1">deny</span>
    <span class="kw1">Allow</span> <span class="kw1">from</span> <span class="kw1">all</span>
  &lt;/Directory&gt;
 
  <span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
 
  <span class="co1"># Check for maintenance file and redirect all requests</span>
  <span class="co1">#  ( this is for use with Capistrano's disable_web task )</span>
  <span class="kw1">RewriteCond</span> %<span class="br0">{</span>DOCUMENT_ROOT<span class="br0">}</span>/system/maintenance.html -f
  <span class="kw1">RewriteCond</span> %<span class="br0">{</span>SCRIPT_FILENAME<span class="br0">}</span> !maintenance.html
  <span class="kw1">RewriteRule</span> ^.*$ /system/maintenance.html <span class="br0">[</span>L<span class="br0">]</span>
 
  <span class="co1"># Rewrite index to check for static</span>
  <span class="kw1">RewriteRule</span> ^/$ /index.html <span class="br0">[</span>QSA<span class="br0">]</span>
 
  <span class="co1"># Rewrite to check for Rails cached page</span>
  <span class="kw1">RewriteRule</span> ^<span class="br0">(</span><span class="br0">[</span>^.<span class="br0">]</span>+<span class="br0">)</span>$ $<span class="nu0">1</span>.html <span class="br0">[</span>QSA<span class="br0">]</span>
 
  <span class="co1"># Redirect all non-static requests to cluster</span>
  <span class="kw1">RewriteCond</span> %<span class="br0">{</span>DOCUMENT_ROOT<span class="br0">}</span>/%<span class="br0">{</span>REQUEST_FILENAME<span class="br0">}</span> !-f
  <span class="kw1">RewriteRule</span> ^/<span class="br0">(</span>.*<span class="br0">)</span>$ balancer://mongrel_cluster%<span class="br0">{</span>REQUEST_URI<span class="br0">}</span> <span class="br0">[</span>P,QSA,L<span class="br0">]</span>
 
  <span class="co1"># Deflate</span>
  AddOutputFilterByType DEFLATE text/html text/plain text/css
  <span class="co1"># ... text/xml application/xml application/xhtml+xml text/javascript</span>
  <span class="kw1">BrowserMatch</span> ^Mozilla/<span class="nu0">4</span> gzip-only-text/html
  <span class="kw1">BrowserMatch</span> ^Mozilla/<span class="nu0">4.0</span><span class="br0">[</span><span class="nu0">678</span><span class="br0">]</span> no-gzip
  <span class="kw1">BrowserMatch</span> bMSIE !no-gzip !gzip-only-text/html
 
  &lt;Proxy *&gt;
    <span class="kw1">Order</span> <span class="kw1">allow</span>,<span class="kw1">deny</span>
    <span class="kw1">Allow</span> <span class="kw1">from</span> <span class="kw1">all</span>
  &lt;/Proxy&gt;
 
  &lt;Proxy balancer://mongrel_cluster&gt;
    BalancerMember http://<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>:<span class="nu0">8000</span>
    BalancerMember http://<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>:<span class="nu0">8001</span>
    BalancerMember http://<span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span>:<span class="nu0">8002</span>
  &lt;/Proxy&gt;
 
&lt;/VirtualHost&gt;</code></pre>
<h3>Finalização</h3>
<p>Agora vamos reiniciar o apache</p>
<pre><code>sudo /etc/init.d/apache2 force-reload</code></pre>
<p>E iniciar nosso cluster mongrel</p>
<pre><code>sudo /etc/init.d/mongrel_cluster start</code></pre>
<p>Já podemos acessar nosso domínio, que nossa aplicação Rails deverá funcionar. Caso não funcione, dê uma olhada nos logs do Apache e de sua aplicação Rails.</p>
<p>Fonte:<br />
<a href="http://www.simplisticcomplexity.com/2006/8/13/apache-2-2-mod_proxy_balancer-mongrel-on-ubuntu-6-06">Apache 2.2, mod_proxy_balancer, &amp; Mongrel on Ubuntu 6.06</a><br />
<a href="http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/">Time For A Grown-Up Server: Rails, Mongrel, Apache, Capistrano and You</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/configurando-rails-com-apache-2-2-x-mod_proxy_balancer-mongrel_cluster/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
