Existem muitos frameworks Ruby por . Alguns são completos, outros são modulares e outros são minimalistas. Por quê mais um framework?

O Nyane nasceu depois que eu resolvi estudar o Rack, e me deparei com isto: Very Simple Rack Framework.

Construir um framework baseado no Rack, ao vivo, durante uma apresentação de 30 minutos? Não é possível! Olha a sintaxe, tão bonitinha, como construir isso de maneira rápida e fácil de apresentar? Aquilo me deixou muito intrigado. Passei horas procurando na internet como construir um framework que fosse capaz de aceitar aquela sintaxe. Infelizmente, a documentação do Rack para este tipo de finalidade é quase nula.

Fui atrás de alguns frameworks simples baseados no Rack. O primeiro que eu encontrei foi o Coset. Mas o código era meio difícil de entender. Quer dizer, o código do framework em si não é complicado, acontece que eu não enxergava a ligação entre aquele código e o Rack. Iria precisar de algo bem mais simples pra começar.

Foi aí que eu encontrei algumas apresentações sobre como construir aplicações Rack. Agora, todo aquele código começava a fazer sentido. Mesmo assim, eu queria algo mais simples. Foi quando eu encontrei o Invisible. A versão inicial era ainda mais simples. Ótimo! Achei meu ponto de partida.

Continue lendo…

Já tem algum tempo que eu venho usando o Phusion Passenger no ambiente de desenvolvimento.

Um dos problemas que eu tinha era quando precisava usar o ruby-debug. Cheguei até a perguntar no IRC, mas ninguém sabia me dar uma resposta de como usá-lo em conjunto com o Passenger. Na época, resolvi usar o Mongrel para fazer o debugging e nem me preocupei mais.

Hoje, precisei de novo. E não queria usar o Mongrel. Então, fui novamente atrás de uma solução. Vamos à ela:

No arquivo: config/environments/development.rb coloque o seguinte código:

# Load ruby-debug
require "ruby-debug"
Debugger.start_remote

Este código ativa o modo remoto do ruby-debug.

Agora, vamos reiniciar o passenger:

$ touch tmp/restart.txt

Agora, vamos conectar remotamente ao ruby-debug através do terminal:

$ rdebug -c
Connected.

Pronto! Sempre que quiser depurar algum erro em sua aplicação, coloque a palavra chave debugger e espere o rdebug. Só não se esqueça dos testes para não depender tanto de debugging. :)

No sábado, saiu a nova versão do RubyGems, o gerenciador de pacotes do mundo Ruby.

Para atualizar, é só rodar o comando:

sudo gem update --system

Pronto! Só que, aqui no Mac OS X, ele instala a nova versão, mas o comando gem ainda aponta para a versão antiga:

$ gem -v
1.1.0
$

Talvez seja porquê o RubyGems agora é incluído por padrão no Leopard. Porém, eu queria desfrutar da velocidade para instalar novas gems que a versão 1.1 possui. Aqui vai uma solução:

$ sudo gem install rubygems-update
$ sudo update_rubygems

Funciona! Para aqueles que não necessitam da versão 1.1 com urgência, recomendo esperar um update da Apple (que pode demorar).

RejectConf’07 - 19/11/07

Neste final de semana aconteceu o RejectConf’07. Muitas palestras e cases de sucesso. Mas com certeza o melhor foi finalmente poder conhecer a galera da comunidade Ruby/Rails pessoalmente. Akita, Carlos Brando, Eduardo Fiorezi, o pessoal do Pagestackr, entre outros feras. Agora precisamos marcar um “Nerds On Beer” com essa galera para trocarmos mais idéias.

E que venha a RailsConf Brasil! ;)

Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais o quadro de medalhas do Terra. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?

Então, mãos à obra!

Continue lendo…

Em alguns projetos, é necessário utilizar os nomes de meses, ou dias da semana em português. Eu sempre usei o método de sobrescrever as constantes que o Ruby usa, colocando o seguinte código no config/environment.rb:

