<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Blog do Ricardo Duarte</title><link>http://ricardoduarte.net/</link><description>After all, tomorrow is another day</description><language>pt_br</language><lastBuildDate>Fri, 31 Oct 2014 14:42:27 GMT</lastBuildDate><generator>http://getnikola.com/</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Livro Python para Desenvolvedores lançado pela Novatec</title><link>http://ricardoduarte.net/posts/python-para-desenvolvedores-novatec.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;A editora &lt;a href="http://www.novatec.com.br"&gt;Novatec&lt;/a&gt; lançou na semana passada o livro &lt;a href="http://novatec.com.br/livros/pythondesenvolvedores/"&gt;Python para Desenvolvedores&lt;/a&gt; do autor Luiz Eduardo Borges. O conteúdo do livro é um curso rápido e prático sobre o &lt;strong&gt;Python&lt;/strong&gt;, dessa vez abordando a versão &lt;strong&gt;3.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Python for Developers" src="http://ricardoduarte.net/galleries/post017/capa_pypd_3ed.jpg" alt="Capa do livro Python para Desenvolvedores"&gt;&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;Eu sou colega de trabalho do Luiz Eduardo e vi todo o empenho que ele fez para poder lançar esse livro com todos os exemplos de códigos atualizados para &lt;strong&gt;Python 3&lt;/strong&gt; e também para adicionar conteúdo novo e assim tornar o livro ainda mais interessante para desenvolvedores.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;Novatec&lt;/strong&gt; também fez um excelente trabalho de editoração do livro, a tipografia está muito bonita e a divisão dos capítulos ficou excelente. Segue abaixo parte da descrição do lançamento que foi enviada pela própria editora:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;O livro &lt;em&gt;Python para Desenvolvedores&lt;/em&gt;, lançado pela Novatec Editora, descreve os principais recursos da linguagem Python, focado em sua versão 3.3, com um texto direto e conciso, repleto de exemplos para descrever desde os conceitos mais básicos até recursos avançados, como a integração com outras linguagens.&lt;/p&gt;
&lt;p&gt;O livro aborda conceitos básicos de linguagem, biblioteca-padrão, geradores, programação funcional, classes, testes automatizados, armazenamento de dados, aplicações web, processamento numérico, interface gráfica, computação gráfica, processamento distribuído, plataformas portáteis, empacotamento e distribuição e integração com aplicativos e outras linguagens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No ano passado, eu mesmo contribui com esse livro quando ele existia apenas na forma de e-book gratuito em sua versão anterior que era focada no &lt;strong&gt;Python 2&lt;/strong&gt;. A minha contribuição foi portar o e-book para a web usando o formato do &lt;strong&gt;IPython Notebook&lt;/strong&gt;, se quiser conhecer um pouco dessa estória, visite &lt;a href="http://ricardoduarte.net/blog/2013/07/18/python-para-desenvolvedores-web/"&gt;esse post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Parabéns Luiz Eduardo, que o livro possa repetir e aumentar o sucesso das edições anteriores e quem sabe não teremos outras edições ou até outros livros no futuro.&lt;/p&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.novatec.com.br"&gt;Site da Novatec&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://novatec.com.br/livros/pythondesenvolvedores/"&gt;Python para Desenvolvedores&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>books</category><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/python-para-desenvolvedores-novatec.html</guid><pubDate>Fri, 31 Oct 2014 12:35:00 GMT</pubDate></item><item><title>Livro gratuito Python para Desenvolvedores, agora em inglês</title><link>http://ricardoduarte.net/posts/python-para-desenvolvedores-web-ingles.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Depois de lançar &lt;a href="http://ricardoduarte.github.io/python-para-desenvolvedores/"&gt;uma versão na web&lt;/a&gt; do livro &lt;strong&gt;Python para Desenvolvedores&lt;/strong&gt; e ter uma boa receptividade, o próximo desafio era traduzir o livro para o inglês e perceber como essa tradução seria aceita pela comunidade de desenvolvedores.&lt;/p&gt;
&lt;p&gt;E assim está sendo feito, agora temos &lt;a href="http://ricardoduarte.github.io/python-for-developers/"&gt;uma versão em inglês&lt;/a&gt; chamada &lt;strong&gt;Python for Developers&lt;/strong&gt;. Essa primeira versão já está no ar, porém só tem a primeira parte do livro traduzida. Por isso, qualquer ajuda na tradução ou na divulgação será muito bem-vinda.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;&lt;img class="center" title="Python for Developers" src="http://ricardoduarte.net/galleries/post016/pypd_cover2e.jpg" alt="Capa do livro Python for Developers"&gt;&lt;/p&gt;
&lt;p&gt;Para quem estiver curioso em como o livro foi montado dê uma olhada no &lt;a href="http://ricardoduarte.net/blog/2013/07/18/python-para-desenvolvedores-web/"&gt;post anterior&lt;/a&gt; sobre o &lt;strong&gt;Python para Desenvolvedores&lt;/strong&gt; em português que explica quais as tecnologias usadas no livro.&lt;/p&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.github.io/python-for-developers/"&gt;Python for Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.github.io/python-para-desenvolvedores/"&gt;Python para Desenvolvedores&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>books</category><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/python-para-desenvolvedores-web-ingles.html</guid><pubDate>Fri, 16 Aug 2013 16:37:00 GMT</pubDate></item><item><title>Livro gratuito Python para Desenvolvedores, versão web</title><link>http://ricardoduarte.net/posts/python-para-desenvolvedores-web.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Há algumas semanas resolvi embarcar num novo projeto que me foi sugerido por um colega de trabalho, usar as facilidades do &lt;a href="http://pages.github.com/"&gt;Github Pages&lt;/a&gt; e do &lt;a href="http://ipython.org/notebook.html"&gt;IPython Notebook&lt;/a&gt; para disponibilizar online o livro do &lt;a href="https://twitter.com/ark4n"&gt;Luiz Eduardo Borges&lt;/a&gt;: &lt;a href="http://ark4n.wordpress.com/python/"&gt;Python para Desenvolvedores, 2ª edição&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O desafio foi aceito e a primeira parte do livro &lt;a href="http://ricardoduarte.github.io/python-para-desenvolvedores/"&gt;já está disponibilizada&lt;/a&gt; gratuitamente, interativamente e livremente para quem quiser acessar, usar ou &lt;a href="https://github.com/ricardoduarte/python-para-desenvolvedores"&gt;modificar&lt;/a&gt;.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;&lt;img class="center" title="Python para Desenvolvedores, 2a edição" src="http://ricardoduarte.net/galleries/post015/capa_python_para_desenvolvedores.jpg" alt="Capa do livro Python para Desenvolvedores, 2a edição"&gt;&lt;/p&gt;
&lt;p&gt;A montagem do livro foi feita num esquema bem simples. O site do &lt;strong&gt;Github Pages&lt;/strong&gt; foi usado para apresentar o livro e as seções adicionais como prefácio, agradecimentos, como usar, entre outras e ainda para servir como referência a todos os capítulos do livro, onde cada capítulo é um &lt;strong&gt;IPython notebook&lt;/strong&gt; separado e renderizado através da ferramenta &lt;a href="http://nbviewer.ipython.org/"&gt;nbviewer&lt;/a&gt;. Esse esquema é o mesmo usado pelo livro &lt;a href="http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/"&gt;Probablistic Programming &amp;amp; Bayesian Methods for Hackers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Posso dizer que converter esse livro para a web tem sido até bastante divertido, pois tenho aumentado o meu conhecimento sobre Python e alguns de seus módulos e usos e ainda tenho conhecido melhor o &lt;strong&gt;IPython Notebook&lt;/strong&gt; que é uma excelente ferramenta para renderizar código Python, fazer tutoriais científicos e tudo o mais.&lt;/p&gt;
&lt;p&gt;A idéia para o futuro é poder disponibilizar uma tradução desse livro para o inglês, e também, quem sabe, convencer o autor a criar uma nova edição para Python 3.&lt;/p&gt;
&lt;h4 id="atualização-17-de-outubro-de-2013"&gt;Atualização: 17 de outubro de 2013&lt;/h4&gt;
&lt;p&gt;Essa versão online do livro agora está completa, com todo o conteúdo do livro original online e com os exemplos rodando em IPython (onde é possível).&lt;/p&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.github.io/python-para-desenvolvedores/"&gt;Python para Desenvolvedores: versão web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ark4n.wordpress.com/python/"&gt;Python para Desenvolvedores: site do autor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/"&gt;Cam Davidson-Pilon: Probablistic Programming &amp;amp; Bayesian Methods for Hackers&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>books</category><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/python-para-desenvolvedores-web.html</guid><pubDate>Thu, 18 Jul 2013 12:22:00 GMT</pubDate></item><item><title>Minha primeira biblioteca portada para Python 3</title><link>http://ricardoduarte.net/posts/primeira-biblioteca-python3.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Aproveitei as minhas últimas férias para concluir um projeto pessoal que já estava querendo fazer há bastante tempo, portar uma biblioteca para &lt;a href="http://getpython3.com/"&gt;Python 3&lt;/a&gt;. Agora que já tenho um pouco mais de "intimidade" com essa nova versão do &lt;strong&gt;Python&lt;/strong&gt;, havia chegado a hora de encarar essa tarefa.&lt;/p&gt;
&lt;h4 id="a-escolha-da-biblioteca"&gt;A escolha da biblioteca&lt;/h4&gt;
&lt;p&gt;A biblioteca escolhida para realizar o porte foi a &lt;a href="https://pypi.python.org/pypi/Unipath/"&gt;Unipath&lt;/a&gt;. &lt;strong&gt;Unipath&lt;/strong&gt; é definida pelo seu próprio criador como &lt;em&gt;uma abordagem orientada a objetos para operações de arquivos e diretórios&lt;/em&gt;. Ela substitui operações de diversos módulos da biblioteca padrão do &lt;strong&gt;Python&lt;/strong&gt;, como por exemplo &lt;strong&gt;os.path&lt;/strong&gt; e &lt;strong&gt;shutil&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;Eu escolhi essa biblioteca por ser algo que eu adotei agora em todos os meus novos projetos com &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; além de ser uma base de código pequena e com uma quantidade de testes em que posso confiar.&lt;/p&gt;
&lt;h4 id="a-estratégia-de-migração"&gt;A estratégia de migração&lt;/h4&gt;
&lt;p&gt;Em [um dos tutoriais mais conhecidos para portar código da versão 2 para 3], o primeiro tópico abordado é a escolha da estratégia. A escolha da estratégia envolve basicamente 2 passos: definir se irá ou não usar a ferramenta de conversão automática &lt;a href="http://docs.python.org/2/library/2to3.html"&gt;2to3&lt;/a&gt; e depois definir se a sua nova base de código portada rodará somente em &lt;strong&gt;Python 3&lt;/strong&gt; ou se continuará também compatível com a versão &lt;em&gt;2&lt;/em&gt;. Ao decidir isso, tenha em mente que desde a versão &lt;strong&gt;2.6&lt;/strong&gt; que &lt;strong&gt;Python&lt;/strong&gt; traz algumas facilidades para tornar menos dolorido possível essa migração.&lt;/p&gt;
&lt;p&gt;A estratégia que eu escolhi foi ter código compatível com as versões &lt;strong&gt;2 e 3&lt;/strong&gt; de &lt;strong&gt;Python&lt;/strong&gt;, sendo que na versão &lt;strong&gt;2&lt;/strong&gt;, o suporte é a partir da &lt;strong&gt;2.6&lt;/strong&gt; e na versão &lt;strong&gt;3&lt;/strong&gt;, o suporte garantido é a partir da &lt;strong&gt;3.2&lt;/strong&gt;. Escolhi também adotar o processo de migração manual, pois a base de código é pequena e vi que seria uma melhor maneira de auxiliar meu aprendizado.&lt;/p&gt;
&lt;h4 id="o-processo-de-migração"&gt;O processo de migração&lt;/h4&gt;
&lt;p&gt;Para portar o código, o processo foi bem simples, primeiro é só garantir que todos os testes estejam funcionando em &lt;strong&gt;Python 2&lt;/strong&gt;, rodar os testes novamente em &lt;strong&gt;Python 3&lt;/strong&gt; e corrigir os erros que aparecerem. No estágio atual da linguagem, está bem mais fácil fazer código que seja compatível com as duas versões.&lt;/p&gt;
&lt;p&gt;Todo o processo de migração foi feito usando os mais que excelentes &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; e &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; e foi muito legal, mesmo no pouco tempo que levei para portar a biblioteca ver o processo de desenvolvimento colaborativo funcionar, pois apenas poucos dias depois de ter criado o meu &lt;em&gt;fork&lt;/em&gt; no &lt;strong&gt;GitHub&lt;/strong&gt;, outro usuário, o &lt;a href="https://github.com/nbensa"&gt;Norberto Bensa&lt;/a&gt;, se interessou também e começou a me ajudar na migração para &lt;strong&gt;Python 3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Outro coisa que vale a pena mencionar, é que eu usei a biblioteca &lt;a href="http://pytest.org/latest/"&gt;py.test&lt;/a&gt; para rodar os testes unitários e a biblioteca &lt;a href="http://tox.readthedocs.org/en/latest/"&gt;tox&lt;/a&gt; para automatizar a execução dos testes nas diversas versões de &lt;strong&gt;Python&lt;/strong&gt; suportadas.&lt;/p&gt;
&lt;p&gt;O último passo da migração, já com o código funcionando nas duas versões, foi abrir &lt;a href="https://github.com/mikeorr/Unipath/pull/2"&gt;um pull request&lt;/a&gt; para que esse porte seja incorporado no repositório oficial da biblioteca, o que ainda não aconteceu, mas espero que aconteça.&lt;/p&gt;
&lt;p&gt;Enquanto isso, segue &lt;a href="https://github.com/ricardoduarte/Unipath"&gt;o repositório do meu &lt;em&gt;fork&lt;/em&gt;&lt;/a&gt; para quem deseja instalar o &lt;strong&gt;Unipath&lt;/strong&gt; no &lt;strong&gt;Python 3&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://docs.python.org/dev/howto/pyporting.html"&gt;Brett Cannon: Porting Python 2 Code to Python 3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://python3porting.com/"&gt;Porting to Python 3 - The Book&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>programming</category><category>python</category><category>python3</category><guid>http://ricardoduarte.net/posts/primeira-biblioteca-python3.html</guid><pubDate>Mon, 25 Mar 2013 16:32:00 GMT</pubDate></item><item><title>Minha estrutura padrão para um projeto Django</title><link>http://ricardoduarte.net/posts/projeto-django-padrao.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Como estruturar um projeto &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;? Qual o conjunto mínimo de bibliotecas que eu preciso para iniciar um projeto? Quais as melhores práticas que eu posso implementar desde o começo do projeto? Como deixar o meu projeto preparado para facilitar o processo de &lt;em&gt;deploy&lt;/em&gt; para vários ambientes? Esse post visa ajudar especialmente os iniciantes nesse &lt;em&gt;framework&lt;/em&gt; a responder essas e outras perguntas importantes para quem deseja se aprofundar nessa tecnologia.&lt;/p&gt;
&lt;p&gt;Assim como no anterior, esse artigo considera que você já conhece bem &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;, que sabe ao menos como instalar o &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;, e que, para o seu próprio bem, use &lt;a href="http://www.virtualenv.org/en/latest/"&gt;virtualenv&lt;/a&gt; para isolar os ambientes de cada projeto e &lt;a href="http://www.pip-installer.org/"&gt;pip&lt;/a&gt; para instalação e desinstalação de pacotes.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;h4 id="bibliotecas-essenciais-para-um-projeto-django"&gt;Bibliotecas essenciais para um projeto Django&lt;/h4&gt;
&lt;p&gt;Abaixo estão as bibliotecas que instalo toda vez que vou iniciar um projeto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://fabfile.org/"&gt;Fabric&lt;/a&gt; - Indispensável para fazer deploy de projetos, principalmente quando você trabalha com mais de um servidor para o mesmo projeto nas diversas fases do processo de desenvolvimento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://south.readthedocs.org/"&gt;South&lt;/a&gt; - Se não quiser passar pelo inferno das migrações de modelos de dados, e dos próprios dados em si, é mais do que essencial que instale essa ferramenta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/mikeorr/unipath"&gt;Unipath&lt;/a&gt; - Biblioteca orientada a objetos para realizar operações de arquivos e diretórios. Um ótimo substituto para o módulo &lt;strong&gt;os.path&lt;/strong&gt; da biblioteca padrão do &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kmmbvnr/django-jenkins"&gt;django-jenkins&lt;/a&gt; e bibliotecas auxiliares - Ver o post &lt;a href="http://ricardoduarte.net/blog/2012/06/26/como-configurar-um-projeto-django-no-jenkins/"&gt;Como configurar um projeto Django no Jenkins&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/brack3t/django-braces"&gt;django-braces&lt;/a&gt; - App &lt;strong&gt;Django&lt;/strong&gt; que inclui uma coleção de &lt;a href="http://en.wikipedia.org/wiki/Mixin"&gt;mixins&lt;/a&gt; que complementam as &lt;strong&gt;Class Based Views&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/maraujop/django-crispy-forms"&gt;django-crispy-forms&lt;/a&gt; - App &lt;strong&gt;Django&lt;/strong&gt; para facilitar a renderização dos componentes dos &lt;em&gt;forms&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/django-debug-toolbar"&gt;django-debug-toolbar&lt;/a&gt; - App indispensável no desenvolvimento de projetos &lt;strong&gt;Django&lt;/strong&gt;. Traz todas as informações de debug a respeito dos templates e da execução do código que você precisa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jezdez/django-discover-runner"&gt;django-discover-runner&lt;/a&gt; - Uma alternativa ao &lt;em&gt;test runner&lt;/em&gt; do &lt;strong&gt;Django&lt;/strong&gt; baseado na &lt;a href="http://pypi.python.org/pypi/unittest2"&gt;unittest2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/brutasse/django-floppyforms"&gt;django-floppyforms&lt;/a&gt; - HTML5 &lt;em&gt;widgets&lt;/em&gt; e outras facilidades para ser usado em conjunto com o &lt;strong&gt;django-crispy-forms&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bitbucket.org/carljm/django-model-utils/src"&gt;django-model-utils&lt;/a&gt; - Utilitários para os &lt;em&gt;models&lt;/em&gt; do &lt;strong&gt;Django&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/flup/1.0/"&gt;flup&lt;/a&gt; - Essa biblioteca serve para rodar o projeto em modo &lt;a href="http://en.wikipedia.org/wiki/FastCGI"&gt;FastCGI&lt;/a&gt; no servidor web de sua escolha. O servidor web que eu uso é o &lt;a href="http://wiki.nginx.org/Main"&gt;nginx&lt;/a&gt; pela rapidez e praticidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="estrutura-do-projeto"&gt;Estrutura do projeto&lt;/h4&gt;
&lt;p&gt;Finalmente, depois de instalar os pacotes mencionados acima, chegou a hora de organizar a estrutura do seu projeto. A estrutura que eu uso, é essa aqui, no seu projeto substitua a palavra &lt;strong&gt;project&lt;/strong&gt; pelo nome do seu projeto.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
&amp;lt;project_root&amp;gt;
├── &amp;lt;django_project_root&amp;gt;
│   ├── data
│   ├── log
│   ├── main
│   ├── media
│   ├── static
│   ├── &amp;lt;configuration_root&amp;gt;
│   │   ├── settings
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── development.py
│   │   │   ├── production.py
│   │   │   ├── staging.py
│   │   │   └── testing.py
│   │   ├── __init__.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
├── requirements
│   ├── _base.txt
│   ├── development.txt
│   ├── production.txt
│   ├── staging.txt
│   └── testing.txt
├── bootstrap.py
├── fabfile.py
└── nginx.conf&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="explicando-a-estrutura..."&gt;Explicando a estrutura...&lt;/h4&gt;
&lt;p&gt;A partir da versão &lt;strong&gt;1.4&lt;/strong&gt;, o &lt;strong&gt;Django&lt;/strong&gt;, ao criar um projeto novo, cria uma estrutura de pasta em 2 níveis, na primeira inicialmente você fica apenas com o arquivo &lt;strong&gt;manage.py&lt;/strong&gt; e no segundo nível é onde fica os arquivos &lt;strong&gt;settings.py&lt;/strong&gt;, &lt;strong&gt;urls.py&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Na estrutura que eu uso em meus projetos, a proposta é ter 3 níveis. O primeiro nível, chamado de &lt;em&gt;project_root&lt;/em&gt;, serve para incluir os arquivos que estão relacionados com o deploy do projeto e além disso, contém uma pasta chamada &lt;strong&gt;requirements&lt;/strong&gt; que contém todos os requisitos do projeto segregados por ambiente, assim como acontece com a pasta &lt;strong&gt;settings&lt;/strong&gt; que veremos mais a seguir. Além disso, essa pasta serve para conter outros arquivos que não estão relacionados diretamente com o código-fonte do projeto, como arquivos de design, por exemplo. Segue uma explicação básica para os arquivos que encontramos nessa pasta.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;bootstrap.py&lt;/strong&gt; - Esse arquivo usa o &lt;strong&gt;requirements.txt&lt;/strong&gt; para instalar automaticamente todas as bibliotecas da aplicação usando o &lt;strong&gt;pip&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;fabfile.py&lt;/strong&gt; - Arquivo da biblioteca Fabric que contém todas as funções de &lt;em&gt;deploy&lt;/em&gt; da aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;nginx.conf&lt;/strong&gt; - Arquivo de configuração do &lt;strong&gt;nginx&lt;/strong&gt; que precisa ser copiado para o servidor toda vez que é feito o &lt;em&gt;deploy&lt;/em&gt; da aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No segundo e terceiro nível, nós temos a estrutura de pasta que foi criada pelo &lt;strong&gt;Django&lt;/strong&gt;, sendo que o segundo nível chamamos de &lt;em&gt;django_project_root&lt;/em&gt; e o terceiro chamamos de &lt;em&gt;configuration_root&lt;/em&gt;.&lt;/p&gt;
&lt;h5 id="django_project_root"&gt;django_project_root&lt;/h5&gt;
&lt;p&gt;Esse é o diretório padrão de um projeto &lt;strong&gt;Django&lt;/strong&gt;, contém o arquivo &lt;em&gt;manage.py&lt;/em&gt;, e também as pastas específicas que representam as aplicações do projeto. As demais pastas que constam na estrutura são explicadas logo abaixo.&lt;/p&gt;
&lt;h6 id="pasta-data"&gt;Pasta data&lt;/h6&gt;
&lt;p&gt;Essa pasta será usada para para armazenar o banco de dados (caso o mesmo seja embutido na aplicação, como o &lt;strong&gt;SQLite&lt;/strong&gt;) e servirá para armazenar outros artefatos como scripts &lt;em&gt;SQL&lt;/em&gt; ou &lt;em&gt;Python&lt;/em&gt;, dados de migração, fontes de dados ou quaisquer outras informações relacionadas a base de dados do projeto.&lt;/p&gt;
&lt;h6 id="pasta-log"&gt;Pasta log&lt;/h6&gt;
&lt;p&gt;Essa pasta é usada para fazer o deploy com o &lt;strong&gt;nginx&lt;/strong&gt;. Esse servidor web precisa dos dois arquivos contidos nessa pasta para guardar o log de acessos e de erros da aplicação.&lt;/p&gt;
&lt;p&gt;Caso não vá usar o &lt;strong&gt;nginx&lt;/strong&gt;, pode deletar essa pasta, ou talvez usá-la para implementar algum tipo de log e armazená-lo.&lt;/p&gt;
&lt;h6 id="pasta-main"&gt;Pasta main&lt;/h6&gt;
&lt;p&gt;Representa a app principal do projeto. Independente da divisão de apps que você irá escolher para o projeto, essa app irá servir como um agregador de artefatos que são comuns a todo o projeto ou que serão utilizados por todas as demais apps do projeto.&lt;/p&gt;
&lt;p&gt;Por exemplo, essa app &lt;strong&gt;main&lt;/strong&gt; poderá conter os arquivos relativos a tela de &lt;em&gt;login&lt;/em&gt; e &lt;em&gt;index&lt;/em&gt; do projeto. Poderá conter os arquivos estáticos que são comuns a todo o projeto e assim por diante.&lt;/p&gt;
&lt;p&gt;No caso de projetos que sejam muito pequenos, talvez essa seja a única app necessária.&lt;/p&gt;
&lt;h6 id="pasta-static"&gt;Pasta static&lt;/h6&gt;
&lt;p&gt;Essa pasta serve para abrigar todos os arquivos estáticos encontrados no projeto quando o comando &lt;strong&gt;collectstatic&lt;/strong&gt; é executado. Para mais informações sobre esse assunto, veja a documentação do &lt;strong&gt;Django&lt;/strong&gt; sobre &lt;a href="https://docs.djangoproject.com/en/1.4/howto/static-files/"&gt;como gerenciar arquivos estáticos&lt;/a&gt;.&lt;/p&gt;
&lt;h6 id="pasta-media"&gt;Pasta media&lt;/h6&gt;
&lt;p&gt;Essa pasta serve para abrigar todos os arquivos do projeto relacionados a &lt;em&gt;upload&lt;/em&gt; realizados pelo usuário ou arquivos que são gerados dinamicamente pelo próprio projeto (imagens de relatório, por exemplo).&lt;/p&gt;
&lt;h5 id="configuration_root"&gt;configuration_root&lt;/h5&gt;
&lt;p&gt;Esse diretório contém toda a parte de configuração da aplicação, como o arquivo &lt;strong&gt;urls.py&lt;/strong&gt; e o módulo &lt;strong&gt;settings&lt;/strong&gt;.&lt;/p&gt;
&lt;h6 id="módulo-settings"&gt;Módulo settings&lt;/h6&gt;
&lt;p&gt;Essa pasta contém os arquivos de configuração da aplicação segregados por ambiente e com o arquivo &lt;strong&gt;base.py&lt;/strong&gt; que é responsável por conter todas as configurações comuns a todos os ambientes da aplicação. Esses arquivos ficam organizados numa espécie de herança. Todos os arquivos herdam de &lt;strong&gt;base.py&lt;/strong&gt; e especializam as suas configurações por ambiente.&lt;/p&gt;
&lt;p&gt;E onde entra o &lt;strong&gt;settings.py&lt;/strong&gt; nessa brincadeira? No final das contas, o arquivo &lt;strong&gt;settings.py&lt;/strong&gt; será deletado, e agora toda vez que for rodar a sua aplicação, basta indicar qual o arquivo de configuração que deseja usar através do parâmetro settings, como segue:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
python manage.py runserver --settings=project.template.settings.testing&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="concluindo..."&gt;Concluindo...&lt;/h4&gt;
&lt;p&gt;Essa é a estrutura padrão que eu uso para os meus projetos. Caso queira baixar os fontes desse projeto padrão, fique à vontade para visitar &lt;a href="https://github.com/ricardoduarte/django-project-template"&gt;o repositório do projeto no GitHub&lt;/a&gt;. Consultando os fontes talvez fique bem mais fácil de entender tudo o que foi exposto nesse artigo. De qualquer forma, espero que o tenha ajudado pelo menos a ter uma idéia inicial de como organizar os seus projetos. Agora, compartilhe suas idéias e sugestões nos comentários.&lt;/p&gt;
&lt;h4 id="atualização-15-de-fevereiro-de-2013"&gt;Atualização: 15 de fevereiro de 2013&lt;/h4&gt;
&lt;p&gt;Esse post foi atualizado em diversas partes para refletir as boas práticas aprendidas ao ler o livro &lt;a href="https://django.2scoops.org/"&gt;Two Scoops of Django&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.morethanseven.net/2009/07/27/fabric-django-git-apache-mod-wsgi-virtualenv-and-p/"&gt;Gareth Rushgrove: Fabric, Django, Git, Apache, Mod_wsgi, Virtualenv and Pip Deployment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://klauslaube.com.br/2011/04/11/como-organizar-seus-projetos-django/"&gt;Klaus Laube: Como organizar seus projetos Django&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lincolnloop.com/django-best-practices/index.html"&gt;Django Best Practices: A guide to developing and deploying with the Django Web framework&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>django</category><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/projeto-django-padrao.html</guid><pubDate>Thu, 17 Jan 2013 11:36:00 GMT</pubDate></item><item><title>Como configurar um projeto Django no Jenkins</title><link>http://ricardoduarte.net/posts/como-configurar-um-projeto-django-no-jenkins.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Já estava querendo fazer esse tutorial há bastante tempo, mas estava esperando amadurecer algumas idéias para que a coisa ficasse bem redonda. Para facilitar, esse tutorial subentende que o usuário já conhece &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;, &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; e sabe como instalar e rodar o &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;. Sem enrolar, vamos aos passos do tutorial.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;h4 id="passo-1---instalar-os-plugins-do-jenkins"&gt;Passo 1 - Instalar os plugins do Jenkins&lt;/h4&gt;
&lt;p&gt;Esses são os plugins que eu uso para facilitar a configuração do meu ambiente e de quebra, trazer algumas informações úteis sobre os projetos.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Cobertura+Plugin"&gt;Cobertura&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/SLOCCount+Plugin"&gt;SLOCCount&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin"&gt;Git Plugin&lt;/a&gt; (ou o plugin necessário para a sua ferramenta de controle de versão)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Violations+Plugin"&gt;Violations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="passo-2---instalar-módulos-python-para-o-projeto-django"&gt;Passo 2 - Instalar módulos Python para o projeto Django&lt;/h4&gt;
&lt;p&gt;Antes de entrar na configuração do projeto &lt;strong&gt;Django&lt;/strong&gt;, precisamos instalar os seguintes módulos no Python:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kmmbvnr/django-jenkins/"&gt;django-jenkis&lt;/a&gt; - Essa ferramenta será a mais importante em todo o nosso processo de configuração e irá reduzir extremamente o trabalho e a complexidade em configurar um projeto &lt;strong&gt;Django&lt;/strong&gt; no &lt;strong&gt;Jenkins&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://clonedigger.sourceforge.net/"&gt;clonedigger&lt;/a&gt; - Usada para encontrar código duplicado no seu projeto, muito útil.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://nedbatchelder.com/code/coverage/"&gt;coverage.py&lt;/a&gt; - Usada para gerar relatórios de cobertura de testes que serão lidos através do plugin &lt;strong&gt;Cobertura&lt;/strong&gt; do &lt;strong&gt;Jenkins&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/pep8"&gt;pep8&lt;/a&gt;, &lt;a href="http://pypi.python.org/pypi/pylint"&gt;pylint&lt;/a&gt; e &lt;a href="https://launchpad.net/pyflakes"&gt;pyflakes&lt;/a&gt; - Essas ferramentas serão usadas para gerar relatórios de análise estática de código &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://nose.readthedocs.org/en/latest/"&gt;nose&lt;/a&gt; - Opcional, eu prefiro usar &lt;strong&gt;nose&lt;/strong&gt; para rodar os testes unitários do meu projeto, mas o Django já possui uma biblioteca para rodar testes que é bem interessante.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="passo-3---configurar-o-django-jenkins"&gt;Passo 3 - Configurar o django-jenkins&lt;/h4&gt;
&lt;p&gt;Uma vez instalado, para usar o &lt;strong&gt;django-jenkins&lt;/strong&gt; é bem tranquilo. Basta rodar o seguinte comando que foi adicionado ao &lt;strong&gt;manage.py&lt;/strong&gt; do &lt;strong&gt;Django&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
$ python manage.py jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esse simples comando irá gerar relatórios que serão consumidos pela nossa configuração do Jenkins como veremos mais tarde. Se quiser você pode optar por configurar as tarefas que você deseja que o &lt;strong&gt;django-jenkins&lt;/strong&gt; execute para você. Para isso, é necessário criar a seguinte configuração no seu arquivo &lt;strong&gt;settings.py&lt;/strong&gt; do &lt;strong&gt;Django&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::python
JENKINS_TASKS = (
    'django_jenkins.tasks.with_coverage',
    'django_jenkins.tasks.run_pep8',
    'django_jenkins.tasks.run_pylint',
    'django_jenkins.tasks.run_pyflakes',
    'django_jenkins.tasks.run_jslint',
    'django_jenkins.tasks.run_csslint',
    'django_jenkins.tasks.run_sloccount',
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Essa é a configuração que eu costumo usar para os projetos da nossa equipe. Para uma lista completa das tarefas, consulte &lt;a href="https://github.com/kmmbvnr/django-jenkins/#tasks"&gt;esse link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANTE&lt;/strong&gt;: Para que as tarefas &lt;strong&gt;run_jslint&lt;/strong&gt; e &lt;strong&gt;run_csslint&lt;/strong&gt; possam funcionar é necessário instalar o &lt;a href="http://www.mozilla.org/rhino/"&gt;rhino&lt;/a&gt; ou &lt;a href="http://nodejs.org/"&gt;NODE.js&lt;/a&gt; no servidor onde o &lt;strong&gt;Jenkins&lt;/strong&gt; está instalado.&lt;/p&gt;
&lt;h4 id="passo-4---configurar-o-projeto-no-jenkins"&gt;Passo 4 - Configurar o projeto no Jenkins&lt;/h4&gt;
&lt;p&gt;Para essa parte do tutorial, consideremos que o nome do meu projeto seja &lt;strong&gt;ProjetoBlog&lt;/strong&gt; e que o diretório onde está o código-fonte do projeto é chamado &lt;strong&gt;blog&lt;/strong&gt;. No meu caso, eu uso uma estrutura de projetos do &lt;strong&gt;Django&lt;/strong&gt; em 2 níveis (pretendo escrever um post sobre isso depois), mas você poderá adaptar todos os passos seguintes a estrutura que você usa em seus projetos.&lt;/p&gt;
&lt;h5 id="criar-o-job"&gt;1. Criar o job&lt;/h5&gt;
&lt;p&gt;Na tela inicial do &lt;strong&gt;Jenkins&lt;/strong&gt; você verá uma opção chamada &lt;strong&gt;New Job&lt;/strong&gt;, ao clicar nela basta preencher o nome desejado para o job e selecionar a opção &lt;strong&gt;Build a free-style software project&lt;/strong&gt;, conforme mostrado na figura abaixo.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins1" src="http://ricardoduarte.net/galleries/post012/jenkins_config1.png" alt="Criando o job no Jenkins"&gt;&lt;/p&gt;
&lt;h5 id="configurar-o-controle-de-versão"&gt;2. Configurar o controle de versão&lt;/h5&gt;
&lt;p&gt;A configuração do controle de versão é extremamente simples, basta selecionar o controle de versão desejado, informar o repositório conforme solicitado e no campo &lt;strong&gt;Branches to build&lt;/strong&gt; informar o branch que você deseja que o &lt;strong&gt;Jenkins&lt;/strong&gt; use como padrão, na maioria absoluta dos casos, é o branch &lt;strong&gt;master&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins2" src="http://ricardoduarte.net/galleries/post012/jenkins_config2.png" alt="Configurar VCS no Jenkins"&gt;&lt;/p&gt;
&lt;h5 id="buscar-atualizações-do-projeto"&gt;3. Buscar atualizações do projeto&lt;/h5&gt;
&lt;p&gt;Após configurar o repositório do projeto, precisamos informar o intervalo de tempo que queremos que o job do Jenkins verifique se o projeto foi atualizado e em caso positivo rodar um novo build. Usamos para isso o campo &lt;strong&gt;Build Triggers&lt;/strong&gt;. Na figura abaixo, a configuração colocada indica que o repositório será verificado de 5 em 5 minutos.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins3" src="http://ricardoduarte.net/galleries/post012/jenkins_config3.png" alt="Build Triggers"&gt;&lt;/p&gt;
&lt;h5 id="processo-de-build"&gt;4. Processo de build&lt;/h5&gt;
&lt;p&gt;Agora nesse passo é onde o &lt;strong&gt;Jenkins&lt;/strong&gt; vai realmente realizar o trabalho de build e executar tudo o que planejamos e configuramos anteriormente. Para isso, vamos ter que criar diversos comandos de shell que serão executados em sequência. A figura abaixo mostra isso. Os comandos serão explicados logo abaixo da figura.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins4" src="http://ricardoduarte.net/galleries/post012/jenkins_config4.png" alt="Comandos de Build do Jenkins"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Comando 1&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &amp;amp;&amp;amp; pip install -r requirements.txt"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esse primeiro comando é usado para atualizar os módulos da aplicação, como eu uso o &lt;a href="http://www.virtualenv.org/"&gt;virtualenv&lt;/a&gt;, então ele precisa da primeira parte para rodar o comando sob o ambiente virtual que foi criado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Comando 2&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &amp;amp;&amp;amp; cd blog &amp;amp;&amp;amp;
python manage.py syncdb --noinput &amp;amp;&amp;amp; python manage.py migrate &amp;amp;&amp;amp; python manage.py jenkins"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comando para atualizar o banco de dados e também para rodar as tarefas do &lt;strong&gt;django-jenkins&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Comando 3&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &amp;amp;&amp;amp;
clonedigger --cpd-output -o ./blog/reports/clonedigger.xml ./blog"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comando usado para rodar a ferramenta &lt;strong&gt;clonedigger&lt;/strong&gt; com os seus parâmetros e especificar o formato do relatório, esse formato é obrigatório para que ele seja entendido pelo jenkins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Comando 4&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &amp;amp;&amp;amp;
cd blog &amp;amp;&amp;amp; python manage.py test"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esse último comando é opcional, eu apenas o uso pois como coloquei antes, eu não uso a suíte de testes padrão do &lt;strong&gt;Django&lt;/strong&gt;, mas uso o &lt;strong&gt;nose&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id="configurar-o-relatório-de-cobertura-de-testes"&gt;5. Configurar o relatório de cobertura de testes&lt;/h5&gt;
&lt;p&gt;Chegou a hora de configurar o &lt;strong&gt;Jenkins&lt;/strong&gt; para ler os relatórios que foram gerados, vamos começar com o relatório de cobertura de testes gerado pelo &lt;strong&gt;coverage.py&lt;/strong&gt;. Selecione a opção &lt;strong&gt;Publish Cobertura Coverage Report&lt;/strong&gt; e indique o caminho onde foi gravado o arquivo &lt;strong&gt;coverage.xml&lt;/strong&gt;. Vejamos a imagem.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins5" src="http://ricardoduarte.net/galleries/post012/jenkins_config5.png" alt="Cobertura Jenkins"&gt;&lt;/p&gt;
&lt;h5 id="configurar-o-relatório-de-testes-unitários-e-quantidade-de-linhas-de-código"&gt;6. Configurar o relatório de testes unitários e quantidade de linhas de código&lt;/h5&gt;
&lt;p&gt;Assim como na configuração anterior, precisamos apenas marcar as opções exibidas abaixo na figura e colocar o caminho para os respectivos relatórios.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins6" src="http://ricardoduarte.net/galleries/post012/jenkins_config6.png" alt="JUnit SLOC Jenkins"&gt;&lt;/p&gt;
&lt;h5 id="configurar-os-relatórios-do-plugin-violations"&gt;7. Configurar os relatórios do plugin Violations&lt;/h5&gt;
&lt;p&gt;Chegamos na última etapa desse tutorial que envolve somente indicar os caminhos para os relatórios de violações que foram resultado das análises estáticas de código Python, Javascript e CSS conforme configuramos no início desse tutorial. Assim como nas opções anteriores, marque a opção &lt;strong&gt;Report Violations&lt;/strong&gt; e coloque os caminhos de acordo com a imagem que é mostrada logo abaixo.&lt;/p&gt;
&lt;p&gt;&lt;img class="center" title="Jenkins7" src="http://ricardoduarte.net/galleries/post012/jenkins_config7.png" alt="Violations Jenkins"&gt;&lt;/p&gt;
&lt;h4 id="conclusão"&gt;Conclusão&lt;/h4&gt;
&lt;p&gt;E é isso! Essa é a configuração que precisamos fazer para que um projeto &lt;strong&gt;Django&lt;/strong&gt; use o &lt;strong&gt;Jenkins&lt;/strong&gt;. Depois de tudo isso feito, é só salvar a configuração e clicar no link &lt;strong&gt;Build Now&lt;/strong&gt; e ver os resultados. Seguem alguns exemplos de informações que veremos como resultado, clique nas imagens para ver em tamanho real.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.net/galleries/post012/jenkins-1.png"&gt; &lt;img class="center" title="Result1" src="http://ricardoduarte.net/galleries/post012/jenkins-1.png" alt="Result1" width="390" height="400"&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.net/galleries/post012/jenkins-2.png"&gt; &lt;img class="center" title="Result2" src="http://ricardoduarte.net/galleries/post012/jenkins-2.png" alt="Result2" width="400" height="356"&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ricardoduarte.net/galleries/post012/jenkins-3.png"&gt; &lt;img class="center" title="Result3" src="http://ricardoduarte.net/galleries/post012/jenkins-3.png" alt="Result3" width="400" height="366"&gt; &lt;/a&gt;&lt;/p&gt;
&lt;h4 id="dicas-extras"&gt;Dicas extras&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Algo que pode facilitar ainda mais a configuração de um projeto no &lt;strong&gt;Jenkins&lt;/strong&gt; é um plugin chamado &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/ShiningPanda+Plugin"&gt;ShiningPanda&lt;/a&gt; que permite trabalhar com diferentes versões do Python e inclusive usar o &lt;strong&gt;virtualenv&lt;/strong&gt; de maneira mais transparente mas eu nunca testei.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outra dica legal é que existem alguns plugins que podem ser usados para melhorar a aparência do Jenkins. &lt;a href="http://kaczanowscy.pl/tomek/2012-05/recommended-jenkins-plugins"&gt;Esse artigo&lt;/a&gt; mostra quais são os melhores plugins para fazer isso.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="referências"&gt;Referências&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://sites.google.com/site/kmmbvnr/home/django-jenkins-tutorial"&gt;Mikhail Podgurskiy: django-jenkins Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/"&gt;Joe Heck: Setting up a Python CI server with Hudson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.morethanseven.net/2011/03/20/A-continuous-deployment-example-setup.html"&gt;Gareth Rushgrove: A Continuous Deployment Example Setup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bartek.im/showoff-jenkins/#1"&gt;Bartek Ciszkowski: Continuous Integration with Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In []:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt; 
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>django</category><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/como-configurar-um-projeto-django-no-jenkins.html</guid><pubDate>Tue, 26 Jun 2012 17:30:00 GMT</pubDate></item><item><title>O que é software design? E por que é tão importante</title><link>http://ricardoduarte.net/posts/software-design.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;img class="center" title="Dilbert" src="http://ricardoduarte.net/galleries/post011/dilbert_software_design.jpg" alt="Dilbert"&gt;&lt;/p&gt;
&lt;p&gt;O que é &lt;strong&gt;software design&lt;/strong&gt;? Qual é o produto final da atividade &lt;strong&gt;software design&lt;/strong&gt;? Por que é tão importante entender esse conceito nos nossos dias e como entendê-lo pode mudar a forma como você encara o desenvolvimento de software e toda a indústria de software que conhecemos atualmente.&lt;/p&gt;
&lt;p&gt;O que me fez ter vontade de levantar essa discussão foi que um dia desses eu estava dando uma olhada nos meus &lt;a href="http://delicious.com/rickduarte/to_read"&gt;itens para ler no delicious.com&lt;/a&gt; e me deparei com um artigo bem antigo, de 1992 e que chamou a minha atenção imediatamente. O artigo em questão foi escrito por &lt;a href="http://www.developerdotstar.com/mag/bios/jack_reeves.html"&gt;Jack W. Reeves&lt;/a&gt; e apesar de antigo continua tão atual que parece ter sido escrito ontem. Sugiro fortemente que antes de você continuar lendo esse post, leia &lt;a href="http://www.developerdotstar.com/mag/articles/reeves_design.html"&gt;o artigo original&lt;/a&gt; ou pelo menos guarde-o nos seus bookmarks para ler depois.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;h4 id="o-artigo"&gt;O artigo&lt;/h4&gt;
&lt;p&gt;Durante todo o artigo de Reeves, você percebe que ele tenta colocar na mente do leitor um conceito principal. &lt;strong&gt;&lt;em&gt;O produto gerado pela atividade de software design não é documentação, mas sim código-fonte&lt;/em&gt;&lt;/strong&gt;. E esse conceito principal é desdobrado em diversos outros aspectos relacionados que realmente abrem os olhos para alguns aspectos que ele mesmo diz que são tão óbvios que parece que estão localizados em um ponto-cego das empresas. Vejamos alguns desses aspectos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is one consequence of considering code as software design that completely overwhelms all others. It is so important and so obvious that it is a total blind spot for most software organizations. This is the fact that software is cheap to build. It does not qualify as inexpensive; it is so cheap it is almost free. If source code is a software design, then actually building software is done by compilers and linkers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O primeiro aspecto aqui é bem claro. Reeves coloca que "construir" software é muito barato. Mas não construir software do jeito que nós entendemos, o que encaramos hoje como construir software é o que ele chama de &lt;strong&gt;software design&lt;/strong&gt; e é justamente aí que a coisa toda começa a fazer mesmo todo o sentido pois os conceitos começam a ser esclarecidos e mais importante ainda, unificados. Construir software ou &lt;em&gt;build software&lt;/em&gt; se refere a atividade de compilar o software, gerar o artefato final do software, que pode variar de um executável para um conjunto de arquivos interpretados, dependendo da linguagem de programação que usamos. E nesse caso, &lt;em&gt;build software&lt;/em&gt;, é muito barato, basta um computador comum para isso.&lt;/p&gt;
&lt;p&gt;Mas &lt;strong&gt;software design&lt;/strong&gt; é caro, muito caro. Observemos a explicação de Reeves, mais uma vez.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Designing software is an exercise in managing complexity. The complexity exists within the software design itself, within the software organization of the company, and within the industry as a whole. Software design is very similar to systems design. It can span multiple technologies and often involves multiple sub-disciplines. Software specifications tend to be fluid, and change rapidly and often, usually while the design process is still going on. Software development teams also tend to be fluid, likewise often changing in the middle of the design process. In many ways, software bears more resemblance to complex social or organic systems than to hardware. All of this makes software design a difficult and error prone process. None of this is original thinking, but almost 30 years after the software engineering revolution began, software development is still seen as an undisciplined art compared to other engineering professions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aí está, &lt;strong&gt;software design&lt;/strong&gt; envolve essencialmente tratar a complexidade que é exigida no desenvolvimento de software, e essa complexidade tende a crescer exponencialmente a medida que o software cresce em funcionalidades. Apenas para termos um exemplo mais atual que o do artigo, levemos em conta um desenvolvimento web da atualidade.&lt;/p&gt;
&lt;p&gt;Para desenvolver uma aplicação web hoje, você precisa conhecer inicialmente &lt;a href="http://pt.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt; e alguma linguagem para realizar a programação do lado servidor, recomendo que caso queira reduzir a complexidade dessa aplicação, escolha &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;. Daí, para poder deixar a aplicação apresentável em termos visuais, você terá de conhecer bem &lt;a href="http://pt.wikipedia.org/wiki/Cascading_Style_Sheets"&gt;CSS&lt;/a&gt;. Se quiser que sua aplicação seja bastante interativa com o usuário, terá que conhecer &lt;a href="http://pt.wikipedia.org/wiki/JavaScript"&gt;Javascript&lt;/a&gt;. Para facilitar o uso do &lt;strong&gt;Javascritp&lt;/strong&gt;, hoje quase todo mundo prefere a fantástica biblioteca &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. Se quiser facilitar as coisas ainda mais e ficar antenado com as tendências mais recentes acrescente aí &lt;a href="http://www.w3.org/TR/html5-diff/"&gt;as novidades do HTML5&lt;/a&gt; e &lt;a href="http://www.css3.info/preview/"&gt;as novidades do CSS3&lt;/a&gt;. E olhe que estamos falando aqui apenas da parte de tecnologia de uma aplicação.&lt;/p&gt;
&lt;p&gt;Para complicar ainda mais o cenário exposto acima, adicione a essa receita de complexidade as regras de negócio do seu cliente, que na maioria dos casos devem ser inúmeras e mudar constantemente e sim, chegamos facilmente a conclusão de que desenvolver software é realmente um exercício de complexidade, e por isso realizar &lt;strong&gt;software design&lt;/strong&gt; é caro, muito caro.&lt;/p&gt;
&lt;h4 id="conclusão"&gt;Conclusão&lt;/h4&gt;
&lt;p&gt;Percebe agora por que &lt;strong&gt;software design&lt;/strong&gt; é tão importante? &lt;strong&gt;Software design&lt;/strong&gt; de verdade acontece no momento em que estamos produzindo código-fonte, é ali que precisamos nos preocupar com a complexidade do software, se vamos usar orientação a objetos, programação funcional, se vamos dividir em módulos o sistema, qual vai ser a arquitetura da aplicação que vai suportar essa complexidade.&lt;/p&gt;
&lt;p&gt;Porém, o problema é que já por muito tempo, a indústria tem adicionado outras complexidades em cima de algo que já é por natureza bastante complexo com metodologias, processos, certificações entre outras coisas que só complicam a nossa vida ao invés de realmente nos ajudar. Não sou contra processo e acho até que ele ajuda em muitos casos, mas precisamos claramente de processos que tornem a vida de quem cria o software, o desenvolvedor, mais fácil e não mais complicada. Métodos ágeis estão aí para tentar ajudar nessa questão, mas quantas empresas hoje são realmente ágeis? Quanto tempo ainda vai demorar para que elas saiam desse ponto-cego em que se encontram e passem a enxergar o óbvio como um artigo desses que foi escrito em 1992? São perguntas que eu infelizmente não sei a resposta, mas sei que precisamos persistir em tentar respondê-las.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>design</category><category>programming</category><category>software</category><guid>http://ricardoduarte.net/posts/software-design.html</guid><pubDate>Thu, 26 Jan 2012 12:51:00 GMT</pubDate></item><item><title>Programando em Python no Emacs</title><link>http://ricardoduarte.net/posts/programando-em-python-no-emacs.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Esse tutorial tem por objetivo mostrar como podemos ser produtivos programando em &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; no &lt;a href="http://www.emacswiki.org/"&gt;Emacs&lt;/a&gt;. Além disso, o tutorial vai mostrar um pouco do meu ambiente de desenvolvimento e para quem tiver curiosidade, eu vou deixar alguns links no final para quem quiser se aprofundar no assunto.&lt;/p&gt;
&lt;p&gt;Para começar escolha a versão de &lt;strong&gt;Emacs&lt;/strong&gt; que mais se adeque ao seu gosto e ao seu sistema operacional, tem até &lt;a href="http://www.gnu.org/software/emacs/windows/"&gt;versão para Windows&lt;/a&gt; e depois de tê-lo instalado, faça &lt;a href="http://www.emacswiki.org/emacs/NovatoNoEmacs#toc2"&gt;o tutorial&lt;/a&gt; para começar a se acostumar com os conceitos fundamentais do &lt;strong&gt;Emacs&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;h4 id="configurando-o-emacs-para-uso-geral"&gt;Configurando o Emacs para uso geral&lt;/h4&gt;
&lt;p&gt;Se você estiver usando &lt;strong&gt;Emacs&lt;/strong&gt; no Linux, e eu realmente espero que esteja, na instalação foi criada uma pasta oculta dentro da pasta do seu usuário de nome &lt;strong&gt;.emacs.d&lt;/strong&gt;. Para facilitar a configuração, crie dentro dessa pasta uma outra pasta de nome &lt;strong&gt;plugins&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Toda a nossa configuração ficará colocada dentro do seguinte arquivo: &lt;strong&gt;/home/&amp;lt;nome_usuario&amp;gt;/.emacs.d/init.el&lt;/strong&gt;. Como já devem ter lido por aí, a grande vantagem de uso do Emacs é a customização, é como brincar de lego para montar a sua IDE personalizada. Toda a configuração do Emacs é feita em &lt;a href="http://pt.wikipedia.org/wiki/Lisp"&gt;LISP&lt;/a&gt;, mas não se preocupe, você não precisa conhecer &lt;strong&gt;LISP&lt;/strong&gt; a fundo para entender esse tutorial, a maior parte dos comandos é bem fácil de entender. Abra esse arquivo no próprio Emacs ou em outro editor de texto de sua preferência. &lt;strong&gt;&lt;em&gt;Todos os trechos de código expostos nesse post devem ser colocados dentro desse arquivo de configuração&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id="passo-1"&gt;Passo 1&lt;/h5&gt;
&lt;p&gt;Coloque essas linhas abaixo no início do arquivo de configuração.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(add-to-list 'load-path "~/.emacs.d")
(add-to-list 'load-path "~/.emacs.d/plugins")&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Essas linhas acima carregam as pastas onde serão procurados os arquivos com extensão &lt;em&gt;.el&lt;/em&gt;, que são os arquivos que representam extensões e plugins que usaremos durante esse tutorial.&lt;/p&gt;
&lt;h5 id="passo-2"&gt;Passo 2&lt;/h5&gt;
&lt;p&gt;Agora, vamos baixar o primeiro plugin da nossa configuração, é o &lt;strong&gt;ido-mode&lt;/strong&gt;. Baixe &lt;a href="http://www.cua.dk/ido.el"&gt;esse arquivo&lt;/a&gt; e coloque na pasta &lt;strong&gt;~/.emacs.d/plugins&lt;/strong&gt;. Depois adicione o seguinte trecho no arquivo de configuração.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(require 'ido)
(ido-mode t)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esse plugin serve para facilitar a abertura de arquivos dentro do Emacs e também a troca entre os buffers. Como o Emacs pode ser bastante confuso para os iniciantes esse plugin é mais do que recomendado.&lt;/p&gt;
&lt;h5 id="passo-3"&gt;Passo 3&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(cua-mode t)
(setq cua-auto-tabify-rectangles nil) ;; Don't tabify after rectangle commands
(transient-mark-mode 1) ;; No region when it is not highlighted
(setq cua-keep-region-after-copy t) ;; Standard Windows behaviour

(delete-selection-mode 1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;cua-mode&lt;/strong&gt; vai servir para deixar o Emacs parecido com qualquer outra IDE comum permitindo usar as teclas de atalho &lt;em&gt;Ctrl + C, Ctrl + V&lt;/em&gt; e assim por diante. Só é preciso ter cuidado pois esses atalhos conflitam com alguns outros do Emacs e por isso somente estão ativos quando algum texto está selecionado.&lt;/p&gt;
&lt;p&gt;As demais linhas desse passo são opcionais, chamo a atenção para a linha do &lt;strong&gt;delete-selection-mode&lt;/strong&gt;, essa linha faz com que, toda vez que um texto estiver selecionado, qualquer inserção será inserida no lugar do texto selecionado.&lt;/p&gt;
&lt;h5 id="passo-4"&gt;Passo 4&lt;/h5&gt;
&lt;p&gt;[Auto Complete Mode] melhora a funcionalidade de auto-completar do Emacs. A parada é realmente inteligente. Para instalar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
$ cd ~/.emacs.d/plugins/
$ curl http://cx4a.org/pub/auto-complete/auto-complete-1.3.1.tar.bz2 | tar jx
$ cd auto-complete-1.3.1
$ make byte-compile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para configurar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(add-to-list 'load-path "~/.emacs.d/plugins/auto-complete-1.3.1/")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/auto-complete-1.3.1/ac-dict")
(ac-config-default)&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id="passo-5"&gt;Passo 5&lt;/h5&gt;
&lt;p&gt;Instale o &lt;a href="http://code.google.com/p/yasnippet/"&gt;YASnippet&lt;/a&gt;. Esse cara cria um menu no Emacs onde podemos usar um sistema de templates semelhante ao TextMate.&lt;/p&gt;
&lt;h5 id="passo-6"&gt;Passo 6&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O último passo dessa customização geral é o uso do &lt;strong&gt;uniquify&lt;/strong&gt;, esse modo é extremamente útil quando começamos a trabalhar com vários arquivos abertos e que alguns tenham nomes iguais.&lt;/p&gt;
&lt;h4 id="configurando-o-emacs-para-programar-com-python"&gt;Configurando o Emacs para programar com Python&lt;/h4&gt;
&lt;p&gt;Antes de entrar no passo-a-passo de como configurar o Emacs para Python é importante avisar algo. Para não deixar a instalação original de Python no meu Ubuntu ficar poluída com todas as bibliotecas que eu quero instalar, eu instalo uma ferramenta conhecida como &lt;a href="http://www.virtualenv.org/en/latest/index.html"&gt;virtualenv&lt;/a&gt;, e para instalação de pacotes do Python, eu uso uma ferramenta chamada &lt;a href="http://www.pip-installer.org/en/latest/index.html"&gt;pip&lt;/a&gt;. Basicamente, &lt;strong&gt;virtualenv&lt;/strong&gt; é uma ferramenta para criar ambientes isolados de Python, e &lt;strong&gt;pip&lt;/strong&gt; é simplesmente o melhor gerenciador de pacotes Python que eu conheço.&lt;/p&gt;
&lt;p&gt;Para essa configuração eu criei um ambiente de Python isolado com &lt;strong&gt;virtualenv&lt;/strong&gt; apenas para servir ao Emacs. Sugiro que, se estiver seguindo esse tutorial, você faça o mesmo. Vamos continuar com o passo-a-passo.&lt;/p&gt;
&lt;h5 id="passo-1-1"&gt;Passo 1&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(setq-default indent-tabs-mode nil)  ; use only spaces and no tabs
(setq default-tab-width 4)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python usa indentação para definição de blocos de código, assim é &lt;strong&gt;extremamente importante&lt;/strong&gt; que usemos essas linhas código para definir o tamanho da indentação e também definir que &lt;strong&gt;sempre&lt;/strong&gt; serão usados espaços ao invés de &lt;em&gt;tabs&lt;/em&gt;.&lt;/p&gt;
&lt;h5 id="passo-2-1"&gt;Passo 2&lt;/h5&gt;
&lt;p&gt;Agora vamos instalar um pacote essencial para uso de Python no Emacs, o nome desse pacote é &lt;a href="http://pymacs.progiciels-bpi.ca/index.html"&gt;Pymacs&lt;/a&gt;. Se estiver usando Linux, vá até o seu terminal e digite os comandos abaixo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Instalação Pymacs (Parte Emacs) :::bash $ curl -L https://github.com/pinard/Pymacs/tarball/v0.24-beta2 | tar zx $ cd pinard-Pymacs-016b0bc $ make $ cp pymacs.el ~/.emacs.d/pymacs.el $ emacs -batch -eval '(byte-compile-file "~/.emacs.d/pymacs.el")'&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instalação Pymacs (Parte Python) :::bash $ pip install https://github.com/pinard/Pymacs/tarball/v0.24-beta2&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agora vamos ao arquivo de configuração no Emacs e incluir o seguinte trecho:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(setenv "PYMACS_PYTHON" "~/&amp;lt;caminho_virtualenv&amp;gt;/bin/python")

(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A primeira linha será necessária apenas se você estiver usando o &lt;strong&gt;virtualenv&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id="passo-3-1"&gt;Passo 3&lt;/h5&gt;
&lt;p&gt;Nesse passo, vamos instalar o &lt;a href="http://rope.sourceforge.net/ropemacs.html"&gt;Ropemacs&lt;/a&gt; e o &lt;a href="http://rope.sourceforge.net/"&gt;Rope&lt;/a&gt;. &lt;strong&gt;Rope&lt;/strong&gt; é uma poderosa biblioteca de refactoring para Python, e &lt;strong&gt;Ropemacs&lt;/strong&gt; obviamente um plugin do Emacs para uso do &lt;strong&gt;Rope&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Para instalar o &lt;strong&gt;Rope&lt;/strong&gt; e &lt;strong&gt;Ropemacs&lt;/strong&gt;, digite no terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
$ pip install http://bitbucket.org/agr/ropemacs/get/tip.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No arquivo de configuração do Emacs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(require 'pymacs)

(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id="passo-4-1"&gt;Passo 4&lt;/h5&gt;
&lt;p&gt;Chegamos em uma das partes que eu mais gosto do Emacs, análise automática, &lt;em&gt;on-the-fly&lt;/em&gt;, do código Python. O responsável por isso é o &lt;a href="http://flymake.sourceforge.net/"&gt;Flymake&lt;/a&gt; que já vem por padrão, a partir da versão 23 do Emacs. O que vamos precisar instalar aqui é o &lt;a href="http://pypi.python.org/pypi/pep8"&gt;pep8&lt;/a&gt; e o &lt;a href="http://pypi.python.org/pypi/pyflakes"&gt;pyflakes&lt;/a&gt; que são bibliotecas para análise estática de código-fonte Python.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
$ pip install pyflakes pep8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depois, precisamos configurar o Flymake no Emacs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "/home/lslf/&amp;lt;caminho_virtualenv&amp;gt;/bin/pyflakes" (list local-file))))

  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))

(add-hook 'find-file-hook 'flymake-find-file-hook)

(defun my-flymake-show-help ()
  (when (get-char-property (point) 'flymake-overlay)
   (let ((help (get-char-property (point) 'help-echo)))
    (if help (message "%s" help)))))

(add-hook 'post-command-hook 'my-flymake-show-help)

(delete '("\\.html?\\'" flymake-xml-init) flymake-allowed-file-name-masks)&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id="passo-5-1"&gt;Passo 5&lt;/h5&gt;
&lt;p&gt;O último passo desse tutorial, também se refere a análise de código, mas ao invés de análise automática, vamos configurar uma análise de código através de um comando do Emacs.&lt;/p&gt;
&lt;p&gt;Primeiro crie um arquivo no caminho &lt;strong&gt;~/.emacs.d/&lt;/strong&gt; chamado &lt;strong&gt;pychecker.sh&lt;/strong&gt;. O conteúdo do arquivo será:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
#!/bin/bash
~/&amp;lt;caminho_virtualenv&amp;gt;/bin/pyflakes $1
echo "## pyflakes acima, pep8 abaixo ##"
~/&amp;lt;caminho_virtualenv&amp;gt;/bin/pep8 --repeat $1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora a configuração do Emacs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::common-lisp
(custom-set-variables
  '(py-pychecker-command "~/.emacs.d/pychecker.sh")
  '(py-pychecker-command-args (quote ("")))
  '(python-check-command "~/.emacs.d/pychecker.sh")
)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="dicas-extras"&gt;Dicas extras&lt;/h4&gt;
&lt;p&gt;Além de tudo o que foi colocado aí acima, você pode querer ir além e melhorar cada vez mais o seu uso do Emacs, para ficar do seu gosto, aqui vão algumas dicas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O Emacs já funciona automaticamente com Subversion, &lt;a href="http://www.xsteve.at/prg/vc_svn/"&gt;basta aprender a usar&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Você pode configurar o Emacs para &lt;a href="https://code.djangoproject.com/wiki/Emacs"&gt;te ajudar com o Django&lt;/a&gt; também;&lt;/li&gt;
&lt;li&gt;Coloque o seu diretório &lt;strong&gt;~/.emacs.d&lt;/strong&gt; sob controle de versão;&lt;/li&gt;
&lt;li&gt;Explore a infinidade de possibilidades de customização do Emacs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="conclusão"&gt;Conclusão&lt;/h4&gt;
&lt;p&gt;Eu sei que esse tutorial ficou bem longo, mas eu tentei colocar todas as principais dicas de otimização de tempo e produtividade que eu adquiri em pouco tempo usando o Emacs, como eu disse antes, é como brincar de lego para montar a sua IDE, com as funcionalidades que você precisa.&lt;/p&gt;
&lt;p&gt;Deixe as suas impressões nos comentários, se houver algum problema, pode entrar em contato que tentarei ajudar o máximo que puder.&lt;/p&gt;
&lt;h5 id="referências"&gt;Referências&lt;/h5&gt;
&lt;p&gt;&lt;a href="http://www.enigmacurry.com/2008/05/09/emacs-as-a-powerful-python-ide/"&gt;Ryan McGuire: Emacs as a powerful Python IDE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/"&gt;SaltyCrane: My Emacs Python environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hide1713.wordpress.com/2009/01/30/setup-perfect-python-environment-in-emacs/"&gt;Lei Chen: Setup Perfect Python Environment In Emacs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jesselegg.com/archives/2010/02/25/emacs-python-programmers-part-1/"&gt;Jesse Legg: Emacs for Python Programmers: Basics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jesselegg.com/archives/2010/03/14/emacs-python-programmers-2-virtualenv-ipython-daemon-mode/"&gt;Jesse Legg: Emacs for Python Programmers #2: Virtualenv, IPython &amp;amp; Daemon Mode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rhodesmill.org/brandon/2009/emacs-python-virtualenv/"&gt;Brandon Rhodes: Installing Python packages for Emacs with virtualenv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip"&gt;Alex Clemesha: Tools of modern Python hacker: Virtualenv, Fabric and pip&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/programando-em-python-no-emacs.html</guid><pubDate>Wed, 31 Aug 2011 13:51:00 GMT</pubDate></item><item><title>Python e eu na revista TI Digital</title><link>http://ricardoduarte.net/posts/python-e-eu-na-revista-ti-digital.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;img class="center" title="TI Digital - Março 2010" src="http://ricardoduarte.net/galleries/post008/ti_digital_marco_2010.jpg" alt="TI Digital - Março 2010"&gt;&lt;/p&gt;
&lt;p&gt;A revista &lt;a href="http://www.revistatidigital.com.br"&gt;TI Digital&lt;/a&gt; do mês março vem com uma matéria de capa com 14 páginas sobre a minha linguagem de programação favorita, &lt;a href="ttp://www.python.org"&gt;Python&lt;/a&gt;. E por pura coincidência eu fui um dos convidados a responder algumas perguntas para compor a matéria.&lt;/p&gt;
&lt;p&gt;Eu não conhecia a revista antes disso, mas o contato com eles foi sempre muito cordial e a matéria ficou bem bacana, servindo como uma excelente divulgação para a linguagem. Aproveito esse post para colocar aqui as perguntas que a revista me fez e as minhas respostas na íntegra.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;&lt;strong&gt;Quais foram suas primeiras impressões quando começou a programar em Python? Qual era a linguagem de programação que você utilizava antes?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eu comecei a utilizar Python em 2005, quando ainda trabalhava no &lt;a href="http://www.serpro.gov.br"&gt;SERPRO&lt;/a&gt;. Nessa época eu fui integrado a uma equipe que desenvolvia um sistema para o Ministério da Educação e esse sistema era inteiramente feito em Python. Uma das coisas que mais me impressionou em Python foi o ganho de produtividade em um curto espaço de tempo. Eu não tinha experiência anterior com a linguagem e em apenas 2 dias eu já estava participando ativamente no desenvolvimento de alguns módulos desse sistema.&lt;/p&gt;
&lt;p&gt;Anteriormente, eu já havia programado com Java, C#, Visual Basic e ASP e ainda assim, Python também me impressionou bastante pela legibilidade do código-fonte. Quando somos desenvolvedores de software, nós passamos mais tempo lendo código do que propriamente escrevendo, e em Python sempre foi muito fácil entender o código que foi escrito por outro desenvolvedor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Onde se pode programar Python?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python pode ser programado em qualquer sistema operacional moderno e até mesmo nos sistemas mais antigos. Em diversas distribuições Linux, como Ubuntu, Fedora, Suse entre outras, o Python já vem instalado nativamente, o mesmo acontece também para o Mac OS X. No caso da plataforma Windows, existem instaladores que podem ser usados para facilmente instalar o Python. Posso destacar que é de longe a linguagem mais portável com que eu trabalhei, e você nem mesmo precisa alterar o código-fonte da sua aplicação para que ela funcione em sistemas operacionais diferentes, isso eu já pude comprovar na prática.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O que é possível desenvolver com o Python?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python é uma linguagem de programação flexível. Por ser uma linguagem dinâmica e multi-paradigma, Python é ideal para desenvolver desde pequenos scripts para automatização de determinadas tarefas, passando por sistemas web, cliente-servidor, desktop e até mesmo sistemas científicos. Basta dizer que &lt;a href="http://www.python.org/about/success/usa/"&gt;a NASA usa Python&lt;/a&gt;, para comprovar o que estou dizendo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Por que o Python possui duas versões disponíveis para download (Python 2.6.4 and Python 3.1.1)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python é uma linguagem um tanto quanto antiga, foi lançada em 1991, e desde a sua criação tem como premissas ser uma linguagem simples, que cabe no nosso cérebro e que procura sempre remover os obstáculos da frente do desenvolvedor para que o mesmo possa se preocupar mais com o conteúdo do que está sendo desenvolvido do que com a linguagem. No entanto, assim como acontece com qualquer linguagem de programação, mesmo Python tendo adotado essas premissas para o seu desenvolvimento, ela foi acumulando alguns "probleminhas" chatos. Para resolver esses problemas e manter uma linguagem simples e que cabe no nosso cérebro, o criador da linguagem resolveu criar a versão 3 de Python quebrando a compatibilidade com a versão anterior (Python 2).&lt;/p&gt;
&lt;p&gt;Sendo assim, para manter a compatibilidade com os sistemas antigos criados em Python, foi lançada a versão 2.6 que contém ainda algumas funcionalidades novas da versão 3. E a versão 3, pôde então ser lançada com as novas funcionalidades previstas e sem o compromisso de manter a compatibilidade com as versões anteriores. Com o lançamento dessa nova versão, foi criada também uma ferramenta batizada 2to3 que auxilia na migração de código-fonte criado em Python 2 para Python 3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O Python pode ser integrado a outras linguagens de programação e ferramentas. Quais são as principais? O que estas integrações oferecem?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As principais integrações de Python são justamente com as plataformas de desenvolvimento que mais fazem sucesso no mercado hoje. Python possui integração com a plataforma Java através de um projeto chamado &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt; que está em constante evolução e oferece acesso total as classes Java e permite que código Python seja compilado em classes Java.&lt;/p&gt;
&lt;p&gt;Existe também a integração com a plataforma .NET através do projeto &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt;, sendo esse também um projeto bastante evoluído que conta com um console interativo para experimentar trechos de código e conta também com uma IDE específica baseada no Visual Studio da Microsoft. Essa integração permite que você tenha acesso às bibliotecas do .NET Framework usando o Python, ao invés de uma das linguagens da plataforma .NET . Com essa integração nós podemos, por exemplo, criar uma aplicação desktop com a biblioteca .NET padrão (WPF) usando código Python na solução.&lt;/p&gt;
&lt;p&gt;Outra integração que ainda está em fase beta, mas que promete ser bem interessante é o &lt;a href="http://pyobjc.sourceforge.net/"&gt;PyObjC&lt;/a&gt; que é uma integração entre Python e Objective-C, a linguagem utilizada para desenvolver aplicativos para iPhone, iPod Touch e para o recém-lançado iPad. Acho que não preciso nem comentar muito quais serão as vantagens dessa integração né?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existem alguns fatores tecnológicos q o Python precisa evoluir. Então, o que você sente falta no Python? O que gostaria que fosse diferente na linguagem?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python possui um conceito muito interessante chamado de "batteries included", o que significa que a biblioteca padrão do Python é muito poderosa, de modo que lhe oferece funcionalidades para diversos tipos de necessidades que venham a surgir para a sua aplicação. Mas mesmo assim, ainda sinto falta em Python de uma biblioteca nativa que seja capaz de lidar com web services por exemplo, existem alguns projetos interessantes nesse sentido, mas acredito que a biblioteca padrão pudesse incorporar essa funcionalidade.&lt;/p&gt;
&lt;p&gt;Usar concorrência em Python também ainda é bem rudimentar, e acredito que a linguagem possa evoluir MUITO nesse ponto, não somente na questão de performance que se torna sofrível em alguns casos que você precise lidar com concorrência, como a própria módulo python para esse fim, threading, poderia incluir mais funcionalidades para facilitar a vida de quem precisa programar usando concorrência.&lt;/p&gt;
&lt;p&gt;Na parte de orientação a objetos, eu gostaria que Python tivesse uma melhor implementação de encapsulamento, não somente por necessidade minha, mas também para poder "agradar" aos desenvolvedores que tem uma grande experiência com OO e acabam não se acostumando muito bem com o encapsulamento de Python que é bem diferente de Java e .Net, por exemplo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A comunidade Python ainda não é muito conhecida. Qual a melhor maneira de fazer com que o Python seja mais explorado? O que ainda falta para convencer os programadores sobre o poder do Python?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Outro dia ouvi um colega de trabalho dizer que Python é uma linguagem que deu certo em outros países, mas não funcionou no Brasil. Concordo que isso já pode ter sido verdade algum dia, mas hoje estamos experimentando uma realidade diferente. Muitas empresas no país tem adotado Python para projetos importantes, e acredito que para fazer com que o Python seja mais explorado é importante mostrar que a cena está mudando. É necessário investir em um marketing positivo, ou seja, ao invés de criticar duramente as linguagens que hoje dominam o mercado, precisamos exaltar as características do Python, convencer as pessoas, especialmente aquelas que hoje estão em posição de decisão, de que Python é uma alternativa viável, estável, mais rápida e mais barata do que a maioria das opções que existem hoje.&lt;/p&gt;
&lt;p&gt;Convencer os programadores, eu acredito ser a parte mais fácil do processo, mas precisamos de mais eventos técnicos focados em Python para mostrar todas as possibilidades que o Python oferece. Usar um veículo de comunicação como a revista TI Digital com uma matéria de capa sobre Python já mostra que o cenário está mudando rapidamente e favoravelmente à linguagem, isso também ajuda a mostrar para os desenvolvedores que existem alternativas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A comunidade brasileira tem ajudado de alguma forma para o crescimento e atualização da linguagem?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A comunidade brasileira de Python é fantástica. Hoje nós temos a &lt;a href="http://associacao.python.org.br/"&gt;Associação Python Brasil&lt;/a&gt; que promove anualmente uma &lt;a href="http://www.pythonbrasil.org.br/"&gt;conferência de Python&lt;/a&gt; que cada vez mais tem crescido em qualidade e audiência. E sem contar que temos diversos grupos locais espalhados pelo país, entre eles posso destacar o &lt;a href="http://pythonrio.org/"&gt;PythonRio&lt;/a&gt; que promove alguns eventos importantes sobre Python durante o ano. Um desses eventos promovidos que merece destaque é o &lt;a href="http://pythoncampus.org/"&gt;PythonCampus&lt;/a&gt; que é uma espécie de caravana de tecnologia que visa integrar os estudantes de diversas universidades do estado com o mercado e com a tecnologia em si.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/python-e-eu-na-revista-ti-digital.html</guid><pubDate>Fri, 03 Dec 2010 12:20:00 GMT</pubDate></item><item><title>Como acessar webservices SOAP com Python</title><link>http://ricardoduarte.net/posts/como-acessar-webservices-soap-com-python.html</link><dc:creator>Ricardo Duarte</dc:creator><description>&lt;div tabindex="-1" id="notebook" class="border-box-sizing"&gt;
    &lt;div class="container" id="notebook-container"&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Na semana passada estava precisando de uma biblioteca &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; para realizar acesso a um web service &lt;a href="http://www.w3schools.com/SOAP/soap_intro.asp"&gt;SOAP&lt;/a&gt;. Fazendo uma rápida pesquisa encontrei algumas bibliotecas bem utilizadas, mas todas estavam muito desatualizadas, como a &lt;a href="http://sourceforge.net/projects/pywebsvcs/files/SOAP.py/"&gt;SOAPpy&lt;/a&gt; por exemplo, que não é atualizada desde 2005.&lt;/p&gt;
&lt;p&gt;Quando já estava quase desistindo de encontrar algo atualizado que atendesse a minha necessidade, eu me deparo com essa biblioteca de nome &lt;a href="https://fedorahosted.org/suds/"&gt;suds&lt;/a&gt;. Fiquei positivamente surpreso ao encontrar uma biblioteca que além de ser atualizada e possuir uma boa documentação, representa toda a simplicidade e praticidade de &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;&lt;img class="center" title="suds" src="http://ricardoduarte.net/galleries/post009/sudslogo-medium_ducky.png" alt="suds"&gt;&lt;/p&gt;
&lt;p&gt;Como muitos sabem, o protocolo &lt;strong&gt;SOAP&lt;/strong&gt; é um protocolo de comunicação complicado, mas usando o &lt;strong&gt;suds&lt;/strong&gt; tudo fica muito simples. Vejam só.&lt;/p&gt;
&lt;p&gt;Para o nosso exemplo, vamos usar um web service que traz informações sobre a Copa do Mundo (eu sei, estou meio atrasado, mas vá lá, é só um exemplo). O endereço do serviço é: &lt;a href="http://footballpool.dataaccess.eu/data/info.wso?WSDL"&gt;http://footballpool.dataaccess.eu/data/info.wso?WSDL&lt;/a&gt;. Vamos agora usar o &lt;strong&gt;suds&lt;/strong&gt; para acessar esse serviço.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::python
from suds.client import Client

url = "http://footballpool.dataaccess.eu/data/info.wso?WSDL"

cliente = Client(url)

print cliente&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simples assim e temos o cliente que representa o serviço com informações sobre a Copa do Mundo carregado em memória. A última linha do código acima serve para listar os métodos que esse serviço disponibiliza. O resultado é esse:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::bash
Suds ( https://fedorahosted.org/suds/ )  version: 0.3.9 GA  build: R659-20100219


Service ( Info ) tns="http://footballpool.dataaccess.eu"
   Prefixes (1)
      ns0 = "http://footballpool.dataaccess.eu"
   Ports (1):
      (InfoSoap)
         Methods (41):
            AllCards()
            AllDefenders(xs:string sCountryName, )
            AllForwards(xs:string sCountryName, )
            AllGames()
            AllGoalKeepers(xs:string sCountryName, )
            AllGroupCompetitors()
            AllMidFields(xs:string sCountryName, )
            AllPlayerNames(xs:boolean bSelected, )
            AllPlayersWithRedCards(xs:boolean bSortedByName, xs:boolean bSortedByRedCards, )
            AllPlayersWithYellowCards(xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, )
            AllPlayersWithYellowOrRedCards(xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, xs:boolean bSortedByRedCards, )
            AllStadiumInfo()
            Cities()
            Coaches()
            CountryNames(xs:boolean bWithCompetitors, )
            DateLastGroupGame()
            DateOfFirstGame()
            DateOfLastGame()
            FullTeamInfo(xs:string sTeamName, )
            GameInfo(xs:int iGameId, )
            GameResultCodes()
            GamesPerCity(xs:string sCityName, )
            GamesPlayed()
            GoalsScored(xs:int iGameId, )
            GroupCompetitors(xs:string sPoule, )
            GroupCount()
            Groups()
            NextGame()
            NumberOfGames()
            PlayedAtWorldCup(xs:string sTeamName, )
            RedCardsTotal()
            StadiumInfo(xs:string sStadiumName, )
            StadiumNames()
            StadiumURL(xs:string sStadiumName, )
            Teams()
            TeamsCompeteList()
            TopGoalScorers(xs:int iTopN, )
            TopSelectedGoalScorers(xs:int iTopN, )
            TournamentInfo()
            YellowAndRedCardsTotal()
            YellowCardsTotal()
         Types (38):
            ArrayOfString
            ArrayOftCardInfo
            ArrayOftCoaches
            ArrayOftCountryInfo
            ArrayOftCountrySelectedTopScorer
            ArrayOftGameCard
            ArrayOftGameInfo
            ArrayOftGameResultCode
            ArrayOftGoal
            ArrayOftGroupInfo
            ArrayOftGroupsCompetitors
            ArrayOftPlayerNames
            ArrayOftPlayersWithCards
            ArrayOftStadiumInfo
            ArrayOftTeamCompete
            ArrayOftTeamInfo
            ArrayOftTopGoalScorer
            ArrayOftTopSelectedGoalScorer
            tCardInfo
            tCards
            tCoaches
            tCountryInfo
            tCountrySelectedTopScorer
            tFullTeamInfo
            tGameCard
            tGameInfo
            tGameResultCode
            tGoal
            tGroupInfo
            tGroupsCompetitors
            tPlayerNames
            tPlayersWithCards
            tStadiumInfo
            tTeamCompete
            tTeamInfo
            tTopGoalScorer
            tTopSelectedGoalScorer
            tTournamentInfo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como podem perceber, esse serviço tem 41 métodos que eu posso acionar para obter informações sobre a Copa do Mundo. Vamos ver como eu posso usar esses métodos.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::python
resultado = cliente.service.RedCardsTotal()
print resultado&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O resultado impresso pelo trecho acima é: &lt;strong&gt;17&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Vamos todos dar um viva à simplicidade do Python! :o)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In []:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt; 
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
</description><category>programming</category><category>python</category><guid>http://ricardoduarte.net/posts/como-acessar-webservices-soap-com-python.html</guid><pubDate>Sat, 17 Jul 2010 03:47:00 GMT</pubDate></item></channel></rss>