I have one problem…

– I have one problem.
– Let’s use XML and Perl
– Now I have three problems!

Let’s use Java instead!
Now you have a ProblemFactory problemFactory = new ProblemFactory(ProblemFactory.PROBLEM_FACTORY);
Let’s use C instead!
Now I am rewriting the string library! Now I am rewriting malloc()!
Let’s use Erlang.
Now I have no idea what I am doing.
Let’s use LISP.
Now I feel superior, but it takes 200 times to run.
Let’s use FORTRAN!
And now every computer scientist hates me
Let’s use Python.
Now I just “import work” and go home.
“Knock, knock.”
“Who’s there?”

very long pause….

“Java.”
If you put a million monkeys at a million keyboards, one of them will eventually write a Java program.
The rest of them will write Perl programs.
A Cobol programmer made so much money doing Y2K remediation that he was able to have himself cryogenically frozen when he died. One day in the future, he was unexpectedly resurrected.
When he asked why he was unfrozen, he was told:
“It’s the year 9999 – and you know Cobol”

Q: How many prolog programmers does it take to change a lightbulb?
A: Yes.

Reading man pages with Preview

Reading the man pages in the terminal are really boring, specially using up, down, space, “/” keys.

Using Mac Os X is possible to read the man pages in Preview.

Just put this code into yours .bash_profile / .profile file and be happy :)

pman() { man -t “$@” | open -f -a Preview; }

after restarting the bash, just use the pman command rather the usual man.

Just explaining:

the -t option gets the content of the man page and puts it in the stdout, where will be read by the open and opened in the Preview.

Suporte para Sequências de RNA no Genoogle.

Enquanto muitos estão na praia, bebendo, discutindo sobre o hexa campeonato do Flamengo, estou implementando o suporte a sequências de RNA no Genoogle.

A princípio parecia simples,definir um novo alfabeto, tirando o T do DNA e adicionando o U. Porém estou fazendo um trabalho bem mais amplo. Agora que o Genoogle está começando a ficar maduro, estou organizando melhor a estrutura de classes e os Junits. Como exemplo da mudança, o “diff” está em mais de 3.700 linhas de código. Acredito que esteja valendo a pena. Ano que vem, no início quero fazer um anúncio mais formal do Genoogle nas principais listas de discussão de bioinformática brasileiras e estrangeiras.

