Por que Django?

Django é o framework ideal para os que buscam agilidade e simplicidade. Um dos recursos que mais gosto é o Admin, uma poderosa interface para produzir conteúdo. Simples de usar, bastante customizável e com um visual agradável, bastante útil durante a fase de desenvolvimento e ideal para pequenos projetos com ausência de um designer na equipe. Outras caracteristicas interessantes são:

  • API para autenticação de usuários com suporte à grupos e níveis de acesso, que permite a criação de permissões personalizadas para cada página, classe ou método;
  • Sistema de cache que torna mais rápido o carregamento das páginas e o acesso ao banco de dados;
  • Sistema de templates utilizando HTML, com suporte a herança e Template Tags – uma linguagem de templates para manipulação de conteúdo dinamicamente. É possível criar suas próprias com código Python e utiliza-las em qualquer parte do projeto;
  • Trabalhar com formulários e extremamente simples e há diversos tipos de validações disponíveis como por exemplo e-mail, cpf e endereço IP;
  • ORM compatível com os bancos de dados mais utilizados no mercado;
  • Paginação é uma tarefa trivial;
  • Incrível suporte à internacionalização;
  • É multiplataforma;
  • Documentação bem completa e de fácil entendimento;
  • Comunidade altamente ativa.

Por utilizar Python, é compatível com uma grande variedade de bibliotecas para trabalhar com xml, json, webservices, restful, graficos, relatorios, imagens e etc. Sem dúvida uma ótima escolha para quem procura agilidade com produtividade.

Essa foi minha opinião expressada no debate Django vs. Ruby on Rails, matéria da revista TiDigital (edição 16 de junho/2010).

Computação Ubíqua

Cada vez mais há um distanciamento de computadores isolados para uma tecnologia mais ampla, conectando dispositivos móveis em redes distribuídas. Tal arquitetura computacional traz grandes vantagens como a Continuidade de Serviços, que garante o funcionamento de serviços básicos, e o Armazenamento Distribuído, que torna dados e informações acessíveis em caso de desastres. Isso se deve ao avanço da Computação nas Nuvens, uma evolução da Computação Móvel, cujo conceito é compartilhar dados e serviços através da interligação de sistemas, sempre disponíveis, não mais locais, mas nas nuvens . Os dispositivos, como um computador ou um celular, apenas solicitam os serviços e apresentam os resultados. Mas não pára por aí. Um professor chamado Mark Weiser, cientista chefe do centro de pesquisas da Xerox, por meio de um artigo chamado “O Computador do Século 21”, introduziu um novo conceito chamado Computação Ubíqua, cuja idéia principal é focar a atenção do usuário na tarefa e não na ferramenta.
Considerada uma evolução da computação em nuvem, a Computação Ubíqua, também conhecida como Ubicomp, é uma visão de que humanos estejam cercados por computadores interligados rodando sistemas inteligentes capazes de captar variações no ambiente e entender, de acordo com gestos e expressões dos usuários, qual tarefa deve executar, de forma que as pessoas sequer percebam que estão dando comandos a um computador. Resumindo, é a união entre a Computação nas Nuvens e a Computação Pervasiva (sistemas distribuídos e imperceptíveis ao usuário).
O grande desafio para tornar a Ubicomp uma realidade, de forma mais natural possível, é o desenvolvimento de Interfaces Naturais como reconhecimento de voz e escrita, ambientes inteligentes, realidade aumentada e etc. Os computadores estão se integrando cada dia mais na vida das pessoas e a tendência é que consigam interpretar, e não traduzir, os comandos dos usuários.
Aos mais interessados, há um artigo mais completo escrito pelo Fabiano Domingues no Guia do Hardware.net que pode ser acessado pela URL http://www.guiadohardware.net/artigos/computacao-ubiqua/.

Qualidade de Software

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.

Novidades no blog

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/

Participe do Flex for Kids

flexforkids

“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ê?

Django usando Pisa para converter HTML para PDF

Torre de Pisa

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.

Acessando BD Firebird através do KinterbasDB no Python

firebird-icon

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)

Formulários dinâmicos no Django

FormFill

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!

Servidor Linux com Proxy e Controle de Banda – Parte 3

firewall
Finalmente consegui escrever a última parte do artigo. :D
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.

Sprint no Feriado do dia 20/01/2010

dojo-rio-logo1
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

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card