<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Desenvolvimento &#193;gil - Blog da Improve It: Tag ruby</title>
    <link>http://blog.improveit.com.br/articles/tag/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Como Testar parte 2 - Mocks</title>
      <description>&lt;blockquote class="excerpt"&gt;
  &lt;p&gt;Tem gente "chutando" Demeter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Minha id&#233;ia era escrever um post dessa s&#233;rie por semana, mas infelizmente uma tendinite tem me atacado e est&#225; meio complicado ficar escrevendo muito. Por isso mesmo esse segundo artigo ser&#225; bem compacto. Todos os c&#243;digos citados nesse post fazem parte de um projeto How Test que est&#225; dispon&#237;vel em: http://github.com/tapajos/how-test&lt;/p&gt;

&lt;p&gt;Nesse post a minha id&#233;ia &#233; mostrar de forma bem simples como funciona um &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;mock object&lt;/a&gt; no Rspec e no Test::Unit(usando o mocha). &lt;/p&gt;

&lt;p&gt;Para exemplificar eu vou fazer uma cr&#237;tica a uma constru&#231;&#227;o que eu tenho visto muito em diversos projetos e que viola a &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Lei de Demeter&lt;/a&gt;(Principle of Least Knowledge). Ou como dizia, o meu amigo, Bernardo, "Tem gente chutando Demeter!". &lt;/p&gt;

&lt;h3&gt;Vamos a um exemplo dessa viola&#231;&#227;o:&lt;/h3&gt;

&lt;p&gt;Supondo que voc&#234; tenha um modelo Account que se relaciona ao modelo User.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Account &amp;lt; ActiveRecord::Base
  belongs_to :user
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Freq&#252;entemente eu vejo constru&#231;&#245;es do tipo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@account.user.name
@account.user.mail
@account.user.rg.number
@account.user.rg.state
@account.user.rg.city
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O grande problema &#233; que nesse tipo de constru&#231;&#227;o voc&#234; est&#225; "conhecendo" coisas demais e certamente vai pagar por isso num futuro breve, quando voc&#234; precisar fazer um refactoring e tiver que mudar em v&#225;rios lugares. Imagina se o User deixa de ter um "name" e passa a ter um "full_name".&lt;/p&gt;

&lt;p&gt;Para resolver esse tipo de problema basta voc&#234; concentrar esse "conhecimento" no seu modelo Account da seguinte forma:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Account &amp;lt; ActiveRecord::Base
  belongs_to :user
  def user_name
    user.name
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;OBS: Vou me concentrar apenas no problema com o nome e n&#227;o vou me preocupar em validar se o relacionamento foi estabelecido.&lt;/p&gt;

&lt;p&gt;Bem, finalizada a cr&#237;tica a uma falha de design OO vamos ao objetivo desse post, mostrar como *EU* testaria esse problema.&lt;/p&gt;

&lt;p&gt;Como eu falei no post anterior, n&#227;o gosto muito de usar fixtures para testes unit&#225;rios e por isso mesmo vou apelar aos &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;mock objects&lt;/a&gt;. Se voc&#234; n&#227;o est&#225; muito familiarizado com mocks sugiro que pare por aqui e leia um pouco mais sobre isso. Uma refer&#234;ncia r&#225;pida pode ser o &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;wikipedia&lt;/a&gt; mas realmente sugiro que v&#225; mais adiante.&lt;/p&gt;

