Archive for the Lazer Category

Minha técnica para memorizar posições no Classic Simon (jogo de Genius para Android)

Posted in Lazer, Tutoriais on 02/06/2012 by Allan Taborda

Há um pouco mais de dois meses, instalei no meu celular com Android um jogo chamado Classic Simon, disponível no Google Play em https://play.google.com/store/apps/details?id=com.neilneil.android.games.simonclassic&hl=pt_BR ou diretamente pelo celular, pesquisando por “Classic Simon” na loja de aplicativos (o aplicativo é desenvolvido pela Mobikats Ltd). É basicamente um jogo de Genius (ver página da Wikipédia), onde o usuário ganha pontos ao memorizar um determinado número de posições representadas por botões coloridos.

No Classic Simon, além do modo tradicional com quatro botões (Classic), há um modo de nove botões (Super), além de diferentes modos de jogo (quatro velocidades, Magic Memory mode, Chaos mode e dois jogadores) tanto no modo Classic quanto no modo Super. Para quem tem um celular com Android, recomendo fortemente a instalação desse jogo, que é gratuito. Para iPhone, pelo menos até o momento, não há uma versão dele, mas como a Mobikats desenvolve aplicativos também para o iPhone, é possível que exista uma versão dele para o iPhone no futuro (enquanto essa versão não sai, para quem possui iPhone, creio que exista um programa similar na app store da Apple).

Há algum tempo atrás, consegui o meu melhor recorde até o momento, com 95 posições memorizadas, obtendo o segundo lugar entre os recordes globais, que contém os resultados de todos os milhares de jogadores do Classic Simon (o primeiro lugar consta com 119 posições memorizadas e o terceiro com 82). A partida em questão demorou mais de uma hora e meia. É provável que, no futuro, eu melhore ainda mais esse recorde, talvez até alcançando o primeiro lugar no ranking global do aplicativo.

No post de hoje, além de apresentar o Classic Simon, irei explicar a técnica que eu uso para memorizar o maior número de posições possível. A técnica é bem simples, mas muito eficiente.

A primeira e mais importante parte da técnica é a de agrupar as posições em conjuntos de posições, e memorizar esses conjuntos de posições ao invés das posições propriamente ditas. É muito mais fácil memorizar a ordem exata de 6 grupos de 6 posições do que a ordem exata de 36 posições, por exemplo.

A segunda parte da técnica é a de como agrupar as posições em grupos. A cada turno, uma nova posição gerada aleatoriamente pelo jogo é adicionada à sequencia e, a medida que novas posições são adicionadas, novos grupos devem ser formados. Cada grupo deve ter entre três e nove posições (ou até mais de nove posições, caso consiga memorizar grupos maiores).

Para fazer o agrupamento das posições, basta que associe uma sequencia curta a algo de fácil memorização para você. Por exemplo, a sequencia amarelo-azul-verde-vermelho eu chamo de “volta completa”, pois é como se um ponteiro de um relógio desse a volta no mesmo, sendo o painel de quatro botões o relógio. Já a sequencia vermelho-verde-azul-amarelo eu chamo de “volta completa invertida”, pois é a sequencia inversa da “volta completa”. A sequencia amarelo-azul-vermelho-verde eu chamo de “escrita linear”, pois a mesma ocorre da esquerda para a direita, pulando a linha de cima para baixo. A sequencia amarelo-verde–azul-vermelho eu chamo de “X com ligação à direita”, pois é como se traçasse uma linha que resultasse em um X, mas com as duas hastes da direita ligadas. A sequencia amarelo-vermelho-vermelho eu chamo de “ponto de exclamação à esquerda” pelo fato dos botões amarelo e vermelho ficarem à esquerda (por que eu chamo de ponto de exclamação eu não sei, mas eu associo uma posição em cima e duas embaixo como sendo um ponto de exclamação). Há muitas outras sequencias que eu memorizei além dessas.

