Hospedando um repositório Git em seu servidor

Atualmente o meu sistema de controle de versão favorito é o git. Para projetos de código aberto não é necessário pensar duas vezes: hospede no github.

Na hora de trabalhar com código proprietário, o “segredo” do seu produto/empresa, você tem duas escolhas: pagar por uma conta no github ou hospedar em seu próprio servidor. Já experimentei os duas alternativas e posso afirmar que pago os U$12,00 mensais do github com muito prazer.

Porém, caso você goste de fortes emoções, esteja passando por tempos de vacas magras ou de paranóia, não custa nada relatar o que eu considero ser a melhor maneira de hospedar seu próprio repositório git: Gitosis

Para instalar:

git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install

Agora é a hora de adicionar o usuário que será dono dos repositórios, vamos chamá-lo de … git !

sudo adduser \
    --system \
    --shell /bin/sh \
    --gecos 'git version control' \
    --group \
    --disabled-password \
    --home /home/git \
    git

Copie sua chave pública ($HOME/.ssh/id_rsa.pub) para o servidor git. Para gerar a chave:

ssh-keygen -t rsa

No servidor git, vamos adicionar sua chave à lista de chaves autorizadas:

sudo -H -u git gitosis-init < /tmp/id_rsa.pub

Agora … a magia do gitosis, em sua máquina local:

git clone git@SEU_SERVIDOR:gitosis-admin.git
cd gitosis-admin

Voce terá um arquivo gitosis.conf e uma pasta keydir/
Esse repositório que você acabou de clonar contém os arquivos necessários para criar e administrar os repositórios git no servidor. Assim que você fizer push, o gitosis irá automaticamente fazer as mudanças necessárias no servidor.

Ou seja, você gerenciará seu servidor git com o git ! Além disso, a partir desse momento o login no servidor não será mais necessário, afinal basta fazer as atualizações localmente e o commit/push.

Para criar um repositório, basta editar o arquivo gitosis.conf:

 
[gitosis]                  
 
[group gitosis-admin]
writable = gitosis-admin
members = victor # nome do arquivo com a chave publica, sem o ".pub"             
 
#Para criar um novo repositório, bastar dar permissões de escrita nele:
 
[group minha_equipe]
members = victor
writable = top_secrect
 
git commit -a -m "Dando permissão a victor no repositorio top_secret"
git push

Agora, o usuário “victor” tem acesso ao respositório, porém este não foi criado ainda, isso precisa ser feito localmente, seguido de um push:

mkdir top_secrect
cd top_secrect
git init
git remote add origin git@SEU_SERVIDOR:top_secrect.git
touche README
git add .
git push origin master

Com esse push o repositório já foi criado e agora é só usar normalmente.

Para adiconar mais usuários basta colocar a chave deles em keydir/username.pub

Aproveite seu servidor de repositórios git, ou não :)

Django 1.3 – Vale a pena migrar ?

Se vale a pena migrar ? Como eu vou saber … você tem que conhecer as vantagens e as dificuldades de migração para ver se vale a pena no seu caso. E é sobre isso que vou falar aqui :)

As duas maiores novidades são as views baseadas em classes e o gerenciamento de arquivos estáticos. Os dois assuntos são bem extensos e cada um receberá seu próprio post em breve, vamos as outras novidades:

Novidades:

O python 2.7 melhorou muito a biblioteca unittest, para garantir que todos pudessem aproveita-las o pessoal do django fez um backport para python 2.4, chamado de unittest2.

A unittest2 está incluida no django e para aproveita-la em versões no python<2.7 basta usar o alias:
from django.utils import unittest

O nome de um template agora pode ser fornecido através de uma variável:

{% extends some_var %}

O módulo Logging do python é muito poderoso, e agora ele funciona integrado com o Django. Agora fica muito mais fácil configurar o comportamento e a versosidade dos seus logs. Além disso, segundo a equipe de desenvolvimento várias chamadas de log foram adicionadas no código da framework.

Delete-Cascade: os campos ForeignKey e OneToOneField agora aceitam o argumento on_delete para definir o comportamento quando o objeto referenciado é apagado.

Marcadores de contexto para tradução de strings: Para strings com tradução ambígua, dependente do contexto foi disponibilizada a função pgettext para especificar o contexto.

Agora é possível definir mais de uma váriavel com apenas um bloco with :)

A tag include agora aceita as opções with (para definir um contexto) e only (para excluir uma variavel do contexto atual) =D

A tag load aceita o argumento from, para carregar apenas um filtro ou tag.

Para ficar de olho:

Essa é a ultima versão do django com suporte a python2.4 , mas acho que pouca gente ainda está nessa versão. Mas fica o alerta: Se você usa python 2.5 a sua hora de migrar vai chegar.

A partir dessa versão a validação de segurança contra ataques CSRF também será obrigatória para requests AJAX.

Arquivos referênciados por um modelo através do FileField não serão mais apagados junto com o modelo e não há nenhuma maneira automática para que isso seja feito. O padrão sugerido é escrever um management command para apagar arquivos órfãos e colocar no cron.

A moderação automática de comentários não está mais sendo suportada, afinal é um problema de processamento de linguagem natural e foge do escopo da framework. Se você quiser restaurar o comportamento antigo basta colocar uma lista de palavras em PROFANITIES_LIST no settings.py

O uso de fixtures de teste no formato SQL não é mais suportado.

O suporte a mod_python foi removido, afinal um release não é feito desde 2007 e a fundação apache removeu esse módulo da lista de projetos ativos.

XMLField foi removido: nunca vi muita utilidade mesmo ...

