Sprint Plone no Plone Symposium

November 11, 2009 No comments »

Nossa já faz 2 meses que não escrevo!

Esse post é fruto da minha empolgação com Sprint que vai rolar na Simples após o Plone Symposium.

Vou participar de 2 dias de Sprint com pessoas importantes como Alexander Limi, Eric Steele e Dorneles Treméa e poder me divertir trabalhando a favor do noss Plone!

Vocês também podem participar, não “perdam“!

Vejam a programação.

Eu tenho interesse particular num bug que já trabalhei mais ainda não consegui corrigir.

Além disso no evento haverá os OpenSpaces, onde poderemos trocar experiências. Nesse caso um dos meus interesses será falar sobre testes no Zope/Plone.

Relato PythonBrasil[5]

September 15, 2009 1 comment »

Foi ótima a PythonBrasil[5].

Primeiramente quero começar dizendo que aqui é um relato pessoal e vou tentar evitar falar das coisas óbvias, como elogiar e/ou agradecer Luciano Ramalho, Senra, Deo, Niemeyer, e outros.

O nosso evento foi muito bom, mesmo Caxias tentando diminuir o seu brilho, com muito frio, neblina e chuva.

Comecei perdendo a palestra do Jacob, devido ao mau tempo de Caxias que atrasou meu voo.

Senti falta de grandes amigos como Bruno Gola, Humberto Diógenes, Werneck, Daniel Cassiano, Lameiro, outros e até o Andrews Medina que estava lá mas nos encontramos pouco.

Aliás, um puxão de orelha para mim, que nessa PythonBrasil, conversei pouco com novas pessoas.

Só no último dia vi quem era o Kao, mau conversei com o nosso promotor do pypy, Santagada, o divertidíssimo ikke e o nosso programador do ano Marinho.

O Marinho com sua palestra relâmpago me convenceu a dar uma olhada no seu “filho” Geraldo Reports.

Vale mais um agradecimento ao Bruno (e ao Yahoo!) e ao xiru que me forneceram caronas nos primeiros dias de boa vontade. :-)

Conheci várias coisas que posso passar a utilizar, o Rudá Figueiras, me mostrou alguns benchmarks com o Zope/Plone, e a ferramente de benchmark FunkLoad – http://funkload.nuxeo.org/ que certamente vamos usar na Simples.

Na palestra Django Apps do Leandro Zanuz, que eu cheguei no finalzinho, eu vi que ele utilizou uma ferramenta legal para o analisar os dados de profile, eu já fiz uns profilers em alguns casos e essa ferramenta pareceu bem útil, mas preciso descobrir qual é. :-/

Alguns fatos em ordem cronológica:

O finalzinho da palestra do Santagada sobre o compilador JavaScript do pypy, me deixou mais motivado a tentar o pypy.

Enquanto o Rudá me mostrava o benchemark do Zope/Plone eu perdia a palestra do Bruno e do Rodrigo Bamboo, que vi só o finalzinho e todos elogiaram, evento bom é isso, enquanto você algo legal você perde outras coisas bem legais.

A palestra do Colin sobre a turbinada que eles estão fazendo no nosso CPython, me deixou mais motivado a estudar o CPython.

A palestra do Niemeyer colocou todos para pensar sobre as nossas qualidades e defeitos enquanto liguagem e comunidade, comparando-os com Java.

O GIL (Global Interpreter Lock), foi referenciado diversas vezes no evento e normalmente citando-o como uma limitação de nossa implementação padrão.

O fato engraçado foi que na palestra do Niemeyer, quando ele começou a criticar o GIL a chuva que nunca parava de cair, virou uma tempetade que fazia um barulho dificultando ouvir a palestra.

A APyB

Tivemos nossa Assembléia, e a votação para a nova Diretoria, agora eu sou Diretor Administrativo. :-)

Depois tivemos um debate sobre a nossa postura sobre as PythonBrasis, porque não tivemos nenhum candidatura no prazo. Prazo prorrogado por 4 semanas. E Curitiba é uma forte candidata.

Minha Palestra

Minha palestra foi após a do Gustavo Niemeyer, entre nossos palestras teve a foto do evento.

