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á!

quinta-feira, 27 de maio de 2010

PythOnCampus Madureira na Estácio

Como comentei no post anterior, semana passada estive na PythOnCampus do LNCC/IST, em Petrópolis. E a caravana não pára: nesse sábado teremos mais uma edição da PythOnCampus em Madureira, na Estácio.

Para quem não conhece, PythOnCampus é um evento itinerante onde a comunidade de desenvolvedores Python do estado do Rio de Janeiro (PythOnRio) se reúne para levar conhecimentos sobre a linguagem, software livre, metodologias ágeis e experiência de mercado para os alunos de um determinado campus universitário. As PythOnCampi geralmente possuem sessões de Coding Dojo, levadas pela galera do DojoRio e minicursos de Python e/ou ferramentas da linguagem.

Galeras da PythOnRio e DojoRio na PythOnCampus LNCC-IST
Galeras da PythOnRio e DojoRio na PythOnCampus LNCC-IST

Nesse sábado darei minha contribuição com a palestra Economizando tempo e dinheiro com frameworks Web, que acontecerá às 12h. Nela abordarei conceitos básicos de frameworks MVC, passarei por alguns exemplos de frameworks para desenvolvimento Web escritos em Python e, para finalizar, mostrarei um exemplo de aplicação Web com o web2py.

O que você está esperando? Se inscreva gratuitamente na PythOnCampus Madureira/Estácio - nos vemos lá!

segunda-feira, 24 de maio de 2010

Coding Dojo em Três Rios

No sábado passado fui a Petrópolis na PythOnCampus que aconteceu no LNCC, onde palestrei sobre software livre e Arduino. O evento foi sensacional - depois dele, de passagem comprada, fui para a rodoviária pegar ônibus para Três Rios, minha cidade natal.

Em Três Rios estavam me esperando a coordenadora do curso de Tecnologia em Sistemas de Computação do CEDERJ de Três Rios, Isabel Hortência, e alguns de seus alunos para a primeira sessão de Coding Dojo da cidade! Antes de começarmos, fiz uma pequena apresentação sobre Coding Dojo e Python. Não preciso nem comentar que o encontro foi sensacional.

Isabel Hortência e seus alunos do CEDERJ
Isabel Hortência e seus alunos do CEDERJ

Como utilizamos a linguagem Python, os alunos, obviamente, ficaram interessados em fazer uma PythOnCampus lá (vontade minha de alguns meses), então já marcamos - faremos no semestre que vem. O problema que resolvemos foi o clássico Fizz Buzz, problema simples porém perfeito para uma primeira sessão de Coding Dojo.

Alunos do CEDERJ Três Rios programando no Coding Dojo
Alunos do CEDERJ Três Rios programando no Coding Dojo

Apesar de a galera não ter registrado em papel a retrospectiva, todos comentaram o que acharam bom e o que podemos melhorar:

O que foi bom

  • Python é uma ótima linguagem;
  • Dojo é bom pra aprender a compartilhar o código com os outros;
  • Apesar de o problema ter sido bem simples, foi muito bom para mostrar a dinâmica e explicitar os problemas que podem acontecer quando se desenvolve software em equipe;
  • A experiência foi legal para relembrar alguns conceitos e exercitar lógica de programação;
  • Ninguém além de mim (Álvaro) sabia Python, porém a galera foi fazendo tudo naturalmente sem parenteses, sem "end if" etc. sem nem perguntar. Foi sensacional ver como a linguagem é intuitiva e como é fácil aprender a programar dessa forma.

O que podemos melhorar/Compromissos

  • Não conseguimos clonar a tela do datashow para o monitor, piloto e copiloto ficaram de lado para a plateia e tendo que olhar para o projetor, que ficou meio longe - temos que aprender a configurar o datashow corretamente;
  • Isabel não programou - da próxima sessão ela não escapa!;
  • Alguns precisaram sair cedo (antes mesmo de começarmos a programar) - as próximas sessões serão em um horário melhor para todos;
  • Ficamos programando durante pouco tempo - nas próximas sessões não teremos apresentação, então conseguiremos ficar mais tempo;
  • Não fizemos a retrospectiva "em papel" - fazer na próxima sessão.

Os alunos já se organizaram e farão outros encontros regularmente - sempre que estiver em Três Rios me juntarei a eles. :-) É importante ressaltar que tudo isso não teria acontecido e não daria prosseguimento se não fosse a professora Isabel Hortência, que está sempre incentivando os alunos a ir além e preparou a casa para a gente. E assim nasce mais um fork do DojoRio com o intuito de trocar conhecimento e aprender a programar direito. Missão cumprida!

