<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>avelino.us's Weblog</title><link>http://avelino.us/</link><description>Latest entries on Weblog</description><language>en-us</language><lastBuildDate>Thu, 22 Dec 2011 07:58:00 -0600</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+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/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><item><title>VIM a IDE para programadores Python
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/UULJamWqoq0/</link><description>&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;code&gt;.vimrc&lt;/code&gt; e nesse post vou explicar como usar o mesmo.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;"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. "&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Assumindo que o &lt;code&gt;vi&lt;/code&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&gt;&lt;code&gt;curl https://raw.github.com/avelino/.vimrc/master/bootstrap.sh -o - | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Após isso ele vai baixar o repositório na sua pasta &lt;code&gt;HOME&lt;/code&gt;.
Recomendo o uso o VIM em GUI pois podemos chegar 256 cores, ou seja, colocar temas mais agradável e assim deixando o uso do &lt;code&gt;vim&lt;/code&gt; mais confortável para o desenvolvimento, para Linux é o &lt;code&gt;gvim&lt;/code&gt; e para mac o &lt;code&gt;macvim&lt;/code&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;code&gt;VIM&lt;/code&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&gt;
&lt;li&gt;&lt;code&gt;:cd&lt;/code&gt; /path Abrir pasta&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tn&lt;/code&gt; Abrir nova aba&lt;/li&gt;
&lt;li&gt;&lt;code&gt;te&lt;/code&gt; Abrir nova aba e carregar arquivo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t]&lt;/code&gt; Proxima aba&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t[&lt;/code&gt; Voltar aba&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+c&lt;/code&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;code&gt;Ctrl+f&lt;/code&gt; Busca arquivo e abre na mesma aba&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+s&lt;/code&gt; Busca arquivo e abre em uma nova aba&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\b&lt;/code&gt; Abre arquivo que esta no buffer do vim (Arquivo abertos)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\d&lt;/code&gt;, &lt;code&gt;\n&lt;/code&gt; ou &lt;code&gt;F3&lt;/code&gt; Abre navegador de arquivo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\f&lt;/code&gt; Lista todas as class e def (Python)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\j&lt;/code&gt; Vai para declaração de um metodo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\r&lt;/code&gt; Renomear todos os metodos&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[e&lt;/code&gt; Move linha para cima&lt;/li&gt;
&lt;li&gt;&lt;code&gt;e]&lt;/code&gt; Move linha para baixo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\v ou&lt;/code&gt;Ctrl+w + v` Divide a tela em vertical&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\h&lt;/code&gt; ou &lt;code&gt;Ctrl+w + s&lt;/code&gt; Divide a tela em horizontal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\w&lt;/code&gt; ou &lt;code&gt;Ctrl+w + q&lt;/code&gt; Fecha a aba atual&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+k&lt;/code&gt; Abre console Python&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+j&lt;/code&gt; Roda o script Python aberto&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\sh&lt;/code&gt; Abre bash (shell)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\p&lt;/code&gt; Manda o arquivo em aberto para o dpaste.com&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\ga&lt;/code&gt; Git add .&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\gc&lt;/code&gt; Git commit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\gsh&lt;/code&gt; Git push&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\gs&lt;/code&gt; Git status&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\gd&lt;/code&gt; Git diff&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\gr&lt;/code&gt; Git remove&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\S&lt;/code&gt; Remove todos os espaços do final&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\c&lt;/code&gt; Lista controle de versao do buffer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jpIajv5Vide8hn5dgGQM8ujI9g4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jpIajv5Vide8hn5dgGQM8ujI9g4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jpIajv5Vide8hn5dgGQM8ujI9g4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jpIajv5Vide8hn5dgGQM8ujI9g4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/UULJamWqoq0" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Thu, 22 Dec 2011 07:58:00 -0600</pubDate><guid isPermaLink="false">http://avelino.us/2011/12/22/vim-ide-para-programadores-python/</guid><feedburner:origLink>http://avelino.us/2011/12/22/vim-ide-para-programadores-python/</feedburner:origLink></item><item><title>Google Nexus S, atualização oficial para Android 4.0 (Ice Cream Sandwich)
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/7uVchCmbc_M/</link><description>&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 href="https://twitter.com/#!/googlenexus/status/147783081426817024"&gt;Google Nexus&lt;/a&gt;.&lt;/p&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;code&gt;1&lt;/code&gt; - Faça download da imagem do Android 4.0 para o Nexus S no seguinte link:
&lt;a 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 href="http://dl.dropbox.com/u/763381/VQ8PQk_V.zip"&gt;http://dl.dropbox.com/u/763381/VQ8PQk_V.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; - Coloque o &lt;code&gt;VQ8PQk_V.zip&lt;/code&gt; SD do seu Nexus S e você deve renomear o arquivo para &lt;code&gt;update.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt; - Desligue o seu aparelho&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt; - Aperte o botão do &lt;code&gt;volume&lt;/code&gt; para cima + o botão &lt;code&gt;power&lt;/code&gt;, seu celular vai iniciar no modulo &lt;code&gt;fastboot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5&lt;/code&gt; - Selecione a opção &lt;code&gt;recovery&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;6&lt;/code&gt; - Vai começa carregar e aparecera um &lt;code&gt;triângulo&lt;/code&gt; com um &lt;code&gt;!&lt;/code&gt;, nessa tela você deve aperta o botão &lt;code&gt;power&lt;/code&gt; + &lt;code&gt;volume&lt;/code&gt; para cima (&lt;code&gt;Deve ser na sequência relatado no post&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;7&lt;/code&gt; - Vai aparecer um menu onde você deve selecionar a seguinte opção &lt;code&gt;Apply update from /sdcard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;8&lt;/code&gt; - Após instalar você deve selecionar &lt;code&gt;reboot system now&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;9&lt;/code&gt; - Pronto, &lt;code&gt;Android 4.0.3&lt;/code&gt; instalado no seu Nexus S&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;code&gt;dalvik cache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&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;/code&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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5yl0jRsHQuYZUIlkUQZySf9JFqw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5yl0jRsHQuYZUIlkUQZySf9JFqw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5yl0jRsHQuYZUIlkUQZySf9JFqw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5yl0jRsHQuYZUIlkUQZySf9JFqw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/7uVchCmbc_M" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Sat, 17 Dec 2011 11:41:09 -0600</pubDate><guid isPermaLink="false">http://avelino.us/2011/12/17/google-nexus-s-atualizacao-oficial-para-android-40/</guid><feedburner:origLink>http://avelino.us/2011/12/17/google-nexus-s-atualizacao-oficial-para-android-40/</feedburner:origLink></item><item><title>Nova versão da API do Dropbox
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/y1ah4ssPN48/</link><description>&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&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 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 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;p&gt;O dropbox implementou um oauth onde podemos desenvolver software e 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" title="OAuth Dropbox" /&gt;&lt;/p&gt;
&lt;p&gt;Vou falar um pouco sobre 3 metodos que esta dentro da biblioteca "dropbox" 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&gt;&lt;code&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;/code&gt;&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&gt;&lt;code&gt;client = client.DropboxClient(sess)
print "linked account:", client.account_info()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora usando o metodo "client" podemos fazer get e put de arquivos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from dropbox import client
f = open('working-draft.txt')
response = client.put_file('/magnum-opus.txt', f)
print "uploaded:", response
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Após criar o arquivos podemos ler ele:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print client.get_file('/magnum-opus.txt').read()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reescrever o arquivo com uma nova revisão para criar um novo arquivo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;out = open('magnum-opus.txt', 'w')
out.write(client.get_file('/magnum-opus.txt',rev='362e2029684fe').read())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para trabalhar com REST temos um ótima documentação &lt;a 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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mZX1BJvVBPBauRXN8GKqefyvahY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mZX1BJvVBPBauRXN8GKqefyvahY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mZX1BJvVBPBauRXN8GKqefyvahY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mZX1BJvVBPBauRXN8GKqefyvahY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/y1ah4ssPN48" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Thu, 13 Oct 2011 22:23:54 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/10/13/nova-versao-da-api-do-dropbox/</guid><feedburner:origLink>http://avelino.us/2011/10/13/nova-versao-da-api-do-dropbox/</feedburner:origLink></item><item><title>Problema com hashlib + md5 (Python 2.7)
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/KNfjKVdF1bg/</link><description>&lt;p&gt;Estava com o seguinte problema "Error: No module named _md5", primeiramente pensei que foce 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 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 "_md5", criei um arquivo chamado "_md5py":&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class _md5:
    def __init__():
        import md5
        return md5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lendo as documentação vi que a lib "hashlib._md5" foi deprecada pois a md5 ficou no lugar. Espero que ajude outras pessoas que esta com esse problema.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j1VZeY-FuVJ5h87DUX-UeT5hiTY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j1VZeY-FuVJ5h87DUX-UeT5hiTY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j1VZeY-FuVJ5h87DUX-UeT5hiTY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j1VZeY-FuVJ5h87DUX-UeT5hiTY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/KNfjKVdF1bg" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Tue, 04 Oct 2011 15:04:46 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/10/04/problema-com-hashlib-md5-python-27/</guid><feedburner:origLink>http://avelino.us/2011/10/04/problema-com-hashlib-md5-python-27/</feedburner:origLink></item><item><title>Porque fazer teste unitario em javascript?
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/Ep2w7ARiqKM/</link><description>&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&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;script src="http://code.jquery.com/jquery-latest.js"&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;link rel="stylesheet" href="http://code.jquery.com/qunit/git/qunit.css" type="text/css" media="screen" /&amp;gt;
  &amp;lt;script type="text/javascript" src="http://code.jquery.com/qunit/git/qunit.js"&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' ? "+" : oper

      if(oper == "+")
        cal = val1 + val2
      else if(oper == "-")
        cal = val1 - val2
      else
        cal = false

      return cal
    }
  &amp;lt;/script&amp;gt;

  &amp;lt;script&amp;gt;
    $(document).ready(function(){

      module("Test render html")
      test("test valor in #test1", function(){
        equals("ok ok ok", $("#test1").html())
        notEqual("ok ok ok ", $("#test1").html())
      })

      module("Test function calc()")
      test("test basic return 10", function(){
        equals(10, calc(10))
        notEqual(10, calc(11))
      })

      test("test basic sum 2 parameter", function(){
        equals(20, calc(10, 10))
        notEqual(21, calc(10, 10))
        deepEqual(20, calc(10, 10))
        notStrictEqual("20", calc(10, 10))
      })

      test("set operator +", function(){
        equals(20, calc(10, 10, "+"))
        equals(false, calc(10, 10, "..."))
      })

      test("set operator -", function(){
        equals(1, calc(10, 9, "-"))
      })

    })
  &amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1 id="qunit-header"&amp;gt;QUnit example&amp;lt;/h1&amp;gt;
  &amp;lt;h2 id="qunit-banner"&amp;gt;&amp;lt;/h2&amp;gt;
  &amp;lt;div id="qunit-testrunner-toolbar"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;h2 id="qunit-userAgent"&amp;gt;&amp;lt;/h2&amp;gt;
  &amp;lt;ol id="qunit-tests"&amp;gt;&amp;lt;/ol&amp;gt;
  &amp;lt;div id="qunit-fixture"&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;

  &amp;lt;div id="test1"&amp;gt;ok ok ok&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&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;p&gt;Segue abaixo o print de como ficou o test:
&lt;img alt="Alt text" src="http://s1.i1.picplzthumbs.com/upload/img/16/3f/a6/163fa61700835d5c6527f30c407f5815f206e47b_wmlg.jpg" title="Print de como ficou o teste" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o-lxyPh0xvsTF6H9VSWgGY2dAF8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o-lxyPh0xvsTF6H9VSWgGY2dAF8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o-lxyPh0xvsTF6H9VSWgGY2dAF8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o-lxyPh0xvsTF6H9VSWgGY2dAF8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/Ep2w7ARiqKM" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Thu, 21 Jul 2011 23:22:27 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/07/21/porque-fazer-teste-unitario-em-javascript/</guid><feedburner:origLink>http://avelino.us/2011/07/21/porque-fazer-teste-unitario-em-javascript/</feedburner:origLink></item><item><title>Template Django com Haml
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/KPn71-BJk5o/</link><description>&lt;p&gt;&lt;a 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 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&gt;&lt;code&gt;%html{'xmlns':"http://www.w3.org/1999/xhtml", 'lang':"en", "xml:lang":"en"}
  %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("jquery", "1.6.1");

  %body
    #header
      %h1#lero
        .test Haml
        %ul.navigation
          - for run in varloop
            %li= run
    #content
      Testando para ver se funciona o HamlPy
&lt;/code&gt;&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&gt;&lt;code&gt;/Users/avelino/.virtualenvs/haml/bin/hamlpy template/index.haml template/index.html
&lt;/code&gt;&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&gt;&lt;code&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("jquery", "1.6.1");
    &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;/code&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&gt;&lt;code&gt;# -*- coding: utf-8 -*-
"""
    views

    :copyright: (c) 2011 by the Avelino Labs, see Thiago Avelino &amp;lt;thiago@avelino.us&amp;gt; for more details.
    :license: BSD, see LICENSE for more details.
"""

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;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MdmTDoYPaw_wvHNVwXmSCfFttoU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MdmTDoYPaw_wvHNVwXmSCfFttoU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MdmTDoYPaw_wvHNVwXmSCfFttoU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MdmTDoYPaw_wvHNVwXmSCfFttoU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/KPn71-BJk5o" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Sat, 28 May 2011 09:24:57 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/05/28/template-django-com-haml/</guid><feedburner:origLink>http://avelino.us/2011/05/28/template-django-com-haml/</feedburner:origLink></item><item><title>Entendendo na pratica como funciona a linguagem Go
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/-TOilOm5nDw/</link><description>&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&gt;&lt;code&gt;package main

import (
    "http";
    "io";
    "fmt";
)

func HelloServer(c *http.Conn, req *http.Request) {
    io.WriteString(c, "hello, world!\n");
}

func main() {
    fmt.Printf("http://localhost:8080/hello\n");
    http.Handle("/hello", http.HandlerFunc(HelloServer));
    err := http.ListenAndServe(":8080", nil);
    if err != nil {
        panic("ListenAndServe: ", err.String())
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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; 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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cH12wGASJrThwwEtzGW2kaz4hBo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cH12wGASJrThwwEtzGW2kaz4hBo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cH12wGASJrThwwEtzGW2kaz4hBo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cH12wGASJrThwwEtzGW2kaz4hBo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/-TOilOm5nDw" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Wed, 25 May 2011 08:01:40 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/05/25/entendendo-na-pratica-como-funciona-linguagem-go/</guid><feedburner:origLink>http://avelino.us/2011/05/25/entendendo-na-pratica-como-funciona-linguagem-go/</feedburner:origLink></item><item><title>[TOPICOFF] Site fora do ar, DataCenter tirando meu sono
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/eNRseOLQ390/</link><description>&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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SmfT10fIkBuOohl3KqbPw2aRPRQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SmfT10fIkBuOohl3KqbPw2aRPRQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SmfT10fIkBuOohl3KqbPw2aRPRQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SmfT10fIkBuOohl3KqbPw2aRPRQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/eNRseOLQ390" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Fri, 29 Apr 2011 05:47:22 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/04/29/topicoff-site-fora-do-ar-datacenter-tirando-meu-so/</guid><feedburner:origLink>http://avelino.us/2011/04/29/topicoff-site-fora-do-ar-datacenter-tirando-meu-so/</feedburner:origLink></item><item><title>Upload da arquivo no Google App Engine (BlobProperty)
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/kj24d205azE/</link><description>&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&gt;&lt;code&gt;class DatastoreFile(db.Model):
    data = db.BlobProperty(required=True)
    mimetype = db.StringProperty(required=True)
&lt;/code&gt;&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&gt;&lt;code&gt;class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write(template.render("upload.html", {}))

    def post(self):
        file = self.request.POST['file']

        entity = DatastoreFile(data=file.value, mimetype=file.type)
        entity.put()

        file_url = "http://%s/%d/%s" % (self.request.host, entity.key().id(), file.name)
        self.response.out.write("Your uploaded file is now available at %s" % (file_url,))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Podemos notar que na definição get() temos apenas a renderização do "upload.html", o conteudo dele é bem simples, temos um input do tipo file e outro submit:&lt;/p&gt;
&lt;pre&gt;&lt;code&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="post" action="/" enctype="multipart/form-data"&amp;gt;
    &amp;lt;input type="file" name="file" /&amp;gt;
    &amp;lt;input type="submit" value="Upload" /&amp;gt;
  &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&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 "file" 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 é "image/jpeg", então tenho que fazer o responser renderizar em formatado "image/jpeg".&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&gt;&lt;code&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;/code&gt;&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&gt;&lt;code&gt;def main():
    application = webapp.WSGIApplication([
        ('/', MainHandler),
        ('/(\d+)/(.*)', DownloadHandler)
        ],debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quem ainda estiver com duvida pode dar uma olhar no repositorio: &lt;a href="https://bitbucket.org/avelino/post_py_upload_de_arquivo_no_gae/src" title="Repositorio"&gt;https://bitbucket.org/avelino/post_py_upload_de_arquivo_no_gae/src&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Vor4Huf2wswOCG9diO6ZxpKnr-M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vor4Huf2wswOCG9diO6ZxpKnr-M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Vor4Huf2wswOCG9diO6ZxpKnr-M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vor4Huf2wswOCG9diO6ZxpKnr-M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/kj24d205azE" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Sat, 23 Apr 2011 13:50:11 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/04/23/upload-da-arquivo-no-google-app-engine-blobpropert/</guid><feedburner:origLink>http://avelino.us/2011/04/23/upload-da-arquivo-no-google-app-engine-blobpropert/</feedburner:origLink></item><item><title>Criando sistema com Multithreaded em Python
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/u6TxUqmwe0c/</link><description>&lt;p&gt;Multithreaded é quando temos mais de um programa executando ao mesmo tempo, totalmente diferente de executar duas vez o mesmo programa, com "threads" 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&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&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&gt;&lt;code&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 "%s: %s" % ( name, time.ctime(time.time()) )

# Criar dois tópicos
try:
    thread.start_new_thread( print_time, ("Thread-1", 2, ) )
    thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
    print "Erro: não conseguiu iniciar a thread"

while 1:
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Executando:&lt;/p&gt;
&lt;pre&gt;&lt;code&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;/code&gt;&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;h2&gt;Modulos da biblioteca thread&lt;/h2&gt;
&lt;ul&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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VbNQuSdi6bxWrGW7TdYjP8CHHoo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VbNQuSdi6bxWrGW7TdYjP8CHHoo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VbNQuSdi6bxWrGW7TdYjP8CHHoo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VbNQuSdi6bxWrGW7TdYjP8CHHoo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/u6TxUqmwe0c" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Fri, 01 Apr 2011 02:58:49 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/04/01/criando-sistema-com-multithreaded-em-python/</guid><feedburner:origLink>http://avelino.us/2011/04/01/criando-sistema-com-multithreaded-em-python/</feedburner:origLink></item><item><title>Trabalhando com Python e MongoDB
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/rwWXYXr1XzY/</link><description>&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&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from pymongo import Connection
&amp;gt;&amp;gt;&amp;gt; connection = Connection()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OU&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; connection = Connection('localhost', 27017)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Usar/Criar um Database:
    &amp;gt;&amp;gt;&amp;gt; db = connection.forum_database&lt;/p&gt;
&lt;p&gt;OU&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; db = connection['forum-database']
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O MongoDB usa um formato jSON para sua syntax, veja abaixo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; forum = {"author": "Thiago Avelino",
...         "text": "Python e MongoDB",
...         "tags": ["mongodb", "python", "pymongo"]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inserindo em um Documento, usando o método insert():&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; imaster = db.imaster
&amp;gt;&amp;gt;&amp;gt; imaster.insert(forum)
ObjectId('4c7400f42d73303fd2000000')
&lt;/code&gt;&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&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; db.collection_names()
[u'imaster', u'system.indexes']
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Selecionando apenas um documento com find_one()&lt;/p&gt;
&lt;pre&gt;&lt;code&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;Filtrando, usando condições para selecionar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; imaster.find_one({"author": "Thiago Avelino"})
{u'text': u'Python e MongoDB', u'_id': ObjectId('4c7400f42d73303fd2000000'), u'author': u'Thiago Avelino', u'tags': [u'mongodb', u'python', u'pymongo']}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Contando:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; imaster.count()
1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Temos também alguns ORM Python que trabalha com o MongoDB, um exemplo é o MongoEngine que trabalha exatamente igual o ORM do Django.
Veja um exemplo usando MongoEngine:&lt;/p&gt;
&lt;pre&gt;&lt;code&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TeckqEI3uO0MGF1XzNZktsdvBTM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TeckqEI3uO0MGF1XzNZktsdvBTM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TeckqEI3uO0MGF1XzNZktsdvBTM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TeckqEI3uO0MGF1XzNZktsdvBTM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/rwWXYXr1XzY" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Mon, 28 Mar 2011 13:12:15 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/03/28/trabalhando-com-python-e-mongodb/</guid><feedburner:origLink>http://avelino.us/2011/03/28/trabalhando-com-python-e-mongodb/</feedburner:origLink></item><item><title>Certificado EV SSL
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/zx8SIc2HYvM/</link><description>&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;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;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;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/svfi3PeK77P2auCkii55EqhMZmI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/svfi3PeK77P2auCkii55EqhMZmI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/svfi3PeK77P2auCkii55EqhMZmI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/svfi3PeK77P2auCkii55EqhMZmI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/zx8SIc2HYvM" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Mon, 28 Mar 2011 05:55:57 -0500</pubDate><guid isPermaLink="false">http://avelino.us/2011/03/28/certificado-ev-ssl/</guid><feedburner:origLink>http://avelino.us/2011/03/28/certificado-ev-ssl/</feedburner:origLink></item><item><title>Coding Dojo o melhor lugar para pratica Programação
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/w_X3q5i51hg/</link><description>Nós da Comunidade Python São Paulo estamos no 10' Dojo.
&lt;br /&gt;&lt;br /&gt;
Parabéns a todos os organizadores e participantes.
&lt;br /&gt;&lt;br /&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;br /&gt;&lt;br /&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;br /&gt;&lt;br /&gt;
Veja a baixo videos gravado no 10' Dojo da Comunidade Python São Paulo onde foi realizado na empresa &lt;a href="http://www.gonow.com.br/"&gt;Gonow Tecnologia&lt;/a&gt;:
&lt;br /&gt;&lt;br /&gt;
&lt;object height="300" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-hZkXKqXCh8?fs=1&amp;amp;hl=en_US"&gt;
&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;/param&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;br /&gt;&lt;br /&gt;
&lt;object height="300" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jh8YA8fX3xA?fs=1&amp;amp;hl=en_US"&gt;
&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;/param&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;br /&gt;&lt;br /&gt;
&lt;a 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;a href="http://feedads.g.doubleclick.net/~a/u6NDIGIp3TWEbba35H3LhpD9uzI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u6NDIGIp3TWEbba35H3LhpD9uzI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u6NDIGIp3TWEbba35H3LhpD9uzI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u6NDIGIp3TWEbba35H3LhpD9uzI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/w_X3q5i51hg" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Mon, 21 Feb 2011 10:16:13 -0600</pubDate><guid isPermaLink="false">http://avelino.us/2011/02/21/coding-dojo-o-melhor-lugar-para-pratica-programaca/</guid><feedburner:origLink>http://avelino.us/2011/02/21/coding-dojo-o-melhor-lugar-para-pratica-programaca/</feedburner:origLink></item><item><title>Meu ambiente de trabalho em 7 itens
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/ieWArhVRPuM/</link><description>O &lt;a href="http://blog.licio.eti.br/"&gt;Licio&lt;/a&gt; me convidou para entrar no&amp;nbsp;ritmo&amp;nbsp;dos "7 itens" então vamos lá...
&lt;br /&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;GIT + Mercurial&lt;/b&gt;
Geralmente procuro usar Mercurial no&amp;nbsp;&lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; mas costumo usar bastante &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; no &lt;a 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;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VIM&lt;/b&gt;
Depois de muito testar o &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;, &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; e &lt;a href="http://www.vim.org/"&gt;VIM&lt;/a&gt;, resolvi afirma que para mim o melhor é o VIM, consigo fazer tudo que preciso e não tenho tantos problemas com " 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 href="http://www.streetfighter.com/"&gt;street fighter&lt;/a&gt; quando vou &amp;nbsp;programar (Para os que conhece Emacs vai entender).
Depois de conhecer o &lt;a href="http://blog.qmx.me/"&gt;QMX&lt;/a&gt; (Evangelista VIM) comecei ver o VIM como um ótimo editor.
&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OS X&lt;/b&gt;
Depois de passar muito tempo com ambiente Linux, vi que não 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;br /&gt;&lt;br /&gt;
E a bateria dura muito mais tempo do que qual quer outro Notebook que eu tive.
&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iterm2 + homebrew&lt;/b&gt;
Utilizo o &lt;a href="http://code.google.com/p/iterm2/"&gt;iterm2&lt;/a&gt; como terminal do meu Mac e tem me agradado muito a parte de troca de abas, como gerenciador de pacote utilizo o &lt;a href="http://mxcl.github.com/homebrew/"&gt;homebrew&lt;/a&gt; (que me foi apresentado pelo &lt;a href="http://akitaonrails.com/"&gt;Fabio Akita&lt;/a&gt;, automaticamente já sabemos que é escrito em Ruby :/ )
&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pip + virtualenv +&amp;nbsp;virtualenvwrapper&lt;/b&gt;
Como sou desenvolvedor Python não temos trabalhar com ultiplos 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;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dropbox&lt;/b&gt;
Realmente o Dropbox me salvou muitas vezes, com o uso dele não preciso ficar levando pen drive para cliente ou qual quer local que eu for.
&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Apps (Gmail)&lt;/b&gt;
Não sei qualificar quantos % da minha vida profissional esta encima do Google Apps, mas sei que tem muita coisa lá.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;
Agora para seguir com o meme, convido meus amigos:&lt;br /&gt;
&lt;a href="http://christiano.me/"&gt;Christiano Anderson&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://rochacbruno.com.br/blog/"&gt;Bruno Rocha&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blog.heynemann.com.br/"&gt;Bernardo Heynemann&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://isnomore.net/"&gt;Rodrigo Bernardo Pimentel&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qssbg0Et4fJTPxv2o-S3P4g0KtA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qssbg0Et4fJTPxv2o-S3P4g0KtA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qssbg0Et4fJTPxv2o-S3P4g0KtA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qssbg0Et4fJTPxv2o-S3P4g0KtA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/ieWArhVRPuM" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Sun, 20 Feb 2011 20:09:35 -0600</pubDate><guid isPermaLink="false">http://avelino.us/2011/02/20/meu-ambiente-de-trabalho-em-7-itens/</guid><feedburner:origLink>http://avelino.us/2011/02/20/meu-ambiente-de-trabalho-em-7-itens/</feedburner:origLink></item><item><title>Curso Desenvolvimento ágil com Django
</title><link>http://feedproxy.google.com/~r/pyAvelino/~3/NO4iKSvd6Yo/</link><description>Comece a desenvolver com um framework de alto nível, que estimula o desenvolvimento rápido e limpo. Aprenda Django agora!
&lt;br /&gt;&lt;br /&gt;
O Curso esta no valor de &lt;b&gt;R$ 69,00&lt;/b&gt;.
&lt;br /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://static.imasters.com.br/img/imgbase/31108.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://static.imasters.com.br/img/imgbase/31108.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
No curso explico como fazer um site completo com Django onde 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;br /&gt;&lt;br /&gt;
O curso esta sendo realizado com apoio do &lt;a href="http://pro.imasters.com.br/"&gt;iMasters Pro&lt;/a&gt; onde temos outros curso com uma qualidade&amp;nbsp;excelente.
&lt;br /&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a 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;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AVyR96MRgJcovZ2VI9s8DJuKcOQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AVyR96MRgJcovZ2VI9s8DJuKcOQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AVyR96MRgJcovZ2VI9s8DJuKcOQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AVyR96MRgJcovZ2VI9s8DJuKcOQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pyAvelino/~4/NO4iKSvd6Yo" height="1" width="1"/&gt;</description><author>avelino@chierry.com (avelino)</author><pubDate>Thu, 27 Jan 2011 15:11:45 -0600</pubDate><guid isPermaLink="false">http://avelino.us/2011/01/27/curso-desenvolvimento-agil-com-django/</guid><feedburner:origLink>http://avelino.us/2011/01/27/curso-desenvolvimento-agil-com-django/</feedburner:origLink></item></channel></rss>

