Máquina virtual para desenvolvimento usando o Vagrant e Ansible

Depois de fazer um belo upgrade de memória (4gb -> 16gb) eu resolvi usar o Vagrant como plataforma de desenvolvimento, fiz uma nova instalação do Osx Mavericks e deixei o meu sistema o mais limpo possível, deixando tudo que é necessário para desenvolvimento na máquina virtual do vagrant.

Agora eu estou usando o Ubuntu Precise64 e tenho praticamente a mesma infra que uso nos servidores de produção, para provisionar essa máquina eu usei o Ansible e os arquivos de configuração eu deixei a disposição no meu Github.

Agora eu tenho tudo o que preciso para desenvolver ao alcance, basta usar o vagrant up e esperar a configuração do sistema.

O que vem incluso:

  • Mapeamento das portas dos servidores
  • Mysql 5.5, usuário e senha ‘allisson’
  • Postgresql 9.3 + Postgis, usuário e senha ‘allisson’
  • Nodejs via ppa
  • Mongodb via ppa
  • Redis e Memcached

Links:

Django para Iniciantes

Eu já tinha falado sobre o Curso Django para Iniciantes, pois bem, estou dando um presente para a comunidade e liberando todas as aulas no meu canal do Youtube.

Foi usado o Django 1.4 nas aulas, e penso em fazer uma nova versão do curso (se a comunidade demonstrar interesse), usando o 1.6/1.7. Confirmado o interesse da comunidade, eu usarei o esquema de financiamento coletivo para arrecadar e assim poder produzir as novas aulas.

Usando o Docker para deploy de aplicações Django

Nessa última sexta eu tive a oportunidade de apresentar mais um mutirão python, dessa vez eu falei sobre o Docker.io e como fazer um deploy de um pequena aplicação Django usando o conceito de containers do Docker.

Vídeo do hangout:

Vídeo gravado com screenflow:

Slides:

Django + Docker

Evento:
Usando o Docker para deploy de aplicações Django

Vídeos do Mutirão Python Construindo um micro framework web em Python

Ontem eu tive a oportunidade de falar sobre a minha experiência em criar o micro framework Gunstar, como de costume eu sempre gravo o hangout com o screenflow e recomendo assistir essa versão.

Vídeo do hangout

Vídeo gravado com screenflow

Slides:
http://www.slideshare.net/allisson/micro-frameworkpython

http://speakerdeck.com/allisson/construindo-um-micro-framework-web-em-python

Gerenciando versões do python com o pyenv

Em uma pesquisa rápida eu encontrei o pyenv, que segue os mesmos princípios do rbenv para ruby.

O que o pyenv nos oferece:

  • Instalação do interpretador python usando o $HOME do usuário
  • Instalação de várias versões diferentes do python, cada uma com seu diretório isolado

Atualmente eu estou utilizando o vagrant com o box do precise32 (ubuntu 12.04 lts), ele vem com o python 2.7.3 e com a opção de instalar o python 3.2.3, mas eu queria ter as últimas versões estáveis (atualmente 2.7.5 e 3.3.2), o pyenv resolve esse problema.

Primeiro precisamos instalar as dependências:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential git-core
sudo apt-get install libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev

Clonando o pyenv no $HOME do seu usuário:

cd
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
exec $SHELL

Faça o logout/login e volte ao seu terminal, para ver quais são as versões que você pode instalar execute:

