Esta é a última compilação para o último dia do ano. Foi mais um grande ano para Ruby no mundo todo. Este ano eu publiquei poucas retrospectivas, somente a número #8 (Janeiro a Abril) e #9 (Maio a Setembro). Agora é a vez de cobrir algumas das notícias de Outubro até Dezembro. Vamos ver se ano que vem eu consigo publicar com mais frequências.

Este também deve ser meu último post de 2010. Espero que todos tenham um bom reveillon e Feliz Ano Novo. Nos vemos em 2011!

Semana passada visitei a Abril para conversar sobre um projeto de codenome Alexandria. Sempre me perguntam sobre cases nacionais de Ruby, e este é sem dúvida um bom case para se discutir. Os arquitetos de sistema David Lojudice Sobrinho (à direita na foto) e Júlio César (à esquerda na foto) me guiaram nessa história e agora quero dividir com vocês do que se trata esse projeto.

Acredito que todos já consumiram algum produto da Abril mas talvez nem todos conheçam suas dimensões. Segundo sua página institucional, ela emprega hoje mais de 7 mil colaboradores. Citando a mesma página, temos:

A Abril publicou 370 títulos em 2009 e é líder em 21 dos 25 segmentos em que atua. Suas publicações tiveram ao longo do ano uma circulação de 188,5 milhões de exemplares, em um universo de quase 28 milhões de leitores e 4,1 milhões de assinaturas. Sete das dez revistas mais lidas do país são da Abril, sendo Veja a terceira maior revista semanal de informação do mundo e a maior fora dos Estados Unidos.

A Abril também detém a liderança do mercado brasileiro de livros escolares com a Abril Educação, que publicou mais de 3.000 títulos e detém 29% do mercado brasileiro de livros escolares. Em 2009, produziu 38 milhões de livros.

(…) Na internet, a Abril tem mais de 80 sites e portais com suas marcas e conteúdos. Em 1991, lançou no país a primeira operação de televisão por assinatura, a TVA.

Em Agosto de 2010, o grande Felipe Coury perguntou se eu não estaria interessado em hospedar meu blog no WebbyNode, um serviço que ele fundou.

Porém foi justamente em Agosto quando ingressei na Gonow e desde então ando bastante sobrecarregado. Com isso acabei deixando esta tarefa de lado por algum tempo. Finalmente arranjei um respiro para fazer isso com calma – agora, no Natal!

Atualização 22/12/2010: O @sferik aceitou meus commits e agora o Rails Admin tem oficialmente suporte ao CKEditor e Paperclip. Legal!

Recentemente foi lançado a Rails Engine Rails Admin, que permite integrar um módulo de administração dinâmico de maneira muito simples e rápida para aplicativos feitos com Rails 3. É a maneira mais fácil de criar administração para seus models, especialmente em casos onde você está trabalhando em um site institucional simples, um site de advertising/marketing, um hotsite, e não quer se preocupar em gastar tempo criando uma administração muito sofisticada.

E para facilitar, eu fiz algumas pequenas modificaçòes que fazem sua administração ficar assim:

Isso mesmo, com suporte a CKEditor 3.5 e Paperclip. Vejamos como.

Ontem estava conversando com alguns amigos e vi um projeto que usava várias gems e plugins do Nando Vieira. Para quem não conhece, o @fnando é um rubista bastante ativo, trabalhou na WebCo e está atualmente na Locaweb. E pelo menos na nossa roda de amigos é conhecido por ser uma metralhadora de gems :-) Sem brincadeira, basta abrir o Github dele para ver isso: nada menos do que 89 repositórios. Acho que já passou da hora de eu ajudar a divulgar isso porque lá deve ter muitas coisas que muitas pessoas estão precisando mas não sabiam onde procurar.

São muitos projetos no Github e vou pular alguns deles. Mesmo assim, acho que consegui formatar uma lista bem completa com as principais bibliotecas e ferramentas. Dividi as sub-seções em:

  • Produtos – projetos que são mais complexos ou definem um produto.
  • Curiosos – conceitos ou implementações que achei interessantes ou diferente.
  • Linha de Comando – ferramentas de linha de comando, instaladas via gem, que auxiliam o desenvolvimento de projetos.
  • Alternativas – bibliotecas que tem “concorrentes” ou alternativas.
  • Active Record – extensões ao Active Record.
  • Miscelânea – existem gems que não se encaixam nas categorias anteriores.

Obs: Código disponível no Github

Uma das funcionalidades mais interessantes do Ruby é sem dúvida o famoso method_missing. Graças a ele podemos enviar mensagens arbitrárias a um objeto e ainda assim fazer com que responda como queremos. Por exemplo, o seguinte código dará uma exceção:

1
2
3
4
5
6
> obj = Object.new
 => #<Object:0x0000010092ac60> 
