Geração de PDFs indolor no Rails 3

Em um trabalho recente, precisei gerar relatórios em PDF. Considerei algumas soluções e optei por uma que não me fizesse perder os cabelos e reescrever código: wicked_pdf.

wicked_pdf usa wkhtmltopdf, um incrível utilitário que converte HTML para PDF, usando Webkit e QT. Você não precisa compilá-lo, basta apenas copiar o binário certo do site do projeto.

Uso

Após instalar a gem em seu sistema, você pode gerar os PDFs sem escovar bits: adicione o formato pdf entre as possibilidades de respostas de uma action, como abaixo:

def report
  @order = Order.find(params[:id])
  
  respond_to do |format|
    format.html
    format.pdf do
      render :pdf => "order-#{params[:id]}"
    end
  end  
end

Se quiser, você pode usar a mesma view do formato html:

render :pdf => "order-#{params[:id]}", :template => "/orders/report.html.erb"

O readme da gem apresenta as informações pertinentes para seu uso e não é meu objetivo reproduzi-lo aqui, apenas chamo a atenção para um detalhe: em hosts compartilhados, você precisará definir o path correto do wkhtmltopdf. Para isso, você pode criar um initializer com o seguinte conteúdo:

WickedPdf.config = { :exe_path => '/home/meuusario/wkhtmltopdf' }

PS. você pode usar o wkhtmltopdf no PHP com o Snappy. Não testei, mas pode ser uma boa opção.

 

Validações personalizadas no Rails 3

O método validates do Rails 3 agrupou os antigos métodos de validação do Rails 2. Na versão 3, usamos o método validates acompanhado do atributo a ser validado e de suas respectivas regras de validação. Trabalhando em um novo projeto necessito validar CPFs e CNPJs, e consequentemente, precisei criar validações adicionais. Esse post mostra como realizei isso.

Inicialmente, criei na pasta lib/ o arquivo my_validations.rb, com o seguinte conteúdo:

# encoding: utf-8

class MyValidations < ActiveModel::Validator
  def validate(record)
    record.errors&#91;:cpf&#93; << "CPF (#{record.cpf}) é inválido" unless Cpf.new(record.cpf).valido?
    record.errors&#91;:cnpj&#93; << "CNPJ (#{record.cnpj}) é inválido" unless Cnpj.new(record.cnpj).valido?
  end
end
&#91;/ruby&#93;

Veja que na primeira linha desse arquivo eu indico o encoding usado, para evitar problemas com os acentos. Utilizo o <a href="https://github.com/tapajos/brazilian-rails">brazilian-rails</a> para confirmar se os documentos informados são ou não válidos. No meu model, eu invoco o método <a href="http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates_with">validates_with</a>, indicando a classe recém-criada. 


validates_with MyValidations

Esse foi um exemplo de como resolvi meu problema. Existem outros posts sobre o assunto por aí, boa sorte!

 

Novo micro-projeto: Guia da TV

Aproveitei algumas horas das minhas férias e lancei um novo micro-projeto: Guia da TV. O Guia da TV permite você saber quais programas estão para começar.

Algumas coisas ainda serão aprimoradas, mas o aplicativo já está em produção. Ele foi feito com Rails 3 e algumas pitadas de jQuery em sua interface. O conteúdo é fornecido pela Revista Eletrônica. Se você gosta de ver TV, use-o e o recomende no Facebook ;)

 

Novo micro-projeto: HORÓSCOPO NO MSN

Chegou mais um serviço de utilidade pública feita por mim. Depois do codestacker, autosimulado e xavecator, por acaso tive contato com algumas coisinhas do protocolo do MSN e desse contato saiu o Horóscopo por MSN. Horóscopo por MSN foi uma aplicação escrita em algumas noites e seu nome já diz tudo: você recebe o horóscopo do dia em seu MSN.

Horóscopo no MSN

Funciona assim: você adiciona na sua lista de AmIgUxOs o contato [email protected] Vai no site e escolhe o signo que deseja ser informado. Pronto. Uma vez por dia, o robozinho da aplicação vai entregar no seu MSN o seu horóscopo.

P.S. eu não acredito em horóscopo.
P.S. 2: aplicação foi feita com Rails 3 e PHP. O PHP é responsável por conversar com o MSN enquanto a parte Rails do aplicativo gerencia todo o resto. Minha vontade é portar a parte PHP para Ruby.

 

