quarta-feira, 25 de julho de 2012

Problemas com Python Reportlab no Heroku

Este post ajuda a resolver um problema que pode parecer um "mistério", mas que pode ser reparado facilmente.

Estou trabalhando em um projeto web usando Django e escolhemos o Heroku para ser o ambiente de testes/homologação da aplicação. A escolha do Heroku deve-se a aspectos como plataforma poliglota, facilidade no deploy e escalabilidade.

Durante os testes na aplicação identificamos um erro na funcionalidade de geração de relatórios em pdf. A biblioteca mas usada para trabalhar com pdf em Python é Reportlab. É realmente robusta mas pode ser mostra trabalhosa para gerar conteúdos complexos.

Alguns dos nossos relatórios utilizam imagens. Sem problemas, pois o reportlab tem suporte a imagens de diversos formatos. Entretanto apresentava erro na criação do arquivo quando o deploy era feito no Heroku.

Erro: 'NoneType' object has no attribute 'Image'


Inicialmente verificamos que todas as dependências do projeto estavam satisfeitas e localmente ele funcionava bem. Ainda assim havia uma suspeita de que o Reportlab estivesse nos pregando uma peça.

Foi aí que pembrei que o  Reportlab utiliza a PIL internamente. Verifiquei o arquivo requirements.txt que lista as bibliotecas usadas no projeto a ser instaladas no Heroku, e não tinha a PIL instalada.

Instalei a PIL pelo pip no ambiente criado pelo virtualenv, atualizei o requirements.txt, fiz o deploy no Heroku e voilà!

Esse problema pode ocorrer em outros ambientes como Gondor.io.

Hasta la vista!

terça-feira, 22 de março de 2011

Meu ambiente de trabalho em 7 itens

Já recebi convites do Thiago Hiromi, Bruno Tikami e agora o Élcio. Chega de procastinar né??

Sistema Operacional: Ubuntu 10.04 (Lucid Lynx)

Uma vez em um debate com o Rafael Peregrino, ele simplificou que o Ubuntu é Debian um para "donas de casa". Pensando bem... Mas eu estou pensando em mudar para o Gentoo. Ah eu uso versões LTS para ambiente de produção (client/server). Prefiro não arriscar.

Editores/IDE: Geany/Gedit/Vim

Depende do que será feito. Se for trabalhar com arquivos "não pythonicos" uso o gedit ou Vim. para arquivos pythonicos o Geany é ótimo. Rápido, fácil, pequeno e funcional.

Navegadores: Google Chrome/Mozilla Firefox

Nessa ordem de preferência. Faz um tempo já que o Chrome é titular. Quem sabe o Firefox 4 retoma o posto.

Player de Audio: mplayer

Eu uso um netbook para trabalhar, mesmo com 2Gb de memória não dá para abusar da boa vontade dele! *Nix life style! E outra se estiver com os pacotes certo de codecs, não tem o que ele não reproduza. =)

Controle de Versão: Git

A descrição do Git na página oficial diz tudo: Git is a free & open source, distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Simples assim!

Framework Web: Web2py

Bem, confesso que não era muito fã desse cara, mas a relação está melhorando. Mas é inegavelmente rápido o seu desenvolvimento. Par outros projetos fora da Visie uso Flask e Django

Plus: ack-grep

No último Python Bug Day, o Henrique Bastos me apresentou o ack-grep. Esqueça qualquer "receita de bolo" de grep quevocê conheça, esse cara é muito melhor.

Agora eu passo a bola para Willian Venâncio, Marcio Scatena, Thiago dos Anjos e Renato Candido

domingo, 21 de novembro de 2010

O paradigma de Orientação à Objetos

A algum tempo que penso em escrever algo sobre o paradigma de Orientação à Objetos. A maior motivação foi que na faculdade a matéria de Orientação à Objetos usa Java como linguagem de referência. Eu particularmente não gosto de Java e com isso sempre há debates calorosos entre eu e o professor das aulas de quinta-feira. E como de costume eu sempre tento persuadir outros alunos a estudar Python em vez de Java. Nesses debates consegui convencer a Talita, uma amiga da mesma classe, que Python é muito mais fácil e divertido.

Lembrei que recentemente li um artigo chamado The Object Oriented Paradigm do Sinan Si Alhir e tive que fazer uma resenha sobre ele. A idéia é escrever uma série de artigos sobre programação orientada a objetos, e esse será o passo inicial.

Orientação à objetos é um assunto muito discutido na área de desenvolvimento. Pode ser considerado como o ponto de inflexão na evolução das linguagens de programação. A partir de seus principio as linguagens seguiram novos rumos e passaram a oferecer mais recursos aos desenvolvedores.

