<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CØdeZØne! &#187; ruby</title>
	<atom:link href="http://leandrosilva.com.br/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://leandrosilva.com.br</link>
	<description>Coisas sobre desenvolvimento de software</description>
	<lastBuildDate>Sat, 21 Apr 2012 17:14:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>slogger: lugar de mensagens de log é no Syslog</title>
		<link>http://leandrosilva.com.br/2011/02/18/slogger-lugar-de-mensagens-de-log-e-no-syslog/</link>
		<comments>http://leandrosilva.com.br/2011/02/18/slogger-lugar-de-mensagens-de-log-e-no-syslog/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 22:43:28 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[syslog]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=857</guid>
		<description><![CDATA[Uma coisa importante que aprendi na convivencia com os melhores sysadmins de Linux que já trabalhei (esse e esse, por exemplo) é que lugar de log é no Syslog &#8211; e se você não está fazendo isso, hummm, há uma boa chance de you&#8217;re doing it wrong my friend. &#8230;and in The .NET World A [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa importante que aprendi na convivencia com os melhores sysadmins de Linux que já trabalhei (<a href="http://twitter.com/deferraz" target="_blank">esse</a> e <a href="http://twitter.com/ncode" target="_blank">esse</a>, por exemplo) é que lugar de log é no <a href="http://en.wikipedia.org/wiki/Syslog" target="_blank">Syslog</a> <em>&#8211; e se você não está fazendo isso, hummm, há uma boa chance de you&#8217;re doing it wrong my friend.</em></p>
<blockquote><p><strong><em>&#8230;and in The .NET World</em></strong></p>
<p>A melhor prática para aqueles que trabalham com .NET é <a href="http://www.developer.com/net/net/article.php/1370771/Interacting-with-the-Windows-2000-Event-Viewer-Using-C.htm" target="_blank">escrever log</a> com o <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx" target="_blank">Event Log</a>. Os melhores sysadmins de Windows que conheço estão sempre ligados (<a href="http://nagios.sourceforge.net/docs/3_0/monitoring-windows.html" target="_blank">Nagios?</a> <a href="http://www.zabbixbrasil.org/wiki/tiki-index.php?page=Instalacao+de+Agente+Zabbix+em+ambiente+Windows" target="_blank">Zabbix</a>?) no <a href="http://technet.microsoft.com/pt-br/library/cc668520.aspx" target="_blank">Event Viewer</a>.</p>
<p>Então, apesar deste post se destinar a Ruby/POSIX, fica a dica do Renato Lucindo <em>&#8211; no final desse post &#8211;</em> para a galera de .NET/Windows também.</p></blockquote>
<p>Bem, como a biblioteca padrão do Ruby para escrever no Syslog não é lá muito amigável, resolvi facilitar um pouco as coisas e criei a gem <a href="https://github.com/leandrosilva/slogger" target="_blank">slogger</a>.</p>
<h3>Dois exemplos rápidos</h3>
<p>Antes de mais nada, installe a gem:</p>
<p style="padding-left: 30px;">$ gem install slogger</p>
<p><strong>Log simples:</strong></p>
<pre class="brush: ruby; title: ; notranslate">
slogger = Slogger::Logger.new &quot;sample_app&quot;, :debug, :local0
slogger.info &quot;A good info&quot;
slogger.debug &quot;A deep info&quot;
</pre>
<p><strong>Log com tempo de execução:</strong></p>
<pre class="brush: ruby; title: ; notranslate">
slogger = Slogger::Logger.new &quot;sample_app&quot;, :debug, :local0
slogger.info &quot;A really good info preceded by spent time&quot; do
    # do something
end
</pre>
<p>Depois, claro, dê uma olhada no seu Syslog, para ver as mensagens &#8220;logadas&#8221;.</p>
<h3>A lambuja</h3>
<p>Se você estiver usando <a href="http://sinatrarb.com" target="_blank">Sinatra</a>, por exemplo, pode usar o middleware <a href="https://github.com/rack/rack/wiki/List-of-Middleware" target="_blank">Slogger::Rack::RequestLogger</a> em vez do famoso <a href="http://rack.rubyforge.org/doc/Rack/CommonLogger.html" target="_blank">Rack::CommonLogger</a>, que usa <a href="http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/" target="_blank">Logger</a> (não que o Logger seja ruim).</p>
<pre class="brush: ruby; title: ; notranslate">
configure do
  slogger = Slogger::Logger.new &quot;sample_app&quot;, :debug, :local0
  use Slogger::Rack::RequestLogger, slogger
end
</pre>
<h3>E a dica final</h3>
<p>Ecoando a dica do <a href="http://twitter.com/rlucindo" target="_blank">Renato Lucindo</a>: não seja ingênuo, <a href="http://www.slideshare.net/rlucindo/distributed-systems-5186671" target="_blank">log everything</a>!!!</p>
<p>Tá esperando o que para começar a fazer a coisa direito?</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2011/02/18/slogger-lugar-de-mensagens-de-log-e-no-syslog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jetty-rackup: rodando aplicações Rack no Jetty</title>
		<link>http://leandrosilva.com.br/2011/02/12/jetty-rackup-rodando-aplicacoes-rack-no-jetty/</link>
		<comments>http://leandrosilva.com.br/2011/02/12/jetty-rackup-rodando-aplicacoes-rack-no-jetty/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 23:38:34 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[jython]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=809</guid>
		<description><![CDATA[Por conta de um projeto que está pintando no trabalho, que requer o uso de um conector escrito em Java, há umas duas semanas mais ou menos comecei a fazer novos testes com Jython, considerando fortemente uma solução baseada Python. Até publiquei uma aplicação boba usando Flask, só de exemplo, porque googlando não achei nada que [...]]]></description>
			<content:encoded><![CDATA[<p>Por conta de um projeto que está pintando no trabalho, que requer o uso de um conector escrito em <a href="http://en.wikipedia.org/wiki/Java_(programming_language)" target="_blank">Java</a>, há umas duas semanas mais ou menos comecei a fazer novos testes com <a href="http://jython.org" target="_blank">Jython</a>, considerando fortemente uma solução baseada <a href="http://python.org" target="_blank">Python</a>. Até publiquei <a href="https://github.com/leandrosilva/flaskito" target="_blank">uma aplicação boba</a> usando <a href="http://flask.pocoo.org" target="_blank">Flask</a>, só de exemplo, porque <em>googlando</em> não achei nada que não fosse com <a href="http://pylonshq.com" target="_blank">Pylons</a> ou <a href="http://djangoproject.com" target="_blank">Django</a>. Mas no final, Jython não pode preencher alguns requisitos e voltamos então para <a href="http://jruby.org" target="_blank">JRuby</a>.</p>
<p>É aqui que entra o tema deste post.</p>
<p>Essa semana andei fazendo algumas contribuições em um projeto <em>open source</em> bem simples, mas igualmente interessante, que é o <a href="https://github.com/leandrosilva/jetty-rackup" target="_blank">jetty-rackup</a>.</p>
<p><a href="https://github.com/leandrosilva/jetty-rackup" target="_blank"></a>O objetivo do jetty-rackup é rodar aplicações <a href="http://rack.rubyforge.org/" target="_blank">Rack</a> no <a href="http://jetty.codehaus.org/jetty/" target="_blank">Jetty WebServer</a>, sem ter que empacotá-las em <a href="http://en.wikipedia.org/wiki/WAR_(Sun_file_format)" target="_blank">arquivos WAR</a>, o que é definitivamente excelente em ambiente de desenvolvimento ou quanto você quer fazer deploy orientado a <em>git pull</em>.</p>
<h3><strong>Tutorial de 1 minuto</strong></h3>
<p>Bem, para que o jabá seja completo, nada melhor do que um tutorial. Vamos escrever então uma aplicação Sinatra básica <em>&#8211; ótima pedida para Web API.</em></p>
<p>1. Com Sinatra já instalado, crie uma aplicação <em>&#8211; app.rb</em></p>
<pre class="brush: ruby; title: ; notranslate">
require 'sinatra'

configure :development do
  Sinatra::Application.reset! # recarrega as rotas
  use Rack::Reloader          # recarrega arquivos
end

get '/?' do
  &quot;hello&quot;
end

get '/:message/?' do |message|
  &quot;hello #{message}&quot;
end
</pre>
<p>2. Com a aplicação criada, crie o arquivo rackup <em>&#8211; config.ru</em></p>
<pre class="brush: ruby; title: ; notranslate">
require 'rubygems'
require 'app'

set :run, false
set :environment, :development

run Sinatra::Application
</pre>
<p>3. Com o arquivo rackup criado, installe a <a href="rubygems.org/gems/jetty-rackup" target="_blank">gem jetty-rackup</a></p>
<p style="padding-left: 30px;">$ gem install jetty-rackup</p>
<p>4. Com a gem jetty-rackup instalada, no diretório da aplicação criada, inicie a aplicação</p>
<p style="padding-left: 30px;">$ jetty-rackup config.ru</p>
<p>5. Finalmente, com tudo pronto, teste com <a href="http://curl.haxx.se/" target="_blank">cURL</a> e <a href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">Apache Benchmark</a></p>
<p style="padding-left: 30px;">$ curl http://localhost:9292/</p>
<p style="padding-left: 30px;">$ ab -n 10000 -c 25 http://localhost:9292/</p>
<p>Voilà!</p>
<p>Agora, rode o último comando algumas vezes e observe a variação crescente de &#8220;Requests per second&#8221;. JIT Compiler for the win!</p>
<h3><strong>Um pouco mais</strong></h3>
<p>Se quiser saber como usar bibliotecas Java, no repositório do projeto tem também um <a href="https://github.com/leandrosilva/jetty-rackup/tree/master/examples/using_java" target="_blank">exemplo</a> usando classes Java, tanto contidas no diretório WEB-INF/classes quanto em <a href="http://en.wikipedia.org/wiki/JAR_file" target="_blank">arquivo JAR</a> no WEB-INF/lib.</p>
<p>Divirta-se!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2011/02/12/jetty-rackup-rodando-aplicacoes-rack-no-jetty/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Locaweb está contratando!</title>
		<link>http://leandrosilva.com.br/2011/01/21/a-locaweb-esta-contratando/</link>
		<comments>http://leandrosilva.com.br/2011/01/21/a-locaweb-esta-contratando/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 14:46:02 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[trabalho]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=800</guid>
		<description><![CDATA[A Locaweb está procurando por desenvolvedores experiêntes e talentosos para integrar nossos times de SaaS, Cloud Computing, Hospedagem, Q&#38;A e Sistemas Centrais. Se você tem experiência em Ruby, Python, Java, .NET, PHP, Perl, bancos de dados relacionais e não-relacionais, arquiteturas distribuídas, sistemas de agendamento de tarefas, filas assíncronas, desenvolvimento web, e umas coisinhas mais, pode [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://locaweb.com.br" target="_blank">Locaweb</a> está procurando por desenvolvedores experiêntes e talentosos para integrar nossos times de SaaS, Cloud Computing, Hospedagem, Q&amp;A e Sistemas Centrais.</p>
<p>Se você tem experiência em Ruby, Python, Java, .NET, PHP, Perl, bancos de dados relacionais e não-relacionais, arquiteturas distribuídas, sistemas de agendamento de tarefas, filas assíncronas, desenvolvimento web, e umas coisinhas mais, pode ser que tenhamos um lugar aqui para você. Que tal?</p>
<p>O perfil completo pode ser visto na integra <a href="http://ondetrabalhar.com/vagas/724/desenvolvedores-net-ruby-java-python" target="_blank">aqui</a>, no <a href="http://ondetrabalhar.com" target="_blank">OndeTrabalhar.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2011/01/21/a-locaweb-esta-contratando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O quanto realmente importa a escolha de uma linguagem?</title>
		<link>http://leandrosilva.com.br/2010/08/23/o-quanto-realmente-importa-a-escolha-de-uma-linguagem/</link>
		<comments>http://leandrosilva.com.br/2010/08/23/o-quanto-realmente-importa-a-escolha-de-uma-linguagem/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 03:11:45 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=772</guid>
		<description><![CDATA[Há alguns meses perguntaram ao Rich Hickey: &#8220;How much does a choice of language really matter? Are there good reasons to choose one language over another or does it all come down to taste?&#8221; E sua resposta foi: &#8220;I think it matters quite a bit. A good language is opinionated, and strives to make a particular [...]]]></description>
			<content:encoded><![CDATA[<p>Há alguns meses <a href="http://www.simple-talk.com/opinion/geek-of-the-week/rich-hickey-geek-of-the-week/" target="_blank">perguntaram</a> ao <a href="http://en.wikipedia.org/wiki/Rich_Hickey" target="_blank">Rich Hickey</a>:</p>
<blockquote><p><em>&#8220;How much does a choice of language really matter? Are there good reasons to choose one language over another or does it all come down to taste?&#8221;</em></p></blockquote>
<p>E sua resposta foi:</p>
<blockquote><p><em>&#8220;I think it matters quite a bit. A good language is opinionated, and strives to make a particular style of programming easy and idiomatic. It only seems a matter of taste when you are comparing languages that are more similar than they are different, like Java/C# or Python/Ruby. Try something really different like Clojure, Haskell, or Erlang and the fact that it matters becomes readily apparent.&#8221;</em></p></blockquote>
<p>Eu acho que concordo bastante com sua opinião. Discutir se Java é melhor do que C#, por exemplo, é inútil, porque as duas linguagens são muito semelhantes. Nesse caso, o que acaba pesando mais na hora da escolha é o ecosistema no qual cada linguagem está inserida, que pode agradar mais a um ou a outro programador. É puro gosto.</p>
<p>O mesmo vale para Ruby e Python, como ele mesmo cita.</p>
<h4>Mundos diferentes</h4>
<p>Mas e se a comparação for entre Java e Ruby, por exemplo, como é que fica? Na minha humilde opinião, fica <em>no sense</em>. Porque Java e Ruby não são liguagens de mesma proposta; e mesmo sendo ambas de propósito geral, ambas tem objetivos claramente diferentes.</p>
<p><strong>Comparação entre mundos diferentes</strong></p>
<p>Agora vou, propositalmente, contradizer um pouco o que eu disse à cima: faz sentido, sim, você comparar Ruby com Java; Erlang com Python; F# com PHP. Sim, faz sentido.</p>
<p>Faz sentido quando você está escolhendo a linguagem que oferece a melhor solução para um dado domínio de problema.</p>
<blockquote><p><em>Super CRUD com Erlang? Não, acho que não.</em></p>
<p><em>Precisar de c</em><em>oncorrência massiva, tolerância a falhas, processos distribuídos, downtime mínimo? Humm, não sei não, mas será que não é de Erlang que você precisa?</em></p></blockquote>
<p>Entende? É nessa hora que <a href="http://al3x.net/2010/07/27/node.html" target="_blank">a escolha de uma linguagem</a> começa a pesar de verdade. Isso realmente importa.</p>
<p><strong>Mundos diferentes se complementam</strong></p>
<p>Tempos atrás, escrevendo programas Erlang/OTP, senti falta de uma ferramenta que me ajudasse a criar rapidamente a estrutura inicial do projeto e <a href="http://www.erlang.org/doc/design_principles/des_princ.html" target="_blank">umas coisas mais</a>. O que fiz? Criei uma ferramenta que faz isso: <a href="http://github.com/leandrosilva/otp_kickoff" target="_blank">otp_kickoff</a>. Em Erlang? Não, em Ruby. Fiz isso em poucas horas, usando <a href="http://github.com/wycats/thor" target="_blank">Thor</a>.</p>
<p>Pouco tempo depois, senti falta de uma ferramenta de build amigável. Novamente, o que fiz? Criei o <a href="http://github.com/leandrosilva/ebuilder" target="_blank">ebuilder</a>, usando Ruby/Thor.</p>
<p>Um outro exemplo de mundos diferentes que se complementam é o <a href="http://github.com/leandrosilva/jsparrow" target="_blank">JSparrow</a>, um cliente de <a href="http://pt.wikipedia.org/wiki/JMS" target="_blank">JMS</a> bem fluente, que fiz usando <a href="http://jruby.org/" target="_blank">JRuby</a>.</p>
<p>Essa é a ideia de tirar o melhor de cada linguagem!</p>
<p>Mesmo porque, dificilmente, você constroi um sistema de verdade <em>&#8211; que não seja um super CRUD &#8211;</em> com apenas uma única linguagem de programação. Na minha equipe mesmo, há sistemas desenvolvidos em C# .NET, que são <em>buildados, </em>testados e <em>deployados</em> com Ruby/Rake/Cucumber e usam Java/Ivy como repositório de assemblies. Isso sem falar em JavaScript, que também tem de monte.</p>
<p>Esse é o mundo real dos sistemas de verdade.</p>
<p><strong>Moral da história</strong></p>
<p>Isso me faz pensar que brigas de <em>fanboys</em> de linguagens <em>&#8211; em frenéticas buscas por prosélitos &#8211;</em> são uma verdadeira piada.</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/08/23/o-quanto-realmente-importa-a-escolha-de-uma-linguagem/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Geração e build de projetos Erlang/OTP</title>
		<link>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/</link>
		<comments>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 03:08:54 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[agilidade]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[ruby]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=358</guid>
		<description><![CDATA[Então não deixe de visitar&#8230; O site é recém-nascido, mas já tem uns recursos bem legais, como sistema de pesquisa por palavras-chave, núvem de tags e entre outros. Vale a pena conferir e acompanhar sua evolução &#8211; e oportunidades de bons trabalhos. Mais uma iniciativa bem interessante da Caelum.]]></description>
			<content:encoded><![CDATA[<p><strong>Então não deixe de visitar&#8230;</strong></p>
<p><a href="http://ondetrabalhar.com"><img class="alignnone" src="http://ondetrabalhar.com/images/ondetrabalhar.png" alt="" width="475" height="118" /></a></p>
<p style="text-align: center;"><a href="http://ondetrabalhar.com"><img class="aligncenter" src="http://ondetrabalhar.com/images/mascote.png" alt="" width="333" height="612" /></a></p>
<p>O site é recém-nascido, mas já tem uns recursos bem legais, como sistema de <a href="http://ondetrabalhar.com/Ruby+or+Rails" target="_blank">pesquisa</a> por palavras-chave, núvem de tags e entre outros. Vale a pena conferir e acompanhar sua evolução <em>&#8211; e oportunidades de bons trabalhos.</em></p>
<p>Mais uma iniciativa bem interessante da <a href="http://blog.caelum.com.br/2009/07/29/ondetrabalharcom-uma-iniciativa-da-caelum/" target="_blank">Caelum</a>. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/07/30/quer-saber-onde-sera-seu-proximo-trabalho/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sua gem funciona bem com JRuby?</title>
		<link>http://leandrosilva.com.br/2009/06/02/sua-gem-funciona-bem-com-jruby/</link>
		<comments>http://leandrosilva.com.br/2009/06/02/sua-gem-funciona-bem-com-jruby/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 12:53:08 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[jruby]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=339</guid>
		<description><![CDATA[Acabei de ler no post Notícias do Front #5 do Fábio Akita uma notícias que me deixou muito feliz: is it jruby? – recentemente a Brightbox lançou o site is it ruby 1.9?, onde a comunidade poderia testar gems e dizer nesse site se ela é ou não compatível, em seus testes, com o ruby [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://isitjruby.com"><img class="alignleft" src="http://isitjruby.com/images/misc/logo.png" alt="" width="216" height="55" /></a></p>
<p>Acabei de ler no post <a href="http://www.akitaonrails.com/2009/06/01/not-cias-do-front-5" target="_blank">Notícias do Front #5</a> do <a href="http://www.akitaonrails.com" target="_blank">Fábio Akita</a> uma notícias que me deixou muito feliz:</p>
<blockquote><p><em><a href="http://isitjruby.com/">is it jruby?</a> – recentemente a Brightbox lançou o site <a href="http://isitruby19.com/">is it ruby 1.9?</a>, onde a comunidade poderia testar gems e dizer nesse site se ela é ou não compatível, em seus testes, com o ruby 1.9. Agora foi lançado mais uma com o mesmo objetivo mas desta vez para avaliar a compatibilidade de gems com o jruby. Mais e mais a comunidade está se conscientizando que as gems precisam receber mais tratamento para ficarem compatíveis com múltiplas virtual machines. Isso é muito bom e espero que todos colaborem.</em></p></blockquote>
<p>Isto porque sou usuário de <a href="http://kenai.com/projects/jruby/pages/Home" target="_blank">JRuby</a> e volta e meia tenho problema com alguma gem que não funciona com ele, por conta de extensões nativas em C.</p>
<p>Então, por caridade, quando fizer uma gem, veja se ela funciona bem com JRuby também. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/06/02/sua-gem-funciona-bem-com-jruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

