quinta-feira, 30 de abril de 2009

Implante um DVCS!

Enquanto vejo grandes projetos e empresas adotarem o uso de um DVCS (distributed version control system) como Git, Mercurial ou Bazaar, e muitos estarem até mesmo substituindo o Subversion gradualmente, fico intrigado sobre o motivo pelo qual várias empresas ainda estão querendo passar por um atrasado processo de migração do CVS para o Subversion. Ignorância? Medo? Este post é para elas.

Com certeza o Subversion é uma boa opção de VCS. Mas a adoção de um DVCS traz alguns benefícios:
  • Todo munto tem seu próprio repositório. Você pode fazer mudanças e roll backs em sua máquina. Acabam-se os checkins gigantes e todo o histório de mudanças está disponível em seu repositório.
  • Trabalho offline. Você precisa estar online somente para compartilhar mudanças. Desta forma, você pode estar com sua máquina em qualquer local e fazer seus checkings e undos, sem se preocupar se um servidor está parado ou se você está num avião.
  • Rapidez. Diffs, commits e reversões são feitos localmente. Como não há necessidade de rede, tudo é mais rápido.
  • Mudanças bem gerenciadas. As mudanças em DVCSs são construídas pelo compartilhamento de mudanças. Cada mudança tem um identificador (guid) que é fácil de ser rastreada.
  • Branching e merging mais fáceis. Pelo fato de cada desenvolvedor "ter seu próprio branch", cada mudança é como uma integração ao reverso. Mas guids tornam fácil combinar automaticamente o código e evitar duplicações.
  • Menos gerenciamento. Distributed VCS são simples de serem instalados, não há o conceito de cliente servidor, mas sim o de local/remoto. Mesmo assim, nada impede que você crie este conceito (mas a instalação do software é da mesma forma). Também, como não há servidor, não há o requisito de que você crie novos usuários nele.

Hoje eu andei fazendo testes com o Mercurial, após ler a mensagem de que o Google Code também passou a suportá-lo. Achei ele simples e também mais fácil do que o Git, que também já venho utilizando em algums projetos pessoais.

Como venho estudando o Python e acompanhando de perto a sua comunidade, também li a notícia de que o Mercurial será utilizado por seus desenvolvedores. Luciano Ramalho do grupo Python Brasil comenta a respeito.

Leia a comparação que o Google fez do Git com o Mercurial.

O SourceForge também já suporta, além do CVS e do Subversion, o Git, o Bazaar e o Mercurial.

Para saber mais sobre DVCS, Git e Mercurial e conhecer a opinião de alguns desenvolvedores no mercado, recomendo as seguintes leituras:

terça-feira, 28 de abril de 2009

O @ do Phyton parece com o do Java, mas não é!

Como desenvolvedor experiente em Java (e usando anotações a vários anos) mas iniciante em Python, eu andei um pouco intrigado com a sintaxe @algumacoisa encontrada em alguns códigos de aplicações Django. Estudei Python pelo Python Tutorial e pelo livro Dive in Python mas, em momento algum, notei esta sintaxe. Então, procurando saber mais a respeito, descobri que ela foi inserida no Python 2.4. O Dive in Python foi escrito com o Python 2.3 e está desculpado... Mas, o Python Tutorial que li, foi para a versão 2.6 do Python. Eu realmente não me lembro de ter visto uma explicação para esta característica da linguagem neste tutorial. De qualquer forma, além da explicação do What's New in Python 2.4, também gostei das explicações de David Mertz em seu artigo Charming Python: Decorators make magic easy e de Phillip Eby no DDJ. Para se aprofundar, e entender porque eu estou curtindo a bessa o Python, leia estes artigos. Mesmo assim, vou dar uma explicação básica sobre o @algumacoisa:

A explicação para esta sintaxe no Python é a seguinte...

Antes do Python 2.2, não existiam métodos estáticos. Isto significa, que não era possível criar uma classe como a definida no código abaixo e executar "metodo", sem criar uma instância, como fazemos em Java. Ou seja, o código Classe.metodo("argumento") daria erro pois não existia o conceito de método estático.

