quarta-feira, 29 de junho de 2016

Cursos de Arduino por todo Brasil

Nos próximos meses estarei em diversas cidades do Brasil (atualmente sou um nômade digital) ministrando cursos de introdução ao Arduino, onde ensino programação e eletrônica para quem quer criar projetos interativos, de automação e robótica.

Comecei com o Curso de Arduino em 2011 e tomei essa iniciativa por sugestão de meu amigo Jon "maddog" Hall e porque o público de minhas palestras de divulgação do Arduino sempre perguntava "como aprender programação e eletrônica?".

A iniciativa deu tão certo que desde então já ensinei a centenas de pessoas a dar seus primeiros passos em robótica, em diversas cidades do Brasil (e até fora dele!). É muito gratificante ver os alunos fazendo os projetos (veja as fotos) e dando um feedback bastante positivo com relação à didática utilizada nas aulas. Segue a agenda das próximas turmas:

Porto Alegre

Porto Alegre é uma das cidades no Brasil que mais gosto e será a primeira vez que farei o curso no sul do país. O curso acontecerá no TransLAB (Rua Professor Duplan, 146) nos dias 19 a 22 de julho (terça a sexta-feira), de 18:30 às 21:30. Saiba mais detalhes sobre o que você irá aprender e faça sua inscrição agora. Essa será a única turma do ano em Porto Alegre!

O TransLAB é um laboratório que tem como objetivo estimular a inovação social e tem vários projetos super legais rolando lá dentro!

Belo Horizonte

BH é outra cidade que está no meu coração! Já fiz o curso diversas vezes em parceria com o Guajajaras Coworking, um espaço sensacional - na minha opinião, um dos melhores espaços de coworking do Brasil. A próxima turma em BH será especial: acontecerá no Guaja Casa (primeiro café-coworking do Brasil - Avenida Afonso Pena, 2881) e no FAZ Makerspace (Rua Santa Rita Durão, 143); além disso, a Eletrogate irá fornecer Kits Arduino com desconto para os alunos!

O curso acontecerá de 5 a 9 de setembro (segunda a sexta-feira), das 19 às 22h e as vagas estão super concorridas! Saiba mais detalhes sobre o que você irá aprender e faça sua inscrição agora. Essa será a única turma do ano em BH!

Rio de Janeiro

A primeira turma aconteceu na cidade do Rio de Janeiro e é a cidade em que eu tenho maior demanda de cursos (não só sobre Arduino, mas também sobre Python, Git e outras coisas legais). Lá a minha parceria é com a EDX Coworking, empresa já conhecida da comunidade de software livre por conta das contribuições com o Libre Office - a EDX é meu escritório favorito quando estou no Rio.

A próxima turma no Rio acontecerá nos dias 17 e 18 de setembro (sábado e domingo) de 9 às 18h na EDX Coworking (Avenida Rio Branco, 124). Saiba mais detalhes sobre o que você irá aprender e faça sua inscrição agora. Essa será a última turma do ano no Rio!

segunda-feira, 2 de maio de 2016

Dados Tabulares: A Maneira Pythônica

Já venho há algum tempo trabalhando na biblitoeca rows, que facilita demais o acesso a dados tabulares, não importa o formato do arquivo (CSV, XLS, XLSX, HTML, dentre outros). No último sábado (30 de abril) fiz uma palestra no encontro PythOnRio sobre o projeto e a galera se amarrou! Além da biblioteca, também mostrei como usar a command-line interface, que uso diariamente para pequenas análises e conversão de dados.

Confira o vídeo:

E os slides:

Veja também a versão em HTML dos slides.

O projeto é software livre e temos várias issues abertas, entra lá no repositório no GitHub e contribui! :)

segunda-feira, 14 de março de 2016

Reading Parquet Files in Python with rows

Many people in the data science field use the parquet format to store tabular data, as it's the default format used by Apache Spark -- an efficient data storage format for analytics. The problem is: the format is binary (you can't just open it with your preferred code editor) and there's no such a good Python library to read -- not until today!

I found a Python library called parquet-python on GitHub but it's hard to use, doesn't have one code example, was not available on PyPI and it looks like it's not maintained anymore. So I decided to implement a parquet plugin (read-only) for my library rows: it uses the parquet-python library under the hood (I needed to upload it to PyPI so you can install it easly) and exposes the data in a pretty simple, pythonic way.

Installation

I didn't realese the rows version with this plugin yet, so you need to grab the most recent rows version by running:

pip install -U git+https://github.com/turicas/rows.git@develop

And also the dependency:

pip install parquet

If the data is compressed using Google's snappy you'll also need the library headers and other Python dependency -- install everything by running:

apt-get install libsnappy-dev
pip install python-snappy

Then you can use rows.import_from_parquet(filename) in your programs! \o/

Python Example

A quick Python code example:

import rows