Mas como poucos sabem, o conceito de Orientação à Objetos transcende a tecnologia e nos remete a seus criadores, algumas centenas de anos na Grécia antes de Cristo. Alguns dos precursores do pensamento pensamento ocidental como Sócrates, Platão e Aristóteles definiram alguns conceitos da base do paradigma de OO como Abstração, Encapsulamento, Herança e Polimorfismo quando idealizaram a Teoria das Formas.

Para a resolução de um problema (de um modo efetivo), podemos seguir uma "guia de referência" quanto aos passos como entender ou conceitualizar o problema e implementar ou realizar o problema. Entretanto apesar de parecer óbvio o fluxo, agir de acordo com o pressuposto é mais complicado.

Teoria das Formas

Platão foi quem definiu o pensamento inicial auxiliado por Sócrates. Aristóteles, teve Platão como seu tutor (filosófico) e posteriormente junto com seu mestre evoluiu a teoria.
É muito comum atribuir os trabalhos e estudos à períodos que os filósofos vivem, e no primeiro período de Platão, ele trabalhou junto com Sócrates no inicio da obra. Suas motivações estavam a cerca do entendimento da natureza do conhecimento, seguindo uma premissa que algo só poder ser entendido se puder ser definido.

Segundo Sócrates, o método "Socrático" baseia-se em atentar aos significados e definições. O método Socrático consiste em uma dialeto entre o mestre e o aprendiz, e o mestre conduz o aprendiz a reconhecer as verdades relacionadas ao tema de forma progressiva. Isto é, conforme vai adquirindo o conhecimento fundamental sobre o assunto, vai questionando as premissas até chegar as conclusões que levam à verdade. Sócrates aponta como prova de sucesso da Teoria das Formas a aplicação da teoria de Pitágoras, que o quadrado da hipotenusa é igual à soma do quadrado dos catetos. Com isso Sócrates e Platão concluem que o aprendizado está diretamente relacionado com a coleção de idéias (ou Formas) que o aprendiz detém.

A evolução dessa idéia é apontada como a formalização da teoria e acontece no segundo período de Platão. Nessa fase Platão sugere que as Formas ou Idéias são o centro do conhecimento e conhecer uma forma significa entender sua natureza. As Formas são propriedades ou atributos abstratos das coisas em um mundo real. Seguindo o método Socrático de aprendizado, o entendimento ou a propriedade da coleção de atributos, garantem o conhecimento sobre as coisas.

Aristóteles inicia sua contribuição no terceiro período de Platão. Sua contribuição foi a mais significativa quanto à definição da teoria para os propósitos que usamos hoje. Nos dois primeiros períodos de Platão, a teoria foi tratada mais a fundo no âmbito filosófico.

Nesse ponto, Platão redefiniu a o método do dialeto para um "procedimento de coleção e divisão". A coleção entende-se como identificação de uma Forma a partir de um número de Formas específicos e essa forma é dividida na seleção de diferenças em formas mais específicas. Esse pensamento conduz para a proposta que se há uma coisa (objeto) com características (atributos) ele descende de outra coisa e também de seus atributos.

Essas idéias foram trabalhadas por Aristóteles e amplamente aplicadas na Matemática e hoje fazem parte dos pilares de áreas como Matemática e Física como Cálculo e Geometria.

A teoria e o paradigma de Orientação à Objetos

Ao tentar usar a teoria das formas na solução de problemas devemos levar em conta os 3 conceitos fundamentais que são:
Coisas: São os objetos ou entidades que detém as coleções de atributos ou características e comportamentos (o conhecimento).
Relacionamento: Características compartilhadas pelas entidades. As entidades podem ter atributos ou comportamentos comum às entidade relacionadas.
Ocorrências: Caracterísitcas comportamentais que podem ser compartilhadas entre as entidades.

O paradigma de OO foca nas características estruturais e comportamentais das entidades. O "objeto" é o centro da idéia e tudo gira em torno do objeto. Os pricipios de OO são:

Abstração: Formula a representação das entidades (objetos).
Encapsulamento: Empacotamento das características das entidades (ocultar os detalhes)
Herança: Relacionar e reutilizar as representações.
Polimorfismo: Definir variações de representação de uma representação já existente.

Classes e objetos

Objetos por si só já são um encapsulamento das características estruturais de um entidade conhecidos como atributos e comportamentos (operações). não é possível utilizarmos diretamente um objeto, para isso precisamos acessa-lo a partir de uma técnica que abstraia suas características de atributos e comportamentais, como uma Classe.

As Classes servem como descritores dos objetos com implementações comuns aos objetos. Já os Tipos são versões mais avançadas das classes que podem ser usados como classes comuns ou como um interface para a classe com recursos mais avançados.