Fora o trabalho na estrutura interna do Genoogle, eu gostaria de trabalhar na interface Web dele. Estou meio sem tempo, porém se tu tiveres vontade de trabalhar com GWT (http://code.google.com/webtoolkit/), um pouco, bem pouco de SQL e muito de Java, contate me para conversamos!

Genoogle wants YOU!

Então, acabei de liberar uma versão nova do Genoogle.
Esta versão junto com a anterior é um conjunto de melhorias e correções que eu queria ter feito, como utilizar as variáveis de ambiente para algumas configurações e melhorias na exibição dos resultados. Percebo que uma das partes mais chatas é a liberação de uma nova versão. Mesmo com um checklist, é chatinho escrever changelist, pegar versão, gerar binarios, copiar para outro repositorio, verificar se tudo deu certo e anunciar. A parte de programar, desenvolver, é relativamente fácil, o difícil é liberar e fazer com que as pessoas usem.

Então, por isto novamente estou fazendo a propaganda aqui.
Se você gosta de genética, programação, desenvolvimento, algoritmos, procura um projeto interessante para se envolver, visite a página do Genoogle, baixe os binários, os fontes, inscreva-se no grupo, e participe!

O Genoogle é um concorrente do NCBI-BLAST, um dos softwares mais utilizados e citados na área de bioinformática, e tenho certeza que o Genoogleé capaz de abocanhar uma fatia destes usuários!

Eu ainda não fiz um anuncio em grandes listas de discussão, pois ainda quero mais usuários, encontrar e corrigir mais bugs e ter uma versão mais estável. Então, o Genoogle precisa de VOCÊ!

Eclipse no ubuntu 9.10

Depois de eu ter atualizado meu ubuntu para a versão 9.10,
comecei a perceber alguns comportamentos estranhos no Eclipse:
botões não funcionavam com clique do mouse e “restos” das janelinha amarelas.
Primeiramente tentei a solução mais simples: rm -rf eclipse/ , fiz o download, e usei uma nova versão. Não funcionou. :-(

Pesquisando um pouco, descobri que estes comportamentos anormais são por causa de algumas modificações do GTK
e que o Swt não corrigiu o modo de acessar esta biblioteca. Felizmente a solução do problema é bem simples:
antes de inciar o Eclipse, execute este comando:

export GDK_NATIVE_WINDOWS=true

e execute o Eclipse normalmente. Tudo irá funcionar bem!

No meu caso, que inicio o Eclipse por um ícone no desktop, eu criei um arquivo “eclipse.sh” com:

export GDK_NATIVE_WINDOWS=true
~/java/eclipse/eclipse

(onde ~/java/eclipse é onde está o Eclipse), dei permissão de execução para este script: chmod +x eclipse.sh
e no íncone, mudei o comando para executar o eclipse.sh. Simples e funcionou!
Alias, vi que este bug será corrigido na versão 3.5.2.

Windows 7 Locks

No artigo da OsNews : http://www.osnews.com/story/22501/Microsoft_Kernel_Engineers_Talk_About_Windows_7_s_Kernel , engenheiros do Microsoft falaram sobre o Kernel do Windows 7 e sobre as melhorias nele e principalmente que pela primeira vez na história da empresa, um novo sistema operacional consome menos memória que seu antecessor.
Praticamente o artigo inteiro comenta sobre locks. É interessante notar que até a versão anterior (Vista) existiam locks globais (!!) do sistema operacional e estes locks foram substituídos por “fine-grained-locks”. Isto me lembra um pouco do Big Lock do Linux até a versão 2.2 e que foi substituindo por locks menores no 2.4.

O artigo em si é muito interessante por dois motivos: como modificações no kernel podem ser feitas, beneficiando o sistema como um todo sem haver quebra de compatibilidade, principalmente, sem modificar as interfaces do Kernel.
Também, a grande diferença que se faz em utilizar locks localizados do que no sistema como o todo. Isto até para desenvolvedores de aplicativos é interessante. Por exemplo, no acesso a um vetor de 64 ou 128 megabytes, ao invés de sincronizar o acesso a este vetor, sincronizar o acesso a entradas ou aos conjuntos de entradas deste vetor.

Recomendo a leitura, principalmente por ser um ótimo “estudo de caso” sobre locks.

Defesa de mestrado

Finalmente, no dia 26 de outubro irei defender minha tese de mestrado.

A minha tese é sobre a possibilidade de utilizar no processo de busca por sequências similares a indexação de base de dados de sequências genéticas com técnicas de paralelização. Para quem se interessa em processamento paralelo e de alto desempenho, programação, information retrieval ou bioinformática, o convite está feito para asstir minha defesa que tem o título de “Algoritmo otimizado para comparação de seqüências e busca em base de dados” no IME dia 26 de Outubro de 2009 as 09:00.

Sério, assistam! Os resultados foram bem interessantes!

HAR 2009

O HAR 2009 é um evento NERD, realmente NERD, mas nerds inteligentes e não manés que acham legal acampar dentro de um prédio.
Então, nele teve apresentações sobre coisas hackers. Hackers no sentido de estudar, entender, mexer, mudar, adultarar e abrir cadeados!
Das apresentações, as que eu mais gostei foram duas sobre rootkits, uma sobre o estágio atual e outra sobre um rootkit que fica armazenado no MBR. Vale a pena ir na página do rootkit desta segunda apresentação, é muito interessante como o programa é armazenado e carregado antes do sistema operacional. Há, tem um artigo que explica o funcionamento muito bem!

Alem das apresentações, teve alguns eventos extras, como o pessoal do OpenBSD que se reune, o pessoal que gosta abrir cadeados de verdade, este grupo é bem interessante e eu ia lá relaxar aprendendo algumas artimanhas e abrindo alguns cadeados, teve uma barraquinha do TK com suas torradinhas gratuitas com direito a foto com a torrada e por fim o direito de conhecer uma linda cidade chamada Vierhouten!

Então, na página do HAR: har2009.org, tem todas as apresentações gravadas e os links para mais informações. Realmente vale a pena fuçar e se preparar para o CCC ano que vem (acho que será ano que vem…)

Yahoo Hack Day FTW !

Neste sábado e domingo estive no Open Hackday Brasil do Yahoo. Estava bem bacana lá, só faltou uma cama confortável para passar a noite. Já escrevi um post no meiobit sobre o evento. Estou aqui para falar do Hack que eu e o Fabiano Modos fizemos.

Durante o primeiro dia não conseguimos fazer muita coisa, porque a nossa idéia era fazer todas as chamadas de serviço em Java Script dentro de uma página estática usando Ajax. Porém o HTTPRequest não permite este tipo de chamada quando se está em servidores diferentes. Algumas chamadas, por exemplo, para os serviços do Yahoo funcionavam, porque o Yahoo possui uma api para usar json para este tipo de chamada. O problema ocorria quando queríamos utilizar serviços como do LastFm.

Ia esquecendo, nossa idéia era um portal de busca para bandas utilizando o BOSS e web services. No fim da noite de sábado estávamos meio putos por não ter conseguido fazer tudo em java script, então desistimos e fomos mexer no Search Monkey e começamos outro projeto.

Este outro projeto era exibir informações do Wikitravel. A principal parte foi feita pelo Fabiano e rapidamente terminada, porém gastamos bom tempo tentando fazer algumas coisas diferentes, mas percebemos que o Search Monkey é bem limitado. Isto já era sete da manha de domingo, então fomos conversar com uns caras do Yahoo e chegamos a conclusão que teríamos que fazer o negócio de busca de bandas, porém utilizando um servidor. Concluímos em usar PHP, já que não é chato configura-lo no windows e nem tem toda a gordura embutida no Java.

Como já sabíamos os serviços, o negócio foi jogar boa parte para o lado do servidor e fazer os tratamentos lá, porém continuando a chamar os serviços pelo java script. Seria algo como:
Java Script -> Nosso servidor -> Web Service externo.

Nas 7 horas seguintes fiquei encarregado de fazer as funcoes do servidor, entender como funciona as apis e o Fabiano em colocar tudo a funcionar no cliente java script. O legal foi um negócio que fizemos que pega o nome da banda, busca no last fm os eventos dela, para cada evento pega a localização e pais, para cada localização busca as posições X e Y e exibe no mapa. O único problema que ficou um pouco lento, mas ficou bem legal &:-)
Também fiz um pipe que pega as musicas mais ouvidas no itunes e ve se o artista está nesta lista, se exibir, diz que o artista é famoso e exibe um link para o video da música no Youtube.

Então chegou a hora de apresentar, tivemos uns probleminas com o computador que iríamos apresentar, mas deu tudo certo.

Apresentando o hack
Apresentando o hack

Então aguardamos a premiação, até que estávamos confiantes porque sabiamos que nosso Hack era interessante e usamos muitas APis do Yahoo e juntas com outros web services disponíveis.

E o vencedor é?

É tetraaaa!!!

Mais feliz que guri de bombacha nova!

Realmente, ficamos muito contentes, porque nos esforçamos bastante durante o evento e para fazer este hack funcionar. Tudo bem que há bugs, mas se nao tivesse nao seria um hack :-)