Na minha palestra ficaram poucas pessoas. :-( E não sube utilizar bem o tempo.

A material já está on-line, pode ser visto aqui .

Agora é nos prepararmos para começar oreganizar a Python Brasil [6].

Django + AMF + Flex

August 23, 2009 5 comments »

Hoje fui almoçar na casa da mamãe e levei o note – o macluck. Meu pai estava lá estudando o C# com o Flex, que eles estão começando a utlizar na Mult .

O assunto foi o que utilizar entre o .Net e o Flex? Web Service (xml), JSON ou qualquer outra coisa.

Com isso fiquei pensando nas alternativas em Python e pesquisando o pessoal recomenda utilizar o formato AMF para serializar e transmitir objetos do servidor para o cliente Flex.

Logo pensei em tentar fazer algo em Django + AMF.

E é isso que vamos ver, faremos um Hello World. ;-)

O que precisamos ?

Django, SQLite e DjangoAMF no servidor para conseguirmos enviar objetos para o cliente Flex.

Flex SDK para compilarmos os fontes Flex e gerarmos o .swf que irá rodar no browser.

O Flex roda no Flash Player, portante você precisará dele também, mas hoje em dia todo mundo tem, afinal precisamos assistir ao YouTube. :-)

Instanlando o Flex SDK

Faça o download do Flex SDK , esse é um arquivão gigante com o Flex SDK compilado para as 3 plataformas (Linux, Mac e Win), ou seja basta descompactar em uma pasta que está pronto.

Mas crie uma pasta só para esse arquivo .zip, pois ele irá criar tudo na pasta em que ele está.

Então façamos isso:

  1.     $ mkdir -p ~/bin/flex-sdk   # vou colocar no diretório bin na home do meu usuário
  2.     $ cd ~/bin/flex-sdk
  3.     $ wget http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip
  4.     $ unzip flex_sdk_3.zip

Vamos testar compilando um exemplo:

  1.     $ cd ~/bin/flex-sdk/samples/explorer
  2.     $ ./build.sh # ou 'sh build.sh' ou no windows 'build.bat'

Agora verifque se funcionou abrindo o arquivo ~/bin/flex-sdk/samples/explorer/explorer.html

Você verá algo como:

Flex Explorer

Vamos para o Django

Eu utilizo o virtualenv, mas você pode fazer sem ele se você preferir.

Criando o virtualenv, o importante é utilizar pelo menos o Python 2.5, pois o DjangoAMF requer.

  1.     $ cd ~/src_rm # diretório onde deixo os fontes que desenvolvo
  2.     $ virtualenv django_flex
  3.     $ cd django_flex
  4.     $ source bin/activate

Instalar o Django 1.1 e o DjangoAMF:

  1.     $ easy_install django
  2.     $ mkdir src   # ~/src_rm/django_flex/src
  3.     $ cd src
  4.     $ wget http://globalbase.dl.sourceforge.jp/djangoamf/36602/djangoamf-0.8.zip
  5.     $ unzip djangoamf-0.8.zip
  6.     $ cd djangoamf-0.8
  7.     $ python setup.py install

Criando uma aplicação django

  1.     $ cd ~/src_rm/django_flex
  2.     $ django-admin.py startproject mysite
  3.     $ cd mysite
  4.     $ python manage.py startapp teste
  5.     $ vi settings.py

Configure no settings.py, o banco de dados e adicione o Middleware do DjangoAMF que permitirá enviar os objetos pelo protocolo AMF.

Arquivo: mysite/settings.py
  1. DATABASE_ENGINE = 'sqlite3'
  2. DATABASE_NAME = 'mydb.db'
  3.  
  4.  
  5. MIDDLEWARE_CLASSES = (
  6.     'amf.django.middleware.AMFMiddleware',
  7. )

Agora vamos fazer um método que será chamado pelo Flex:

Arquivo: mysite/teste/views.py
  1.  
  2. import datetime
  3.  
  4. def horaAgora(request):    
  5.     return datetime.datetime.now()

Vamos configurar para essse método utilizar o AMF:

