Saturday, July 29, 2006

Desenvolvimento de sites rápidos e err, "poderosos", com Catalyst

O Catalyst é um "Web Framework" em Perl. Você pode entendê-lo como um concorrente do Ruby on Rails e do TurboGears - baseados em Ruby e em Python, respectivamente. Apesar de novo, ele é robusto e confiável, e deve disputar as atenções daqui pra frente. Nesse artigo, mostrarei como montar um site com controle de banco de dados em alguns minutos, usando Catalyst. Veja o resultado após alguns minutos de trabalho, e sem escrever nenhuma linha de código:
cetico-catalyst1.png

Veja abaixo o tutorial, com apenas 2 passos a seguir.


INTRODUÇÃO (pule se estiver com pressa)

O Catalyst é uma bela solução, com qualidades típicas do Perl: flexibilidade e agilidade. Iniciantes podem se sentir intimidados com as diversas formas de fazer a mesma coisa (TMTOWTDI), ou com a monstruosa quantidade de módulos do Perl e de Plugins do Catalyst disponíveis. A tendência é que a curva de aprendizado do Catalyst seja um pouco mais acentuada que a dos concorrentes, mas o resultado final é a um poder maior sobre a ferramenta e, especialmente, mais produtividade.

O Catalyst disponibiliza uma infra-estrutura básica, e lhe é dado o poder de mexer e desmontar o que você precisar. Se quiser deixar de usar DBIC (DBIx::Class) para manipular dados, basta escolher outro módulo. Além disso, o Catalyst, por ser Perl, tem melhor suporte a UTF-8 que o concorrente mais conhecido, o Ruby on Rails. Diferentemente do RoR, o Cat suporta chaves primárias de múltiplas colunas, graças ao DBIC, entre outros "poderes" e vantagens técnicas.

Para compensar a talvez excessiva diversidade de módulos e alternativas, e a confusão que iniciantes fazem com isso, o projeto Catalyst tem se esforçado para criar boa documentação. A principal documentação para iniciantes é o Catalyst::Manual::Tutorial, que pode ser lido juntamente com os comentários (geralmente muito úteis) de outros usuários no annoncpan.org.

O wiki é um excelente recurso, bem organizado e com muita informação. Por último, no canal #catalyst do irc.perl.org é possível obter ajuda, em inglês, de outros usuários - extraordinariamente simpáticos, por sinal.

CRIAÇÃO DE UM SITE RÁPIDO

Nesse tutorial, irei relatar o passo-a-passo do desenvolvimento inicial de um sistema real - o PF-Graph, uma ferramenta de análise de logs e auditoria para o sistema de e-mail Postfix.

0) Instalação do Catalyst

No Ubuntu (estou utilizando o Edgy Eft), o processo de instalação do Catalyst é simples, como sempre.
sudo aptitude install libcatalyst-perl libcatalyst-modules-extra-perl libcatalyst-model-dbic-perl libcatalyst-view-tt-perl libcatalyst-modules-perl

Alguns módulos não estão empacotados ainda, portanto devem ser instalados via CPAN:
sudo perl -MCPAN -e 'force install("Catalyst::Example::InstantCRUD")'

Sugiro responder "no" à primeira pergunta para simplificar a configuração do ambiente do CPAN.

Se você tiver problemas, deixe um comentário e tentarei ajudar.

Esse módulo InstantCRUD faz a mágica por nós, criando automaticamente o site e os métodos geralmente utilizados para manipulação de um banco de dados - por isso é um "CRUD framework". CRUD significa "Create, Read, Update and Delete", ou "Criar, Ler, Atualizar e Apagar". O resultado é uma interface agradáveç que serve como ponto de partida do seu trabalho. É o InstantCRUD que gera o View, portanto os templates, da página mostrada anteriormente na screenshot. Veja a como é fácil chegar até lá, seguindo os próximos 6 simples passos. Os comandos a serem digitados estão destacados em itálico.