&lt;p&gt;Testando usando RSpec(usando o framework de mock padr&#227;o):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before(:each) do
  @account = Account.new    
  @user_mock = mock_model(User)
  @account.stub!(:user).and_return(@user_mock)
end

describe ".user_name" do

  it "should delegate to user.name" do
    @user_mock.should_receive(:name).and_return("Tapaj&#243;s")
    @account.user_name.should == "Tapaj&#243;s"
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Testando usando Test::Unit com mocha:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;setup :create_model

def test_user_name
  @user_mock.expects(:name).returns("Tapaj&#243;s")
  assert_equal "Tapaj&#243;s", @account.user_name
end

private

  def create_model
    @account = Account.new
    @user_mock = mock("User")
    @account.stubs(:user).returns(@user_mock)
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Explicando...&lt;/h3&gt;

&lt;p&gt;Em ambos os casos eu preciso que a minha account simule o relacionamento com User e para isso eu vou retornar um mock object. Isso &#233; feito pelas linhas:&lt;/p&gt;

&lt;p&gt;RSpec:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@account.stub!(:user).and_return(@user_mock)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Test::Unit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@account.stubs(:user).returns(@user_mock)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ap&#243;s o setup ou o before, temos um modelo @account onde o @account.user retorna um mock.&lt;/p&gt;

&lt;p&gt;Feito isso eu preciso configurar o meu mock, isto &#233;, informar que ele receber&#225; uma mensagem name (chamada do m&#233;todo .name) e essa retornar&#225; o meu nome(sim, sou egoc&#234;ntrico). Isso &#233; feito pelos m&#233;todos "should_receive" e "expects" conforme as linhas abaixo:&lt;/p&gt;

&lt;p&gt;RSpec:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@user_mock.should_receive(:name).and_return("Tapaj&#243;s")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Test::Unit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@user_mock.expects(:name).returns("Tapaj&#243;s")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois que nossos mocks foram devidamente configurados podemos, finalmente, fazer nossa verifica&#231;&#227;o do retorno, isto &#233;, simplesmente chamar nossos m&#233;todos conferir o retorno. Pronto teste feito com sucesso, sem precisar recorrer a banco de dados nem configurar fixtures.&lt;/p&gt;

&lt;p&gt;Nesse momento deve ter surgido uma d&#250;vida: "Porque uma hora voc&#234; usa stub! e outra um should_receive?"&lt;/p&gt;

&lt;p&gt;A resposta &#233; bem simples, o stub! n&#227;o faz um verify no final enquanto a outra chamada sim. Na pratica isso significa:&lt;/p&gt;

&lt;h3&gt;Stub! ou stubs&lt;/h3&gt;

&lt;p&gt;Quando eu uso stub!(ou um Stubs) eu estou configurando o meu modelo account para responder pelo m&#233;todo user retornando o @mock_user por&#233;m n&#227;o me interessa quebrar esse teste caso voc&#234; n&#227;o chame esse m&#233;todo.&lt;/p&gt;

&lt;h3&gt;Should_receive ou expects&lt;/h3&gt;

&lt;p&gt;Quando eu uso should_receive(ou um expects) eu estou configurando o meu mock user para responder pelo m&#233;todo name por&#233;m caso esse m&#233;todo n&#227;o seja chamado eu devo quebrar meu teste, pois isso seria um comportamento indesej&#225;vel.&lt;/p&gt;

&lt;h2&gt;Porque usar mocks?&lt;/h2&gt;

&lt;p&gt;Ao contr&#225;rio do que muita gente pensa o uso de mocks n&#227;o &#233; um bicho de 7 cabe&#231;as, &#233; bem simples. Na verdade testar &#233; algo simples, desde que voc&#234; tenha dom&#237;nio do ferramental e os mocks s&#227;o realmente &#250;teis em diversos casos.&lt;/p&gt;

&lt;p&gt;Imagina que o seu sistema precise fazer consultas a uma api publica do Yahoo e para isso voc&#234; tenha criado uma classe de consultas. Voc&#234; n&#227;o vai querer(nem o Yahoo vai gostar) ir l&#225; no servidor toda vez que voc&#234; rodar os seus testes. Isso tornaria os seus testes lentos e imposs&#237;vel roda-los offline. Nesse caso voc&#234; resolve seu problema "mockando" essa classe.&lt;/p&gt;</description>
      <pubDate>Sun, 16 Nov 2008 18:22:13 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:bf5b906d-9cec-4301-8cd1-f6480e1d406b</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/11/16/como-testar-parte-2-mocks</link>
      <category>rails</category>
      <category>rspec</category>
      <category>rspec_on_rails</category>
      <category>ruby</category>
      <category>test</category>
      <category>Testes</category>
      <category>unit</category>
    </item>
    <item>
      <title>Como Testar parte 1 - Models</title>
      <description>&lt;p&gt;Quando comecei a estudar &lt;a href="http://www.improveit.com.br/xp"&gt;Extreme Programming&lt;/a&gt; descobri que n&#227;o &#233; poss&#237;vel fazer nenhum software de qualidade sem uma excelente base de testes. Desde ent&#227;o tenho me dedicado muito ao estudo das mais diversas ferramentas e t&#233;cnicas para elaborar bons de testes.&lt;/p&gt;

&lt;p&gt;O assunto testes &#233; bastante pol&#234;mico e n&#227;o pretendo (nesse post) tentar convencer ningu&#233;m da import&#226;ncia deles. Se voc&#234; n&#227;o faz testes e/ou discorda de qualquer uma das minhas afirma&#231;&#245;es deixo algumas perguntas para voc&#234; refletir.&lt;/p&gt;

&lt;p&gt;1 - Quantos bugs fixes voc&#234; fez esse ano?&lt;/p&gt;

&lt;p&gt;2 - Quantos tickets abertos existem no seu bug tracker?&lt;/p&gt;

&lt;p&gt;3 - Quantas vezes voc&#234; fez um deploy de uma nova vers&#227;o em uma sexta feira de tarde e saiu mais cedo do trabalho?&lt;/p&gt;

&lt;p&gt;4 - Quantas vezes voc&#234; "virou a noite" esse ano?&lt;/p&gt;

&lt;p&gt;Acabei me tornando um evangelizador de testes por&#233;m nunca fiz nada muito pr&#225;tico para passar o conhecimento que eu adquiri para a comunidade. S&#243; que agora vou me redimir dessa falha iniciando uma s&#233;rie de posts onde vou expor um problema e como EU testaria usando Test::Unit e Rspec. N&#227;o vou falar de Shoulda pois n&#227;o gosto dele. :-)&lt;/p&gt;

&lt;p&gt;A id&#233;ia de escrever essa s&#233;rie de posts sobre testes surgiu logo ap&#243;s a grava&#231;&#227;o do terceiro epis&#243;dio do &lt;a href="http://railsbox.org/2008/9/9/railsbox-podcast-3"&gt;RailsBox&lt;/a&gt; e gostaria de agradecer ao Ozeias e ao Davis Cabral por terem me motivado.&lt;/p&gt;

&lt;p&gt;"Back to the cold cow..."&lt;/p&gt;

&lt;p&gt;O ActiveRecord simplifica muito nossos modelos por&#233;m tenho observado que em v&#225;rios projetos os desenvolvedores deixam de testar corretamente os seus modelos usando a  alega&#231;&#227;o que n&#227;o v&#227;o testar alguma coisa que o Rails j&#225; testou. Esse &#233; um argumento valido em alguns casos pois voc&#234; est&#225; apenas delegando responsabilidades mas voc&#234; sempre deve testar se a responsabilidade foi realmente delegada.&lt;/p&gt;

&lt;p&gt;Um exemplo cl&#225;ssico s&#227;o as valida&#231;&#245;es. Teoricamente voc&#234; n&#227;o precisaria testar como elas s&#227;o implementadas mas deve testar se elas realmente existem pois se algu&#233;m remove-las seus testes v&#227;o continuar passando mas sua aplica&#231;&#227;o estar&#225; quebrada e/ou permitindo inconsist&#234;ncias de banco de dados.&lt;/p&gt;

&lt;p&gt;Nesse post vou mostrar como testar alguns comportamento do ActiveRecord usando como base o modelo User. Todos os c&#243;digos citados nesse post fazem parte de um projeto How Test que est&#225; dispon&#237;vel em: http://github.com/tapajos/how-test&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  validates_presence_of :name
  validates_format_of :mail, 
                      :with =&amp;gt; /([-.\w^@]+@(?:[-\w]+.)+[A-Za-z]{2,4})+/i,
                      :on =&amp;gt; :create,
                      :allow_nil =&amp;gt; true
  has_many :accounts
  named_scope :actives, :conditions =&amp;gt; ["active = ?", true]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Uma boa estrat&#233;gia para orientar o desenvolvimento dos teste &#233; elaborar algumas perguntas que dar&#227;o origem aos seus cen&#225;rios de testes.&lt;/p&gt;

&lt;h3&gt;Valida&#231;&#227;o do nome&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso cadastrar um usu&#225;rio sem nome? N&#227;o&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test:Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_if_check_presence_of_name
  assert !@user.valid?, "Should be invalid"
  assert_equal "can't be blank", @user.errors[:name]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Na primeira linha desse teste o assert recebe um segundo par&#226;metro que por ser opcional n&#227;o &#233; muito comentado mas merece uma aten&#231;&#227;o especial. Esse argumento nada mais &#233; do que a mensagem que ser&#225; exibida quando o teste quebrar. Quando voc&#234; omite esse par&#226;metro o teste quebra exibindo a mensagem 'false is not true' que n&#227;o ajuda muito a entender o que est&#225; acontecendo.&lt;/p&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should reject if name is not given" do
  @user.should have(1).error_on(:name)
  @user.errors[:name].should == "can't be blank"
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Valida&#231;&#227;o do e-mail.&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso criar um registro com um e-mail inv&#225;lido? N&#227;o&lt;/li&gt;
&lt;li&gt;Posso atualizar um regitro com um e-mail inv&#225;lido? Sim&lt;/li&gt;
&lt;li&gt;Posso criar um registro com um e-mail em branco? Sim&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test:Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;VALIDS_MAIL = %w(foo@bar.com foo@bar.com.br foo@globo.com foo@i_hate_the_microsoft.com foo@i_love_my_mac.com)
INVALIDS_MAIL = %w(foobar.com foo@bar i_hate_the_microsoft.com i_love_my_mac.com)

def test_if_reject_invalid_format_os_mail_on_create
  INVALIDS_MAIL.each do |mail|
    @user.mail = mail
    assert !@user.valid?, "Should be invalid when mail is #{mail}"
    assert_equal "is invalid", @user.errors[:mail]
  end
end

def test_if_not_reject_when_mail_is_nil
  @user.name = "Tapaj&#243;s"
  assert @user.valid?, "Should be valid"
end

def test_if_not_check_format_of_mail_on_update
  @user.name = "Tapaj&#243;s"
  assert @user.save, "Should save"
  @user.mail = "an invalid mail"
  assert @user.valid?, "Should be valid"
end

def test_if_accept_a_valid_mail
  VALIDS_MAIL.each do |mail|
    @user.name = "Tapaj&#243;s"
    @user.mail = mail
    assert @user.valid?, "Should be valid when mail is #{mail}"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;INVALIDS_MAIL.each do |mail|
  it "should reject because #{mail} is an invalid mail" do
    @user.mail = mail
    @user.should have(1).error_on(:mail)
    @user.errors[:mail].should == "is invalid"
  end
end

VALIDS_MAIL.each do |mail|
  it "should be valid when mail is #{mail}" do
    @user.mail = mail
    @user.should_not have(1).error_on(:mail)
  end
end

it "should not reject if mail is not given" do
  @user.name = "Tapaj&#243;s"
  @user.should be_valid
end

it "should not check mail format on update" do
    @user.name = "Tapaj&#243;s"
    @user.save.should be_true
    @user.mail = "an invalid mail"
    @user.should be_valid
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Testando o relacionamento com Account.&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Um usu&#225;rio pode ter mais de uma conta? Sim&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test::Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_has_many_accounts
  association = User.reflect_on_association(:accounts)
  assert association, "Association with account is not found"
  assert_equal :has_many, association.macro
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should has many accounts" do
  association = User.reflect_on_association(:accounts)
  association.should_not be_nil
  association.macro.should == :has_many
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Testando o User.actives&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso listar usu&#225;rios inativos? N&#227;o&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test::Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_if_actives_use_the_correct_conditions
  assert_equal({:conditions=&amp;gt;["active = ?", true]}, User.actives.proxy_options)
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should find for all users that status of active is true" do
  User.actives.proxy_options.should == {:conditions=&amp;gt;["active = ?", true]}
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para esse post ficar mais simples e curto n&#227;o me preocupei em validar se o tamanho m&#225;ximo dos campos est&#225; coerente com o tamanho m&#225;ximo permitido pelo tipo no banco de dados. Essa &#233; uma valida&#231;&#227;o EXTREMAMENTE importante que n&#227;o deve ser esquecida!&lt;/p&gt;

&lt;p&gt;No pr&#243;ximo post dessa s&#233;rie falarei um pouco sobre a &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Lei de Demeter&lt;/a&gt;, como respeita-la e testar alguns m&#233;todos usando &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;Mock Objects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O que voc&#234; achou desse artigo? O que voc&#234; gostaria de saber sobre testes de ActiveRecord que eu n&#227;o falei aqui?&lt;/p&gt;

&lt;p&gt;Aguardo o feedback de voc&#234;s.&lt;/p&gt;</description>
      <pubDate>Sun, 26 Oct 2008 02:51:35 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:aa3262eb-fd9b-4304-9bb1-f6ef0d945ee2</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models</link>
      <category>rspec</category>
      <category>test</category>
      <category>unit</category>
      <category>Testes</category>
      <category>ruby</category>
      <category>rails</category>
      <category>rspec_on_rails</category>
    </item>
    <item>
      <title>Mais uma gem no Brazilian Rails</title>
      <description>&lt;p&gt;O Brazilian Rails acabou de ganhar uma gem para lidar com CPF e CNPJ desenvolvida pelo C&#225;ssio Marques. Ele fez um &lt;a href="http://cassiomarques.wordpress.com/2008/09/24/brazilian-rails-agora-com-suporte-a-cpf-e-cnpj/"&gt;post&lt;/a&gt; no seu blog explicando como utilizar.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://tinyurl.com/cpfcnpj
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Al&#233;m dessa nova gem a vers&#227;o 2.0.8 do Brazilian Rails recebeu algumas pequenas corre&#231;&#245;es feitas pelo &lt;a href="http://www.akitaonrails.com/"&gt;Akita&lt;/a&gt; e pelo Sergio Brant.&lt;/p&gt;

&lt;p&gt;Gostaria de agradecer aos tr&#234;s pelas colabora&#231;&#245;es.&lt;/p&gt;</description>
      <pubDate>Tue, 23 Sep 2008 23:20:36 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:ca5f52c6-54b6-450d-81db-08cdb276b1e9</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/09/23/mais-uma-gem-no-brazilian-rails</link>
      <category>gem</category>
      <category>ruby</category>
      <category>rails</category>
      <category>brazilianrails</category>
      <category>cpf</category>
      <category>cnpj</category>
    </item>
    <item>
      <title>Integration Plugin com GIT</title>
      <description>&lt;p&gt;Agora o &lt;a href="http://integration.rubyforge.org/"&gt;Integration Plugin&lt;/a&gt; suporta GIT!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.improveit.com.br/files/2008-06-25_intplugin.gif" alt="intplugin"/&gt;&lt;/p&gt;

&lt;p&gt;Desde o lan&#231;amento do &lt;a href="http://integration.rubyforge.org/"&gt;Integration Plugin&lt;/a&gt; eu tinha a sensa&#231;&#227;o que faltava o suporte ao GIT por&#233;m como o &lt;a href="http://integration.rubyforge.org/"&gt;plugin&lt;/a&gt; foi extra&#237;do dos nossos c&#243;digos e n&#227;o us&#225;vamos esse SCM ele foi lan&#231;ado assim mesmo.&lt;/p&gt;

&lt;p&gt;Logo depois o &lt;a href="http://tudoquequerosaber.com/"&gt;Eduardo Fiorezi&lt;/a&gt; me enviou um patch adicionando esse suporte e posteriormente o suporte ao git-svn s&#243; que eu n&#227;o aceitei de imediato pois faltava documentar e eu estava completamente sem tempo para isso. S&#243; que hoje recebi um patch do &lt;a href="http://mergulhao.info/"&gt;Sylvestre Mergulh&#227;o&lt;/a&gt; atualizando a documenta&#231;&#227;o.&lt;/p&gt;

&lt;p&gt;Obrigado aos dois!&lt;/p&gt;</description>
      <pubDate>Wed, 25 Jun 2008 20:31:35 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:846af183-4877-439b-92ad-e902b1c3dc77</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/06/25/integration-plugin-com-git</link>
      <category>integration</category>
      <category>plugin</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Brazilian Rails no github</title>
      <description>&lt;p&gt;Acabei de terminar a migra&#231;&#227;o do plugin &lt;a href="http://brazilian-rails.rubyforge.org/"&gt;Brazilian Rails&lt;/a&gt; para o &lt;a href="http://github.com/"&gt;github&lt;/a&gt;. Achei que ia ser bem mais complicado do que foi ! :-)&lt;/p&gt;

&lt;p&gt;N&#243;s decidimos manter o &lt;a href="svn://rubyforge.org/var/svn/brazilian-rails"&gt;SVN&lt;/a&gt; como um espelho (por um tempo) para facilitar a instala&#231;&#227;o nas vers&#245;es anteriores a Rails Edge. Agora existem duas formas de instala&#231;&#227;o que est&#227;o detalhadas na &lt;a href="http://brazilian-rails.rubyforge.org/"&gt;p&#225;gina&lt;/a&gt; do plugin.&lt;/p&gt;

&lt;p&gt;Para quem quiser acompanhar o projeto a url no &lt;a href="http://github.com/"&gt;github&lt;/a&gt; &#233;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/tapajos/brazilian-rails"&gt;http://github.com/tapajos/brazilian-rails&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 22 Apr 2008 15:33:13 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:f685cf7c-f485-4dea-8896-4426d2424b75</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/04/22/brazilian-rails-no-github</link>
      <category>git</category>
      <category>github</category>
      <category>brazilianrails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Nova P&#225;gina para o Brazilian Rails</title>
      <description>&lt;p&gt;Hoje o &lt;a href="http://brazilian-rails.rubyforge.org/"&gt;Brazilian Rails&lt;/a&gt; ganhou um &lt;a href="http://brazilian-rails.rubyforge.org/"&gt;site&lt;/a&gt; um pouco mais bonitinho com um design igual ao do nosso outro &lt;a href="http://integration.rubyforge.org/"&gt;plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na verdade esse &#233; um template, de autoria do &lt;a href="http://www.improveit.com.br"&gt;Leandro&lt;/a&gt;, que ser&#225; usado em todos os nossos plugins. S&#243; n&#227;o est&#225; mais bonito pois resolvi meter a m&#227;o e me antecipar ao &lt;a href="http://www.improveit.com.br"&gt;Leandro&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Mar 2008 19:47:57 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:2472e736-c276-49c8-a948-7150a5e744e6</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/03/25/nova-p%C3%A1gina-para-o-brazilian-rails</link>
      <category>brazilianrails</category>
      <category>plugin</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Brazilian Rails: Patch aceito.</title>
      <description>&lt;p&gt;Como sempre estou atrasado e s&#243; hoje vi alguns patch no &lt;a href="http://brazilian-rails.rubyforge.org/api"&gt;Brazilian Rails&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Patch #17896 - usar_como_dinheiro n&#227;o funciona com audit.&lt;/h3&gt;

&lt;p&gt;O &lt;a href="http://mergulhao.info/"&gt;Sylvestre Mergulh&#227;o&lt;/a&gt; identificou uma incompatibilidade do &lt;a href="http://brazilian-rails.rubyforge.org/api"&gt;plugin&lt;/a&gt; com o &lt;a href="http://agilewebdevelopment.com/plugins/acts_as_audited"&gt;audit&lt;/a&gt; que n&#227;o fazia log das colunas mapeadas com o usar_como_dinheiro.
O patch que ele enviou j&#225; foi aceito.&lt;/p&gt;

&lt;h3&gt;Patch #18822 - Cria&#231;&#227;o de metodos para que o select_estado funcione com o form_for.&lt;/h3&gt;

&lt;p&gt;Esse patch foi enviado pelo Rafael Cardoso e &#233; bastante pertinente s&#243; que n&#227;o foi aceito ainda pois o patch foi gerado de forma incorreta.
Ele j&#225; fez contato comigo e vai enviar o patch correto em breve.&lt;/p&gt;

&lt;p&gt;Queria agradecer aos dois pela colabora&#231;&#227;o constante. J&#225; perdi a conta de quantas vezes aceitei c&#243;digo deles.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Mar 2008 05:44:23 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:c3fc9845-bcb4-449e-85e5-5a03ce77bdb2</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/03/25/brazilian-rails-patch-aceito</link>
      <category>brazilianrails</category>
      <category>rails</category>
      <category>ruby</category>
      <category>audit</category>
    </item>
    <item>
      <title>Ruby on Rails Integration Plugin</title>
      <description>&lt;p&gt;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Continuous Integration&lt;/a&gt; is a very important practice for us. The problem is that we never liked the way it's done most of the time, using a server such as &lt;a href="http://cruisecontrol.sourceforge.net"&gt;Cruise Control&lt;/a&gt;. So we prefer to do what we call a &lt;a href="http://jamesshore.com/Blog/Why%20I%20Dont%20Like%20CruiseControl.html"&gt;synchronous continuous integration&lt;/a&gt;. &lt;a href="http://jamesshore.com/Blog/Why%20I%20Dont%20Like%20CruiseControl.html"&gt;James Shore wrote some time ago&lt;/a&gt; exactly what we've always felt about the &lt;a href="http://cruisecontrol.sourceforge.net"&gt;Cruise Control&lt;/a&gt; approach.   &lt;/p&gt;

&lt;p&gt;All of our projects have a set of automations in place that help us on the integration process. Since our very first &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; project, we've been using some rake tasks to integrate our projects. They've been evolving so far and last week we decided to refactor them, polish and publish as a &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; plugin called &lt;a href="http://integration.rubyforge.org"&gt;Integration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://integration.rubyforge.org"&gt;Integration&lt;/a&gt; is an almost paranoid set of integration tasks that will help you maintain your projects healthy and your repository clean. Once you've installed it, all you have to do is run the command below whenever you want to integrate some code:&lt;/p&gt;

&lt;p&gt;rake integrate&lt;/p&gt;

&lt;p&gt;Ok, let's be honest here. You'll probably need to configure a few things. &lt;a href="http://integration.rubyforge.org"&gt;Read the project page&lt;/a&gt; and you should be fine. If you manage to use all the tasks in your project, let us know. Somehow, we believe this won't happen very often... You'll see! :-)&lt;/p&gt;

