segunda-feira, 28 de junho de 2010

Curso de Python e web2py no Rio de Janeiro

Tempo Real Eventos Convidados pela Tempo Real Eventos, Bruno Cezar Rocha e eu ministraremos cursos sobre Python e web2py - eu ficarei responsável pelas turmas no Rio de Janeiro e ele pelas turmas em São Paulo.

A Linguagem - Python

Python - linguagem de promgração de altíssimo nível Python é uma linguagem de programação dinâmica de altíssimo nível, utilizada em larga escala por empresas como Google (que atualmente emprega o criador da linguagem), Dreamworks, Industrial Light & Magic, NASA, dentre muitas outras. No Brasil, é utilizada pela Locaweb, Globo.com, SERPRO, Interlegis (órgão vinculado ao Senado Federal), entre outras. Diversos softwares como GIMP, Inkscape e Blender utilizam Python para extensões e criação de plugins.

O Framework - web2py

web2py - framework para desenvolvimento de aplicações Web em Python O web2py é um framework para desenvolvimento Web escrito em Python, software livre e gratuito, que tem como um de seus principais objetivos agilidade e facilidade no desenvolvimento de aplicações Web seguras, baseadas em banco de dados.
Ele possibilita ao desenvolvedor pensar apenas na aplicação que está desenvolvendo (sem demandar configurações de linguagem e ferramentas), fazendo com que o desenvolvedor foque no problema que precisa resolver, e não em problemas relacionados à linguagem ou a alguma ferramenta. Possui integração com mais de 10 sistemas de banco de dados, e vários subssistemas, como: criação automática de formulários com validação, autenticação e autorização, gerador de códigos AJAX para melhor interação do usuário com a aplicação, upload seguro de arquivos, integração com vários padrões Web (XML, RSS etc.), dentre outros.

O Curso - Mão na Massa

Tutorial Mão na Massa - Tempo Real Eventos Os treinamentos acontecerão no estilo "tutorial mão na massa", onde cada aluno tem um computador para testar e treinar o que está sendo ensinado; o objetivo desses treinamentos é capacitação no desenvolvimento de aplicações Web utilizando Python e web2py a desenvolvedores que procuram uma ferramenta para desenvolvimento ágil, dinâmico, seguro e fácil de utilizar. O curso acontecerá em um sábado (assim que fecharmos a turma ou no máximo em 45 dias), o dia todo: de 9 às 17h. Caso exista interesse em treinamento in company, entre em contato comigo (alvaro [arroba] justen [ponto] eng [ponto] br).

O treinamento é dividido em dois módulos: Básico e Avançado. Para o módulo básico, é preciso ter conhecimento básico em HTML e lógica de programação (em qualquer linguagem) e para cursar o módulo avançado, é aconselhável que o interessado tenha participado do primeiro módulo, ou tenha conhecimentos equivalentes.

Os treinamentos possuirão apostila própria e durante eles será desenvolvida uma aplicação Web completa e funcional. Serão abordados vários temas com relação a desenvolvimento Web como MVC, sessões, autenticação e autorização, internacionalização, deploy, Google App Engine, dentre outros. Além disso, tudo será baseado em software livre: os computadores do laboratório terão Ubuntu 10.04.

O valor da inscrição em cada módulo é R$249,00 e, juntamente com o treinamento, cada aluno terá direito a:

  • Coffee Break (2)
  • Certificado de Participação em papel especial
  • Material Didático (apostila impressa, bloco de anotações e caneta)
Para mais informações e inscrições visite o site da Tempo Real Eventos:

Gostou da ementa dos cursos? Gostaria de que mais algum assunto fosse adicionado? Tem interesse em algum dos cursos? Comente!

quinta-feira, 24 de junho de 2010

Porque eu sou um amigo do GNOME

GNOME (que é um acrônimo para GNU Network Object Model Environment) é um projeto de software livre filiado ao projeto GNU que tem como finalidade oferecer um ambiente de trabalho composto inteiramente por software livre - dando ênfase em usabilidade, acessibilidade e internacionalização. Ele é utilizado no Ubuntu e em muitas outras distribuições.

