Arquivo de julho, 2009

Meu novo emprego em São Paulo

Posted in Atividades profissionais on 27/07/2009 by Allan Taborda

Depois de meses procurando um emprego, enviando currículos e até participando de entrevistas, finalmente consegui um emprego como programador Java.

Logo no início desse mês, fui chamado para fazer umas provas a fim de averiguar se eu possuía o conhecimento teórico necessário para preencher a vaga. Fiz a prova em questão no dia 6.

Posteriormente, me chamaram para a segunda fase do processo de seleção, onde fiz uma entrevista de emprego e um teste prático. A entrevista e e este teste foram feitos no dia 10 de julho.

No dia 13, recebi um e-mail me convocando para ir no dia seguinte na empresa a fim de fazer a entrevista final de contratação. A essa altura, eu já estava com quase certeza que eu iria ser contratado. Em tal entrevista, me foram feitas algumas perguntas adicionais, me falaram como seria o cargo na empresa, as condições de trabalho e mais algumas outras coisas. Eu aceitei tais condições e fui informado que eu havia sido contratado para a vaga. Comecei a trabalhar no dia seguinte.

Nos três primeiros dias de trabalho, tive que ir e voltar de São Paulo, foi bastante corrido pelo fato de acordar de madrugada e voltar só de noite, pois o ônibus demora muito, principalmente o ônibus da volta.

Mas a partir dessa última semana, passei a ficar hospedado na casa da Tia Carmen, apesar dela morar um pouco longe do serviço (tenho que pegar ônibus e Metrô, inclusive com baldeação na estação Sé) e de não haver acesso à Internet na casa dela. Mas agora está sendo melhor do que subir e descer todo o dia, inclusive mais barato do que se eu tivesse contratado o ônibus fretado (que vai ficar mais caro do que já tá graças ao prefeito burro daquela cidade).

Nos fins de semana (ou melhor, ao término do expediente das sextas-feiras), eu retorno a Praia Grande para passar o fim de semana. Então, retorno a São Paulo na segunda-feira de manhã, já descansado.

Mas infelizmente, esta semana, acabei pegando uma gripe e passei este fim de semana meio mal, mas já estou recuperado para voltar ao trabalho. Por falar nisso, está havendo uma epidemia de gripe na capital paulista, pelo que vi no telejornal (também, né, com um monte de gente tossindo e espirrando nas estações do Metrô sem pôr a mão na boca e com todo aquele aperto principalmente na estação Sé, ainda mais com este clima frio, não tem como não pegar gripe).

Vou encerrando este post por aqui, ainda mais que eu já escrevi o que eu tinha que escrever e eu já deveria estar dormindo para amanhã eu acordar cedo para ir a São Paulo trabalhar. Até o próximo post (sabe-se lá quando será postado).

Observação: a Tia Carmen em questão é a mesma na qual eu sonhei no dia 30 de Março de 2004, sonho este postado no meu outro blog (o que eu escrevo meus sonhos) no dia 10 de Abril do mesmo ano, ainda no antigo endereço no Blig (ainda antes do blog ser transferido para o UOL Blog), na época que meus relatos de sonhos eram pequenos. Quem quiser conferir o sonho em questão, pode acessá-lo em http://sonhosdoallan.blig.ig.com.br/2004/04/ola-internautas-hoje-eu-irei.html

Robowebert Player, tocador de áudio em Java

Posted in Atividades profissionais, Lazer, Música on 03/07/2009 by Allan Taborda

Tenho desenvolvido nesses últimos meses (desde Fevereiro, para ser mais exato) um player de áudio escrito em Java no qual eu batizei de Robowebert Player. Ele reproduz áudio nos formatos MP3, OGG, Speex, FLAC e Monkey’s Audio, além dos formatos padrão do Java (AIFF, WAV e alguns outros). Suporta a leitura e salvamento de quatro formatos de playlists: M3U, PLS, XSPF e um formato próprio que estou desenvolvendo, chamado de RWPF. Além disso, possui um analisador de espectro, que é aquele monte de barrinhas que ficam subindo e descendo enquanto a música toca, além de controle de volume e de balanço, repetição de músicas, visualização dos metadados das músicas e uma barra de progresso meio capenga.