iPhone e Rails

O desenvolvimento de web apps para iPhone requer alguns cuidados especiais. Em nossas aplicações significa pensar em um layout para o gadget. Uma forma rápida de definir o layout para iPhone é através do código abaixo:

Para quem quer conhecer o desenvolvimento de web apps para iPhone, vale conhecer os projetos jQTouch e iWebKit. O jQTouch é um plugin do jQuery com uma série de recursos de animação semelhantes ao do aparelho e possui inclusive a funcionalidade de Geo Location. Já o iWebKit é um framework que não depende de nenhuma biblioteca e que possui também bons recursos para montagem de interfaces.

 

Novo micro-projeto: XAVECATOR

O nome até parece de app do Aurélio, ou de produtos das Organizações Tabajara, mas num fim-de-semana sem nada pra fazer, resolvi fazer um pet project para ver o Rails 3 funcionando e, para conhecer o jQTouch.

xavecator

O XAVECATOR é para nerds pessoas cara-de-pau e/ou sem inspiração. Bem é verdade que tem coisa aí que digno de beijo na boca ou tapa na cara, mas tudo é conversado e entendido ;)

P.S. 1: ainda estou atualizando o ‘banco de dados’. Não está tudo pronto ainda.
P.S. 2: se você tem um iPhone pode acessar o site nele onde precisar
P.S. 3: você pode seguir o XAVECATOR no Twitter

 

Syntax Highlight on Rails

Quer fazer um syntax highlight igual ao do codestacker abaixo, a la Textmate? É fácil:

Faça o download da biblioteca de expressões regulares Oniguruma. A versão mais recente é a 5.9.1. Compile-a:

 ./configure && make && make install 

Após isso instale as gems Oniguruma, Textpow e Ultraviolet e instale o plugin tm_syntax_highlighting em seu projeto.

Em suas views, utilize:

 code(some_ruby_code, :theme => "twilight", :lang => "ruby", :line_numbers => true) 
 

Internacionalização em labels

Desenvolvendo uma aplicação onde apliquei os recurso de internacionalização do Rails, percebi que o framework não traduz os valores dos labels para a tradução do atributo.

Para corrigir isso, existem duas formas: um plugin chamado i18n_label ou uma gambiarra um recurso técnico avançado adaptado a condições tecnológicas precárias em um determinado momento:

Cole o código acima em um arquivo da pasta ‘lib’, por exemplo e o inclua com require no environment.rb.

 

Rails e cia no Snow Leopard

Fiz uma instalação nova do Snow Leopard no meu MacBook e ao migrar os dados do Time Machine, do Leopard, algumas coisas pararam de funcionar. Resolvi então escrever para complementar meu post anterior sobre o assunto.

Xcode

ANTES DE MAIS NADA, instalei o Xcode. Ele está junto no DVD do Snow Leopard, na pasta de Instalações Opcionais.

Rails

O Snow Leopard já vem com duas versões do Rails já instaladas: 2.2.2 e 1.13.6. Caso queira atualizar seu ambiente:
Read more

 

O que é Ruby on Rails?

A essa altura do campeonato todo mundo já deve saber o que vem a ser o framework Ruby on Rails. Minha monografia e meu trabalho de conclusão de curso da Faculdade foram sobre o autosimulado. Na monografia fiz uma introdução sobre as características do framework, reproduzido abaixo:

Ruby on Rails

O framework Ruby on Rails foi extraído de um sistema para gerenciamento de projetos chamado Basecamp. A primeira versão do framework foi oficialmente lançada em 25 de Julho de 2004 e seu desenvolvimento conta com colaboradores em todo o mundo liderados pelo programador dinamarquês David Heinemeier Hansson.

MVC

Um padrão de projeto descreve e provê uma solução para um problema freqüente, sendo genérico e reusável. São criados a partir de problemas de problemas comuns enfrentados no desenvolvimento de projetos de software.
A criação de componentes reutilizáveis é uma das técnicas mais exploradas em Engenharia de Software. O uso de componentes diminui o tempo de desenvolvimento e a taxa de erros de codificação. Um padrão pode ser entendido como a abstração de detalhes sobre a implementação de um software.