&lt;p&gt;Go ahead. &lt;a href="http://integration.rubyforge.org"&gt;Checkout the Integration plugin&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Wed, 12 Mar 2008 22:31:31 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:05d1e984-9152-4f49-bc47-3e5f6ac77a6c</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2008/03/12/ruby-on-rails-integration-plugin</link>
      <category>plugin</category>
      <category>rails</category>
      <category>ruby</category>
      <category>continuous integration</category>
    </item>
    <item>
      <title>Brazilian Rails - Demorou mas agora foi !</title>
      <description>&lt;p&gt;Depois de muito tempo(ou falta de tempo) resolvi solucionar alguns bugs reportados no &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quem quiser saber de mais detalhes sobre os bugs pode dar uma olhada l&#225; na &lt;a href="http://rubyforge.org/tracker/?atid=15412&amp;amp;group_id=4003&amp;amp;func=browse"&gt;p&#225;gina do projeto no RubyForge&lt;/a&gt;. Vou apenas listar as repostas que eu dei a cada um deles.&lt;/p&gt;

&lt;h4&gt;Bug 17663 - Inclus&#227;o da valida&#231;&#227;o less-than-or-equal-to&lt;/h4&gt;

&lt;p&gt;Regis, realmente estava faltando essa messagem. J&#225; foi adicionada.
Obrigado.&lt;/p&gt;

