Many fellas ask me: “why should I learn Python?” so I solved to list a lot of reasons.

Python is the most excited language I’ve ever worked. I use Python since 2008, actually I started to study python since my first year on the graduation. It was funny because I was studying C and Python shows up so easy. I remember which I had many problems with semicolon. Six years passed and now, Python is stronger. So, let me show you some reasons for u use Python:

  • Python is easy and it is clear. You don’t need to waste time with monkey jobs. You just need to develop what you want.
  • Many companies use Python like NASA, GLOBO (Brazil) , M$, APPLE, DISNEY, DROPBOX, GOOGLE… believe Python is everywhere.
    • “Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we’re looking for more people with skills in this language.” said Peter Norvig, director of search quality at Google, Inc.  See more.
  • Object-Oriented Programming or Functional Programming or Imperative programming. You don’t need to choose it. You can use all it with Python. Lambda, map, filter, zip… I love it.
  • The Python interpreter allow you test code snippets very quickly. Actually, if you are using Python on Linux, you should install bpython.
  • There is no company behind Python (like Java has) but there is a huge community. Actually, community is the most cool thing when is talking about opensource.
  • Python is now the the most popupar introductory  teaching language at top US universities because it is powerfull and easy to learn it.
  • Also, Python won twice the “Programming language of the year” created by the TIOBE and according the IEEE, Python is the 4th language most popular.
  • There are a lot of content on the web to study. See my page.

So, listen to me. You should learn it, man! I will increase that list but for while it is enough.

RL

 

Blue Eyes

Today, I wont talk about tech. I will talk about a interesting brazilian movie which I watched yesterday. Indeed, it is a movie with americans and brazilian actors. Its name is “Olhos Azuis” (Blue Eyes).  Yesterday was a busy day and I was relaxing in front TV while I was waitin’ fall asleep to rest a little but instead of that, I watched that movie. It is a story about the US immigration officer who travel to Pernambuco to find a little girl, an foreing daughter. I don’t want to say spoilers about the movie but it is pretty cool. Actually, Pernambuco is my state so it was an attractive a more and the brazilian guy, I mean the main actor is from here.

RL

Recently, I implemented the Fish School Search II for a discipline on my master degree.
FSSII is an optimization algorithm proposed by Carmelo et all. Actually, it is a version improved of the Fish School Search. That version was proposed last year in the BRICS conference.

Paper: “An Enhanced Fish School Search Algorithm”,
Authors: C. J. A. Bastos-Filho, D. O. Nascimento.
Conference: BRICS 2013, Porto de Galinhas, Brazil. http://brics-cci.org/

I implemented to solve the Rastrigin’s and Sphere’ problem but is very simple to extend for other one. It is a Python code so it is very easy to understand it. I guess I have the code implemented in C++ but I need to find in my stuff.

https://dl.dropboxusercontent.com/u/5992545/Blog/FSS2.py

 

No meu trabalho de Reconhecimento de padrões, eu precisei utilizar uma base que me fornecia imagens como vetor de bits. Por exemplo, o f  era representado pelo seguinte vetor:

0000000000000000000001111110000
0000000000000000000001111111100
0000000000000000000001111111110
0000000000000000000001111111111
0000000000000000000111111111110
0000000000000000000111111111110
0000000000000000000111111111111
0000000000000000000011111111111
0000000000000000000111111111111
0000000000000000001111111111110
0000000000000000000111111111111
0000000000000000000111111111111
0000000000000000000111111111111
0000000000000000001111111111111
0000000000000000001111111111111
0000000000000000011111111111110
0000000000000000011111111111110
0000000000000000011111111111100
0000000000000000011111111111100
0000000000000000001111111111100
0000000000000000011111111111000
0000000000000000011111111111000
0000000000000000011111111111000
0000000000000000111111111111000
0000000000000000111111111110000
0000000000000111111111111100000
0000000000011111111111111000000
0000000000011111111111111000000
0000000000111111111111111000000
0000000011111111111111111000000
0000001111111111111111110000000
0000011111111111111111110000000
0000111111111111111111110000000
0011111111111111111111110000000
1111111111111111111111110000000
1111111111111111111111111000000
1111111111111111111111111000111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111110000000111111111111111111
1111100000000111111111111111111
1100000000000011111111111111111
0000000000000001111111111111111
0000000000000001111111111111110
0000000000000000111111111111000
0000000000000001111111100000000
0000000000000000111111110000000
0000000000000000111111110000000
0000000000000000111111110000000
0000000000000000111111111000000
0000000000000000111111111000000
0000000000000000111111111000000
0000000000000000111111111100000
0000000000000000111111111110000
0000000000000000111111111110000
0000000000000000111111111111000
0000000000000001111111111110000
0000000000000000111111111111000
0000000000000000111111111111000
0000000000000000111111111111100
0000000000000000011111111111100
0000000000000000111111111111000
0000000000000000011111111111100
0000000000000000011111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000000111111111100
0000000000000000000011111111100
0000000000000000000011111111100
0000000000000000000001111111100
0000000000000000000000111111100
0000000000000000000000001111100