Aqui tem a apresentação do nosso Hack:

Google, Yahoo Hackday, e outros.

Não morri, mas estou bem ocupado.

Infelizmente ano que vem não irei ao Google como funcionário “de verdade”, porém neste tempo abriram algumas portas para fazer doutorado ou trabalhar em excelentes empresas aqui do Brasil.

Semana que vem irei ao Yahoo Hack Day Brazil, estou sem o link do evento agora, procure no Google. Este evento ocorre em 2 dias em que no primeiro são algumas palestras sobre as APIs do Yahoo e no segundo se desenvolve algum programa. Parece bem interessante.

Estou vendo para ir atrás de algum doutorado no Brasil ou no exterior, mas não sei se eu aguentaria mais 5 anos de academia. É legal, dependerá muito do professor e área. Gosto muito de pesquisar, mas da mesma forma gosto de fazer. Para mim um bom paper é uma consequencia de um bom trabalho realizado e não o primeiro objetivo. Acho que empresas que vendem software sem te-lo é a mesma coisa que publucar um excelente e lindo paper sobre um algoritmo/software que não funciona tão bem quanto exposto.

Então é isso…

Bug estupido.

Ontem eu estava muito contente porque depois de tres fim de semanas de trabalho arduo consegui enfim terminar todas as melhorias que eu tinha planejado para o meu prototipo da minha tese que estou fazendo em java.
Fiz varios testes, dados diferentes, tudo correndo bem, dai tive a brilhante ideia de ter no log as informacoes da thread, fiz um toString bem legal:

public String toString() {
if (thisToString == null) {
StringBuilder sb = new StringBuilder(this.hashCode());
sb.append("-");
sb.append(databank.toString());
thisToString = sb.toString();
}
return thisToString;
}

Testei umas vezes, achei que estava um pouco mais lento que o normal, mas nao dei bola, gerei o jar, e mandei para o servidor que uso de teste. Continuei achando que estava um mais lento que o normal, culpei o servidor e fui dormir tranquilo.

Hoje durante o dia fui algumas vezes ver como estava rodando e percebia que estava bem mais lento que o comum. Por exemplo, o processo todo ocorria em 90% dos casos em menos de 1 segundo e em mais de 50% em menos de 600milli segundos. Hoje dificilmente executava em menos de 3 segundos. Puta que pariu, tem algo de estranho ai.
Chegando hoje do google, sentei no computador e comecei a depurar, coloquei a culpa no esquema de fila de execucao que usa o ExecutorService que comecei a usar ontem, gastei uma hora nisso e nada… entao coloquei culpa no windows: “Essa merda fica fazendo IO a toa, o scheduler esta louco” e outras disculpas que se inventa.

Cheguei no linux, eclipse, netbeans, console… algo de estranho aconteceu, ao inves ficar lento, simplesmete dava o erro de falta de memoria. Puta que pariu de novo, os parametros estao errados… arrumei, ou nao, porque estavam certos, e voltei a executar, o erro nao passava.

Dai tive a brilhante ideia de prestar atencao na stack”trance” do OOM. StringBuffer? OutOfMemory ali? Este troco esta bugado, so pode… Atualizei o jdk, jvm, tudo… e continuava.

Entao tive a segunda ideia genial, depurar o codigo e ver porque diabos da OOM ali.
Voltando ao codigo que coloquei antes, a linha que dava erro:
StringBuilder sb = new StringBuilder(this.hashCode());

Puta que pariu de novo! Ele aloca um stringbuffer do tamanho do hash, por algum motivo desconhecido o valor do hash no jvm linux eh gigantesco, “1024180126” enquanto no windows eh menor, da OOM no Linux.
Subtitui a linha defeituosa por algo correto:
StringBuilder sb = new StringBuilder(Integer.toString(this.hashCode()));
e bingo, o que antes demorava 3 segundos, voltou aos 100milli!

Conclusao, ao inves de culpar codigos, SOs e etc… gaste 5 minutos e depure seu programa :-)

Antiguidades e novidades

Comecando pelas antiguidades,

o Augusto Radtke achou uma perola de aproximadamente 7 anos atras: Criando um Aplicativo Windows. Ele eh um artigo pequeno, de varzea, de computacao arte para criar um main loop para aplicacoes windows. Ele eh antigo mas ainda esta correto e util.

Ja como foi achado esse artigo, eu dei uma garimpada na pagina e achei outro artigo meu, de uns 6 anos atras: Estruturas de Dados – Listas Dinamicas Esse artigo eh de listas e colecoes arte, nao colecoes resultados, colecoes muleque, onde o malloc eh rei. Se queres aprender um pouquinho de C e listas dinamicas, acho que este artigo pode te ajudar.