&lt;h4&gt;Bug 17664 - Pluraliza&#231;&#227;o correta para 'mail' e 'email'&lt;/h4&gt;

&lt;p&gt;Regis, realmente estava faltando essa regra. J&#225; foi adicionada. 
Obrigado.&lt;/p&gt;

&lt;h4&gt;Bug 17439 - Atributos possuem g&#234;nero, fazendo com que alguns erros apare&#231;am com erros de concord&#226;ncia.&lt;/h4&gt;

&lt;p&gt;Lucas, n&#227;o foi poss&#237;vel aceitar seu patch pois ele n&#227;o est&#225; acompanhado de testes. Umas das nossas restri&#231;&#245;es com rela&#231;&#227;o a patch e novas funcionalidades &#233; que todas devem ser acompanhada de testes.
Entretanto o problema que voc&#234; relatou &#233; realmente relevante e por isso mesmo deixarei o bug em aberto para que, quando poss&#237;vel, algum dos desenvolvedores corrija.
Caso seja do seu interesse evoluir seu c&#243;digo para virar um patch que atenda as exig&#234;ncias do projeto a equipe estar&#225; a disposi&#231;&#227;o para te ajudar no que for necess&#225;rio.&lt;/p&gt;

&lt;h4&gt;Bug 18022 - Conflito de plugin.&lt;/h4&gt;

&lt;p&gt;Realmente confirmei que existe essa incompatibilidade. N&#227;o analisei mais a fundo o problema mas ao que me parece o plugin ActiveScaffoldLocalize modifica a forma como as valida&#231;&#245;es s&#227;o armazenadas e seus usos. Como apenas traduzimos, sem mudar nada, temos problemas sempre que o nosso plugin &#233; iniciado ap&#243;s o ActiveScaffoldLocalize.
Estou analisando a melhor forma de solucionar esse problema.
Com rela&#231;&#227;o ao link no Readme ele est&#225; correto. O segundo link nessa sua mensagem est&#225; errado pois o protocolo usado n&#227;o &#233; o http. O link correto &#233; o do Readme (svn://rubyforge.org/projects/brazilian-rails/). &lt;/p&gt;

&lt;h4&gt;Bug 18077 - usar&lt;em&gt;_&lt;/em&gt;como_dinheiro&lt;/h4&gt;

&lt;p&gt;O usar&lt;em&gt;_&lt;/em&gt;como_dinheiro foi planejado para funcionar com o Active Record. Ele utiliza coisas espec&#237;ficas do Active Record, como, por exemplo, as valida&#231;&#245;es.
Para utilizar em modelos que n&#227;o tem heran&#231;a do Active Record &#233; necess&#225;rio fazer uma nova implementa&#231;&#227;o que no momento n&#227;o est&#225; planejada mas quem sabe num futuro pr&#243;ximo possa ser feita.&lt;/p&gt;