MVC

Read more

 

O que é Ruby?

A essa altura do campeonato todo mundo já deve saber o que vem a ser a linguagem Ruby. Minha monografia e meu trabalho de conclusão de curso da Faculdade foram sobre o autosimulado. Na monografia fiz uma introdução sobre as características da linguagem Ruby, reproduzido abaixo:

Ruby

A linguagem Ruby foi criada em 1993 pelo japonês Yukihiro “Matz” Matsumoto, com sua primeira versão pública lançada em 1995. Para Matz, o primeiro desejo é de Ruby tornar os programadores felizes, reduzindo o trabalho manual que precisasse ser feito. Segundo ele, o desenvolvimento de sistemas deveria enfatizar as necessidades do homem e não da máquina:

Muitas pessoas, especialmente engenheiros de computação, focam nas máquinas. Eles pensam, “Fazendo isso, a máquina será mais rápida. Fazendo isso, a máquina será mais eficiente. Fazendo isso, a máquina irá fazer determinada coisa melhor”. Eles estão focando nas máquinas. Mas de fato nós precisamos focar nos humanos, em como os humanos lidam com programação ou operação das aplicações das máquinas. Nós somos os mestres. Elas são as escravas. (VENNERS, 2003).

Ruby é uma linguagem orientada a objetos, ou seja, qualquer variável é um objeto, mesmo classes e tipos que em muitas linguagens são designadas como primitivos. Por exemplo:

putz "meu exemplo".upcase # imprimirá MEU EXEMPLO

Read more

 

O ecossistema Rails

Escrevo esse artigo dentro do meu voo de São Paulo para Belo Horizonte. Passei 4 dias em São Paulo, participei do Rails Summit, bloguei ao vivo um resumo das palestras e vou expor meus comentários sobre o ecossistema Rails – ou se preferir, o gueto Rails.

Trilhos da oportunidade

Conheci durante o evento vários pessoas que só conhecia pelo Twitter. Muitas dessas pessoas possuem aplicativos web, outras desenvolvem no tempo livre por prazer (como eu), outras trabalham offshore. De tudo isso, a única coisa que possuo concluir é que de fato existe um trem da oportunidade. Existem vagas para bons programadores nesse mercado, o trabalho remoto É possível e É uma realidade. Globalização é um americano morar na Argentina e contratar um programador brasileiro no evento.

Maturidade da comunidade

Rails definitivamente é mais do que somente um framework para desenvolvimento de aplicações web. Rails é resultado de um trabalho coletivo e maduro de uma comunidade. No Brasil essa comunidade é formada de gente vinda de várias tecnologias (Java, PHP, Python, programação desktop) e que se identifica com um software de opinião, com metodologias agéis e com computadores de Cupertino.

Essa pluralidade de pessoas tornam um encontro como o Rails Summit rico não somente de potenciais técnicos, mas sim de potenciais humanos.

Programadores podem ser empreendedores

Existe muita programador com vontade de empreender. As apresentações do Vinícius são uma provocação para botar para fazer. Negócios na web são como aplicações. É necessário fazer, testar, refatorar e nesse sentido a troca de experiências no Rails Summit é inspiradora a sonhar e a agir. Com Rails, aplicações são feitas rapidamente e é dessa velocidade que o seu negócio precisa.

Conclusão

Rails não é só código, é um tag que pessoas de diferentes opiniões, experiências e lugares carregam. Nessa comunidade o foto não está nos comos e sim nos porques. Após o Rails Summit, só posso confirmar o quanto é único esse gueto.

 

Rails Summit: resumo do segundo dia

Richard Kilmer: MacRuby

A primeira palestra do segundo dia trouxe o americano Richard Kilmer que falou sobre MacRuby, a união entre Ruby e Objective-C. Notas dos slides:

  • Problems with RubyCocoa: It’s a bridge; 2 runtimes, 2 GC, different syntax
  • MacRuby 0.4: Objective-C 2 + Ruby 1.9
  • Every Ruby class is an Objective-C class
  • Every Ruby object is an Objective-C object
  • Every Ruby method is an Objective-C method
  • MacRuby é um pouco mais rápido do que Objective-C
  • MacRuby utiliza recursos de processamento paralelo do OS X
  • HotCocoa is an idiomatic Ruby API that simplifies the configuration and wiring together of Objetive-C/Cocoa classes – resumindo: simplifica a sintaxe e deixa algo mais ‘Ruby Way’