Classes e objetos podem ter atributos e comportamentos comuns á ambos. Essa interação é chamada de associação ou link. Em geral o relacionamento entre duas classes, acontece no modo que uma classe descenda da outra. Isto é uma classe B descende da classe A, sendo a classe A possui os as referências genéricas e a classe B herda essas referências, e ainda tem referências específicas. À essa ligação chama-se de link.

Conclusão

O paradigma de Orientação à Objetos não se aplica única e exclusivamente à tecnologia de desenvolvimento de sistemas. Suas definições e princípios podem ser aplicados em diversas áreas como a que se propôs por definição o de ensino (estudo do conhecimento). Mas vale lembrar que o conhecimento da base deve ser bem sólido para seu uso e aplicação.

quinta-feira, 3 de setembro de 2009

human behavior is something interesting. Especially in the subway #sampa #subway

segunda-feira, 6 de outubro de 2008

15 Pensamentos para transformar a vida menos chata que ela é...

Quando estava atualizando meu perfil no Orkut, buscava algumas frases no Wikiquote. Entre as buscas e frcassos achei um tópico só com citações retiradas das histórias de Calvin e Haroldo. Comecei a ler e percebi que, pelo menos da minha, vida e o que penso dela resumia-se nestas 15 frases.

Segue a fonte para mais "inspirações"...


1 - "O mundo não é justo, eu sei, mas por que ele nunca é injusto a meu favor?"

2 - "Faça o que tem que fazer e deixe os outros discutirem se é certo ou não."

3 - "Se você se preocupa, você só se desaponta o tempo todo. Se você não se preocupa, nada importa, então você nunca se perturba."

4 - "Pessoas sofisticadas usam óculos escuros."

5 - "Eu não faço questão de ser aceito, se eu for só ignorado pra mim já está bom"

6 - "Você sabe que vai odiar uma coisa quando não querem lhe dizer o que é!"

7 - "Eu já não sei mais do que eu quero! Eu gostava mais das coisas quando eu não as entendia!"

8 - "O mundo provavelmente é mais engraçado para as pessoas que não vivem aqui."

9 - "É mais fácil pedir perdão do que permissão."

10 - "Acho que os adultos só fingem que sabem tudo!"

11 - "A vida é como topografia, Haroldo. Há picos de felicidades e sucessos... pequenos campos da chata rotina... e vales de frustrações e fracassos..."

12 - "Eu sou uma pessoa simples...mas de gostos complexos"

13 - "O mundo não seria tão ruim se pudéssemos sair dele de vez em quando..."

Para mim essas 2 ultimas são as melhores!!!

14 - "A vida fica bem mais fácil se você mantiver as expectativas de todo mundo baixas."

15 - "A vida é bem mais divertida quando você não é responsável pelos seus atos".

sexta-feira, 19 de setembro de 2008

Experimentando o Ping.fm...

segunda-feira, 31 de dezembro de 2007

Início...

Hello World,

Este é o post de inauguração do meu blog. No começo, pensava que um blog seria algo de quem não tinha nada melhor a fazer. Mas, as circunstâncias mostraram-me o contrário...

Bem, antes de mais nada, deixe que eu me apresente. Meu nome é Mauro e sou fanático por computadores, um entusiasta da causa do Software Livre. Trabalho com a área de tecnologia há, aproximadamente, 10 anos sendo que destes, 5 são dedicados ao software livre.

A idéia de criar um blog veio da idéia de criar um site com conteúdo referente ao Software Livre. Com a dificuldade de conciliar todas as tarefas do dia, semana ou até mesmo do mês e a vontade de manter o site atualizado, essa idéia restringiu-se a uma idéia...

Com a evolução da Internet, o conteúdo informativo da rede passou a ser divulgado de diferentes formas, não sendo mais necessária a criação de um site propriamente dito para tal função. Soluções como Blogs, Wikis, Blikis, Podcasts, Fóruns entre outros, facilitaram a publicação e divulgação de conteúdos diversos.

Existem incontáveis sites, blogs, wikis e fóruns com conteúdo sobre software livre e não tenho a pretensão de concorrer com nenhum. O conteúdo desse blog é referente a discussões sobre aplicações baseadas em tecnologias open source, principalmente sobre a dupla Linux + Python. Não significa que não haverá conteúdo voltado a outras plataformas como Microsoft, mas não é uma regra que deva ter ou muito menos que não deva ter conteúdo direcionado a tais plataformas.

Não pretendo seguir uma regularidade fixa na publicação do conteúdo mas penso que consigo colocar algo quinzenalmente. Salvo em exceções que o artigo for sequencial, então mantenho a regularidade necessária para tornar o artigo completo.

Por enquanto não prometo nada como segundo post mas garanto que não será voltado a plataforma Microsoft... Hehe

[s]
Mauro Baraldi