Além das sequencias memorizadas, existem também as sequencias derivadas das mesmas, que nada mais seriam do que sequencias que diferem de uma já previamente memorizada por apenas uma posição a mais, ou pela repetição da primeira ou da última posição. Uma sequencia derivada também pode ser uma sequencia memorizada repetida duas ou mais vezes, contando como uma única sequencia, essa nova sequencia é derivada da que se repetiu.

Enquanto as últimas posições sorteadas não formam um grupo completo (por exemplo, se houver apenas uma ou duas posições após a formação do último grupo), as mesmas devem ser memorizadas individualmente, e sempre que uma nova posição é sorteada, você deve dizer em pensamento, em tom “vibrante” (como se falasse em voz alta meio que gritando, só que em pensamento) a cor da posição em questão para que a mesma não seja esquecida instantes depois, enquanto você se preocupa em memorizar os grupos anteriores.

Assim que houver três posições sorteadas que não foram agrupadas, você deve associar um grupo às mesmas a fim de não ficar muitas posições a serem memorizadas individualmente. Este grupo poderá crescer, se você ver que consegue memorizar um grupo maior, adicionando a nova posição a este grupo recém-formado.

Uma dica importante é prestar atenção nas repetições feitas pelo jogo a fim de mostrar as posições anteriores à nova cor sorteada para a próxima posição, tais repetições ajudam o jogador a memorizar as posições (ou os grupos de posições) pelo fato das mesmas se repetirem a cada novo sorteio de cor para cada nova posição. Essas repetições não ocorrem no modo Magic Memory, que apresenta apenas a cor da posição seguinte, sem exibir as repetições.

Basicamente, a minha técnica é essa. Espero que eu tenha sido bem claro neste post. Em caso de dúvidas quanto a essa minha técnica, escrevam as mesmas nos comentários.

Comendo no Ragazzo

Posted in Lazer on 20/04/2012 by Allan Taborda

Apesar de eu ter escolhido este tema para o post de hoje, este post não é patrocinado pelo Ragazzo, antes que alguém fale alguma coisa.

Ultimamente, geralmente à noite, mas às vezes na hora do almoço também, tenho ido ao Ragazzo a fim de matar a minha fome. Geralmente, eu peço sempre as mesmas coisas (eu costumo pedir nhoque ao sugo, ragazzones e/ou torta holandesa), mas às vezes eu vario os meus pedidos, pedindo outro prato de massa ou milk-shake ou outra coisa que eu não tenha comido.

Para quem não conhece, o Ragazzo é uma rede de fast-food de comida italiana que possui restaurantes em diversos lugares da capital e em outras cidades. Pertence ao mesmo grupo de empresas do Habib’s e seu slogan é “O fast food italiano do Habib’s”. Eu costumo ir no Ragazzo situado na Rua Vergueiro, 6487, no cruzamento com a Avenida Gentil de Moura, no bairro do Ipiranga. Às vezes, na hora do almoço, de segunda a sexta, vou no Ragazzo situado próximo ao metrô Saúde, na Avenida Jabaquara, 1070, mas vou poucas vezes devido a eu preferir almoçar em outro restaurante que tem perto do meu local de trabalho.

Uma das coisas que eu mais peço no Ragazzo são os ragazzones, que são salgados recheados que custam atualmente R$0,98 (sabores escarola, calabresa e portuguesa) ou R$1,20 (sabores marguerita e frango). De vez em quando, lançam promoções que permitem a compra de uma certa quantidade de ragazzones por um preço fixo mais barato do que se comprar os mesmos sem estar na promoção (atualmente, há a promoção de comprar 8 ragazzones de qualquer sabor por R$4,95). O meu sabor preferido é o de escarola, mas costumo pedir também os de portuguesa (que combinam com ketchup, fornecido sem custo caso o freguês peça) e os de frango (que combinam com pimenta, também fornecido sem custo caso o freguês peça). Os de calabresa, que combinam com mostarda, ultimamente estou comendo com menos frequência pelo fato desse sabor não ser muito saudável, e o de marguerita eu não gostei muito, além de ser mais caro.