E de novidade tem o um artigo

Numerical methods for inferring phylogenies que fiz junto com o Professor Nelson Borges para ser apresentado no ICCIAN ano passado e agora foi publicado nos anais. Outros artigos, de verdade, nao “como fazer uma lista dinamica :P”, podem ser vistos em www.pih.bio.br.

Apropos, estou tentando achar algo com espaco vetorial/vectorial space para search engines, mas queria achar algo novo, dos ultimos 2 anos… estou aberto a sugestoes.

Google pode ser superado pela grandiosa e funcional Web Semântica

Saiu no TimeOnLine que o criador da Web, disse que google pode ser superado.
Ele justifica isso dizendo que o google apenas faz uma análise dos dados e dos links, sem o uso de qualquer semântica para isso. Ele diz que com o uso da web semântica, serão trocadas informações e não apenas dados e algumas empresas e instituições já estão utilizando isso.

Agora pergunto: Quem já viu alguma coisa de web semântica funcionando e sendo útil? Tive a (in)felicidade de estudar isto ano passado e vi que é uma coisa estremamente bloat, camadas em cima de camadas, reinventam a roda, por exemplo, os “raciocinadores” poderiam utilizar linguagens como o prolog, mas “os estudiosos” da área preferem “propor e desenvolver” seus próprios, sendo que *nenhum* dos propostos está totalmente funcional!

Também me pergunto se todas as pessoas que colocarem um post no seu blog ou uma página na web terá que por uma cabeçalho cheio de informações para a web ter semântica? E a compatibilidade com os dados já existentes? Teremos que reescrever *tudo*? Estes estudiosos poderiam utilizar soluções mais práticas, como a análise de conteúdos e então criar e utilizar uma semântica, ja que no mundo real, não tem que ter a palavra “cachorro” num cachorro para sabermos que ele é um cachorro.

Ah, a reportagem pode ser lida em: http://technology.timesonline.co.uk/tol/news/tech_and_web/article3532832.ece

FindBugs

Estava eu observando o relatório de aceitação ou rejeição de um patch para o projeto Hadoop quando vi um dos itens, que diz:

” findbugs -1.  The patch appears to introduce 1 new Findbugs warnings. ”

Opa, eles testam se há um possível bug sendo adicionado.

Então fui atrás desta ferramenta e encontrei o FindBugs.

O FindBugs é uma ferramenta que faz o análise estática do bytecode  e possui um conjunto de regras ou padrões que descrevem possíveis bugs. A execução e bem simples, executa-se ele e é retornado uma lista de possíveis bugs. O mais legal que é possível coloca-lo para ser executado junto com o ant, por exemplo em daylies build, ou ele tem um plugin para o eclipse.

Na figura abaixo, eu executo o findbug numa classe do biojava que faz o alinhamento dinâmico. Na parte inferior, pode-se ver a lista de possíveis bugs encontradas (os caros de parametrizar parametros ele diz que é bug porque o fonte é do java 1.4, mas o projeto está configurado para java 1.5).

Findbugs no eclipse

Nesta figura, esta destacado um bug comum de comparação de pontos flutuantes. Outra coisa legal é que podes ter mais informações sobre o bug, para este tipo de bug, a descrição do possível bug é mostrado na figura abaixo:

captura_da_tela.png

Algumas vezes ele da falsos positivos ou seja, possíveis bugs, que  você sabe que esta ali, mas por algum motivo, por exemplo otimização, você fez desta maneira. Mas para estes casos, é possível colocar no filtro do FindBugs para ignorar este possível bug na classe.

Recomendo o FindBugs, além dele pegar bugs que você “nem tinha reparado”, ele é muito rápido de usar e se integra muito bem ao eclipse.

YSlow – Plugin para analisar páginas web e melhores práticas para melhorar a velocidade do seu site.

Depois do firebug, acho que um dos plugins mais massa para programadores web é o YSlow. O YSlow usa o firebug e tem uma série regras, para cada uma destas regras, ele analisa a página e da notas e sugestões de como melhorar. Nem preciso falar que é o para o firefox. (Ps: não testei no firefox 3)