silence_warnings do
  Date::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)
  Date::DAYNAMES = %w(Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado)
  Date::ABBR_MONTHNAMES = [nil] + %w(Jan Fev Mar Abr Mai Jun Jul Aug Set Out Nov Dez)
  Date::ABBR_DAYNAMES = %w(Dom Seg Ter Qua Qui Sex Sab)
 
  Time::MONTHNAMES = Date::MONTHNAMES
  Time::DAYNAMES = Date::DAYNAMES
  Time::ABBR_MONTHNAMES = Date::ABBR_MONTHNAMES
  Time::ABBR_DAYNAMES = Date::ABBR_DAYNAMES
end

Acontece, que quando usamos a função strftime, estes nomes não são traduzidos. Eles funcionam apenas nos helpers date_select, entro outros. Em um projeto meu, eu precisava usar estes nomes traduzidos, justamente com a função strftime, então, cheguei à este código:

class Time
  alias :strftime_nolocale :strftime
 
  def strftime(format)
    format = format.dup
    format.gsub!(/%a/, Date::ABBR_DAYNAMES[self.wday])
    format.gsub!(/%A/, Date::DAYNAMES[self.wday])
    format.gsub!(/%b/, Date::ABBR_MONTHNAMES[self.mon])
    format.gsub!(/%B/, Date::MONTHNAMES[self.mon])
    self.strftime_nolocale(format)
  end
end

E funcionou!

Fica aqui a dica então, para quem estiver com este mesmo problema.

Acabei de ler este artigo no blog Softies on Rails, e resolvi traduzí-lo. Sabe quando você conhece determinada função, e mesmo sabendo que ela é útil, nunca usa? É preciso ler um artigo pra “cair em si”, não é?. Então, este artigo é um deles. Pelo menos foi pra mim.

Continue lendo…

Feed 89 FM - 13/05/07

Depois que eu comecei a usar FeedReaders online (primeiro usei o Bloglines agora migrei para o Google Reader) nunca mais visitei qualquer site para ir atrás de notícias, quer dizer, visitava apenas um: o site da 89 FM.

Sempre pensei em criar um feed para a seção Notas Musicais do site. Só que nunca fui atrás, por pura falta de tempo em procurar por bibliotecas que fizessem o Parsing em HTML, tanto em Python ou PHP.

Depois de conhecer Ruby, pensei em perder um tempinho, procurando alguma biblioteca que fizesse o Parsing HTML, e depois, construir o feed RSS. Fazer o Feed seria a parte mais fácil, graças à biblioteca Builder usada para gerar arquivos XML.

O parsing ficaria à cargo da excelente Hpricot. Porém, encontrei uma outra biblioteca, chamada Feedalizer que usa a Hpricot para criar feeds RSS. Menos trabalho que isso, impossível!

Então, aqui vai o código usada para gerar o feed da página:

#!/usr/bin/env ruby
 
require "rubygems"
require "feedalizer"
require "time"
 
rss = File.new("arthurgeek.net/89.xml","w")
 
feedalize("http://www.89fm.com.br/notas/") do
  feed.title = "89 FM Notas"
  feed.about = "..."
  feed.description = "Notícias do mundo musical da 89FM"
 
  scrape_items("a.formtextobranco") do |rss_item, html_element|
    rss_item.link  = "http://www.89fm.com.br" + html_element.attributes["href"]
    rss_item.date  = Time.parse(html_element.to_s)
    rss_item.title = html_element.inner_html
 
    rss_item.description = html_element.inner_html
  end
 
  output! rss
end
 
rss.close

O arquivo do feed está disponível aqui e já estou usando-o há mais de 2 meses, e acredito, que não tem mais bugs, e pode agora, ser usado por qualquer um.

Ah, como eu gosto desta linguagem…

[Update: Hoje em dia, o método preferido para deploy Rails + Apache é usando o Phusion Passenger, também conhecido como mod_rails. Para aprender como fazer um deploy com o mod_rails, leia este excelente artigo do Nando Vieira. :)]

Como eu havia dito, não achei artigos em português explicando como fazer o deploy de aplicações Rails usando mod_proxy_balancer e mongrel_cluster, por isso resolvi escrever um.

Os comandos a seguir foram testados em um Ubuntu 7.04 Server Edition, mas devem servir para qualquer distro Debian-based.

Será necessário ter instalado os seguintes programas:

  • Apache 2.2.x
  • mod_proxy_balancer
  • mongrel
  • mongrel_cluster
  • Ruby
  • Rails

Continue lendo…