Blog sobre tecnologia em geral, com ênfase em software livre, desenvolvimento de software em Python, projetos envolvendo Arduino e eletrônica, Coding Dojo e metodologias ágeis de desenvolvimento de software.
O conteúdo desse artigo está disponível também em vídeo:
Alguns dos usuários da minha biblioteca rows me pediram funcionalidades
de detecção de encoding e tipo de
arquivo, então comecei a procurar alguma biblioteca
Python simples e rápida que desse conta dessa tarefa. O problema:
encontrei muitas bibliotecas e nenhuma delas me atraiu
por alguns dos seguintes motivos:
Não estava disponível no Debian (se eu usasse o pacote rows no
Debian iria quebrar);
Não estava sendo mantida atualmente;
Não funcionava corretamente.
Então percebi que não existe uma "solução de ouro" para esse problema em
Python. Muitos pythonistas usam a biblioteca chardet, mas ela
detecta muitas vezes com erros e é razoavelmente lenta (principalmente se
você precisar fazer a detecção enquanto um usuário aguarda a resposta através
de uma chamada de API via HTTP) -- veja mais detalhes sobre isso no
vídeo.
Então, eu pensei: por que não usar o programa file, que já
é bastante conhecido por hackers do mundo UNIX, é rápido e muito mais assertivo
que todas as outras opções? Para minha surpresa não existia um bom binding de
Python para a libmagic (algumas bibliotecas rodavam o comandofile mas
isso não era uma opção para mim pois dependia de mais um pacote do sistema e
não era uma solução muito portável).
Fiquei muito feliz de poder colaborar com um software importante e que eu uso
desde de meus primeiros passos no mundo GNU/Linux (2003? 2004?)! Durante minha
busca eu descobri que o primeiro commit da versão livre do file é de 1987
(eu tinha menos de 4 meses de idade!) -- e o software ainda é mantido hoje.
Agora todos podemos usar binding oficial do file para
Python: a nova biblioteca é chamada file-magic e pode ser
instalada executando:
pip install file-magic
Ela disponibiliza várias funções e atributos, mas as mais importantes são bem
simples e intuitivas: elas retornam uma namedtuple com os
resultados da detecção. Vamos ao código!
>>> import magic
>>> # Você pode especificar diretamente um nome de arquivo
>>> filename_detected = magic.detect_from_filename('turicas.jpg')
>>> print(filename_detected)
FileMagic(mime_type='image/jpeg', encoding='binary',
name='JPEG image data, JFIF standard 1.02, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 842x842, frames 3')
>>> # E você pode acessar os atributos da `namedtuple`:
>>> print(filename_detected.mime_type)
image/jpeg
# E se você já tem o conteúdo do arquivo em memória:
>>> with open('data.html') as fobj:
... data = fobj.read()
>>> content_detected = magic.detect_from_content(data)
>>> print(content_detected)
FileMagic(mime_type='text/html', encoding='utf-8',
name='HTML document, UTF-8 Unicode text')
>>> print(content_detected.encoding)
utf-8
Algumas coisas ainda precisam ser melhoradas (como a documentação, rodar os
testes em outras plataformas etc.), porém a biblioteca já pode ser instalada
através do pip, é rápida e precisa. :-)
Para quem não conhece, NuBank é um cartão de crédito que não te
cobra anuidade e tem um ótimo atendimento, além de um aplicativo para
celular bastante fácil de usar (é sua única interface com eles). Em resumo:
eles estão fazendo o que em geral os bancos não fazem e estão lucrando com
isso! Já faz alguns meses que estou usando e recomendo! Se quiser saber mais
detalhes acesse a página deles.
Problemas
O NuBank, apesar de muito bom, para mim poderia melhorar em alguns
detalhes:
Ainda não dá para transferir as milhas do cartão para compra de passagens
aéreas;
Ainda não consigo colocar o pagamento da fatura como débito automático no
Banco do Brasil (parece que só está disponível para Santander);
É chato ter que usar o PDF da fatura para conferir meus gastos.
Quando estou no Brasil tento usar o NuBank para todas as compras,
pois isso facilita muito o controle dos meus gastos - caso não concorde que
gastar no cartão é melhor para ter o controle dos gastos então leia o
adendo (quando estou fora evito usar o cartão de crédito pois o IOF
para compras internacionais é de 6,38%). Porém, como a fatura vem por email
em PDF e não dá pra exportar para outros formatos pelo aplicativo, torna-se
trabalhoso (e chato) demais o processo de jogar os gastos para minha planilha
financeira pessoal e conferí-los. Como adoro programar e programar é, em
resumo, automatizar coisas, resolvi criar um software para fazer a conversão da
fatura do NuBank PDF para CSV (que antes eu fazia manualmente). :D
O arquivo na segunda linha é faturas.html (com "s") mesmo -- esse arquivo é
gerado pelo pdftohtml (junto com outros) depois da conversão. Você pode
deletar os arquivos gerados pelo pdftohtml depois disso. Esse comando não
segue bem a filosofia do UNIX e é bem inflexível (não dá
pra especificar o nome do arquivo de saída, por exemplo). :-/
Uma coisa legal do script é que ele já junta as entradas relacionadas a IOF com
o gasto que gerou o IOF, facilitando bastante meu controle! :D
Convertendo o CSV para Outro Formato
Se você tem a command-line interface da biblioteca rows instalada
(pip install rows ou apt-get install rows) você também pode converter o CSV
para diversos outros formatos, como XLS, XLSX, JSON, SQLite, HTML e TXT. Para
converter, basta rodar:
rows convert fatura-lindona.csv fatura.xls
Caso queira outro formato em vez de XLS, basta trocar "xls" ali pela extensão
desejada que o software é esperto o suficiente para identificar. :)
Adendo: Controle das Contas
Muita gente prefere evitar o uso do cartão de crédito para ter mais controle
das contas (já vi muitos conselhos vindos de profissionais do ramo financeiro
sobre evitar o uso do cartão). Eu prefiro usar o cartão sempre que possível
(quando estou no Brasil) pois quando gasto em dinheiro em geral esqueço
facilmente com o que gastei (e eu gosto de saber com o que gastei meu
dinheiro - essa é a primeira ação para conseguir manter uma vida financeira
saudável).
Muita gente se assusta quando eu digo isso porque a maior parte das pessoas que
usa o cartão de crédito tem "uma surpresa" quando chega a fatura. Eu nunca
tenho surpresas pois:
Na planilha onde controlo meus ganhos e gastos já tenho estimativas de
entrada e saída para os próximos meses;
Duas vezes por semana vejo pelo aplicativo do NuBank o que gastei
nos últimos dias e lanço na planilha do próximo mês (que é quando terei que
pagar a fatura); e
Quando a fatura chega eu a converto para CSV, abro no
LibreOffice e confiro se está de acordo com o que lancei na
minha planilha financeira anteriormente.
Com esses simples passos eu sei exatamente o valor da fatura que virá e
tenho como me conter caso esteja gastando demais!
Is not available on Debian to install as a package (it's important so people
can install rows and its dependencies using pip or apt-get),
Is not maintained anymore, or
Have some missing feature.
None seemed to be the de-facto way to do it in Python (I think pythonistas do
it in many ways). Many pythonistas use the chardet library but its
results are wrong sometimes and it's pretty slow (specially if you need to
detect during an API HTTP request, while the client is waiting).
So, I thought: why not use the file software, which is well
known by all UNIX hackers, faster and most accurate than all the other
solutions I know? To my surprise there was not such a good Python binding for
file on PyPI (and calling it as a child process was
not and option since it would add one more system-dependant package, not
detectable during a pip install if missing and would also turn this solution
less portable). Then, searching on its repository I found a
simple Python wrapper, which was not available on
PyPI at that time and was not that pythonic as I
expected.
The Solution
Since it's free/libre software, I've created an issue on file bug
tracker to solve the problem and Christos Zoulas (the
current maintainer) asked for a patch, which I
implemented, sent and was accepted. I'm pretty happy I can
contribute to a software I've been using since my earlier times on GNU/Linux
(2003? 2004?). During this process I found that the first commit on the
free/libre file (which every GNU/Linux distribution and BSD
flavor uses) implementation was done when I was less than 4 months old (!)
-- and it's still maintained today.
Now you can use the official file Python binding: the
new library is called file-magic and can be installed by running:
pip install file-magic
It provides some methods and attributes but the most important are pretty
simple and intuitive to use: they return a namedtuple with the
data you want! Let's take a tour through an example:
>>> import magic
>>> # You can pass the filename and it'll open the file for you:
>>> filename_detected = magic.detect_from_filename('turicas.jpg')
>>> print filename_detected
FileMagic(mime_type='image/jpeg', encoding='binary',
name='JPEG image data, JFIF standard 1.02, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 842x842, frames 3')
>>> # It's a `namedtuple` so you can access the attributes directly:
>>> print filename_detected.mime_type
image/jpeg
# If you have the file contents already, just use `detect_from_content`:
>>> with open('data.html') as fobj:
... data = fobj.read()
>>> content_detected = magic.detect_from_content(data)
>>> print content_detected
FileMagic(mime_type='text/html', encoding='utf-8',
name='HTML document, UTF-8 Unicode text')
>>> print content_detected.encoding
utf-8
There are still some things to be improved (like running tests in other
platforms -- including Python 3) but it's pip-installable and usable now, so we
can benefit from it. Feel free to contribute. :)
No último fim de semana de agosto tive o prazer de participar do
UaiPython: o maior evento sobre a linguagem
Python do estado de Minas! Foi muito bom poder encontrar o pessoal e
ainda palestrar lá; sempre gostei de Minas por conta do povo ser super gente
boa, ter comidas super deliciosas... e agora uma comunidade Python
super forte! o/
As palestras que mais curti foram a da Júlia Rizza que falou
sobre o web2py (framework que fiz algumas contribuições há uns 6
anos) - eu não o utilizo mais, porém o trabalho de divulgação/documentação que
a Júlia está fazendo é fantástico! - e do Ervilis
Viana (meu colega de trabalho na equipe de backend da
Onyo e um dos organizadores do evento) que falou sobre a importância
das comunidades de desenvolvimento de software em uma lightning
talk (palestras de 5 minutos que são tradição nos eventos de
Python). E fica aqui a ênfase: o importante são as pessoas e é
por isso que as melhores partes dos eventos são as conversas de corredor, as
trocas de ideias na mesa do restaurante durante o almoço ou do bar durante a
cerveja pós-evento (essa última costuma ser a opção mais divertida ;-).
E por falar em pessoas: estamos contratando aqui na Onyo! Se você é
competente e tem experiência com desenvolvimento backend em Python
ou frontend e já trabalha remotamente, então entre em contato consco agora
mesmo!
Minha Palestra
Eu particularmente gostei bastante de ter feito essa palestra: não só porque
achei que consegui me expressar bem, mas porque o tema é algo que curto
bastante e porque o processo de fazer a palestra me gerou bastante aprendizado:
durante o evento eu lancei a versão 0.1.0 da biblioteca rows, um
projeto que já venho trabalhando há algum tempo e acabei dando um gás para
lançar publicamente durante a palestra.
O pessoal da Silex Sistemas filmou minha palestra, que pode ser vista
no YouTube (porém tivemos alguns problemas de sincronismo e nem todo o conteúdo
está online -- quando corrigirem o vídeo eu atualizarei aqui).
Se você precisa trabalhar/converter dados tabulares, independente do formato em
que eles estejam, então rows foi feita pensando em você! Para começar a
brincar, instale a versão disponível no PyPI:
Além de uma biblioteca que você pode usar em seus programas Python, o
pacote possui uma command-line interface que facilita ainda mais quando você
quer apenas converter dados. Aprenda mais sobre a biblioteca
rows em seu README e veja os exemplos de uso.
Pessoas
Como eu comentei: o importante [nos eventos] são as pessoas. As palestras
conseguimos assistir depois, via Internet; o conteúdo das palestras conseguimos
aprender depois (basta saber por quais palavras-chave procurar); os
pães-de-queijo conseguimos comprar depois; reunir todas essas pessoas novamente
talvez não seja tão fácil assim quanto as outras coisas que acontecem nos
eventos. Inclusive, eu tenho costume de não ir às palestras justamente para
tentar aproveitar o momento para conhecer as pessoas e reencontrar os já
conhecidos.
E falando das pessoas, coisas legais que aconteceram lá:
Tive contato (em alguns casos pela primeira vez) com algumas pessoas que
revelaram que começaram a programar por minha causa: desde a época em que
eu usava Windows e tinha um canal de mIRC Scripting (há mais de 12
anos atrás!), até mais recentemente com vídeos de minhas palestras sobre
Python e Arduino. Fiquei bastante orgulhoso ao
saber disso! :D
Python Brasil
Aproveitando o assunto: caso você tenha interesse em Pythonsugiro
foretemente participar da PythonBrasil: é o maior evento nacional
sobre a linguagem! Eu estarei lá (vou anualmente desde 2009), porém dessa vez
não submeti palestra: resolvi enviar proposta de um tutorial sobre captura de
dados com Python (você pode me ajudar votando para que ele seja
aceito no evento ;-) -- os tutoriais serão totalmente gratuitos.
Até novembro em São José dos Campos e happy hacking! o/
O simples fato de você usar muito o teclado, independente de sua profissão, já
é um bom sinal de que você deveria aprender a usá-lo melhor, como você
provavelmente faria com qualquer outra ferramenta de trabalho -- não basta ter
boas ferramentas, temos que saber utilizá-las eficientemente (programadores,
aprendam a digitar!).
Esse artigo é longo e poderia ser resumido na seguinte frase:
Digitar bem é questão de técnica e prática (um bom teclado também ajuda).
Mas se você quer realmente entender como digitar mais rápido e melhor, além de
saber alguns detalhes maneiros ("cultura inútil"?), continue lendo as 5 dicas
a seguir. :-)
Dica #1: Use os DEZ Dedos
Para começar, que tal usar toda a capacidade que você tem? ;-) Não usar os 10
dedos para digitar é como ocupar só parte dos leitos disponíveis de um hospital
quando existem pacientes suficientes para ocupar todos. Não subutilize
sua capacidade!
A posição correta dos dedos segue ilustrada:
Norman Saksvig já sabia disso em 1.947
Foto por Crossett Library
Por padrão, você apoia seus dedos (com exceção dos dedões) na fileira
principal, que é a que tem as letras "asdfghjklç" em um teclado padrão
ABNT2 (falarei mais sobre o layout do teclado abaixo).
O dedo indicador é o único que toca duas teclas para a mesma fileira: o
esquerdo toca as teclas "f" e "g" (fica "estacionado" na "f") e o direito toca
"j" e "h" (fica "estacionado" na "j").
Dica #2: Não Olhe Para o Teclado
Confesso que fico inquieto quando vejo alguém "catando milho" (olhando para o
teclado em busca da tecla desejada). O contrário de "catar milho" é
"datilografar" (touch typing, em Inglês) e é
isso que você precisa aprender! :-D
A razão da catação de milho é o desconhecimento sobre a posição das teclas e
para contornar isso, segue uma dica infalível:
As teclas "f" e "j", onde você deve estacionar seus dedos indicadores, possuem
ranhuras.
Tateando o teclado você consegue identificar onde colocar os dedos indicadores
e, a partir da imagem da dica 1, você consegue posicionar os outros dedos
também
(existem até alguns adesivos que aumentam a ranhura para
facilitar encontrar essas teclas, que são chamadas de home keys).
Com isso, você consegue digitar todas as teclas da fileira principal sem
olhar, bastando decorar a ordem das teclas e seus respectivos dedos.
Para as demais fileiras, basta deslocar os dedos para cima e para baixo: dessa
forma, o dedo mindinho esquerdo digitará as teclas "a" na fileira principal,
"q" na fileira acima e "z" na fileira abaixo.
Como você pode perceber na foto acima, meu teclado não possui letras impressas
-- não tê-las também ajuda bastante a não olhar para o teclado! ;-)
Os teclados físicos de celular (alguém lembra deles?) seguem a mesma lógica com
relação a ranhuras (que também são bem úteis para cegos).
Ranhura na tecla "5" de um Nokia 3120
A tecla 5 também funciona como home key nos numpads, os teclados
numéricos:
Ranhura na tecla "5" de um teclado numérico
No teclado numérico o dedo médio fica na tecla "5", o indicador na "4" e o
anelar na "6". O "0" é digitado com o polegar, os sinais à direita com o mínimo
e as demais teclas são digitadas deslocando-se os três dedos principais
(indicador, médio e anelar).
Dica #3: Use um Bom Teclado
Saber digitar bem usando um teclado ruim não é algo prazeroso. Porém, definir se
uma característica é boa ou ruim depende de cada um, é algo pessoal. Seguem as
minhas preferências:
Características Desejáveis
Teclas bem separadas
Teclas ligeiramente côncavas
Teclas não tão pequenas (depende do tamanho de seu dedo)
Resposta boa (é o feedback que o teclado te dá ao apertar uma tecla -- o meu
DasKeyboard, por exemplo, faz um "click")
"Fn" à esquerda de "Ctrl" e com variações de tamanho entre as teclas
modificadoras ("Ctrl", "Win/Super", "Alt")
Setas, "Page Up" e "Page Down" em tamanho minúsculo
"Esc" e "Fn"s minúsculos
"Fn"s invertidos com funções multimídia
"Insert", "Delete", "Home" e "End" minúsculos e fora do posicionamento
original ("Home" acima de "End", "Insert" acima de "Delete" e "Home" à
direita de "Insert"); "Page Up" e "Page Down" também não estão nesse "grupo"
O teclado em questão é, ironicamente, também de um notebook Lenovo: dessa vez é
de um Thinkpad.
Dica #4: Escolha um Bom Layout
Quem não usou PCs na década de 90 talvez não saiba que usamos layouts diferentes
do (agora) onipresente ABNT2. O ABNT2 é só um dos diversos outros layouts
possíveis e a boa notícia é que, independente do hardware do seu
teclado, você pode trocar o layout através de uma configuração de software.
Obviamente, teclados já vem de fábrica com etiquetas nas teclas seguindo algum
layout, mas você pode configurar seu sistema para identificar as teclas de forma
diferente (isso só é ruim para quem cata milho ;-).
Há alguns anos usei o layout Dvorak por algumas semanas e gostei
bastante (um dia pretendo voltar a usá-lo), daí resolvi trocar as teclas de
posição (só pra assustar quem tentava digitar nele ;-). Repare que nesse layout:
Das letras, as únicas que não foram trocadas (vindo de um layout ABNT2) são
"a" e "m"
Todas as vogais são acessadas diretamente através da mão esquerda, sem
precisar mudar de fileira (todas na fileira principal)
As home keys são as letras "u" e "h" (e não "f" e "j") e, por isso, fiz
ranhuras nelas com um ferro de solda
Repare também que raspei o símbolo do Windows das duas teclas "Super". :-D
Usar um teclado com layout Dvorak foi uma experiência incrível: digitar é algo
bastante natural para mim, mas quando me deparei com o Dvorak eu sabia apenas as
posições das teclas "a" e "m" -- me senti inútil. Tive que reaprender a
datilografar (achei mais difícil que aprender uma língua nova).
Eu cheguei a digitar em uma velocidade aceitável nele em 2010, mas na época
ficava com Dvorak no desktop e ABNT2 no notebook, que me causou bastante
confusão mental e me fez voltar 100% para o ABNT2 porque precisei de um pouco
mais de produtividade naquele momento.
Mesmo não usando mais o Dvorak, recomendo fortemente testá-lo: ele foi criado
na década de 20 por August Dvorak e é bem mais ergonômico e
eficiente que um teclado ABNT2/QWERTY.
Layouts Personalizados
Além dos layouts pré-definidos, você pode fazer alterações em seu próprio layout
também -- por exemplo, conheço desenvolvedores de software que:
Invertem o "caps lock" com o "ctrl" (preferem não usar "caps lock")
Invertem a ação do "shift" nas teclas numéricas ("!" é feito naturalmente e
"1" é feito segurando "shift")
De nada adianta saber toda essa teoria se você não pratica. Corrigir-se para
usar os dedos corretos e fazer pequenos exercícios ajuda bastante no processo.
Uma forma bastante divertida e eficiente de treinar é usar o site
TypeRacer, onde você consegue medir sua velocidade de digitação e ainda
pode convidar amigos para "correr" contigo; dá pra ver sua evolução também
através de um gráfico com o histórico de suas velocidades. Minha média no
TypeRacer é de 82 palavras por minuto (WPM).
Se você fez um teste lá e acha 82 WPM um número alto, veja só esse vídeo:
As hackathons ("maratonas hacker"), também conhecidas como
hack days, hack fests ou code fests são maratonas que envolvem
desenvolvimento de algum software, em geral sobre um tema específico e com
alguma premiação ao final. Em geral os grupos participantes possuem
desenvolvedores de software, designers e administradores, remetendo à equipe de
uma pequena empresa. Muitas hackathons visam resolver algum problema ou mesmo
fomentar a criação de empresas startups na área-tema.
Desde que conheci o conceito gostei bastante, afinal é uma forma de incentivo a
desenvolvimento de aplicativos inovadores, em geral com algum cunho social.
Mesmo os grupos que não são premiados desenvolvem algum aplicativo, que pode ser
útil ou até mesmo se tornar um negócio no futuro. Tenho visto várias hackathons
relacionadas a dados
abertos,
que é um tema super interessante e, na minha visão, pode mudar a forma sobre
como vivemos em sociedade.
Recentemente fui convidado pela organização do SESI Cultura Digital a
ser tutor da Hackathon SESI Cultura Digital 2014, uma maratona
com prêmios de R$ 20.000, R$ 10.000 e R$ 5.000 para os melhores
projetos, podendo ser feitos por grupos de 3 a 5 pessoas. O objetivo dessa
hackathon é fomentar o desenvolvimento de soluções ambientais para o estado do
Rio de Janeiro, nos seguintes eixos temáticos:
Se você tem interesse, se inscreve logo pois as inscrições vão somente até dia
18 de outubro! Cada grupo participante receberá um Kit Arduino! o/
A minha tutoria será na área de fontes de dados relacionadas a monitoramento do
ar e qualidade da água. Além da hackathon, o evento contará com
várias outras atrações, como palestras e oficinas (também serei tutor de duas
oficias de Arduino, que já estão lotadas!).
Os grupos terão dois dias (23 e 24 de outubro) para desenvolver um protótipo e
terão de apresentá-los a uma banca avaliadora no dia 25. Durante os dias 23 e 24
serão feitas diversas apresentações para facilitar o trabalho dos grupos, bem
como várias tutores estarão disponíveis para tirar dúvidas e colaborar no
desenvolvimento dos protótipos.
Que tal participar? Curtiu a ideia? Compartilhe com seus amigos! :-)
Já faz algum tempo que eu gostaria de fazer o Curso de Arduino em Belo
Horizonte - adoro Minas (estou sempre por lá) e sempre tem mineiros me
perguntando sobre o curso. Então, chegou o momento: estão
abertas as inscrições para turma do Curso de Arduino em BH! \o/
A primeira turma de BH acontecerá em dois sábados, dias 20 e 27 de setembro,
das 10 às 19 horas (com 1h de intervalo para almoço), totalizando
16 horas de aula.
Se você tem interesse, corre porque a procura está grande: recebi centenas
de e-mails perguntando por essa turma! Só temos 16 vagas e já temos 50% da turma
inscrita (abrimos as inscrições há apenas 5 dias). O valor da inscrição é de
R$ 450,00, que podem ser pagos em até 12x usando o PagSeguro. Inscreva-se
já no Curso de Arduino em BH.
Vou aproveitar o tempo em Minas e tentar participar de um pyBHar, o
encontro dos pythonistas mineiros! ;-)