<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2portuguesefull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>ArthurGeek.net</title>
	
	<link>http://www.arthurgeek.net</link>
	<description>Rails, Mac... e Rock'n Roll!</description>
	<pubDate>Sat, 20 Dec 2008 23:25:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/arthurgeek" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/arthurgeek" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Farthurgeek" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Então, o Rails agora usa Rack. Mas o que é o Rack?</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/490601087/</link>
		<comments>http://www.arthurgeek.net/entao-o-rails-agora-usa-rack-mas-o-que-e-o-rack/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 14:43:19 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/?p=186</guid>
		<description><![CDATA[Se você mora na Terra, deve saber que o Rails Edge adotou o Rack. Mas, o que é esse tal de Rack?
O que é o Rack?
O Rack é uma interface entre servidores web e aplicações Ruby, baseada no padrão WSGI do Python. Ele possui diferentes handlers para os mais diversos webservers, como: Passenger, Mongrel, Thin, Ebb, Webrick, entre outros.
Ele é [...]]]></description>
			<content:encoded><![CDATA[<p>Se você mora na Terra, deve saber que o <a href="http://github.com/rails/rails">Rails Edge</a> <a href="http://github.com/rails/rails/commit/708f4c3ae6a41a46ab36a05ea4e126392b81511b">adotou</a> o <a href="http://rack.rubyforge.org">Rack</a>. Mas, o que é esse tal de Rack?</p>
<h2>O que é o Rack?</h2>
<p>O Rack é uma interface entre servidores web e aplicações Ruby, baseada no <a href="http://www.python.org/dev/peps/pep-0333/">padrão WSGI</a> do Python. Ele possui diferentes handlers para os mais diversos webservers, como: Passenger, Mongrel, Thin, Ebb, Webrick, entre outros.</p>
<p>Ele é usado pelos principais frameworks Ruby: <a href="http://merbivore.com/">Merb</a>, <a href="http://sinatra.rubyforge.org/">Sinatra</a>, <a href="http://ramaze.rubyforge.org/">Ramaze</a>, <a href="http://rubywaves.com/">Waves</a>, e outros. O Rails 2.3 virá com suporte à Rack. Ele também pode ser considerado um framework para construir frameworks. O <a href="http://www.arthurgeek.net/nyane-o-framework-insignificante/">Nyane</a> é um bom exemplo disto, mas existem <a href="http://github.com/search?q=rack+framework">muitos outros</a>.</p>
<p>Ele tem suporte à Middlewares que são como mini-funcionalidades que podem ser compartilhadas entre todos os frameworks que suportam Rack. <a href="http://advent2008.hackruby.com/past/2008/12/15/a_collection_of_rack_middlewares/">Este artigo</a> possui uma lista de diversos middlewares interessantes.</p>
<p>Através do <a href="http://rack.rubyforge.org/doc/classes/Rack/Cascade.html">Rack::Cascade</a> é possível utilizar diferentes frameworks dentro de uma mesma aplicação.</p>
<h2>Aplicações Rack</h2>
<p>Uma aplicação Rack nada mais é do que um simples objeto Ruby (não precisa ser uma classe) que responde ao método <strong>call</strong>. Ele precisa de apenas um argumento, o <strong>environment</strong> e retorna um Array com três valores: O <strong>status </strong>(200, 404, 500), o <strong>header</strong> (&#8217;Content-Type&#8217; =&gt; &#8216;text/html&#8217;, &#8217;Location&#8217; =&gt; &#8216;/&#8217;, ) e um objeto que responde ao método each (&#8217;uma string&#8217;).</p>
<h3>Exemplos</h3>
<p>O seguinte código é um exemplo de uma aplicação Rack:</p>
<pre class="ruby"><code><span class="kw1">class</span> Hello
   <span class="kw1">def</span> call<span class="br0">(</span>env<span class="br0">)</span>
      <span class="br0">[</span> <span class="nu0">200</span>, <span class="br0">{</span><span class="br0">}</span>, <span class="st0">'Hello World!<span class="st0">'</span> <span class="br0">]</span>
</span>   <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>
<p>Mas, como eu disse, não precisa ser uma classe, um simples <strong>lambda</strong> também é uma aplicação Rack válida:</p>
<pre class="ruby"><code><span class="kw3">lambda</span> <span class="br0">{</span> |env| <span class="br0">[</span><span class="nu0">200</span>, <span class="br0">{</span><span class="br0">}</span>, 'Hello World!' <span class="br0">}</span></code></pre>
<p>Isto é válido, porquê o método <strong>lambda</strong> retorna uma <strong>Proc</strong>, que responde pelo método <strong>call</strong>.</p>
<p>Nos dois exemplos, o retorno do método <strong>call</strong> é um Array com o status 200, headers em branco em uma string 'Hello World!'. Exatamente o que o Rack precisa para funcionar. :)</p>
<h3>E esse environment, o que é?</h3>
<p>O <strong>env</strong> (objeto passado ao método call), é um hash com diversas variáveis de ambientes, por exemplo: PATH_INFO, QUERY_STRING, REQUEST_METHOD, SERVER_PORT, entre outros.</p>
<h3>E pra que ele serve?</h3>
<p>Você usa o <strong>env</strong> para construir um objeto <strong>Rack::Request</strong>, que pode ser usado para obter os parâmetros GET e POST:</p>
<pre class="ruby"><code>request = <span class="re2">Rack::Request</span>.<span class="me1">new</span><span class="br0">(</span>env<span class="br0">)</span>
<span class="co1"># returns the data received in the query string</span>
request.<span class="me1">GET</span>
<span class="co1"># returns the data received in the request body</span>
request.<span class="me1">POST</span></code></pre>
<h3>Eu sei receber um request, mas e como eu envio uma resposta?</h3>
<p>O Rack::Response é usado para criar uma resposta HTTP. Com ele você pode configurar headers, criar cookies, entre outros:</p>
<pre class="ruby"><code><span class="co1"># uma resposta simples</span>
response = <span class="re2">Rack::Response</span>.<span class="me1">new</span>
response.<span class="me1">status</span> = <span class="nu0">200</span>
response.<span class="me1">body</span><span class="br0">(</span><span class="st0">"Hello World!"</span><span class="br0">)</span>
response.<span class="me1">finish</span>
 
<span class="co1"># um redirect</span>
response = <span class="re2">Rack::Response</span>.<span class="me1">new</span>
response.<span class="me1">status</span> = <span class="nu0">302</span>
response.<span class="me1">headers</span><span class="br0">[</span><span class="st0">"Location"</span><span class="br0">]</span> = <span class="st0">"/"</span>
response.<span class="me1">finish</span>
 
<span class="co1"># criando um cookie</span>
response = <span class="re2">Rack::Response</span>.<span class="me1">new</span>
response.<span class="me1">set_cookie</span><span class="br0">(</span><span class="st0">'cookie-name'</span>, <span class="st0">'content'</span><span class="br0">)</span>
response.<span class="me1">finish</span>
 </code></pre>
<h2>Rackup</h2>
<p>O Rack vem com um binário chamado <strong>rackup</strong> que pode ser usado para servir aplicações Rack rapidamente. Ele lê arquivos .ru (não pode ser .rb), também chamados de &#8220;rack config files&#8221;, e usa o handler do Mongrel para servir a aplicação. Ele já adiciona os middlewares para Logging (<strong>Rack::CommonLogger</strong>) e Exceptions (<strong>Rack::ShowExceptions</strong>).</p>
<h3>Exemplos</h3>
<p>Usando uma classe:</p>
<pre class="ruby"><code><span class="kw1">class</span> Hello
   <span class="kw1">def</span> call<span class="br0">(</span>env<span class="br0">)</span>
      <span class="br0">[</span> <span class="nu0">200</span>, <span class="br0">{</span><span class="br0">}</span>, <span class="st0">'Hello World!'</span> <span class="br0">]</span>
   <span class="kw1">end</span>
<span class="kw1">end</span>
 
run Hello.<span class="me1">new</span>
</code></pre>
<p>Um lambda:</p>
<pre class="ruby"><code>run <span class="kw3">lambda</span> <span class="br0">{</span>|env| <span class="br0">[</span><span class="nu0">200</span>, <span class="br0">{</span><span class="br0">}</span>, <span class="st0">"Hello World!"</span><span class="br0">]</span><span class="br0">}</span></code></pre>
<p>Isso mesmo, não precisa de nenhum require. :) Para rodar, é simples:</p>
<pre class="text"><code>rackup app.ru</code></pre>
<p>Por padrão, ele rodará na porta 9292.</p>
<p>Ou, se você preferir, pode rodá-lo com o Thin:</p>
<pre class="text"><code>thin start -R app.ru</code></pre>
<p>Você também pode usar o Handler do Mongrel diretamente:</p>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">"rubygems"</span>
<span class="kw3">require</span> <span class="st0">"rack"</span>
 
app = <span class="kw3">lambda</span> <span class="br0">{</span> |env| <span class="br0">[</span><span class="nu0">200</span>, <span class="br0">{</span><span class="br0">}</span>, <span class="st0">'Hello World!'</span><span class="br0">]</span> <span class="br0">}</span>
<span class="re2">Rack::Handler::Mongrel</span>.<span class="me1">run</span><span class="br0">(</span>app, <span class="re3">:Port</span> =&gt; <span class="nu0">3000</span><span class="br0">)</span></code></pre>
<p>Neste caso, o require é necessário.</p>
<h2>Finalizando</h2>
<p>Espero que este post tenha ajudado você a entender melhor o que é o Rack e o porquê dele ser importante no mundo Ruby. Nos próximos posts, irei explicar como construir e usar Middlewares, e falarei de uma das novas features do Rails que usa o Rack, o <a href="http://weblog.rubyonrails.org/2008/12/17/introducing-rails-metal">Metal</a>, muito discutido nessa última semana.</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=Qx87hI"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=Qx87hI" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/490601087" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/entao-o-rails-agora-usa-rack-mas-o-que-e-o-rack/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/entao-o-rails-agora-usa-rack-mas-o-que-e-o-rack/</feedburner:origLink></item>
		<item>
		<title>Merb Brasil</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/462898492/</link>
		<comments>http://www.arthurgeek.net/merb-brasil/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 15:22:19 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[merb merb-br]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/?p=154</guid>
		<description><![CDATA[Nasceu o site da Comunidade Merb Brasil.
Por enquanto não temos muito conteúdo, mas a idéia é ter Artigos, Tutoriais e Documentação traduzida para o Merb. Temos também um Wiki e um Fórum configurados.
Ainda falta um layout definitivo e estou à procura de interessados para escrever artigos. 
Mas é isso! Agora é só fazer a comunidade crescer. :)
]]></description>
			<content:encoded><![CDATA[<p>Nasceu o site da <a href="http://merb-br.org">Comunidade Merb Brasil</a>.</p>
<p>Por enquanto não temos muito conteúdo, mas a idéia é ter Artigos, Tutoriais e Documentação traduzida para o Merb. Temos também um <a href="http://merb-br.org/wiki">Wiki</a> e um <a href="http://merb-br.org/forum">Fórum</a> configurados.</p>
<p>Ainda falta um layout definitivo e estou à procura de interessados para escrever artigos. </p>
<p>Mas é isso! Agora é só fazer a comunidade crescer. :)</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=pIpdlm"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=pIpdlm" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/462898492" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/merb-brasil/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/merb-brasil/</feedburner:origLink></item>
		<item>
		<title>Nyane: o framework insignificante</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/439969850/</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>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=bN46I2"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=bN46I2" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/439969850" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/nyane-o-framework-insignificante/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/nyane-o-framework-insignificante/</feedburner:origLink></item>
		<item>
		<title>Rails Summit 2008</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/427104045/</link>
		<comments>http://www.arthurgeek.net/rails-summit-2008/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 04:29:01 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[eventos]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[railssummit]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/?p=122</guid>
		<description><![CDATA[Nessa semana aconteceu o Rails Summit Latin America, evento organizado pelo Fabio Akita e o pessoal da Locaweb.
O evento foi sensacional. A organização estava impecável, ainda mais para uma primeira edição. O melhor evento voltado para programadores que eu participei. 
Estiveram presentes grandes nomes da comunidade internacional como Chad Fowler, Dr. Nic, Chris Wanstrath, os caras da Phusion, Jay [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa semana aconteceu o <a href="http://www.locaweb.com.br/railssummit/">Rails Summit Latin America</a>, evento organizado pelo <a href="http://akitaonrails.com">Fabio Akita</a> e o pessoal da <a href="http://www.locaweb.com.br">Locaweb</a>.</p>
<p>O evento foi sensacional. A organização estava impecável, ainda mais para uma primeira edição. O melhor evento voltado para programadores que eu participei. </p>
<p>Estiveram presentes grandes nomes da comunidade internacional como <a href="http://chadfowler.com">Chad Fowler</a>, <a href="http://drnicwilliams.com/">Dr. Nic</a>, <a href="http://errtheblog.com/">Chris Wanstrath</a>, <a href="http://www.modrails.com/">os caras da Phusion</a>, <a href="http://blog.jayfields.com/">Jay Fields</a>, <a href="http://blog.davidchelimsky.net/">David Chelimsky</a>, <a href="http://blog.obiefernandez.com/">Obie Fernandez</a>. O pessoal da comunidade brasileira também fizeram bonito: <a href="http://akitaonrails.com">Fabio Akita</a>, <a href="http://nomedojogo.com/">Carlos Brando</a>, <a href="http://www.georgeguimaraes.com/">George Guimarães</a>, <a href="http://dtsato.com">Danilo Sato</a>, <a href="http://blogblogs.com.br">Manoel Lemos</a> e o pessoal da WebCo, <a href="http://improveit.com.br">Vinícius Telles</a>, <a href="http://fabiokung.com">Fabio Kung</a>, entre outros.</p>
<p>Com certeza, o mais interessante foi conhecer as pessoas por trás de URLs. Pessoas como: <a href="http://eustaquiorangel.com/">TaQ</a>, <a href="http://daviscabral.com">Davis Cabral</a>, <a href="http://railsbox.org/">Ozéias Santana</a>, <a href="http://www.spiceee.com/">Spicee</a>, <a href="http://egenial.com.br">Carlos Eduardo</a>, <a href="http://www.monteiro.eti.br/">Júlio Monteiro</a>, <a href="http://www.improveit.com.br/en/company/tapajos">Marcos Tapajós</a>, e muitas outras pessoas. Rever todo o pessoal que eu já conhecia também foi muito legal.</p>
<p>Já estou no aguardo para o evento do ano que vem! :)</p>
<p><a href="http://blogsearch.google.com/blogsearch?q=rails+summit">Acompanhe o relato de outros blogueiros sobre o evento</a>.</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=xjzYkg"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=xjzYkg" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/427104045" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/rails-summit-2008/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/rails-summit-2008/</feedburner:origLink></item>
		<item>
		<title>Migrei para o Wordpress</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042731/</link>
		<comments>http://www.arthurgeek.net/migrei-para-o-wordpress/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 06:48:09 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[geral]]></category>

		<category><![CDATA[mephisto]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/?p=94</guid>
		<description><![CDATA[Já tinha um tempo que eu queria migrar este blog do Mephisto para o Wordpress. Porém, nunca tinha achado um scrip fácil que fizesse todo o trabalho sujo. Até tentei escrever um, mas esbarrei em alguns problemas.
Hoje, achei um desses scripts e finalmente fiz a migração. Depois escrevo um post detalhando o processo.
Este blog agora roda [...]]]></description>
			<content:encoded><![CDATA[<p>Já tinha um tempo que eu queria migrar este blog do <a title="Mephisto" href="http://www.mephistoblog.com">Mephisto</a> para o <a title="Wordpress" href="http://www.wordpress.org">Wordpress</a>. Porém, nunca tinha achado um scrip fácil que fizesse todo o trabalho sujo. Até tentei escrever um, mas esbarrei em alguns problemas.</p>
<p>Hoje, achei um desses scripts e finalmente fiz a migração. Depois escrevo um post detalhando o processo.</p>
<p>Este blog agora roda a última versão do Wordpress, mas ainda falta algumas coisinhas, como instalar um plugin decente pra Code Highlight, e alguns ajustes no layout. Caso você encontre algum probleminha (link quebrado, arquivo faltando, etc) <a href="http://www.arthurgeek.net/contato">entre em contato</a>. :)</p>
<h3>Porquê migrar do Mephisto para o Wordpress?</h3>
<p>Bom, os motivos vão desde o número de plugins disponíveis para o Wordpress, até algumas features mais interessantes do Wordpress, mas o principal deles é a falta de desenvolvimento do Mephisto nos últimos tempos, como pode ser conferido no <a href="http://github.com/technoweenie/mephisto/tree/master">repositório do Mephisto</a> no GitHub.</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=R0VLwN"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=R0VLwN" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042731" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/migrei-para-o-wordpress/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/migrei-para-o-wordpress/</feedburner:origLink></item>
		<item>
		<title>Palestra sobre Git no Treina Tom</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042732/</link>
		<comments>http://www.arthurgeek.net/palestra-sobre-git-no-treina-tom/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 02:59:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/08/23/palestra-sobre-git-no-treina-tom</guid>
		<description><![CDATA[Vale o lembrete: sábado agora tem palestra sobre Git comigo no Café com o Tom. Não perca! :)
Update: Aqui estão os slides da palestra: Git: Controle de Versões do jeito certo
]]></description>
			<content:encoded><![CDATA[<p>Vale o lembrete: sábado agora tem <a href="http://www.arthurgeek.net/2008/5/24/git-controle-de-versao-do-jeito-certo">palestra sobre Git</a> comigo no <a href="http://www.treinatom.com.br/cafe-com-o-tom">Café com o Tom</a>. Não perca! :)</p>
<p><strong>Update</strong>: Aqui estão os slides da palestra: <a href="http://www.arthurgeek.net/Git_-_Controle_de_Versoes_do_jeito_certo.pdf" onClick="javascript: pageTracker._trackPageview('Git_-_Controle_de_Versoes_do_jeito_certo'); ">Git: Controle de Versões do jeito certo</a></p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=U1KyJt"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=U1KyJt" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042732" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/palestra-sobre-git-no-treina-tom/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/palestra-sobre-git-no-treina-tom/</feedburner:origLink></item>
		<item>
		<title>Usando o ruby-debug com Passenger</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042733/</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>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=o8rJRI"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=o8rJRI" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042733" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/usando-o-ruby-debug-com-passenger/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/usando-o-ruby-debug-com-passenger/</feedburner:origLink></item>
		<item>
		<title>Instalando Merb e Datamapper</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042734/</link>
		<comments>http://www.arthurgeek.net/instalando-merb-e-datamapper/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 04:53:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[datamapper]]></category>

		<category><![CDATA[merb]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/07/11/instalando-merb-e-datamapper</guid>
		<description><![CDATA[Há tempos venho acompanhando o desenvolvimento do Merb e DataMapper. Desde suas versões 0.9.x, acredito que já dá pra “brincar” um pouco.
Neste artigo vou ensinar como instalá-los.
Instalando as dependências
Primeiro, vamos instalar as dependências do Merb, via RubyGems:
sudo gem install rack mongrel json erubis mime-types rspec hpricot mocha rubigen haml markaby mailfactory ruby2ruby
Agora, uma dependência do [...]]]></description>
			<content:encoded><![CDATA[<p>Há tempos venho acompanhando o desenvolvimento do <a href="http://www.merbivore.com">Merb</a> e <a href="http://www.datamapper.org">DataMapper</a>. Desde suas versões 0.9.x, acredito que já dá pra “brincar” um pouco.</p>
<p>Neste artigo vou ensinar como instalá-los.</p>
<h3>Instalando as dependências</h3>
<p>Primeiro, vamos instalar as dependências do Merb, via RubyGems:</p>
<pre><code>sudo gem install rack mongrel json erubis mime-types rspec hpricot mocha rubigen haml markaby mailfactory ruby2ruby</code></pre>
<p>Agora, uma dependência do DataMapper, que só se encontra no GitHub:</p>
<pre><code>git clone git://github.com/sam/extlib.git
cd extlib
rake install
cd ..</code></pre>
<p>Você precisará do Git instalado. Caso não tenha, acompanhe <a href="http://www.arthurgeek.net/2008/4/3/screencast-git-compilando-e-configurando">este meu screencast</a>, que ensina como compilar o Git à partir do fonte.</p>
<h3>Instalando o Merb</h3>
<p>Vamos clonar o repositório usando o GitHub:</p>
<pre><code>git clone git://github.com/wycats/merb-core.git
git clone git://github.com/wycats/merb-plugins.git
git clone git://github.com/wycats/merb-more.git</code></pre>
<p>Agora, vamos instalar, através do rake:</p>
<pre><code>cd merb-core
rake install
cd ..
cd merb-more
rake install
cd ..
cd merb-plugins
rake install
cd ..</code></pre>
<h3>Instalando o DataMapper</h3>
<p>Clonando o repositório:</p>
<pre><code>git clone git://github.com/sam/do.git
git clone git://github.com/sam/dm-core.git
git clone git://github.com/sam/dm-more.git</code></pre>
<p>Instalando o DataObjects:</p>
<pre><code>cd do
cd data_objects
rake install
cd ..
cd do_mysql
rake install</code></pre>
<p>Repita o último processo caso queira instalar os adaptadores para Sqlite3 (do_sqlite3) e PostgreSQL (do_postgres).</p>
<p>Agora, o DataMapper:</p>
<pre><code>cd dm-core
rake install
cd ..
cd dm-more
rake install
cd ..</code></pre>
<p>É isso! Agora, comecem a “brincar” com o Merb você também! :)</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=8hw1y1"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=8hw1y1" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042734" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/instalando-merb-e-datamapper/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/instalando-merb-e-datamapper/</feedburner:origLink></item>
		<item><title>Links for 2008-07-07 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/329507893/arthurzap</link><pubDate>Tue, 08 Jul 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-07-07</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.hanynet.com/waterroof/">WaterRoof ipfw firewall frontend</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/329507893" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.hanynet.com/waterroof/"&gt;WaterRoof ipfw firewall frontend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-07-07</feedburner:origLink></item><item><title>Links for 2008-07-02 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/325486818/arthurzap</link><pubDate>Thu, 03 Jul 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-07-02</guid><content:encoded><![CDATA[<ul>
<li><a href="http://lucaguidi.com/pages/sashimi">Luca Guidi: Sashimi</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/325486818" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lucaguidi.com/pages/sashimi"&gt;Luca Guidi: Sashimi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-07-02</feedburner:origLink></item><item><title>Links for 2008-06-30 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/323778742/arthurzap</link><pubDate>Tue, 01 Jul 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-06-30</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/">Pathfinder Development &raquo; More Named Scope Awesomeness</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/323778742" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/"&gt;Pathfinder Development &amp;raquo; More Named Scope Awesomeness&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-06-30</feedburner:origLink></item><item>
		<title>Git: Controle de versão do jeito certo</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042735/</link>
		<comments>http://www.arthurgeek.net/git-controle-de-versao-do-jeito-certo/#comments</comments>
		<pubDate>Sat, 24 May 2008 13:52:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/08/23/git-controle-de-versao-do-jeito-certo</guid>
		<description><![CDATA[Anote aí na sua agenda: dia 23 de agosto (é, tá longe!) tem palestra de Git no Treina Tom comigo! :)
Não deixe de conferir (e assistir) as outras palestras que vão rolar esse ano, todas com excelentes temas para desenvolvedores web!
Quanto aos screencasts, não esqueci deles não, falta o áudio, mas acontece que eu coloquei [...]]]></description>
			<content:encoded><![CDATA[<p>Anote aí na sua agenda: dia 23 de agosto (é, tá longe!) tem palestra de Git no <a href="https://www.treinatom.com.br/cafe-com-o-tom">Treina Tom</a> comigo! :)</p>
<p>Não deixe de conferir (e assistir) as outras palestras que vão rolar esse ano, todas com excelentes temas para desenvolvedores web!</p>
<p>Quanto aos screencasts, não esqueci deles não, falta o áudio, mas acontece que eu coloquei aparelho ortodôntico esse mês e falta me acostumar a falar melhor com eles. :)</p>
<p>Ah, <a href="http://simplesideias.com.br">Nando</a>, valeu pela idéia do nome da palestra! ;)</p>
<p><strong>Update</strong>: Aqui estão os slides da palestra: <a href="http://www.arthurgeek.net/Git_-_Controle_de_Versoes_do_jeito_certo.pdf" onClick="javascript: pageTracker._trackPageview('Git_-_Controle_de_Versoes_do_jeito_certo'); ">Git: Controle de Versões do jeito certo</a></p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=UTl1n5"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=UTl1n5" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042735" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/git-controle-de-versao-do-jeito-certo/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/git-controle-de-versao-do-jeito-certo/</feedburner:origLink></item>
		<item>
		<title>Git Bisect</title>
		<link>http://feeds.feedburner.com/~r/arthurgeek/~3/383042736/</link>
		<comments>http://www.arthurgeek.net/git-bisect/#comments</comments>
		<pubDate>Fri, 23 May 2008 19:27:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[bisect]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[scm]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/05/23/git-bisect</guid>
		<description><![CDATA[Você conhece o git bisect?
É uma das features mais interessantes do Git. E até hoje, eu nunca tinha usado o bisect. Mas o que ele faz? De acordo com o próprio site: “Find the change that introduced a bug by binary search”. Interessante, não?
Como funciona?
O bisect ajuda a encontrar quando um bug foi introduzido no [...]]]></description>
			<content:encoded><![CDATA[<p>Você conhece o <a href="http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html">git bisect</a>?</p>
<p>É uma das features mais interessantes do Git. E até hoje, eu nunca tinha usado o bisect. Mas o que ele faz? De acordo com o próprio site: <strong>“Find the change that introduced a bug by binary search”</strong>. Interessante, não?</p>
<h3>Como funciona?</h3>
<p>O bisect ajuda a encontrar quando um bug foi introduzido no seu código, marcando pontos nos commits como <em>‘bons’</em> e <em>‘ruins’</em>, e examinando commits intermediários usando um algoritmo de busca binária que vai eliminando metade dos commits cada vez que você marca um commit como <em>‘bom’</em> ou <em>‘ruim’</em>.</p>
<h3>Exemplo</h3>
<p>Suponha que tenhamos um projeto com o seguinte log:</p>
<pre><code>commit 7dd0f15d4e9a5fc1f625c0ac6e4788de45e0c40f
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 17:36:27 2008 -0300

    Commit 20

commit dc358142a0deb6e1ba8e15f55f5e851e7bcc1ecf
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:50:44 2008 -0300

    Commit 19

commit 648160ea61e194f97c8e11a35866025dca46c9a4
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:34:38 2008 -0300

    Commit 18

commit 786a02663af9aa8eed533ab574b79294eddff4fc
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:34:22 2008 -0300

    Commit 17

commit 9b76092b44f714d780a45e99532593da7b744801
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:14:08 2008 -0300

    Commit 16

commit a00ef3d4e836af6777350a5f157132a255804e67
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 11:33:45 2008 -0300

    Commit 15

commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson &lt;bart@simpsons.com&gt;
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

commit 67022233899f78aee7f120337f1ec434d238f23f
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 11:30:31 2008 -0300

    Commit 13

commit 21b8739f2ff271baa492d358e426ea1fc87bb7d7
Merge: ecc25a6... 00560d4...
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Tue May 20 19:32:29 2008 -0300

    Commit 12

commit 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Tue May 20 17:11:56 2008 -0300

    Commit 11</code></pre>
<p>Nós temos uma funcionalidade que funcionava no <em>Commit 11</em>, mas que no <em>Commit 20</em> não funciona, porém, não sabemos em que momento este bug foi introduzido. Mentira, eu sei que foi o Bart quem introduziu o bug no <em>Commit 14</em>, mas vamos supor que nós não sabemos disso ainda! :)</p>
<h3>E agora, o Git poderá nos socorrer?</h3>
<p>Aqui é que entra o bisect.</p>
<pre><code>$ git bisect start
$ git bisect bad
$ git bisect good 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Bisecting: 4 revisions left to test after this
[a00ef3d4e836af6777350a5f157132a255804e67] Commit 15</code></pre>
<p>Nós dizemos ao git que o commit atual é <em>‘bad’</em>. E que o <em>Commit 11</em> estava ok (passando o hash identificador do <em>Commit 11</em>). Sendo assim, o Git escolhe um ponto intermediário entre os 2 commits, resultando no <em>Commit 15</em>.</p>
<p>Nós testamos o sistema, e vimos que o bug já estava presente nesta versão, assim, ou ele foi introduzido neste commit ou antes dele. Se o bug não estivesse presente nesta versão, significa que ele foi introduzido depois. De qualquer maneira, eliminaremos a necessidade de checar metade dos commits.</p>
<p>Vamos dizer ao git que esta versão é <em>‘bad’</em>:</p>
<pre><code>$ git bisect bad
Bisecting: 2 revisions left to test after this
[21b8739f2ff271baa492d358e426ea1fc87bb7d7] Commit 12
$</code></pre>
<p>O Git nos leva até o <em>Commit 12</em>, nós analisamos novamente e o bug não estava presente nesta versão, então, podemos dizer que esta versão é <em>‘good’</em>.</p>
<pre><code>$ git bisect good
Bisecting: 1 revisions left to test after this
[526be2a6b652df597e4d5b7670d58e7f0767e2e3] Commit 14
$</code></pre>
<p>Voltamos ao processo novamente e descobrimos que esta versão estava <em>‘bugada’</em>.</p>
<pre><code>$ git bisect bad
Bisecting: 0 revisions left to test after this
[67022233899f78aee7f120337f1ec434d238f23f] Commit 13</code></pre>
<p>Agora, se esta versão estiver ok, o bug foi introduzido no <em>Commit 14</em>, visto que já dissemos que os commits 12 e 15 estavam ok. Testamos, e esta versão encontra-se ok.</p>
<pre><code>$ git bisect good
526be2a6b652df597e4d5b7670d58e7f0767e2e3 is first bad commit
commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson &lt;bart@simpsons.com&gt;
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

:040000 040000 58adb210b90786fb300ae1d0f3b478adbe643fb0 4adb482917754cb560e3f0f586c4a0739ebab373 M    file.rb</code></pre>
<p>Sendo assim, o Git nos informa que o <em>Commit 14</em> é o primeiro <em>‘bad’</em> commit e que o bug foi introduzido ali. Após ter encontrado o bug, rodamos:</p>
<pre><code>$ git bisect reset</code></pre>
<p>E agora, podemos corrigir o bug. E reclamar com o Bart que foi quem introduziu ele! :)</p>
<p>Neste caso, era um intervalo de apenas 10 commits, mas se fosse um intervalo maior, o bisect também ajudaria, visto que ele usa um algoritmo de busca binária.</p>
<p>É ou não é, sensacional? :)</p>

<p><a href="http://feeds.feedburner.com/~a/arthurgeek?a=TGBGBC"><img src="http://feeds.feedburner.com/~a/arthurgeek?i=TGBGBC" border="0"></img></a></p><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/383042736" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/git-bisect/feed/</wfw:commentRss>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><feedburner:origLink>http://www.arthurgeek.net/git-bisect/</feedburner:origLink></item>
	<item><title>Links for 2008-05-14 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/290678165/arthurzap</link><pubDate>Thu, 15 May 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-05-14</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.railway.at/articles/2008/05/14/do-we-really-need-controller-and-view-tests">Do we really need Controller and View tests?</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/290678165" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.railway.at/articles/2008/05/14/do-we-really-need-controller-and-view-tests"&gt;Do we really need Controller and View tests?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-05-14</feedburner:origLink></item><item><title>Links for 2008-05-11 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/288451985/arthurzap</link><pubDate>Mon, 12 May 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-05-11</guid><content:encoded><![CDATA[<ul>
<li><a href="http://novemberain.com/2008/5/11/state-of-merb-before-1-0-the-good-the-bad-and-the-ugly">Unwinding the stack: back to the future, this time for real. State of Merb on road to 1.0: the good, the bad and the ugly.</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/288451985" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://novemberain.com/2008/5/11/state-of-merb-before-1-0-the-good-the-bad-and-the-ugly"&gt;Unwinding the stack: back to the future, this time for real. State of Merb on road to 1.0: the good, the bad and the ugly.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-05-11</feedburner:origLink></item><item><title>Links for 2008-04-24 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/277392503/arthurzap</link><pubDate>Fri, 25 Apr 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-04-24</guid><content:encoded><![CDATA[<ul>
<li><a href="http://www.socialface.com/slapp/">Slapp: A simple chat wall Merb tutorial.</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/277392503" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.socialface.com/slapp/"&gt;Slapp: A simple chat wall Merb tutorial.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-04-24</feedburner:origLink></item><item><title>Links for 2008-04-15 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/arthurgeek/~3/271184915/arthurzap</link><pubDate>Wed, 16 Apr 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/arthurzap#2008-04-15</guid><content:encoded><![CDATA[<ul>
<li><a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html">Zack Rusin: Git cheat sheet</a></li>
<li><a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/">Git Magic - Preface</a></li>
</ul><img src="http://feeds.feedburner.com/~r/arthurgeek/~4/271184915" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;Zack Rusin: Git cheat sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/"&gt;Git Magic - Preface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/arthurzap#2008-04-15</feedburner:origLink></item></channel>
</rss>