Ah, na página do YSlow tem um link interessante para uma artigo sobre melhores práticas para melhorar a velocidade do seu site.

Uso de memória no Firefox 3

Para mim o principaç problema do Firefox 2 é o uso de memória. Não é algo monstruoso, mas aterrorisa, principalmente se voce fica dias com o computador ligado e não “abre e fecha” o firefox. Uma das maiores melhorias no FF 3 é justamente no melhor uso da memória. Num artigo publicado em http://blog.pavlov.net/2008/03/11/firefox-3-memory-usage/ são apresentadas e explicadas as principais melhorias.  Resumindo, foi diminuido a fragmentação de memória, melhoria do uso de cache e o que acho o mais importante, corrigido aproximadamente 400 bugs relacionados a vazamentos de memória. Vale a pena ler para ver como fizeram isso.

Código feio I

Uma coisa que gosto e preciso fazer é ler código fonte. Acho que tem o mesmo espírito de ler um livro, você agrega conhecimento e vê outras formas de escrever e de expor idéias e soluções. Algumas vezes me deparo com um código esquisito, por exemplo este trecho em C:

00045 // Iterate through every possible codeword
00046 codeword = 0;
00047 while (codeword < numEntries)
00048 {
00049 // Initialize list of query positions as empty
00050 initialLookup[codeword].queryPositions = NULL;
00051 initialLookup[codeword].numQueryPositions = 0;
00052 initialLookup[codeword].allocQueryPositions = 0;
00053
00054 codeword++;
00055 }

Este não é um código difícil de entender, mas é no mínimo estranho utilizar um while para designar este tipo de iteração. Um while normalmente é utilizado quando não conhece o limite, ou seja: “enquanto tal operação for verdadeira, faça”. Um exemplo é para ler um arquivo: “enquanto não for fim do arquivo, leia”.

Para casos onde sabe-se o começo, o intervalo e especialmente o fim, o for é a estrutura de laço correta. No exemplo dado, sabe-se o início, que é zero, o intervalo, é mais um e o fim que é menor do que o numEntries, então não ficaria mais legível desta forma:

00045 // Iterate through every possible codeword
00046 int codeword;
00047 for(codeword = 0; codeword < numEntries; codeword++) {
00048 // Initialize list of query positions as empty
00049 initialLookup[codeword].queryPositions = NULL;
00050 initialLookup[codeword].numQueryPositions = 0;
00051 initialLookup[codeword].allocQueryPositions = 0;
00052 }

Apenas lendo o a linha 47, sabe-se que ira iniciar em 0 e iterará entre todos os valores até que seja menor que numEntries. Então, quando for fazer uma iteração entre valores conhecidos, é o for e quando for executar uma ação e não sabe-se previamente quando ela será finalizada, utilize o while.

Memory Alignment na JVM

Estava pesquisando e me assustei com o memory alignment (alinhamento de memória) do java. Pelo que eu vi, a JVM alinha a memória em 8 bytes! Ou seja, não importa se tu criar um short, int ou long, qualquer um deles ocupará 8 bytes na memoria.

Parece pouco, mas pense num software que tenha 125000000 (cento e vinte e cinco milhões) de entradas em que o brilhante programador usou short pensando que ocuparia menos memória ou 4 bytes (o alinhamento padrão em i386 e como é o alinhamento em C), mas ocupando 8 bytes! De aproximadamente 500 megabytes (alinhando em 4bytes) ocupará 1 gigabyte! Ah sim, não preciso dizer que serão 125 milhões de instancias e não um objeto com 125 milhões de shorts.

As únicas justificativas para o alinhamento em 8bytes é que cada instância de Object ocupa 8bytes, então eles decidiram que será alinhado por Object ou então, por causa dos processadores de 64 bits, mas não sei o que impede de em processadores 32bits ter alinhamento em 4bytes. É.. java não é lento, concordo, mas que é bloat é…

Ah, recomendo a leitura deste texto, que é uma classe que calcula o tamanho ocupado na memória de uma classe considerando o alinhamento da memória.