class Classe:
  def metodo(arg):
    print 'arg =', arg

Entretanto, o código acima está sintaticamente correto e pode ser executado através da construção Classe().metodo(), mesmo no Python 2.2. A questão é que ele não vai estar fazendo o que gostaríamos, pois nosso intuito era poder passar um parâmetro para o método. Bem... O Python, como eu disse, segue uma FORTE convenção de que o primeiro parâmetro se chame "self". Mas isto é apenas uma convenção! Então, o que ele interpreta na execução do código acima? Ele simplesmente aceita que você está querendo imprimir o próprio objeto (através de print), mas não aceita você passar um parâmetro para a função como numa chamada a Classe().metodo("teste"). Ele vai dizer que o método está esperando apenas 1 argumento e 2 foram passados (self e "teste", para clarear sua mente...).

Com a introdução das funções build-in classmethod e staticmethod no Python 2.2, foi possível a modificação do código para o apresentado abaixo e, consequentemente, a execução do código a seguir:

class Classe:
  def metodo(arg):
    print 'arg =', arg

  metodo = staticmethod(metodo)

Classe.metodo("teste1")
Classe().metodo("teste2")

Ou seja, surgiram os nossos conhecidos métodos estáticos! O código semelhante em Java seria:

class Classe {
  static void metodo(String arg) {
    System.out.println("arg = " + arg);
  }

  public static void main(String[] args) {
    Classe.metodo("teste1");
    (new Classe()).metodo("teste2");
  }
}

Quando surgiu, no Python 2.4, o conceito de decorators, passamos a simplificar a linguagem da classe acima, reescrevendo-a da seguinte forma:

class Classe:
  @staticmethod
  def metodo(arg):
    print 'arg =', arg

  Classe.metodo("teste1")
  Classe().metodo("teste2")

Entendeu o que é um decorator em sua essência? Não? Então vamos a mais um exemplo que talvez esclareça mais algumas coisas...

O que o buildin staticmethod faz é pegar um método, e modificar seu comportamento... Isto é parecido com o código abaixo:

def olamundo(metodo):
  def mundo(self):
    return " ".join([metodo(self), 'mundo!'])
  return mundo

class OlaMundo:
  def ola(self):
    return 'Ola'
  ola = olamundo(ola)

print OlaMundo().ola()

A função olamundo recebe um método como parâmetro. Internamente, ela cria um outro método (mundo) que retorna uma string concatenando o resultado da execução do método passado com a string "mundo!". Em seguida, ela retorna esta nova versão do método.

Poderíamos reescrever o código acima, da seguinte forma:

def olamundo(metodo):
  def mundo(self):
    return " ".join([metodo(self), 'mundo!'])
  return mundo

class OlaMundo:
  @olamundo
  def ola(self):
    return 'Ola'

print OlaMundo().ola()

Isto são os decorators do Python... Num outro post, eu falo mais sobre anotações em Java!

Livros que tratam do uso de Django com Ajax

Só para complementar meu post anterior, sobre como estou aprendendo Python e Django, gostaria de dizer que nenhum dos livros que citei, tratam bem do uso de Ajax com o Django. Sendo assim, uma alternativa melhor (neste aspecto), é a leitura do livro "Learning Website Development with Django" ou de sua edição mais atual: "Django 1.0 Website Development".

O capítulo 6 do primeiro livro que citei, faz uso do jQuery para solucionar problemas interessantes com Ajax.

Estou atualizando, durante esta semana, meu tutorial de Django para abordar estes assuntos.

segunda-feira, 27 de abril de 2009

Hello Django para desenvolvedores Java

Segue um tutorial que eu estou escrevendo, fazendo algumas comparações do que eu conheço na programação Web em Java com o que você pode fazer no Django. Por enquanto, estou saindo do zero e evoluindo uma aplicação Django. Conforme eu for atualizando este material, criarei exempos equivalentes em Java, utilizando alguns frameworks conhecidos.

quinta-feira, 23 de abril de 2009

Como estou aprendendo Python e Django

