5. 09.
Contextualizando…
Hoje recebi um email de Swaroop C. H., autor do livro “A Byte of Python”, avisando que o texto foi atualizado para contemplar as mudanças que virão com o Python 3. O aviso foi endereçado a mim porque, há algum tempo, fui a primeira pessoa a se voluntariar para traduzir a obra para o Português Brasileiro. Na época, cheguei a abrir o projeto de tradução para o público, mas ainda assim o trabalho evoluiu devagar. Acredito que o processo de tradução ficou mais complicado que o necessário, o que deve ter afugentado algumas pessoas. Algum tempo depois, Samuel Dias Neto tomou a dianteira e fez um ótimo trabalho, disponibilizando a tradução completa do livro.
Dessa vez, a nova versão do livro foi disponibilizada originalmente em formato de wiki, o que vai facilitar o processo colaborativo de tradução para diferentes idiomas. Ainda pensando nisso, o autor também modificou a licença, que continua Creative Commons, mas ficou ainda menos restritiva, passando de Attribution Non-commercial Share Alike (by-nc-sa) para Attribution Share Alike (by-sa).
E onde eu quero chegar?
Como trata-se de um texto voltado principalmente para iniciantes absolutos tanto em Python quanto em programação, nunca é demais tê-lo disponível em nosso idioma. Para isso, vamos aproveitar a proximidade da chegada de Python 3 e tentar (novamente) traduzir o livro. Dessa vez, vou tentar utilizar a abordagem mais simples possível, apenas para dar visibilidade aos voluntários sobre quem está traduzindo/revisando o quê.
Como contribuir com a tradução
Bastam três passos simples:
- Ter uma conta no Google para poder editar a planilha de controle
- Mandar um email para abop-ptbr (at) rodrigoamaral (dot) net, para que eu possa dar permissão de escrita na planilha
- Escolher um ou mais capítulos para traduzir ou revisar, colocando seu nome na coluna correspondente e editando a coluna de status para indicar a situação atual do capítulo
Depois, é só criar uma conta no wiki seguir o Translation Howto, acessar o índice da tradução em português brasileiro, clicar no capítulo desejado e colocar a mão na massa, lembrando sempre de atualizar na planilha o status do capítulo quando o trabalho estiver terminado.
Preparar… Fogo! Apontar…
Simples assim. A idéia é ir ajustando o projeto da tradução de acordo com as necessidades que surgirem. Para isso, conto com a colaboração de quem já tenha experiência em outras traduções para contribuir com dicas e sugestões, que poderão ser enviadas para o email acima ou postadas nos aqui nos comentários. O mesmo vale para as dúvidas.
Bom final de semana a todos!
Leia também
9. 08.
Nos dias 18, 19 e 20 de setembro acontecerá a quarta edição da PyConBrasil, o maior evento brasileiro da comunidade Python. Este ano, o encontro será sediado na Universidade Veiga de Almeida, no Rio de Janeiro. Durante os três dias, várias palestras sobre diversos temas do mundo Python serão ministradas por grandes nomes da comunidade brasileira. É esperada também a ilustre presença de Bruce Eckel. Infelizmente, será mais um ano em que não poderei me deslocar até o evento, mas meu planejamento para a PyConBrasil 2009 começa desde já!
Informações Importantes
Mais detalhes podem ser encontrados no site do evento.
Leia também
2. 08.
A internet proporcionou uma ampliação do potencial de difusão de conhecimento sem precedentes na história. Nos dias de hoje, é virtualmente impossível que até mesmo o aspecto mais obscuro de qualquer assunto não possua referências na rede. Ainda assim, muitas vezes existe a necessidade de buscar ajuda e tirar dúvidas em comunidades, fóruns, listas de discussão ou salas de chat.
No entanto, especialmente em fóruns técnicos, é necessário adotar a postura adequada para que as dúvidas tenham chance de ser resolvidas por mais pessoas. É justamente por se tratar de pessoas - e não de máquinas - que a abordagem deve facilitar a vida de quem vai responder. Para isso, a pergunta precisa ter algumas características fundamentais:
- Detalhes do que se está tentando fazer ou do problema a ser resolvido. A menos que a pessoa esteja fisicamente a seu lado, não há como adivinhar detalhes como configuração de hardware, sistema operacional utilizado, versão dos aplicativos ou linguagens, entre outros aspectos que podem fazer toda a diferença entre uma resposta precisa, uma resposta vaga ou resposta alguma. Além disso, evite esconder seu código. Acredite: existem mais chances de você ganhar duas vezes na mega sena acumulada do que as de seu código ser inédito.
- Descrição pormenorizada do que está dando errado. Muitas vezes o próprio erro fornece indicações de como resolvê-lo. É comum vermos frases como “tentei executar o trecho de código X, mas deu erro”. Tudo bem, mas que tipo de erro? O que aconteceu? Havia alguma mensagem?
- Indicação do resultado esperado. Não é raro tentarmos resolver um problema pelo caminho mais difícil simplesmente por não saber que havia uma alternativa mais fácil. Se você concentra sua pergunta em “como estou fazendo” ao invés de “o que eu preciso obter”, pode estar perdendo uma chance de economizar tempo e de aprender algo novo.
- Identificação de quem está perguntando. Essa talvez não seja tão fundamental assim, mas considero importante do ponto de vista de humanizar a interação, principalmente quando se está em um meio profissional. Afinal, na internet ninguém sabe que você é um cachorro.
Há alguns anos, Eric Raymond escreveu um artigo chamado How To Ask Questions The Smart Way. Nele, o ilustre programador detalha esses e outros pontos importantes na hora de perguntar. O artigo também está disponível em português brasileiro. Outra boa fonte de dicas é o wiki da comunidade Python Brasil, na página AntesDePerguntar. Apesar de dar ênfase a perguntas para a Python Brasil, os princípios apresentados se aplicam a qualquer comunidade técnica.
Em suma, é primordial ter respeito pelo tempo alheio. Embora a maioria das pessoas tenha boa vontade para ajudar, elas o fazem voluntariamente e, assim como você, também têm seus compromissos. Além disso, bom senso, bons modos e humildade para acatar as orientações também contam pontos na hora de obter boas respostas. Afinal, só pergunta quem ainda não sabe e só se aprende perguntando.
Leia também
8. 07.
Há algum tempo a Sun contratou dois pythonistas renomados para aproximá-la da linguagem. Uma conseqüência natural dessa aproximação seria o suporte a Python em sua IDE NetBeans . Na verdade, a iniciativa já vinha de antes do recrutamento de Ted Leung e Frank Wierzbicki . O projeto NBPython , iniciado por Allan Davis , ganhou o auxílio dos dois novos colaboradores e uma versão inicial já está disponível para quem quiser testar. Por enquanto, o plugin só funciona em nightly builds , já que está em fase inicial de desenvolvimento.
Outra boa notícia vinda da Sun é o lançamento de seu Python Developer Center . O site ainda tem pouco conteúdo, mas não deixa de ser mais uma oportunidade de divulgar Python e seus frameworks para um público que, via de regra, ainda não despertou para o fato de que existe vida além do Java.
Referência: Python in NetBeans: NBPython
Leia também
3. 06.
O programa foi alterado para contemplar as modificações realizadas no site da Bovespa, que tinham inutilizado a versão anterior. Espero que seja de alguma utilidade para quem acompanha a Bolsa. Em breve pretendo soltar um novo release contendo também uma nova versão da interface gráfica, com mais funcionalidades. Postem suas críticas, dúvidas e sugestões nos comentários.
Download: bovespa-utils-0.0.2.tar.gz
Leia também
28. 03.
A finalidade do módulo shelve é persistir objetos Python em disco, de maneira que seus dados possam ser recuperados e os objetos possam ser recriados posteriormente. Geralmente usamos este módulo quando precisamos preservar o estado de uma aplicação sem que seja necessário recorrer ao uso de bancos de dados relacionais. Um exemplo simples desse tipo de necessidade seria o armazenamento das configurações de um aplicativo.
Um shelf em Python é um objeto de estrutura semelhante à de um dicionário (dictionary), ou seja, mapeia pares de chave e valor. Um valor pode ser basicamente um objeto de qualquer tipo, mas a chave única que o identifica só poder ser do tipo string.
Para criar um novo shelf, basta utilizar a função open(), passando como argumento o nome do arquivo onde os objetos serão armazenados:
>>> import shelve
>>> shelf = shelve.open(‘exemplo.db’)
Feito isto, shelf pode ser usado como um dicionário convencional:
>>> shelf['Batman'] = ‘batman@provedor.com’
>>> shelf['Superman'] = ’superman@provedor.com’
Ao terminar de trabalhar com o shelf, é preciso fechar o arquivo:
>>> shelf.close()
Pronto. Está criado um arquivo em disco contendo, neste caso, o mapeamento de nomes para endereços de e-mail. Para recuperar os dados gravados em disco é só abrir novamente o arquivo e referenciar o índice desejado. Por exemplo, para obter o e-mail do Superman e mostrá-lo na tela, fazemos:
>>> contatos = shelve.open(‘exemplo.db’)
>>> print contatos['Superman']
superman@provedor.com
Apenas vamos demonstrar que a persistência é feita com qualquer tipo de objeto, não somente strings:
>>> class Carro(object):
def __init__(self, modelo, ano):
self.modelo = modelo
self.ano = ano
>>> carros = shelve.open('carros.db')
>>> carros['XYZ-1234'] = Carro('Fusca', 1970)
>>> carros['ABC-9999'] = Carro('Corcel', 1975)
>>> carros.close()
>>> automoveis = shelve.open('carros.db')
>>> c = automoveis['XYZ-1234']
>>> print c.modelo, c.ano
Fusca 1970
Por padrão, as modificações realizadas em um objeto recuperado de um shelf não são persistidas. Para isso, é necessário fazer novamente o armazenamento explícito do objeto ou então utilizar a opção writeback=True.
Referência: shelve — Python object persistence
Leia também
10. 03.
10 Things a Beginner Should Know About Pygame (english version)
- Before you start, learn Python. For those who already code in another language, I give you my word: It’s a freaking easy task. Satisfaction guaranteed or your money back.
- Display is where action happens. The pygame.display module controls the game window. set_mode() defines window size and the get_surface() returns a reference to the Surface (see next topic) that represents the game window. A very important concept to keep in mind when using Pygame is that changes made to display aren’t immediately seen on screen. To do that, you need to update screen by calling flip() or update(). The difference between these two methods is that the former updates the whole screen and the latter updates only the screen areas passed as parameters.
- Surface vs. Rect.Objects from the Surface class represent fixed size images (width x height). blit() draws a Surface (image) inside another and is the main method of the Surface class. Rect class defines objects that represent and handle rectangular coordinates on the screen. If you need to set a relationship between these two classes, remember the Surface.get_rect() method. It returns an object from Rect class representing the coordinates of a given image.
- Is Sprite a thing you can drink? The pygame.sprite module has classes and functions that controls game dynamics. Sprite is the base class used to represent visible objects in our games. These objects are grouped in objects from the Group and its descendants (RenderUpdates, OrderedUpdates a GroupSingle). So, before doing geometric tricks when in need to check if an object touches another, don’t forget: the spritecollide() method is your friend.
- Understand the event loop. In order to work well, a Pygame application needs to keep itself observing the several events that occur during execution, like pressed keys, mouse clicks and others. Thus, we need to implement and infinite loop, breaking it only when the application is explicitly finished.
- Mute cinema? As in any movie, a good game needs to have sounds. In this case, pygame.mixer is the module in charge. The Sound class objects load and play sounds from OGG or WAV (uncompressed) files. Once the object is created, play() methods plays the sound.
- And what about text? To show text characters on screen we can count with the help of the pygame.font module. Text is rendered as a new object of the Surface class. Font class loads a TrueType font from a file, while its sister SysFont does it simply passing the name of one of the fonts currently available on OS. Once the object with a loaded font is created, you just need to call render() passing the string containing the text to get a Surface with the rendered text.
- Try to write object oriented code. Pygame is easy, but code for any game with a minimum of complexity may easily become large and difficult to mantain. Identify the game elements that have attributes in common and use the concept of inheritance.
- Read the Line By Line Chimp tutorial. Before you start, make sure to keep some time to follow the chimp tutorial rigorously. It’s a very short text and shows most basic concepts and just the ones that really matter. In fact, I think I should put this tip on top of the list :)
- Study the source code of a complete game. This particular example has an incremental approach, in which you can notice the changes in game according to the need to add new elements to evolve the game.
Leia também
4. 03.
A semana começou com uma notícia importante para Python e as linguagens dinâmicas em geral. Ted Leung, programador de renome e entusiasta de Python, e Frank Wierzbicki, “o cara” do Jython, começaram hoje a trabalhar na Sun Microsystems. As contratações sinalizam a expectativa de que a Sun passe a dar tanta atenção a Python quanto o faz com Ruby. Do mesmo modo, isso não deixa de acenar também que a empresa está, de certa forma, admitindo que perdeu o passo e está correndo atrás do prejuízo, também conhecido pela alcunha de IronPython.
Segundo Leung, a intenção da Sun é suportar Python de maneira similar ao que faz com o JRuby, o que justifica o recrutamento de Wierzbicki para suas fileiras. Provavelmente este seja também um primeiro passo para, por exemplo, termos suporte a Python no NetBeans - que particularmente acho uma IDE bastante interessante, coesa e robusta. Vamos ver no que vai dar.
Referência: Sssssssssssssssssssssssun, por Tim Bray
Leia também
23. 01.
A finalidade do Django People é localizar os desenvolvedores que usam o framework Django em todo o mundo. O site usa o Google Maps para que os usuários cadastrados marquem sua localização no planeta. Por enquanto, o Brasil é o terceiro país com mais desenvolvedores cadastrados, perdendo apenas para os Estados Unidos e o Reino Unido. Assim que o usuário faz o login, Django People mostra os usuários que residem perto da sua localização. O site dá uma boa dimensão da força que o framework vem ganhando nos últimos meses.
Leia também
20. 07.

O pequeno script que recupera a cotação de ações da Bovespa , apesar de não ser um primor de robustez, acabou gerando mais interesse do que eu imaginava. Inclusive, surgiram colaborações para melhorar o código, já devidamente aplicadas (valeu, Thulio!).
Sendo assim, aproveitei um pouco de tempo livre para escrever uma interface gráfica bem simples, para aqueles que por algum motivo não se sentem confortáveis com a linha de comando.
A implementação foi feita utilizando o Tkinter que, apesar da pobreza de widgets, ainda é o campeão no quesito portabilidade (além do que utilizar uma biblioteca mais poderosa seria um canhão pra matar mosca).
Como de costume, qualquer pessoa pode ficar à vontade para fazer melhorias e acrescentar funcionalidades, desde que mande um email avisando depois.
Rodrigo Amaral