Esses foram os pontos que considerei mais interessantes nessa release do django, espero que se você não foi convencido a migrar, mude de idéia nos próximos posts sobre class based views e static files.

As ferramentas de um programador Python – 1

Decidi fazer uma série de posts sobre as ferramentas que facilitam o desenvolvimento na linguagem Python. A idéia é ter um escopo bem aberto: começarei com gerenciamento de pacotes hoje, porém pretendo abordar bibliotecas, funcionalidades da biblioteca padrão, utilitários para teste, analisadores de sintaxe, etc.

Easy Install

Foi a primeira iniciativa de gerenciamento de pacotes com Python, e faz parte do pacote setuptools. O easy_install é bem simples: ele instala a ultima versão do pacote caso ele esteja disponível no PyPI (Python Package Index) e não dá suporte a desinstalação ou atualização. Sua utilização é bem simples:
sudo easy_install Django

Pip

O Pip revolucionou completamente o gerenciamento de pacotes no Python, suas principais características são:

  • Suporte a desinstalação e atualização dos pacotes
  • É possível especificar a versão desejada (desde que disponível no PyPI)
  • Instala pacotes a partir de arquivos compactados (bz,gz,zip) que podem ser especificados através de uma url para download
  • Suporte aos principais sistemas de controle de versão (svn, git, mercurial, bazaar). Basta especificar a url do projeto do github para instala-lo por exemplo
  • Gerencia dependências de forma inteligente
  • É possivel instalar vários pacotes de uma só vez, especificando um por linha em um arquivo de texto. Assim como é possivel exportar a lista de pacotes instalados para um arquivo

Uma visão rápida na sintaxe do pip:

# instalando do pypi (os operadores >,<,==,>=,<= são suportados para expressar a versão do pacote)
pip install django>=1.3

# listando pacotes instalados
pip freeze

# fazendo upgrade para a versão mais recente
pip -U django

# instalação recursiva
pip -r requirements.txt

# instalando a partir de um repositório, suporta svn, hg, git e bzr
pip -e git+https://github.com/SmileyChris/django-mailer-2.git#egg=django-mailer-2

# desinstalando
pip uninstall web2py

Um outro recurso interessante do pip, é a criação de bundles. Um arquivo .pybundle contém todas as dependências de sua aplicação e é muito útil para deploy em ambientes offline ou com internet precária.

Um pybundle não contém binários, apenas fontes, portanto é necessário que o ambiente de deploy já possua um compilador no caso de dependências que não são python puro, como no caso da PIL.


pip bundle MinhaApp.pybundle MinhaApp

pip install MinhaApp.pybundle

No próximo post da série: virtualenv e virtualenvwrapper.

Email, twitter, etc: Navegador ou App ? ( Mac OSX )

Volta e meia quando estou mac a mac com meu amigo Pedro Marins e ele dá uma espiada no meu Dock para ver se tem algum programa imperdível para Mac OSX.

Ontem, ele reparou que eu estava usando uma série de apps para acessar aplicativos/serviços web e redes sociais. Eu já tinha lhe recomendado o excelente Nambu (cliente twitter) e ele revolucionou minha experiência com feeds quando me recomendou o Reeder (cliente Google Reader).

Além desses dois aplicativos, já incorporados em nossas rotinas, ele questionou o Sparrow e o MarsEdit, ambos fixos em minha dock. Expliquei: Cliente do Gmail e do WordPress.

Era de se esperar sua expressão de surpresa, afinal a interface web tanto do gmail quanto do wordpress são excelentes, o gmail funciona offline e o wordpress possui uma série de otimizações através do google gears.

Antes de listar outros aplicativos que tenho usado do mesmo gênero, explico a minha incomum preferência. Mesmo após a série de melhorias que testemunhamos nos navegadores como, separação de processos por aba, motores JS e DOM cada vez mais rápidos, html5 (LocalStorage, Web Sql, Cache Manifest, IndexedDB, etc …), aplicativos dedicados tem algumas vantagens bem claras:

  • A interface nativa de seu sistema operacional proporciona uma resposta mais rápida e é esteticamente mais agradável
  • As possibilidades que o programador tem para conceber a UI são ilimitadas, muito diferente quando se está preso aos elementos do DOM
  • A integração com o sistema operacional, traz muitas vantagens, como o acesso direto (e mudança do ícone para indicar estado pelo dock), notificações growl, início junto com OS e continua funcionando mesmo se o navegar travar (o que infelizmente ainda acontece, principalmente pra quem não abre mão dos betas)
  • Se você precisa trabalhar offline ou com internet lenta/intermitente apps desktop sempre proporcionam uma experiência melhor
  • Nas palavras do Pedro: “Fica tudo mais organizado”

As desvantagens ? Em alguns casos as apps que realmente valem a pena são pagas e o consumo de memória também pode ser um problema se seu notebook é fino que nem o do Pedro :)

Vou agora listar os aplicativos que uso:

  • Sparrow: Cliente IMAP para o Gmail, interface excelente, limpa e funcional. Atalhos de teclados, e a possibilidade de usar CMD + setas e tab na edição do corpo do email fazem valer os U$ 9.90
  • Reeder: Leitor de feeds, completamente integrado ao Google Reader, Read it Later, Instapaper e o que mais você imaginar
  • Nambu: Twitter de maneira funcional e não invasiva, excelente ! (Não está mais sendo desenvolvido)
  • MarsEdit: Editor de blogs, tenho usado nos meus últimos posts e melhorou muito a experiência de uso do WordPress
  • iCalendar: Já vem no Mac OSX e se integra perfeitamente com o Google Calendar
  • Facebox: Facebook não é muito a minha praia, mas pra quem gosta de seguir a timeline de perto é uma excelente opção.