quarta-feira, 21 de abril de 2010

Pequenas ações, grandes revoluções

"Small acts make great revolutions", já dizia Caike Souza - frase que, dentre outras coisas, deu origem ao Small Acts Manifesto. Esse tema tem a ver com a palestra sobre comunidades de software livre que ministrei no 15º EDTED Rio de Janeiro, onde cito o simples ato de Richard Stallman ter criado o Manifesto GNU que acabou desencadeando uma série de ações, projetos, eventos e muitas outras coisas que mudaram completamente a vida de muitas pessoas e instituiçoẽs (algumas existem só pelo fato de o Manifesto ter sido criado); as proporções são tão grandes que fica até difícil mensurar. O tema tem a ver também com a teoria do caos, mas isso fica para outro post. ;-)

Logo do Small Acts Manifesto

Um bom exemplo é a sequência de Arduino Hack Days que estão acontecendo: um encontro informal aqui em casa para falarmos sobre eletrônica, brincarmos com o Arduino e tomar cerveja. Apesar da simplicidade dos encontros, a repercursão foi muito boa:

Pequenas ações fazem toda a diferença e é isso que as galeras da PythOnRio/PythOnCampus, #horaextra, DojoRio e Forkin'Rio estão fazendo - e tem dado muito certo. Se você tem alguma ideia, apenas faça! Ou como diria o Small Acts Manifesto: Do it! - as simple as you can, just what is essential to pass it forward. E você, já fez sua pequena ação revolucionária de hoje?

domingo, 4 de abril de 2010

Como foi o Arduino Hack n' Beer RELOADED

Na última quinta-feira aconteceu o Arduino Hack n' Beer RELOADED. Foi o maior encontro de todos: começou às 19h de quinta-feira e foi até às 7h de sexta!

Além de ter sido o que mais durou, nesse encontro rolou mais gente (total de 10 pessoas) e mais cerveja. Compareceram:

  1. Álvaro Justen (eu)
  2. Ângelo
  3. Cláudio Berrondo
  4. Flávio Amieiro
  5. Gabriel
  6. Israel Teixeira
  7. KurtKraut
  8. Marcello Silva
  9. Mariana Bedran
  10. Rodrigo Pinto

Nesse encontro melhoramos um bug na função de tocar som no projeto que tínhamos feito no Arduino Hack n' Beer (sun)Day (projeto senha.pde: botão + display + buzzer), adicionamos uma funcionalidade que a Mariana Bedran sugeriu e depois partimos para um novo projeto - além, é claro, das conversas paralelas sobre redes e Internet, software livre, eletrônica e o que mais viesse à cabeça.

Esse novo projeto, carinhosamente apelidado de Turiquinhas pela galera do 2º Sprint PythOnCampus, é um robô que anda pra frente, trás e para os lados. Ficou sensacional! O projeto surgiu da junção de vários componentes que cada um levou (servo motores, rodinhas, buzzer, potenciômetro, protoboard, arduino etc.). Confira o vídeo:


Valeu Henrique Bastos pelo vídeo!

Dessa vez não tínhamos o Pedro Menezes pra tirar fotos, então tivemos poucas. Mas tivemos! Confira as fotos do Arduino Hack n' Beer RELOADED no Flickr! Valeu KurtKraut pelas fotos!

Além do vídeo e das fotos, postei os códigos de todos Arduino Hack n' Beer no BitBucket.

E para quem não foi, não se preocupe! Teremos mais eventos - e o melhor: ninguém menos que Jon maddog Hall me falou que estará no Rio em breve e tentará participar do próximo evento!

quarta-feira, 31 de março de 2010

Arduino Hack n' Beer Day RELOADED

Nessa quinta-feira teríamos Coding Dojo em Niterói, na UFF. Por conta do ponto facultativo não será possível utilizar a infra-estrutura da universidade. Então resolvi marcar mais um Arduino Hack Day! :-D

A ideia desse Arduino Hack n' Beer Day (RELOADED) é continuar o projeto que começamos no Arduino Hack n' Beer (sun)Day (que foi sensacional!). Iremos comer carne, beber cerveja e programar um pouco.

O encontro começará às 19h de amanhã (quinta-feira, 1 de abril de 2010) e acontecerá em minha casa (para quem não sabe como chegar, darei mais detalhes via email quando confirmar participação - leia abaixo).

