Swift Language (Apple) first steps

4 de Junho de 2014, por Desconhecido - 0sem comentários ainda

Apple launched the Swift language (Looking for the Swift parallel scripting language? Please visit swift-lang.org) at WWDC 2014. A modern language to program for Mac and iOS!

Strongly typed language, where you explicitly what type (variable, arguments, and function returns), syntax reminds dynamic languages with Python, Go, Ruby and JavaScript.

Apple offers a free comprehensive guide on language in HTML and iBook formats.

  • We can put zero left freely to improve readability, insert _ to separate groups of numbers and add the + in front. That server to improve readability of the program (does not alter the value of the number):
let a = 1000000
let b = 0.0000001

// readable
let a = 1_000_000
let b = 0.000_000_1
  • Practical numerical ranges: 0..5 and 0...5 (Ruby)

  • Unicode variables:

let π = 3.1415926
  • Tween strings (expand variables and expressions inside strings):
var name = "Thiago Avelino"
var yaer = 25
println "Hi, my name \(name), 'm \(year) years."
  • Few functions/methods native to strings works:

    • hasPrefix
    • hasSuffix
    • uppercaseString
    • lowercaseString
    • countElements
    • isEmpty
  • Not have regular expressions

  • Ternary operators: (condition ? yes : no)

I liked the language, as 'm used to not bother me Go explicit types, lack of regular expression can be a problem seems, but it is a pleasant language to learn!

Golang, C and Python the benchmark time

6 de Março de 2014, por Desconhecido - 0sem comentários ainda

I was wondering how performant Golang is, so I decided to put together a little benchmarking example for myself.

The benchmark will be done in my personal computer:

Processor  3 GHz Intel Core i7
Memory  8 GB 1600 MHz DDR3
Software  OS X 10.9.2 (13C64)

So I started with Python, which is what I know best and created the following simple script;

#!/usr/bin/env python

def fac(n):
    if n == 0:
        return 1
    return n * fac(n - 1)

if __name__ == "__main__":
    t = 0
    for j in range(100000):
        for i in range(8):
            t += fac(i)
    print("total: {0}".format(t))

The reason for the total output, was to have a check to ensure that I was getting the same results in each of the scripts. To make sure that they are doing the same amount of work.

Running the script gives us the following execution time;

$ time python factorial.py

total: 591400000

0.68s user
0.01s system
99% cpu
0.688 total

So I am getting about 1s in total execution time. Not bad.

Now the same code sample in C, to see what the time execution would be;

#include <stdio.h>

int fac(int);