Arquivo: mysite/urls.py
  1.  
  2. urlpatterns = patterns('',
  3.     (r'^gateway/teste/(.*)', 'amf.django.views', {'views': 'mysite.teste.views'}),
  4. )

Isso é o básico para você conseguir fazer a chamada no Flex.

Fazendo o nosso cliente Flex

Eu vou utilizar o Flex sem o Flex Builder que é pago, você pode fazer com Flex Builder, ou se você tiver no Windows com o FlashDevelop, que dá para trabalhar muito bem com o Flex.

Eu fiz o cliente Flex em outra pasta fora do Django e do virtualenv, para dar a idéia de ser totalmente separado, só fazendo a chamada via HTTP (e AMF).

  1.    $ cd src_rm
  2.    $ mkdir flex_cliente
  3.    $ cd flex_cliente
  4.    $ vi hora_servidor.mxml

Agora vem a parte que eu não conheço muito e praticamente só copiei daqui .

Muito embora, eu também não domino o Django eu comecei a estudar ele a pouco tempo e não sei muito não. :-/

Arquivo: hora_servidor.mxml
  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="getTime()">
  4.  
  5. <mx:Script>
  6.  
  7.  <![CDATA[
  8.  
  9.   import mx.controls.Alert;
  10.   import mx.rpc.events.ResultEvent;
  11.   import mx.rpc.events.FaultEvent;
  12.   import mx.rpc.remoting.mxml.RemoteObject;
  13.  
  14.   private function getTime(): void {
  15.    var ro: RemoteObject;
  16.    ro = new RemoteObject("teste"); // Aqui é o nome do objeto remoto, no nosso caso temos apenas uma função, mas o que está após o /gateway/ no urls.py, será considerado o objeto remote
  17.    ro.endpoint = 'http://127.0.0.1:8000/gateway/'  // URL do que chama-se de gateway
  18.    ro.addEventListener(FaultEvent.FAULT, getErro);
  19.    ro.addEventListener(ResultEvent.RESULT, showResult);
  20.    ro.getOperation('horaAgora').send();   // nome do método do objeto remoto
  21.  
  22.   }
  23.   public function getErro(ro:FaultEvent): void {
  24.    Alert.show(ro.fault.faultDetail);
  25.  
  26.   }
  27.   public function showResult (ro: ResultEvent) :void {
  28.  
  29.    Alert.show("A hora é " + ro.result);
  30.   }
  31. ]]>
  32.  
  33.  
  34. </mx:Script>
  35. </mx:Application>

Agora temos que compilar o danado.

Eu não coloquei o diretório bin do Flex SDK no PATH, pois eu não uso o Flex no dia-a-dia, portanto terei que utilizar o caminho para o compilador, mas se você for utilizar isso no dia-a-dia, recomendo colocar no PATH.

  1.      $ cd ~/src_rm/flex_cliente
  2.      $  ~/bin/flex-sdk/bin/mxmlc hora_servidor.mxml

Pronto você já tem um cliente Flex, pode abrí-lo no Firefox, no Safari eu não consegui abrir o .swf, tive que fazer um HTML que chama o .swf. :-/

Se você tiver sorte já irá funcionar :-) E você verá algo como:

Flex Cliente OK

Ou você não teve sorte e apareceu algo como:

Flex Cliente Erro

Mas você não deve ter sorte, e teremos que adicionar um novo arquivo no “servidor”, lá no Django, para o Flex funcionar, eu não entendi direito o que é isso e porque as vezes funciona sem esse arquivo.

Eu estava estudando isso por puro prazer, então não fui muito a fundo nos questões referentes ao flex, porém isso é algo importante para se saber ao usar em um ambiente de produção.

Vamos vamos resolver:

Lá no Django vamos criar um novo arquivo e disponibilizá-lo na raiz do site.

  1.     $ cd ~/src_rm/django_flex/mysite
  2.     $ vi crossdomain.xml

O arquivo deve conter esse conteúdo:

Arquivo: mysite/crossdomain.xml
  1. <?xml version="1.0"?>
  2. <cross-domain-policy>
  3.    <allow-http-request-headers-from domain="*" headers="*" secure="false" />
  4.    <allow-access-from domain="*" secure="false" />
  5. </cross-domain-policy>