&lt;p&gt;Gostaria de agradecer a todos pelo feedback mas em especial ao Regis que mandou duas solu&#231;&#245;es prontas. Prometo tentar responder mais rapidamente.&lt;/p&gt;</description>
      <pubDate>Sat, 08 Mar 2008 13:43:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:75a346d4-e761-4e03-8eac-9c0e7f2370a1</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/03/08/brazilian-rails-demorou-mas-agora-foi</link>
      <category>brazilianrails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Plugin Brazilian Rails atualizado</title>
      <description>&lt;p&gt;O &lt;a href="http://www.improveit.com.br/vinicius"&gt;Vin&#237;cius&lt;/a&gt; e o pessoal do Lucidus, andaram corrigindo alguns comportamentos indesej&#225;veis na classe &lt;a href="http://brazilian-rails.improveit.com.br/classes/Dinheiro.html"&gt;dinheiro&lt;/a&gt; quando ela era usada em composi&#231;&#227;o no Active Record. Agora o m&#233;todo usar&lt;em&gt;_&lt;/em&gt;como_dinheiro tem o mesmo comportamento das composi&#231;&#245;es com Date.&lt;/p&gt;

&lt;p&gt;Al&#233;m disso o &lt;a href="http://www.improveit.com.br/rafael"&gt;Rafael&lt;/a&gt; e o Sylvestre identificaram um comportamento que apesar de n&#227;o ser um bug n&#227;o fazia muito sentido. Quando um &lt;a href="http://brazilian-rails.improveit.com.br/classes/Dinheiro.html"&gt;dinheiro&lt;/a&gt; era comparado com alguma coisa que n&#227;o era &lt;a href="http://brazilian-rails.improveit.com.br/classes/Dinheiro.html"&gt;Dinheiro&lt;/a&gt; ele lan&#231;ava uma exce&#231;&#227;o ao inv&#233;s de retornar false. Esse &#233; um comportamento que foge ao padr&#227;o do &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;. Normalmente em &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; objetos diferentes podem ser comparados e o retorno ser&#225; false.
Exemplos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"a" == Date.today
false
"a" == 1
false
"a" == Dinheiro.new(1)
false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como estou preso no aeroporto de Curitiba, sem nada para fazer, acabei de aplicar o patch que eles enviaram. Obrigado pessoal !&lt;/p&gt;</description>
      <pubDate>Sat, 22 Dec 2007 05:08:00 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:479dce30-d5a1-426a-a21b-8b5f29a79965</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/12/22/plugin-brazilian-rails-atualizado</link>
      <category>brazilianrails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Rails for Kids 2007</title>
      <description>&lt;p&gt;Os eventos de &lt;a href="http://www.rubyonrails.com.br"&gt;Rails&lt;/a&gt; est&#227;o chegando. Agora &#233; hora de divulgar a iniciativa do &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos Eduardo&lt;/a&gt;, da &lt;a href="http://www.egenial.com.br"&gt;e-Genial&lt;/a&gt;. Ele est&#225; promovendo o &lt;a href="http://blog.egenial.com.br/?p=101"&gt;Rails for Kids 2007&lt;/a&gt;, que acontecer&#225; no dia 15 de dezembro de 2007 a partir das 9h.  &lt;/p&gt;

&lt;p&gt;O &lt;a href="http://blog.egenial.com.br/?p=101"&gt;Rails for Kids 2007&lt;/a&gt; &#233; uma maratona de palestras online sobre &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; e &lt;a href="http://www.rubyonrails.com.br"&gt;Ruby on Rails&lt;/a&gt; via &lt;a href="http://www.treinatom.com.br"&gt;Treina TOM&lt;/a&gt;, que contar&#225; com os seguintes palestrantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carl Younblood - Surgeworks LLC (EUA)&lt;/li&gt;
&lt;li&gt;Demetrius Nunes&lt;/li&gt;
&lt;li&gt;Eduardo Fiorezi&lt;/li&gt;
&lt;li&gt;Fabio Akita&lt;/li&gt;
&lt;li&gt;Rodrigo Urubatan&lt;/li&gt;
&lt;li&gt;Ronaldo Ferraz&lt;/li&gt;
&lt;li&gt;Shairon Toledo&lt;/li&gt;
&lt;li&gt;Vinicius Manh&#227;es Teles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O evento ser&#225; beneficente e ser&#225; cobrado uma pequena taxa de R$25,00. Todo dinheiro ganho ser&#225; doado para a &lt;a href="http://www.cotolengo.com.br/"&gt;Cotolengo MS&lt;/a&gt;, institui&#231;&#227;o que cuida de portadores de necessidades especiais de qualquer idade.  &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cotolengo.com.br/"&gt;&lt;img src="http://blog.improveit.com.br/files/cotolengo.jpg" alt="Cotolengo" title="Cotolengo"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em breve o &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos&lt;/a&gt; ir&#225; lan&#231;ar o site do evento com mais detalhes, ent&#227;o fique atento!&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 09:29:00 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:aa4da8ca-0385-4688-87e4-31d1b1f5d97b</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2007/10/29/rails-for-kids-2007</link>
      <category>ruby</category>
      <category>rails</category>
      <category>confer&#234;ncia</category>
    </item>
    <item>
      <title>Segundo Semin&#225;rio Ruby on Rails</title>
      <description>&lt;p&gt;No dia 27 de outubro ocorrer&#225; o &lt;a href="http://www.temporealeventos.com.br/?area=77"&gt;Segundo Semin&#225;rio Ruby on Rails&lt;/a&gt;, em S&#227;o Paulo. Mais uma vez, o evento ser&#225; promovido pela &lt;a href="http://www.temporealeventos.com.br/?area=77"&gt;Tempo Real Eventos&lt;/a&gt; e contar&#225; com &#243;timas apresenta&#231;&#245;es de pessoas que est&#227;o usando o &lt;a href="http://www.rubyonrails.com.br"&gt;Ruby on Rails&lt;/a&gt; para valer. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.improveit.com.br/files/seminario-rubyonrails.jpg" alt="Semin&#225;rio Ruby on Rails" title="Semin&#225;rio Ruby on Rails"/&gt;&lt;/p&gt;

&lt;p&gt;Na parte da manh&#227; teremos o &lt;a href="http://eustaquiorangel.com"&gt;TaQ&lt;/a&gt; e o &lt;a href="http://mecanicamente.blogspot.com"&gt;Ronie&lt;/a&gt; falando sobre o que aconteceu no mundo &lt;a href="http://www.ruby-lang.org/en"&gt;Ruby&lt;/a&gt; e &lt;a href="http://www.rubyonrails.com.br"&gt;Rails&lt;/a&gt; do ano passado para c&#225;. Depois um tutorial no melhor estilo "show me the code", promovido pelo pessoal da &lt;a href="http://www.dextra.com.br"&gt;Dextra&lt;/a&gt;. A manh&#227; encerra com a apresenta&#231;&#227;o de &lt;a href="http://forum.divdev.railsplayground.net/forums/4/topics/2142"&gt;posters&lt;/a&gt;. Ali&#225;s, essa &#233; uma id&#233;ia bacana. &lt;/p&gt;