int fac(int n) {
  if (n == 0) {
    return 1;
  return n * fac(n - 1);

main() {
  int i, j;
  int t = 0;

  for (j = 0; j < 100000; j++) {
    for (i = 0; i <= 7; i++) {
      t += fac(i);

  printf("total: %d\n", t);

Compile and execute the above snippet of code;

$ gcc factorial.c -o factorial
$ time ./factorial

total: 591400000

0.01s user
0.00s system
91% cpu
0.016 total

Ok, that's quite an improvement. This is C, so we do expect there to be a great improvement.

Finally we create our code sample in Go;

package main

import "fmt"

func fact(n int) int {
    if n == 0 {
        return 1
    return n * fact(n-1)

func main() {
    t := 0
    for j := 0; j < 100000; j++ {
        for i := range []int{1, 2, 3, 4, 5, 6, 7, 8} {
            t += fact(i)
    fmt.Println("total: ", t)

Then build and run the code sample and we get the following;

$ go build factorial.go
$ time ./factorial

total:  591400000

0.01s user
0.00s system
93% cpu
0.018 total

So, that's pretty much the same as C, which is excellent. The best part of it all, is that it is actually fun to code in Go compared to C. Python was always an attraction for me as the language is a breeze to work with and enjoyable programming with it. Go is also a nice language to work with and it's really fast to boot. So I'm very excited about the language.

Business Intelligence (BI) Application Server written in Python

21 de Fevereiro de 2014, por Desconhecido - 0sem comentários ainda

I started a new project with the name OpenMining, new application server written in Python.


OpenMining is software for creating OLAP (online analytical processing) cubes (multi-dimensional) using Numpy, Scipy and Pandas for data management and flexibility in processing dynamical filters. Open-source provider of reporting, analysis, dashboard, data mining and workflow capabilities.

Our goals

  • Business Intelligence software (Pentaho/Jaspersoft) alternative;
  • OLAP manager;
  • Generate report (grid, charts, pdf and etc);
  • Dashboard manager, link one or more element (report);
  • Easy dashboard generate;
  • Not one data is processed on the basis of source data;
  • Friendly interface;
  • Used websocket on cube load;

Python libs used

  • Pandas
  • Numpy
  • numexpr
  • ipython
  • Tornado
  • SQLAlchemy
  • RQ
  • Riak client
  • Redis client
  • Memcached client

More about OLAP cube

A cube can be considered a generalization of a three-dimensional spreadsheet. For example, a company might wish to summarize financial data by product, by time-period, and by city to compare actual and budget expenses. Product, time, city and scenario (actual and budget) are the data's dimensions.

Cube is a shortcut for multidimensional dataset, given that data can have an arbitrary number of dimensions. The term hypercube is sometimes used, especially for data with more than three dimensions.

Each cell of the cube holds a number that represents some measure of the business, such as sales, profits, expenses, budget and forecast.

OLAP data is typically stored in a star schema or snowflake schema in a relational data warehouse or in a special-purpose data management system. Measures are derived from the records in the fact table and dimensions are derived from the dimension tables.


Screenshot Screenshot Screenshot

The MIT License (MIT)

Copyright © 2014 Thiago Avelino

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.



Star and fork in github.com/avelino/mining, send pull request!

Bug tracker

Corretor Ortográfico no VIM

8 de Dezembro de 2013, por Desconhecido - 0sem comentários ainda

Desde 2007 escrevo aqui no meu blog, com isso já passei por diversas plataforma de blog (Blogspot, Wordpress, Django, Django Diario, Pelican, entre outras), hoje estou usando liquidluck (ferramenta escrita em Tornado Python para gerar arquivos estático), minha escolha para essa mudança foi simplificar o processo de escrever texto, ou seja, usar o que eu uso no dia a dia para programar, com isso tive algumas perda como corretor ortográfo!

Olhando o LibreOffice achei o plugin chamado VERO – VERificador Ortográfico, e para mim seria excelente ter ele dentro do VIM, pois bem consegui fazer o que eu queria, usar o VERO dentro do VIM.

Instalando o VERO

Primeiro precisamos baixar o plugin VERO (vou criar uma pasta dentro do /var/tmp para deixar centralizado os arquivos) e descompactar

mkdir /var/tmp/vero
cd /var/tmp/vero
unzip -x vero_pt_br_v210aoc.oxt

Abra o vim e digite:

mkspell pt pt_BR

Precisamos colocar um configuração dentro com seu .vimrc:

echo 'set spell spelllang=pt' >> ~/.vimrc

Precione enter até acabar todas as perguntas e pronto você tem o VERO instalado dentro do seu VIM, agora basta usar o corretor ortográfo!

Veja alguns comando do corretor ortográfico, aqui!

Se você gosta de VIM de uma olhada na configuração que eu mantenho https://github.com/avelino/.vimrc!

Prazo no desenvolvimento de software, qual é a ciência exata?

21 de Novembro de 2013, por Desconhecido - 0sem comentários ainda

Pensando igual macaco

Falar de prazo é uma tarefa muito complicada hoje e sempre, pois não existe uma ciência exata (tirando 42), outro ponto que prazo é uma promessa e consequentemente promessa tem que ser cumprida (e você vai fazer de tudo para cumpri-las), com isso trabalhar muito mais para cumprir o que você assumiu (prazo).

Levantando conteúdo para esse blogpost achei no Quora o seguinte topico “What is the hardest thing you do as a software engineer?” (Qual a coisa mais difícil para um engenheiro de software?) e os termos que tem haver com tempo, prazo, horas e etc são os mais falado.

Sou engenheiro de software a mais de 7 anos de experiência passando por diversas empresas, mercados, equipes, é que praticamente todo engenheiro de software que conheci começa com a premissa que “código” é o objetivo e a solução de todo problema.

Para falar mais sobre esse assunto acho necessário sairmos de nossa área de atuação (desenvolvimento de software) e olhar outras área:

  • Ilustrador
  • Produtor de video
  • Design
  • Entre outras profissão que trabalha com a mente…

As áreas relatadas acima trabalham com uma parte mais intelectual onde precisa ter a criatividade para conseguir produzir um conteúdo. Esse final de semana estava almoçando com outros desenvolvedores e um deles foi no evento InterCon onde um palestrante estava apresentando um case de um video de no máximo 1 minuto onde esse 1 minuto envolvia no minimo 5 profissionais e a produtora levou media de 5 mês para desenvolver esse projeto.

Desenvolvimento de software não é diferente das área relatada acima, é uma área intelectual onde você precisa pensar como o software escalar, se o banco de dados relacional vai se sair bem na hora que tiver muito trafego (caso não, qual é a melhor alternativa), qual é melhor design pattern para a implementação a ser feita e outros pontos que envolvem o desenvolvimento de software.

Então aprendam a primeira e mais difícil verdade do mundo: Software normalmente não é resolvido com Software, é resolvido com capacidades Humanas. Numa distribuição de Paretto eu diria que 80% de todo problema de software somente é resolvido quando você investe aqueles 20% restantes em Comunicação, Articulação, Pensamento Claro e Racional, quebra Ambiguidades, Negociação, Compromisso.

Quando você passa um prazo (faz uma promessa) você vai ter que assumir o risco que a proposta inicial vai realmente resolver o problema proposto, e isso nem sempre é possível pois estamos trabalhando com tecnologia e a evolução é constando. Outra que nos engenheiro de software não somos maquinas onde usamos software para escrever software e sim uma cabeça pensante de onde sai toda a logica.

Dito isso, é possível cumprir todas as promessas? Não, infelizmente não é. Mas é nossa responsabilidade como profissionais estar sempre em busca desse ideal, não criar maneiras de evitá-las.

Ou seja, não existe uma ciência exata para prazo!

A volta dos que nao foram, software livre para sempre

29 de Outubro de 2013, por Desconhecido - 0sem comentários ainda

Chromebook Pixel; MacBook Pro Retina display (Image: ZDNet)

Durante 5 anos usei o sistema operacional da Apple (OS X), o OS X é um ótimo sistema operacional principalmente o ambiente gráfico que é sensassional, sistema de áudio entre outros recursos, os 3 primeiro anos usei sem problema nem um ate que a Apple veio com uma historia de cobrar pelo Xcode (The Xcode interface seamlessly integrates code editing, UI design with Interface Builder, testing, and debugging, all within a single window. The embedded Apple LLVM compiler underlines coding mistakes as you type, and is even smart enough to fix the problems for you automatically), ou seja, é a IDE para escrever projetos para plataforma Apple (OS X e iOS) mais o compilador vugo GCC, essa foi a gota d'agua, eles estavam vendendo o GCC, mas como eu já tinha me acostumado com o ambiente (que não é um trabalho muito complicado pois a Apple faz ótimos produtos) não quiz parar de usar e comprei o Xcode, depois de um tempo a Apple voltou a traz colocando novamente de graça.

Depois dessa dramática historia acima comecei olhar valores de notebook (e ultrabook) a tentativa de parar de usar OS X, logo após olhar valores fica pensando, acho que não vou conseguir voltar usar Linux como estação de trabalho novamente pois vou sentir falta dos aplicativos Apple e deixei a ideia para lá, e nisso se passou mais 1 ano.

Ate que parei para refletir o que eu usava do OS X, segue abaixo a lista de aplicativos:

  • iTerm2
  • vim (via linha de comando)
  • Python
  • ssh
  • PostgreSQL
  • Chrome (e diversos serviços web)

Ou seja, tudo que eu usava e acha que iria sentir falta eu conseguiria rodar em Linux. Logo depois dessa reflexão eu lembrei que tinha ganhado um CR-48 (Chromebook) do Google e resolvi começa brinca com ele para ver como era à experiência, apesar da maquina não ser potente como o Macbook Retina (i7) que eu usava estava atendendo minha necessidade, a primeira vista é um notebook que tem apenas um Chrome e com isso todos os serviços web funciona perfeitamente. Olhando o Chrome OS mais de perto vi que é um Linux (baseado em Gentoo) ao meu ver o Google fez um ótimo trabalho principalmente no ambiente X (mais para frente escrevo um blog post falando sobre o que achei do Chrome OS).

Depois desse lero lero todo, achei uma distribuição Linux que atendia minha necessidade ( browser e console para desenvolver), para quem não sabe é possível instalar Linux via chroot dentro de uma pasta no Chrome OS.

Eis que resolvi compra o Chromebook Pixel, que por sinal tem uma hardware ótimo para trabalhar com Chrome OS.

Caixa do Chromebook Pixel

Estou trabalhando a uma semana no Chrome OS e ate agora não tive necessidade de pegar o Macbook para nada, ou seja, voltei usar Linux e agora posso dizer novamente que não uso nem um software propietario no meu notebook. Tudo que achei que iria sentir falta do ambiente Apple era nada mais nada menos que coisa da minha cabeça.

Estou de volta ao desktop livre.

New web framework asynchronous to Python 3

11 de Agosto de 2013, por Desconhecido - 0sem comentários ainda/static/images/nacho.jpg

I started a new project with the name nacho, asynchronous web framework for Python 3.

Our goals

  • It was designed to work on Python 3.x
  • Some of syntax were inspired on Tornado's syntax
  • Tornado is the default server, but Eventlet is stable as well
  • Templates are done by Jinja2
  • HTML5 as the big-main-thing
  • Work friendly with NoSQL (otherwise we should stop talking about them)
  • Handle asynchronous requests properly


class MainHandler(ApplicationController):
    def get(self):
        data = {'title': 'testando lero lero'}
        self.render("home.html", **data)

r = Routers([(r"/", MainHandler),])

Chromium as the default browser

2 de Março de 2013, por Desconhecido - 0sem comentários ainda

Logo ChromiumThe code of Google Chrome is based on Chromium, all the feature implemented in Chromium comes in Google Chrome.

What do you think of being one of the first to test new feature of Google Chrome? Interesting huh!

Download a bleeding-edge build of Chromium for Mac!

Chromium does not update automatically, for this reason I wrote a shell script which updates the Chromium on Mac:

# Note, this will remove /Applications/Chromium.app

echo '..'
rm -f chrome-mac.zip chrome-mac
export CHROME_VERSION=`curl http://commondatastorage.googleapis.com/chromium-browser-continuous/Mac/LAST_CHANGE`
echo "   latest version: $CHROME_VERSION"
echo '..'
  echo '   latest version!'
	echo '..'
	exit 2
echo "   save latest version: $CHROME_VERSION"
echo '..'
echo "   get latest version: $CHROME_VERSION"
echo '..'
wget http://commondatastorage.googleapis.com/chromium-browser-continuous/Mac/$CHROME_VERSION/chrome-mac.zip
echo "   compile latest version: $CHROME_VERSION"
echo '..'
unzip chrome-mac.zip
rm -rf /Applications/Chromium.app
echo "   install latest version: $CHROME_VERSION"
echo '..'
mv chrome-mac/Chromium.app /Applications/Chromium.app
rm -rf chrome-mac chrome-mac.zip
killall -9 Chromium
open /Applications/Chromium.app
echo 'DONE'

base source: https://github.com/avelino/dotfile/blob/master/chromium_update.sh

The post Chromium as the default browser appeared first on Thiago Avelino.

Riak, alta performance NoSQL para seu projeto

23 de Dezembro de 2012, por Desconhecido - 0sem comentários ainda

Riak Banco de dados NoSQL, focado em escalabilidade, disponibilidade e performanceEsse ano de 2012 ajudei a comunidade Riak que a cada dia esse banco de dados vem me surpreendendo. Estou para escrever um blogpost desde fevereiro, mas como vida de programador (pelo menos para mim esse ano) é agitada.

Resolvi falar sobre a performance nesse primeiro blogpost sobre Riak e colocar na mesa um teste (relativamente simples) para compara o tempo de inserção, realmente é um teste simples se tratando de NoSQL.

Antes de mostrar a comparação acho importante deixar claro as vantagens que temos em utilizar Riak:

  • Disponibilidade: sistema de recuperação de dados onde trabalha de forma inteligente para que esteja disponível para ler e escrever operações, mesmo em ambiente com falha, assim garantindo a integridade dos dados;
  • Tolerância a falhas: pode perder o acesso aos nós (Servidores Riak), devido à falha de rede ou partição de hardware e nunca perder de dados;
  • Simplicidade de utilização: facil adição de máquinas em um cluster Riak, sem ocorrer uma carga nos servidores – isso em um pequeno grupo de servidores como uma grande quantidade de servidores Riak;
  • Escalabilidade: Riak distribui automaticamente os dados ao redor do cluster e produz um aumento de desempenho quase linear quando você adicionar dados.

Depois de deixar claro os itens acima podemos colocar na messa o Riak e o grande MongoDB, lembrando que esse blogpost não é para falar qual NoSQL é melhor ou para você parar de utilizar um ou outro banco, Riak e MongoDB tem algumas características semelhantes, esse foi o motivo de colocar em teste os dois.

O teste foi simples preciso inserir 1 milhão (1000000) de registro no meu banco de dados, qual banco de dados entrega isso mais rápido para mim?

Código Python usando drive nativo do Riak:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import riak
client = riak.RiakClient()
bucket = client.bucket('test')
for i in range(0, 1000000):
person = bucket.new('riak_developer_%d' % i, data={'name': 'Thiago Avelino %d' % i,
'age': 18+i,
'language': ['python'],})
view raw riak.py This Gist brought to you by GitHub.

Código Python usano drive nativo do MongoDB:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pymongo import MongoClient
connection = MongoClient()
db = connection.test
persons = db.persons
for i in range(0, 1000000):
person = persons.insert({'name': 'Thiago Avelino %d' % i,
'age': 18+i,
'language': ['python'],})
view raw mongodb.py This Gist brought to you by GitHub.

Um código simples onde faço um loop que vai de 0 a 1000000 (estou fazendo 1000001 inserção), e dentro de cada interação do loop estou gerando um registro no banco de dados. Veja abaixo o resultado:

1 2 3 4 5
(riak-test) ~/Sites/riak-test$ time python riak.py
python riak.py 15.60s user 0.14s system 99% cpu 15.850 total
(riak-test) ~/Sites/riak-test$ time python mongodb.py
python mongodb.py 144.14s user 35.47s system 55% cpu 5:25.85 total

Realmente o tempo de execução do Riak é muito mas muito rápido, o que me deixou mais surpreso foi o tempo do MongoDB, o MongoDB demorou 9 vezes mais comparado com o Riak.

Não estou falando que o MongoDB é ruim, ate mesmo que tenho projetos grande em produção usando ele e dependendo do projeto/infra recomendo usar MongoDB.

The post Riak, alta performance NoSQL para seu projeto appeared first on Thiago Avelino.

Palestra sobre London Framework na PyCon Argentina

20 de Novembro de 2012, por Desconhecido - 0sem comentários ainda

Universidad Nacional de Quilmes, local onde foi organizado a PyCon Argentina

No começo de junho o Mariano (organizador do evento PyCon Argentina 2012, me fez um convite para ir palestra sobre London Framework (Framework criado por Marinho Brandão).

Nada melhor do que conhecer pessoas e principalmente culturas novas, entender o que os Argentinos estão desenvolvendo e o que anda estudando, ou seja, fazer network (como falamos na área de tecnologia). Dava para ver no rosto dos argentinos a vontade de aprender e de consumir o maximo de informação possível, na PyCon Argentina de 2012 teve uma ótima seleção de palestra, onde foi abordado temas como asynchrony (twisted), Plone (com Erico Andrei – Brasileiro), web2py  (com Massimo Di Pierro – criador do framework), Python 3.3 (com Brett Cannon – Desenvolvedor Google) e muito mais.

Tive grande privilegio de palestra sobre London Framework, foi apresentado o motivo de criar um novo framework (Python) e hoje temos funcionando dentro do London. A repercussão foi muito positiva, recebi muitos tweets e e-mails de desenvolvedores querendo saber mais sobre London Framework, o que mostra grande aceitação e necessidade (semelhantes) do framework dentro da comunidade Argentina. Veja abaixo os slide da palestra de London Framework:

A pedidos da organização, fiz minha palestra em portunhol (tinha planejado apresentá-la em inglês, já que não sou fluente em espanhol). Pelas conversas de corredor, acredito que o público entendeu bem o meu portunhol!

Python Software Fundation

No final do primeiro dia de evento tivemos uma confraternização, onde a organização da PyCon Argentina chamou uma pizzaria conhecida de Buenos Aires para fazer algumas pizza. A forma dos argentino preparar a pizza é bem diferente de nos Brasileiros, não querendo puxar sardinha para os Argentinos, é muito gostosa a pizza Argentina.

Eu fui na PyCon Argentina 2012

The post Palestra sobre London Framework na PyCon Argentina appeared first on Thiago Avelino.