VirtualEnvWrapper no Linux

O virtualenvwrapper é a maneira mais simples de criar ambientes python isolados (virtualenv). Sua instalação é bem simples.

$ sudo pip install virtualenvwrapper
$ mkdir ~/.envs
$ export WORKON_HOME=~/.envs
$ source /usr/local/bin/virtualenvwrapper.sh


Após a instalação e ter executado o comando source, você manipulará seus ambientes virtuais com os seguintes comandos.

mkvirtualenv nome_do_ambiente: Cria um ambiente virtual.
workon nome_do_ambiente: Utiliza o ambiente virtual.
deactivate nome_do_ambiente: Sai do ambiente virtual.
rmvirtualenv nome_do_ambiente: Delete o ambiente virtual.

É necessário executar os comandos export e source listados acima, toda vez que abrir o terminal. Para automatizar essa tarefa, você pode abrir o arquivo ~/.bashrc (ou ~/.bash_profile para usuários Mac)e adicionar as duas linhas no final do arquivo.

export WORKON_HOME=~/.envs
source /usr/local/bin/virtualenvwrapper.sh

Python Iterators e Generators #dicaDeSexta

Vou fazer uma breve abordagem sobre o uso de Iteratos e Generators

Para iniciar, vamos fazer uma implementação simples do que seria o range do python.

 
 1 def my_range(start, stop=None, step=1):
 2     if stop is None:
 3         stop = start
 4         start = 0
 5 
 6     ret = []
 7 
 8     while start < stop:
 9         ret.append(start)
10         start += step
11 
12     return ret
13 
14 
15 for i in my_range(100):
16     print(i)

O problema dessa implementação é que ele gera um list desnecessário, vamos supor que queremos gerar um my_range(10000000), ele irá retornar um list com 10000000 de células. É um desperdício de memória.

Iterator

Um iterator, segundo a documentação do Python é "um objeto que representa um fluxo de dados. Repetidas chamadas ao método next do objeto iterator retorna o item seguinte. Quando não há mais dados é lançado a exception StopIteration.". Para um objeto ser iterator é necessário que ele contenha o método __iter__, grande parte das implementações desse método retorna self. Vejamos a implementação do my_range com iterator.

 1 class my_xrange(object):
 2     def __init__(self, start, stop=None, step=1):
 3         if stop is None:
 4             stop = start
 5             start = 0
 6 
 7         self.start = start
 8         self.stop = stop
 9         self.step = step
10         self.current = start
11 
12     def __iter__(self):
13         return self
14 
15     # Python 3
16     def __next__(self):
17         if self.current < self.stop:
18             ret = self.current
19             self.current += 1
20             return ret
21         raise StopIteration()
22 
23     # Python 2 / Compatibilizando
24     def next(self):
25         return self.__next__()
26 
27 
28 for i in my_xrange(100):
29     print(i)

Beleza! Resolvemos o problema de memória, mas... É muito código pra pouca coisa! A solução está nos generators!

Generators

Segundo a documentação do Python generators "permitem que você declare uma função que se comporta como um iterador, ou seja, ele pode ser usado em um loop". No lugar de return, usamos yield.


 1 def my_xrange(start, stop=None, step=1):
 2     if stop is None:
 3         stop = start
 4         start = 0
 5 
 6     while start < stop:
 7         yield start
 8         start += step
 9 
10 
11 for i in my_xrange(100):
12     print(i)

O código ficou muito mais limpo. Quando a palavra chave yield está dentro de uma função, esta função se torna um iterator. Para demonstrar o funcionamento do iterator coloquei uns prints no código acima, para entendermos o seu funcionamento.

 1 def my_xrange(start, stop=None, step=1):
 2     if stop is None:
 3         stop = start
 4         start = 0
 5 
 6     print('my_xrange iniciado.')
 7     while start < stop:
 8         print('código bloqueado no yield')
 9         yield start
10         print('código liberado após iteração')
11         start += step
12     print('acabei')
13 
14 
15 the_range = my_xrange(2)
16 print('Vou mostrar o primeiro item do the_range')
17 print(the_range.__next__())
18 print('----------------------------------------')
19 
20 # para o python2 use
21 # print(the_range.next())
22 
23 print('Vou iterar o the_range')
24 print('----------------------------------------')
25 print(the_range.__next__())
26 print('----------------------------------------')
27 print(the_range.__next__())

O output será o seguinte:

