um pluguinho
Desenvolvimento
RVM, onde estou!?!?!
Nov 24th
Comecei a utilizar o RVM em sua versão 0.0.22, na época ele não passava de um script shell que permitia a instalação e troca entre as vms, mas ele vem avançado muito, e funcionalidades como set de gemas é só a ponta do iceberg.
Motivado pelo post anterior acabei lendo um pouco mais a documentação e encontrei uns scriptizinho bem interessante. Como saber rapidamente qual a versão atual da minha VM? Para isso podemos contar com o script ~/.rvm/bin/rvm-prompt, ele pode ser usando adicionando a seguinte linha ao seu .bash_profile:
Com isso ele mostra qual maquina virtual do Ruby você esta usando, mas apenas quando essa for diferente da default. Só isso já seria o suficiente, mas o que me incomoda nesta solução, é que eu já tenho uma linha de comando grande, e nem sempre eu preciso saber qual versão eu estou usando, isso é particularmente interessante quando estou em um projeto Ruby. Como normalmente um projeto Ruby temos um arquivo Rakefile podemos procurar por este arquivo e exibir a versão da máquina apenas quando estivermos no diretório de um projeto Ruby. Vamos adicionar as seguintes linhas ao nosso .bash_profile:
RVM_VERSION=`~/.rvm/bin/rvm-prompt`
if [[ -f "$(pwd)/Rakefile" ]] && [[ ! -z "$RVM_VERSION" ]]; then
echo "${RVM_VERSION} "
fi
}
Agora podemos mudar a linha anterior para:
Espero que ajude alguém e qualquer dica que possa melhor é só comentar a baixo.
Para tudo! Instale o RVM antes.
Nov 24th
Essa era uma dica que gostaria de ter recebido antes de ter encostado no meu mac, mas infelizmente na época o RVM ainda não existia, então para quem esta começando a usar Mac OS X e principalmente Ruby, use o RVM. Digo isso porque uma vez que tenha feito a bagunça de instalar varias máquinas Ruby, a coisa vai começar a complicar.
Mas o que raios é esse RVM? Ruby Version Manager, é basicamente um instalador e gerenciador de máquinas virtuais Ruby, e adicionalmente um gerenciador de sets de gemas. Por baixos dos panos ele é um script bash que troca algumas variáveis de ambiente e permite ter varias versões das máquinas virtuais Ruby (MRI, Jruby, etc) instaladas diretamente na pasta do usuário, dessa forma ele ainda permite um isolamento entre as instalações de VMS dos usuário de uma máquina.
A grande vantagens dele esta em não misturas as coisas de uma VM com a outra, e permite uma rápida troca entra uma VM e outra. A vantagem adicional de gerência sets de gemas é na verdade um grande achado, pois juntas as duas coisas permite criar ambientes isolados por aplicação, e quem trabalha com Ruby sabe como é difícil lidar com o o esquema de gemas, famoso “DLL Hell”.
Mas vamos deixar de conversa e vamos mostrar como usar. A instalação é simples, e feita usando o gem, que no caso de você esta usando Leopard já vai estar instalado:
$ rvm-install
O segundo comando vai criar a pasta ~/.rvm, é nela que toda a magia acontece, dentre outras coisas dentro dessa pasta esta os scripts que permite o funcionamento do rvm, observe que este comando mostra uma instrução sobre como adicionar o carregamento do RVM no seu bash, isso pode variar dependendo de máquina e SO.
Uma vez que bash esteja configurado, o comando rvm deve estar disponível, sua utilização é simples:
$ rvm install ree # para instalar ruby enterprise por exemplo
$ rvm ree # passa a utilizar o ruby enterprise com máquina virtual rvm
Bom até aqui temos o bem básico, você pode ver mais sobre a instalação e configuração do RVM aqui. Agora vamos a um exemplo de para o esquema de sets de gemas. Vamos criar um set para um blog, típico não
$ rvm 1.8.7 # vamos para máquina MRI v=1.8.7 só para listar as gemas
$ gem list # veja que não há nenhuma gema instalada
$ rvm 1.8.7%blog # aqui estamos criando um novo set com base na máquina 1.8.7
$ gem install rails # vamos instalar rails nesse set
$ gem list # observe que vc tem rails instalado
$ rvm use 1.8.7 # agora não tem mais ;)
Agora é só criar sets diferentes para suas aplicações e evitar a colisão das malditas gemas. Mas antes disso duas observações importantes: Evite o uso do sudo quando for instalar a gemas dentro de uma das máquinas virtuais, elas podem ate funcionar, mas isso vai fazer com que as gemas sejam instaladas como root e os arquivos dentro de pasta ~/.rvm/** não vão pode ser removidos pelo usuário normalmente.
Outra dica que eu acho importante, mesmo ele permitindo que volte a VM default do sistema, prefira fazer uma instalação limpa dela dentro do rvm, isso permite manter as coisas separadas e facilita na hora de criar um set ou mesmo atualizar sua VM.
Limpando o console automaticamente a cada teste
Apr 18th
Se tem uma coisa que eu sou completamente fã é do ZenTest, o autotest incluído nele é uma das melhores ferramentas para desenvolvedor Ruby hoje em dia.
Habitualmente tenho uso dois monitores para desenvolver, onde em um eu deixo o autotest rodando e no outro eu vou alterando o código no editor. Um problema é que uma vez salvo o arquivo e o autotest inicie um novo teste acaba misturando visualmente um teste com outro. No mac da para usar o command+k para limpar o boffer do terminal, mas o que não chega a ser uma solução boa, pq acabo perdendo os testes que já se passaram.
Ontem o @jcmlima deu uma idéia: “e se ele limpasse automaticamente”, hoje depois de alguns palpites do @fnando e do @willian acabei achando o um jeito de fazer isso, o esquema é editar seu ~/.autotest ou o .autotest do projeto que você gostaria que tivesse essa funcionalidade e adicionar o código a baixo:
20.times { puts }
system("clear")
end
Em resumo o resultado final é que a cada nova rodada de teste ele vai inserir 20 linhas em branco e depois limpar a tela, mas diferente da opção de command+k ele ainda vai permitir que você role a tela e possa ver os testes que se passaram.
YourMove – A Saga de um concurso móvel
Feb 21st
Não postei nada aqui sobre o concurso da Intel que estava participando, o tempo andava curto e muitos projetos para trabalhar, pensei em deixar para o final e fazer um resumão, então vamos lá!
O concurso da Intel tinha como objetivo o desenvolvimento de um aplicativo de sua escolha para plataforma móvel batizada de MID, teve inicio no mês de Julho do ano passado. Fiquei sabendo do concurso antes de abrir as inscrições, através do site br-linux.org, mas acabei por esquecer e quase não consegui me cadastrar a tempo de participar da votação popular, para escolha das melhores idéias.
Nesta primeira fase tivemos um probleminha, algum engraçadinho resolveu que iria sair do ultimo lugar e chegar ao primeiro, e em menos de 1 dia tinha mais votos do que o primeiro colocado, depois de alguns protestos através de comentários, o filho da mãe em vez de se retirar da disputa, fez o favor de adicionar votos para outros participantes, você podia escolher 10 idéias que lhe agradasse, com isso gerou-se mais confusão e protestos. Para finalizar a confusão quem estava administrando o site do concurso, se descuidou e a opção de votar ficou aberta além da data limite, o que gerou mais alguns protestos, e por fim a Intel desconsiderou os votos apos a data limite e liberou a classificação final, minha idéia ficou em quinto lugar.
Em um outro post vou dar mais detalhes sobre o que se trata a minha idéia, e também apresentar a primeira versão aberta ao público.
O regulamento previa que os 10 primeiros ganhariam um MID da Intel para desenvolver o aplicativo e apos o envio do beta para a Intel, ganharíamos um Netbook, ambos com processadores Atom. Mas infelizmente pelos entraves da Receita Federal os MID que eram para ter chegado em 30 dias, levaram quase 5 meses para chegar, o que levou a Intel a estender o prazo de entrega dos beta, e também adiar o evento de apresentação dos projetos.
Do dia 31/10 passamos para o dia 31/01 como data limite, o que em termos aumentou em muito o tempo para o desenvolvimento do programa, mas sem o MID de quase nada adiantava este tempo extra. Por volta do dia 15/12 recebemos os “brinquedinhos”, a primeira impressão foi ótima, pelo pacote já deu para perceber que o produto tinha bom acabamento:

Com o aparelho em mãos deu para ter um idéia melhor do que era, do que poderia ser feito, e para dizer a verdade, poderia ter trabalhado no programa a mais tempo, afinal com porta USB host, leitor de Micro SD, teclado slider padrão qwerty, GPS, tela touch, 512MG de RAM, dois SD de 2GB internos, e um processador de Intel Atom de 900Mhz, o AIGO P8860 é um PC em miniatura.

Como o espirito hacker manda mais do juízo, as primeiras semanas foi de hackerismo total, instalações e formatações suscetivas, passando de Ubuntu, Slax, Debian, Arch e chegando ao próprio Moblin, resultados variados, mas em geral agradáveis. Os problemas mais recorrentes ficam por conta da tela touch e do GPS, já a wireless é quase sempre suportada, precisando apenas copiar os Firmwares devidos. A curiosidade fica para a webcam integrada que funcionou em todas as distros sem nenhuma interversão.
Passadas as festividades de fim de ano (lembranças boas da Chapada Diamantina), comecei a trabalhar na aplicação. Entre indas e vindas, pensei em desenvolver em diverso tipos de ambiente:
- Ruby com GTK. Era uma boa opção visto que estou trabalhando com Ruby a mais de um ano e tem sido minha linguagem principal, mas sinceramente o suporte a GTK, ou mesmo QT e outras toolkits gráficas ainda não é lá essas coisas em Ruby, por esse motivo ou outro que eu desconheço as libs e dependências não estão disponíveis facilmente em qualquer ambiente;
- C++ e Clutter. Para quem não conhece o Clutter é um projeto relativamente novo, que ainda não chegou a versão 1.0, sua principal característica e torna fácil lidar com objetos 2D, animações e eventos, criando uma serie de efeitos que lembram interfaces como a do Canola, Iphone, dentre outros. Mas meu conhecimento em C++ não chega ao nível Jedi, talvez um jovem Padawan, o que seria muito complicado com o curto espaço de tempo.
- Algum ambiente RIA. Como programador web a muito anos, eu sempre gostei da idéia de desenvolver aplicações desktop com base em navegador, a facilidade em lidar com HTMl e CSS aliadas ao poder que Javascript, permitem construir aplicações muito ricas em termos de interface. Prova disso é o que a Palm fez com o novo WebOS, um Webkit sobre um kernel linux e temos um ambiente de desenvolvimento relativamente fácil, e principalmente facilmente extensível visualmente
Por fim acabei por escolher a terceira opção, mas ai apareceu um pequeno problema: qual ambiente RIA utilizar? Talvez um dos mais conhecidos ultimamente seja o Adobe AIR, mas seu suporte a Linux ainda é limitado e seu peso era um empecilho grande ao uso do mesmo no MID. Uma alternativa Open Source é o Titanium, um projeto bem interessante que juta vários outros projetos, como Google Gears, Webkit, Rake, JazzRecord, dentre outros e criam um ambiente de desenvolvimento muito bom. Mas a versão para Linux ainda esta no campos das promessas, e apesar das minhas tentativas (foram varias) não conseguir obter uma ambiente, mesmo que beta, no qual pudesse trabalhar.
Bom só me restou uma saída, trabalhar no meu próprio ambiente RIA, nasce então o Eibox, meu primeiro framework público. A principal idéia por trás do Eibox é criar um framework Python, compatível tanto com desktops quanto com aparelhos móveis. Sei que o projeto é ousado, e vou precisar de muita colaboração para conseguir este feito, mas com a primeira versão do podMobile em funcionamento acredito que sera combustível o suficiente para que outras pessoas possam contribuir.
No momento o Eibox esta construído sobre Python e Qt4, a QT entra na joga para fazer a ponte entre o Python e Webkit, ao mesmo tempo que fornece uma rica biblioteca que pode ser utilizada para completar a aplicação. Mas existe um porem nisso, a QT por mais leve que seja, adiciona peso extra ao ambiente, e limita o Eibox ás plataformas em que a QT esteja disponível. Para ter acesso ao código fonte do Eibox basta acessar o repositório do podMobile.
Deixando o Eibox de lado, conseguir fazer a aplicação funcional, pelo menos o suficiente para apresentar no evento. A baixo você pode conferir o vídeo da apresentação da minha aplicação e tirar suas próprias conclusões:
A decisão do vencedor ficou a cargo de uma bancada formada pela Intel, e um voto do público do evento. Infelizmente minha aplicação parece não ter agradado os jurados, ou seria o fato de dar palpite de mais nas outras apresentações (eu e minha boca grande). Mas em fim o fato de que o publico escolheu com 37% dos votos a minha aplicação me deixou muito feliz. Evidentemente que vencer o concurso era o objetivo maior, mas o retorno dado pelas pessoas foi muito gratificante, vários me procuram depois da apresentação para parabenizar pela idéia e pelo framework.
Bom é isso, e a quem interesse, o Eibox vai continuar em desenvolvimento e tenho muitos planos para ele, em breve devo postar mais algumas coisas falando do que fiz e sobre o futuro do mesmo, quero melhorar bem o código, e levar o framework para outras plataformas.
Nova ferramenta de visualização da API do jQuery
Feb 3rd
Eu tento não chover no molhado nos posts que faço por aqui, ficar anunciando novas funcionalidades de coisas conhecidas não me parece muito inovador, mas esta merece um post, o jQuery esta com uma nova versão, e se isso por si só já não fosse uma grande coisa, também ganhou uma nova ferramenta para acesso a documentação.
A versão anterior era bem engessada, e muitas das vezes lenta, complicando na hora de lembrar onde estava cada uma das funções, é na seção Traversing ou na Manipulation? E fim esta nova versão facilita em muito achar as coisas, afinal a API do Jquery não é o que se pode dizer de padrão, resultado de uma abordagem um pouco diferente da usada pelo Prototype, por exemplo, que acaba por confundir quem esta vindo de outros frameworks.
Qt + OpenGL
Feb 1st
Achei esse vídeo bem interessante mostrando como os widgets do qt podem ser misturados a um ambiente 3D em OpenGL, para saber mais.
iPython console do gedit
Dec 10th
Juntamente com o plugin anterior, acabei por fazer um outro plugin, o ipythonconsole.
Tenho usado o iPython a um bom tempo, por indicação do Ramiro Luz da comunidade Python do Paraná, ele é uma boa alternativa ao console padrão do Python, oferece uma infinidade de melhorias.
Durante os testes para o desenvolvimento do plugin tabsextend, usei bastante o Python Console que já vem com o gedit, mas ele é bem limitado e meio chatinho de usar, sem falar que ele trabalha com a fonte monospace por padrão, como utilizo a fonte Monaco no editor, acabava ficando meio estranho.
Enquanto pesquisava para desenvolver o plugin acabei trombando com esse artigo que da um exemplo de como colocar o iPython dentro de uma janela gtk, aproveitei o código deles e um pouco do código do próprio Python Console e crieio o plugin ipythonconsole.
Bom o esquema para instalar é o mesmo do outro plugin, baixa o pacotinho, e extrai na pasta ~/.gnome2/gedit/plugins
Plugin tabs extend para gedit
Dec 10th
Já faz um bom tempo eu venho pensando em melhorar o gedit com algumas coisas que eu sinto falta. Para isso estou construindo uma lista de coisas que gostaria que fosse adicionadas ao editor, e agora vou começar a tirar um tempinho para implementar essa lista.
O primeiro pacote de funcionalidade vem com o plugin tabsextend, com os seguintes recursos:
- Fechar a aba com o botão do meio do mouse, ou com os dois botões se esta opção estiver configurada no seu X;
- Desfazer o fechar de uma aba, parecido com o Firefox. Fechou uma aba? Não era isso que queria? Ctrl+Shift+T e ele vai reabrindo as abas fechas na ordem em que foram fechadas;
- Fechar todas as outras abas menos a atual. Com atalho de Ctrl+Shift+O
- Menu para as duas opções acima e mais a opção de fechar todas as abas (Ctrl+Shift+W) no menu da aba, essa opção parece um pouco besta pelo fato de já existir os atalhos, mas as vezes eu sinto falta e tirar a mão do mouse nem sempre é a opção mais rápida
Para instalar baixe este pacote e extraia os arquivos na pasta ~/.gnome2/gedit/plugins.
Bom é isso, espero que o plugin posso ajudar aguem, instalem, testem e se possível dêem um feedback, que eu fico agradecido!
obs: Jayme seu plugin de fechar tags no html vai sair, tenha um pouco de paciência, rsrs
Ordenando a lista de opções no plugin activerecord_symbolize
Nov 14th
Ainda na continuação do post anterior, a troca de idéias com o Cássio acabaram por render mais frutos para o plugin.
Já tinha tempo que eu estava precisando de uma forma de ordenar as opções que no select ou radio gerado pelos helpers select_sym e radio_sym respectivamente. O problema era que o plugin trabalhava com o arrays simples ou com hash para estabelecer os valores possíveis para o atributo.
Bom como hash não tem um ardem certa em que os seus valores possam ser capturados, uma vez que ele seja definido, um simples each sobre o hash pode trazer seus valores em qualquer ordem.
Então agora o plugin conta com a opção de usar um matriz para definição dos valores, mantendo a opção de array simples e hash, sendo que no primeiro é mantido a ordem na qual os valores são definidos e no caso de hash é retornando em ordem alfabética. Vamos há alguns exemplos para claria as idéias:
Então para a definição de model acima, temos o seguintes resultados na view:
Observe que no caso do so, a ordem não é a mesma estabelecida na chamada do symbolize, mas sim em ordem alfabética do humanize do atribute, enquanto no caso de office os valores vem na ordem que foram declaradas dentro do array.
Bom é isso, em breve mais uma opção de ordenação, mas por hora espero que esta opção agrade a quem precisar.
Novo atributo *_humanize no plugin activerecord_symbolize
Nov 14th
O Cássio do /* CODIFICANDO */, fez um post dando uma dica de como simular uma funcionalidade de enum no ActiveRecord, para trabalhar com uma faixa de valores em um dos atributos do model. Então dei uma dica para ele do plugin activerecord_symbolize, do qual eu já falei por aqui e acabei por contribui com algumas alterações.
Trocando idéia com o Cássio, ele sugeri o método *_str, para facilitar na hora de transformar a propriedade do model em um valor legível para o usuário. Bom, eu já tinha feito está alteração localmente e acabei por esquecer o commit/push dela.
A diferença do que ele sugeriu para o que eu tinha feito é que dei o nome de *_humanize para o método, o que é mais Ruby mod do que _str, com o _str poderia ser confundido com o método to_str. Passamos a ter:
Com isso espero atender melhor aos usuário desse plugin, facilitando na hora de obter o valor que sera mostrado na view.
