<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><title>avelino.us</title><link href="http://avelino.us/" rel="alternate" /><id>http://avelino.us/</id><updated>2013-03-02T01:18:00+01:00</updated><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/pyAvelino" /><feedburner:info uri="pyavelino" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><feedburner:emailServiceId>pyAvelino</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><title>Chromium as the default browser</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/J5O1rsLVFRg/chromium-as-the-default-browser" rel="alternate" /><updated>2013-03-02T01:18:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2013-03-02:2013/03/02/chromium-as-the-default-browser</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="/static/images/chromium-logo.png"&gt;&lt;img alt="Logo Chromium" src="/static/images/chromium-logo.png" /&gt;&lt;/a&gt;The code of Google Chrome is based on Chromium, all the
feature implemented in Chromium comes in Google Chrome.&lt;/p&gt;
&lt;p&gt;What do you think of being one of the first to test new feature of
Google Chrome? Interesting huh!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://download-chromium.appspot.com/dl/Mac"&gt;Download a bleeding-edge build of Chromium for Mac!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chromium does not update automatically, for this reason I wrote a shell
script which updates the Chromium on Mac:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Note, this will remove /Applications/Chromium.app&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
rm -f chrome-mac.zip chrome-mac
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CHROME_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl http://commondatastorage.googleapis.com/chromium-browser-continuous/Mac/LAST_CHANGE&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;   latest version: $CHROME_VERSION&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CHROME_OLD_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cat ~/dotfile/CHROME_VERSION&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$CHROME_VERSION&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$CHROME_OLD_VERSION&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;   latest version!&amp;#39;&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;2
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$CHROME_VERSION&lt;/span&gt; &amp;gt; ~/doestfile/CHROME_VERSION
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;   save latest version: $CHROME_VERSION&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;   get latest version: $CHROME_VERSION&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
wget http://commondatastorage.googleapis.com/chromium-browser-continuous/Mac/&lt;span class="nv"&gt;$CHROME_VERSION&lt;/span&gt;/chrome-mac.zip
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;   compile latest version: $CHROME_VERSION&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
unzip chrome-mac.zip
rm -rf /Applications/Chromium.app
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;   install latest version: $CHROME_VERSION&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;
mv chrome-mac/Chromium.app /Applications/Chromium.app
rm -rf chrome-mac chrome-mac.zip
killall -9 Chromium
open /Applications/Chromium.app
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;DONE&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;base source:&amp;nbsp;&lt;a class="reference external" href="https://github.com/avelino/dotfile/blob/master/chromium_update.sh"&gt;https://github.com/avelino/dotfile/blob/master/chromium_update.sh&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/J5O1rsLVFRg" height="1" width="1"/&gt;</summary><category term="browser" /><category term="chrome" /><category term="chromium" /><category term="mac" /><category term="update" /><category term="upgrade" /><feedburner:origLink>http://avelino.us/2013/03/02/chromium-as-the-default-browser</feedburner:origLink></entry><entry><title>Riak, alta performance NoSQL para seu projeto</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/kqcDJJIPyXg/riak-alta-performance-nosql-para-seu-projeto" rel="alternate" /><updated>2012-12-23T10:00:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-12-23:2012/12/23/riak-alta-performance-nosql-para-seu-projeto</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/12/riak-transparent-larger.png"&gt;&lt;img alt="Riak Banco de dados NoSQL, focado em escalabilidade, disponibilidade e performance" src="http://avelino.us/wp-content/uploads/2012/12/riak-transparent-larger-300x94.png" /&gt;&lt;/a&gt;Esse ano de 2012 ajudei a comunidade &lt;a class="reference external" href="http://basho.com/products/riak-overview/"&gt;Riak&lt;/a&gt; que a cada
dia esse banco de dados vem me surpreendendo. Estou para escrever um
blogpost desde fevereiro, mas como vida de programador (pelo menos para
mim esse ano) é agitada.&lt;/p&gt;
&lt;p&gt;Resolvi falar sobre a performance nesse primeiro blogpost sobre Riak e
colocar na mesa um teste (relativamente simples) para compara o tempo de
inserção, realmente é um teste simples se tratando de NoSQL.&lt;/p&gt;
&lt;p&gt;Antes de mostrar a comparação acho importante deixar claro as vantagens
que temos em utilizar Riak:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Disponibilidade: sistema de recuperação de dados onde trabalha de
forma inteligente para que esteja disponível para ler e escrever
operações, mesmo em ambiente com falha, assim garantindo a
integridade dos dados;&lt;/li&gt;
&lt;li&gt;Tolerância a falhas: pode perder o acesso aos nós (Servidores Riak),
devido à falha de rede ou partição de hardware e nunca perder de
dados;&lt;/li&gt;
&lt;li&gt;Simplicidade de utilização: facil adição de máquinas em um cluster
Riak, sem ocorrer uma carga nos servidores - isso em um pequeno grupo
de servidores como uma grande quantidade de servidores Riak;&lt;/li&gt;
&lt;li&gt;Escalabilidade: Riak distribui automaticamente os dados ao redor do
cluster e produz um aumento de desempenho quase linear quando você
adicionar dados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depois de deixar claro os itens acima podemos colocar na messa o Riak e
o grande &lt;a class="reference external" href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;, lembrando que esse blogpost não é para falar qual
NoSQL é melhor ou para você parar de utilizar um ou outro banco, Riak e
MongoDB tem algumas características semelhantes, esse foi o motivo de
colocar em teste os dois.&lt;/p&gt;
&lt;p&gt;O teste foi simples preciso inserir 1 milhão (1000000) de registro no
meu banco de dados, qual banco de dados entrega isso mais rápido para
mim?&lt;/p&gt;
&lt;p&gt;Código Python usando drive nativo do Riak:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;riak&lt;/span&gt;



&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;riak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RiakClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;riak_developer_&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Thiago Avelino &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                       &lt;span class="s"&gt;&amp;#39;age&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                       &lt;span class="s"&gt;&amp;#39;language&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Código Python usando drive nativo do MongoDB:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pymongo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MongoClient&lt;/span&gt;



&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MongoClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;
&lt;span class="n"&gt;persons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;persons&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;persons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Thiago Avelino &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="s"&gt;&amp;#39;age&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="s"&gt;&amp;#39;language&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Um código simples onde faço um loop que vai de 0 a 1000000 (estou
fazendo 1000001 inserção), e dentro de cada interação do loop estou
gerando um registro no banco de dados. Veja abaixo o resultado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;(&lt;/span&gt;riak-test&lt;span class="o"&gt;)&lt;/span&gt; ~/Sites/riak-test&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;python riak.py
python riak.py  15.60s user 0.14s system 99% cpu 15.850 total

&lt;span class="o"&gt;(&lt;/span&gt;riak-test&lt;span class="o"&gt;)&lt;/span&gt; ~/Sites/riak-test&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;time &lt;/span&gt;python mongodb.py
python mongodb.py  144.14s user 35.47s system 55% cpu 5:25.85 total
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Realmente o tempo de execução do Riak é muito mas muito rápido, o que me
deixou mais surpreso foi o tempo do MongoDB, o MongoDB demorou 9 vezes
mais comparado com o Riak.&lt;/p&gt;
&lt;p&gt;Não estou falando que o MongoDB é ruim, ate mesmo que tenho projetos
grande em produção usando ele e dependendo do projeto/infra recomendo
usar MongoDB.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/kqcDJJIPyXg" height="1" width="1"/&gt;</summary><category term="benchmark" /><category term="mongodb" /><category term="nosql" /><category term="performance" /><category term="python" /><category term="riak" /><feedburner:origLink>http://avelino.us/2012/12/23/riak-alta-performance-nosql-para-seu-projeto</feedburner:origLink></entry><entry><title>Palestra sobre London Framework na PyCon Argentina</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/TBxYZLaTH-w/palestra-sobre-london-framework-na-pycon-argentina" rel="alternate" /><updated>2012-11-20T15:05:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-11-20:2012/11/20/palestra-sobre-london-framework-na-pycon-argentina</id><summary type="html">&lt;p&gt;`
&lt;a href="#id1"&gt;&lt;span class="problematic" id="id2"&gt;|&lt;/span&gt;&lt;/a&gt;Universidad Nacional de Quilmes, local onde foi organizado a PyCon
Argentina|`_&lt;/p&gt;
&lt;div class="system-message" id="id1"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/palestra-sobre-london-framework-na-pycon-argentina.rst&lt;/tt&gt;, line 9); &lt;em&gt;&lt;a href="#id2"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Inline substitution_reference start-string without end-string.&lt;/div&gt;
&lt;p&gt;No começo de junho o Mariano (organizador do evento &lt;a href="#id3"&gt;&lt;span class="problematic" id="id4"&gt;`PyCon Argentina
2012`_&lt;/span&gt;&lt;/a&gt;, me fez um convite para ir palestra sobre &lt;a href="#id5"&gt;&lt;span class="problematic" id="id6"&gt;`London Framework`_&lt;/span&gt;&lt;/a&gt;
(Framework criado por &lt;a href="#id7"&gt;&lt;span class="problematic" id="id8"&gt;`Marinho Brandão`_&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Nada melhor do que conhecer pessoas e principalmente culturas novas,
entender o que os Argentinos estão desenvolvendo e o que anda estudando,
ou seja, fazer network (como falamos na área de tecnologia). Dava para
ver no rosto dos argentinos a vontade de aprender e de consumir o maximo
de informação possível, na PyCon Argentina de 2012 teve uma ótima
seleção de palestra, onde foi abordado temas como&amp;nbsp;asynchrony&amp;nbsp;(twisted),
Plone (com Erico Andrei - Brasileiro), web2py &amp;nbsp;(com Massimo Di Pierro -
criador do framework),&amp;nbsp;Python 3.3 (com Brett Cannon - Desenvolvedor
Google) e muito mais.&lt;/p&gt;
&lt;p&gt;Tive grande privilegio de palestra sobre London Framework, foi
apresentado o motivo de criar um novo framework (Python) e hoje temos
funcionando dentro do London.&amp;nbsp;A repercussão foi muito positiva, recebi
muitos tweets e e-mails de desenvolvedores querendo saber mais sobre
London Framework, o que mostra grande aceitação e necessidade
(semelhantes) do framework dentro da comunidade Argentina. Veja abaixo
os slide da palestra de London Framework:&lt;/p&gt;
&lt;p&gt;A pedidos da organização, fiz minha palestra em portunhol (tinha
planejado apresentá-la em inglês, já que não sou fluente em espanhol).
Pelas conversas de corredor, acredito que o público entendeu bem o meu
portunhol!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/2012-11-16-13.49.50.jpg"&gt;&lt;img alt="Python Software Fundation" src="http://avelino.us/wp-content/uploads/2012/11/2012-11-16-13.49.50-1024x768.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No final do primeiro dia de evento tivemos uma confraternização, onde a
organização da PyCon Argentina chamou uma pizzaria conhecida de Buenos
Aires para fazer algumas pizza. A forma dos argentino preparar a pizza é
bem diferente de nos Brasileiros, não querendo puxar sardinha para os
Argentinos, é muito gostosa a pizza Argentina.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/2012-11-18-19.18.56.jpg"&gt;&lt;img alt="Eu fui na PyCon Argentina 2012" src="http://avelino.us/wp-content/uploads/2012/11/2012-11-18-19.18.56-768x1024.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- _ --&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/palestra-sobre-london-framework-na-pycon-argentina.rst&lt;/tt&gt;, line 51)&lt;/p&gt;
Explicit markup ends without a blank line; unexpected unindent.&lt;/div&gt;
&lt;p&gt;&lt;img alt="Universidad Nacional de Quilmes, local onde foi organizado a PyCon Argentina" src="http://avelino.us/wp-content/uploads/2012/11/2012-11-16-13.24.48-300x225.jpg" /&gt;: &lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/2012-11-16-13.24.48.jpg"&gt;http://avelino.us/wp-content/uploads/2012/11/2012-11-16-13.24.48.jpg&lt;/a&gt;
.. _PyCon Argentina 2012: &lt;a class="reference external" href="http://ar.pycon.org"&gt;http://ar.pycon.org&lt;/a&gt;
.. _London Framework: &lt;a class="reference external" href="http://londonframework.org/docs/"&gt;http://londonframework.org/docs/&lt;/a&gt;
.. _Marinho Brandão: &lt;a class="reference external" href="http://www.marinhobrandao.com/"&gt;http://www.marinhobrandao.com/&lt;/a&gt;&lt;/p&gt;
&lt;div class="system-messages section"&gt;
&lt;h2&gt;Docutils System Messages&lt;/h2&gt;
&lt;div class="system-message" id="id3"&gt;
&lt;p class="system-message-title"&gt;System Message: ERROR/3 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/palestra-sobre-london-framework-na-pycon-argentina.rst&lt;/tt&gt;, line 13); &lt;em&gt;&lt;a href="#id4"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Unknown target name: &amp;quot;pycon argentina 2012&amp;quot;.&lt;/div&gt;
&lt;div class="system-message" id="id5"&gt;
&lt;p class="system-message-title"&gt;System Message: ERROR/3 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/palestra-sobre-london-framework-na-pycon-argentina.rst&lt;/tt&gt;, line 13); &lt;em&gt;&lt;a href="#id6"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Unknown target name: &amp;quot;london framework&amp;quot;.&lt;/div&gt;
&lt;div class="system-message" id="id7"&gt;
&lt;p class="system-message-title"&gt;System Message: ERROR/3 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/palestra-sobre-london-framework-na-pycon-argentina.rst&lt;/tt&gt;, line 13); &lt;em&gt;&lt;a href="#id8"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Unknown target name: &amp;quot;marinho brandão&amp;quot;.&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/TBxYZLaTH-w" height="1" width="1"/&gt;</summary><category term="argentina" /><category term="evento" /><category term="hermanos" /><category term="london" /><category term="london framework" /><category term="pycon" /><category term="python" /><feedburner:origLink>http://avelino.us/2012/11/20/palestra-sobre-london-framework-na-pycon-argentina</feedburner:origLink></entry><entry><title>Plone, por onde começar?</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/Sg6G-9W6PkA/plone-por-onde-comecar" rel="alternate" /><updated>2012-11-06T18:22:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-11-06:2012/11/06/plone-por-onde-comecar</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://plone.org/"&gt;Plone&lt;/a&gt; é um CMS (Content management system, ou seja, sistema de gestão
de conteúdo), no Brasil muito usado no Governo (saiba mais porque o
Governo&amp;nbsp;Brasileiro&amp;nbsp;selecionou Plone como sistema de gestão de conteúdo,
&lt;a class="reference external" href="http://blip.tv/plone-symposium-south-america-/plonegov-uso-de-solu%C3%A7%C3%B5es-plone-na-administra%C3%A7%C3%A3o-p%C3%BAblica-3298083"&gt;palestra&lt;/a&gt; do&amp;nbsp;Giuseppe Romagnolli na &lt;a class="reference external" href="http://www.plonesymposium.com.br/"&gt;Plone Symposium&lt;/a&gt;).&lt;/p&gt;
&lt;div class="section" id="por-onde-comeca"&gt;
&lt;h2&gt;Por onde começa?&lt;/h2&gt;
&lt;blockquote&gt;
Como estou usando uma maquina Linux vou explicar como subir o Plone
em ambiente Unix.&lt;/blockquote&gt;
&lt;p&gt;Iremos usar versão &lt;strong&gt;4.2.2&lt;/strong&gt; (&lt;em&gt;estável&lt;/em&gt;) do Plone, para começa
precisamos baixar o source do Plone e descompactar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/
&lt;span class="nv"&gt;$ &lt;/span&gt;wget --no-check-certificate https://launchpad.net/plone/4.2/4.2.2/+download/Plone-4.2.2-UnifiedInstaller.tgz
&lt;span class="nv"&gt;$ &lt;/span&gt;tar -vxf Plone-4.2.2-UnifiedInstaller.tgz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Plone-4.2.2-UnifiedInstaller
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Antes de instalar o Plone precisamos instalar alguns pacote no Linux,
como:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;python-distribute&lt;/li&gt;
&lt;li&gt;python-dev&lt;/li&gt;
&lt;li&gt;build-essential&lt;/li&gt;
&lt;li&gt;libssl-dev&lt;/li&gt;
&lt;li&gt;libxml2-dev&lt;/li&gt;
&lt;li&gt;libxslt1-dev&lt;/li&gt;
&lt;li&gt;libbz2-dev&lt;/li&gt;
&lt;li&gt;subversion&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;Como o Plone trabalha com a biblioteca PIL precisamos instalar recurso
para trabalhar com imagem:&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;libjpeg62-dev&lt;/li&gt;
&lt;li&gt;libreadline-gplv2-dev&lt;/li&gt;
&lt;li&gt;wv&lt;/li&gt;
&lt;li&gt;poppler-utils&lt;/li&gt;
&lt;li&gt;python-imaging&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Instalar biblioteca Python&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;sudo aptitude install python-distribute python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Instalar biblioteca de imagem&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;sudo aptitude install libjpeg62-dev libreadline-gplv2-dev wv poppler-utils python-imaging
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Instalar controle de versão&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;sudo aptitude install subversion git
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Após a instalação das&amp;nbsp;dependências&amp;nbsp;do Plone, vamos começa a realmente
interagir com o Plone. Agora precisamos instalar o Plone, existe dois
modelo de Plone, um onde instalamos a instancia Plone e outra que
instalamos um Cluster de ZEO (ambiente de produção que precisa isolar
ZEO do Plone):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./install.sh standalone
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No final da instalação do Plone o mesmo vai retorna algumas informações
importante como a senha do usuário Administrador do Zope, pasta que foi
instalado o Plone, informações para suporte (da comunidade) e etc.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#####################################################################&lt;/span&gt;
&lt;span class="c"&gt;######################  Installation Complete  ######################&lt;/span&gt;

Plone successfully installed at /home/avelino/Plone
See /home/avelino/Plone/zinstance/README.html
&lt;span class="k"&gt;for &lt;/span&gt;startup instructions

Use the account information below to log into the Zope Management Interface
The account has full &lt;span class="s1"&gt;&amp;#39;Manager&amp;#39;&lt;/span&gt; privileges.

    Username: admin
    Password: xxxxxxx

This account is created when the object database is initialized. If you change
the password later &lt;span class="o"&gt;(&lt;/span&gt;which you should!&lt;span class="o"&gt;)&lt;/span&gt;, you&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;ll need to use the new password.

- If you need &lt;span class="nb"&gt;help&lt;/span&gt;, ask the mailing lists or &lt;span class="c"&gt;#plone on irc.freenode.net.&lt;/span&gt;
- The live support channel also exists at http://plone.org/chat
- You can &lt;span class="nb"&gt;read&lt;/span&gt;/post to the lists via http://plone.org/forums

- Submit feedback and report errors at http://dev.plone.org/plone
  &lt;span class="o"&gt;(&lt;/span&gt;For install problems, specify component &lt;span class="s2"&gt;&amp;quot;Installer (Unified)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

avelino@SAO-NT-01072:/tmp/Plone-4.2.2-UnifiedInstaller &lt;span class="err"&gt;$&lt;/span&gt;

Agora depois &lt;span class="k"&gt;do &lt;/span&gt;Plone instalado queremos subir um site:
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Temos o Zope/Plone rodando na porta &lt;strong&gt;8080&lt;/strong&gt; liberado para todos os IP
de sua maquina, ao acessar o endereço no
browser&amp;nbsp;&lt;strong&gt;http://127.0.0.1:8080/&lt;/strong&gt;&amp;nbsp;veremos esse site:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/plone-sem-nem-um-plone-site-criado.png"&gt;&lt;img alt="Plone (rodando) sem nem um Plone Site criado" src="http://avelino.us/wp-content/uploads/2012/11/plone-sem-nem-um-plone-site-criado-1024x570.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Precisamos criar um Plone Site, para isso basta clicar no botão &amp;quot;Criar
um novo site Plone, após clicar você será redirecionado para uma pagina
onde deve preencher com nome e titulo do site, abaixo dessas duas
informações temos a lista de produtos (para quem vem de outro CMS
geralmente é chamado de Plugin) instalados no Plone. Como estamos
começando agora vamos deixar todos em branco e clicar em&amp;nbsp;&lt;strong&gt;Criar site
Plone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/criar-um-site-plone.png"&gt;&lt;img alt="Criar um site Plone" src="http://avelino.us/wp-content/uploads/2012/11/criar-um-site-plone-1024x1024.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Após clicar no botão você acabou de criar o seu Plone Site.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/11/bem-vindo-ao-plone-site.png"&gt;&lt;img alt="Bem vindo ao Plone Site" src="http://avelino.us/wp-content/uploads/2012/11/bem-vindo-ao-plone-site-885x1024.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Agora basta você colocar conteúdo em seu Plone Site.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="comunidade-plone-brasil"&gt;
&lt;h2&gt;Comunidade Plone Brasil&lt;/h2&gt;
&lt;p&gt;No Brasil temos a comunidade &lt;a class="reference external" href="http://plone.org.br/"&gt;PloneGov-BR&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Sg6G-9W6PkA" height="1" width="1"/&gt;</summary><category term="bootstart" /><category term="começar" /><category term="plone" /><category term="pontape inicial" /><feedburner:origLink>http://avelino.us/2012/11/06/plone-por-onde-comecar</feedburner:origLink></entry><entry><title>Comandos tmux (cheat sheet)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/a7S3n-5J28o/comandos-tmux-cheat-sheet" rel="alternate" /><updated>2012-10-08T17:49:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-10-08:2012/10/08/comandos-tmux-cheat-sheet</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt; é um software que pode ser usado para vários consoles de
multiplex virtuais, permitindo que um usuário acesse múltiplas sessões
de terminais separados dentro de uma janela de um único terminal ou
sessão de terminal remoto. É útil para lidar com vários programas a
partir de uma interface de linha de comando, e para separar os programas
a partir do shell do Unix, que começou o programa. Distribuído sob uma
licença BSD.&lt;/p&gt;
&lt;div class="section" id="tmux-terminal-multiplexer"&gt;
&lt;h2&gt;tmux - terminal multiplexer&lt;/h2&gt;
&lt;div class="section" id="managing-tmux-sessions"&gt;
&lt;h3&gt;Managing tmux sessions&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;tmux &lt;span class="c"&gt;# start tmux server&lt;/span&gt;
tmux at &lt;span class="c"&gt;# attach running sessions to a terminal&lt;/span&gt;
tmux ls &lt;span class="c"&gt;# list running tmux sessions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="sharing-sessions-between-terminals"&gt;
&lt;h3&gt;Sharing sessions between terminals&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;tmux new -s session_name &lt;span class="c"&gt;# make new named session&lt;/span&gt;
tmux at -t session_name &lt;span class="c"&gt;# attach to exist session (allowing shared sessions)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="commands-used-within-a-running-tmux-session"&gt;
&lt;h3&gt;Commands (used within a running tmux session)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;c  - create new window
n/l - next/last window
&amp;amp;  - &lt;span class="nb"&gt;kill &lt;/span&gt;current window

%  - split window, adding a vertical pane to the right
&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;  - split window, adding an horizontal pane below
←/→ - move focus to left/right pane
↑/↓ - move focus to upper/lower pane

!  - Break current pane into new window
x  - Kill the current pane.
d  - detach the current client

&lt;span class="o"&gt;[&lt;/span&gt;  - enter copy mode &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;then &lt;/span&gt;use emacs &lt;span class="k"&gt;select&lt;/span&gt;/yank keys&lt;span class="o"&gt;)&lt;/span&gt;
    * press CTRL-SPACE or CTRL-@ to start selecting text
    * move cursor to end of desired text
    * press ALT-w to copy selected text

&lt;span class="o"&gt;]&lt;/span&gt;  - paste copied text