Tudo começou quando eu pesquisei pela Internet como fazer para tocar sons com Java. Encontrei um pequeno tutorial de como tocar arquivos MP3 usando a biblioteca JLayer, disponibilizada no site JavaZOOM.net e desenvolvi um minúsculo player que tocava apenas MP3 e que em sua interface possuía apenas três botões, um para selecionar a música, um para tocar a música e o último para parar de tocar a música. O player e mais a tela gráfica tinham cerca de umas cem linhas de código (ou nem isso). Com certeza, deve ser o menor player de MP3 da história.

Aí eu tive a ideia de desenvolver um player maior, que tocasse outros formatos de áudio além do MP3. Pensei em criar um subsistema para cada formato que o player fosse suportar. Entretanto, percebi o quanto isso iria ser difícil, pois a API da biblioteca JOrbis (biblioteca de suporte ao formato OGG) é completamente diferente da API do JLayer, além de mais complexa e de mais baixo nível.

Então, acessando o site do JavaZOOM acima citado, vi que os próprios desenvolvedores do JLayer desenvolveram um player em Java chamado JLGui, que suportava MP3, OGG e outros formatos de áudio. Era basicamente um clone do WinAmp e suportava os skins feitos para este. Resolvi testá-lo e não gostei muito de sua confusa interface, que além de confusa, a metade desta insistia em ficar na frente de todas as outras janelas. Para complicar, o player em si tinha uns bugs idiotas.

O JLGui é licenciado sob a LGPL, uma licença livre que me permite modificar o software de acordo com minhas necessidades. Entretanto, o código-fonte desse player é extremamente confuso, macarrônico e de extrema dificuldade de manutenção, além de ter sua camada de apresentação (o código responsável pela tela gráfica) colada na camada de negócios (o código responsável pela regra de negócios). Ou pior: todas as partes do player são coladas em várias outras partes.

Só para se ter uma ideia, se eu quisesse adicionar o suporte ao formato de playlist XSPF a este player, eu teria que fazer toda uma reengenharia no programa inteiro, praticamente.

A única parte que não era colada a nenhuma outra era o motor de execução de áudio, que foi concebido para ser aproveitado em outros softwares que desejassem tocar áudio com uma API de alto nível. Tal motor de execução era mantido em uma biblioteca separada chamada BasicPlayer.

O BasicPlayer utiliza uma API comum para todos os formatos de áudio baseada na API Java Sound, que usa Service Providers (bibliotecas especiais) que proveem o suporte aos formatos de áudio sem alterar o código-fonte que reproduz a música. Nas minhas pesquisas iniciais, eu já havia visto algo sobre a API Java Sound, entretanto, vi que ela era bastante confusa e de baixo nível. Já o BasicPlayer era de alto nível.

O que resolvi fazer? Criar um player que utilizasse o BasicPlayer como motor de execução de áudio. Aproveitei a interface simplória do minúsculo player que eu havia feito e a adaptei no BasicPlayer. A partir daí, fui implementando outras funcionalidades básicas, como controle de volume e de balanço e o botão de pausar e continuar a reprodução do áudio.

Aí o player foi evoluindo: passou a trabalhar com uma playlist na memória e a salvar e carregar um formato próprio de playlists baseado em XML, ganhou também botões de voltar à música anterior, voltar ao começo da música atual e ir para a próxima música.

Resolvi implementar o suporte à visualização dos metadados dos arquivos de áudio. O primeiro lugar onde pesquisei como fazer isso foi no macarrônico código do JLGui. Essa parte do código do JLGui não estava tão macarrônica e ligada às demais partes do player como as outras (só um pouco), então eu resolvi pegar este código e adaptá-lo ao meu próprio player, fazendo alterações diversas a fim de retirar completamente a dependência das outras partes do JLGui.

Já com o suporte aos metadados das músicas e mesmo com a interface estando muito tosca, disponibilizei o player (ainda sem nome naquela época) para alguns membros da comunidade Linux versus Windows do Orkut para ver o que eles achavam. Eles emitiram suas opiniões e o que eles gostariam de ver no player.