vagrant@precise32:~$ pyenv install -l
Available versions:
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.6.6
  2.6.7
  2.6.8
  2.6-dev
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7-dev
  3.0.1
  3.1.3
  3.1.4
  3.1.5
  3.1-dev
  3.2
  3.2.1
  3.2.2
  3.2.3
  3.2.4
  3.2.5
  3.2-dev
  3.3.0
  3.3.1
  3.3.2
  3.3-dev
  3.4-dev
  jython-2.5.0
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.5-dev
  jython-2.7-beta1
  jython-dev
  pypy-1.5
  pypy-1.5-src
  pypy-1.6
  pypy-1.7
  pypy-1.7-dev
  pypy-1.8
  pypy-1.8-dev
  pypy-1.9
  pypy-1.9-dev
  pypy-2.0
  pypy-2.0.1
  pypy-2.0.1-src
  pypy-2.0.2
  pypy-2.0.2-src
  pypy-2.0-dev
  pypy-2.0-src
  pypy-2.1
  pypy-2.1-src
  pypy3-2.1-beta1
  pypy3-2.1-beta1-src
  pypy3-dev
  pypy-dev
  stackless-2.7.2
  stackless-2.7-dev
  stackless-3.2.2
  stackless-3.2-dev
  stackless-3.3-dev
  stackless-dev

Instalando o 2.7.5 e 3.3.2:

pyenv install 2.7.5
pyenv install 3.3.2
pyenv rehash # execute sempre depois de instalar um novo interpretador
pyenv global 2.7.5 3.3.2 # deixa o python 2.7.5 como o python padrão e também o 3.3.2 disponível

Para instalar o pypy você precisa instalar mais algumas dependências:

sudo apt-get install libffi-dev libssl0.9.8

Após isso precisamos criar um link simbólico para o libffi ser encontrado pelo pypy:

sudo ln -s /usr/lib/i386-linux-gnu/libffi.so.6 /usr/lib/i386-linux-gnu/libffi.so.5

Agora sim, pypy 2.1:

pyenv install pypy-2.1

Isso é o básico, no wiki do pyenv tem mais informações úteis.

Gunstar 0.2

Acabei de liberar o release 0.2 do Gunstar, a principal mudança foi na documentação, que está bem mais abrangente, agora temos vários tópicos e não apenas o quickstart.

Tive o prazer de fechar a issue #1 do projeto também :D

Para os interessados, agora em setembro eu estarei fazendo um mutirão python sobre o Gunstar, se você quiser saber mais sobre WSGI e como é simples criar um micro framework, não perca!

Atualização:
A versão 0.2 está com um bug na instalação, eu já liberei a 0.2.1 que resolve o problema. Eu agradeço ao Elton Santos por avisar.

É difícil criar um micro web framework em python? Eu consegui em 12 dias :)

Hoje eu fiz o lançamento da versão 0.1.0 do Gunstar, um micro web framework em python. Isso levou ao todo 12 dias, desde a criação do repositório até a publicação da versão 0.1.0 no pypi.

A principal facilidade em escrever um micro framework em tão pouco tempo se resume a um padrão , o WSGI, com ele podemos escrever aplicações usando ótimas bibliotecas como o WebOb (que usei no Gunstar) ou o Werkzeug (base do Flask). Essas duas bibliotecas cuidam de transformar requisição e resposta em objetos que posso manipular facilmente na minha aplicação python.

Com o tempo que poupei usando o WebOb eu escrevi duas classes que fazem o papel de roteamento de urls, o código é bem simples, e o melhor de tudo, funciona!

Também criei uma interface para gerir sessão dos usuários usando signed cookies, não vejo motivos para usar sessão em arquivos ou em banco de dados, claro que temos que reconhecer que existe um limite para o tamanho da sessão e que isso tem uma influência no tamanho das requisições e respostas, mas se você precisa guardar tanta informação assim em uma sessão, você está fazendo isso errado, grave apenas a chave na sessão e o resto retorne de um banco de dados.

Usei o Blinker para implementar signals, um dos usos foi na captura do template e do contexto em que esse template foi renderizado para usar nos testes, o código chega a ser ridículo, o blinker é uma mão na roda.

A documentação ainda está devendo em muitos pontos, temos apenas o quickstart por enquanto, mas se vocês tiverem curiosidade podem olhar os testes que vão descobrir o que podemos fazer com o Gunstar.