Infelizmente, eu estava utilizando uma framework que necessitava receber a imagem e não o vetor de bits que é extraído dela. Logo, eu tinha que dá um passo pra trás pra puder dá dois pra frente.

Fazendo uma pesquisa na internet, encontrei uma função do scipy que fazia exatamente o que eu queria.  scipy.misc.imsave cria uma imagem a partir de um array da classe numpy.

A partir disso, eu criei o seguinte código:

#!/bin/bash

import scipy
import numpy

def create_bynary_image(binary_content, output_name):
    letter = open(bynary_content)
    bits_image = []

    for line in letter:
        bits_image.append(map(lambda x: int(x), list(line.replace('n',''))))

    np_array = numpy.array(bits_image)
    letter.close()
    scipy.misc.imsave(output_name, np_array)

if __name__ == '__main__':
    create_bynary_image('letter.txt', 'f.png')
   

Abaixo o conteúdo de letter.txt que é usado no exemplo.

0000000000000000000001111110000
0000000000000000000001111111100
0000000000000000000001111111110
0000000000000000000001111111111
0000000000000000000111111111110
0000000000000000000111111111110
0000000000000000000111111111111
0000000000000000000011111111111
0000000000000000000111111111111
0000000000000000001111111111110
0000000000000000000111111111111
0000000000000000000111111111111
0000000000000000000111111111111
0000000000000000001111111111111
0000000000000000001111111111111
0000000000000000011111111111110
0000000000000000011111111111110
0000000000000000011111111111100
0000000000000000011111111111100
0000000000000000001111111111100
0000000000000000011111111111000
0000000000000000011111111111000
0000000000000000011111111111000
0000000000000000111111111111000
0000000000000000111111111110000
0000000000000111111111111100000
0000000000011111111111111000000
0000000000011111111111111000000
0000000000111111111111111000000
0000000011111111111111111000000
0000001111111111111111110000000
0000011111111111111111110000000
0000111111111111111111110000000
0011111111111111111111110000000
1111111111111111111111110000000
1111111111111111111111111000000
1111111111111111111111111000111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111110000000111111111111111111
1111100000000111111111111111111
1100000000000011111111111111111
0000000000000001111111111111111
0000000000000001111111111111110
0000000000000000111111111111000
0000000000000001111111100000000
0000000000000000111111110000000
0000000000000000111111110000000
0000000000000000111111110000000
0000000000000000111111111000000
0000000000000000111111111000000
0000000000000000111111111000000
0000000000000000111111111100000
0000000000000000111111111110000
0000000000000000111111111110000
0000000000000000111111111111000
0000000000000001111111111110000
0000000000000000111111111111000
0000000000000000111111111111000
0000000000000000111111111111100
0000000000000000011111111111100
0000000000000000111111111111000
0000000000000000011111111111100
0000000000000000011111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000001111111111100
0000000000000000000111111111100
0000000000000000000011111111100
0000000000000000000011111111100
0000000000000000000001111111100
0000000000000000000000111111100
0000000000000000000000001111100
e o resultado foi

teste

RL

 

Caminhos relativos já me deram muita dor de cabeça quando eu coloco um script para ser executado via CronJob. Como o script é executado de um caminho que não é a pasta dele, o output acaba sendo criado numa outra pasta.

A forma mais simples que achei para contornar essa situação é forçar o output a ser criado na pasta que o script está no disco. Contudo, essa localização pode mudar e não pode ser adicionada hardcode no script, logo ela tem que ser obtida dinamicamente.

#/bin/bash
SCRIPTPATH=$( cd $(dirname $0) ; pwd -P )

#usage
log_file=$SCRIPTPATH/log

echo "Logging" | tee -a $log_file

Estava desenvolvendo um script e precisava de alguma estrutura que permitisse-me fazer manipulações da seguinte forma:

dicionario[dia][hora][chave1] = x
dicionario[dia][hora][chave2] = y

Ou seja, basicamente criar dicionários aninhados. Eu poderia manipular de forma mais espartana um dicionário e criar uma estrutura aninhada, porém eu queria fazer isso de uma forma mais direta. Queria que essa criação fosse invisível a mim. Dessa forma, eu encontrei o defaultdict. O defaultdict é uma classe do módulo collections em python que faz exatamente o que queria. Infelizmente pra meu azar, essa classe só foi inserida na versão 2.5 da linguagem e a versão que eu tinha disponível no servidor era apenas a 2.4 – old but gold.