1) Configuração do banco de dados
Iremos utilizar o SQLite pela simplicidade, mas você pode usar outro qualquer suportado pelo DBI do Perl. A fama do DBI é que você pode guardar suas informações em qualquer lugar, incluindo PostgreSQL, MySQL, arquivos CSV, Excel, cartola de mágico, etc etc. Veja a lista de drivers no CPAN.

O arquivo maillog.db é um banco de dados SQLite. Grave em um arquivo com nome maillog.sql o seguinte conteúdo:
BEGIN TRANSACTION;
CREATE TABLE blockedmail (id INTEGER PRIMARY KEY,
timestamp INTEGER,
clientdns VARCHAR(255), clientip
VARCHAR(15), sender varchar(255),
rcpts BLOB, helo VARCHAR(32),
restriction_applied VARCHAR(32),
detail VARCHAR(255));
CREATE TABLE maillog (id INTEGER PRIMARY KEY,
timestamp INTEGER,
host TEXT,
program TEXT,
pid INTEGER,
text TEXT);
CREATE TABLE mailtraffic (id INTEGER PRIMARY KEY,
timestamp INTEGER,
sender VARCHAR(255), rcpts TEXT,
bytes_rcvd INTEGER
);
INSERT INTO "mailtraffic" VALUES(1, 1154232272, 'john@example.com', 'yves@cetico.org', 1231321);INSERT INTO "mailtraffic" VALUES(2, 1154232574, 'john@example.com', 'yves@cetico.org', 838334);
INSERT INTO "mailtraffic" VALUES(3, 1154232630, 'yves@cetico.org', 'amanda@example.com', 65333);COMMIT;

Depois, crie o banco executando (você precisa do sqlite3):
yves@elvis:~/catalyst$ sqlite3 maillog.db < maillog.sql

Teste se está tudo em seu devido lugar com o comando:
yves@elvis:~/catalyst$ sqlite3 maillog.db .dump

2) Crie seu site

yves@elvis:~/catalyst$ instantcrud.pl -name=pfgraph \ -dsn='dbi:SQLite:dbname=maillog.db'
created "pfgraph"
created "pfgraph/script"
created "pfgraph/lib"
...
dir: /home/yves/catalyst/pfgraph/root/static
created "/home/yves/catalyst/pfgraph/root/static/pagingandsort.css"
created "pfgraph/script/../t/controller_InstantCRUD.t"

Mova o maillog.db para o diretório criado - no caso, "pfgraph":
yves@elvis:~/catalyst$ mv maillog.db pfgraph/

3) Tudo pronto!

Rode o servidor:
yves@elvis:~/catalyst/pfgraph$ script/pfgraph_server.pl

Abra agora seu navegador e aponte para http://localhost:3000. Veja o resultado:

Visualização da lista de e-mails recebidos e enviados (método "list"):
cetico-catalyst1.png

Visualização de um item específico:




cetico-catalyst2.png



Edição de itens:




cetico-catalyst3.png

O InstantCRUD faz o scaffold do MVC, isso é, gera explicitamente o código para cada método utilizado, cabendo a você, agora, adaptar os Modelos, as Aprestanções e os Controles. É mais fácil mexer em algo pronto do que ter que escrever do zero, pelo menos para iniciantes.


O Catalyst e o InstantCRUD nos forneceram um sistema moderamente complexo, mas sem termos escrito nenhuma nova linha de código. Isso é muito cômodo, mas não se engane: mesmo que você use um framework que lhe poupe boa parte do trabalho inicial, nada substitui seu próprio estudo e prática. É necessário dominar a linguagem (para isso, recomendo Learning Perl e Programming Perl) e seguir boas práticas de desenvolvimento. Performance deve ser uma preocupação constante de um bom desenvolvedor.


Aliás, falando de performance, o Catalyst atende todos os gostos. Para desenvolvimento, você pode usar o servidor HTTP::Daemon próprio, como fizemos aqui, mas para o ambiente de produção recomenda-se Apache+FastCGI ou mod_perl. Fica uma bala. Veja o Cookbook.


Num próximo post, continuarei o desenvolvimento do PF-Graph mostrando buscas específicas, autenticação e tentarei usar alguns gráficos bonitinhos :-).