&lt;p&gt;Nesse ano os organizadores querem mostrar ao p&#250;blico o m&#225;ximo de cases, para que as pessoas saibam o que vem sendo feito com o &lt;a href="http://www.rubyonrails.com.br"&gt;Rails&lt;/a&gt; no Brasil. Se voc&#234; quiser apresentar o seu case, veja &lt;a href="http://forum.divdev.railsplayground.net/forums/4/topics/2142"&gt;o que fazer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A parte da tarde come&#231;a com a apresenta&#231;&#227;o do &lt;a href="http://blog.improveit.com.br/articles/2007/05/15/xp-rio-conheca-o-projeto-xp-do-grupo-santa-isabel"&gt;Projeto Lucidus&lt;/a&gt;, que ser&#225; feita por mim e outras pessoas da equipe. Haver&#225; tamb&#233;m apresenta&#231;&#227;o de outros &lt;a href="http://forum.divdev.railsplayground.net/forums/4/topics/2142"&gt;posters&lt;/a&gt;, o &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos Eduardo&lt;/a&gt;, falar&#225; sobre o case da &lt;a href="http://www.egenial.com.br"&gt;e-Genial&lt;/a&gt; e o &lt;a href="http://logbr.reflectivesurface.com"&gt;Ronaldo Ferraz&lt;/a&gt; vai falar da &lt;a href="http://www.bitbucket.com.br"&gt;Bitbucket&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Acredito que esse ser&#225; um &#243;timo evento, ainda melhor que o do ano passado. N&#243;s da &lt;a href="http://www.improveit.com.br"&gt;Improve It&lt;/a&gt; iremos comparecer em massa e estamos ansiosos para participar e conhecer algumas pessoas com as quais convivemos no mundo virtual, mas nunca tivemos a chance de conhecer pessoalmente, como o &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos Eduardo&lt;/a&gt;, o &lt;a href="http://logbr.reflectivesurface.com"&gt;Ronaldo Ferraz&lt;/a&gt;, entre outros.&lt;/p&gt;</description>
      <pubDate>Thu, 20 Sep 2007 09:33:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:ca5fc5d8-a300-4dc4-9a74-f35498ca4e2f</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2007/09/20/segundo-seminario-ruby-on-rails</link>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Plugin Brazilian Rails atualizado.</title>
      <description>&lt;p&gt;Acabei de atualizar o plugin Brazilian Rails adicionando uma classe para lidar com dinheiro.&lt;/p&gt;

&lt;p&gt;No plugin existe um arquivo com os exemplos de como usar cada uma dessas novas funcionalidades.&lt;/p&gt;</description>
      <pubDate>Mon, 03 Sep 2007 07:04:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:c0be06fa-9a45-4b2c-bbb5-e3fb9fae70be</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/09/03/plugin-brazilian-rails-atualizado</link>
      <category>rails</category>
      <category>ruby</category>
      <category>brazilianrails</category>
    </item>
    <item>
      <title>XP: melhor em Java ou em Ruby?</title>
      <description>&lt;p&gt;Alan Kloh e Rodolfo Burla foram meus alunos na &lt;a href="http://www.ufrj.br"&gt;UFRJ&lt;/a&gt; em 2006. Esse ano, para encerrar a gradua&#231;&#227;o, eles fizeram um Projeto de Fim de Curso que comparou &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt; e &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa&#231;&#227;o%29"&gt;Ruby&lt;/a&gt; sob o ponto de vista das pr&#225;ticas do &lt;a href="http://www.improveit.com.br/xp"&gt;XP&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Eles desenvolveram duas vers&#245;es de um mesmo sistema, uma em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt; e outra em &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa&#231;&#227;o%29"&gt;Ruby&lt;/a&gt;. A partir da&#237;, fizeram um comparativo entre a facilidade de ado&#231;&#227;o das pr&#225;ticas do &lt;a href="http://www.improveit.com.br/xp"&gt;XP&lt;/a&gt; no desenvolvimento de cada vers&#227;o. Al&#233;m do comparativo, o trabalho tamb&#233;m apresenta aspectos interessantes de cada linguagem, bem como seus pontos fortes e fracos.&lt;/p&gt;

&lt;p&gt;Alguns resultados interessantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linhas de c&#243;digo em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt;: 665. Linhas de c&#243;digo em &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa&#231;&#227;o%29"&gt;Ruby&lt;/a&gt;: 78. Portanto, foram necess&#225;rias 8,5 vezes mais linhas de c&#243;digo em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Linhas nos arquivos de configura&#231;&#227;o em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt;: 449. Linhas nos arquivos de configura&#231;&#227;o em &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa&#231;&#227;o%29"&gt;Ruby&lt;/a&gt;: 23. Foram necess&#225;rias 19,5 vezes mais linhas de configura&#231;&#227;o em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt;! Detalhe importante: A quantidade de linhas de configura&#231;&#227;o em &lt;a href="http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa&#231;&#227;o%29"&gt;Java&lt;/a&gt; foi 5,7 vezes maior que a quantidade de linhas de &lt;strong&gt;c&#243;digo&lt;/strong&gt; em &lt;a href="http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa&#231;&#227;o%29"&gt;Ruby&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para conhecer o trabalho, baixe o &lt;a href="http://blog.improveit.com.br/files/comparativo-java-ruby-para-xp.pdf"&gt;arquivo&lt;/a&gt; com o projeto de fim-de-curso: &lt;a href="http://blog.improveit.com.br/files/comparativo-java-ruby-para-xp.pdf"&gt;Comparativo entre as linguagens de programa&#231;&#227;o Java e Ruby para projetos que utilizem Extreme Programming&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 23 Aug 2007 04:22:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:2d2df63f-4366-4636-9002-7d80532bc2ce</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2007/08/23/xp-melhor-em-java-ou-em-ruby</link>
      <category>ruby</category>
      <category>xp</category>
      <category>agile</category>
    </item>
    <item>
      <title>Problema no Brazilian Rails corrigido.</title>
      <description>&lt;p&gt;Uma das nossas premissas &#233; que o nosso &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;plugin&lt;/a&gt; nunca deve conflitar com o padr&#227;o do &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;, ou seja, uma aplica&#231;&#227;o j&#225; em funcionamento deve ser capaz de instalar o &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;plugin&lt;/a&gt; e n&#227;o parar de funcionar.&lt;/p&gt;

&lt;p&gt;Essa preocupa&#231;&#227;o surgiu quando ao modificar o to_s da classe &lt;a href="http://www.ruby-doc.org/core/classes/Date.html"&gt;Date&lt;/a&gt; minha aplica&#231;&#227;o parou de funcionar j&#225; que eu esperava um formato diferente de "%d/%m/%Y". Resolvi criando um outro m&#233;todo chamado to_s_br e mantendo o to_s original.&lt;/p&gt;

&lt;p&gt;Hoje o Kristopher Murata me chamou a aten&#231;&#227;o para um problema, que ontem mesmo eu tinha notado e comentado com o Celestino Gomes, que o nosso &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;plugin&lt;/a&gt; estava quebrando essa nossa premissa ao modificar as regras de pluraliza&#231;&#227;o do &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para corrigi esse problema eu retirei uma linha do init.rb do &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;plugin&lt;/a&gt; deixando a inclus&#227;o dessa funcionalidade opcional atrav&#233;s da adi&#231;&#227;o de uma linha ao enviroment.rb&lt;/p&gt;

&lt;p&gt;Gostaria de agradecer o &lt;a href="http://www.improveit.com.br/xp/valores/feedback"&gt;feedback&lt;/a&gt; do Kristopher.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Aug 2007 18:59:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:1d04b928-ddf2-4de9-a632-9cd6a7f6e45e</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/08/02/problema-no-brazilian-rails-corrigido</link>
      <category>rails</category>
      <category>ruby</category>
      <category>plugin</category>
      <category>feedback</category>
      <category>brazilian</category>
      <category>brazilianrails</category>
    </item>
    <item>
      <title>Plugin Brazilian Rails Atualizado</title>
      <description>&lt;p&gt;Acabei de atualizar o plugin &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;Brazilian Rails&lt;/a&gt; adicionando ao m&#233;todo to_date da classe String a capacidade de lidar com datas no formato "DD/MM/AAAA".&lt;/p&gt;

&lt;p&gt;A classe Date recebeu um m&#233;todo chamado to&lt;em&gt;_&lt;/em&gt;s_br que gera uma string com a formata&#231;&#227;o "DD/MM/AAAA".&lt;/p&gt;