Vou mostrar o primeiro item do the_range
my_xrange iniciado.
código bloqueado no yield
0
----------------------------------------
Vou iterar o the_range
----------------------------------------
código liberado após iteração
código bloqueado no yield
1
----------------------------------------
código liberado após iteração
acabei
Traceback (most recent call last):
  File "my_xrange_stoped.py", line 27, in 
    print(the_range.__next__())
StopIteration

Repare que quando chamamos o método my_xrange(2), o print que é exibido no começo do corpo da função 'my_xrange iniciado.' (linha 6) não foi exibido no output.
Isso porque quando chamamos o método, o Python não chama a função, ele gera um iterator. A função só é executada quando o método __next__ (Python3) ou next (Python2) é chamado. Quando o __next__ é chamado ele libera a execução da função, se a execução chegar a algum yield o valor do yield é retornado, senão, é lançado o StopIteration, como no nosso exemplo nosso loop ia até dois, na terceira chamada ao método __next__ foi lançado o exception StopIterator.

VirtualBox, Debian e Linux Kernel 4.0

Quando atualizei o Kernel para a  versão 4.0, o Virtualbox parou de funcionar, exibindo, inclusive mensagens de erro durante o boot.

Segundo o ticket bug #13835, o problema já foi corrigido na versão 4.3.24 cabendo apenas atualizá-lo.

Até o momento dessa publicação o VirtualBox 4.3.24 ainda não estava nos repositórios padrão do Debian. Para verificar atualizar, basta seguir o passo a passo abaixo como root:

#  echo "deb http://download.virtualbox.org/virtualbox/debian wheezy contrib non-free" >> /etc/apt/source.list
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
# apt-get update

# apt-get install virtualbox-4.3

Mutucas, Pneu, Borboleta e Vitamina D

Ontem sai para pedalar com meu pai. Achei bem estranho a gente ter conseguido sair da garagem. Sempre que tento fazer tal coisa chove, o PCC faz um toque de recolher e um grupo alienígena de dinossauros invadem a terra.

Enfim, o plano era irmos até Paranapiacaba, estava indo tudo bem não fosse elas, da ordem dos diptera, as "Mutucas". Você pode dizer "O Carlos é fresco. Tem medo de tudo". Mas dessa vez foi demais, até meu pai estava reclamando, era possível as ver nos perseguindo na sombra.

Teve uma que me atacou de tal forma, que quando estava indo embora, perguntei onde estava o meu suco e meu pão com mortadela. Depois de doar tanto sangue o mínimo era ter um lanche.

Quando já tínhamos pedalado uns 6 km, o pneu da minha bicicleta furou.
Sem problemas! Somos prevenidos. Temos, bomba de ar, remendo e ferramentas. Só não esperávamos que a bomba de ar quebraria na primeira bombeada. Bora voltar pedalando 6 km com o pneu furado.

Enquanto quicava no banco da bicicleta, eis que surge uma borboleta. Voltemos a frase "Tem medo de tudo", só que dessa vez eu tive motivos para ter medo. A borboleta queria ter relações sexuais comigo. Ela entrou na minha bermuda e não queria sair. Sorte que eu não estava de samba canção.

Eu achei estranho, a um nível ridículo, meu pai sair pra pedalar de calça jeans. Segundo ele, ele só se sente bem pedalando assim. Mas depois da aparição da borboleta, eu até o entendo.

Pelo menos eu tenho Vitamina D acumulada para no mínimo uns 5 anos. O sinal dessa minha super-dosagem é a vermelidão que está presente em boa parte do meu corpo.

Moral a história:
Gostava mais quando o grupo alienígena se juntava ao PCC e não deixava eu sair pra andar de bicicleta com meu pai.

Criando quadrados responsivos

No projeto que estou trabalhando atualmente, tive a necessidade de criar quadrados responsivos.
Criar um quadrado é muito fácil, não? Basta setar a altura igual a largura e estamos felizes. Porém, por se tratar de um quadrados responsivo, estamos pensando em porcentagem.

Se eu definir um quadrado com 10% de largura e 10% de altura. Adivinha o que vai acontecer? Você acertou! Não será um quadrado

Exemplo:

10% x 10%

Depois de muito tempo estudando uma maneira de fazer um quadrado responsivo, cheguei a seguinte solução:

O padding é sempre relativo a largura, logo, se você definir a altura do elemento com 0 e o padding-bottom com a porcentagem da altura você terá o resultado esperado. Segue exemplo abaixo:

Guia para Designers: Website Responsivo


Primeiramente gostaria de informar que eu não sou designer. Estou criando esse post para esclarecer as principais dúvidas que os designers costumam ter em relação à websites responsivos.

O que são Frameworks?

Sempre me perguntam o que é esse tal de Framework que eu sempre falo. Framework nada mais é do que um conjunto de elementos pré-definidos que ajudam a nós desenvolvedores não ficarmos reinventando a roda.

Nesse post trabalharei com o Bootstrap do Twitter. Há vários outros, porém a ideia desse post não é ensinar a usar frameworks front-end e sim exemplificar os conceitos de um website responsivo.

Grids

Acredito que esse seja o ponto mais importante quando estamos falando de website responsivo. Os grids são o que mandam na forma que o seu conteúdo irá aparecer.

A primeira coisa a se considerar é qual vai ser a largura do site. Por padrão o Bootstrap trabalha com 1170px de largura no modo responsivo, caso a tela seja menor que 1170px ele passa a assumir 940px, depois 724px, após isso o site fica fluido, ou seja, todos os elementos assumem 100% da página.
Temos 12 tamanhos de colunas diferentes que se encaixam perfeitamente e serão dentro dessas colunas que você colocará o conteúdo do seu site.

Veja um exemplos de colunas aqui: http://maniero.tk/bootstrap/grids.html

Mostrando e ocutando elementos

Uma prática necessária na criação de layouts responsivos é a de mostrar e ocultar elementos na página dependendo do dispositivo que está acessando o site. Um exemplo de utilização dessa prática na criação de Menus. Dificilmente um menu localizado no Header fica bom na navegação mobile, então deve ser criado uma versão para os dispositivos mobile.

Bootstrap em PSD

O Bootstrap possui diversos outros elementos que podem ser aproveitados também no layout, assim como botões icones, navbars, etc. Você pode baixar os elementos do Bootstrap em PSD aqui: http://www.bentdesignstudio.com/v2/2012/03/twitter-bootstrap-2-photoshop-template-psd/

Conclusão

Espero que esse artigo possam ajudar a vocês "amigos designers" (se é que existe amizade entre programadores e designers, hehe) a esclarecer dúvidas básicas de como funciona um website responsivo. Se surgirem dúvidas eu atualizarei essa postagem.

BikeSampa: Experiência

Não, programador não vive só sentado na frente do computador tomando café e digitando na "telinha preta". Tenho hobbies é um deles é pedalar. Adoro a sensação de vento na cara.
Aqui estou eu indo trabalhar de bicicleta.
Assim que vi as bikes do Itaú espalhadas pela cidade, fiquei encantado. Logo procurei fazer meu cadastro.
Nos primeiros dias comecei a ter problemas. A estação 82 (Shopping Santa Cruz) nunca está disponível. Meu trajeto começa no Shopping Santa Cruz e vai até a Dr. Barcelar (Vila Clementino). Porém devido a essa indisponibilidade tenho que andar até a estação Altino Arantes (estação 83).
Fora isso, em um único dia, peguei uma bicicleta com pneu furado. Devolvi e procurei outra, mas estava com o pedivela com problemas. Só em uma terceira tentativa, encontrei uma bike em estado razoável.
Porém, não tive tantos problemas no estado das bicicletas, as boas pelos 10 reais pagos para dois anos de utilização.
Mas hoje confesso que fiquei tremendamente decepcionado com o serviço, já tive problemas em desbloquear uma bicicleta e ela não sair, porém, bastava ligar novamente e desbloquear outra. Hoje foi diferente. Para começar só havia duas bicicletas na estação (isso não é um problema, sei que tem bastante gente usando) e além de mim, havia outra garota, aparentemente com problemas para desbloquear a bicicleta. Era uma bicicleta para cada. A bicicleta na posição 8 se recusou a sair, minha reação natural foi ligar e pedir para que fosse desbloqueada novamente.
A bicicleta não saiu e ainda ficou como "em uso", o que era para ser  um meio alternativo de chegar ao trabalho para poupar tempo, acabou me custando meia hora de atraso.
De qualquer forma, amanhã tentarei usar novamente o serviço, entre pegar um ônibus, ir andandado ou ir de bicicleta, eu ainda prefiro ir de bicicleta, mesmo tendo mais dor de cabeça.
Espero mesmo que o Itaú melhore o serviço, afinal, acho um serviço incrível.