> obj.foo
NoMethodError: undefined method `foo' for #<Object:0x0000010092ac60>
        from (irb):2
        from /Users/akitaonrails/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

Agora, podemos redefinir o método method_missing do Object e veja o que acontece:

1
2
3
4
5
6
7
8
9
> def method_missing(method, *args)
>   "#{method}:#{args.size}"
> end

> obj.foo
=> "foo:0"

> obj.foo(1,2,3)
=> "foo:3"

Este foi um resumo rápido, recomendo que se ainda não estiver familiarizado com esse conceito leia meu Micro-Tutorial de Ruby – Parte II onde eu explico isso em mais detalhes.

Um exemplo que gosto de usar é a classe Builder::XmlMarkup. Diferente de plataformas que fazem ou concatenação manual de Strings (péssimo) ou manipulação burocrática de nós (DOM), em Ruby temos essa excelente classe que minimiza a quantidade de código e ao mesmo tempo gera XML bem formatado e válido. Este é um exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'builder'
x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)
x.html do |h|
  h.body do |b|
    b.h1 "Hello World"
    b.p "This is a paragraph."
    b.table do |t|
      t.tr do |tr|
        tr.td "column"
      end
    end
  end
end

Esse código irá gerar diretamente este XML:

1
2
3
4
5
6
7
8
9
10
11
<html>
 <body>
  <h1>Hello World</h1>
  <p>This is a paragraph.</p>
  <table>
   <tr>
    <td>column</td>
   </tr>
  </table>
 </body>
</html>

Se nunca tinha visto isso, pare por um segundo e contemple a beleza desta API. A partir do objeto XmlMarkup enviamos mensagens como html e ele vai acumulando as tags. Usamos blocos exatamente para blocos de XML, garantindo que eles terão as tags corretas de fechamento.

Pensando nisso, resolvi tentar fazer algo semelhante em Objective-C. A funcionalidade que permite esse tipo de API no Ruby é o method_missing, algo que imaginamos que somente linguagens dinâmicas conseguem ter. Porém, ao final deste artigo, quero fazer este código funcionar:

1
2
3
4
5
6
7
8
9
10
11
12
XmlBuilder* xml = [[XmlBuilder alloc] init];
[xml htmlBlock:^(XmlBuilder* h) {
    [h bodyBlock:^(XmlBuilder* b) {
        [b h1:@"Hello World"];
        [b p:@"This is a paragraph."];
        [b tableBlock:^(XmlBuilder* t) {
            [t trBlock:^(XmlBuilder* tr) {
                [tr td:@"column"];
            }];
        }];            
    }];
}];

É bem mais verbose do que Ruby, obviamente, mas ainda assim bem mais interessante do que o jeito de manipular DOMs com métodos como createElement, appendElement, etc. De uma certa maneira dá pra ficar bastante semelhante à versão em Ruby. Mas como isso é possível?

Antes de continuar, leia meu artigo sobre Categorias e Blocos pois este artigo usará blocos.

De vez em quando eu faço uma limpeza no meu notebook. Meu pobre Macbook Pro tem apenas 320GB em seu lento HD de 5400rpm. E se eu mudar para os novos Air que tem Flash significa ainda menos espaço, no máximo 250Gb. Hoje eu estava com cerca de 20Gb livres, depois da limpeza estou com quase 100Gb livre.

A melhor ferramenta para me dizer o que limpar é o Grand Perspective. Eu já tentei outros pagos como o Daisy Disk (USD 19.95) mas o Grand – desculpem o trocadilho – ainda é grander.

Ele vasculha qualquer diretório e diz rapidamente quem são os culpados por comer meu espaço em disco. Os maiores culpados no meu caso estão concentrados principalmente no iTunes. Para liberar espaço eu movi tudo para um disco externo. Só os vídeos do TED (HD) ocupavam 20GB. Movi vários video podcasts e outras coisas como audiobooks que eu já escutei, filmes que não pretendo ver de novo e mais.

Faz tempo que estou devendo um artigo sobre esta aplicação. O Mailee é um sistema de email marketing todo feito em Ruby on Rails e desenvolvido pelo pessoal da Softa, um excelente Rails shop de Porto Alegre, RS. Eles prestam serviço de desenvolvimento de sistemas web com Ruby, desenvolvem produtos como o Mailee e também organizam o evento RS on Rails, que pude participar este ano. Enfim, são muito ativos na comunidade gaúcha.

Eu não sou um usuário de e-mail marketing, então não poderei dar muitos detalhes quanto ao uso mais pesado da ferramenta nem comparação com outras ferramentas. Se você faz uso de e-mail marketing, não deixe de comentar neste artigo sobre o Mailee ou outras opções. Feedback sempre é útil para quem presta os serviços.

Se você tem um e-commerce ou uma loja, aproveite o fim de ano para tentar dar um boost nas suas vendas, usando ferramentas como o Mailee para atingir seus clientes. Logo na homepage do site, você pode assistir um video screencast para se familiarizar com as funcionalidades: