Thiago Avelino Desenvolvedor Python, Django e MongoDB



VIM a IDE para programadores Python

December 22, 2011


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.

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 .vimrc e nesse post vou explicar como usar o mesmo.

"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. "

Assumindo que o vi 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):

curl https://raw.github.com/avelino/.vimrc/master/bootstrap.sh -o - | sh

Após isso ele vai baixar o repositório na sua pasta HOME. 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 vim mais confortável para o desenvolvimento, para Linux é o gvim e para mac o macvim (Para mac o Björn Winckler fez um ótimo trabalho, na minha humilde opinião é a melhor versão do VIM via GUI).

Chega de blablabla né, vamos logo para o que realmente interessa, como o VIM ficou e como utilizar ele?

vim start

Usando o vim para navegar nas pasta de um projeto:

vim files

Buscando arquivo por nome dentro do projeto:

vim search file

Listar todas as class e def do arquivo esta esta aberto (Python)

vim list class

Lista de comandos para usar no 'vim', lembrando que esses comando foi customizado:

  • :cd /path Abrir pasta
  • tn Abrir nova aba
  • te Abrir nova aba e carregar arquivo
  • t] Proxima aba
  • t[ Voltar aba
  • Ctrl+c Adicionar todos os arquivos no cache para poder fazer busca de arquivo (recomendo fazer isso ao abrir o projeto)
  • Ctrl+f Busca arquivo e abre na mesma aba
  • Ctrl+s Busca arquivo e abre em uma nova aba
  • \b Abre arquivo que esta no buffer do vim (Arquivo abertos)
  • \d, \n ou F3 Abre navegador de arquivo
  • \f Lista todas as class e def (Python)
  • \j Vai para declaração de um metodo
  • \r Renomear todos os metodos
  • [e Move linha para cima
  • e] Move linha para baixo
  • \v ouCtrl+w + v` Divide a tela em vertical
  • \h ou Ctrl+w + s Divide a tela em horizontal
  • \w ou Ctrl+w + q Fecha a aba atual
  • Ctrl+k Abre console Python
  • Ctrl+j Roda o script Python aberto
  • \sh Abre bash (shell)
  • \p Manda o arquivo em aberto para o dpaste.com
  • \ga Git add .
  • \gc Git commit
  • \gsh Git push
  • \gs Git status
  • \gd Git diff
  • \gr Git remove
  • \S Remove todos os espaços do final
  • \c Lista controle de versao do buffer


Google Nexus S, atualização oficial para Android 4.0 (Ice Cream Sandwich)

December 17, 2011


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 Google Nexus.

Para você atualizar o seu Nexus S faça o seguinte procedimento:

  • 1 - Faça download da imagem do Android 4.0 para o Nexus S no seguinte link: http://android.clients.google.com/packages/ota/google_crespo/VQ8PQk_V.zip ou http://dl.dropbox.com/u/763381/VQ8PQk_V.zip
  • 2 - Coloque o VQ8PQk_V.zip SD do seu Nexus S e você deve renomear o arquivo para update.zip
  • 3 - Desligue o seu aparelho
  • 4 - Aperte o botão do volume para cima + o botão power, seu celular vai iniciar no modulo fastboot
  • 5 - Selecione a opção recovery
  • 6 - Vai começa carregar e aparecera um triângulo com um !, nessa tela você deve aperta o botão power + volume para cima (Deve ser na sequência relatado no post)
  • 7 - Vai aparecer um menu onde você deve selecionar a seguinte opção Apply update from /sdcard
  • 8 - Após instalar você deve selecionar reboot system now
  • 9 - Pronto, Android 4.0.3 instalado no seu Nexus S

Quando o seu celular for ligar a primeira vez com Android 4.0 ele vai ficar um pouco lento pois vai refazer o dalvik cache.

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.

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.



Nova versão da API do Dropbox

October 13, 2011


Dia 14.09.2011 o Dropbox lançou a nova versão 1.0 da API, nesse lançamento trouxe muitas novidades e melhorias:

  • Suporte para aplicações web
  • Suporte para criação de pasta (Na versão 0.1 da API não tinha)
  • Novo site para desenvolvedores, com documentação simples e completa https://www.dropbox.com/developers_beta
  • Melhor compartilhamento de arquivo, streaming, busca por arquivo e suporte para revisão de arquivo
  • Implementação no controle de nomes de arquivos, para não sobrescrever arquivos já salvo
  • SDK atualizado para iOS, Android, Python, Ruby e Java que implementa todas modificações e documentação

Link do repositorio (Python Pypi) da nova biblioteca http://pypi.python.org/pypi/dropbox/1.1

O dropbox implementou um oauth onde podemos desenvolver software e fazer o usuário usar a conta de dropbox dele para armazenamento de arquivos: OAuth Dropbox

Vou falar um pouco sobre 3 metodos que esta dentro da biblioteca "dropbox" client, rest e session:

Com o metodo session é por onde tudo começa, onde você linka o seu software com uma conta Dropbox, exemplo:

# 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)

Caso esteja usando a conta do Dropbox do usuário podemos pegar informações da conta dele:

client = client.DropboxClient(sess)
print "linked account:", client.account_info()

Agora usando o metodo "client" podemos fazer get e put de arquivos:

from dropbox import client
f = open('working-draft.txt')
response = client.put_file('/magnum-opus.txt', f)
print "uploaded:", response

Após criar o arquivos podemos ler ele:

print client.get_file('/magnum-opus.txt').read()

Reescrever o arquivo com uma nova revisão para criar um novo arquivo:

out = open('magnum-opus.txt', 'w')
out.write(client.get_file('/magnum-opus.txt',rev='362e2029684fe').read())

Para trabalhar com REST temos um ótima documentação https://www.dropbox.com/developers_beta/reference/api



Problema com hashlib + md5 (Python 2.7)

October 4, 2011


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 bug.python.org

A solução que cheguei foi, criar uma lib chamada "_md5", criei um arquivo chamado "_md5py":

class _md5:
    def __init__():
        import md5
        return md5

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.



Porque fazer teste unitario em javascript?

July 21, 2011


É 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.

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).

Segue abaixo o exemplo de uma implementação simples:

<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <link rel="stylesheet" href="http://code.jquery.com/qunit/git/qunit.css" type="text/css" media="screen" />
  <script type="text/javascript" src="http://code.jquery.com/qunit/git/qunit.js"></script>
  <script>
    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
    }
  </script>

  <script>
    $(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, "-"))
      })

    })
  </script>

</head>
<body>
  <h1 id="qunit-header">QUnit example</h1>
  <h2 id="qunit-banner"></h2>
  <div id="qunit-testrunner-toolbar"></div>
  <h2 id="qunit-userAgent"></h2>
  <ol id="qunit-tests"></ol>
  <div id="qunit-fixture">test markup, will be hidden</div>

  <div id="test1">ok ok ok</div>
</body>
</html>

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.

Segue abaixo o print de como ficou o test: Alt text