?  - show tmux key bindings
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;ul class="last simple"&gt;
&lt;li&gt;All commands need to be prefixed with the action key.&lt;/li&gt;
&lt;li&gt;By default, this is CTRL-b&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/10/Screenshot-at-2012-10-08-174927.png"&gt;&lt;img alt="image0" src="http://avelino.us/wp-content/uploads/2012/10/Screenshot-at-2012-10-08-174927-300x187.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/a7S3n-5J28o" height="1" width="1"/&gt;</summary><category term="cheat" /><category term="comandos" /><category term="command" /><category term="help" /><category term="sheet" /><category term="tmux" /><feedburner:origLink>http://avelino.us/2012/10/08/comandos-tmux-cheat-sheet</feedburner:origLink></entry><entry><title>Plone para desenvolvedores Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/s4Srjq_H9oY/plone-para-desenvolvedores-python" rel="alternate" /><updated>2012-08-30T11:40:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-08-30:2012/08/30/plone-para-desenvolvedores-python</id><summary type="html">&lt;p&gt;Sempre que uma pessoa vinha falar de &lt;a class="reference external" href="http://plone.org/"&gt;Plone&lt;/a&gt; para mim eu não me sentia
muito bem pois não conhecia e o pessoal que sempre conversei que
desenvolvia em Plone e depois conheceu &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; sempre falava que não
valia apena mexer com Plone! &lt;em&gt;Será que isso é realmente verdade&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Depois do que eu escutei o pessoal falando eu não queria nem saber desse
cara chamado Plone, ate mesmo que para desenvolver uma solução de
gerenciamento de&amp;nbsp;conteúdo&amp;nbsp;usando Django não é muito trabalhoso
(Realmente&amp;nbsp;era assim que eu pensava, mal eu sabia que estava
completamente enganado). Como eu fiz para mudar esse preconceito que
tinha?&lt;/p&gt;
&lt;p&gt;Realmente para mim mudar esse pensamento foi preciso senta e conhecer a
ferramenta, não foi um trabalho muito facil pois como já relatei vim de
Django e para mim era preciso subir um ambiente relativamente parecido,
mas é Plone e ele roda encima do servidor de aplicação &lt;a class="reference external" href="http://www.zope.org/"&gt;Zope&lt;/a&gt; e isso é
algo que eu não conhecia (apenas tinha uma ideia do que era mas o que é
realmente não sabia) em fim, depois do esforço de conhecer o Zope e
Plone achei bacana. Mas achar bacana e colocar em produção é bem
diferente.&lt;/p&gt;
&lt;p&gt;No começo de agosto assumi um cargo de lider tecnico da &lt;a class="reference external" href="http://www.grupotv1.com.br/index.php/pontocom/"&gt;tv1.com&lt;/a&gt;, eis
que surge uma demanda gigantesca pois atendemos muitos sites do Governo
Brasileiro,&amp;nbsp;tais como:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.brasil.gov.br/"&gt;Portal Brasil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.secom.gov.br/"&gt;Secom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://planalto.gov.br/"&gt;Planalto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.biblioteca.presidencia.gov.br/"&gt;Biblioteca da Presidencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.emquestao.gov.br/"&gt;Emquestão&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;entre outros...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todos os sites é em Plone, e por esse motivo tive que estudar ainda mais
do que estava estudando...&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Semana passada &lt;a class="reference external" href="https://twitter.com/eleddy"&gt;Liz Leddy&lt;/a&gt; e &lt;a class="reference external" href="https://twitter.com/nzupan"&gt;Nejc Zupan&lt;/a&gt; (dois desenvolvedores&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/plone-para-desenvolvedores-python.rst&lt;/tt&gt;, line 45)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;Plone) estava no Brasil para participar do evento &lt;a class="reference external" href="http://www.plonesymposium.com.br/"&gt;Plone Symposium&amp;nbsp;South
America&lt;/a&gt; e&amp;nbsp;&lt;a class="reference external" href="http://plone.org/events/regional/pssa/2012/caipirinha-sprint"&gt;Caipirinha Sprint&lt;/a&gt; (um dos melhores sprint que
participei).
|  O sprint foi muito bom fiquei surpreso com a qualidade do código que
o Plone tem e como o pessoal leva a escrita de teste unitario e teste
funcional a serio, o que posso falar é que 100% do código Plone tem
cobertura de teste (se você que ver com os seus proprio olhos &lt;a class="reference external" href="http://plone.org/documentation/kb/testing/code-coverage"&gt;aqui&lt;/a&gt;
explica como rodar os teste com coverage).&lt;/p&gt;
&lt;p&gt;Bom o que posso falar mais é que agora sou um core commiter do Plone:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/08/Screen-Shot-2012-08-30-at-11.08.19-AM.png"&gt;&lt;img alt="image0" src="http://avelino.us/wp-content/uploads/2012/08/Screen-Shot-2012-08-30-at-11.08.19-AM-1024x71.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bom nós desenvolvedores (Python) temos mania de criticar (ter
preconceito) ou não ter uma iniciativa para estudar uma nova tecnologia,
o que posso falar para essas pessoas (eu realmente sou um desse) é:
Conheça para depois tomar suas propria decisão, se você acha que um
projeto pode ser mais simples ou melhor em um ponto especifico, não
esqueça que você desenvolvedor (Python) tem capacidade de ajudar um
projeto open source.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/s4Srjq_H9oY" height="1" width="1"/&gt;</summary><category term="django" /><category term="plone" /><category term="python" /><category term="zope" /><feedburner:origLink>http://avelino.us/2012/08/30/plone-para-desenvolvedores-python</feedburner:origLink></entry><entry><title>Proxy transparente com Nginx</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/3agMEW6WT-8/proxy-transparente-com-nginx" rel="alternate" /><updated>2012-08-09T13:05:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-08-09:2012/08/09/proxy-transparente-com-nginx</id><summary type="html">&lt;p&gt;Muitas pessoas usam Squid para fazer qual quer tipo de proxy, ate mesmo
para proxy transparente para usar em servidor web, por exemplo:&lt;/p&gt;
&lt;p&gt;Você tem um site que precisa ter IP aqui no Brasil so que como o custo
de servidor e link aqui no Brasil é muito caro, você pode fazer um proxy
transparente para o servidor aqui no Brasil ser um cara que vai receber
a requisição e repassar para o outro servidor que esteja em qual quer
lugar do mundo. Com essa solução podemos ter uma maquina simples
(maquina com pouco poder de processamento) pois ela só vai receber o
trafego e repassar para o servidor que esteja em outro local.&lt;/p&gt;
&lt;p&gt;Vamos imaginar um exemplo pratico, preciso que o usuário acesse o IP
177.71.248.185 (é um servidor da Amazon no Brasil), esse servidor
precisa receber a requisição e repassar para o IP 67.159.35.2 (é maquina
principal onde é processado o backend, esse servidor esta fora
do&amp;nbsp;Brasi). Foi usado essa solução em um portal que atendo para ter baixa
latencia.&lt;/p&gt;
&lt;p&gt;Vamos ao exemplo pratico:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="s"&gt;.159.35.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt;       &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt;  &lt;span class="s"&gt;avelino.us&lt;/span&gt; &lt;span class="s"&gt;www.avelino.us&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="kn"&gt;proxy_cache&lt;/span&gt; &lt;span class="s"&gt;proxy-cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_key&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri$args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_ignore_headers&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Cache-Control&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Expires&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_min_uses&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_hide_header&lt;/span&gt; &lt;span class="s"&gt;Set-Cookie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="mi"&gt;302&lt;/span&gt; &lt;span class="mi"&gt;30m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_valid&lt;/span&gt; &lt;span class="s"&gt;any&lt;/span&gt; &lt;span class="mi"&gt;0m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_redirect&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Criei um &amp;quot;upstream server&amp;quot; para falar qual é o servidor de destino do
trafego, na configuração acima tem um cache de 30 minutos pois no
servidor principal tem cache de 4 horas.&lt;/p&gt;
&lt;p&gt;Logicamente que existe desvantagem com isso, pois vamos estar trafegando
em duas (ou mais) redes, assim usando o trafego do servidor que esta
recebendo a primeira requisição e do segunda que esta recebendo um
requisição do primeiro.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/3agMEW6WT-8" height="1" width="1"/&gt;</summary><category term="nginx" /><category term="proxy" /><category term="router" /><category term="transparente" /><feedburner:origLink>http://avelino.us/2012/08/09/proxy-transparente-com-nginx</feedburner:origLink></entry><entry><title>Console colorido usando Node.js</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/csYhFEBEleE/console-colorido-usando-node-js" rel="alternate" /><updated>2012-07-27T11:40:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-07-27:2012/07/27/console-colorido-usando-node-js</id><summary type="html">&lt;p&gt;Para quem esta acostumado trabalhar com make para subir um ambiente ou o
pessoal que gosta de escrever alguns shell scripts para automação de
simples rotinas acho muito importante colocar cor nos retornos do
script, isso é ótimo para sinalizar o que realmente o software (ou
script) esta fazendo.&lt;/p&gt;
&lt;p&gt;Para deixar um retorno colorido usando Node.js não é muito diferente de
shell script, pois o que vai processar o retorno é um console bash (zsh
ou qual quer outro shell), veja o exemplo abaixo de como deixar um
retorno de shell script colorido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;30m Preto  \033[0m             --&amp;gt; 0;30 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;31m Vermelho  \033[0m          --&amp;gt; 0;31 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;32m Verde  \033[0m             --&amp;gt; 0;32 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;33m Marrom  \033[0m            --&amp;gt; 0;33 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;34m Azul  \033[0m              --&amp;gt; 0;34 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;35m Purple  \033[0m            --&amp;gt; 0;35 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;36m Cyan  \033[0m              --&amp;gt; 0;36 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[0;37m Cinza Claro  \033[0m       --&amp;gt; 0;37 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;30m Preto Acinzentado \033[0m  --&amp;gt; 1;30 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;31m Vermelho Claro  \033[0m    --&amp;gt; 1;31 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;32m Verde Claro  \033[0m       --&amp;gt; 1;32 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;33m Amarelo \033[0m            --&amp;gt; 1;33 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;34m Azul  Claro \033[0m        --&amp;gt; 1;34 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;35m Purple Claro  \033[0m      --&amp;gt; 1;35 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;36m Cyan  Claro \033[0m        --&amp;gt; 1;36 &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[1;37m Branco  \033[0m            --&amp;gt; 1;37 &amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[40;1;37m Fundo Preto    \033[0m     --&amp;gt; 40;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[41;1;37m Fundo Vermelho \033[0m     --&amp;gt; 41;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[42;1;37m Fundo Verde    \033[0m     --&amp;gt; 42;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[43;1;37m Fundo Marrom   \033[0m     --&amp;gt; 43;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[44;1;37m Fundo Azul     \033[0m     --&amp;gt; 44;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[45;1;37m Fundo Purple   \033[0m     --&amp;gt; 45;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[46;1;37m Fundo Cyan     \033[0m     --&amp;gt; 46;?;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[47;1;37m Fundo Cinza    \033[0m     --&amp;gt; 47;?;? &amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[4;30m Sublinhado  \033[0m        --&amp;gt; 4;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[5;30m Piscando    \033[0m        --&amp;gt; 5;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[7;30m Invertido   \033[0m        --&amp;gt; 7;? &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot; \033[8;30m Concealed   \033[0m        --&amp;gt; 8;? &amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/07/Screen-Shot-2012-07-27-at-11.30.08-AM.png"&gt;&lt;img alt="image0" src="http://avelino.us/wp-content/uploads/2012/07/Screen-Shot-2012-07-27-at-11.30.08-AM-300x300.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bom como comentei acima em Node.js não é muito diferente, seja exemplo
abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="s1"&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//// http://avelino.us/2012/07/27/console-colorido-usando-node-js&lt;/span&gt;
&lt;span class="c1"&gt;////&lt;/span&gt;

&lt;span class="c1"&gt;// Retorna o texto em vermelho&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\033[31m Aqui esta o texto em vermelho.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Retorna o texto em azul&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\033[34m Aqui esta o texto em azul.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Volta o padrão do bash&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\033[0m Aqui estamos dando reset nas cores do bash.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;// Criando variavel para deixar um pouco mais simples&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;red&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\u001b[31m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;blue&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\u001b[34m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\u001b[0m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Aqui esta o texto em vermelho. &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Aqui esta o texto em vermelho. &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Aqui estamos dando reset nas cores do bash.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/07/Screen-Shot-2012-07-27-at-11.31.42-AM.png"&gt;&lt;img alt="image1" src="http://avelino.us/wp-content/uploads/2012/07/Screen-Shot-2012-07-27-at-11.31.42-AM-300x225.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Perceba que no começo do script estamos usando o
&amp;quot;&lt;strong&gt;``'use strict';``&lt;/strong&gt;&amp;quot;, para não termos problema com o formato loco
de color dentro das strings. No exemplo que estamos
usando&amp;nbsp;variáveis&amp;nbsp;coloquei as colors em Unicode (eis ai uma problema!).&lt;/p&gt;
&lt;div class="section" id="porque-uso-u-nos-codigos-unicode"&gt;
&lt;h2&gt;Porque uso &amp;quot;&lt;strong&gt;\u&lt;/strong&gt;&amp;quot; nos códigos unicode?&lt;/h2&gt;
&lt;p&gt;Bom realmente eu não entendi muito bem o porque o Node.js trata dessa
forma, mas achei uma essa explicação:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Octal literals can be identified by a numeric value starting with&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/console-colorido-usando-node-js.rst&lt;/tt&gt;, line 97)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;a leading 0 (zero). Since this is a source of a possible
unintentional octal values when the programmer zero-pads decimal
numbers of varying lengths in the source code to make then look
prettier and more uniform. The strict mode disallows the octal mode
due to this reason.
|  The ESCape code can be represented in a number of ways. Decimal
27 , Hexadecimal 1B , Octal 33 or Binary 00011011.
|  So instead of write the ESC code in a string as \033 you can as
well just choose one of the other modes. Hexadecimal for instance:
\x1B.
|  In your example you used the two-byte unicode representation of
the character \u001b which works just as well.
|  I’m still an oldschool C head and usually assumes all strings to
be plain ASCII so I’d use \x1B by default instead of this
newfangled unicode crap Java is using. ^_^&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Realmente não é muito produtivo desenvolver dessa forma, mas temos
algumas iniciativas open source que pode nos ajudar com o retorno de
cores dentro do Node.js.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/medikoo/cli-color"&gt;cli-color&lt;/a&gt; -&amp;nbsp;&lt;a class="reference external" href="https://github.com/medikoo"&gt;Mariusz Nowak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/mattpat/colorize"&gt;colorize&lt;/a&gt; -&amp;nbsp;&lt;a class="reference external" href="http://mattpatenaude.com/"&gt;Matt Patenaude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/TrevorBurnham/sty"&gt;sty&lt;/a&gt; -&amp;nbsp;&lt;a class="reference external" href="https://github.com/TrevorBurnham"&gt;Trevor Burnham&lt;/a&gt;&amp;nbsp;(&lt;em&gt;Esse projeto aceita você coloca objetos
html como marcação&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todos os projetos acima estão dentro do npm.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/csYhFEBEleE" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2012/07/27/console-colorido-usando-node-js</feedburner:origLink></entry><entry><title>Criando package (modulo) em Node.js</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/PaTsh2BSuEc/criando-package-modulo-em-node-js" rel="alternate" /><updated>2012-06-23T10:15:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-06-23:2012/06/23/criando-package-modulo-em-node-js</id><summary type="html">&lt;p&gt;Existe muitas pessoas querendo estudar Node.js pela simplicidade de
trabalhar com processamento assíncrono e por usar JavaScript em server
side. JavaScript é uma linguagem simples mas para desenvolvimento Client
side mas ao mesmo tempo quando colocamos JavaScript do lado do servidor
começa a surgi algumas duvidas como: estrutura do software, como criar
biblioteca, qual Framework usar e muitas outras.&lt;/p&gt;
&lt;p&gt;Dando uma olhada no Github vi que tem muitos software que parece uma
lingüiça com mais de 500 linhas em um mesmo arquivo, aí me vem a
seguinte pergunta &amp;quot;JavaScript não é orientado a objeto?&amp;quot; logicamente que
sim, então tem alguma coisa errada pois uns dos paradigma é dividir
funcionabilidade onde cada modulo faça sua parte e usando todas faz o
que foi proposto a ser feito.&lt;/p&gt;
&lt;p&gt;Então vamos lá, seguindo um exemplo simples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Conectar em um banco de dados&lt;/li&gt;
&lt;li&gt;Fazer insert, update e delete&lt;/li&gt;
&lt;li&gt;Desconectar do banco de dados&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O exemplo usado encontra-se no repositorio &amp;quot;&lt;a class="reference external" href="https://github.com/avelino/example-nodejs-mongodb"&gt;example-nodejs-mongodb&lt;/a&gt;&amp;quot;
na minha conta do Github, nesse exemplo vou usar o banco de dados
&lt;a class="reference external" href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; por ser mais simples de instalar e usar (Pois é um banco de
dados NoSQL)&amp;nbsp;. Dado que já esteja instalado o MongoDB em seu sistema
operacional (Para usuarios Linux basta baixar o source do MongoDB no
site e depois rodar o binario mongod, já para usuarios Windows não tenho
não tenho experiencia no ambiente mas achei esse &lt;a class="reference external" href="http://www.nosqlbr.com.br/instalando-mongodb-no-windows-com-wamp.html"&gt;tutorial&lt;/a&gt; que pode
ajudar). A instalação do NodeJS e NPM no &lt;a class="reference external" href="http://vinteum.com/instalando-nodejs-no-ubuntu/"&gt;Linux&lt;/a&gt; e &lt;a class="reference external" href="http://mateussouzaweb.com/blog/nodejs/tutorial-instalando-nodejs-no-windows"&gt;Windows&lt;/a&gt; é uma
operação relativamente simples, por isso não vou detalhar todo o
processo, você pode ver nos artigos nesse blogpost.&lt;/p&gt;
&lt;p&gt;A primeira coisa que temos que ter em mente é que tudo o que é escrito
dentro de um package (proprio) não é levado para fora, você precisa
especificar o que realmente quer expor do seu package. No arquivo
&lt;strong&gt;`mongocon.js`_&lt;/strong&gt;&amp;nbsp;temos um exemplo de como trabalhar com&amp;nbsp;exports no
Node.JS:&lt;/p&gt;
&lt;div&gt;&lt;pre class="literal-block"&gt;
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/avelinous');

exports.mongoose = mongoose;
&lt;/pre&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;No exemplo acima estou expondo toda a classe do &lt;strong&gt;mongoose&lt;/strong&gt;, eu poderia
restringir export só alguns metodos por exemplo:&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="literal-block"&gt;
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/avelinous');

exports.mongoose_schema =&amp;nbsp;mongoose.Schema;
&lt;/pre&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Assim podemos limitar o acesso dentro de um package.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Caso queira fazer um package e expor publicamente via NPM, basta criar
um package.json juntamente com o seu source, assim pode colocar
dependencias que o seu package tem e em qual versão do NodeJS ele roda,
veja o exemplo de um package.json:&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre class="literal-block"&gt;
{
    &amp;quot;name&amp;quot;: &amp;quot;mongo_test&amp;quot;,
    &amp;quot;description&amp;quot;: &amp;quot;A package using mongoose ODM&amp;quot;,
    &amp;quot;author&amp;quot;: &amp;quot;Thiago Avelino &amp;lt;thiagoavelinoster AT gmail DOT com&amp;gt;&amp;quot;,
    &amp;quot;dependencies&amp;quot;: {
        &amp;quot;mongoose&amp;quot;: &amp;quot;&amp;gt;= 2.7.0&amp;quot;
    },
    &amp;quot;engine&amp;quot;: &amp;quot;node 0.6.19&amp;quot;
}
&lt;/pre&gt;
&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Pronto, com isso é facil enviar o seu package para o repositorio do NPM.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/PaTsh2BSuEc" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2012/06/23/criando-package-modulo-em-node-js</feedburner:origLink></entry><entry><title>Vagas de Python para trabalhar remoto</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/yiSZ48jahuk/vagas-de-python-para-trabalhar-remoto" rel="alternate" /><updated>2012-05-07T16:46:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-05-07:2012/05/07/vagas-de-python-para-trabalhar-remoto</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://mochii.co.uk/"&gt;&lt;img alt="image0" src="http://mochii.co.uk/static/img/h_logo340x86.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A duas semana eu escrevi um blogpost sobre &amp;quot;&lt;a class="reference external" href="http://avelino.us/2012/04/20/trabalhar-para-empresa-de-fora-do-brasil/"&gt;Trabalhar para empresa de
fora do Brasil&lt;/a&gt;&amp;quot; e realmente vale muito apena, como a demando do
projeto aumentou consideravelmente estamos precisando de desenvolvedores
para entrar no time.&amp;nbsp;Nosso time é responsável por desenvolver algumas
ferramentas de SEO.&lt;/p&gt;
&lt;p&gt;Conhecimento necessario:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Dominio do idioma inglês;&lt;/li&gt;
&lt;li&gt;Python;&lt;/li&gt;
&lt;li&gt;Django (Caso conheça outro frameworks é importante).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Itens importante:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Tradução de projeto open source;&lt;/li&gt;
&lt;li&gt;Foco (Como o trabalho é remoto, temos que sempre ter foco no que
estamos fazendo);&lt;/li&gt;
&lt;li&gt;Conhecimento em arquitetura de software;&lt;/li&gt;
&lt;li&gt;Contribuido com projeto open source (Ideal que tenho o repositorio
aberto);&lt;/li&gt;
&lt;li&gt;Ótimo conhecimento em desenvolvimento ágil;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estamos procurando por pessoas criativas, que gostem de inovação, de
pesquisar e identificar novas tendências e de encarar desafios complexos
com agilidade e velocidade.&lt;/p&gt;
&lt;p&gt;Se você se encaixa neste perfil, envie seu curriculo em inglês para mim
(thiagoavelinoster AT gmail.com) com uma lista dos últimos 5 livros
técnicos que você leu, Github, Twitter, LinkedIn e o que você quiser
compartilhar.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/yiSZ48jahuk" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2012/05/07/vagas-de-python-para-trabalhar-remoto</feedburner:origLink></entry><entry><title>Trabalhar para empresa de fora do Brasil</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/vkquP_eEQrE/trabalhar-para-empresa-de-fora-do-brasil" rel="alternate" /><updated>2012-04-20T19:13:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-04-20:2012/04/20/trabalhar-para-empresa-de-fora-do-brasil</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://avelino.us/wp-content/uploads/2012/04/London_Bus_Big_Ben_narrowweb__300x4000.jpg"&gt;&lt;img alt="Londres é a capital e a maior e mais importante cidade da Inglaterra e do Reino Unido." src="http://avelino.us/wp-content/uploads/2012/04/London_Bus_Big_Ben_narrowweb__300x4000-225x300.jpg" /&gt;&lt;/a&gt;O tema é muito abrangente mas vou focar justamente
para a área tecnologia onde temos a possibilidade de trabalhar remoto
(vulgo home office, que é um outro tema que gera muita polemica).&lt;/p&gt;
&lt;p&gt;Hoje fecha um total de 3 dias trabalhando na empresa
&lt;a class="reference external" href="http://mochii.co.uk/"&gt;Mochii&lt;/a&gt;&amp;nbsp;(Realmente achei o site da empresa muito nerd e extremamente
diferente, esse e outros motivo me fez trabalhar com eles) e durante
esses três dias tive uma&amp;nbsp;ótima&amp;nbsp;experiencia para compartilhar.&lt;/p&gt;
&lt;p&gt;Primeiro que o dono da empresa é muito acessível, sem essa frescura
de&amp;nbsp;hierarquia (Não que eu ache totalmente&amp;nbsp;hierarquia desnecessário, mas
em alguns caso ao meu ver não precisaria de tanta burocracia).&lt;/p&gt;
&lt;p&gt;Segundo que o time de desenvolvimento de lá é 100% aberto a ideias e a
criticas (logicamente que criticas construtivas e que saiba conversa
sobre o porque não concorda com determinada parte do código), muito
diferente de alguns desenvolvedores no Brasil (Sei que tem em outros
lugares do mundo mas como trabalhei muito tempo no Brasil estou usando
como referencia) que se apega com código desenvolvido.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Uma coisa que realmente me deixou muito surpreso foi em relação a&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/trabalhar-para-empresa-de-fora-do-brasil.rst&lt;/tt&gt;, line 30)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;cobrança de como esta indo a tarefa que eu (Thiago Avelino) assumi, o
dono da empresa chegou para mim e falou que eu deveria conversa com um
funcionario que saberia explicar melhor sobre o porque esta usando a
tecnologia X, Y e Z, depois do lider do desenvolvimento me explicado foi
atribuido uma tarefa e não fui cobrado nem uma vez sobre a tarefa,
realmente isso é muito diferente aqui no Brasil, principalmente quando
um desenvolvedor novo entra em um time, geralmente tem sempre um cara no
time que fica pergunta &amp;quot;&lt;em&gt;e ai esta entendendo?&lt;/em&gt;&amp;quot;, ao meu ver isso tem
o seu lado bom e consequentemente o seu lado ruim.
|  O lado bom é que tem a interação do time com o novo desenvolvedor,
mais isso acaba ficando chato pois se o novo desenvolvedor não esta
entendo ele vai ficar com vergonha (ou alguma coisa do genero) de se
expressa falando que não esta entendo alguma parte do fluxo do projeto
ou mesmo código.&lt;/p&gt;
&lt;p&gt;Poderia falar mais 1001 experiência que tive essa semana, mas vou ir
gerando blog post com os passar das semanas, assim posso ir aprofundando
cada dia mais da&amp;nbsp;experiência vivida.&lt;/p&gt;
&lt;blockquote&gt;
Realmente vale apena trabalhar para uma empresa de fora do Brasil.&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/vkquP_eEQrE" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2012/04/20/trabalhar-para-empresa-de-fora-do-brasil</feedburner:origLink></entry><entry><title>Node.js onde usar?</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/Xpzfe1EcgPU/node-js-onde-usar" rel="alternate" /><updated>2012-04-10T01:13:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-04-10:2012/04/10/node-js-onde-usar</id><summary type="html">&lt;p&gt;&lt;img alt="image0" src="http://avelino.us/wp-content/uploads/2012/04/nodejs-300x168.png" /&gt;&lt;/p&gt;
&lt;p&gt;Ultimamente estou estudando bastante Javascript para colocar algumas
aplicações em Node.js no ar, ate que tive a minha primeira necessidade
real de usar &lt;a class="reference external" href="http://nodejs.org"&gt;Nodejs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Na &lt;a class="reference external" href="http://nodegrid.com"&gt;Nodegrid&lt;/a&gt; tivemos a necessidade fazer grande processamento
assíncrono, temos um servidor de cache que foi desenvolvimento por
necessidade de armazenamento e controle do que esta em cache e tempo
para expirar o mesmo, poderia ser usado memcache mas a &lt;a class="reference external" href="http://nodegrid.com"&gt;Nodegrid&lt;/a&gt; esta
fazendo um serviço de hosting de memcache, com isso teríamos o problema
de concorrência de nome dentro do banco chave e valor (Memcache).&lt;/p&gt;
&lt;p&gt;No case que tenho com a &lt;a class="reference external" href="http://nodegrid.com"&gt;Nodegrid&lt;/a&gt; na solução de cache (Djazz.cache)
começamos a desenvolver usando 'C', funcionou muito bem, mas com o
passar do tempo a manutenção do software começou ficar trabalhosa. Eu
tenho experiencias com software grande em C &lt;a class="reference external" href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html"&gt;(Kernel BSD)&lt;/a&gt; e mesmo
assim a manutenção de um software não é nada confortável. Migrei para
Python com Twisted, mais infelizmente o códigos usando Twisted não fica
muito agradável ou seja não é Pythônico então olhei para o projeto
Node.js que tem a característica simples e facil de trabalhar com
processamento assíncrono.&lt;/p&gt;
&lt;p&gt;Recomendo olhar o trabalho que os commiters do Node.js estão fazendo,
tem muitas ideias ótimas e outra que precisa ser melhoradas.&lt;/p&gt;
&lt;p&gt;Vejo a Node.js como uma solução ótima e simples para trabalhar com
conexões assíncrono, ainda hoje não vejo o Node.js substituindo uma
linguagem que já esta a anos rodando em backend como Python, Ruby, Java
e etc. Ao meu ver o Node.js vai crescer ainda mais o seu uso nas
necessidades específica (assíncronas), pela simplicidade de
implementação e fácil manutenção.&lt;/p&gt;
&lt;p&gt;Link o slide da palestra &amp;quot;&lt;a class="reference external" href="http://www.slideshare.net/avelinoo/nodejs-em-produo-javascript-no-server-side"&gt;Node.js em produção&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Xpzfe1EcgPU" height="1" width="1"/&gt;</summary><category term="cache" /><category term="JavaScript" /><category term="Nodejs" /><feedburner:origLink>http://avelino.us/2012/04/10/node-js-onde-usar</feedburner:origLink></entry><entry><title>Test é para os fracos</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/hFFTNb1jd98/test-e-para-os-fracos" rel="alternate" /><updated>2012-02-24T22:48:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2012-02-24:2012/02/24/test-e-para-os-fracos</id><summary type="html">&lt;p&gt;Em novembro fiz mais uma palestra sobre &lt;tt class="docutils literal"&gt;teste unitários&lt;/tt&gt; só que agora
com o titulo da palestra bem diferente &lt;a class="reference external" href="http://www.slideshare.net/avelinoo/test-para-os-fracos"&gt;&amp;quot;Test é para os fracos&amp;quot;&lt;/a&gt;, o
motivo desse titulo é para deixar a palestra mais dinâmica pois escrever
teste não é uma tarefa muito simples no primeiro contato.&lt;/p&gt;
&lt;p&gt;Tem muitas pessoas que acha que escrever teste não garante que o
software não tem bug, isso é claro, mas vamos encarar o problema quando
quando tiver que mudar o software, caso ele esteja como teste na parte
onde esta sendo implementado novas funcionalidade e venha quebrar ai sim
vamos dar valor aos teste.&lt;/p&gt;
&lt;p&gt;Uns dos tópicos da minha palestra é como acostumar a escrever teste,
geralmente não é um trabalho muito simples, quando começamos a praticar
técnicas de desenvolvimento de software como &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Test_Driven_Development"&gt;TDD&lt;/a&gt; é um trabalho muito
chato pois não temos experiencia e nem costume de escrever um teste para
depois implementar o software passar na quela teste, vendo este cenário
podemos chegar a conclusão que muitos desenvolvedores não sabe realmente
o que precisa ser desenvolvido e com isso fica ainda mais complicado de
praticar TDD.&lt;/p&gt;
&lt;p&gt;Antes de desenvolvermos um software a primeira coisa é saber o que o
software vai fazer, só assim a pratica de TDD começa e ficar mais fácil
e fluente, uma dica que dou para quem começa da implementa camada de
teste unitário em um projeto é participar de Coding Dojo e de
&lt;a class="reference external" href="http://python.org.br/wiki/GrupySP/PythonStorm"&gt;PythonStorm&lt;/a&gt; (Ideia do nosso amigo &lt;a class="reference external" href="https://rodolphoeck.com/"&gt;Rodolpho Eckhardt&lt;/a&gt;) onde é
reunido um grupo para fazer para bater um papo sobre tecnologia (Python)
e falar sobre melhores praticas.&lt;/p&gt;
&lt;p&gt;Esse é referente aos primeiros slides da palestra, vou escrever as
próximos slides no próximos webposts.&lt;/p&gt;
&lt;p&gt;Link dos slides da palestra:
&lt;a class="reference external" href="http://www.slideshare.net/avelinoo/test-para-os-fracos"&gt;http://www.slideshare.net/avelinoo/test-para-os-fracos&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/hFFTNb1jd98" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2012/02/24/test-e-para-os-fracos</feedburner:origLink></entry><entry><title>VIM a IDE para programadores Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/imJdimDJAsg/vim-ide-para-programadores-python" rel="alternate" /><updated>2011-12-22T22:47:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-12-22:2011/12/22/vim-ide-para-programadores-python</id><summary type="html">&lt;p&gt;Depois muito tempo sem escrever nada no meu blog, escolhi esse tema para
chamar a atenção do pessoal que esta começando desenvolver em Python que
sempre pergunta qual é a melhor IDE para desenvolver em Python ou qual
quer programador que usa uma super IDE pesado porque tem o recurso X, Y
e Z.&lt;/p&gt;
&lt;p&gt;Com o VIM podemos ter todos os recurso avançado que temos em qual quer
IDE, basta algumas configurações para que esses recursos ser ativado,
para facilitar a vida de todos compartilhei o meu &lt;tt class="docutils literal"&gt;.vimrc&lt;/tt&gt; e nesse
post vou explicar como usar o mesmo.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&amp;quot;Em 2 de novembro de 1991, Bram Moolenaar publicava a primeira versão do edito vim. O vim nasceu como um clone para Amiga do editor vi criado por Bill Joy em 1976, adicionando algumas funcionalidades extras, daí seu nome (VI iMproved ou VI Melhorado). Este editor se adaptou rapidamente a outras plataformas. &amp;quot;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Assumindo que o &lt;tt class="docutils literal"&gt;vi&lt;/tt&gt; já esta instalado no meu micro, vamos instalar as
configurações que eu fiz, basta rodar os seguintes comando no seu bash
(Linux ou Mac):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
curl https://raw.github.com/avelino/.vimrc/master/bootstrap.sh -o - | sh
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Após isso ele vai baixar o repositório na sua pasta &lt;tt class="docutils literal"&gt;HOME&lt;/tt&gt;.&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Recomendo o uso o VIM em GUI pois podemos chegar 256 cores, ou seja,&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/vim-ide-para-programadores-python.rst&lt;/tt&gt;, line 30)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;colocar temas mais agradável e assim deixando o uso do &lt;tt class="docutils literal"&gt;vim&lt;/tt&gt; mais
confortável para o desenvolvimento, para Linux é o &lt;tt class="docutils literal"&gt;gvim&lt;/tt&gt; e para mac o
&lt;tt class="docutils literal"&gt;macvim&lt;/tt&gt; (Para mac o Björn Winckler fez um ótimo trabalho, na minha
humilde opinião é a melhor versão do VIM via GUI).&lt;/p&gt;
&lt;p&gt;Chega de blablabla né, vamos logo para o que realmente interessa, como o
&lt;tt class="docutils literal"&gt;VIM&lt;/tt&gt; ficou e como utilizar ele?&lt;/p&gt;
&lt;p&gt;&lt;img alt="vim start" src="http://dl.dropbox.com/u/763381/avelino.us/vim-start.png" /&gt;&lt;/p&gt;
&lt;p&gt;Usando o vim para navegar nas pasta de um projeto:&lt;/p&gt;
&lt;p&gt;&lt;img alt="vim files" src="http://dl.dropbox.com/u/763381/avelino.us/vim-files.png" /&gt;&lt;/p&gt;
&lt;p&gt;Buscando arquivo por nome dentro do projeto:&lt;/p&gt;
&lt;p&gt;&lt;img alt="vim search file" src="http://dl.dropbox.com/u/763381/avelino.us/vim-search-files.png" /&gt;&lt;/p&gt;
&lt;p&gt;Listar todas as class e def do arquivo esta esta aberto (Python)&lt;/p&gt;
&lt;p&gt;&lt;img alt="vim list class" src="http://dl.dropbox.com/u/763381/avelino.us/vim-list-class.png" /&gt;&lt;/p&gt;
&lt;p&gt;Lista de comandos para usar no 'vim', lembrando que esses comando foi
customizado:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;:cd&lt;/tt&gt; /path Abrir pasta&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;tn&lt;/tt&gt; Abrir nova aba&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;te&lt;/tt&gt; Abrir nova aba e carregar arquivo&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;t]&lt;/tt&gt; Proxima aba&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;t[&lt;/tt&gt; Voltar aba&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ctrl+c&lt;/tt&gt; Adicionar todos os arquivos no cache para poder fazer
busca de arquivo (recomendo fazer isso ao abrir o projeto)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ctrl+f&lt;/tt&gt; Busca arquivo e abre na mesma aba&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ctrl+s&lt;/tt&gt; Busca arquivo e abre em uma nova aba&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\b&lt;/tt&gt; Abre arquivo que esta no buffer do vim (Arquivo abertos)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\d&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;\n&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;F3&lt;/tt&gt; Abre navegador de arquivo&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\f&lt;/tt&gt; Lista todas as class e def (Python)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\j&lt;/tt&gt; Vai para declaração de um metodo&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\r&lt;/tt&gt; Renomear todos os metodos&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;[e&lt;/tt&gt; Move linha para cima&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;e]&lt;/tt&gt; Move linha para baixo&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\v ou&lt;/tt&gt;Ctrl+w + v` Divide a tela em vertical&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\h&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;Ctrl+w + s&lt;/tt&gt; Divide a tela em horizontal&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\w&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;Ctrl+w + q&lt;/tt&gt; Fecha a aba atual&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ctrl+k&lt;/tt&gt; Abre console Python&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ctrl+j&lt;/tt&gt; Roda o script Python aberto&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\sh&lt;/tt&gt; Abre bash (shell)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\p&lt;/tt&gt; Manda o arquivo em aberto para o dpaste.com&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\ga&lt;/tt&gt; Git add .&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\gc&lt;/tt&gt; Git commit&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\gsh&lt;/tt&gt; Git push&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\gs&lt;/tt&gt; Git status&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\gd&lt;/tt&gt; Git diff&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\gr&lt;/tt&gt; Git remove&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\S&lt;/tt&gt; Remove todos os espaços do final&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;\c&lt;/tt&gt; Lista controle de versao do buffer&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/imJdimDJAsg" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/12/22/vim-ide-para-programadores-python</feedburner:origLink></entry><entry><title>Google Nexus S, atualização oficial para Android 4.0 (Ice Cream Sandwich)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/AHJr6dY2zOI/google-nexus-s-atualizacao-oficial-para-android-40" rel="alternate" /><updated>2011-12-17T22:48:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-12-17:2011/12/17/google-nexus-s-atualizacao-oficial-para-android-40</id><summary type="html">&lt;p&gt;Dia 16/12/2011 o Google lançou oficialmente a atualização do aparelho
Nexus S para Ice Cream Sandwich (Android 4.0), a noticia saiu no Twitter
oficial do &lt;a class="reference external" href="https://twitter.com/#!/googlenexus/status/147783081426817024"&gt;Google Nexus&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="para-voce-atualizar-o-seu-nexus-s-faca-o-seguinte-procedimento"&gt;
&lt;h2&gt;Para você atualizar o seu Nexus S faça o seguinte procedimento:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;1&lt;/tt&gt; - Faça download da imagem do Android 4.0 para o Nexus S no
seguinte link:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://android.clients.google.com/packages/ota/google_crespo/VQ8PQk_V.zip"&gt;http://android.clients.google.com/packages/ota/google_crespo/VQ8PQk_V.zip&lt;/a&gt;
ou &lt;a class="reference external" href="http://dl.dropbox.com/u/763381/VQ8PQk_V.zip"&gt;http://dl.dropbox.com/u/763381/VQ8PQk_V.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;2&lt;/tt&gt; - Coloque o &lt;tt class="docutils literal"&gt;VQ8PQk_V.zip&lt;/tt&gt; SD do seu Nexus S e você deve
renomear o arquivo para &lt;tt class="docutils literal"&gt;update.zip&lt;/tt&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;3&lt;/tt&gt; - Desligue o seu aparelho&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;4&lt;/tt&gt; - Aperte o botão do &lt;tt class="docutils literal"&gt;volume&lt;/tt&gt; para cima + o botão &lt;tt class="docutils literal"&gt;power&lt;/tt&gt;,
seu celular vai iniciar no modulo &lt;tt class="docutils literal"&gt;fastboot&lt;/tt&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;5&lt;/tt&gt; - Selecione a opção &lt;tt class="docutils literal"&gt;recovery&lt;/tt&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;6&lt;/tt&gt; - Vai começa carregar e aparecera um &lt;tt class="docutils literal"&gt;triângulo&lt;/tt&gt; com um
&lt;tt class="docutils literal"&gt;!&lt;/tt&gt;, nessa tela você deve aperta o botão &lt;tt class="docutils literal"&gt;power&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;volume&lt;/tt&gt;
para cima (&lt;tt class="docutils literal"&gt;Deve ser na sequência relatado no post&lt;/tt&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;7&lt;/tt&gt; - Vai aparecer um menu onde você deve selecionar a seguinte
opção &lt;tt class="docutils literal"&gt;Apply update from /sdcard&lt;/tt&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;8&lt;/tt&gt; - Após instalar você deve selecionar &lt;tt class="docutils literal"&gt;reboot system now&lt;/tt&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;tt class="docutils literal"&gt;9&lt;/tt&gt; - Pronto, &lt;tt class="docutils literal"&gt;Android 4.0.3&lt;/tt&gt; instalado no seu Nexus S&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quando o seu celular for ligar a primeira vez com Android 4.0 ele vai
ficar um pouco lento pois vai refazer o &lt;tt class="docutils literal"&gt;dalvik cache&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Lembrando que você tem que ter a versão do Android oficial do Google instalado no seu Nexus S, caso não esteja não vai conseguir fazer os procedimentos, pois estamos atualizando para a versão oficial do Google.&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;O Google vai liberar aos poucos a atualização automatica para os Nexus S
pois se não vai acabar com o link das operadoras, no Brasil
principalmente que nosso 3G é um 2G.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/AHJr6dY2zOI" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/12/17/google-nexus-s-atualizacao-oficial-para-android-40</feedburner:origLink></entry><entry><title>Nova versão da API do Dropbox</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/sp_J-I1AiXE/nova-versao-da-api-do-dropbox" rel="alternate" /><updated>2011-10-13T22:47:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-10-13:2011/10/13/nova-versao-da-api-do-dropbox</id><summary type="html">&lt;p&gt;Dia 14.09.2011 o Dropbox lançou a nova versão 1.0 da API, nesse
lançamento trouxe muitas novidades e melhorias:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Suporte para aplicações web&lt;/li&gt;
&lt;li&gt;Suporte para criação de pasta (Na versão 0.1 da API não tinha)&lt;/li&gt;
&lt;li&gt;Novo site para desenvolvedores, com documentação simples e completa
&lt;a class="reference external" href="https://www.dropbox.com/developers_beta"&gt;https://www.dropbox.com/developers_beta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Melhor compartilhamento de arquivo, streaming, busca por arquivo e
suporte para revisão de arquivo&lt;/li&gt;
&lt;li&gt;Implementação no controle de nomes de arquivos, para não sobrescrever
arquivos já salvo&lt;/li&gt;
&lt;li&gt;SDK atualizado para iOS, Android, Python, Ruby e Java que implementa
todas modificações e documentação&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Link do repositorio (Python Pypi) da nova biblioteca
&lt;a class="reference external" href="http://pypi.python.org/pypi/dropbox/1.1"&gt;http://pypi.python.org/pypi/dropbox/1.1&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O dropbox implementou um oauth onde podemos desenvolver software e&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/nova-versao-da-api-do-dropbox.rst&lt;/tt&gt;, line 26)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;fazer o usuário usar a conta de dropbox dele para armazenamento de
arquivos:
|  &lt;img alt="OAuth Dropbox" src="https://www.dropbox.com/static/images/oauth.png" /&gt;&lt;/p&gt;
&lt;p&gt;Vou falar um pouco sobre 3 metodos que esta dentro da biblioteca
&amp;quot;dropbox&amp;quot; client, rest e session:&lt;/p&gt;
&lt;p&gt;Com o metodo session é por onde tudo começa, onde você linka o seu
software com uma conta Dropbox, exemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Include the Dropbox SDK libraries
from dropbox import session

# Get your app key and secret from the Dropbox developer website
APP_KEY = 'INSERT_APP_KEY_HERE'
APP_SECRET = 'INSERT_SECRET_HERE'

# ACCESS_TYPE should be 'dropbox' or 'app_folder' as configured for your app
ACCESS_TYPE = 'INSERT_ACCESS_TYPE_HERE'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
&lt;/pre&gt;
&lt;p&gt;Caso esteja usando a conta do Dropbox do usuário podemos pegar
informações da conta dele:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
client = client.DropboxClient(sess)
print &amp;quot;linked account:&amp;quot;, client.account_info()
&lt;/pre&gt;
&lt;p&gt;Agora usando o metodo &amp;quot;client&amp;quot; podemos fazer get e put de arquivos:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
from dropbox import client
f = open('working-draft.txt')
response = client.put_file('/magnum-opus.txt', f)
print &amp;quot;uploaded:&amp;quot;, response
&lt;/pre&gt;
&lt;p&gt;Após criar o arquivos podemos ler ele:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
print client.get_file('/magnum-opus.txt').read()
&lt;/pre&gt;
&lt;p&gt;Reescrever o arquivo com uma nova revisão para criar um novo arquivo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
out = open('magnum-opus.txt', 'w')
out.write(client.get_file('/magnum-opus.txt',rev='362e2029684fe').read())
&lt;/pre&gt;
&lt;p&gt;Para trabalhar com REST temos um ótima documentação
&lt;a class="reference external" href="https://www.dropbox.com/developers_beta/reference/api"&gt;https://www.dropbox.com/developers_beta/reference/api&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/sp_J-I1AiXE" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/10/13/nova-versao-da-api-do-dropbox</feedburner:origLink></entry><entry><title>Problema com hashlib + md5 (Python 2.7)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/0pZzRoI95Nw/problema-com-hashlib-md5-python-27" rel="alternate" /><updated>2011-10-04T22:46:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-10-04:2011/10/04/problema-com-hashlib-md5-python-27</id><summary type="html">&lt;p&gt;Estava com o seguinte problema &amp;quot;Error: No module named _md5&amp;quot;,
primeiramente pensei que fosse problema de de compilação do Python, mas
olhando o problema proximo achei alguns artigo falando desse problema e
um deles estava no &lt;a class="reference external" href="http://bugs.python.org/msg109485"&gt;bug.python.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A solução que cheguei foi, criar uma lib chamada &amp;quot;_md5&amp;quot;, criei um
arquivo chamado &amp;quot;_md5py&amp;quot;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class _md5:
    def __init__():
        import md5
        return md5
&lt;/pre&gt;
&lt;p&gt;Lendo as documentação vi que a lib &amp;quot;hashlib._md5&amp;quot; foi deprecada pois a
md5 ficou no lugar. Espero que ajude outras pessoas que esta com esse
problema.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/0pZzRoI95Nw" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/10/04/problema-com-hashlib-md5-python-27</feedburner:origLink></entry><entry><title>Porque fazer teste unitario em javascript?</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/ex5XRDvDU1g/porque-fazer-teste-unitario-em-javascript" rel="alternate" /><updated>2011-07-21T22:45:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-07-21:2011/07/21/porque-fazer-teste-unitario-em-javascript</id><summary type="html">&lt;p&gt;É complicado confiar em um software que não tem teste unitario. Hoje
estava escrevendo alguns códigos em JavaScript e resolvi escrever esse
post pois muitos desenvolvedores JavaScript não costumam testar seus
códigos.&lt;/p&gt;
&lt;p&gt;QUnit é um Framework open source de teste unitário para JavaScript. Ele
foi desenvolvido para fazer teste unitários no desenvolvimento do
próprio Jquery, mas é capaz de testar qualquer código Javascript (Até
mesmo testar código Javascript do lado do servidor NodeJS).&lt;/p&gt;
&lt;p&gt;Segue abaixo o exemplo de uma implementação simples:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script&amp;gt;
    function calc(val1, val2, oper){
      val1 = typeof val1 == 'undefined' ? 0 : val1
      val2 = typeof val2 == 'undefined' ? 0 : val2
      oper = typeof oper == 'undefined' ? &amp;quot;+&amp;quot; : oper

      if(oper == &amp;quot;+&amp;quot;)
        cal = val1 + val2
      else if(oper == &amp;quot;-&amp;quot;)
        cal = val1 - val2
      else
        cal = false

      return cal
    }
  &amp;lt;/script&amp;gt;

  &amp;lt;script&amp;gt;
    $(document).ready(function(){

      module(&amp;quot;Test render html&amp;quot;)
      test(&amp;quot;test valor in #test1&amp;quot;, function(){
        equals(&amp;quot;ok ok ok&amp;quot;, $(&amp;quot;#test1&amp;quot;).html())
        notEqual(&amp;quot;ok ok ok &amp;quot;, $(&amp;quot;#test1&amp;quot;).html())
      })

      module(&amp;quot;Test function calc()&amp;quot;)
      test(&amp;quot;test basic return 10&amp;quot;, function(){
        equals(10, calc(10))
        notEqual(10, calc(11))
      })

      test(&amp;quot;test basic sum 2 parameter&amp;quot;, function(){
        equals(20, calc(10, 10))
        notEqual(21, calc(10, 10))
        deepEqual(20, calc(10, 10))
        notStrictEqual(&amp;quot;20&amp;quot;, calc(10, 10))
      })

      test(&amp;quot;set operator +&amp;quot;, function(){
        equals(20, calc(10, 10, &amp;quot;+&amp;quot;))
        equals(false, calc(10, 10, &amp;quot;...&amp;quot;))
      })

      test(&amp;quot;set operator -&amp;quot;, function(){
        equals(1, calc(10, 9, &amp;quot;-&amp;quot;))
      })

    })
  &amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;
  &amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;
  &amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;
  &amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;
  &amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;

  &amp;lt;div id=&amp;quot;test1&amp;quot;&amp;gt;ok ok ok&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;No código acima estou fazendo dois tipos de testes: um módulo de item
renderizado na página, e outro módulo de teste de uma função de cálculo.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Segue abaixo o print de como ficou o test:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;img alt="Alt text" src="http://s1.i1.picplzthumbs.com/upload/img/16/3f/a6/163fa61700835d5c6527f30c407f5815f206e47b_wmlg.jpg" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/ex5XRDvDU1g" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/07/21/porque-fazer-teste-unitario-em-javascript</feedburner:origLink></entry><entry><title>Template Django com Haml</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/cAghgnogfLs/template-django-com-haml" rel="alternate" /><updated>2011-05-28T22:44:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-05-28:2011/05/28/template-django-com-haml</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://haml-lang.com/"&gt;Haml&lt;/a&gt; (HTML Abstraction Markup Language) é uma linguagem simples, que
é usado para descrever XHTML de qualquer documento web sem precisar
ficar abrindo e fechando tags HTML. Ele foi projetado para resolver
muitos dos problemas de templates, bem como fazer marcação tão elegante
como ela pode ser.&lt;/p&gt;
&lt;p&gt;Em Python temos a biblioteca &lt;a class="reference external" href="https://github.com/jessemiller/HamlPy"&gt;HamlPy&lt;/a&gt; ela pega os files HAML e gera o
HTML para usarmos em nossos sistemas.&lt;/p&gt;
&lt;p&gt;Vamos logo para a pratica, chega de lero lero.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
%html{'xmlns':&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;, 'lang':&amp;quot;en&amp;quot;, &amp;quot;xml:lang&amp;quot;:&amp;quot;en&amp;quot;}
  %head

    %title Testando Haml

    %style{'type': 'text/css'}
      body{font-family: verdana;}

    %script{'type':'text/javascript', 'src':'https://www.google.com/jsapi?key=ABQIAAAAUgaJsDgRTDbR5vvhnJ3iYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxS2j2XMXVpjyqg8A7TkHl2W04abvA'}
    %script{'type': 'text/javascript'}
      google.load(&amp;quot;jquery&amp;quot;, &amp;quot;1.6.1&amp;quot;);

  %body
    #header
      %h1#lero
        .test Haml
        %ul.navigation
          - for run in varloop
            %li= run
    #content
      Testando para ver se funciona o HamlPy
&lt;/pre&gt;
&lt;p&gt;Esse é um layout feito com haml, é muito simples pois não precisamos
ficar fechando as tags, assim os erros de html é 100% resolvido, como
converte o haml para html:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
/Users/avelino/.virtualenvs/haml/bin/hamlpy template/index.haml template/index.html
&lt;/pre&gt;
&lt;p&gt;O binario &lt;em&gt;hamlpy&lt;/em&gt; recebe dois parâmetros o primeiro é o input file haml
o segunda é o output a saída html, depois de rodarmos o hamlpy temos uma
saida da seguinte forma:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;html lang='en' xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Testando Haml&amp;lt;/title&amp;gt;
    &amp;lt;style type='text/css'&amp;gt;
      body{font-family: verdana;}
    &amp;lt;/style&amp;gt;
    &amp;lt;script src='https://www.google.com/jsapi?key=ABQIAAAAUgaJsDgRTDbR5vvhnJ3iYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxS2j2XMXVpjyqg8A7TkHl2W04abvA' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type='text/javascript'&amp;gt;
      google.load(&amp;quot;jquery&amp;quot;, &amp;quot;1.6.1&amp;quot;);
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id='header'&amp;gt;
      &amp;lt;h1 id='lero'&amp;gt;
        &amp;lt;div class='test'&amp;gt;Haml&amp;lt;/div&amp;gt;
        &amp;lt;ul class='navigation'&amp;gt;
          {% for run in varloop %}
            &amp;lt;li&amp;gt;{{ run }}&amp;lt;/li&amp;gt;
          {% endfor %}
        &amp;lt;/ul&amp;gt;
      &amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id='content'&amp;gt;
      Testando para ver se funciona o HamlPy
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Minha views do Django declaro sempre com o arquivo .html que foi gerado
com o hamlpy. Veja como ficou o meu views:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# -*- coding: utf-8 -*-
&amp;quot;&amp;quot;&amp;quot;
    views

    :copyright: (c) 2011 by the Avelino Labs, see Thiago Avelino &amp;lt;thiago&amp;#64;avelino.us&amp;gt; for more details.
    :license: BSD, see LICENSE for more details.
&amp;quot;&amp;quot;&amp;quot;

from django.shortcuts import render_to_response
from django.template import RequestContext

def index(request):
    return render_to_response(
            'index.html',
            context_instance=RequestContext(request))
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/cAghgnogfLs" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/05/28/template-django-com-haml</feedburner:origLink></entry><entry><title>Entendendo na pratica como funciona a linguagem Go</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/1YHjJh0hf80/entendendo-na-pratica-como-funciona-linguagem-go" rel="alternate" /><updated>2011-05-25T22:14:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-05-25:2011/05/25/entendendo-na-pratica-como-funciona-linguagem-go</id><summary type="html">&lt;p&gt;A linguagem Go é um projeto open source para tornar os programadores
mais produtivos.&lt;/p&gt;
&lt;p&gt;Go foi desenvolvido para utilização maxima do CPU, tornando um processo
simples para criar aplicação Multithreaded, o processo de utilização de
maquinas na rede para processar determinado programa também é bem
simples, assim tornando um software mais flexível e modular.&lt;/p&gt;
&lt;p&gt;Vamos montar um servidor HTTPD em Go.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
package main

import (
    &amp;quot;http&amp;quot;;
    &amp;quot;io&amp;quot;;
    &amp;quot;fmt&amp;quot;;
)

func HelloServer(c *http.Conn, req *http.Request) {
    io.WriteString(c, &amp;quot;hello, world!\n&amp;quot;);
}

func main() {
    fmt.Printf(&amp;quot;http://localhost:8080/hello\n&amp;quot;);
    http.Handle(&amp;quot;/hello&amp;quot;, http.HandlerFunc(HelloServer));
    err := http.ListenAndServe(&amp;quot;:8080&amp;quot;, nil);
    if err != nil {
        panic(&amp;quot;ListenAndServe: &amp;quot;, err.String())
    }
}
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O &lt;em&gt;HelloServer()&lt;/em&gt; é o que vai fazer a parte de renderização, o &lt;em&gt;man()&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/entendendo-na-pratica-como-funciona-linguagem-go.rst&lt;/tt&gt;, line 42)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;ele sobre o servidor HTTP na porta 8080, e caso o usuário tente
processar um URL que não esteja no &lt;em&gt;fmt&lt;/em&gt; ele vai cair no &lt;em&gt;err&lt;/em&gt; onde vai
processar o erro e apresentar o &lt;em&gt;panic&lt;/em&gt;.
|  Simples assim já temos um servidor HTTP para toda HTTP.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/1YHjJh0hf80" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/05/25/entendendo-na-pratica-como-funciona-linguagem-go</feedburner:origLink></entry><entry><title>[TOPICOFF] Site fora do ar, DataCenter tirando meu sono</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/YYSe1IQhOtk/topicoff-site-fora-do-ar-datacenter-tirando-meu-so" rel="alternate" /><updated>2011-04-29T22:44:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-04-29:2011/04/29/topicoff-site-fora-do-ar-datacenter-tirando-meu-so</id><summary type="html">&lt;p&gt;Peço 1001 desculpas por o Avelino.US ter ficado fora do ar durante os
últimos 4 dias.&lt;/p&gt;
&lt;p&gt;Depois de 8 mês o DataCenter onde estava meu site ele colocou algumas
regrar para serviço contratado daquela data para frente e depois de 2
mês o DataCenter lançou a regra para os que já tinha servidor alugado,
ou seja, todos os IP do servidor caiu.&lt;/p&gt;
&lt;p&gt;Migramos de DataCenter e não vai mais ocorrer esse tipo de problema.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/YYSe1IQhOtk" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/04/29/topicoff-site-fora-do-ar-datacenter-tirando-meu-so</feedburner:origLink></entry><entry><title>Upload da arquivo no Google App Engine (BlobProperty)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/QcOYS5OMMIU/upload-da-arquivo-no-google-app-engine-blobpropert" rel="alternate" /><updated>2011-04-23T22:43:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-04-23:2011/04/23/upload-da-arquivo-no-google-app-engine-blobpropert</id><summary type="html">&lt;p&gt;Essa semana que passou tive uma necessidade para um sistema de trabalhar
com UPLOAD de arquivos, ate ai é simples, só que o sistema estava em
Google App Engine, depois de apanhar um pouco resolvi fazer um post aqui
no Blog para deixar documentado como não é complicado trabalhar com
&lt;em&gt;BlobProperty&lt;/em&gt; no &lt;em&gt;BigTable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Primeiro vamos criar um Modal onde vai ter dois campo o arquivo e o
mimetype dele:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class DatastoreFile(db.Model):
    data = db.BlobProperty(required=True)
    mimetype = db.StringProperty(required=True)
&lt;/pre&gt;
&lt;p&gt;Agora vamos criar a views onde ele vai processar o formulario e o POST
do formulario:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write(template.render(&amp;quot;upload.html&amp;quot;, {}))

    def post(self):
        file = self.request.POST['file']

        entity = DatastoreFile(data=file.value, mimetype=file.type)
        entity.put()

        file_url = &amp;quot;http://%s/%d/%s&amp;quot; % (self.request.host, entity.key().id(), file.name)
        self.response.out.write(&amp;quot;Your uploaded file is now available at %s&amp;quot; % (file_url,))
&lt;/pre&gt;
&lt;p&gt;Podemos notar que na definição get() temos apenas a renderização do
&amp;quot;upload.html&amp;quot;, o conteudo dele é bem simples, temos um input do tipo
file e outro submit:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;File Upload&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;/&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;
    &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;file&amp;quot; /&amp;gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload&amp;quot; /&amp;gt;
  &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Falando da definição post() que esta na classe MainHandler ela que faz o
trabalho de fazer o UPLOAD do arquivo para dentro do &lt;em&gt;BlobProperty&lt;/em&gt;, é
um processo bem simples, a variável &amp;quot;file&amp;quot; recebe o POST do input file,
depois disso chamamos o modal que tem o nome de DatastoreFile passando
dois parâmetros que é os dois campos criados, o data e mimetype, depois
disso é só fazer o put() que seja salvo no banco de dados. Dentro do
post() eu gero o link para download do arquivo na variável file_url,
onde passo o HOST (url do sistema), id() (do arquivo que foi feito
upload) e file name (Nome do campo que recebeu o arquivo).&lt;/p&gt;
&lt;p&gt;Agora temos que fazer a classe para download do arquivo onde vamos mudar
o Content-Type do response para o mime-type do arquivo que foi feito o
upload, exemplo: fiz o upload de um arquivo no formato JPG o mime type
dele é &amp;quot;image/jpeg&amp;quot;, então tenho que fazer o responser renderizar em
formatado &amp;quot;image/jpeg&amp;quot;.&lt;/p&gt;
&lt;p&gt;Na URL que montamos para download passamos a seguinte informação id e
file name onde temos que criar uma definição get() que receba essas
informações:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class DownloadHandler(webapp.RequestHandler):
    def get(self, id, filename):
        entity = DatastoreFile.get_by_id(int(id))
        self.response.headers['Content-Type'] = entity.mimetype
        self.response.out.write(entity.data)
&lt;/pre&gt;
&lt;p&gt;Recebendo as duas variáveis podemos fazer um consulta no BigTable de
forma simples onde busco o id, pego o retorno do banco de dados e coloco
que o response.headers['Content-Type'] é o mime-type que esta salvo no
banco e depois é só escrever o arquivo na tela.&lt;/p&gt;
&lt;p&gt;Agora vamos criar as rotas da URL:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
def main():
    application = webapp.WSGIApplication([
        ('/', MainHandler),
        ('/(\d+)/(.*)', DownloadHandler)
        ],debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()
&lt;/pre&gt;
&lt;p&gt;Quem ainda estiver com duvida pode dar uma olhar no repositorio:
&lt;a class="reference external" href="https://bitbucket.org/avelino/post_py_upload_de_arquivo_no_gae/src"&gt;https://bitbucket.org/avelino/post_py_upload_de_arquivo_no_gae/src&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/QcOYS5OMMIU" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/04/23/upload-da-arquivo-no-google-app-engine-blobpropert</feedburner:origLink></entry><entry><title>Criando sistema com Multithreaded em Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/twqDAcJLiX0/criando-sistema-com-multithreaded-em-python" rel="alternate" /><updated>2011-04-01T22:43:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-04-01:2011/04/01/criando-sistema-com-multithreaded-em-python</id><summary type="html">&lt;p&gt;Multithreaded é quando temos mais de um programa executando ao mesmo
tempo, totalmente diferente de executar duas vez o mesmo programa, com
&amp;quot;threads&amp;quot; o sistema vai ser executado apenas uma vez e via thread vai
processar mais de uma função ao mesmo tempo, isso é necessario para
concorrência em sistema.&lt;/p&gt;
&lt;p&gt;Algumas vantagens de trabalha com threads:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Múltiplos processo ao mesmo tempo e pode, portanto, compartilhar
informações e comunicar uns com os outros mais facilmente do que se
fossem processos separados;&lt;/li&gt;
&lt;li&gt;Menos consumo de memória, pois o mesmo vai consumir mais CPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uma thread tem um começo, meio e fim, assim podemos colocar um ponteiro
de instrução para acompanhar onde esta sendo processado cada thread
dentro de seu contexto.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ela pode ser antecipada (interrompido);&lt;/li&gt;
&lt;li&gt;Pode ser temporariamente suspensos (também conhecido como sleep),
enquanto outros segmentos estão em execução - isso é chamado de
rendimento.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Iniciando uma nova Thread:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import thread
import time

# Definição da função de thread
def print_time( name, delay):
    count = 0
    while count &amp;lt; 5:
        time.sleep(delay)
        count += 1
        print &amp;quot;%s: %s&amp;quot; % ( name, time.ctime(time.time()) )

# Criar dois tópicos
try:
    thread.start_new_thread( print_time, (&amp;quot;Thread-1&amp;quot;, 2, ) )
    thread.start_new_thread( print_time, (&amp;quot;Thread-2&amp;quot;, 4, ) )
except:
    print &amp;quot;Erro: não conseguiu iniciar a thread&amp;quot;

while 1:
    pass
&lt;/pre&gt;
&lt;p&gt;Executando:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
avelino:multithreading/ [11:01:01] $ python example.py
Thread-1: Thu Mar 31 11:03:20 2011
Thread-2: Thu Mar 31 11:03:22 2011
Thread-1: Thu Mar 31 11:03:22 2011
Thread-1: Thu Mar 31 11:03:24 2011
Thread-2: Thu Mar 31 11:03:26 2011
Thread-1: Thu Mar 31 11:03:26 2011
Thread-1: Thu Mar 31 11:03:28 2011
Thread-2: Thu Mar 31 11:03:30 2011
Thread-2: Thu Mar 31 11:03:34 2011
Thread-2: Thu Mar 31 11:03:38 2011
&lt;/pre&gt;
&lt;p&gt;Se repararmos temos alguns processo concorrendo ao mesmo tempos, dessa
forma já estamos trabalhando com Thread.&lt;/p&gt;
&lt;div class="section" id="modulos-da-biblioteca-thread"&gt;
&lt;h2&gt;Modulos da biblioteca thread&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;em&gt;threading.activeCount()&lt;/em&gt;: Retorna o número de objetos de thread que
estão ativos.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;threading.currentThread()&lt;/em&gt;: Retorna o número de objetos de thread no
controle do chamador de thread.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;threading.enumerate()&lt;/em&gt;: Retorna uma lista de todos os objetos de
thread que estão atualmente activas.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;run()&lt;/em&gt;: Método é o ponto de partida para uma thread.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;start()&lt;/em&gt;: Método inicia uma thread, chamando o método de execução.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;join([time])&lt;/em&gt;: Espera para terminar.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;isAlive()&lt;/em&gt;: Método verifica se uma thread ainda está em execução.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;getName()&lt;/em&gt;: Método retorno o nome de uma thread.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;setName()&lt;/em&gt;: Método declaro o nome de um thread.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/twqDAcJLiX0" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/04/01/criando-sistema-com-multithreaded-em-python</feedburner:origLink></entry><entry><title>Trabalhando com Python e MongoDB</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/5p0Xp3J0-gc/trabalhando-com-python-e-mongodb" rel="alternate" /><updated>2011-03-28T22:40:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-03-28:2011/03/28/trabalhando-com-python-e-mongodb</id><summary type="html">&lt;p&gt;Hoje MongoDB está começando ficar bem comentado na internet (famosos
Database NoSQL). Tenho bastante aplicações em produção trabalhando com
MongoDB e outros database NoSQL ambas escrita em Python, vou escrever um
pouco como usar o MongoDB na linguagem Python.&lt;/p&gt;
&lt;p&gt;Como em qualquer outra linguagem, não tem muito segredo. No Python temos
a LIB chamada PyMongo, que simplifica muito o trabalho do programador.&lt;/p&gt;
&lt;p&gt;Contando que o PyMongo já estejá instalado, seguimos em frente.&lt;/p&gt;
&lt;p&gt;Como fazer um conexão:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; from pymongo import Connection
&amp;gt;&amp;gt;&amp;gt; connection = Connection()
&lt;/pre&gt;
&lt;p&gt;OU&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; connection = Connection('localhost', 27017)
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Usar/Criar um Database:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;gt;&amp;gt;&amp;gt; db = connection.forum_database&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OU&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; db = connection['forum-database']
&lt;/pre&gt;
&lt;p&gt;O MongoDB usa um formato jSON para sua syntax, veja abaixo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; forum = {&amp;quot;author&amp;quot;: &amp;quot;Thiago Avelino&amp;quot;,
...         &amp;quot;text&amp;quot;: &amp;quot;Python e MongoDB&amp;quot;,
...         &amp;quot;tags&amp;quot;: [&amp;quot;mongodb&amp;quot;, &amp;quot;python&amp;quot;, &amp;quot;pymongo&amp;quot;]}
&lt;/pre&gt;
&lt;p&gt;Inserindo em um Documento, usando o método insert():&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; imaster = db.imaster
&amp;gt;&amp;gt;&amp;gt; imaster.insert(forum)
ObjectId('4c7400f42d73303fd2000000')
&lt;/pre&gt;
&lt;p&gt;Após rodar o insert() ele criou um documento fisico no servidor, podemos
ver este registro da seguinte forma:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; db.collection_names()
[u'imaster', u'system.indexes']
&lt;/pre&gt;
&lt;p&gt;Selecionando apenas um documento com find_one()&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; imaster.find_one()
{u'text': u'Python e MongoDB', u'_id': ObjectId('4c7400f42d73303fd2000000'), u'author': u'Thiago Avelino', u'tags': [u'mongodb', u'python', u'pymongo']}
&lt;/pre&gt;
&lt;p&gt;Filtrando, usando condições para selecionar:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; imaster.find_one({&amp;quot;author&amp;quot;: &amp;quot;Thiago Avelino&amp;quot;})
{u'text': u'Python e MongoDB', u'_id': ObjectId('4c7400f42d73303fd2000000'), u'author': u'Thiago Avelino', u'tags': [u'mongodb', u'python', u'pymongo']}
&lt;/pre&gt;
&lt;p&gt;Contando:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; imaster.count()
1
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Temos também alguns ORM Python que trabalha com o MongoDB, um exemplo&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/trabalhando-com-python-e-mongodb.rst&lt;/tt&gt;, line 86)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;é o MongoEngine que trabalha exatamente igual o ORM do Django.
|  Veja um exemplo usando MongoEngine:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class BlogPost(Document):
    title = StringField(required=True, max_length=200)
    posted = DateTimeField(default=datetime.datetime.now)
    tags = ListField(StringField(max_length=50))

class TextPost(BlogPost):
    content = StringField(required=True)

class LinkPost(BlogPost):
    url = StringField(required=True)

# Create a text-based post
&amp;gt;&amp;gt;&amp;gt; post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
&amp;gt;&amp;gt;&amp;gt; post1.tags = ['mongodb', 'mongoengine']
&amp;gt;&amp;gt;&amp;gt; post1.save()

# Create a link-based post
&amp;gt;&amp;gt;&amp;gt; post2 = LinkPost(title='MongoEngine Docs', url='hmarr.com/mongoengine')
&amp;gt;&amp;gt;&amp;gt; post2.tags = ['mongoengine', 'documentation']
&amp;gt;&amp;gt;&amp;gt; post2.save()

# Iterate over all posts using the BlogPost superclass
&amp;gt;&amp;gt;&amp;gt; for post in BlogPost.objects:
...     print '===', post.title, '==='
...     if isinstance(post, TextPost):
...         print post.content
...     elif isinstance(post, LinkPost):
...         print 'Link:', post.url
...     print
...
=== Using MongoEngine ===
See the tutorial

=== MongoEngine Docs ===
Link: hmarr.com/mongoengine

&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects)
2
&amp;gt;&amp;gt;&amp;gt; len(HtmlPost.objects)
1
&amp;gt;&amp;gt;&amp;gt; len(LinkPost.objects)
1

# Find tagged posts
&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects(tags='mongoengine'))
2
&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects(tags='mongodb'))
1
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/5p0Xp3J0-gc" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/03/28/trabalhando-com-python-e-mongodb</feedburner:origLink></entry><entry><title>Certificado EV SSL</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/t4qJUlGZO2c/certificado-ev-ssl" rel="alternate" /><updated>2011-03-28T22:39:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-03-28:2011/03/28/certificado-ev-ssl</id><summary type="html">&lt;p&gt;Certificados Digitais EV SSL, ou em português SSL de Validação Avançada,
são certificados qualificados que se apresentam aos usuários da Internet
de forma distinta dos demais certificados, garantindo assim aos usuários
que o site acessado possui um certificado SSL emitido segundo um
processo altamente seguro e verificado através de uma auditoria.&lt;/p&gt;
&lt;div class="section" id="historia"&gt;
&lt;h2&gt;História&lt;/h2&gt;
&lt;p&gt;O Comércio via Internet está enfrentando uma crise de segurança. A
confiança na segurança de sites está diminuindo, e o número de
consumidores que estão deixando de fazer transações on-line está
aumentando. Segundo o instituto Forrester Research, ao final de 2005,
24% dos usuários de Internet não compraria via web para os feriados de
final de ano pois não se sentiam seguros e 61% reportou que haviam
reduzido as compras online por algum motivo.&lt;/p&gt;
&lt;p&gt;Agora em 2007 empresas com operações online poderão mostrar
definitivamente sua identidade para os seus clientes – e os clientes
poderão confirmar esta identidade antes de confiar no site. Essa
oportunidade se deve ao resultado da grande evolução no backbone de
segurança WEB nos últimos 10 anos. É a introdução de um novo tipo de
certificado SSL, o primeiro desde a origem desta tecnologia há mais de
uma década atrás.&lt;/p&gt;
&lt;p&gt;Estes novos certificados são chamados Certificados Extended Validation
SSL e eles representam mais de um ano de esforços feitos pelo CA/Browser
Fórum, um consórcio de empresas líderes em manutenção de Browser e
Autoridades Certificadoras de SSL. Os Certificados EV SSL irão facilitar
o comércio online em todas as suas formas, aumentando a confiança dos
usuários, legitimando sites e reduzindo significativamente a eficácia
dos ataques de fraude e roubo de senha.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ev-ssl-no-brasil"&gt;
&lt;h2&gt;EV SSL no Brasil&lt;/h2&gt;
&lt;p&gt;No Brasil o certificado está sendo comercializado pela Certisign,
Unicert, Comodo e Secsign. Até o final do ano estima-se que do total de
vendas de certificados para servidores, 20% sejam no modelo EV SSL.
Segundo a projeção da Certisign, isso significa a venda de quase 4.500
certificados.&lt;/p&gt;
&lt;p&gt;Espera-se que no prazo de dois anos todas as empresas que se prestam a
realizar transações on-line (como sites de e-commerce, bancos, etc...)
adotem este produto, pois ele garante identificação visual, maior
segurança e conforto para o consumidor.&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/t4qJUlGZO2c" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/03/28/certificado-ev-ssl</feedburner:origLink></entry><entry><title>Coding Dojo o melhor lugar para pratica Programação</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/vhMX-9xoewk/coding-dojo-o-melhor-lugar-para-pratica-programaca" rel="alternate" /><updated>2011-02-21T22:38:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-02-21:2011/02/21/coding-dojo-o-melhor-lugar-para-pratica-programaca</id><summary type="html">&lt;p&gt;Nós da Comunidade Python São Paulo estamos no 10' Dojo.&lt;/p&gt;
&lt;p&gt;Parabéns a todos os organizadores e participantes.&lt;/p&gt;
&lt;p&gt;Agradeço a todas as empresa que abriu a porta para nós da Comunidade
Python São Paulo poder realizar o Coding Dojo.&lt;/p&gt;
&lt;p&gt;Dojo é uma reunião onde um grupo de programadores se reúnem para
trabalhar em um desafio de programação. Eles estão lá para se divertir e
se envolver em prática a fim de melhorar suas habilidades.&lt;/p&gt;
&lt;p&gt;Veja a baixo videos gravado no 10' Dojo da Comunidade Python São Paulo
onde foi realizado na empresa &lt;a class="reference external" href="http://www.gonow.com.br/"&gt;Gonow Tecnologia&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;object height="300" width="500"&gt;&lt;embed src="http://www.youtube.com/v/-hZkXKqXCh8?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;object height="300" width="500"&gt;&lt;embed src="http://www.youtube.com/v/jh8YA8fX3xA?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.gonow.com.br/blog/2011/02/17/gonow-sedia-decimo-encontro-dojo-da-comunidade-python/"&gt;Veja o post completo que foi postado no Blog da Gonow.&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/vhMX-9xoewk" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/02/21/coding-dojo-o-melhor-lugar-para-pratica-programaca</feedburner:origLink></entry><entry><title>Meu ambiente de trabalho em 7 itens</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/VzQjqch82R8/meu-ambiente-de-trabalho-em-7-itens" rel="alternate" /><updated>2011-02-20T22:37:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-02-20:2011/02/20/meu-ambiente-de-trabalho-em-7-itens</id><summary type="html">&lt;p&gt;O &lt;a class="reference external" href="http://blog.licio.eti.br/"&gt;Licio&lt;/a&gt; me convidou para entrar no&amp;nbsp;ritmo&amp;nbsp;dos &amp;quot;7 itens&amp;quot; então vamos
lá...&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;GIT + Mercurial&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Geralmente procuro usar Mercurial no&amp;nbsp;&lt;a class="reference external" href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; mas costumo usar&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 13)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;bastante &lt;a class="reference external" href="http://git-scm.com/"&gt;Git&lt;/a&gt; no &lt;a class="reference external" href="https://github.com/"&gt;Github&lt;/a&gt;. Uso o Github porque vejo ele muito mais
do que um espaço para criar repositórios, e sim uma rede social de
Desenvolvedor.&lt;/p&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;VIM&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Depois de muito testar o &lt;a class="reference external" href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;, &lt;a class="reference external" href="http://macromates.com/"&gt;TextMate&lt;/a&gt; e &lt;a class="reference external" href="http://www.vim.org/"&gt;VIM&lt;/a&gt;, resolvi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 23)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;afirma que para mim o melhor é o VIM, consigo fazer tudo que preciso
e não tenho tantos problemas com &amp;quot; como no TextMate. Falando um pouco
sobre o Emacs, realmente é um&amp;nbsp;ótimo&amp;nbsp;editor, só que cansa brincar
de&amp;nbsp;&lt;a class="reference external" href="http://www.streetfighter.com/"&gt;street fighter&lt;/a&gt; quando vou &amp;nbsp;programar (Para os que conhece
Emacs vai entender).&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: ERROR/3 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 28)&lt;/p&gt;
&lt;p&gt;Unexpected indentation.&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Depois de conhecer o &lt;a class="reference external" href="http://blog.qmx.me/"&gt;QMX&lt;/a&gt; (Evangelista VIM) comecei ver o VIM como&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 29)&lt;/p&gt;
&lt;p&gt;Block quote ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;um ótimo editor.&lt;/p&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;div class="first line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;OS X&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Depois de passar muito tempo com ambiente Linux, vi que não&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 36)&lt;/p&gt;
&lt;p&gt;Line block ends without a blank line.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;bastava a simplicidade de um gerenciamento de pacote como yum ou
apt-get e sim um sistema onde&amp;nbsp;conseguisse&amp;nbsp;uma melhor integração com a
camada de hardware. Por isso hoje uso Macbook, com o sistema
operacional OS X.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;E a bateria dura muito mais tempo do que qual quer outro Notebook que
eu tive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;iterm2 + homebrew&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Utilizo o &lt;a class="reference external" href="http://code.google.com/p/iterm2/"&gt;iterm2&lt;/a&gt; como terminal do meu Mac e tem me agradado muito&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 51)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;a parte de troca de abas, como gerenciador de pacote utilizo o
&lt;a class="reference external" href="http://mxcl.github.com/homebrew/"&gt;homebrew&lt;/a&gt; (que me foi apresentado pelo &lt;a class="reference external" href="http://akitaonrails.com/"&gt;Fabio Akita&lt;/a&gt;,
automaticamente já sabemos que é escrito em Ruby :/ )&lt;/p&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;pip + virtualenv +&amp;nbsp;virtualenvwrapper&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Como sou desenvolvedor Python não temos trabalhar com ultiplos&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 61)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;projetos sem um Virtualenv para isolar meus ambientes para cada
projeto, o Virtualenvwrapper uso para simplificar a criação de cada
ambiente e o pip uso para instalar bibliotecas Python.&lt;/p&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;Dropbox&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Realmente o Dropbox me salvou muitas vezes, com o uso dele não&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 71)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;preciso ficar levando pen drive para cliente ou qual quer local que
eu for.&lt;/p&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;Google Apps (Gmail)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Não sei qualificar quantos % da minha vida profissional esta encima&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/meu-ambiente-de-trabalho-em-7-itens.rst&lt;/tt&gt;, line 80)&lt;/p&gt;
&lt;p&gt;Definition list ends without a blank line; unexpected unindent.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;do Google Apps, mas sei que tem muita coisa lá.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Agora para seguir com o meme, convido meus amigos:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://christiano.me/"&gt;Christiano Anderson&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://rochacbruno.com.br/blog/"&gt;Bruno Rocha&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://blog.heynemann.com.br/"&gt;Bernardo Heynemann&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://isnomore.net/"&gt;Rodrigo Bernardo Pimentel&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/VzQjqch82R8" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/02/20/meu-ambiente-de-trabalho-em-7-itens</feedburner:origLink></entry><entry><title>Curso Desenvolvimento ágil com Django</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/U-N_VBjYIBg/curso-desenvolvimento-agil-com-django" rel="alternate" /><updated>2011-01-27T22:36:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2011-01-27:2011/01/27/curso-desenvolvimento-agil-com-django</id><summary type="html">&lt;p&gt;Comece a desenvolver com um framework de alto nível, que estimula o
desenvolvimento rápido e limpo. Aprenda Django agora!&lt;/p&gt;
&lt;p&gt;O Curso esta no valor de &lt;strong&gt;R$ 69,00&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://static.imasters.com.br/img/imgbase/31108.png"&gt;&lt;img alt="image0" src="http://static.imasters.com.br/img/imgbase/31108.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;No curso explico como fazer um site completo com Django onde&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/curso-desenvolvimento-agil-com-django.rst&lt;/tt&gt;, line 24)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;contemplo valores que o profissional vai usar no desenvolvimento de
sistemas, no curso tem materiais suficiente para que você possa criar e
ajuda qual quer projeto Open Source escrito em Python e Django.&lt;/p&gt;
&lt;p&gt;O curso esta sendo realizado com apoio do &lt;a class="reference external" href="http://pro.imasters.com.br/"&gt;iMasters Pro&lt;/a&gt; onde temos
outros curso com uma qualidade&amp;nbsp;excelente.&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://pro.imasters.com.br/online/cursos/desenvolvimento-agil-com-django/"&gt;Veja o conteudo do curso de Django no site do iMasters Pro.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/U-N_VBjYIBg" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2011/01/27/curso-desenvolvimento-agil-com-django</feedburner:origLink></entry><entry><title>Problema com Celery "process exiting with exitcode 1"</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/wlfiCZhUBNg/problema-com-celery-process-exiting-exitcode-1" rel="alternate" /><updated>2010-12-16T22:34:00+01:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-12-16:2010/12/16/problema-com-celery-process-exiting-exitcode-1</id><summary type="html">&lt;p&gt;Hoje estava rodando o Celery em um projeto e me deparei com um problema,
o &amp;quot;process exiting with exitcode 1&amp;quot; quando dava start no Celery:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[root&amp;#64;xen-01 gonow]# python2.7 manage.py celeryd -v 2 -B -s celery -E -l INFO
[2010-12-16 09:18:13,184: WARNING/MainProcess] celery&amp;#64;xen-01 v2.1.3 is starting.
[2010-12-16 09:18:13,185: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
        worker.py:107: UserWarning: Running celeryd with superuser privileges is not encouraged!
&amp;nbsp;&amp;nbsp;&amp;quot;Running celeryd with superuser privileges is not encouraged!&amp;quot;)
[2010-12-16 09:18:13,185: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
        worker.py:110: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
&amp;nbsp;&amp;nbsp;warnings.warn(&amp;quot;Using settings.DEBUG leads to a memory leak, &amp;quot;
[2010-12-16 09:18:13,188: WARNING/MainProcess]
Configuration -&amp;gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;. broker -&amp;gt; ghettoq.taproot.Database://guest&amp;#64;localhost/
&amp;nbsp;&amp;nbsp; &amp;nbsp;. queues -&amp;gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. celery -&amp;gt; exchange:celery (direct) binding:celery
&amp;nbsp;&amp;nbsp; &amp;nbsp;. concurrency -&amp;gt; 2
&amp;nbsp;&amp;nbsp; &amp;nbsp;. loader -&amp;gt; djcelery.loaders.DjangoLoader
&amp;nbsp;&amp;nbsp; &amp;nbsp;. logfile -&amp;gt; [stderr]&amp;#64;INFO
&amp;nbsp;&amp;nbsp; &amp;nbsp;. events -&amp;gt; ON
&amp;nbsp;&amp;nbsp; &amp;nbsp;. beat -&amp;gt; ON
&amp;nbsp;&amp;nbsp; &amp;nbsp;. tasks -&amp;gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. gonow.vps.tasks.lvm
[2010-12-16 09:18:13,213: INFO/PoolWorker-2] child process calling self.run()
[2010-12-16 09:18:13,223: INFO/PoolWorker-3] child process calling self.run()
[2010-12-16 09:18:13,237: INFO/Beat] child process calling self.run()
[2010-12-16 09:18:13,239: INFO/Beat] Celerybeat: Starting...
[2010-12-16 09:18:13,239: WARNING/MainProcess] celery&amp;#64;xen-01 has started.
[2010-12-16 09:18:13,257: INFO/Beat] process shutting down
[2010-12-16 09:18:13,258: WARNING/Beat] Process Beat:
[2010-12-16 09:18:13,259: WARNING/Beat] Traceback (most recent call last):
[2010-12-16 09:18:13,259: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/multiprocessing/process.py&amp;quot;, line 232, in _bootstrap
[2010-12-16 09:18:13,284: WARNING/Beat] self.run()
[2010-12-16 09:18:13,285: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 392, in run
[2010-12-16 09:18:13,291: WARNING/Beat] self.service.start(embedded_process=True)
[2010-12-16 09:18:13,292: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 322, in start
[2010-12-16 09:18:13,292: WARNING/Beat] humanize_seconds(self.scheduler.max_interval)))
[2010-12-16 09:18:13,292: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 362, in scheduler
[2010-12-16 09:18:13,292: WARNING/Beat] self._scheduler = self.get_scheduler()
[2010-12-16 09:18:13,292: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 354, in get_scheduler
[2010-12-16 09:18:13,293: WARNING/Beat] lazy=lazy)
[2010-12-16 09:18:13,293: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/utils/
        __init__.py&amp;quot;, line 362, in instantiate
[2010-12-16 09:18:13,297: WARNING/Beat] return get_cls_by_name(name)(*args, **kwargs)
[2010-12-16 09:18:13,298: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 274, in __init__
[2010-12-16 09:18:13,298: WARNING/Beat] Scheduler.__init__(self, *args, **kwargs)
[2010-12-16 09:18:13,298: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 150, in __init__
[2010-12-16 09:18:13,299: WARNING/Beat] self.setup_schedule()
[2010-12-16 09:18:13,299: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 279, in setup_schedule
[2010-12-16 09:18:13,299: WARNING/Beat] self.merge_inplace(conf.CELERYBEAT_SCHEDULE)
[2010-12-16 09:18:13,299: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py&amp;quot;,
        line 250, in merge_inplace
[2010-12-16 09:18:13,299: WARNING/Beat] if self.get(key):
[2010-12-16 09:18:13,300: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/UserDict.py&amp;quot;, line 61, in get
[2010-12-16 09:18:13,310: WARNING/Beat] return self[key]
[2010-12-16 09:18:13,310: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/UserDict.py&amp;quot;, line 20, in __getitem__
[2010-12-16 09:18:13,310: WARNING/Beat] return self.data[key]
[2010-12-16 09:18:13,311: WARNING/Beat] File &amp;quot;/usr/local/lib/python2.7/shelve.py&amp;quot;, line 122, in __getitem__
[2010-12-16 09:18:13,317: WARNING/Beat] value = Unpickler(f).load()
[2010-12-16 09:18:13,318: WARNING/Beat] EOFError
[2010-12-16 09:18:13,318: INFO/Beat] process exiting with exitcode 1
&lt;/pre&gt;
&lt;p&gt;O motivo desse error é que antes de dar start no Celery ele já esta
rodando em memoria. Quando rodamos o Celery ele cria alguns arquivos no
projeto para gerenciamento de Task, um dele é o celery.dir &amp;nbsp;que guarda
informações das function que vai ser processada de X em X tempo.&lt;/p&gt;
&lt;p&gt;Bom a solução para esse casa é apagar o arquivo &amp;quot;celery.dir&amp;quot; assim ele
zera o task do Celery, quando der start novamente ele recria o
&amp;quot;celery.dir&amp;quot;.&lt;/p&gt;
&lt;p&gt;Agora ele só normal:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[root&amp;#64;xen-01 gonow]# python2.7 manage.py celeryd -v 2 -B -s celery -E -l INFO
[2010-12-16 09:18:28,539: WARNING/MainProcess] celery&amp;#64;xen-01 v2.1.3 is starting.
[2010-12-16 09:18:28,540: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
        worker.py:107:
        UserWarning: Running celeryd with superuser privileges is not encouraged!
  &amp;quot;Running celeryd with superuser privileges is not encouraged!&amp;quot;)
[2010-12-16 09:18:28,540: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
        worker.py:110:
        UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
  warnings.warn(&amp;quot;Using settings.DEBUG leads to a memory leak, &amp;quot;
[2010-12-16 09:18:28,543: WARNING/MainProcess]
Configuration -&amp;gt;
    . broker -&amp;gt; ghettoq.taproot.Database://guest&amp;#64;localhost/
    . queues -&amp;gt;
        . celery -&amp;gt; exchange:celery (direct) binding:celery
    . concurrency -&amp;gt; 2
    . loader -&amp;gt; djcelery.loaders.DjangoLoader
    . logfile -&amp;gt; [stderr]&amp;#64;INFO
    . events -&amp;gt; ON
    . beat -&amp;gt; ON
    . tasks -&amp;gt;
        . gonow.vps.tasks.lvm
[2010-12-16 09:18:28,568: INFO/PoolWorker-2] child process calling self.run()
[2010-12-16 09:18:28,578: INFO/PoolWorker-3] child process calling self.run()
[2010-12-16 09:18:28,591: INFO/Beat] child process calling self.run()
[2010-12-16 09:18:28,593: INFO/Beat] Celerybeat: Starting...
[2010-12-16 09:18:28,596: WARNING/MainProcess] celery&amp;#64;xen-01 has started.
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/wlfiCZhUBNg" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/12/16/problema-com-celery-process-exiting-exitcode-1</feedburner:origLink></entry><entry><title>Cron dentro do Django com Celery</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/ri4b6G5fEw8/cron-dentro-do-django-com-celery" rel="alternate" /><updated>2010-10-19T22:34:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-19:2010/10/19/cron-dentro-do-django-com-celery</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Ontem na parte da noite conversando com um conhecido ele falou que&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/cron-dentro-do-django-com-celery.rst&lt;/tt&gt;, line 9)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;estava usando em um projeto o &lt;a class="reference external" href="http://celeryproject.org/"&gt;Celery&lt;/a&gt;, como ainda não conhecia vamos
estudar este projeto. Gostei da forma que ele trabalha e como ele
integra com o &lt;a class="reference external" href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;.
|  Tenho em um projeto uma fila de processamento só que foi desenvolvido
por mim e não tem todos os recursos que o &lt;a class="reference external" href="http://celeryproject.org/"&gt;Celery&lt;/a&gt; tem.&lt;/p&gt;
&lt;p&gt;Vou explicar como usar o &lt;a class="reference external" href="http://celeryproject.org/"&gt;Celery&lt;/a&gt; com o &lt;a class="reference external" href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; em um exemplo
simples, e como sempre basta usar a criatividade para desenvolver a sua
necessidade.&lt;/p&gt;
&lt;p&gt;Primeiramente temos que instalar dois pacotes Python para que possamos
trabalhar com o Celery no Django, o django-celery e ghettoq. Caso
tenhamos o easy_install instalado basta instalar os pacotes da seguinte
forma:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install django-celery
$ easy_install ghettoq
&lt;/pre&gt;
&lt;p&gt;Caso não tenha vamos instalar:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd /usr/src/
$ git clone http://github.com/ask/django-celery.git
$ cd django-celery
$ python setup.py build
$ python setup.py install
$ cd ..
$ git clone http://github.com/ask/ghettoq
$ cd ghettoq
$ python setup.py build
$ python setup.py install
&lt;/pre&gt;
&lt;p&gt;Após instalar vamos criar um projeto para que possamos trabalhar com o
Celery nele.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ django-admin.py startproject celerytest
$ cd celerytest
&lt;/pre&gt;
&lt;p&gt;Vamos editar o settings.py:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'test',
    }
}
...
CARROT_BACKEND = &amp;quot;ghettoq.taproot.Database&amp;quot;
INSTALLED_APPS = (
    ...
    'djcelery',
    'ghettoq',
)
&lt;/pre&gt;
&lt;p&gt;Após declarar qual biblioteca o projeto em Django vai carregar podemos
sincronizar o nosso database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ python manage.py syncdb
&lt;/pre&gt;
&lt;p&gt;Temos que criar um arquivo chamado tasks.py, esse arquivo trabalha como
o models de uma aplicação:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
from celery.task.schedules import crontab
from celery.decorators import periodic_task

# this will run every minute, see http://celeryproject.org/docs/reference/celery.task.schedules.html#celery.task.schedules.crontab
&amp;#64;periodic_task(run_every=crontab(hour=&amp;quot;*&amp;quot;, minute=&amp;quot;*&amp;quot;, day_of_week=&amp;quot;*&amp;quot;))
def test():
    print &amp;quot;Tarefa de teste...&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Agora temos que dar start em nosso daemon Celery:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ python manage.py celeryd -v 2 -B -s celery -E -l INFO
2010-10-19 05:34:44,215: WARNING/MainProcess] celery&amp;#64;program-8 v2.1.1 is starting.
[2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/
    worker.py:105: UserWarning: Running celeryd with superuser privileges is not encouraged!
  &amp;quot;Running celeryd with superuser privileges is not encouraged!&amp;quot;)
[2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/
    worker.py:108: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
  warnings.warn(&amp;quot;Using settings.DEBUG leads to a memory leak, &amp;quot;
[2010-10-19 05:34:44,222: WARNING/MainProcess]
Configuration -&amp;amp;gt;
    . broker -&amp;amp;gt; ghettoq.taproot.Database://guest&amp;#64;localhost/
    . queues -&amp;amp;gt;
        . celery -&amp;amp;gt; exchange:celery (direct) binding:celery
    . concurrency -&amp;amp;gt; 2
    . loader -&amp;amp;gt; djcelery.loaders.DjangoLoader
    . logfile -&amp;amp;gt; [stderr]&amp;#64;INFO
    . events -&amp;amp;gt; ON
    . beat -&amp;amp;gt; ON
    . tasks -&amp;amp;gt;
 . celerytest.lol.tasks.test
[2010-10-19 05:34:44,238: INFO/PoolWorker-2] child process calling self.run()
[2010-10-19 05:34:44,239: INFO/PoolWorker-3] child process calling self.run()
[2010-10-19 05:34:44,241: WARNING/MainProcess] celery&amp;#64;program-8 has started.
[2010-10-19 05:34:44,241: INFO/Beat] child process calling self.run()
[2010-10-19 05:34:44,241: INFO/Beat] Celerybeat: Starting...
[2010-10-19 05:35:00,537: INFO/MainProcess] Got task from broker: celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50]
[2010-10-19 05:35:00,760: WARNING/PoolWorker-3] firing test task
[2010-10-19 05:35:01,088: INFO/MainProcess] Task celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50] processed: None
&lt;/pre&gt;
&lt;p&gt;Pronto ele esta rodando.&lt;/p&gt;
&lt;p&gt;O &lt;a class="reference external" href="http://celeryproject.org/"&gt;Celery&lt;/a&gt; é um projeto muito bom só que ainda estamos enfrentando
alguns bugs com processos pesado o pior que ele para de processar e não
esta dando nem um retorno, por isso antes colocar em produção teste sua
aplicação onde o &lt;a class="reference external" href="http://celeryproject.org/"&gt;Celery&lt;/a&gt; vai rodar.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/ri4b6G5fEw8" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/19/cron-dentro-do-django-com-celery</feedburner:origLink></entry><entry><title>Par ou Ímpar com Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/azWXiFtzm-M/par-ou-impar-com-python" rel="alternate" /><updated>2010-10-18T22:33:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-18:2010/10/18/par-ou-impar-com-python</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Como vocês viu gosto muito de matemática, então nada melhor de juntar&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/par-ou-impar-com-python.rst&lt;/tt&gt;, line 9)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;Matemática com Python, um script simples em Python para identificar se o
numero digitado é Par ou Ímpar.&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/par-ou-impar-com-python.rst&lt;/tt&gt;, line 12)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    #!/usr/bin/env python
    n = raw_input(&amp;quot;Numero: &amp;quot;)
    if n%2==0:
        print &amp;quot;Par&amp;quot;
    else:
        print &amp;quot;Impar&amp;quot;

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Não tem muito segredo mas no teste do evento &lt;a class="reference external" href="http://www.google.com/events/developerday/2010/sao-paulo/"&gt;Google Developer Day&lt;/a&gt;
caiu coisa do tipo.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/azWXiFtzm-M" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/18/par-ou-impar-com-python</feedburner:origLink></entry><entry><title>Identificando dispositivo movel no Django</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/8_ap40Paais/identificando-dispositivo-movel-no-django" rel="alternate" /><updated>2010-10-16T22:32:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-16:2010/10/16/identificando-dispositivo-movel-no-django</id><summary type="html">&lt;p&gt;Hoje temos uma biblioteca chamada de &lt;a class="reference external" href="http://code.google.com/p/django-bloom/"&gt;Bloom Device&lt;/a&gt; feira para Django
desenvolvida por &lt;a class="reference external" href="http://code.google.com/u/bishanty/"&gt;bishanty&lt;/a&gt; e &lt;a class="reference external" href="http://code.google.com/u/kevin.tom/"&gt;kevin.tom&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Como instalar?&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 13)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    $ wget http://django-bloom.googlecode.com/files/bloom-0.1.tar.gz
    $ tar -tzvf bloom-0.1.tar.gz
    $ cd django-bloom
    $ python setup.py install

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Antes de instalar esta biblioteca teríamos que fazer da segunte forma:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 22)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    &amp;gt;&amp;gt;&amp;gt; request.META['HTTP_USER_AGENT']
    'SonyEricssonW850i/R1GB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1'

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;E pegar o resultado do HTTP_USER_AGENT e parcia. Com o Bloom Device
ele retorna um JSON:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 30)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    &amp;gt;&amp;gt;&amp;gt; request.device
    {u'mobileDevice': '1', u'displayWidth': '240', u'displayHeight': '320', u'vendor': 'Sony Ericsson',  u'model': 'W850i', ...}

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Como usar no Django?&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Depois de instalado temos que instanciar o Bloom Device no Django no&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 36)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;settings.py:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 40)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    INSTALLED_APPS = (
    ...
    'bloom.device',
    ...
    )
    ...
    MIDDLEWARE_CLASSES = (
    ...
    'bloom.device.middleware.DeviceDetectMiddleware',
    ...
    )

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Na views da aplicação vamos usar assim:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/identificando-dispositivo-movel-no-django.rst&lt;/tt&gt;, line 56)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    &amp;#64;detect_device
    from bloom.device.decorators import detect_device
    def my_view(request):
    print request.device
    ...

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Agora vai a criatividade para poder trabalhar com o Bloom Device.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Recomendações&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/8_ap40Paais" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/16/identificando-dispositivo-movel-no-django</feedburner:origLink></entry><entry><title>Calculo de Bhaskara via Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/Bb88ZyeXciU/calculo-de-bhaskara-python" rel="alternate" /><updated>2010-10-15T22:31:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-15:2010/10/15/calculo-de-bhaskara-python</id><summary type="html">&lt;p&gt;O foco este post é levar você aprender computação com Python.&lt;/p&gt;
&lt;p&gt;Para calcular as raízes em função do segundo grau, utilizamos uma
fórmula muito querida por todos que estudam no ensino médio, a famosa
fórmula de Bhaskara:&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TLg2zSDpNxI/AAAAAAAACHo/m6HjI7z2Bbw/s1600/bascara.gif" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Onde cada letra desta fórmula representa os coeficientes da função do
segundo grau que queremos resolver. Basta substituir e achar os valores.
Podem notar que há um ± no meio da fórmula. Pois é, é daí que irá sair
dois resultados: um com o sinal de + e outro com o sinal de -. Veja o
exemplo: &lt;img alt="image1" src="http://2.bp.blogspot.com/_ovJ6PyiUjqA/TLg3Mno-jMI/AAAAAAAACHs/fCi8z113i4A/s1600/mimetex.cgi.gif" /&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Neste exemplo temos os coeficientes, a=2, b= -6 e c= -20 (Muita&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/calculo-de-bhaskara-python.rst&lt;/tt&gt;, line 31)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;atenção para os sinais)
|  Agora substituindo na fórmula de Bhaskara:
|  &lt;img alt="image2" src="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TLg3lDJsNXI/AAAAAAAACHw/YfVQ7BZRn74/s1600/mimetex.cgi+(1).gif" /&gt;
|  &lt;img alt="image3" src="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TLg3ldF6RYI/AAAAAAAACH0/n_ovlQqZx58/s1600/mimetex.cgi+(2).gif" /&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Agora chegamos no momento crucial do cáculo das raízes.&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Devemos separar esta conta em duas: uma com o sinal de + e a outra&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/calculo-de-bhaskara-python.rst&lt;/tt&gt;, line 37)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;com o sinal de -. Assim:
|  &lt;img alt="image4" src="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TLg4Jje6jmI/AAAAAAAACH4/_KTwfrBiiCM/s1600/mimetex.cgi+(3).gif" /&gt;
|  &lt;img alt="image5" src="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TLg4KASi2OI/AAAAAAAACH8/b75a_dgty6s/s1600/mimetex.cgi+(4).gif" /&gt;&lt;/p&gt;
&lt;p&gt;Portanto as duas raízes da função são 5 e -2.&lt;/p&gt;
&lt;p&gt;Chega de blablabla e vamos ver como isso fica em Python:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import math
import sys
a=input (&amp;quot;a:&amp;quot;)
b=input (&amp;quot;b:&amp;quot;)
c=input (&amp;quot;c:&amp;quot;)
d=(b^2)-(4*a*c) #Mário Meyer
# d=((b^2)-4*a)*c Esta errado esta linha, usar a linha superior.
if d&amp;lt;0 :
        print (&amp;quot;Delta negativo, raiz impossivel de ser extraida.&amp;quot;)
        sys.exit()

else : print &amp;quot;Delta: %s.&amp;quot; % d
        m1=math.sqrt(d)
        x1=(-b+m1)/(2*a)
        x2=(-b-m1)/(2*a)
        print &amp;quot;Raiz ~ X1= %s.&amp;quot; % x1
        print &amp;quot;Raiz ~ X2= %s.&amp;quot; % x2
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Bb88ZyeXciU" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/15/calculo-de-bhaskara-python</feedburner:origLink></entry><entry><title>Oportunidade Python - UPX</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/lWd9jIH4AY4/oportunidade-python-upx" rel="alternate" /><updated>2010-10-14T22:31:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-14:2010/10/14/oportunidade-python-upx</id><summary type="html">&lt;p&gt;Empresa de Alphaville (São Paulo) procura DOIS programadores &lt;a class="reference external" href="http://python.org/"&gt;Python&lt;/a&gt;
para trabalharem presencialmente desenvolvendo em framework &lt;a class="reference external" href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;.
Contratação imediata.&lt;/p&gt;
&lt;p&gt;Características obrigatórias:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fluência em Python e Django.&lt;/li&gt;
&lt;li&gt;Fluência em inglês escrito.&lt;/li&gt;
&lt;li&gt;Disponibilidade para trabalhar das 9h às 18h em Alphaville.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Características desejáveis:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ser usuário GNU Linux.&lt;/li&gt;
&lt;li&gt;Noções de Mercurial.&lt;/li&gt;
&lt;li&gt;Experiência com Webservices.&lt;/li&gt;
&lt;li&gt;Noções de Google AppEngine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A faixa salarial é de ~ R$ 5.000,00. Os currículos (ou portfólios) devem
ser enviados em para &lt;a class="reference external" href="mailto:thiago.ayub&amp;#64;upx.com.br"&gt;thiago.ayub AT upx DOT com DOT br&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/lWd9jIH4AY4" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/14/oportunidade-python-upx</feedburner:origLink></entry><entry><title>Gerando SVG com Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/ToDo9kCD3lc/gerando-svg-com-python" rel="alternate" /><updated>2010-10-11T22:23:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-11:2010/10/11/gerando-svg-com-python</id><summary type="html">&lt;p&gt;Em baixo veja um código de como gerar SVG com Python&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/gerando-svg-com-python.rst&lt;/tt&gt;, line 10)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    import os

    display_prog = 'display'

    class Scene:
        def __init__(self,name=&amp;quot;svg&amp;quot;,height=400,width=400):
            self.name = name
            self.items = []
            self.height = height
            self.width = width
            return

        def add(self,item): self.items.append(item)

        def strarray(self):
            var = [&amp;quot;\n&amp;quot;,
                   &amp;quot;\n&amp;quot; % (self.height,self.width),
                   &amp;quot; \n&amp;quot;]
            for item in self.items: var += item.strarray()
            var += [&amp;quot; \n\n&amp;quot;]
            return var

        def write_svg(self,filename=None):
            if filename:
                self.svgname = filename
            else:
                self.svgname = self.name + &amp;quot;.svg&amp;quot;
            file = open(self.svgname,'w')
            file.writelines(self.strarray())
            file.close()
            return

        def display(self,prog=display_prog):
            os.system(&amp;quot;%s %s&amp;quot; % (prog,self.svgname))
            return


    class Line:
        def __init__(self,start,end):
            self.start = start #xy tuple
            self.end = end     #xy tuple
            return

        def strarray(self):
            return [&amp;quot;  \n&amp;quot; %\
                    (self.start[0],self.start[1],self.end[0],self.end[1])]


    class Circle:
        def __init__(self,center,radius,color):
            self.center = center #xy tuple
            self.radius = radius #xy tuple
            self.color = color   #rgb tuple in range(0,256)
            return

        def strarray(self):
            return [&amp;quot;  \n&amp;quot; % colorstr(self.color)]

    class Rectangle:
        def __init__(self,origin,height,width,color):
            self.origin = origin
            self.height = height
            self.width = width
            self.color = color
            return

        def strarray(self):
            return [&amp;quot;  \n&amp;quot; %\
                    (self.width,colorstr(self.color))]

    class Text:
        def __init__(self,origin,text,size=24):
            self.origin = origin
            self.text = text
            self.size = size
            return

        def strarray(self):
            return [&amp;quot;  \n&amp;quot; %\
                    (self.origin[0],self.origin[1],self.size),
                    &amp;quot;   %s\n&amp;quot; % self.text,
                    &amp;quot;  \n&amp;quot;]


    def colorstr(rgb): return &amp;quot;#%x%x%x&amp;quot; % (rgb[0]/16,rgb[1]/16,rgb[2]/16)

    def main():
        scene = Scene('test')
        scene.add(Rectangle((100,100),200,200,(0,255,255)))
        scene.add(Line((200,200),(200,300)))
        scene.add(Line((200,200),(300,200)))
        scene.add(Line((200,200),(100,200)))
        scene.add(Line((200,200),(200,100)))
        scene.add(Circle((200,200),30,(0,0,255)))
        scene.add(Circle((200,300),30,(0,255,0)))
        scene.add(Circle((300,200),30,(255,0,0)))
        scene.add(Circle((100,200),30,(255,255,0)))
        scene.add(Circle((200,100),30,(255,0,255)))
        scene.add(Text((50,50),&amp;quot;Thiago Avelino gerando SVG com Python&amp;quot;))
        scene.write_svg()
        scene.display()
        return

    if __name__ == '__main__':
     main()

&lt;/pre&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/ToDo9kCD3lc" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/11/gerando-svg-com-python</feedburner:origLink></entry><entry><title>Repositório para linguagem Python - PyPI</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/X58Ubh9pGHc/repositorio-para-linguagem-python-pypi" rel="alternate" /><updated>2010-10-10T22:23:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-10-10:2010/10/10/repositorio-para-linguagem-python-pypi</id><summary type="html">&lt;p&gt;PyPI (Python Package Index) é um repositório para linguagem Python. Hoje
temos 11.559 software no repositório.&lt;/p&gt;
&lt;p&gt;Caso você use PyPI e ache um erro basta reporta o BUG para o &lt;a class="reference external" href="http://sourceforge.net/tracker/?group_id=66150&amp;amp;atid=513504"&gt;Support
Requests&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Você tem uma aplicação e acha que a mesma pode ajudar outras pessoas
você pode colocar a sua aplicação no PyPI, basta ler como reporta a
aplicação &lt;a class="reference external" href="http://wiki.python.org/moin/CheeseShopTutorial"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi?:action=browse"&gt;Veja todas as aplicações&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/X58Ubh9pGHc" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/10/10/repositorio-para-linguagem-python-pypi</feedburner:origLink></entry><entry><title>Django Lock 1.0 - Gnome Look</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/Gnp4YoJEB6k/django-lock-1-0-gnome-look" rel="alternate" /><updated>2010-09-23T22:22:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-09-23:2010/09/23/django-lock-1-0-gnome-look</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;p&gt;Tema para Gnome com cara de Django&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://gnome-look.org/content/show.php?action=content&amp;amp;content=132944"&gt;http://gnome-look.org/content/show.php?action=content&amp;amp;content=132944&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TJtpaKkJy9I/AAAAAAAACGs/69z4HrPpKVs/s1600/Captura_de_tela.png"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TJtpaKkJy9I/AAAAAAAACGs/69z4HrPpKVs/s320/Captura_de_tela.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TJtpaSl-V-I/AAAAAAAACGw/YqQWPesviaw/s1600/Captura_de_tela-1.png"&gt;&lt;img alt="image1" src="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TJtpaSl-V-I/AAAAAAAACGw/YqQWPesviaw/s320/Captura_de_tela-1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Gnp4YoJEB6k" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/09/23/django-lock-1-0-gnome-look</feedburner:origLink></entry><entry><title>O blog do Google Brasil: Google Developer Day 2010 - São Paulo, Brasil - Inscrições Abertas!</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/soJjtUGNFSQ/o-blog-do-google-brasil-google-developer-day-2010" rel="alternate" /><updated>2010-09-15T22:21:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-09-15:2010/09/15/o-blog-do-google-brasil-google-developer-day-2010</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://googlebrasilblog.blogspot.com/2010/09/google-developer-day-2010-sao-paulo.html"&gt;O blog do Google Brasil: Google Developer Day 2010 - São Paulo, Brasil
- Inscrições Abertas!&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/soJjtUGNFSQ" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/09/15/o-blog-do-google-brasil-google-developer-day-2010</feedburner:origLink></entry><entry><title>Ajudando o projeto MongoEngine</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/pgAIsLJwIS0/ajudando-o-projeto-mongoengine" rel="alternate" /><updated>2010-09-06T22:21:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-09-06:2010/09/06/ajudando-o-projeto-mongoengine</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TC9R0Z83HoI/AAAAAAAAB60/11VqQHjvOuY/s1600/Captura+de+tela+2010-07-03+a%CC%80s+12.06.11.png"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TC9R0Z83HoI/AAAAAAAAB60/11VqQHjvOuY/s320/Captura+de+tela+2010-07-03+a%CC%80s+12.06.11.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Com grande orgunho que venho anunciar a todos que o projeto MongoEngine
tem path pt_BR.&lt;/p&gt;
&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="http://mongoengine.org/pt_BR/"&gt;http://mongoengine.org/pt_BR/&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Por enquanto estamos apenas com o site em Português e trabalhando encima
da documentação.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Caso você queira ajudar o projeto por favor mandar email para
&lt;a class="reference external" href="mailto:avelino&amp;#64;mongoengine.org"&gt;avelino&amp;#64;mongoengine.org&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/pgAIsLJwIS0" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/09/06/ajudando-o-projeto-mongoengine</feedburner:origLink></entry><entry><title>Livro Aprenda Computação com Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/AW0ZFWTrk9s/livro-aprenda-computacao-com-python" rel="alternate" /><updated>2010-09-04T22:18:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-09-04:2010/09/04/livro-aprenda-computacao-com-python</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Você quer aprender Python e não sabe por onde começar?&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Posso indicar um Livro é escrito pelo pessoal da &lt;a href="#id1"&gt;&lt;span class="problematic" id="id2"&gt;`&lt;/span&gt;&lt;/a&gt;Associação Python&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message" id="id1"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/livro-aprenda-computacao-com-python.rst&lt;/tt&gt;, line 9); &lt;em&gt;&lt;a href="#id2"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Inline interpreted text or phrase reference start-string without end-string.&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/livro-aprenda-computacao-com-python.rst&lt;/tt&gt;, line 9)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;Brasil`_. Hoje esta na versão 1.1 e se encontra no Google Code com o
nome&amp;nbsp;&lt;a class="reference external" href="http://code.google.com/p/aprendacompy/"&gt;aprendacompy&lt;/a&gt;.&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;p&gt;Este é o 3º repositório público deste projeto, que começou na Incubadora
Fapesp, migrou para o Bitbucket e agora está no GoogleCode, onde
esperamos encontrar uma base permanente, mais estável e mais acessível
para os colaboradores.&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://aprendacompy.googlecode.com/files/AprendaComputaocomPython.pdf"&gt;&lt;img alt="image0" src="http://aprendacompy.googlecode.com/files/AprendaComputaocomPython.pdf" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/AW0ZFWTrk9s" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/09/04/livro-aprenda-computacao-com-python</feedburner:origLink></entry><entry><title>São Paulo Open Source Jam 2 - Google Open Source Blog</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/Uk9ZY3ckNKs/sao-paulo-open-source-jam-2-google-open-source-blo" rel="alternate" /><updated>2010-08-07T22:17:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-08-07:2010/08/07/sao-paulo-open-source-jam-2-google-open-source-blo</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://google-opensource.blogspot.com/2010/08/sao-paulo-open-source-jam-2.html"&gt;São Paulo Open Source Jam 2 - Google Open Source Blog&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Foi um evento muito bom.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Uk9ZY3ckNKs" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/08/07/sao-paulo-open-source-jam-2-google-open-source-blo</feedburner:origLink></entry><entry><title>Software proprietaros em linguagem Open Source</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/KJB7bLxLG3I/software-proprietaros-em-linguagem-open-source" rel="alternate" /><updated>2010-07-23T22:17:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-23:2010/07/23/software-proprietaros-em-linguagem-open-source</id><summary type="html">&lt;p&gt;Não sei bem por onde começar escrever este post, mas vamos lá.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Hoje achei na internet um software proprietario que usava quando tinha&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/software-proprietaros-em-linguagem-open-source.rst&lt;/tt&gt;, line 11)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;empresa de webhost com o source aberto, bom sou programador e logo
baixei para ver o source.
|  Graças a Deus não uso ele ainda, me deu muito medo de olhar a
estrutura do software e codigo, à lembrando que esta em php 3 (lol).&lt;/p&gt;
&lt;p&gt;Se você tem software Open Source ou principalmente proprietario tem que
fornecer uma estrutura robusta para o seu software sejá ele trabalho
colaborativo ou corporativo.&lt;/p&gt;
&lt;p&gt;Open source você ganha em promoção pessoal e na própria venda de
serviços a quem confiou em você porque mostrou que tem capacidade de
fazer algo que sirva.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Projeto proprietário precisa de investimento inicial às vezes alto e&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/software-proprietaros-em-linguagem-open-source.rst&lt;/tt&gt;, line 25)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;para dar retorno precisa ser vendido. Isto geralmente é difícil porque
quase sempre tem um similar free e Open Source.&lt;/p&gt;
&lt;p&gt;Estude os modelos disponíveis por aí e discuta com a equipe como
pretendem ganhar dinheiro.&lt;/p&gt;
&lt;p&gt;Bom é isso ai, espero ajuda você empresa ou profissional rever alguns
conceitos&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/KJB7bLxLG3I" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/23/software-proprietaros-em-linguagem-open-source</feedburner:origLink></entry><entry><title>TDA Fila com Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/s13fW_ftX10/tda-fila-com-python" rel="alternate" /><updated>2010-07-23T22:15:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-23:2010/07/23/tda-fila-com-python</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O foco este post é levar você aprender computação com Python.&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O TDA Fila é definido pelas seguintes operações:&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;__init__&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Inicializar uma nova fila vazia.&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;insert&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line"&gt;Adicionar um novo item à fila.&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;remove&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line"&gt;Remover e retornar um item da fila. O item retornado é o que foi&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/tda-fila-com-python.rst&lt;/tt&gt;, line 12)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;adicionado primeiro.
|  &lt;strong&gt;isEmpty&lt;/strong&gt;
|  Checar se a fila está vazia.&lt;/p&gt;
&lt;p&gt;Segue abaixo um source para explica melhor a implementação &amp;quot;TAD Fila&amp;quot;.&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/tda-fila-com-python.rst&lt;/tt&gt;, line 23)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    class Queue:
     def __init__(self):
      self.length = 0
      self.head = None

     def isEmpty(self):
      return (self.length == 0)

     def insert(self, cargo):
      node = Node(cargo)
      node.next = None
      if self.head == None:
       # if list is empty the new node goes first
       self.head = node
      else:
       # find the last node in the list
       last = self.head
       while last.next: last = last.next
       # append the new node
       last.next = node
         self.length = self.length + 1

     def remove(self):
      cargo = self.head.cargo
      self.head = self.head.next
      self.length = self.length - 1
      return cargo


&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Existem duas invariantes para um objeto Fila bem formado: o atributo
length deve ser o número de nós na fila.&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/tda-fila-com-python.rst&lt;/tt&gt;, line 57)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    &amp;gt;&amp;gt;&amp;gt; from Queue import *
    &amp;gt;&amp;gt;&amp;gt; start = new Queue()
    &amp;gt;&amp;gt;&amp;gt; start.insert(50)
    &amp;gt;&amp;gt;&amp;gt; start.insert(99)
    &amp;gt;&amp;gt;&amp;gt; start.insert(10)
    &amp;gt;&amp;gt;&amp;gt; while not start.isEmpty(): print start.remove()
    50
    99
    10

&lt;/pre&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/s13fW_ftX10" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/23/tda-fila-com-python</feedburner:origLink></entry><entry><title>Pilhas com listas de Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/5whHEXjLhys/pilhas-com-listas-de-python" rel="alternate" /><updated>2010-07-23T22:13:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-23:2010/07/23/pilhas-com-listas-de-python</id><summary type="html">&lt;p&gt;Pilhas com listas de Python&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O foco este post é levar você aprender computação com Python.&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;As listas de Python são bem parecida com às operações que define uma&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/pilhas-com-listas-de-python.rst&lt;/tt&gt;, line 11)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;pilha.&lt;/p&gt;
&lt;p&gt;Segue abaixo um source para explica melhor a implementação &amp;quot;TAD Pilha&amp;quot;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class Stack :
 def __init__(self) :
  self.items = []

 def push(self, item) :
  self.items.apend(item)

 def pop(self) :
  return self.items.pop()

 def isEmpty(self) :
  return (self.items == [])
&lt;/pre&gt;
&lt;p&gt;Uma pilha é uma estrutura de dados genérica, o que significa que podemos
adicionar qualquer tipo de ítem a ela.&lt;/p&gt;
&lt;p&gt;Usando:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; from Stack import *
&amp;gt;&amp;gt;&amp;gt; start = Stack()
&amp;gt;&amp;gt;&amp;gt; start.push(50)
&amp;gt;&amp;gt;&amp;gt; start.push(23)
&amp;gt;&amp;gt;&amp;gt; start.push(&amp;quot;+&amp;quot;)
&amp;gt;&amp;gt;&amp;gt; while not start.isEmpty() :
... priint start.pop()
&lt;/pre&gt;
&lt;p&gt;Python é uma otima linguagem para ser academica.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/5whHEXjLhys" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/23/pilhas-com-listas-de-python</feedburner:origLink></entry><entry><title>Fail no Sonora - terra.com.br</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/2VC8lQhXOhE/fail-no-sonora-terracombr" rel="alternate" /><updated>2010-07-16T22:12:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-16:2010/07/16/fail-no-sonora-terracombr</id><summary type="html">&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: auto;"&gt;&lt;p&gt;O terra.com.br vende um produto que&amp;nbsp;estagiários&amp;nbsp;faz...&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: auto;"&gt;&lt;/div&gt;&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="100%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;a class="reference external" href="http://sonora.terra.com.br/"&gt;&lt;img alt="image1" src="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TECkV7UNoyI/AAAAAAAAB9o/D6Zd18Upkqo/s400/sonora-error.png" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Estagiário que escreve o software do terra.com.br&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/2VC8lQhXOhE" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/16/fail-no-sonora-terracombr</feedburner:origLink></entry><entry><title>Teste e qualidade de software (TDD)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/p1P8vm3XxdQ/teste-e-qualidade-de-software-tdd" rel="alternate" /><updated>2010-07-15T22:11:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-15:2010/07/15/teste-e-qualidade-de-software-tdd</id><summary type="html">&lt;p&gt;Quando falamos em &amp;quot;Teste e qualidade de software&amp;quot; nós programadores já
devemos ter em mente uma técnica chamada Test Driven Development (TDD)
em português &amp;nbsp;Desenvolvimento dirigido por testes é uma técnica de
desenvolvimento que gera em torno de um ciclo repetições:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Desenvolvedor escreve um caso de teste automatizado que define uma
melhoria desejada ou uma nova funcionalidade.&lt;/li&gt;
&lt;li&gt;É produzido código que possa ser validado pelo teste para
posteriormente o código ser refatorado para um código sob padrões
aceitáveis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Através de TDD, programadores podem aplicar o conceito de melhorar e
depurar código legado desenvolvido apartir de técnicas antigas.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Alguns Framework para TDD:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;iGrape Framework (Em desenvolvimento do modulo de TDD) -&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/teste-e-qualidade-de-software-tdd.rst&lt;/tt&gt;, line 23)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://igrape.org/"&gt;http://igrape.org&lt;/a&gt;
|  Pyccuracy Acceptance Testing Framework -
&lt;a class="reference external" href="http://github.com/heynemann/pyccuracy"&gt;http://github.com/heynemann/pyccuracy&lt;/a&gt;
|  Cucumber - &lt;a class="reference external" href="http://cukes.info/"&gt;http://cukes.info/&lt;/a&gt;
|  Accuracy&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/p1P8vm3XxdQ" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/15/teste-e-qualidade-de-software-tdd</feedburner:origLink></entry><entry><title>Trabalhando com Location em php para Android</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/PI9xPUUYdlY/trabalhando-com-location-em-php-para-android" rel="alternate" /><updated>2010-07-15T22:10:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-15:2010/07/15/trabalhando-com-location-em-php-para-android</id><summary type="html">&lt;p&gt;Veja como trabalhar com PHP + Android + Location&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/trabalhando-com-location-em-php-para-android.rst&lt;/tt&gt;, line 10)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:php&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:php

    include(&amp;quot;Android.php&amp;quot;);
    $droid = new Android();

    $droid-&amp;gt;dialogCreateAlert();

    $result = array();

    $latitude = $droid-&amp;gt;getInput(&amp;quot;Location&amp;quot;, &amp;quot;Latitude: &amp;quot;);
    $longitude= $droid-&amp;gt;getInput(&amp;quot;Location&amp;quot;, &amp;quot;Longitude: &amp;quot;);

    $locations = $droid-&amp;gt;geocode($latitude['result'], $longitude['result']);

    foreach ($locations['result'] as $location)
    {
      $location = get_object_vars($location);
      foreach ($location as $key =&amp;gt; $value)
      {
        $result[] = ucfirst(str_replace('_', ' ', $key)).': '.$value;
      }
    }
    $droid-&amp;gt;dialogSetItems($result);

    //displays the box
    $droid-&amp;gt;dialogShow();

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;by Anton&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/PI9xPUUYdlY" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/15/trabalhando-com-location-em-php-para-android</feedburner:origLink></entry><entry><title>Novos icones dos Serviço Google</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/CqtL8yTPMXY/novos-icones-dos-servico-google" rel="alternate" /><updated>2010-07-07T22:09:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-07:2010/07/07/novos-icones-dos-servico-google</id><summary type="html">&lt;p&gt;Curti&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDSlSg8VbdI/AAAAAAAAB7g/juM4b3qx2IA/s1600/servicos-google.png"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDSlSg8VbdI/AAAAAAAAB7g/juM4b3qx2IA/s400/servicos-google.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/CqtL8yTPMXY" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/07/novos-icones-dos-servico-google</feedburner:origLink></entry><entry><title>Um pouco mais sobre Google Friend Connect</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/XEmLN5Ucnz0/um-pouco-mais-sobre-google-friend-connect" rel="alternate" /><updated>2010-07-07T22:09:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-07:2010/07/07/um-pouco-mais-sobre-google-friend-connect</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.google.com/friendconnect/logo?hl=pt_BR"&gt;&lt;img alt="image0" src="http://www.google.com/friendconnect/logo?hl=pt_BR" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.4em;"&gt;&lt;p&gt;&lt;strong&gt;Google Friend Connect&lt;/strong&gt;&amp;nbsp;é uma aplicação&amp;nbsp;web&amp;nbsp;que permite a adicionar
recursos de&amp;nbsp;redes sociais&amp;nbsp;diretamente a um&amp;nbsp;site&amp;nbsp;ou&amp;nbsp;blog&amp;nbsp;qualquer.&lt;/p&gt;
&lt;/div&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.4em;"&gt;&lt;p&gt;A primeira versão do Google Friend Connect foi apresentada oficialmente
ao público em dezembro de 2008. Através deste recurso, um usuário usando
uma conta Google,Yahoo!&amp;nbsp;ou&amp;nbsp;OpenID, pode interagir com outros visitantes
do site ou de sua própria rede social, compartilhando recursos, arquivos
ou aplicações&amp;nbsp;&lt;a class="reference external" href="http://pt.wikipedia.org/wiki/OpenSocial"&gt;OpenSocial&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.google.com/friendconnect"&gt;http://www.google.com/friendconnect&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/XEmLN5Ucnz0" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/07/um-pouco-mais-sobre-google-friend-connect</feedburner:origLink></entry><entry><title>Badge button do iGrape Framework</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/l-YaisLl0ZY/badge-button-do-igrape-framework" rel="alternate" /><updated>2010-07-06T22:08:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-06:2010/07/06/badge-button-do-igrape-framework</id><summary type="html">&lt;div style="text-align: left;"&gt;&lt;p&gt;Se você gostou da ideia, ajuda ou quer ajudar pegue agora mesmo o seu
badge button.&lt;/p&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TDMVrX4M4oI/AAAAAAAAB7M/g8IWLpXbqk4/s1600/igrape-ruby.png"&gt;&lt;img alt="image0" src="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TDMVrX4M4oI/AAAAAAAAB7M/g8IWLpXbqk4/s1600/igrape-ruby.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDMVruGmAqI/AAAAAAAAB7Q/A6ZrzXU0Os8/s1600/igrape-php.png"&gt;&lt;img alt="image1" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDMVruGmAqI/AAAAAAAAB7Q/A6ZrzXU0Os8/s1600/igrape-php.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDMVsgZZEaI/AAAAAAAAB7U/G4qO3y7dfp8/s1600/igrape-python.png"&gt;&lt;img alt="image2" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDMVsgZZEaI/AAAAAAAAB7U/G4qO3y7dfp8/s1600/igrape-python.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Grupo:&amp;nbsp;&lt;a class="reference external" href="http://groups.google.com/group/igrape"&gt;http://groups.google.com/group/igrape&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Github:&amp;nbsp;&lt;a class="reference external" href="http://github.com/igrape"&gt;http://github.com/igrape&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;Site:&amp;nbsp;&lt;a class="reference external" href="http://igrape.org/"&gt;http://igrape.org&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/l-YaisLl0ZY" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/06/badge-button-do-igrape-framework</feedburner:origLink></entry><entry><title>Para os amantes de Python, vem ai o novo framework iGrape Python</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/J1x6zkEto4M/para-os-amantes-de-python-vem-ai-o-novo-framework" rel="alternate" /><updated>2010-07-04T22:07:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-04:2010/07/04/para-os-amantes-de-python-vem-ai-o-novo-framework</id><summary type="html">&lt;p&gt;Bom é com grande prazer anunciar a version 0.1 do iGrape Python esta
disponivel para todos contribuir para uma grande saga de CODES para o
mesmo.&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://github.com/igrape/igrape_python"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TDDn-jtLFiI/AAAAAAAAB68/GchkvwZCFZs/s400/Screen+shot+2010-07-04+at+4.57.59+PM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;A version 0.1 do iGrape Python esta utilizando o mod_python para fazer
a renderização HTML&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://github.com/igrape/igrape_python"&gt;Github&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://twitter.com/igrapehq"&gt;Twitter&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/J1x6zkEto4M" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/04/para-os-amantes-de-python-vem-ai-o-novo-framework</feedburner:origLink></entry><entry><title>ORM Python para MongoDB - MongoEngine</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/EPpq4CsZr4c/orm-python-para-mongodb-mongoengine" rel="alternate" /><updated>2010-07-03T22:03:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-07-03:2010/07/03/orm-python-para-mongodb-mongoengine</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TC9R0Z83HoI/AAAAAAAAB60/11VqQHjvOuY/s320/Captura+de+tela+2010-07-03+a%CC%80s+12.06.11.png" /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;O MongoEngine é um ORM para MongoDB escrito em Python, o developer&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/orm-python-para-mongodb-mongoengine.rst&lt;/tt&gt;, line 9)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;team do MongoEngine busca trabalhar exatamente igual ao ORM do Django.&lt;/p&gt;
&lt;p&gt;Uso o MongoEngine em muitos projetos e ele é o ORM MongoDB oficial do
iGrape Python (Ainda não esta disponivel on-line, estamos terminando os
teste para depois disponibilizar.&lt;/p&gt;
&lt;p&gt;O MongoEngine trabalha com o pyMongo, então antes de instalar o
MongoEngine instale o pyMongo.&lt;/p&gt;
&lt;p&gt;Chega de blablabla, vamos ao exemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class BlogPost(Document):
    title = StringField(required=True, max_length=200)
    posted = DateTimeField(default=datetime.datetime.now)
    tags = ListField(StringField(max_length=50))

class TextPost(BlogPost):
    content = StringField(required=True)

class LinkPost(BlogPost):
    url = StringField(required=True)

# Create a text-based post
&amp;gt;&amp;gt;&amp;gt; post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
&amp;gt;&amp;gt;&amp;gt; post1.tags = ['mongodb', 'mongoengine']
&amp;gt;&amp;gt;&amp;gt; post1.save()

# Create a link-based post
&amp;gt;&amp;gt;&amp;gt; post2 = LinkPost(title='MongoEngine Docs', url='hmarr.com/mongoengine')
&amp;gt;&amp;gt;&amp;gt; post2.tags = ['mongoengine', 'documentation']
&amp;gt;&amp;gt;&amp;gt; post2.save()

# Iterate over all posts using the BlogPost superclass
&amp;gt;&amp;gt;&amp;gt; for post in BlogPost.objects:
...     print '===', post.title, '==='
...     if isinstance(post, TextPost):
...         print post.content
...     elif isinstance(post, LinkPost):
...         print 'Link:', post.url
...     print
...
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;=== Using MongoEngine ===&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;See the tutorial&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;=== MongoEngine Docs ===&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Link: hmarr.com/mongoengine&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects)
2
&amp;gt;&amp;gt;&amp;gt; len(HtmlPost.objects)
1
&amp;gt;&amp;gt;&amp;gt; len(LinkPost.objects)
1

# Find tagged posts
&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects(tags='mongoengine'))
2
&amp;gt;&amp;gt;&amp;gt; len(BlogPost.objects(tags='mongodb'))
1
&lt;/pre&gt;
&lt;p&gt;Simples de trabalhar assim né, agora mão na massa vamos migrar nosso
sistema que usa MongoDB para MongoEngine&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/EPpq4CsZr4c" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/07/03/orm-python-para-mongodb-mongoengine</feedburner:origLink></entry><entry><title>Mexer no que esta quieto (Servidor Linux)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/CDJbiat03B4/mexer-no-que-esta-quieto-servidor-linux" rel="alternate" /><updated>2010-06-29T22:03:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-29:2010/06/29/mexer-no-que-esta-quieto-servidor-linux</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Bom resolvi fazer&amp;nbsp;atualização&amp;nbsp;no servidor onde roda os mirror (CentOS&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/mexer-no-que-esta-quieto-servidor-linux.rst&lt;/tt&gt;, line 9)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;e PHP)
|
|  E com sempre.... PAM (Grande surpresa)&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Ele&amp;nbsp;atualizou&amp;nbsp;o servidor de DNS (PowerDNS) e lá vem a merda....&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Pensei que ele tinha trocado o file de conf e dei um mv em outro que&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/mexer-no-que-esta-quieto-servidor-linux.rst&lt;/tt&gt;, line 14)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;estava na pasta, que beleza faz as coisas sem olhar, o file
estava&amp;nbsp;correto&amp;nbsp;e coloquei um errado o servidor DNS não respondia...&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Pessoal cuidado com servidores em produção.&lt;/div&gt;
&lt;/div&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="100%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TCqCgH5mCjI/AAAAAAAAB6Q/ckojM-O4mPE/s1600/selobranco.jpg"&gt;&lt;img alt="image1" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TCqCgH5mCjI/AAAAAAAAB6Q/ckojM-O4mPE/s1600/selobranco.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Servidor de MIRROR esta na Locaweb, recomendo.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/CDJbiat03B4" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/29/mexer-no-que-esta-quieto-servidor-linux</feedburner:origLink></entry><entry><title>Install WebAlizer in CentOS 5.5 (Final)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/mxPhEA8GuY0/install-webalizer-centos-55-final" rel="alternate" /><updated>2010-06-28T22:02:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-28:2010/06/28/install-webalizer-centos-55-final</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TCqCgH5mCjI/AAAAAAAAB6Q/ckojM-O4mPE/s1600/selobranco.jpg"&gt;&lt;img alt="image0" src="http://4.bp.blogspot.com/_ovJ6PyiUjqA/TCqCgH5mCjI/AAAAAAAAB6Q/ckojM-O4mPE/s1600/selobranco.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;I needed to statisitca mirror for PHP (&lt;a class="reference external" href="http://br3.php.net/"&gt;br3.php.net&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Install dependency:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/install-webalizer-centos-55-final.rst&lt;/tt&gt;, line 22)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    root&amp;#64;avelino: ~ # yum -y install gcc gcc-c++ gd gd-devel zlib zlib-devel

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Install webalizer:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/install-webalizer-centos-55-final.rst&lt;/tt&gt;, line 28)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    root&amp;#64;avelino: ~ # wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.21-02-src.tgz
    root&amp;#64;avelino: ~ # tar -xzvf webalizer-2.21-02-src.tgz
    root&amp;#64;avelino: ~ # mv webalizer-2.21-02-src webalizer
    root&amp;#64;avelino: ~ # mv webalizer /var/www/html
    root&amp;#64;avelino: ~ # cd /var/www/html/webalizer

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Compile webalizer:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/install-webalizer-centos-55-final.rst&lt;/tt&gt;, line 38)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    root&amp;#64;avelino: ~ # ./configure
    root&amp;#64;avelino: ~ # make
    root&amp;#64;avelino: ~ # make install
    root&amp;#64;avelino: ~ # mkdir /etc/webalizer
    root&amp;#64;avelino: ~ # cp /usr/local/etc/webalizer.conf.sample /etc/webalizer
    root&amp;#64;avelino: ~ # cd /etc/webalizer
    root&amp;#64;avelino: ~ # mv webalizer.conf.sample webalizer.conf
    root&amp;#64;avelino: ~ # vi webalizer.conf

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Config line:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;LogFile /var/log/httpd/access_log&lt;/div&gt;
&lt;div class="line"&gt;OutputDir /var/www/html/webalizer&lt;/div&gt;
&lt;div class="line"&gt;HostName yourdomain.com&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Run virtual proses&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/install-webalizer-centos-55-final.rst&lt;/tt&gt;, line 56)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    root&amp;#64;avelino: ~ # for i in /etc/webalizer/*.conf; do webalizer -c $i ; done

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Check this out&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://yourdomain.com/webalizer"&gt;http://yourdomain.com/webalizer&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TCjKCxI4pDI/AAAAAAAAB5I/wwb74lX8s3A/s1600/stats_br3_php.png"&gt;&lt;img alt="image1" src="http://3.bp.blogspot.com/_ovJ6PyiUjqA/TCjKCxI4pDI/AAAAAAAAB5I/wwb74lX8s3A/s400/stats_br3_php.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/mxPhEA8GuY0" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/28/install-webalizer-centos-55-final</feedburner:origLink></entry><entry><title>Continuidade no projeto IUG</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/lKuaF8AfnpA/continuidade-no-projeto-iug" rel="alternate" /><updated>2010-06-24T22:02:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-24:2010/06/24/continuidade-no-projeto-iug</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="https://launchpadlibrarian.net/11748551/iug.png"&gt;&lt;img alt="image0" src="https://launchpadlibrarian.net/11748551/iug.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Hoje conversando com o Coringao (Responsável&amp;nbsp;pelo Ubuntu Games)&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/continuidade-no-projeto-iug.rst&lt;/tt&gt;, line 19)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;perguntei do IUG (Instalador Ubuntu Games).
|  Ele me informou que estava parado e tals.&lt;/p&gt;
&lt;p&gt;O desenvolvedor dele foi o Pretto e por motivos de falta de tempo ele
não pode dar continuidade.&lt;/p&gt;
&lt;p&gt;A partir de hoje estou assumindo o projeto IUG.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://launchpad.net/iug"&gt;Launchpad&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/lKuaF8AfnpA" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/24/continuidade-no-projeto-iug</feedburner:origLink></entry><entry><title>Configurando date.timezone do PHP</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/8HklqfZJkgg/configurando-datetimezone-do-php" rel="alternate" /><updated>2010-06-23T22:01:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-23:2010/06/23/configurando-datetimezone-do-php</id><summary type="html">&lt;p&gt;Quando você instala o php no servidor ele vem com o timezone
em&amp;nbsp;comentário mas tem Framework ou Sistemas que pede isso, bom simples.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Localize o arquivo &lt;em&gt;php.ini&lt;/em&gt; no seu servidor e ache a linha&lt;/div&gt;
&lt;/div&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/configurando-datetimezone-do-php.rst&lt;/tt&gt;, line 13)&lt;/p&gt;
Line block ends without a blank line.&lt;/div&gt;
&lt;p&gt;&lt;em&gt;date.timezone.&lt;/em&gt;
|  Pronto agroa coloque ele assim:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
date.timezone = &amp;quot;America/Sao_Paulo&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Pronto, agora de um restart no seu HTTPD (Apache) e já esta funcionando.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/8HklqfZJkgg" height="1" width="1"/&gt;</summary><category term="date" /><category term="date.timezone" /><category term="php" /><category term="timezone" /><feedburner:origLink>http://avelino.us/2010/06/23/configurando-datetimezone-do-php</feedburner:origLink></entry><entry><title>Algumas diferença entre YUM e APT</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/g_ZQzCNAGYg/algumas-diferenca-entre-yum-e-apt" rel="alternate" /><updated>2010-06-21T22:00:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-21:2010/06/21/algumas-diferenca-entre-yum-e-apt</id><summary type="html">&lt;p&gt;Na tabela abaixo tem algumas diferença entre o YUM e APT.&lt;/p&gt;
&lt;table border="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class="cmd"&gt;&lt;p&gt;APT&lt;/p&gt;
&lt;/th&gt;&lt;th class="cmd"&gt;&lt;p&gt;YUM&lt;/p&gt;
&lt;/th&gt;&lt;th class="cmt"&gt;&lt;p&gt;Descrição breve&lt;/p&gt;
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum install &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum groupinstall &lt;em&gt;&amp;quot;grupo_pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Instala um pacote ou um grupo de pacotes (para ver os grupos de pacotes
que podem ser instalados digite &lt;strong&gt;&amp;quot;yum grouplist&amp;quot;&lt;/strong&gt;. Por exemplo, para
instalar o X11 é necessario digitar o comando &amp;quot;&lt;strong&gt;yum groupinstall &amp;quot;X
Window System&amp;quot;&lt;/strong&gt;&amp;quot;. Já para instalar o KDE digite &amp;quot;&lt;strong&gt;yum groupinstall
&amp;quot;KDE (K Desktop Environment)&amp;quot;&lt;/strong&gt;&amp;quot;).&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum update &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum upgrade &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum install &lt;em&gt;&amp;quot;pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum groupinstall &lt;em&gt;&amp;quot;grupo_pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Atualiza um pacote ou um grupo de pacotes já instalados. Para ver os
grupos de pacotes que podem ser instalados digite &lt;strong&gt;&amp;quot;yum grouplist&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install -d &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum install --downloadonly&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yumdownloader &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Faz o download do pacote, lembrando que com o apt-get e com o yum o
download é feito para o diretório do cache (/var/cache/). Já com o
&amp;quot;yumdownloader&amp;quot;, o &lt;strong&gt;rpm&lt;/strong&gt; vai por padrão para o diretório atual. Para
utilizar a opção &amp;quot;--downloadonly&amp;quot; do comando &amp;quot;yum&amp;quot; é necessário instalar
um plugin (yum install yum-plugin-downloadonly)&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install -V &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Instala um pacote, mostrando as suas versões.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install --auto-remove &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Remove as dependências sem uso ao instalar um pacote.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install --reinstall &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum reinstall &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Reinstala o pacote já instalado.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install -m | --fix-missing | --ignore-missing &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;x&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;&lt;strong&gt;CORRIGIR PROBLEMAS:&lt;/strong&gt; ignora pacotes perdidos. Pode-se usá-lo em
conjunto com a opção &lt;strong&gt;&amp;quot;-f&amp;quot;&lt;/strong&gt;. Use este comando quando aparecer erros
como &amp;quot;500 Can't connect to ftp.debian.org (Connect: Network is
unreachable) Faile to fetch &lt;a class="reference external" href="http://IP:porta"&gt;http://IP:porta&lt;/a&gt;.... Este erro pode aparecer
ao tentar instalar um pacote depois de ter sido executado com sucesso o
&amp;quot;apt-get update&amp;quot;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get install -f | --fix-broken &lt;em&gt;[pacote]&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;x&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;&lt;strong&gt;CORRIGIR PROBLEMAS:&lt;/strong&gt; tenta corrigir o sistema com dependências
quebradas.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get remove &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Este comando não removem as dependências sem uso (orfãs) do pacote que
será removido e nem remove os arquivos de configuração. Contudo avisa
quais são essas dependências e mostra como removê-las (apt-get
autoremove).&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get remove --purge &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum remove &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum erase &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum groupremove &lt;em&gt;&amp;quot;grupo_pacote&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Estes comando não removem as dependências sem uso (orfãs) do pacote que
será removido, mas remove os arquivos de configuração.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get remove --purge --auto-remove &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum remove --remove-leaves &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Remove as dependências sem uso ao remover um pacote. Por padrão o yum e
o apt não removem as dependências sem uso. Veja também o comando
&amp;quot;deborphan&amp;quot; e &amp;quot;rpmorphan&amp;quot;. Para usar a opção &amp;quot;--remove-leaves&amp;quot; do
comando &amp;quot;yum&amp;quot; é necessário instalar um plugin (yum install
yum-plugin-remove-with-leaves).&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get remove -f | --fix-broken &lt;em&gt;[pacote]&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;x&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;&lt;strong&gt;CORRIGIR PROBLEMAS:&lt;/strong&gt; tenta corrigir o sistema com dependências
quebradas.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get update&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum makecache&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Atualiza a lista de todos os pacotes disponíveis (a lista dos pacotes
disponíveis fica numa database feita a partir do comando &amp;quot;apt-get
update&amp;quot; ou &amp;quot;yum makecache&amp;quot;. Ao utilizar o comando &amp;quot;yum makecache&amp;quot; tudo
que está dentro de &amp;quot;/etc/yum.repos.d/&amp;quot; é verificado).&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get upgrade&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum update&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum groupupdate&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Atualiza os pacotes já instalados.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get dist-upgrade&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum upgrade&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum update --obsoletes&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Atualiza a versão da distribuição. O &amp;quot;yum upgrade&amp;quot; = &amp;quot;yum update
--obsoletes&amp;quot;. Veja o plugin para o &amp;quot;yum&amp;quot; chamado
&amp;quot;yum-plugin-upgrade-helper&amp;quot;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get autoremove&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Remove as dependências sem uso.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache search &lt;em&gt;expressão&lt;/em&gt;&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;&lt;p&gt;apt-cache pkgnames &lt;em&gt;expressão&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum search &lt;em&gt;expressão&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum provides &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum whatprovides &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum list &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;yum grouplist &lt;em&gt;grupo_pacote&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Procura a expressão em todos os pacotes disponíveis, nas suas descrições
breves e/ou nas descrições detalhadas. A lista dos pacotes disponíveis
fica numa database feita a partir do comando &amp;quot;apt-get update&amp;quot; ou &amp;quot;yum
makecache&amp;quot;. As opções &amp;quot;provides&amp;quot; e &amp;quot;whatprovides&amp;quot; do comando &amp;quot;yum&amp;quot;
mostram a descrição breve do pacote.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache show &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum info &lt;em&gt;[pacote]&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum groupinfo &lt;em&gt;grupo_pacote&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Mostra informações sobre um pacote ou no caso do &amp;quot;yum info&amp;quot; pode mostrar
informações de todos os pacotes.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache pkgnames &lt;em&gt;[expressão]&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum list &lt;em&gt;[nome_pacote]&lt;/em&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;yum grouplist [nome_grupo_pacote]&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Mostra uma lista de pacotes disponíveis (a lista dos pacotes disponíveis
fica numa database feita a partir do comando &amp;quot;apt-get update&amp;quot; ou &amp;quot;yum
makecache&amp;quot;) ou um que coincida com a expressão utilizada.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache depends &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum deplist &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Mostra as dependências de um determinado pacote. Também mostra
sugestões, conflitos e recomendações.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache stats&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Mostra estatísticas sobre a database do pacotes.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-cache policy&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Mostra como está a configuração do &amp;quot;/etc/apt/preferences&amp;quot; que prioriza
pacotes.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get clean&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum clean packages&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Apaga o cache local gerado ao instalar ou atualizar algum pacote. Eles
ficam em &amp;quot;/var/cache/apt/&amp;quot; ou em &amp;quot;/var/cache/yum/&amp;quot;&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum clean dbcache&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum clean headers&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum clean metadata&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;apaga arquivos XML, XML.TGZ e SQLITE que ficam dentro de
&amp;quot;/var/cache/yum/fedora&amp;quot; e em &amp;quot;/var/cache/yum/updates&amp;quot;. Este comando
apaga cache da lista de pacotes disponíveis que são gerados ao utilizar
comando como &amp;quot;yum update&amp;quot;, &amp;quot;yum makecache&amp;quot; etc. Então, ao utilizar o
comando &amp;quot;yum clean metadata&amp;quot; toda lista de pacotes terá que ser baixada
novamente.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum clean all&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Equivalente aos comando &amp;quot;yum clean headers&amp;quot;, &amp;quot;yum clean metadata&amp;quot;, &amp;quot;yum
clean packages&amp;quot; e &amp;quot;yum clean dbcache&amp;quot;&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get source &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Faz o download do código fonte do pacote para o diretório atual,
incluindo o diretório descompactado do pacote (já faz a descompactação
do tar.gz) e aparecem vários outros pacotes relacionados.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-get source -d &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yumdownloader --source &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Faz o download do código fonte do pacote para o diretório atual. No caso
do &amp;quot;apt-get&amp;quot; é um &amp;quot;tar.gz&amp;quot;. Já com o &amp;quot;yumdownloader&amp;quot; é um &amp;quot;src.rpm&amp;quot;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum-builddep &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;x&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;/etc/apt/sources.list&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;apt-get update&lt;/div&gt;
&lt;div class="line"&gt;apt-get install&lt;/div&gt;
&lt;div class="line"&gt;apt-get upgrade&lt;/div&gt;
&lt;div class="line"&gt;etc&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;p&gt;ou&lt;/p&gt;
&lt;/center&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;/etc/apt/preferences&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;apt-get install -t etch &lt;em&gt;pacote&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum downgrade &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;O manual on-line &amp;quot;man apt-get&amp;quot; recomenda cuidado ao fazer downgrades. No
caso do comando &amp;quot;apt&amp;quot; se deve primeiro mudar o repositório
(/etc/apt/sources.list) e depois atualizar a lista de pacotes
disponíveis (apt-get update) antes de tentar um downgrade.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;yum {ação} --noplugins &lt;em&gt;pacote&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Roda com todos os plugins desabilitado. Os plugins são habilitados por
padrão.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-file search /caminho/arquivo&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;rpm -qf / caminho/arquivo&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Descobre em qual pacote está um determinado arquivo ou biblioteca.
Deve-se passar o path do arquivo em vez e digitar &amp;quot;apt-file update&amp;quot; para
atualizar o cache. Este comando é o mesmo que consultar o endereço
&lt;a class="reference external" href="http://draft.blogger.com/packages.debian.org/"&gt;packages.debian.org&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;apt-key update&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Caso real que aparecia a mensagem &amp;quot;W: GPG error:&amp;quot;. Digitei &amp;quot;apt-key
update&amp;quot; e resolveu o problema.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;apt-get install debian-archive-keyring&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;apt-get update&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;p&gt;&lt;center&gt;&lt;p&gt;ou&lt;/p&gt;
&lt;/center&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;apt-get install --reinstall debian-archive-keyring&lt;/div&gt;
&lt;div class="line"&gt;apt-get update&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Caso real que apareciam as seguintes mensagens ao utilizar o comando
&amp;quot;apt&amp;quot;: &lt;strong&gt;&amp;quot;W: GPG error:&amp;quot;, &amp;quot;The following packages could not be
authenticated debian&amp;quot;, &amp;quot;The following signatures couldn't be verified
because the public key is not available&amp;quot;, &amp;quot;There is no public key
available for the following key IDs&amp;quot; ou &amp;quot;The following signatures were
invalid&amp;quot;.&lt;/strong&gt;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;center&gt;&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;a href="#id1"&gt;&lt;span class="problematic" id="id2"&gt;**&lt;/span&gt;&lt;/a&gt;Arquivos de&lt;/dt&gt;
&lt;dd&gt;&lt;div class="first system-message" id="id1"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/algumas-diferenca-entre-yum-e-apt.rst&lt;/tt&gt;, line 1536); &lt;em&gt;&lt;a href="#id2"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Inline strong start-string without end-string.&lt;/div&gt;
&lt;p class="last"&gt;Configuração**&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/center&gt;&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;center&gt;&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;a href="#id3"&gt;&lt;span class="problematic" id="id4"&gt;**&lt;/span&gt;&lt;/a&gt;Arquivos de&lt;/dt&gt;
&lt;dd&gt;&lt;div class="first system-message" id="id3"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/algumas-diferenca-entre-yum-e-apt.rst&lt;/tt&gt;, line 1558); &lt;em&gt;&lt;a href="#id4"&gt;backlink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
Inline strong start-string without end-string.&lt;/div&gt;
&lt;p class="last"&gt;Configuração**&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/center&gt;&lt;/td&gt;&lt;th class="cmt"&gt;&lt;p&gt;Descrição breve&lt;/p&gt;
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/apt/sources.list&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;/etc/yum.repos.d/fedora.repo&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;/etc/yum.repos.d/fedora-updates.repo&lt;/div&gt;
&lt;div class="line"&gt;/etc/yum.repos.d/fedora-updates-testing.repo&lt;/div&gt;
&lt;div class="line"&gt;/etc/yum.repos.d/fedora-rawhide.repo&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;* fedora.repo: repositório padrão de pacotes do Fedora;&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;* fedora-updates.repo: repositório de atualizações de pacotes já
testadas;&lt;/p&gt;
&lt;p&gt;* fedora-updates-testing.repo: repositório de atualizações de pacotes
que estão em fase de teste;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;* fedora-rawhide.repo: repositório de pacotes não testados e que ainda
em desenvolvimento. Este repositório é mais usado por desenvolvedores
para testarem novos pacotes para a próxima versão do Fedora.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/apt/apt.conf&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/yum.conf&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Arquivo de configuração das ações que devem ser tomandas ao utiliza o
comando apt.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;/var/cache/apt/&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;/var/cache/yum/&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Cache dos pacotes e das databases.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/apt/preferences&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Prioridades das versões do Debian GNU/Linux.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;/var/lib/dpkg/status&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;/var/lib/rpm/*&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Lista de pacotes instalados ou não-instalados&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/yum/pluginconf.d/&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Diretório onde ficam arquivos de configuração dos plugins (novas
funcionalidades) para o comando &amp;quot;yum&amp;quot;.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cmd"&gt;&lt;p&gt;---&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmd"&gt;&lt;p&gt;/etc/yum/yum-updatesd.conf&lt;/p&gt;
&lt;/td&gt;&lt;td class="cmt"&gt;&lt;p&gt;Arquivo de configuração para o daemon do &amp;quot;yum&amp;quot; que notifica a existência
de atualização. Esta notificação pode ser através de e-mail, syslog ou
sobre o dbus (daemon de menssagem).&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;by &lt;a class="reference external" href="http://www.hugoazevedo.eti.br/html/apt_yum.html"&gt;Hugo&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/g_ZQzCNAGYg" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/21/algumas-diferenca-entre-yum-e-apt</feedburner:origLink></entry><entry><title>Introdução ao tnsnames.ora</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/QKQ7O5SNaH8/introducao-ao-tnsnamesora" rel="alternate" /><updated>2010-06-21T21:59:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-21:2010/06/21/introducao-ao-tnsnamesora</id><summary type="html">&lt;p&gt;A Oracle (corporação) é uma empresa mantenedora
do&amp;nbsp;Database&amp;nbsp;Enterprise&amp;nbsp;Oracle. Como o foco da Oracle é&amp;nbsp;business eles
foca em uma&amp;nbsp;documentação&amp;nbsp;mais profissional onde os Certificado consiga
entender com facilidade.&lt;/p&gt;
&lt;p&gt;Bom chega de blablabla, vamos para parte de template de TNS:&lt;/p&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;/Users/avelino/workspace/avelino.github.io/content/old/introducao-ao-tnsnamesora.rst&lt;/tt&gt;, line 15)&lt;/p&gt;
&lt;p&gt;Cannot analyze code. No Pygments lexer found for &amp;quot;brush:python&amp;quot;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.. code:: brush:python

    XE =
    (DESCRIPTION =
    (ADDRESS =
    (PROTOCOL = TCP)(HOST = localhost)
    (PORT = 1521)
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = XE)
    )
    )

&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Isso é muito importante quando você tem uma aplicação onde tem que
conectar em um Database remoto.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/QKQ7O5SNaH8" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/21/introducao-ao-tnsnamesora</feedburner:origLink></entry><entry><title>Falando um pouco do iGrape Framework</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/52t4SaTbzIY/falando-um-pouco-do-igrape-framework" rel="alternate" /><updated>2010-06-19T21:59:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-19:2010/06/19/falando-um-pouco-do-igrape-framework</id><summary type="html">&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: right;"&gt;&lt;p&gt;&lt;img alt="image0" src="http://1.bp.blogspot.com/_ovJ6PyiUjqA/TBzvRzg0EEI/AAAAAAAAB4I/NMDMLDdJ8IY/s320/igrape_grd.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;iGrape é um Framework com um foco bem diferente de todos os framework do
mercado. Ele busca unificar algumas linguagem de programação onde ele
vai ficar&amp;nbsp;responsável&amp;nbsp;pela logica e estrutura do APLICATIVO e a
linguagem fica responsável pela syntax.&lt;/p&gt;
&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Hoje o iGrape Framework tem versão em PHP onde estamos desenvolvendo
a&amp;nbsp;arquitetura do framework. Vamos contar com versão php, python, ruby e
css (Buscando uma arquitetura de escrita unica).&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;iGrape quadro está disponível desde 2007 e uso dos últimos três anos em
vários cenários de produção. É baseado em princípios sólidos MVC,
incluindo a separação de exibição, lógica e camadas de dados. Ele foi
projetado para ser eficiente, modular e expansível, permitem um
equilíbrio de luz e um monte de recursos em três línguas que ele
trabalha (PHP, Python e Ruby).&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Caso você gostou da ideia do iGrape Framework e quer ajudar no
Desenvolvimento,&amp;nbsp;Redator&amp;nbsp;(Escrever DOCS), Tester (Em diversos ambientes)
e etc:&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Github:&amp;nbsp;&lt;a class="reference external" href="http://github.com/igrape/igrape"&gt;github.com/igrape/igrape&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Grupo:&amp;nbsp;&lt;a class="reference external" href="http://groups.google.com/group/igrape"&gt;groups.google.com/group/igrape&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/52t4SaTbzIY" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/19/falando-um-pouco-do-igrape-framework</feedburner:origLink></entry><entry><title>Tweet Switch com Youtube no Gtalk</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/QC78PX3wMyU/tweet-switch-com-youtube-no-gtalk" rel="alternate" /><updated>2010-06-17T21:58:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-06-17:2010/06/17/tweet-switch-com-youtube-no-gtalk</id><summary type="html">&lt;p&gt;&lt;img alt="image0" src="http://lh5.ggpht.com/_ovJ6PyiUjqA/TBqw_QqxB1I/AAAAAAAAB1E/mx9gAxoiiyc/s512/Screen%20shot%202010-06-17%20at%208.33.26%20PM.png" /&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/QC78PX3wMyU" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/06/17/tweet-switch-com-youtube-no-gtalk</feedburner:origLink></entry><entry><title>Python Web ou Django (Framework MVC Design Pattern)</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/vbafzM6VNTw/python-web-ou-django-framework-mvc-design-pattern" rel="alternate" /><updated>2010-05-25T21:55:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-05-25:2010/05/25/python-web-ou-django-framework-mvc-design-pattern</id><summary type="html">&lt;p&gt;Bom hoje temos alguns Framework (MVC) Python na web, vou estar
comparando o source Python Web com Django, simplesmente ficou mais
somples.&lt;/p&gt;
&lt;p&gt;Python Web:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#!/usr/bin/python

import MySQLdb

print &amp;quot;Content-Type: text/html&amp;quot;
print
print &amp;quot;&amp;lt;title&amp;gt;Books&amp;lt;/title&amp;gt;&amp;quot;
print &amp;quot;&amp;quot;
print &amp;quot;&amp;lt;h1&amp;gt;Books&amp;lt;/h1&amp;gt;&amp;quot;
print &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;
connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')
cursor = connection.cursor()
cursor.execute(&amp;quot;SELECT name FROM books ORDER BY pub_date DESC LIMIT 10&amp;quot;)
for row in cursor.fetchall():
    print &amp;quot;&amp;lt;li&amp;gt;%s&amp;lt;/li&amp;gt;&amp;quot; % row[0]
print &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;
print &amp;quot;&amp;quot;
connection.close()
&lt;/pre&gt;
&lt;p&gt;Django (MVC Design Pattern):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# models.py (the database tables)

from django.db import models

class Book(models.Model):
    name = models.CharField(maxlength=50)
    pub_date = models.DateField()

# views.py (the business logic)

from django.shortcuts import render_to_response
from models import Book

def latest_books(request):
    book_list = Book.objects.order_by('-pub_date')[:10]
    return render_to_response('latest_books.html', {'book_list': book_list})

# urls.py (the URL configuration)

from django.conf.urls.defaults import *
import views

urlpatterns = patterns('',
    (r'latest/$', views.latest_books),
)

# latest_books.html (the template)

&amp;lt;title&amp;gt;Books&amp;lt;/title&amp;gt;

&amp;lt;h1&amp;gt;Books&amp;lt;/h1&amp;gt;&amp;lt;ul&amp;gt;{% for book in book_list %}
&amp;lt;li&amp;gt;{{ book.name }}&amp;lt;/li&amp;gt;
{% endfor %} &amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/vbafzM6VNTw" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/05/25/python-web-ou-django-framework-mvc-design-pattern</feedburner:origLink></entry><entry><title>pyBotIRC Bot em Python para IRC</title><link href="http://feedproxy.google.com/~r/pyAvelino/~3/mlSz7-JTaQo/pybotirc-bot-em-python-para-irc" rel="alternate" /><updated>2010-05-23T21:56:00+02:00</updated><author><name>avelino</name></author><id>tag:avelino.us,2010-05-23:2010/05/23/pybotirc-bot-em-python-para-irc</id><summary type="html">&lt;p&gt;Bot simples usando socket no Python:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import sys
import socket
import string

HOST=&amp;quot;irc.freenode.net&amp;quot;
PORT=6667
NICK=&amp;quot;pyAvelino&amp;quot;
IDENT=&amp;quot;pyAvelino&amp;quot;
REALNAME=&amp;quot;pyBotIRC&amp;quot;
readbuffer=&amp;quot;&amp;quot;
CHANNELINIT=&amp;quot;#channel&amp;quot;

s=socket.socket( )
s.connect((HOST, PORT))
s.send(&amp;quot;NICK %s\r\n&amp;quot; % NICK)
s.send(&amp;quot;USER %s %s bla :%s\r\n&amp;quot; % (IDENT, HOST, REALNAME))
s.send('JOIN %s\r\n' % CHANNELINIT)

while 1:
# readbuffer=readbuffer+s.recv(1024)
readbuffer=s.recv(1024)
print readbuffer
temp=string.split(readbuffer, &amp;quot;\n&amp;quot;)
readbuffer=temp.pop( )

for line in temp:
    line=string.rstrip(line)
    line=string.split(line)

    if(line[0]==&amp;quot;PING&amp;quot;):
        s.send(&amp;quot;PONG %s\r\n&amp;quot; % line[1])
&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/mlSz7-JTaQo" height="1" width="1"/&gt;</summary><feedburner:origLink>http://avelino.us/2010/05/23/pybotirc-bot-em-python-para-irc</feedburner:origLink></entry></feed>