Foresight Linux rodando GNOME 2.20 - screenshot da Wikipédia
Foresight Linux rodando GNOME 2.20 - screenshot da Wikipédia

Há alguns dias atrás fiz uma pequena doação de US$25 para a GNOME Foundation; as doações ajudam a manter e melhorar o projeto - eles costumam fazer hackfests, que são eventos em que os desenvolvedores se reúnem para, juntos, implementarem/melhorarem alguma determinada funcionalidade do projeto - ano passado tiveram 6, e o próximo será sobre acessibilidade. O dinheiro também serve para contratar pessoas e pagar as contas. Recebi um mousepad e alguns adesivos, juntamente com uma carta agradecendo a minha doação:

Meus mousepad e adesivos do GNOME
Meus mousepad e adesivos do GNOME

E você, o que está esperando para contribuir e deixar a próxima versão (GNOME 3.0) melhor? Vários projetos de software livre são gratuitos e em boa parte das vezes os desenvolvedores não recebem dinheiro (diretamente) para desenvolvê-los, são voluntários. Se cada um fizer sua contribuição, daremos infraestrutura melhor para que esses voluntários consigam fazer um software melhor para nós todos - e no final todos saem ganhando! Seja um amigo do GNOME!

quarta-feira, 2 de junho de 2010

Porque eu adoro o sistema de views do web2py

Vindo de mim, um elogio ao web2py pode parecer tendencioso, já que sou um dos desenvolvedores do framework. Porém uma coisa que me fascinou, mesmo antes de me tornar desenvolvedor, foi a implementação da camada de apresentação (views, do modelo MVC).

No web2py a camada de apresentação é parecida com código PHP: você utiliza a linguagem que precisar para apresentação do conteúdo (HTML, CSS, XML, JavaScript ou qualquer outra que desejar) e pode embutir código Python no meio. A grande sacada - que trás muita simplicidade e flexibilidade ao desenvolvedor - é exatamente o fato de podemos embutir código Python. Com isso, ganhamos inúmeras vantagens:

  • Você não precisa aprender a utilizar uma linguagem de templates nova: é Python - mesma linguagem em que você programa seus models e controllers!
  • Como o código da view pode ser transformado em um módulo Python, a execução da view fica muito mais rápida, pois o web2py a traduz para código Python puro e então o compila para bytecode;
  • Você não fica limitado a uma linguagem restrita (como são as linguagens criadas para a camada de apresentação) - você pode utilizar todo o poder que Python lhe proporciona sempre!
  • Você pode criar qualquer formato de saída para sua camada de apresentação, o que significa que não necessariamente a saída da sua view precisa ser escrita em alguma linguagem de marcação (HTML, XML etc.). Você pode, por exemplo, ter uma view que gera um arquivo JPEG, um texto em RTF, um documento em PDF, um arquivo em CSV e por aí vai;
  • A camada de apresentação está desacoplada das outras camadas, o que significa que uma única view pode servir a vários controllers ou um único controller pode ter como apresentação várias views diferentes em ocasiões diferentes.

Eu poderia citar vários outros exemplos (inclusive da ótima integração da camada de apresentação com as outras camadas do framework), mas as outras dicas ficarão diluídas nos próximos artigos. Porém, não poderia deixar esse artigo sem código. Como todo bom programador, vamos ao que interessa:

Exemplo 1 - View gerando HTML

Digamos que possuímos um sistema de inscrição em eventos e precisamos listar uma tabela com o nome do participante inscrito e assinalar se ele pagou ou não a inscrição. Dessa forma, possuímos um model (por exemplo, models/db.py) parecido com:

db.define_table('participante',
    Field('nome', 'string', length=250),
    # inclua outros campos aqui
    Field('pagou', 'boolean'),
)

Então precisamos de um controller que seleciona os nomes dos inscritos e o estado do pagamento. Vamos chamar esse controller de controllers/usuarios.py:

def tabela_de_pagamentos():
    inscritos = db().select(db.participante.nome, db.participante.pagou,
                            orderby=db.participante.nome)
    return {'nome_e_pagamento': inscritos}

