May 31st, 2010

Recentemente estive analisando alguns projetos de softwares open source com o objetivo de colaborar no desenvolvimento. A grande maioria não possui rotinas de testes, comentários em código ou qualquer tipo de documentação útil aos novos desenvolvedores. Assim resolvi falar um pouco sobre qualidade de software do ponto de vista da construção.
May 30th, 2010

Após meses ausente, cá estou novamente fazendo planos para tentar manter o blog atualizado com mais frequencia.
Em fevereiro passado fui surpreendido com o rumo que minha vida profissional seguiu e a velocidade com que tudo aconteceu. Foi uma mudança positiva mas que consome muito do meu tempo. Devido à isso me afestei um pouco das listas de discussões e eventos da comunidade open source. Espero que de agora em diante consiga escrever com mais frequência.
Torçam por mim! \o/
February 5th, 2010

“O Flex for Kids é uma maratona de palestras on-line que será realizado no dia 06/02/2010 e contará com grandes nomes da comunidade Adobe Flex brasileira.
Serão 10 palestras on-line ao vivo durante o dia inteiro, usando um ambiente de eventos multimídia onde os palestrantes ministrarão seus temas através de recursos de áudio, vídeo, slides e chat.
Qualquer pessoa, empresa ou faculdade poderá participar do Flex for Kids, para isto basta fazer uma doação de um valor simbólico de R$ 30,00 para ter acesso as 10 palestras on-line e suas gravações que serão disponibilizadas 15 dias após o evento.
Todo dinheiro arrecadado será doado ao Cotolengo de Mato Grosso do Sul. Para conhecer a Cotolengo clique aqui.”
Obviamente eu já me inscrevi! E você?
February 3rd, 2010

Pisa é um conversor de HTML/XHTML/CSS para PDF, escrito em Python e baseado nas bibliotecas Reportlab, PyPDF, TechGame Networks CSS e HTML5lib. Seu foco principal não é gerar páginas perfeitas para impressão, mas utilizar HTML e CSS para gerar PDFs dentro de aplicações.
A instalação pode ser feita através do código no site do projeto ou pelo comando easy_install pisa.
Crie um arquivo chamado report.py dentro do diretório do projeto contendo o código abaixo:
# -*- coding: utf-8 -*-
from django import http
from django.template.loader import get_template
from django.template import Context
import ho.pisa as pisa
import cStringIO as StringIO
import cgi, os
def fetch_resources(uri, rel):
path = '/path/para/diretorio/contendo/imagens/a/serem/exibidas'
return path
def write_to_pdf(template_src, context_dict, filename):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, link_callback=fetch_resources)
if not pdf.err:
response = http.HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename
response.write(result.getvalue())
return response
return http.HttpResponse('Problema ao gerar PDF: %s' % cgi.escape(html))
E agora, dentro de uma view, é preciso importar o arquivo report.py e chamar a função write_to_pdf para fazer a conversão:
# views.py
from report import write_to_pdf
def listar_clientes_cadastrados(request):
clientes = Cliente.objects.all()
return write_to_pdf('relatorio.html', {'clientes': clientes}, 'nome_do_arquivo_pdf')
A função write_to_pdf recebe como parâmetro o nome do arquivo HTML que será convertido, as variáveis que serão tratadas dentro desse arquivo e o nome que o arquivo PDF sem a extensão. Retorna o download do arquivo PDF.
Conforme citado no início do post, a conversão não é perfeita. Por exemplo, às vezes uma tabela apresenta mínimas deformações, não fica igual como na versão HTML. Apesar disso Pisa é uma ótima solução que muitas vezes ajuda bastante e, como puderam ver, é muito fácil de usar.
January 29th, 2010

KinterbasDB é uma biblioteca open source para Python que possibilita acessar banco de dados Firebird e algumas versões do Interbase.
O download pode ser feito na página do projeto.
Após o download, descompacte o pacote kinterbasdb-3.2.src.tar.gz.
Abra um terminal, entre no diretório onde o kinterbasdb foi descompactado e execute o comando python setup.py build. O script de instalação, setup.py, automaticamente vai detectar as informações necessárias pelo compilador C.
Se não ocorreu nenhum erro, execute o comando python setup.py install para instalar no diretório padrão de módulos do Python (varia de acordo com a distro).
root@localhost: ~# wget http://downloads.sourceforge.net/project/kinterbasdb/kinterbasdb/kinterbasdb-3.2/kinterbasdb-3.2.src.tar.gz?use_mirror=ufpr
root@localhost: ~# tar zxvf kinterbasdb-3.2.src.tar.gz
root@localhost: ~# python setup.py build
Succeeded:
/usr/bin/python setup.py build
root@localhost: ~# python setup.py install
Para testar se foi instalado corretamente:
root@localhost: ~# python -c "import kinterbasdb as k; print k.__version__"
(3, 2, 0, 'final', 0)
root@localhost: ~#
É possível que apareça uma mensagem de erro em distros baseadas no Ubuntu:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
kinterbasdb.OperationalError: (-901, 'begin transaction: \n invalid parameter in transaction parameter block')
Para corrigir esse problema é preciso usar uma outra versão do arquivo __init__.py.
Faça o download em https://firebird.svn.sourceforge.net/svnroot/firebird/qa/trunk/kinterbasdb/__init__.py e substitua o arquivo existente no diretório kinterbasdb.
root@localhost: ~# wget https://firebird.svn.sourceforge.net/svnroot/firebird/qa/trunk/kinterbasdb/__init__.py
root@localhost: ~# mv __init__.py /usr/lib/python2.5/site-packages/kinterbasdb/
Exemplo para Firebird-2.1 em servidor Windows:
import kinterbasdb
conn = kinterbasdb.connect(
host='192.168.0.2',
database='C:\\Dados\\meubanco.fdb',
user='sysdba',
password='masterkey'
)
cur = conn.cursor()
cur.execute('SELECT id, nome, telefone FROM tabela')
for (id, nome, telefone) in cur:
print 'ID: %s, Nome: %s, Fone: %s' % (id, nome, telefone)
January 26th, 2010