Além dos ragazzones, peço também o nhoque ao sugo, que atualmente está em promoção, custando R$3,95 (fora da promoção sai por R$7,90), mas mesmo fora da promoção eu peço o nhoque ao sugo. Ele, na minha opinião e quantidade de fome à noite, é o prato perfeito para se comer à noite, após o expediente. Às vezes, eu peço, além do nhoque ao sugo, dois ragazzones de escarola, caso eu ainda esteja com fome.

Até pouco tempo atrás, havia no cardápio o tortelli de bacalhau, que custava R$9,50, mas infelizmente o mesmo foi removido do cardápio, provavelmente por ter pouca demanda, bem como a opção de molho de bacalhau à vicentina. Espero que o tortelli de bacalhau volte a constar no cardápio um dia, eu costumava pedir o mesmo no almoço, aos fins de semana, quando eu passo os mesmos em São Paulo.

Uma das minhas sobremesas preferidas é a torta holandesa, que atualmente custa R$5,90. Entretanto, nem sempre eu peço sobremesa, já que muitas vezes eu já me dou por satisfeito antes de pedir a mesma. De vez em quando, peço o milk-shake de chocolate, que sai por R$5,80 ou a torta de limão, que atualmente está em promoção, por R$2,95, mas como essa torta é muito doce, não costumo pedir torta de limão.

Quando o freguês pede a conta, dependendo de qual restaurante do Ragazzo você estiver, ou o garçom vai até a mesa onde o freguês está e lhe apresenta a conta (é o caso do situado na Rua Vergueiro), ou o garçom informa o mesmo para se dirigir ao caixa e informar o número da mesa (é o caso do situado na Avenida Jabaquara), em ambos os casos, constará na conta uma infâmia taxa de serviço, no valor de 10% do valor total do pedido arredondado para baixo, que poderá ser retirada a pedido do freguês, pois a mesma é opcional (eu sempre peço para retirar).

De vez em quando, os garçons erram nos pedidos, trazendo um sabor de ragazzone diferente do requisitado, trazendo uma massa diferente ou com molho diferente da requisitada, etc (esse é o motivo de eu não pagar a taxa de serviço, além de que, na minha opinião, a gorjeta deveria ser paga voluntariamente, num valor estipulado pelo próprio freguês). Uma vez, ocorreu de chegarem pedidos de outras mesas, um monte de pedidos, e alguns deles saíram na minha conta, aí eu tive que pedir para tirar os itens que eu não havia pedido e acabou dando um rolo, mas foi só uma vez que aconteceu isso (deve ter dado pau no sistema deles, e se eu tivesse feito o sistema deles, isso nunca teria ocorrido). Fora esses problemas, o atendimento do Ragazzo costuma ser bom (é comum os supervisores e até o gerente atender os pedidos) e os problemas que ocorrem não inviabilizam de eu ir lá comer.

O uniforme dos funcionários do Ragazzo, bem como ocorre com os do Habib’s, é horrível, eles deveriam mudar aquele uniforme tosco. Ele é todo preto, semelhante ao dos funcionários do Habib’s, que é vermelho e pior ainda. Espero que um dia mudem os uniformes dos garçons tanto do Habib’s quanto do Ragazzo.

Um colega meu do serviço, que comeu uma vez no Ragazzo da Avenida Jabaquara, já me reportou uma vez que achou um pedaço de plástico no nhoque e por isso ele não vai mais lá e nem outros colegas da empresa onde trabalho. Apesar disso, das inúmeras vezes que comi no Ragazzo, nunca encontrei algo estranho na comida servida lá, no máximo um pequeno pedaço de fettucini dentro do nhoque, mas isso é algo perfeitamente perdoável.

Além do freguês poder comer as opções do cardápio sentado a uma das mesas localizadas no interior do restaurante, é possível fazer o pedido para viagem, diretamente no caixa. Neste caso, não consta a taxa de serviço na conta e as opções do cardápio são mais limitadas, não tendo as massas como opção (creio eu), por exemplo. O pedido vem numa caixinha de papelão.