Eu, como disse neste post, estou realmente me divertindo com Python e Django. Geralmente não faço cursos e obtenho conhecimento através da leitura de livros, blogs e vídeos disponíveis na Internet e praticando. Como estou num processo de "mergulho" nestes assuntos, achei que seria interessante repassar a quem lê este blog, o que estou fazendo para me aprofundar:
  1. Começei pela leitura do Python Tutorial e pela execução dos seus exemplos;
  2. Encontrei e li partes do livro Dive in Python que traz exemplos mais "reais" e significativos a respeito das diversas características do Python, incluindo introspecção, OO, expressões regulares, processamento XML, Web Services, TDD e mais uma porção de coisas interessantes. Realmente, este é um excelente livro e eu ainda continuo em sua leitura.
  3. Após estudar o básico de Python, cai no Django para escrever alguns exemplos e testar o que ele pode oferecer. Partindo do básico, o melhor livro que encontrei para isto foi o The Django Book. Estou gostando mais de aprender por ele do que pelo tutorial de Django pois, achei interessante a questão do autor explicar como o Django evoluiu a partir do CGI, e a criação de Views e Templates antes mesmo da explicação de Models. Eu gostei desta abordagem mas, se você prefere fazer algo mais prático utilizando um banco de dados, o tutorial e o livro Practical Django Projects parecem ser mais interessantes. Depois de ler estes livros, eu pretendo me aprofundar ainda mais com o livro Pro Django. Este último, pelo que li folheando algumas páginas, cobre aspectos relativos ao Django sob a perspectiva de um desenvolvedor de frameworks, fazendo com que o leitor compreenda aspectos avançados do Python utilizados para a criação de Models, URLs e Views, Templates e toda a parafernalha que compõe o Django.
  4. Vídeos são muito úteis: gostei da série introdutória aonde o André Duarte explica o tutorial de django. Mas, mais interessante do que esta série, são os vídeos da PyCon 2009. Eles cobrem a programação em python, ferramentas, frameworks, do básico até o mais avançado. Vale mesmo a pena ver estes vídeos.
  5. Após rodar diversos exemplos e criar alguns para testar as coisas, estou criando um pequeno projeto em Django.
  6. Ainda não estou participando de nenhuma grupo de discussão, mas com certeza eles são úteis para a solução de problemas comuns. A comunidade Python parece ser bastante contagiante e entusiasmada. Existem estas listas sobre Python e eu também já tive solução para alguns problemas que passei pesquisando a lista Django Users.
É isto. Esta é a forma como estou aprendendo Python e Django.

quarta-feira, 22 de abril de 2009

Realizando testes em Python?

Eu estou começando a fazer TDD e BDD no Python e tenho descoberto um monte de ferramentas interessantes para isto. Eu já tenho a prática do TDD consolidada na programação em Java, mas ela também é bastante divertida em Python! Para se aprofundar nestes assuntos, veja estes links.

Família de blogueiros

Então é assim: eu blogo, minha esposa, filha e filho blogam. Efeitos positivos:
  • Minha esposa tem começado a gostar mais de computadores e ver que eles não servem apenas para tirar o meu tempo dela. Passou a escrever sob seus sentimentos e tudo o que acha interessante, divertido ou o que mais possa surgir...
  • Meus filhos, assim como todos os desta geração, não usam mais o termo "aperte o botão" mas sim "clique o botão". Desta forma, eles também estão confortáveis para utilizar o blogger. Falam sob coisas que acontecem em suas vidas: isto inclui posts sobre aviões supersônicos sobrevoando a praia do Leme e também sobre a final da Taça Rio no Maraca. Eles ainda tem algumas dificuldades na linguagem escrita, mas tanto eu como minha esposa revisamos os posts que eles escrevem. Isto aprimora o conhecimento deles no português.

sábado, 18 de abril de 2009

8Km (de caminhada e conversas)

Eu e meu Pai fizemos hoje uma caminhada pelo calçadão de Copacabana, no trecho que geralmente eu corro. Pedrinho nos acompanhou em sua bike.

quinta-feira, 16 de abril de 2009

Autenticação no JAAS

