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

 

Anúncios

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

That is the way how I post source code in my blog

Matthias Hoys

In my previous blog post, I published the source code of a bash shell script. I noticed that WordPress kept on messing around with the code (like replacing some of the double quotes), and at first I didn’t know how to solve this (I’m quite new to WordPress).

And then I found the following support article:

http://en.support.wordpress.com/code/posting-source-code/

So, basically, you need to wrap your source code into “sourcecode” blocks, using the HTML editor.

There are also some nice options, like setting the language, enabling highlighting or line wrapping etc.

This is an example with sourcecode language=”bash” as option:

Matthias

Ver o post original


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


PDFs sobre LSTM

09jun14

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


[TIP] Asana

06jun14

 

 

 

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


Aciinema

04jun14

 

Recently, I found a way to record shell sessions. It seems nice.

If you need to create a “howto” on the shell, you should use the Asciinema!

See https://asciinema.org/

 


Often I have to download mail attachments to save the data.  It is a monkey job but It must to be done. Thank god I found a
app to solve this problem. I’m not expert but this app solve all my needs. I just enter with my password and my username and
booom! It’s all done. It’s simple. If you need downloadattachment, I guess you found out the solution. Take a look!

http://gearmage.com/maildownloader.html

 

Mail Attachment Downloader