O post sobre o Ragazzo fica por aqui. Até o próximo post e espero que o tortelli de bacalhau volte a constar no cardápio, ainda que por um preço maior do que antes.

Software calculador de números primos

Posted in Idiotices, Lazer on 28/06/2011 by Allan Taborda

Numa quarta-feira, no intervalo do primeiro jogo da final da Taça Libertadores da América (eu assisti aos dois jogos, mesmo eu não torcendo para o Santos), desenvolvi um esboço de um software calculador de números primos em Java e, dias depois, dei uma aprimorada rápida no programa, melhorando seu algoritmo. Basicamente, ele verifica indefinidamente os números (apenas os ímpares, já que os pares, com exceção do 2, não são primos) a fim de saber se eles são primos e os salva numa coleção persistível. Ele apenas calcula, não permite visualizar os números primos encontrados (essa parte eu irei fazer posteriormente). O que farei com os primos encontrados eu ainda não sei, talvez eu faça cálculos para descobrir quais pares de números primos são gêmeos (os que a diferença entre eles é 2) ou algum gráfico bidimensional (com eixo X e Y), ou outra ideia qualquer que irei ter no futuro.

Esse programa é mais uma nerdice que eu fiz no meu tempo livre.

O código-fonte do programa (que é o mais rápido que eu já fiz até hoje, tirando uma calculadora furreca de IMC que fiz em 2005) pode ser visto em http://pastebin.com/QYVCskbm e a licença do código é a GPLv3.

Mais sobre o Robowebert Player

Posted in Atividades profissionais, Lazer, Música on 12/07/2010 by Allan Taborda

Nesses meses nos quais fiquei sem postar no blog, eu não tive vontade e inspiração para escrever algo interessante aqui, então eu acabei não postando nada nesse tempo. Cheguei a iniciar um post acerca dos meus gostos musicais, mas não acabei concluindo-o, apesar dele já estar bem extenso.

Há um ano atrás, escrevi um post sobre o tocador de áudio em Java que eu estava desenvolvendo em meu tempo livre, o Robowebert Player. Eu ainda desenvolvo o player no meu tempo livre, e ele evoluiu bastante desde aquele post até agora, ainda mais que ele é o meu player principal para ouvir música.

Como eu havia adiantado no último post, ele já possui suporte ao preenchimento automático da playlist. Este é, na minha opinião, o recurso mais importante implementado até aqui, de grande importância nas vezes que eu escuto música, pois gosto de escutar músicas variadas, mas não gosto de ter que ficar populando a playlist com músicas manualmente ou com playlists pré-definidas. Este preenchimento automático consiste em sortear uma música contida em uma das pastas previamente cadastradas em um arquivo de configuração (que é editado manualmente, mas posteriormente eu irei implementar o suporte ao acesso ao banco de dados e então a lista de pastas passará a estar no banco). A cada vez que uma música termina, esta é removida da playlist e, caso a playlist tenha menos do que um determinado número de músicas (definido nas configurações do player), o randomizador (como é chamado o sistema que sorteia as músicas) sorteia uma ou mais músicas, até a playlist atingir o número estipulado de músicas. Na maioria das vezes, ao acabar uma música, esta música sai e outra é adicionada ao final da playlist.

Também adiantei no último post que o player passou a permitir configurações personalizadas. Algumas dessas configurações podem ser alteradas pela própria interface do player, clicando no checkbox correspondente, por exemplo. Outras só podem, pelo menos até o momento, serem alteradas editando manualmente o arquivo de configuração. Para gerenciar essas configurações, de início eu usei a classe Properties, do pacote java.util, mas depois fiz a minha própria implementação da classe que guarda as propriedades, com recursos extras, como o de salvar as propriedades no disco assim que uma propriedade é alterada e métodos próprios para salvar e recuperar valores numéricos e booleanos, além de manter as propriedades em ordem alfabética e usar a codifcação UTF-8 ao salvar o arquivo. Essa classe que gerencia as propriedades poderá ser usada em outros programas que por ventura eu possa desenvolver.