imagem ilustrativa
Imagem ilustrativa

Nando Vieira: Ruby 1.9

O Nando falou do que há de novo no Ruby 1.9, tema inclusive de um PDF de sua série HOWTO. Sua apresentação, bem bonita, trouxe inúmeras notas sobre as mudanças da linguagem. Alguns pontos:
Read more

 

Rails Summit: resumo do primeiro dia

Esse é um rascunho do que foi abordado no primeiro dia do Rails Summit.

Chad Fowler: Insurgência Ruby on Rails

  • Stop doing things you know are wrong!
  • A primeira Rubyconf aconteceu em 2001 com 34 pessoas.
  • Nenhum dos participantes ganhava $ com Ruby.
  • 5 dos 34 participantes escreveram o Agile Manifesto.
  • “The survival rate for startups is way less than 50%. So if you’re running a startup, you had betted be doing something old. If not, you’re in Trouble”
  • Implante uma nova tecnologia gradativamente.
  • Don’t do (.Net | Java | C++ | C | Perl l PHP) in Ruby: a razão de trocar de tecnologia é fazer as coisas diferentes!
  • Linguagens de computador são como namoradas: a nova é melhor porque você é melhor.

Gregg Pollack: Na Vanguarda da Performance em Rails

Gregg Pollack, o cara dos screencasts do RailsEnvy, falou sobre performance. Primeiramente ele trouxe em 60 segundos algumas coisinhas para otimizar apps.

  • Usar Yslow
  • Cache: Page Caching, Action Caching, Fragment Caching, Object Caching
  • Avoid Cache expiration
  • Use memcached
  • Use background process
  • Client-side caching: etags & last-modified
  • Don’t pre-optimize: 99% of the time you’ll need 0%
  • Don’t abuse your database

Read more

 

Paperclip validando imagens no IE

No autosimulado, tive um problema onde o IE (sempre ele) não validava o mime-type de uma imagem. Mesmo tentando enviar uma imagem JPG – imagem permitida – o IEca não aceitava o arquivo. A solução:

O (pseudo)browser da turma do tio Ballmer e cia não compreende o mime-type image/jpeg e sim o image/pjpeg.

 

Descubra de onde vem seus usuários com SQL

Tenho no autosimulado algumas queries para acompanhar a evolução dos usuários do site. Periodicamente, vejo o número de usuários criados dia-a-dia no site e o número de testes realizados por esses usuários.

Relacionado as essas queries, vi uma interessante consulta para agrupar o número de usuários por domínio de email, através da função substring. Confira:

O resultado, quando aplicado ao banco de dados do autosimulado:

+-------+----------------+
| Total | Domain         |
+-------+----------------+
|   644 | hotmail.com    | 
|   116 | gmail.com      | 
|    98 | yahoo.com.br   | 
|    37 | bol.com.br     | 
|    33 | ig.com.br      | 
|    15 | uol.com.br     | 
|    11 | oi.com.br      | 
|    10 | yahoo.com      | 
|     9 | hotmail.com.br | 
|     8 | terra.com.br   | 
+-------+----------------+
10 rows in set (0.00 sec)
 

hirb, dados tabulados no console

hirb é uma gem que, num rápido resumo, tabula e organiza em árvores dados que, entre várias origens, podem vir de um array. A instalação

gem install cldwalker-hirb --source http://gems.github.com

A partir daí, basta chamar a biblioteca (require ‘hirb’), habilitá-la na execução (Hirb.enable) e correr pro abraço. Confira abaixo:

 

sitemap.xml no Rails

Usado para SEO, Sitemaps servem para informar aos sites de busca como indexar as páginas de um site. Indexadores descobrem páginas com base em links no site e outros sites e o que os Sitemaps fazem é complementar esses dados, para permitir que os indexadores com suporte para Sitemaps peguem todos os URLs no Sitemap e aprendam sobre esses URLs usando os metadados associados.

Existem sites para gerar o arquivo, mas fazer isso no Rails não é complicado e faremos isso em 4 passos. A dica vem do Tony no livro Advanced Rails Recipes.

Read more