table = rows.import_from_parquet('myfile.parquet')
for row in table:
    print row  # access fields values with `rows.field_name`

Note that the current implementation is not optimized (for example, it'll put everything into memory) but at least you can extract desired data and then convert to a more friendly format easily.

Converting Parquet to Other Formats with rows' CLI

You can convert Parquet files to many tabular formats (like CSV) by using the rows's command-line interface, so you don't need to code.

Install the rows CLI by running:

pip install rows[cli]

Now convert the parquet file:

rows convert myfile.parquet myfile.csv  # yes, simple like this!

You can replace csv with any other supported format (the list is always growing!), such as: txt, html, xls, xlsx and sqlite.

If your file is small enough you can actually see it without needing to save the output to another file by using the print subcommand:

rows print myfile.parquet  # will extract, convert and print data as text

And you can actually query data as in SQL (this CLI is awesome!), for example:

rows query 'nation_key < 10' tests/data/nation.dict.parquet \
     --output=data.csv

By running this command the CLI will:

  • Import data from tests/data/nation.dict.parquet file into memory;
  • Export to SQLite (:memory:);
  • Run the query (nation_key < 10) and get the results;
  • Convert the results to a new rows.Table object;
  • Export the table to CSV format and save it into data.csv (the result format could be html, xls, xlsx or any other write-plugin supported by rows).

With this addition to rows I think the library and its command-line interface became one of the tools every data scientist should have installed. ;-)

domingo, 6 de março de 2016

Searching dd-wrt Router Database with ddwrtdb

I really like the dd-wrt router operating system: I can install it on cheap routers (starting from 27 USD, as TP-Link WR741ND) to have a great Web configuration interface and performance (way better than general factory software).

I'm always looking for new router models to check if they're supported by dd-wrt and to compare prices/hardware specs (as I'm always buying new routers to help some friends with their Wi-Fi networks). The problem is: dd-wrt's website usability is not that good, specially the router database search. As I prefer to use my terminal instead of the Web browser, I've created a command-line tool to deal with it: it's called ddwrtdb and the code is available at my GitHub account!

It's also available on Python Package Index so you can install it using Python's pip by running:

pip install https://github.com/turicas/rows/archive/develop.zip
pip install ddwrtdb

That's it! Now run ddwrtdb --help to see the available commands (it's pretty intuitive). You can also check out the project' README for command examples.

This simple command-line tool (< 200 lines of Python code) was created using these awesome libraries:

  • click, to easily create a beautiful command-line interface;
  • lxml, to use XPath in order to parse HTML more easily;
  • requests, to make HTTP requests to dd-wrt's website;
  • rows, to automatically extract tables from HTML and to export data to any tabular format.

domingo, 28 de fevereiro de 2016

Detectando Encoding e Tipo de Arquivo com Python

Read this blog post in English.

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 tinha uma implementação pythônica;
  • 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.

But there should be one -- and preferably only one -- obvious way to do it.

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

Depois de vasculhar o repositório de código do file eu encontrei um binding simples para Python, que na época não estava disponível no PyPI e não era tão pythônica como eu esperava.

A Solução

Como o código é software livre, eu criei uma issue no sistema de bugs do file para resolver o problema e o Christos Zoulas (atual mantenedor) me pediu um patch, que eu implementei, enviei e foi aceito. :-)

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

Espero que vocês tenham gostado! ;-)

quinta-feira, 11 de fevereiro de 2016

Fatura do NuBank em CSV

O Que é NuBank?

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

Convertendo a Fatura

O código do software está todo na minha conta no GitHub, chama-se nubank-to-csv. Ele foi escrito em Python usando a minha biblioteca rows (para facilitar a extração para CSV e qualquer outro formato tabular) e a biblioteca lxml para extrair os dados do HTML que é gerado pelo pdftohtml. Fique à vontade para contribuir com o script caso você manje dos paranauê (fiz uma lista de sugestões de contribuição).

O fluxo então é esse:

Fatura em PDF >[pdftohtml]> Fatura em HTML >[nubank-to-csv]> Fatura em CSV

Depois de instalar o nubank-to-csv e suas dependências basta rodar dois comandos:

pdftohtml fatura.pdf
python nubank.py faturas.html fatura-lindona.csv

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!

Curtiu? Que tal compartilhar com seus amigos? ;)

Dúvidas e sugestões? Comente! :)

terça-feira, 2 de fevereiro de 2016

Detecting File Type and Encoding In Python

Read this blog post in Brazilian Portuguese.

I was looking for a simple and fast Python library to implement proper file type detection and encoding detection into my rows library and found that there are many libraries available on Python Package Index which claim to do it. None of them attracted me because one of the following reasons:

  • Do not have a pythonic implementation,
  • 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).

But there should be one -- and preferably only one -- obvious way to do it.

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

Hope you enjoy it!