Para quem veio domingo, basta confirmar presença via email, já que a galera de domingo comprou carne e sobrou - então usaremos amanhã.
Para quem não veio, é necessário:

  • Confirmar presença enviando email diretamente pra mim (alvaro arroba justen ponto eng ponto br). As vagas são limitadas!
  • Entender o que fizemos no Arduino Hack n' Beer (sun)Day (ver vídeo, fotos e entender o código);
  • Trazer cerveja.

Até lá! :-)

segunda-feira, 29 de março de 2010

Arduino Hack n' Beer (sun)Day foi sensacional!

Ontem tivemos o segundo Arduino Hack Day ou, mais precisamente, o Arduino Hack n' Beer (sun)Day - a variação no nome é por conta da cerveja e por ter sido em um domingo. ;-)

Arduino Duemilanove
Arduino Duemilanove

Estiveram presentes:

  1. Álvaro Justen - Turicas (eu)
  2. Pedro Menezes
  3. Oscar Bacelar
  4. Flávio Amieiro
  5. Mariana Bedran
  6. Bernardo Botelho
  7. Henrique Bastos

O objetivo do encontro, assim como do primeiro, é difundir e aprendermos mais sobre o Arduino. No primeiro Arduino Hack Day fizemos uma espécie de piano; nesse dei a ideia de reproduzirmos o sistema de aviso de senha que encontramos em restaurantes: basicamente, esse tipo de sistema necessita de um teclado para que o atendente entre com a senha, um visor para que a senha seja exibida e algum tipo de caixa de som para disparar um aviso sonoro quando uma senha for colocada; esse tipo de sistema é utilizado em várias redes de fastfood para avisar aos clientes quando o pedido fica pronto.

Antes de metermos a mão na massa fizemos um churrasco e teve cerveja. :-)

Churrasco no Arduino Hack n' Beer (sun)Day
Churrasco no Arduino Hack n' Beer (sun)Day

Depois de abastecidos seguimos as seguintes etapas:
  • Planejamento
    Comecei apresentando os componentes eletrônicos que tínhamos disponíveis:

    Então fizemos um brainstorm para listar todas ideias que os participantes tinham para esse projeto. Essas ideias passaram por um filtro para eliminar as impossíveis de serem implementadas (por falta de hardware, falta de tempo etc.); para finalizar o planejamento dividimos as tarefas em categorias, repassamos todas tarefas para verificar se nenhuma faltava e, dentro de cada categoria, priorizamos as tarefas mais importantes.

    Álvaro Justen escrevendo os post-its com as tarefas
    Álvaro Justen escrevendo os post-its com as tarefas

  • Execução
    Tendo as tarefas bem definidas, começamos então a executar o projeto. Tínhamos dois Arduinos disponíveis (meu e do Flávio Amieiro), então nos dividmos em duas equipes para paralelizarmos o processo e maximizar o aprendizado individual. Uma das equipes ficou focada em mostrar a senha no display e outra na entrada de dados (botão) e na parte sonora.

    Equipes implementando o projeto
    Equipes implementando o projeto
    Equipes implementando o projeto
    Equipes implementando o projeto

  • Integração Para finalizar o projeto, as duas equipes se uniram para integrar tanto o software quanto o hardware que criaram.

    Álvaro Justen unificando os componentes eletrônicos
    Álvaro Justen unificando os componentes eletrônicos

  • Final

    Para finalizar, fizemos um vídeo explicando o projeto e demonstrando o sistema criado; tem até making-of no final!

    Infelizmente não temos um esquema elétrico/eletrônico do circuito disponível, mas disponibilizamos o código-fonte no BitBucket - é software livre: baixe, aprenda, aprimore e envie de volta pra gente!

    hg clone https://turicas@bitbucket.org/turicas/arduino_hack_day/

E não pensem que paramos por aí. Depois dessa bagunça divertida, fomos pra casa do Bernardo Botelho estudar Python! Veja mais detalhes sobre o que rolou no grupo de estudos sobre Python do DojoRio.

Gostaria de agradecer a presença de todos, a ideia do Flávio Amieiro de nos encontrarmos ontem e ao Pedro Menezes pelas fotos e pelo vídeo!

Se você não foi e ficou com vontade, não deixe de ir no próximo! Acompanhe meu blog (siga-o via RSS) para mais novidades - como sobrou carne, teremos um outro encontro logo logo. ;-) Aproveite também para ver todas as fotos no Flickr do Pedro Menezes.