Um formulário dinâmico é aquele que o usuário pode definir quais campos vão existir. O programador não precisa criar código para cada formulário.
Imagine um sistema que necessite de diversos tipos de formulários. Tarefa no mínimo entediante para o responsável pela manutenção. E se o usuário puder criar e modificar um formulário por uma interface gráfica fácil de usar? Seria muito bom para o programador!
O segredo desse dinamismo é o uso de metaclasses, que são classes cujas instâncias também são classes.
O truque é criar em tempo de execução uma metaclasse da classe forms.Form. Atributos dos campos como label, tipo, max length etc, podem ficar armazenados no banco de dados. Os valores dos campos podem ficar em outra tabela com uma referência de chave estrangeira. Usando o ORM do Django é muito simples, e de quebra já ganha uma interface gráfica para administrar tudo (admin).
Sendo assim, o usuário poderia montar os campos do formulário definindo um label, tipo de campo, se é obrigatório ou não, valor padrão… e essas informações ficarão no armazenadas no BD. Fica fácil criar um código para pegar essas informações, criar uma nova classe Form em tempo de execução, instância-la e renderizar no template.
Exemplo:
# views.py
from django.views.generic.simple import direct_to_template
from django.forms import forms, fields
def montar_formulario_dinamico(request):
campos_dinamicos = {
'nome': fields.CharField(max_length=100, required=True, label='Nome', initial='Gustavo'),
'idade': fields.IntegerField(label='Idade', min_value=0),
'email': fields.EmailField(max_length=200, required=False, label='E-mail')
}
FormDinamico = type('', (forms.Form,), campos_dinamicos)
form = FormDinamico()
return direct_to_template(request, 'formulario.html', extra_context={'formulario': form})
Fica a dica!
January 18th, 2010

Finalmente consegui escrever a última parte do artigo. 
Nas partes 1 e 2 mostrei como configurar um servidor Linux para firewall e controle de banda, usando scripts que fazem a leitura de um arquivo texto contendo as informações dos pontos de rede (IP, MAC, velocidade de download e upload…). Entretanto, acessar o servidor e ficar editando um arquivo texto, na minha opinião é muito chato, possui risco de falha humana e apenas quem tem acesso ao servidor pode fazer isso. Para resolver esse contratempo foi desenvolvido o Bandcontrol, um pequeno sistema web que armazena os dados dos pontos de rede em um banco de dados e gera o arquivo texto usado pelos shell scripts.
O sistema foi desenvolvido em Django, personalizando o Admin. Vou mostrar apenas como instalar e usar. O código fonte está disponível para consulta de programadores, curiosos e simpatizantes.
January 18th, 2010

Essa é uma grande oportunidade para aqueles que não estão acostumados a utilizar metodologias ágeis em projetos reais. Será desenvolvido algo concreto, um pouco mais aprimorado do que os tradicionais exercícios de lógica matemática aplicados no dojo.
É uma chance única para praticar TDD, Scrum e XP, aprender mais sobre Python, Django, Javascript e desenvolvimento web em geral, participar de um projeto open source e trocar idéias com outros profissionais da área.
Maiores informações na lista do Coding Dojo Rio:
* Coding Dojo Rio *
dojo-rio@googlegroups.com
http://groups.google.com/group/dojo-rio
http://code.google.com/p/dojo-rio
http://dojorio.wordpress.com
January 14th, 2010

Existe um bug no Eclipse Galileo baixado diretamente do eclipse.org que faz com que alguns botões não funcionem. Você clica no botão e nenhum evento é acionado.
Isso acontece porque a GTK 2.18 introduziu uma nova maneira para interagir com GdkWindows. No próximo release da GTK esse problema deve ser corrigido, mas enquanto isso uma solução rápida é usar export GDK_NATIVE_WINDOWS=true.
A versão instalada pelo apt-get vem com o script /usr/bin/eclipse que executa o comando acima antes de chamar o binário do Eclipse.
Fica aí mais uma dica!
January 14th, 2010

Estou tendo um inicio de ano bem agitado e por isso nao escrevo o quanto eu queria.
Sendo assim, para nao deixar tudo as moscas novamente, vou postar umas dicas rapidas e urls legais que valem a pena dar uma olhada.
Antes de mais nada, desculpem qualquer erro de gramatica ou ortografica. Estou com pressa e logado sem permissao para alterar o layout do teclado para inserir acentos.
Agora tenho que ir!
Enjoy!