Por falar nas configurações, recentemente eu passei a separar as configurações referentes ao funcionamento do player das configurações referentes à interface gráfica, em arquivos diferentes.

Na interface, os botões, com exceção dos que servem para subir e descer uma música na playlist, foram todos para a parte de baixo da tela, num total de dez botões. O botão de tocar agora também é o de pausar e continuar e o botão de adicionar também adiciona playlists salvas, além das músicas. Há um botão também para ativar e desativar o randomizador de músicas. O analizador de espectro ganhou mais espaço com a saída dos botões da parte superior esquerda da tela. Além disso, o tamanho da tela foi ajustado para ficar do tamanho adequado para monitores maiores (se bem que estou pensando em alterar isso novamente, fazendo o tamanho da tela se adequar melhor ao tamanho do monitor) e a tabela que mostra a playlist na memória foi ligeiramente modificada, tendo sua última coluna diminuído de tamanho e centralizada.

Foram feitas modificações no suporte aos metadados das músicas (informações de artista, nome da música, álbum, ano, etc). Agora foi adicionada a biblioteca JAudioTagger, que é usada na leitura dos metadados dos arquivos de áudio no formato FLAC, que antes não havia suporte à leitura dos metadados. Na verdade, o JAudioTagger é usado para ler os metadados de qualquer arquivo de áudio, com exceção dos áudios em MP3, OGG e Monkey’s Audio (os dois primeiros porque o código antigo, baseado em um pedaço do JLGui, que é outro player de áudioem Java (ver o post publicado há um ano atrás para mais detalhes), possui uma performance melhor na leitura das informações, e o último pelo fato do JAudioTagger não possuir até o momento o suporte a este formato de áudio).

Houve também modificações internas no player, como a inclusão de um pool de threads (usado em todo o player sempre que uma thread é criada, com exceção do motor de execução de áudio, que gerencia a thread princial manualmente), a criação de uma classe com métodos estáticos contendo as rotinas mais usadas e de uma interface contendo valores constantes (e as classes que vão usar esses valores implementam a interface), além de outras alterações internas no código.

Outras coisas que foram implementadas: o suporte ao formato de playlist conhecido como SMIL, usado no Windows Media Player, a geração de logs com os erros ocorridos internamente, a possibilidade do “Look and Feel” do player ser alterado (só há duas opções, por enquanto), dois novos painéis modais para a escolha das músicas manualmente (que podem ser escolhidos pelas configurações do player), suporte ao salvamento do estado do player (ele pode ser fechado e reaberto posteriormente, sem que o conteúdo da playlist e o estado interno do randomizador sejam perdidos), o início da implementação de uma interface em modo texto para o tocador de áudio, uso do KJDSS 1.3 (última versão da biblioteca do analisador de espectro até o momento, com a possibilidade de usar o analizador de espectro antigo aterando uma configuração), modificações nessa biblioteca, dentre outras coisas implementadas.

Ainda faltam muitos recursos dos que eu gostaria de adicionar a este player, como cronômetro, a possibilidade de se voltar ou avançar para um ponto qualquer no meio da música e a alteração dos metadados das músicas. Pretendo também traduzir a interface do player para outros idiomas, usando uma biblioteca de gerenciamento de traduções também escrita por mim e que ainda não está pronta.

Estou pensando em, ainda esse ano, disponibilizar o código do player no Sourceforge.net, ainda não o fiz por falta de tempo, ainda mais que, para isso, terei que elaborar um texto em inglês apresentando o software. Mas, para aqueles que pedirem, eu posso estar enviando o código por e-mail.

Por hoje é só, até a próxima vez.

Primeiro post de 2010!

Posted in Lazer on 25/01/2010 by Allan Taborda