&lt;p&gt;Foi criado o m&#233;todo est&#225;tico valid? na classe Date para validar os formatos da data e o seu conte&#250;do.&lt;/p&gt;

&lt;p&gt;No plugin existe um arquivo com os exemplos de como usar cada uma dessas novas funcionalidades.&lt;/p&gt;

&lt;h2&gt;Atualizado em 31/07/2007 &#224;s 22:46&lt;/h2&gt;

&lt;p&gt;Tamb&#233;m foram adicionadas as tradu&#231;&#245;es para os nomes do meses e dos dias e suas respectivas abrevia&#231;&#245;es.&lt;/p&gt;</description>
      <pubDate>Tue, 31 Jul 2007 18:55:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:395418e7-8009-4887-a77f-f93c3092f8d2</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/07/31/plugin-brazilian-rails-atualizado</link>
      <category>rails</category>
      <category>ruby</category>
      <category>plugin</category>
      <category>feedback</category>
      <category>brazilian</category>
      <category>brazilianrails</category>
    </item>
    <item>
      <title>Improvecast 9: Entrevista com Carlos Eduardo na S&#233;rie Ruby on Rails</title>
      <description>&lt;p&gt;Acaba de ser publicado o &lt;a href="http://www.improveit.com.br/podcast/improvecast-9-entrevista-carlos-eduardo-ruby-on-rails"&gt;Improvecast 9&lt;/a&gt; no qual entrevistei &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos Eduardo&lt;/a&gt;, da &lt;a href="http://www.egenial.com.br/"&gt;e-Genial&lt;/a&gt;. Conversamos sobre desenvolvimento de aplica&#231;&#245;es &lt;a href="http://en.wikipedia.org/wiki/Rich_internet_application"&gt;RIA&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Rich_internet_application"&gt;Rich Internet Applications&lt;/a&gt;) utilizando &lt;a href="http://www.rubyonrails.com.br/"&gt;Ruby on Rails&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Adobe_Flex"&gt;Flex&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.improveit.com.br/files/carlos_eduardo.jpg" alt="Carlos Eduardo e-Genial" title="Carlos Eduardo e-Genial"/&gt;&lt;/p&gt;

&lt;p&gt;Tamb&#233;m falamos sobre a experi&#234;ncia de trabalhar em casa, longe dos grandes centros e do ambiente de aprendizagem &lt;a href="http://www.treinatom.com.br/"&gt;Treina TOM&lt;/a&gt;, desenvolvido pela &lt;a href="http://www.egenial.com.br/"&gt;e-Genial&lt;/a&gt;. O &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;Carlos&lt;/a&gt; &#233; uma figura muito conhecida e querida na comunidade brasileira de desenvolvimento &lt;a href="http://www.rubyonrails.com.br/"&gt;Rails&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Adobe_Flex"&gt;Flex&lt;/a&gt;. J&#225; escrevemos sobre ele em duas ocasi&#245;es: &lt;a href="http://blog.improveit.com.br/articles/2007/01/21/flex-e-genial-scaffold"&gt;aqui&lt;/a&gt; e &lt;a href="http://blog.improveit.com.br/articles/2007/06/29/genial-flex-e-rails-em-um-mundo-plano"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esses foram alguns dos assuntos tratados no &lt;a href="http://www.improveit.com.br/podcast/improvecast-9-entrevista-carlos-eduardo-ruby-on-rails"&gt;podcast&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que &#233; a &lt;a href="http://www.egenial.com.br/"&gt;e-Genial&lt;/a&gt; e em que &#225;reas ela atua?&lt;/li&gt;
&lt;li&gt;O que o levou a adotar o &lt;a href="http://www.rubyonrails.com.br/"&gt;Rails&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;O que &#233; o &lt;a href="http://en.wikipedia.org/wiki/Adobe_Flex"&gt;Adobe Flex&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;O que o levou a adotar o &lt;a href="http://en.wikipedia.org/wiki/Adobe_Flex"&gt;Flex&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;O que &#233; um &lt;a href="http://www.adobe.com/communities/experts"&gt;Adobe Community Expert&lt;/a&gt; e como voc&#234; te tornou um?&lt;/li&gt;
&lt;li&gt;O que &#233; o &lt;a href="http://www.treinatom.com.br/"&gt;Treina Tom&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Como est&#225; sendo o resultado da primeira turma do &lt;a href="http://www.egenial.com.br/curso"&gt;Curso de Flex e Ruby on Rails&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Como &#233; trabalhar em casa, com sua esposa, em Chapad&#227;o do Sul, longe dos grandes centros? &lt;/li&gt;
&lt;li&gt;Quais os aspectos positivos dessa abordagem?&lt;/li&gt;
&lt;li&gt;Quais as dificuldades que essa abordagem de trabalho traz?&lt;/li&gt;
&lt;li&gt;Planos para o futuro e novos produtos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao final da conversa, anunciamos uma novidade. Na sexta-feira da pr&#243;xima semana, dia &lt;strong&gt;20 de julho de 2007&lt;/strong&gt;, &#224;s &lt;strong&gt;20:30h&lt;/strong&gt;, farei uma palestra gratuita sobre &lt;a href="http://www.improveit.com.br/xp"&gt;Extreme Programming&lt;/a&gt; atrav&#233;s do &lt;a href="http://www.treinatom.com.br/"&gt;Treina TOM&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.improveit.com.br/xp"&gt;Extreme Programming&lt;/a&gt;&lt;/strong&gt;: Aprenda como encantar seus usu&#225;rios desenvolvendo software com agilidade e alta qualidade.&lt;/p&gt;

&lt;p&gt;Para participar da palestra, voc&#234; dever&#225; &lt;a href="http://www.egenial.com.br/betaEventos"&gt;acessar o Treina TOM&lt;/a&gt; no dia do evento, atrav&#233;s desse &lt;a href="http://www.egenial.com.br/betaEventos"&gt;link&lt;/a&gt;. Vale lembrar que hoje (13/07/2007), &#224;s 20:30h, &#233; dia da &lt;a href="http://blog.egenial.com.br/?p=61"&gt;palestra gratuita&lt;/a&gt; do &lt;a href="http://www.akitaonrails.com"&gt;F&#225;bio Akita&lt;/a&gt; no &lt;a href="http://www.treinatom.com.br/"&gt;Treina TOM&lt;/a&gt;. O tema &#233;: &lt;strong&gt;JRuby, o melhor de dois mundos&lt;/strong&gt;. Para quem n&#227;o conhece, &lt;a href="http://www.akitaonrails.com"&gt;F&#225;bio Akita&lt;/a&gt; &#233; autor do excelente &lt;a href="http://www.brasport.com.br/index.php?Escolha=8&amp;amp;Livro=L00209"&gt;Repensando a Web com Rails&lt;/a&gt;, que &#233; uma das principais refer&#234;ncias sobre &lt;a href="http://www.rubyonrails.com.br/"&gt;Rails&lt;/a&gt; no Brasil.&lt;/p&gt;</description>
      <pubDate>Fri, 13 Jul 2007 14:07:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:5361a0b8-0642-4c22-8055-95643a362377</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2007/07/13/improvecast-9-entrevista-carlos-eduardo-serie-ruby-on-rails</link>
      <category>rails</category>
      <category>flex</category>
      <category>ruby</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Plugin Brazilian Rails Atualizado</title>
      <description>&lt;p&gt;Acabei de atualizar o plugin &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;Brazilian Rails&lt;/a&gt; adicionando ao modulo Inflector algumas regras de forma&#231;&#227;o de plural para o portugu&#234;s.&lt;/p&gt;</description>
      <pubDate>Sun, 08 Jul 2007 15:33:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:777f395d-22b9-4d88-9782-d7257d059c6e</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/07/08/plugin-brazilian-rails-atualizado</link>
      <category>rails</category>
      <category>ruby</category>
      <category>plugin</category>
      <category>feedback</category>
      <category>brazilian</category>
      <category>brazilianrails</category>
    </item>
    <item>
      <title>Plugin Brazilian Rails</title>
      <description>&lt;p&gt;Acabei de publicar no &lt;a href="http://www.rubyforge.org"&gt;RubyForge&lt;/a&gt; a primeira vers&#227;o do plugin &lt;a href="http://rubyforge.org/projects/brazilian-rails/"&gt;Brazilian Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Desde que eu comecei a programar em &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;, usando o &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, sempre adorei o sistema de plugins, onde facilmente podemos incorporar novas funcionalidades que atendem a v&#225;rios projetos. &lt;/p&gt;