Quando ministro cursos de Java ou JBoss e preciso falar de JAAS, geralmente eu sigo junto com os alunos o tutorial de JAAS da Sun. Recentemente entretanto, com a finalidade de simplificar o estudo, eu criei esta tradução/adaptação do tutorial (relativa a parte de autenticação inicialmente), utilizando o Ant como ferramenta para tornar a construção da aplicação mais simples do que o proposto no documento original.

Recuperando meu site

Algumas pessoas que acompanham meu blog podem ter percebido que, do fim de 2008 até o mês passado, eu estive com meu site parado e até mesmo desativado por algum tempo. Mas, o que interessa agora é que eu estou fazendo um trabalho de recuperação de posts e materiais antigos que acredito que ainda possam ter algum valor para as pessoas que lêem este blog, por qualquer motivo que seja. Desta forma, a medida em que esta recuperação for sendo realizada, eu estarei informando isto através de posts por aqui. Neste processo de recovery, quando eu tenho algum texto, um pouco mais longo, que valha a pena ser recuperado, eu estou reformatando o mesmo utilizando o Txt2tags. Fiz isto para um dos primeiros artigos que escrevi sobre Test-Driven Development em Java pouco tempo após o evento Extreme Programming Brasil 2002, enquanto ainda trabalhava com o Helder da Rocha na Argo Navis. Dá pra perceber que eu também venho utilizando o DropBox (uma ferramenta fantástica). O que ele faz? Ele mantem uma cópia dos arquivos que me interessam em vários computadores, de forma sincronizada. Quando você cria uma conta no Dropbox, você tem de imediato, 2GB de espaço para seus arquivos. Ele trabalha perfeitamente integrado ao Ubuntu através do Nautilus e me possibilita, ao modificar uma cópia local de algum arquivo no disco, que esteja na pasta Public, que esta cópia esteja sincronizada também na minha pasta pública da Internet. Além disto, até o presente momento ele transmite os arquivos via HTTP e exige apenas, que seja configurado o proxy, caso você utilize um. Realmente ele é simples e prático! Se você tiver um servidor Apache pessoal, tem também esta dica, que possibilita você utilizar uma configuração em .htaccess para não ter que utilizar as URLs do Dropbox, mas sim, uma URL mais amigável de teu próprio domínio. Eu também tenho alguns wikis criados através do TiddlyWiki. Um exemplo, que já está publicado é o PJ's GNU/Linux short hints. Eu atualizo este wiki localmente em uma das máquinas que possuo o Dropbox instalado e ele se encarrega de sincronizar esta cópia na Internet e em outras máquinas que também possuem o Dropbox instalado. Tenho escrito wikis no TiddlyWiki quando preciso de escrever algo de forma não linear, conforme as idéias vão surgindo. Ele é excelente para isto. Em breve vou disponibilizar aqui alguns links para wikis com material e referências que utilizei em alguns treinamentos de JBoss que ministrei no passado. Bem... este post era só pra falar que estou recuperando meu site mas, acabei me empolgando e resolvi falar também de algumas ferramentas que estou utilizando para isto. E, já que falei sobre elas, vou apenas citar mais uma super legal e que merece um destaque como o que fiz no artigo "Gerando apresentações S5 com o Txt2tags". O S5 realmente me atende muito bem pois eu sou um daqueles tipos de pessoas que odeiam as ferramentas do tipo "Office" para fazer apresentações. Sinceramente, para edição de texto, eu não consigo mais utilizar outra coisa se não o Vim. E, como não sou nenhum designer e o que me importa é passar algum conteúdo com figurinhas simples e alguns vídeos, não preciso da maioria das "features" oferecidas por arquivos do tipo PPT ou ODP. Veja algumas apresentações que criei utilizando o S5: Só para complementar (e para que vocês não pensem que eu sou o único louco que utiliza o S5) veja também estes materiais: Concordo que não é um show de visual mas, para as apresentações simples que faço, e que precisam estar publicadas na Net e às vezes linkadas com vídeos, eu não preciso de mais nada... Finalizando! (Sim é o fim ;-). Meu delicious também está mais organizado e agora também estou utilizando o twitter! É só!

segunda-feira, 13 de abril de 2009

Aniversário da Anthonella