2010 é mais um ano que se inicia, e já inicia acumulando acontecimentos para a Retrospectiva 2010, da Rede Globo, a ser exibida daqui a 11 meses aproximadamente. Nem acabou o mês e já teve deslizamento de terra em Angra dos Reis, alagamentos diversos em São Paulo, terremoto no Haiti, avião etíope caindo no Mar Mediterrâneo, jogador paraguaio levando tiro na cabeça, emissoras venezuelanas de TV a cabo sendo fechadas e outras merdas acontecendo. E, pelo jeito, mais merdas irão acontecer ao longo do ano. Do jeito que anda a situação, a Retrospectiva 2010 terá maior tempo de duração do que a Retrospectiva 2009, ou terão que diminuir os intervalos comerciais, ou ainda, resumir bem resumido os acontecimentos do ano.

Minhas férias se encerraram no último dia 11, encerrando o período de três semanas de folga de Natal e Ano Novo. Com isso, voltei a passar a semana em São Paulo e retornar aos fins de semana a Praia Grande. Se bem que eu estou pretendendo, algumas vezes, passar duas semanas consecutivas em São Paulo a fim de diminuir os custos de viagem entre uma cidade e outra e também o cansaço gerado por estas viagens.

Meu computador pessoal que eu usava antes de comprar o notebook irá completar 6 anos no próximo dia 12 de Fevereiro. Mas, apesar de fazer aniversário, meu PC não tem muito o que comemorar, pois atualmente está com defeito, provavelmente na fonte. Amanhã, ele será mandado para o conserto.

Meu PC atualmente não está sendo muito utilizado, uma vez que eu passo atualmente a semana inteira em São Paulo e só retorno nos fins de semana e então eu o ligo. Pode ser que isso tenha agravado o problema do PC, mas eu não acredito muito nisso, acho que, mesmo se eu o usasse mais vezes, ainda assim ele iria pifar. Ele já tá bem velho. Mas ainda assim eu espero que ele complete 7 anos, ainda que sendo pouco utilizado.

Como meu PC não está funcionando, tive que trazer meu notebook de São Paulo e estou escrevendo através dele neste blog.

Em São Paulo, tenho usado meu notebook durante meu tempo livre, apesar de, por enquanto, eu não ter acesso à Internet (e nem sei quando irei ter, pois ainda não sei quando irei contratar um plano de Internet móvel, isso se eu contratar um, ainda irei pensar bastante acerca de ter ou não Internet móvel, e em caso de decidir por ter, qual provedor contratar). Tenho escutado música através do meu player em Java que eu desenvolvo, o Robowebert Player (já falei sobre ele neste blog), no qual venho tembém melhorando-o. Agora ele já possui suporte a algumas configurações e ao preenchimento automático de playlist, sorteando aleatoriamente músicas contidas nas pastas informadas em um arquivo de configuração. Este recurso, inclusive, é um dos mais importantes implementados até agora, pois me permite ouvir música pelo tempo que eu quiser sem me dar trabalho de adicionar mísicas à playlist do player ou carregar uma playlist já existente, sem contar que não fico preso a uma lista de reprodução fixa e posso ouvir músicas que faz tempo que eu não ouço e/ou ficaram esquecidas nas pastas de músicas.

Além de escutar música e de desenvolver meu player, dentre outras coisas, também tenho jogado alguns jogos que vem no Windows 7 (apesar de que eu prefiro o Debian GNU/Linux, no qual foi instalado nas férias) e formatado uns textos que eu mantenho nos meus arquivos, inclusive as antigas histórias do Superfred (as primeiras delas escritas em 2002, no antigo computador com 32 MB de memória RAM, já falecido e que não completou 6 anos de idade, mas chegou aos 5 anos) e o arquivo contendo o histórico de todos os sonhos postados no blog dos Sonhos do Allan, tanto os dos antigos endereços do blog até o endereço atual do blog, no WordPress (151 páginas até o momento, incluindo o último sonho postado). Aliás, estou pensando em postar aqui a história desse meu blog onde eu posto meus sonhos.