&lt;p&gt;Sempre tive vontade de colocar nossos c&#243;digos dispon&#237;veis como plugins mas nunca tive tempo para fazer isso. Inevitavelmente continuo sem tempo mas agora estou contando com um time de amigos que resolveram me ajudar. S&#227;o eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Andr&#233; Luiz Kupkovski (&lt;a href="http://www.ancar.com.br"&gt;Ancar&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Celestino Ferreira Gomes (&lt;a href="http://www.ancar.com.br"&gt;Ancar&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rafael Fraga Walter (&lt;a href="http://www.ancar.com.br"&gt;Ancar&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fernando Jo&#227;o Manfroi (&lt;a href="http://www.ancar.com.br"&gt;Ancar&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Luciene Souza Luna (&lt;a href="http://www.ancar.com.br"&gt;Ancar&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse plugin surgiu da necessidade de usar o m&#233;todo error&lt;em&gt;_&lt;/em&gt;messages_for para sinalizar na camada de vista os erros encontrados nas valida&#231;&#245;es do nosso modelo. Essas mensagens eram em ingl&#234;s, o que fazia com que os desenvolvedores tivessem que implementar algo semelhante no RHTML.&lt;/p&gt;

&lt;p&gt;Acabamos notando que v&#225;rias outras coisas poderiam ficar mais simples aos brasileiros usando-as como estamos acostumados. Por exemplo, nosso formato padr&#227;o de data &#233; DD/MM/AAAA mas &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; n&#227;o trabalha da mesma forma. Para solucionar esse problema fizemos uma implementa&#231;&#227;o que modifica o m&#233;todo to_date do modulo String para lidar com esse nosso formato.&lt;/p&gt;

&lt;p&gt;Esse nosso primeiro release n&#227;o abrange todas as nossas implementa&#231;&#245;es mas resolvemos publicar o quanto antes para poder contar com o &lt;a href="http://www.improveit.com.br/xp/valores/feedback"&gt;feedback&lt;/a&gt; dos nossos usu&#225;rios e melhorar continuamente. &lt;/p&gt;

&lt;p&gt;Trata-se de um projeto Open Source, onde gostar&#237;amos de contar com a colabora&#231;&#227;o da comunidade Brasileira com sugest&#245;es e quem sabe com novos desenvolvedores. Minha &#250;nica exig&#234;ncia com rela&#231;&#227;o aos patches &#233; que eles venham acompanhados de &lt;a href="http://www.improveit.com.br/xp/praticas/tdd"&gt;testes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quem quiser experimentar nosso plugin basta executar uma &#250;nica linha e reiniciar sua aplica&#231;&#227;o &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install -x \
svn://rubyforge.org/var/svn/brazilian-rails
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como temos v&#225;rios tipos de c&#243;digos diferentes devemos fazer outros plugins em breve !&lt;/p&gt;</description>
      <pubDate>Fri, 06 Jul 2007 21:30:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:8ceaaf97-3329-4baa-81b8-75731631f831</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2007/07/06/plugin-brazilian-rails</link>
      <category>ruby</category>
      <category>rails</category>
      <category>Plugins</category>
      <category>Testes</category>
      <category>TDD</category>
      <category>Active</category>
      <category>Record</category>
      <category>Action</category>
      <category>View</category>
      <category>brazilianrails</category>
    </item>
    <item>
      <title>Fotos, fotos e mais fotos</title>
      <description>&lt;p&gt;Aqui na &lt;a href="http://www.improveit.com.br"&gt;Improve It&lt;/a&gt; temos in&#250;meras &lt;a href="http://www.improveit.com.br/fotos"&gt;fotos&lt;/a&gt; dos projetos &lt;a href="http://www.improveit.com.br/xp"&gt;XP&lt;/a&gt; em que estivemos envolvidos e dos &lt;a href="http://www.improveit.com.br/servicos"&gt;treinamentos&lt;/a&gt; que realizados. H&#225; muito tempo que quer&#237;amos coloc&#225;-las no site. Mas, como fazer isso de forma pr&#225;tica? Afinal, s&#227;o centenas de &lt;a href="http://www.improveit.com.br/fotos"&gt;fotos&lt;/a&gt; e esse n&#250;mero cresce semanalmente.&lt;/p&gt;

&lt;p&gt;Um dos desafios &#233; encontrar uma forma de fazer upload facilmente. Usar uma p&#225;gina com upload de arquivos &#233; muito chato. Al&#233;m disso, demora demais. Revolvemos pesquisar as melhores solu&#231;&#245;es em armazenamento de fotos na web e, inevitavelmente, analisamos o &lt;a href="http://www.flickr.com/photos/improveit"&gt;Flickr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Felizmente descobrimos que o &lt;a href="http://www.flickr.com/photos/improveit"&gt;Flickr&lt;/a&gt; n&#227;o apenas resolve esse problema, mas tamb&#233;m o faz de maneira excepcional. Ele disponibiliza v&#225;rias ferramentas desktop para upload de &lt;a href="http://www.improveit.com.br/fotos"&gt;fotos&lt;/a&gt;, que tornam o processo bastante r&#225;pido. &lt;/p&gt;

&lt;p&gt;Para melhorar as coisas ainda mais, o &lt;a href="http://www.flickr.com/photos/improveit"&gt;Flickr&lt;/a&gt; disponibiliza uma ampla API, que permite que integremos nosso site com seus servi&#231;os. Obviamente h&#225; v&#225;rias formas de usar essa API em &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;. Ent&#227;o, escolhemos uma e colocamos a integra&#231;&#227;o para funcionar. Agora, voc&#234; j&#225; pode &lt;a href="http://www.improveit.com.br/fotos"&gt;conferir o resultado&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.improveit.com.br/fotos"&gt;Nessa p&#225;gina&lt;/a&gt;, est&#227;o os albuns que criamos no &lt;a href="http://www.flickr.com/photos/improveit"&gt;Flickr&lt;/a&gt;. Toda vez que criarmos novos albuns por l&#225;, essa p&#225;gina ser&#225; atualizada automaticamente. Por enquanto, temos apenas alguns poucos albuns, mas, com o mecanismo no ar, come&#231;aremos a colocar mais e mais fotos nos pr&#243;ximos dias. A prop&#243;sito, voc&#234; tamb&#233;m pode &lt;a href="http://www.flickr.com/photos/improveit"&gt;ver nossas fotos diretamente no Flickr&lt;/a&gt;. Passe l&#225; e deixe seus coment&#225;rios! ;-)&lt;/p&gt;</description>
      <pubDate>Wed, 30 May 2007 23:25:00 -0300</pubDate>
      <guid isPermaLink="false">urn:uuid:45d749b7-10a0-4d90-9652-debdfcc999e1</guid>
      <author>Vinicius Manh&#227;es Teles</author>
      <link>http://blog.improveit.com.br/articles/2007/05/30/fotos-fotos-e-mais-fotos</link>
      <category>xp</category>
      <category>fotos</category>
      <category>ruby</category>
      <category>treinamento</category>
    </item>
  </channel>
</rss>