Ainda falta ensinar o Django a disponibilizar esse arquivo como se estivesse na raiz.

Arquivo: mysite/urls.py
  1.  
  2. from django.conf import settings
  3.  
  4. if settings.DEBUG:
  5.     urlpatterns += patterns('',
  6.         (r'^(crossdomain.xml)$', 'django.views.static.serve', {'document_root': './'}),
  7.     )

Provavelmente tem outras formas mais intenligentes de disponibilizar isso no raiz do Django, mas como eu sou iniciante ainda, fiz desse jeito mesmo que é simples o suficiente para resolver o problema. :-)

E agora está pronto nosso Hello World, ou melhor, nosso What time is it ?

Eu achei legal e simples a forma de utilizar o AMF no Django, permitindo interagir com clientes Flex.

E vocês, o que acharam ?

Fontes:

Django AMF: http://djangoamf.sourceforge.jp/
Django + Flex: http://chevitarese.wordpress.com/2009/07/24/django-django-e-flex-1%C2%B0-exemplo/
Django + Flex: http://chevitarese.files.wordpress.com/2009/07/djangoflex.pdf
VIM + Flex: http://ubuntuforums.org/showthread.php?t=742981
Meu VIM, agora com flex: http://hg.lucmult.com.br/vim/rev/32e24bf7768a
Flex SDK: http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip

Customize o hg web

July 12, 2009 2 comments »

No post anterior configuramos o hg web, mas temos mais algumas opções que podemos configurar, por exemplo:

  1. Configurar permissões de usuários
  2. Tema do seu repositório
  3. Informações dos projetos
  4. Habilitar downloads de snapshots do repositório

As configurações podem ir na home do usuário que roda o serviço ~/.hgrc, ou como é mais utilizado, dentro de cada projeto hospedado /path/do/projeto/.hg/hgrc, ou ainda como utilizamos no hgweb.config que configura o serviço WSGI, funciona também para CGI

Dentro de cada projeto você pode gerenciar os usuários que podem fazer commit (pull):

Uma configuração útil para ir no hgweb.config é qual tema você quer utilizar:

Os temas disponíveis estão em:

  1. /usr/share/mercurial/templates

E são eles:

coal gitweb monoblue paper spartan

Ainda no hgweb.config você pode configurar quais projetos você quer publicar.

Podemos fazer estaticamente cada um dos projetos

  1. [paths]
  2. repo1 = c:/webdata/repos.merc/images
  3. repo2 = c:/webdata/repos.merc/web/htdocs/