Por falar nesse meu blog dos sonhos, na última sexta-feira, eu falei acerca dele para o pessoal do serviço e ele fez um relativo sucesso por lá. Inclusive, foi postado no Twitter de um colega meu, o que fez o número de acessos aumentar consideravelmente naquele dia. Este blog onde eu escrevo também foi falado no meu ambiente de trabalho e também foi Twittado (acredito eu), mas aparentemente, fez menos sucesso do que o blog dos Sonhos do Allan.

Estou pensando em usar meu tempo livre em São Paulo para escrever uns textos, inclusive posts previamente preparados para serem postados nos meus dois blogs (este e o dos sonhos) e novas histórias do Superfred, ou ainda continuar uma história do Superfred que será maior do que as outras e que é inapropriada para menores de 18 anos, uma história um tanto quanto pesada, com muita violência, sexo e palavrões à vontade. Não sei se eu já comentei acerca dessa história nesse meu blog, se não comentei, irei comentar futuramente ou talvez fazer um post completo sobre essa história adulta. Ou talvez eu continue uma outra história sobre viagem no tempo que já faz uns anos que eu comecei a escrever (e não irei terminar tão cedo, visto que ela será comprida).

Hoje, o São Paulo ganhou a Copa São Paulo de Futebol Junior. Eu, como torcedor do Tricolor Paulista, estou feliz com esse novo título conquistado, apesar de eu não ter visto o jogo e de eu não ligar muito para futebol ultimamente, ainda mais agora que eu moro na capital e no meu quarto não tem TV para eu assistir (e as programações atuais das emissoras de TV não me incentivam muito a eu ter uma TV).

Hoje, a Mara me ligou. Estava com saudades de mim e aproveitou que hoje era feriado em São Paulo (e muito provavelmente eu estava de folga, aqui em Praia Grande) para me ligar. A gente não se falou muito, mas matamos a saudade um do outro, nem que seja só da voz. Depois, ela disse que estava on-line no MSN e eu fiquei deu uma entrada no MSN para continuar a conversa com ela, mas ela constava como off-line. Talvez ela tenha trocado de MSN. Fiquei meio frustrado, mas depois passou.

Por hoje é só. Até daqui a duas semanas, quando muito provavelmente, eu estarei postando outra vez, com um post previamente preparado no meu tempo livre.

Fim de ano chegando…

Posted in Idiotices, Lazer, Música on 14/12/2009 by Allan Taborda

Ultimamente, não tenho tido muito tempo para escrever novos posts (e nem arranjar assunto para novos posts). Na verdade, até há tempo, mas venho fazendo outras coisas no meu tempo livre (principalmente por eu não ter Internet em São Paulo), como ler uns livros de bolso.

Recentemente, li uns de velho oeste e um do Perry Rhodan. (o número 4 de uma série de mais de 600 livros, mas é o único que eu tenho, me pareceu uma parte de uma história maior) O último que eu li é basicamente uma história que foi feita mais para dar a entender que os índios apaches são muito maus, matando mulheres, crianças e outros só para pegar a comida e pelo prazer de matar, foi um dos piores que eu já li até hoje. O personagem principal da história, um tal de Sablito, dá o nome ao livreco. Resumo da história: os índios estavam andando no deserto e alguns são mortos pelos mexicanos (e a história também dá a entender que os mexicanos também não valem nada), daí eles vingam a morte dos companheiros deles invadindo uma casa, comendo toda a comida e matando a mulher e as crianças, inclusive cortando a cabeça da mulher e jogando na frente dos filhos (e estes foram despidos e escalpelados). Daí, o Sablito, ao saber que os apaches acabaram com a família dele pela segunda vez (os coisos já haviam matado toda a família dele quando ele era criança), foi lá e matou os apaches. Fim.

Como eu adiantei no primeiro parágrafo do post, agora eu estou morando em São Paulo. Quer dizer, eu estou ficando em São Paulo de segunda a sexta-feira, num quarto alugado perto do serviço, e volto no fim de semana para Praia Grande a fim de ligar este computador que uso neste momento para escrever este post e fazer outras coisas, como assistir TV.