Com isso, nossa view será executada em um ambiente onde a variável nome_e_pagamento existe e seu conteúdo é o que foi retornado pelo controller acima. Vamos então criar uma view que gera HTML para o controller acima. Coloque no arquivo views/usuarios/tabela_de_pagamentos.html:

{{if len(nome_e_pagamento) == 0:}}
Não temos usuários cadastrados! :-(
{{else:}}
<table>
  <tr>
    <td> Nome </td>
    <td> Pagou? </td>
  </tr>
{{
for usuario in nome_e_pagamento:
    if usuario.pagou:
        pagou = 'Sim'
    else:
        pagou = 'Não'
    pass
}}
  <tr>
    <td> {{=usuario.nome}} </td>
    <td> {{=pagou}} </td>
  </tr>
{{pass
pass}}

Tudo o que está entre {{...}} será executado como código Python. Além disso, o web2py inclui algumas novas palavras-chave para ajudar no processo de criação de views, são elas:

  • {{=expressão_Python}}: executa expressão_Python e imprime o resultado no local;
  • {{extend 'arquivo.html'}}: utiliza a view arquivo.html como base para essa view;
  • {{include}}: indica onde outras views que utilizam essa como base serão adicionadas.

Pode parecer estranho acima o uso da keyword pass. Elas estão lá por conta de uma definição no sistema de apresentação do web2py: por conta de espaços na camada de apresentação fazerem diferença, seria complicado em todos os casos o programador manter a endentação correta do código.
Para resolver esse problema o web2py então gera um novo código baseado em nossa view, ignorando a endentação que utilizamos - ele auto-endenta o código quando encontra if, for etc. Para voltar um nível, como a endentação na view é ignorada, precisamos utilizar a palavra reservada do Python pass. Note que essa palavra reservada faz parte da linguagem e sua função é apenas "passar" (não executa comando algum) - nesse caso ela serve como um sinal para o web2py voltar um nível na endentação.
Note que como a endentação é feita automaticamente, eu não precisaria ter endentado o código entre {{...}}. Porém nesse caso a endentação não atrapalha o código de retorno da minha view e por motivos de organização deixei o código endentado.

Para o exemplo acima, se acessarmos a URL http://localhost:8000/welcome/usuarios/tabela_de_pagamentos (ou http://localhost:8000/welcome/usuarios/tabela_de_pagamentos.html) teríamos como retorno a view acima processada, como nos dois exemplos abaixo, sem e com dados inseridos na tabela:

View do web2py mostrando tabela de pagamentos vazia
View do web2py mostrando tabela de pagamentos cheia

Nota: utilizei/modifiquei a aplicação welcome (que já vem com o web2py) para fazer esses exemplos.

Exemplo 2 - View gerando CSV

Para os mesmos model e controller acima poderíamos ter uma view que gera um arquivo CSV com os dados, em vez de HTML. Vamos então criar o arquivo views/usuarios/tabela_de_pagamentos.csv:

{{
import cStringIO
csv = cStringIO.StringIO()
nome_e_pagamento.export_to_csv_file(csv)
response.write(csv.getvalue())
csv.close()
}}

Não vou entrar em detalhes do código acima, mas para quem estranhou a presença do objeto response fica a explicação: o web2py, para aumentar a produtividade do desenvolvedor, leva a sério o conceito Don't Repeat Yourself e, por isso, ele mesmo importa automaticamente os objetos de sua API que precisamos utilizar (nesse caso, o objeto response).

Feito o código acima, ao entrarmos em http://localhost:8000/welcome/usuarios/tabela_de_pagamentos.csv será feito o download de um arquivo CSV. Abrindo, teremos:

Arquivo CSV gerado pela view do web2py sendo visto no OpenOffice.org

Como disse acima, poderíamos utilizar outras extensões nas views e gerar quaisquer tipos de arquivos que quisermos com código Python. Em uma aplicação que desenvolvi há alguns meses precisei criar views que gerassem PDF (para relatórios sob demanda) e tudo funcionou perfeitamente.
Espero que os exemplos acima tenham explicitado o poder e flexibilidade que esse sistema de apresentação possui. Dúvidas? Entre na lista brasileira de usuários web2py e perguntem-me lá!