Ou como eu utilizei no post anterior:

  1. [paths]
  2. /trunk = /webdata/hg_repos/trunk/**  # verifica recursivamente os repositórios

ou ainda:

  1. [paths]
  2. /trunk = /webdata/hg_repos/trunk/*  # verifica somentes repositórios em trunk

Você pode configurar por projeto, contat, description, name e permissões de push

  1. [web]
  2. allow_archive = gz zip bz2  # permite o download do repositório nesses formatos
  3. push_ssl = false                     # permite o push por http puro
  4. deny_push = saruman         # negar o push para o usuário saruman
  5. allow_push = frodo, sam     # permitir o push para frodo e sam
  6. allow_push = *                       # permitir o push para todos
  7. contact = Bilbo Baggins        # informações de contato sobre o repositório, pode colocar o seu e-mail por exemplo
  8. description = My precious!  # Um descrição do projeto
  9. name = lord/rings                  # Um noe para o projeto

É isso ai, agora já dá para deixar os seus repositórios na publicados e personalizados. ;-)


Referências:
http://mercurial.selenic.com/wiki/HgWebDirStepByStep
http://mercurial.selenic.com/wiki/PublishingRepositories
http://mercurial.selenic.com/wiki/Theming

Mercurial – Publique seu repositórios

July 11, 2009 10 comments »
Mercurial Logo

Mercurial Logo

Já tem um tempo que eu quero começar a usar o Mercurial de verdade e como agora eu tenho um host nada mais justo de disponibilizar meus repositórios – ou seria aqui !?

O Mercurial tem algumas maneiras de disponibilizar o repositório, mas eu queria:

  1. Uma página que dê para navegar no código
  2. Permitir fazer o clone via http
  3. Permitir fazer o pull (subir as alterações) para o servidor também via http
  4. Usar WSGI ao invés de CGI
  5. Integrar no apache que eu já tenho configurado lá

Servidor: Ubuntu 8.10

Eu estou utilizando o repositóro do mercurial, assim eu tenho a última versão, mas deve funcionar com a versão padrão do Ubuntu.

Pacotes necessários: mercurial, mercurial-common, libapache2-mod-wsgi

Talvez tenha mais algum, mas eu não lembrei de anotar durante a instalação :-/

Como eu já disse, eu já tinha o apache rodando com alguns Virtuais Hosts, eu queria apenas adicionar mais um Virtual Host naparte do apache.

Verifique se o mod_wsgi já está habilitado:

  1. # a2enmod wsgi
  2. Module wsgi already enable

A configuração é dividia em 3 partes:

1 – VirtualHost no Apache
2 – A aplicação mercurial.web (WSGI)
3 – Os repositórios hg (mercurial)

Eu criei uma pasta na home para manter a aplicação e os repositórios

Criei o arquivo hgwebdir.wsgi, ou baixe direto do repositório contrib do Mercurial.

Arquivo: /home/lucmult/hg/hgwebdir.wsgi
  1. from mercurial import demandimport; demandimport.enable()
  2. from mercurial.hgweb.hgwebdir_mod import hgwebdir
  3.  
  4. application = hgwebdir('/home/lucmult/hg/hgweb.config')

O arquivo só precisa dessas 3 linhas.

IMPORTANTE: Utilize o caminho absoluto do arquivo de configuração, eu perdi muito tempo por conta desse detalhe.

Crie o arquivo de configuração que referenciamos no arquivo anterior.

Hoje, o modo correto de publicar vários repositórios é assim:

Arquivo: /home/lucmult/hg/hgweb.config
  1. [paths]
  2. / = /home/lucmult/hg/projects/*

Onde os subdiretórios de projects são repositórios mercurial distintos.

Crie um repositório como exemplo:

  1. $ mkdir -p /home/lucmult/hg/projects/sandbox
  2. $ echo "lero lero" > /home/lucmult/hg/projects/sandbox/readme.txt
  3. $ cd /home/lucmult/hg/projects/sandbox
  4. $ hg init
  5. $ hg add
  6. $ hg ci -m "meu primeiro commit"
  7. $ echo "bip bip" >> readme.txt
  8. $ hg st
  9. $ hg ci -m "segundo commit"

Agora só falta o VirtualHost:

Arquivo: /etc/apache2/sites-available/hg.lucmult.com.br
  1. <VirtualHost *:80>
  2.     ServerName hg.lucmult.com.br
  3.     ServerAlias hg.lucianopacheco.com.br
  4.  
  5.     ErrorLog /var/log/apache2/hg.lucmult.com.br-error_log
  6.     CustomLog /var/log/apache2/hg.lucmult.com.br-access_log common
  7.  
  8.     WSGIScriptAliasMatch ^(.*) /home/lucmult/hg/hgwebdir.wsgi$1
  9.  
  10.     # To enable "daemon" mode, uncomment following lines. (Read mod_wsgi docs for more info)
  11.     WSGIDaemonProcess hg.lucmult.com.br user=lucmult group=lucmult threads=15 maximum-requests=1000 processes=2 umask=0007 display-name=wsgi-hg.lucmult.com.br
  12.     # some more interesting options (tested on mod_wsgi 2.0):
  13.  
  14.     WSGIProcessGroup hg.lucmult.com.br
  15.  
  16.     <Location />
  17.         Allow from all
  18.  
  19.         AuthType Digest
  20.         AuthName "lucmult Mercurial repositories"
  21.         AuthDigestProvider file
  22.         AuthUserFile /home/lucmult/hg/hgusers
  23.         <LimitExcept GET>
  24.             Require valid-user
  25.         </LimitExcept>
  26.     </Location>
  27. </VirtualHost>
Habilitar o Virtual Host
  1. # a2ensite hg.lucmult.com.br
  2. Site hg.lucmult.com.br already enabled

No arquivo de configuração do VirtualHost tá configurado para fazer autenticação, quando for fazer o push para o servidor.

Para criar os usuários utilize:
  1. $ htdigest  -c hgusers 'lucmult Mercurial repositories' lucmult

Onde:
-c hgusers Criar o arquivo hgusers
'lucmult Mercurial repositories' Identificação, mesmo texto que foi configurado em AuthName no Virtual Host
lucmult Nome do usuário a ser criado

Mais uma configuração que tem que ser feita, agora com relação a permissão.
Tudo que fizemos na pasta /home/lucmult/hg, foi com o usuário lucmult, com isso o usuário que roda o apache (www-data) não tem permissão de escrita na pasta e isso impede o funcionamento.

Atribuindo permissão para o grupo do apache www-data
  1. $ chown -R lucmult:www-data /home/lucmult/hg/projects
  2. $ chmod -R g+rw  /home/lucmult/hg/projects

Imporante o endereço DNS hg.lucmult.com.br, tem que ser configurado no seu DNS.

Pronto agora é só reiniciar o seu apache e acessar o seu repositório, via browser ou via linha de comando. :-)

  1. hg clone http://hg.lucmult.com.br/sandbox
  2. cd sandbox
  3. echo "lero lero" >> readme.txt
  4. hg st
  5. hg ci
  6. hg push

Fontes:
http://devlog.waltercruz.com/mercurial_web
http://mercurial.selenic.com/wiki/PublishingRepositories
http://mercurial.selenic.com/wiki/modwsgi

Postgres e psycopg2 8.4 no Mac OSX

July 9, 2009 4 comments »

Hoje precisei instalar o Postgres e o psycopg2 no Mac. Não foi muito difícil, mas não foi uma instalação normal, portanto vamos compartilhar! :-)

Para instalar o Postgres é fácil, basta ir no site e fazer o download do pacote compilado para o Mac que já vem tudo pronto.

Aqui o cara tem a explicação passo a passo do instalação.

Agora vem o psycopg2 que é o diferente.

pg_config=/Library/PostgreSQL/8.4/bin/pg_config
include_dirs=/Library/PostgreSQL/8.4/include
library_dirs=/Library/PostgreSQL/8.4/lib

  • $ python setup.py config
  • $ python setup.py build
  • $ sudo python setup.py install

Pronto, verifique:

$ python
>>> import psycopg2
>>>

Agora espero que eu não deixe aqui abandonado novamente! :-)

OLPC Game Jam no FISL

April 21, 2008 13 comments »

OLPC Game Jam no FISL

Durante o FISL rolou o Game Jam da OLPC, que consiste em criar um jogo educativo em 30 horas para o XO da OLPC.

É uma competição e quem avalia os jogos são as próprias crianças.

O Andrews Medina e Bruno Gola se inscreveram para participar e assim que fiquei sabendo mendiguei pedi para entrar na equipe também.

Quando eles se inscreveram já tinha começado a competição, o prazo encerrava as 20h da sexta-feira.

Nós fizemos a minha inscrição, mas programar que era bom nada, isso até aproximadamente às 14h da sexta-feira, ou seja, 6 horas antes de acabar o prazo.

Finalmente começamos a codar e resolvemos fazer isso lá no espaço da APyB onde tinha conexão a cabo, pois o wifi estava horrível.

Essa decisão foi bem prejudicial, pois a todo momento vinham pessoas falar com a gente, ou para conhecer Python ou falar de Python, ou queriam saber como estava o andamento do jogo.

E não foi só isso que nos tirou a concentração, a nossa esquerda, na imagem vocês podem ver uma pessoa de camiseta azul, estavam o hermanos da PyAr – Python Argentina, e tinha uma hermana muito atraente que tirava a nossa concetração e a nossa direita havia um espaço não habitado, mas durante uma parte da tarde rolou uma discussão sobre Java X Python, mas ficar ouvindo sobre Java e J daqui e J de lá, não foi fácil.

Os hermanos também estavam participando do Game Jam, eles sempre participam da PyWeek uma competição de games em Python que dura uma semana.

E não era o bastante, boa parte do tempo ficamos codando diretamente no chão, pois não havia cadeiras livres e nem espaço na mesa.

Aqui nessa foto da para ver nosso espaço no chão, da esquerda para direita, o note do Andrews, o meu MacBook e o note do Gola e o XO que recebemos para testar o jogo. Nesse momento o Gola estava inicializando o repositório http://svn.brunogola.com.br/olpyc

O nosso jogo é uma réplica do Genius porém adaptado para o XO e que pode ser jogado com o XO em modo tablet. O nome final ficou como OLPyC Genius

Para quem não lembra o Genius.

Depois de conseguirmos espaço na mesa chegou um cara falando comigo:

  • Desconhecido – Você é amigo do Humberto Diógenes?
  • Eu – Sim.
  • Desconhecido – Você que anda sempre com o CD do Mac Leopard?
  • Eu – Sim, mas ninguém sabe que eu ando com esses CDs.
  • Desconhecido – É que deu problema na atualização do firmware do meu Mac e eu queria o CD para tentar recuperá-lo.

Mesmo deconfiando, afinal eu não o conhecia, eu emprestei o meu CD do Leopard.

Após algum tempo, ele ficou no stand a nossa esquerda tentando recuperar o Mac dele. Quando ele desistiu de recuperar o Mac, ele devolveu o CD e quis saber o que estávamos fazendo.

Quando dissemos do jogo ele falou que podia fazer umas imagens, mas a princípio nós não queríamos perder mais tempo com a arte, queríamos fazer funcionar o jogo.

Mas o cara é o Valessio Brito um dos caras que mais movimenta o Inkscape Brasil, e fez a arte do nosso jogo ficar excelente e trouxe uma nova onda de ânimo a equipe.

Por volta de umas 19:40h, o hermanos ao nosso lado terminaram o jogo deles e começaram a testar e apareceu muita gente para ver o jogo deles, devia ter umas 50 pessoas em volta do stand deles e todos vibravam muito. O pior é que nesse momento o nosso jogo estava com um bug que nem rodava mais o jogo e isso causou uma grande ansiedade.

Finalmente as 20:05h entregamos o XO com o nosso jogo instalado! E tiramos a foto da equipe OLPyC. No momento da foto estávamos muito eufóricos e o Andrews tremia que nem vara verde!

No momento de entrega encontramos os outros grupos participantes, 2 grupos do UNISINOS, que têm aula de PyGame na faculdade! Ficamos com inveja deles por terem aula de PyGame.

No dia seguinte as 2 garotinhas encarregas de julgar os jogos estavam no stand do LEC e fui mostrar para ela como jogar o OLPyC Genius, eis que ela me solta o nosso prêmio: “Eu sei, eu já joguei mais de 1000 vezes!”.

Ela falou meio que tirando uma da minha cara, mas foi uma felicidade única ouvir que nosso jogo foi jogado 1000 vezes!

No final do FISL teve o resultado do Game Jam e os hermanos ganharam com o PacMan de comer letras para formar palavras, em segundo lugar muito próximo aos hermanos ficou um dos grupos da UNISINOS com o tetris matemático.

Depois conversando com a organização soubemos que o nosso jogo de um erro na pré seleção, onde os adultos passavam pelo jogo para ver se funcionava e por isso ficamos em último lugar!

Mas a sensação de participar do GameJam foi inesquecível e sensacional. Na minha opinião foi o melhor momento do FISL.

Abaixo um screenshot do jogo.

UPDATE: Esqueci de mencionar a impressionante portabilidade do PyGame. O mesmo código rodou sem pestenejar no Linux (note do Bola e do Andres), no meu Mac e no XO.

Primeira Colaboração de Código ! :)

July 21, 2006 11 comments »

Semana passada surgiu uma dúvida na lista python-brasil ,
manipulação de datas com o pymssql e como eu tenho interesse na utilização de Python com o MS-SQL dei bastante atenção à dúvida, gerando minha primeira colaboração com código a um projeto Open Source.

O Problema

Em um comando INSERT desejava-se inserir uma data no banco de dados.

No Python 2.4 temos o objeto datetime para trabalhar com datas, porém o driver de acesso ao banco (pymssql) não reconhece esse tipo e isso nos obriga a converter a data para string antes de enviar ao pymssql.

Obviamente essa conversão é uma responsabilidade do driver pymssql.

Simulei o erro com esse código:

>>> import pymssql
>>> pymssql.__version__
>>> from datetime import datetime
>>> con = pymssql.connect(host='server', user='usuario', password='senha', database='base')
>>> cur = con.cursor()
>>> cur.execute('insert into PrazoLog(Data) values(%s)',>>> [datetime(2006, 7, 20, 11, 6, 14)])
>>> con.commit()

Contornando o Problema

Após eu conseguir simular o erro na minha máquina fui investigar como contornar o erro, e graças ao fato do Python ser executado a partir dos fontes eu pude ler o código do pymssql que estava instalado na minha máquina sem ter que consultar o site, repositórios ou qualquer outro local.

Novamente graças ao Python executar os fontes, pude fazer alterações nos fontes do pymssql e simplemente testar. Obviamente como não desenvolvo constantemente em Python fiz meus testes e debugs de forma bem artesanal (usando prints).

Apenas consultando o e-mail com o problema e os arquivos que já estavam na minha máquina consegui chegar em um patch que permitia contornar o problema de forma simples rápida e ao meu ver bem feita.

Tomei alguns cuidados que achei importante, como tentar não adicionar mais uma dependência ao pymssql. A versão do pymssql que eu disponho não depende do módulo datetime e como eu sabia que esse módulo foi incorporado somente na versão 2.4 não queria adicionar essa dependência.

Lembrei-me, então, do duck typing. Como eu queria apenas o método timetuple da classe datetime.datetime. Apenas verifiquei se o objeto tem o método e tendo-o eu executo-o.

Funcionou que foi uma beleza :) , testei nas 3 versões do MS-SQL que eu tenho aqui na empresa (7.0, 2000, 2005) e funcionou. Fiquei empolgado e eufórico! Mandei a minha correção para a lista e o Girão, que é quem teve o problema, falou que funcionou beleza e gostou da correção.

Colaborando com a Comunidade

Aproveitando a euforia e a “aprovação” do Girão fui a página do projeto para enviar a minha proposta de patch. O projeto está no sourceforge.net , dei uma olhada no Fórum e todas as mensagens não recebiam respostas :( e não achava nenhum link do tipo “reporte um bug”.

Mas navegando pelo site do projeto achei uma nota sobre a dependência do módulo datetime e achei bem estranha. Então fui verificar os fontes, nos fontes da minha máquina não via nada que levasse ao módulo datetime, então fui consultar o repositório CVS.

Qual não foi minha surpresa quando a versão do CVS revelou-me que a dependência era justamente para solucionar o mesmo problema que eu tinha solucionado :S . Fiquei meio triste, pois pensei, re-invetei a roda, mas fiquei contante pois ainda achava minha solução mais adequada por não adicionar a tão falada dependência.

Apelei e mandei o patch direto para os 2 e-mails de desenvolvedores que eu achei no site.

Após 4 dias o Andrzej Kukula, um dos desenvolvedores, me respondeu dizendo que o meu patch seria incorporado no projeto! :D A empolgação foi total !

Moral da História

  1. O Python facilita a leitura e a depuração dos fontes
  2. Sempre verificar a versão do CVS/SVN
  3. Colaborar com algum projeto não é tão difícil assim
      Precisa-se de:

    • um pouco de interesse
    • um pouco de experiência para saber o que esperar de um módulo/biblioteca/framework, pois para mim (e para o Girão também) a conversão de tipo era função do módulo pymssql
    • um pouco de inglês
    • o que eu menos precisei foi conhecer bem a linguagem – eu acho
  4. e por último, mas não menos importante, colaborar é empolgante e divertido, principalmente em Python ;)