Ficando em São Paulo, eu estou tendo custos menores e estou tendo mais tempo para descansar e fazer outras coisas do que na época que eu viajava todo o dia de ônibus fretado, onde eu acordava 5 da madrugada e chegava às 21 horas, aí eu comia o lanche e ia dormir.

O desenvolvimento do meu player de áudio (que já foi apresentado aqui neste blog) está devagar, quase parando, mas eu já consegui implementar algumas coisas novas, como a nova interface em modo texto (ou parte dela), um mecanismo de sorteio aleatório de músicas (comecei a implementar hoje uma primeira parte, quando der, eu irei integrar ao resto do sistema e testar) e uma nova disposição dos botões na tela.

No caminho do restaurante que eu vou quando chega a hora do almoço do serviço, há uma farmácia onde tem uma balança e que não precisa botar moeda para saber o peso, então eu estou aproveitando para me pesar todos os dias. Estou percebendo que eu estou emagrecendo. Antes, eu estava com 83 kg, hoje eu estou com 79,5 kg aproximadamente. Creio que eu esteja emagrecendo devido a eu dormir mais ultimamente (dormir ajuda a queimar calorias) e pelo fato de não estar exagerando tanto na hora de comer, já que a comida é pesada na balança e, quanto mais comida no prato, maior é a facada no meu bolso. E também há o fato de eu estar comendo bastante vegetais e frutas, como o abacaxi e a manga (essas são as únicas frutas disponíveis no restaurante onde vou atualmente). Espero que eu emagreça mais nos próximos dias, pois eu ainda estou bastante gordo. Só para lembrar, eu pesava 63 kg em 2005.

No final de 2008, mais precisamente no dia 23 de Dezembro daquele ano, eu abri um tópico na PCDM (A Pior Comunidade do Mundo, uma comunidade bastante idiota do Orkut na qual eu participo) com o título “Previsão para 2009!” e contendo uma única frase: “Michael Jackson morrerá!” e, após o óbito do rei do pop, hoje em dia o pessoal me pergunta no Orkut os números da Mega Sena, que dia outras pessoas vão morrer e até falam que fui eu quem matou o Michael Jackson. Fui parar até no site Pérolas do Orkut (ainda que com a foto embaçada, não sei por quê).

O post em questão, na PCDM, é este aqui: http://www.orkut.com.br/Main#CommMsgs?cmm=50850&tid=5282741978028993760

O povo me pergunta como eu acertei a previsão da morte do Michael Jackson. Ao contrário do que alguns pensam, eu não tenho nenhum poder de adivinhação. O que aconteceu foi que eu deduzi que o Michael Jackson ia morrer. Desde aquela época, em 2008, ele já vinha apresentando várias doenças e estando um tanto quanto debilitado. Inclusive, algumas notícias da Internet (e fora dela) noticiavam o estado de saúde debilitado do rei do pop. Então, eu supus que ele não passaria deste ano e foi o que aconteceu. Ah, e se eu fosse mesmo vidente, eu teria previsto também as mortes do Luiz Carlos Alborghetti, do MC Pelé, da Mara Manzan e da Leila Lopes (haja gente indo para o andar de cima nessa época do ano).

Perto do Natal, lá para o dia 22 (ou 24 ou outra data próxima disso, ainda não se sabe), a empresa irá parar devido às festas de fim de ano, então eu terei meio que umas mini-férias. Então, eu crio que este não será o último post do ano neste blog, já que com certeza, haverá tempo para mais um post.

Para encerrar, irei postar um vídeo natalino bem velho, de 1987, onde aparece a Kim Wilde, uma cantora daquela época (e que canta até hoje) na qual venho escutado suas músicas nos dias atuais. Aparecem ela e o comediante Mel Smith. Abaixo, o vídeo:

Por hoje é só, até o próximo post, ainda esse ano. E agora, eu vou dormir, que eu estou morrendo de sono.

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/