A partir daí, continuei a adicionar outros recursos ao player e a mudar um pouco sua interface (que ainda está tosca, mas menos do que antes). O último recurso adicionado até o momento foi o analizador de espectro, provido pela biblioteca KJ DSS.

O código-fonte do meu player, ao contrário do código do JLGui, é bastante claro e simples. O suporte à playlist na memória, por exemplo, é implementado por uma classe que gerencia um simples ArrayList contendo os objetos File, que provém acesso aos arquivos de áudio no HD. Já o JLGui implementa a mesma coisa com algumas classes, uma delas responsável por cada música na playlist (e que contém parte do código para manipular playlists no formato M3U – e manipular mal), outra cheia de métodos e mais uma interface gigantesca, além de mais algum código macarrônico colado na interface gráfica e em mais não sei onde.

Pelo fato da camada de apresentação ser completamente desacoplada da camada de negócios, será possível escrever telas gráficas alternativas ao visual atual do meu player. Inclusive, estou planejando para o futuro uma interface totalmente diferente e inovadora além da que já existe, além de uma interface alternativa usando a SwingWT, implementação alternativa (e mais leve) da API Swing baseada na biblioteca SWT.

No link abaixo, uma screenshot de como está o visual do meu player atualmente:

http://img30.imageshack.us/img30/4513/rwplayer.png

Ainda falta a grande maioria dos recursos que desejo implementar no meu player, como biblioteca de mídia, playlists dinâmicas, execução aleatória de músicas contidas numa playlist, edição de metadados das músicas, internacionalização e uma penca de outras coisas. O player vai ficar o bicho.

Entretanto, irei disponibilizar uma segunda versão pública com apenas alguns desses recursos, quando eu achar que ele está bom o suficiente para ser usado pelo público geral, ainda que incompleto. Irei disponibilizá-lo no SourceForge.net, onde já mantenho hospedado outro software que desenvolvo, o CapeTrivia.

Meu Player será licenciado sob a GPL 3, ou melhor, o código que escrevi está sob esta licença. O subsistema de leitura de metadados está sob a LGPL 2.0 pois não posso alterar a licença dessa parte, já que não fui eu que escrevi. E as demais bibliotecas estão nas suas respectivas licenças, todas compatíveis com a GPL 3.

Por falar em licenças, eu acabei tendo umas dúvidas com relação à compatibilidade destas, ainda mais por causa da biblioteca que provê o suporte ao formato de playlist XSPF (JSpiff) estar na licença Apache 2.0 e haver código LGPL 2.0 no player. Resolvi mandar um e-mail para o Richard Stallman, presidente da Free Software Foundation (ou melhor, dois e-mails, o outro foi depois da resposta que ele me mandou). A troca de e-mails com o Stallman merece um post à parte (no próximo deste blog, quem sabe), mas resumidamente, ele respondeu que as licenças são todas compatíveis entre si.

Escolhi o nome Robowebert Player a fim de homenagear um antigo personagem das minhas histórias infantis de quando eu era criança e que eu mesmo inventei, o Robowebert. Este era um robô gigantesco ao estilo do Megazord dos Power Rangers que possuía vários componentes integrados e recursos diversos e que tinha a finalidade de lutar contra inimigos gigantescos que ameaçavam a cidade de Pret-a. O Robowebert era controlado pela Darker Webert, uma mulher que combatia o crime naquela cidade fictícia e que vivia cheia da grana. Ela também merece um post à parte, pois teve uma importância histórica na minha infância.

Não há uma previsão de quando a próxima versão pública (e desta vez disponível ao público geral e não só a alguns membros da Linux versus Windows) será disponibilizada, mas espero ver o Robowebert Player na próxima versão estável do Debian, codinome Squeeze, a ser lançada provavelmente no ano que vem.

Atualização: escrevi um novo post sobre o Robowebert Player, que pode ser visto em: https://irmaodamara.wordpress.com/2010/07/12/mais-sobre-o-robowebert-player/