Fábio Sbano, amigo no trabalho dentro da Andima/BACEN, promoveu a festa de aniversário de 1 ano de sua filha Anthonella, no sábado passado. Foi ótimo!

Fotos do evento:

Diversão com Python

Quando não estive me divertindo com minha família durante o fim de semana passado, me diverti com Python, lendo o Dyve Into Python e colocando seus exemplos em funcionamento. Eu me entusiasmei com a simplicidade e a produtividade do Python na escrita de aplicações. Vou começar a falar mais sobre ele e sobre o Django neste blog. Por muito tempo eu já tenho utilizado python indiretamente, para executar scripts como o tx2tags. Mas agora resolvi aprendê-lo, definitivamente. Minha intenção é participar de alguns projetos que achei muito interessantes. Mais detalhes em breve...

domingo, 12 de abril de 2009

Páscoa (de minha família p/ você)

Hoje, um texto interessante no folheto da missa me deu vontade de publicá-lo aqui. Ele mostra o significado da Páscoa para mim e para minha família:

Ressuscitou, como disse.
Desde a antiguidade, os Cristãos se reunem em vigília na véspera do Domingo seguinte a primeira lua cheia da primavera (no outono do nosso hemisfério norte) para celebrar a Páscoa do Senhor. Os primeiros raios de sol, entoavam jubilosos as palavras do Salmo 117: "Este é o dia que o Senhor fez para nós, alegremo-nos e nele exultemos."

Com estas palavras recordavam o primeiro dia do Gênesis, em que Deus criou a luz, em que a Terra era informe e vazia e o Espírito de Deus pairava sobre as águas. Recordava-se a Palavra criadora de Deus que, ao chamar do nada todas as coisas, viu que tudo era bom.

Hoje a Igreja celebra nova criação. No momento em que Cristo ressurge da morte, resgatando o homem decaído - nosso pai Adão e toda a sua descendência, a humanidade - do mal e da morte, o universo inteiro é recriado. Não é por acaso que, na tarde de Páscoa, estando fechadas as portas por meio dos judeus, Jesus aparece junto aos discípulos saudando-lhes com a paz. Soprando sobre eles, lhes diz: "Recebei o Espírito Santo". O mesmo Espírito que pairava sobre as águas, transformando o caos em cosmo; o mesmo sopro divino que animou do barro o primeiro homem é insuflado sobre toda a humanidade por Aquele que, do alto da cruz, dando um grande grito, entregou o seu Espírito. Envia teu Espírito, Senhor, e renova a face da Terra.

"Se ressuscitastes com Cristo - nos diz neste domingo o grande Apóstolo São Paulo -, buscai as coisas do alto." A ressurreição de Cristo é questão vital para nós. Somos todos participantes desta vitória. Somos vivos, graças Àquele que o livro do Apocalipse chama de o Vivente, Cristo Ressuscitado. Realiza-se hoje aquela estupenda expressão do Bispo Santo Irineu de Lion: "A glória de Deus é o homem vivo" (Gloria Dei homo vivens), ou seja, onde mais se torna visível a glória de Deus é no homem pleno de vida.

Celebramos hoje a vida em plenitude. Cristo, nossa Páscoa, foi imolado. A vida venceu a morte. Nossa esperança está viva e tem um nome: Jesus, Vencedor da morte e Senhor da vida. A todos uma feliz e santa Páscoa!

quinta-feira, 2 de abril de 2009

Corrida #20090401 - Perna esquerda doendo

Mesmo assim eu fui correr e o tempo diminuiu 1 minuto em relação a corrida anterior. Tempo final: 53min. Hoje (02/Abr) eu não corro! A dor precisa passar...

Corrida #20090331 - 1, 2, 3, 4

Desta vez, eu fui correr com meu filho e minha filha (eles foram em suas bicicletas). A corrida começou às 06:54 e terminou às 07:48. Minha filha me "incentivou" nos 5Km finais dos 8 do percurso, "gritando" 1, 2, 3, 4 repetidamente... Daí o tempo final foi de 54min e ela achou LENTO. Sim, ela esta certa... mas to perdendo peso pra melhorar!