Depois de uma pesquisada na internet, encontrei uma implementação da classe defaultdict no qual venho usando desde então nos meus scripts. Abaixo segue a implementação e um exemplo de uso.

CODE

http://pastebin.com/8LDaqW4G
#!/usr/bin/python

class defaultdict(dict):
    def __init__(self, default_factory=None, *a, **kw):
        if (default_factory is not None and
            not hasattr(default_factory, '__call__')):
            raise TypeError('first argument must be callable')
        dict.__init__(self, *a, **kw)
        self.default_factory = default_factory
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = value = self.default_factory()
        return value
    def __reduce__(self):
        if self.default_factory is None:
            args = tuple()
        else:
            args = self.default_factory,
        return type(self), args, None, None, self.items()
    def copy(self):
        return self.__copy__()
    def __copy__(self):
        return type(self)(self.default_factory, self)
    def __deepcopy__(self, memo):
        import copy
        return type(self)(self.default_factory,
                          copy.deepcopy(self.items()))
    def __repr__(self):
        return 'defaultdict(%s, %s)' % (self.default_factory,
                                        dict.__repr__(self))

def recursively_default_dict():
    return defaultdict(recursively_default_dict)

if __name__ == '__main__':
    dic = recursively_default_dict()
    dic['a']['b']['c'] = 3
    dic['a']['b']['d'] = 4

    print "dic['a']['b']['d']", dic['a']['b']['c']
    print "dic['a']['b']['d']", dic['a']['b']['d']

Um amigo meu perguntou-me um bom material pra começar a estudar C/C++ em Linux, logicamente lembrei-me do livro “Advanced Linux Programming” que fica disponível na web.  Claro que o que ele queria era algo para começar a dar os primeiros passos com a linguagem no ambiente Linux mas se você já tem alguma experiência e quer se aprofundar na manipulação de Threads,  Comunicação entre processos, Syscalls, etc, eu recomendo dá uma lida nesse livro!

http://www.advancedlinuxprogramming.com/

Download de capítulos
http://www.advancedlinuxprogramming.com/alp-folder

Esquemático do Neurônio LSTM

Ultimamente, eu venho estudando LSTM (Long Short Term Memory)  para ser aplicado em keywork spotting. Isso tudo faz parte de uma cadeira de Aplicação em Computação Inteligente que estou pagando no mestrado.  A LSTM é uma rede neural projetada para lidar com longos tempos de dependências. Esse tipo de rede consegue superar o problema de erro propagado que é encontrado nas redes neurais convencionais.

Nessas idas e vindas na área, eu acabei colhendo vários artigos sobre o assunto para apoiar os meus estudos.  Eu fiz um pacote com vários artigos sobre LSTM e vou deixar disponível aqui no blog[1]. Quem tiver interesse em usar esse tipo de rede, eu aconselho a instalar a RNNLIB[2]. RNNLIB é uma biblioteca de redes neurais recorrentes desenvolvida por Alex Graves.

[1] https://dl.dropboxusercontent.com/u/5992545/Blog/pdfs-rnn.zip

[2] http://sourceforge.net/p/rnnl/wiki/Home/

RL

 

Lumna

Lumna

Recentemente,  a Coeus precisou desenvolver um aplicativo para Android no qual se comunicava com uma software embarcado via bluetooth. O nome do aplicativo desenvolvido foi o Lumna e mais informações sobre o app pode ser visto na página das aplicações da Coeus. Basicamente, esse aplicativo enviava códigos para o software através da comunicação bluetooth existente entre eles.

Como todo o aplicativo foi desenvolvido sem a placa que recebia os comandos, o jeito foi emular o comportamento dela. Para isso, eu utilizei um pequeno servidor bluetooth no meu próprio notebook.  Esse aplicativo utiliza a biblioteca bluecove para permitir o acesso ao bluetooth do computador.

Estou disponibilizando o código utilizado nesse servidor bluetooth. O código é bem simples e pode ser portado para qualquer aplicação do tipo.

https://dl.dropboxusercontent.com/u/5992545/Blog/BluetoohServerRodrigoLiraBlog.zip

 

RL

 

 

 

Um amigo meu apresentou-me um app bem interessante pra quem precisa organizar tarefas. O nome do aplicativo é Asana.

O aplicativo é gratuito para até 15 pessoas no projeto. Ele permite o gerenciamento de atividades de forma bem simples. Hoje, eu o utilizo para gerenciar minhas atividades no mestrado e em projetos pessoais. Ahh e ele ainda possui uma versão pra Android!

https://asana.com/

 

RL