Novo atributo *_humanize no plugin activerecord_symbolize

Posted on November 14, 2008, under Desenvolvimento, Ruby/Rails, plugins.

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.

Hooks no bash

Posted on November 13, 2008, under Configuração, Desenvolvimento.

Nos últimos dias tenho andado ocupado com muitos projetos e não esta sobrando muito tempo para escrever, e mesmo revisar os posts que já estão escrito aqui para o blog, faltando apenas a revisão e publicação, então vai um pequeno post sobre uma ferramenta para bash programers de plantão.

Estou trabalhando em uma gem que entre outras coisas vai enviar mensagens aos meus contatos de IM de acordo com o comando executado no shell, em breve ela deve ficar pronta e eu dou mais detalhes por aqui. Mas o importante nisso foi descobrir como monitorar o que é executado no shell.

A principio pensei em varias possibilidades, dês de interagir com o kernel em algum nível, para obter os comandos executados ou mesmo fazer alguma gambiarra com o comando “script”, mas quase todas as tentativas me levavam a um problema: como fazer isso de forma transparente e ainda mais importante em Userspace.

Pesquisando, acabei achando um pequeno truque. Neste site há uma explicação de como usar esse “hook” de bash para abrir uma caixa de aviso com Growl no mac (o que pode ser feito no Linux com o notify), para avisar sobre o termino de comandos muito longos.

A configuração é bem simples, basta baixar para o seu home dir o arquivo http://www.twistedmatrix.com/users/glyph/preexec.bash.txt e adicionar ao seu bash a chamada: “. ~/.preexec.bash”, feito isso você define duas funções a preexec e a precmd, funções que são chamadas antes do comando e depois do comando respectivamente.

As aplicações para este hook são quase que infinitas, mas atente para o fato de que isso aumenta o tempo de execução de um comando, pois ela trabalha em cima de todos os comandos que você executar em shell.

obs: Obrigado ao meu amigo Cássio pelas longas horas perdidas atrás dessa inhaca, se ele tivesse um blog eu linkaria aqui!

Backup dos arquivos de configuração

Posted on September 22, 2008, under Configuração, archlinux.

Se tem uma coisa que me deixa chateado é perde meus arquivos de configuração, infelizmente isto é uma coisa que acontece com um certa frequência. Mas existe solução para o problema, vamos a ela!

Nos últimos meses, uma ferramenta tem feito muito barulho, pelo menos para desenvolvedores que sabem utilizar uma boa ferramenta de controle de versão. Não, não estou falando no git, mas do dropbox. Para quem não conhece o dropbox é um serviço de disco virtual, com cliente multi plataforma e com suporte a controle de versão.

A idéia aqui é simples: usar o dropbox para manter um backup dos arquivos de configuração e ao mesmo tempo ganhar um controle de versão, mesmo que simples, sobre estes arquivos. Estou usando isso em uma máquina com Archlinux, mas o principio é o mesmo pra qualquer distribuição e pode ser adaptado com facilidade.

Para instalar o dropbox no Archlinux será necessário o uso do AUR, existe duas maneira de se fazer isso, a primeira é baixar o pacote direto do AUR e executar a rotina de instalação de um pacote desse tipo, a outra é ter o yaourt instalado e fazer isso com uma linha de comando:

$ sudo yaourt -S nautilus-dropbox && killall nautilus

Com isso deve aparecer na barra de tarefas o ícone do dropbox, aguarde um pouco, ele vai baixar e instalar o dropbox, ate aqui o que foi feito era apenas instalação do instalador, rsrs. Quando o processo terminar ele abre um tela com um wizard de configuração, uma vez configurado ele já faz o primeiro sync com sua pasta remota e já podemos trabalhar.

O processo é simples, vamos supor que quiséssemos manter um backup do rc.conf, podemos fazer:

$ mkdir ~/Documents/etc
$ cp /etc/rc.conf ~/Documents/etc/rc.conf
$ sudo rm /etc/rc.conf
$ ln -s ~/Documents/etc/rc.conf /etc/rc.conf

Atente para o fato de que ~/Documents é o meu diretório de sincronismo com o dropbox, você pode ter configurado outro durante o wizard. Tenha em mente que isso pode ser feito quase com qualquer arquivo de configuração, como arquivos do vim (~/.vim e ~/.vimrc), ~/.bashrc, ~/.ssh, bom acho que você pegou a idéia ;)

Bom, é isso. Tenha cuidado com o que você coloca na dropbox, lembre-se que se trada de um serviço on-line, que poder sofrer quedas e ataques de diferentes tipos, uma vez que alguem obtenha acesso aos arquivos lá, como suas chaves em .ssh sua segurança pode esta comprometida, o uso de chaves com palavra chave é o mais recomentando, mas mesmo assim não é garantia de 100% de segurança, afinal outro dia teve uma falha no Debian eu seus derivados comprometendo varias chaves por ai.

Archlinux

Posted on September 21, 2008, under archlinux.

Estava escrevendo um mega post sobre Archlinux, contando minha odisseia por outras distribuições e como acabei chegando nele, mas resolvi deixar isso de lado, Archlinux não pode ser explicado, ou você experimenta e tem a seção do que todos estão falando (pelo menos os que estão usando :P ), ou nunca vai saber como é.

A minha recomendação é: leia, leia bastante antes de usar, não ignore o guia de instalação, a simples não abertura de um arquivo, que nem alteração precisara, pode impedir o funcionamento do Arch.

Eu particularmente, estou feliz coma serie de coisas nele:

  • Estabilidade: meu Firefox não travou uma única vez nesta 1 semana de uso;
  • Organização: apesar de alguns pacotes serem instalados por compilação nada sai do lugar, através do makepkg se cria um pacote da compilação e evita arquivos perdidos.
  • Documentação e Comunidade: forte e atuante, em inglês tem muita coisa, em português esta aumentando a cada dia, de forums a wiki se acha de tudo relacionado ao Arch, mesmo porque pra instalar um gerenciador de rede você vai precisar ler um howto.

Bom sem mais delongas lei este Guia em pt e seja feliz ;)

Resolvendo problemas do Emesene

Posted on September 17, 2008, under Configuração.

Bom, uma dica rápida para movimentar isso aqui. Já faz um tempo que estou usando o programa Emesene como cliente do msn. Até a versão anterior do pidgin, ele tinha a vantagem de implementar o protocolo mais novo do msn e permitir mensagem em off entre outras coisinhas. Como o novo pidgin também avançou nessa área, isso deixa de ser vantagem, mas mesmo assim ainda temos os plugins, alguns ao meu ver superiores aos do pidgin.

Mas tinha uns probleminhas bem chatos: tanto o plugin dbus quanto o spell não funcionavel corretamente, agora que formatei o computador e instalei o Archlinux me inspirei a ir atrás da solução.

Para o dbus a solução do problema foi sussa de achar, instalando o python-dbus resolve o problema, agora possa usar o plugin de musicas, que altera minha mensagem de status e ainda troca minha imagem pela capa do cd :P

Para o spell tive que ir atrás de informação, o problema é que ele reclama da falta do gtkspell, mas mesmo estando instalado não funciona. Procurando por um python spell ou algo parecido não se acha nada, acabei por encontrar nesta thread informação de qual pacote tem o suporte necessário. Para o Archlinux:

$ pacman -Ss gnome-python-extras

Para outras distro pode variar o nome do pacote, no Ubuntu me parece ser python-gnome2-extras.

activerecord_symbolize a solução para o seus problemas

Posted on August 19, 2008, under Desenvolvimento, Ruby/Rails.

Um dos erros que cometi quando comecei a desenvolvimento da loja foi usar o tipo enum do banco de dados mysql em algumas tabelas. O erro foi agravado pelo uso do plugin enum-column que adicionar suporte a esse tipo de coluna no ActiveRecord.

O problema se concentra no fato de que o tipo enum não é suportado por todos os bancos de dados, o que impede a migração da aplicação para outro tipos de banco que não sejam mysql. O plugin agrava o problema, não por si só, mas pela falta de atualização.

A partir do Rails 2.0 temos as sexy migration, por isso na criação de uma tabela usamos:

Isso adiciona um coluna do tipo enum no banco de dados, mas atualiza o arquivo schema.rb de forma errada, observe o código abaixo do arquivo schema.rb:

Não existe o método enum para class ActiveRecord::ConnectionAdapters::TableDefinition, o que gera erros quando usamos o schema.rb para criar o banco de dados, o que acontece sempre que rodamos testes por exemplo. A solução para este ultimo problema seria atualizar o plugin, mas ainda sim teríamos o outro problema.

Pensando nisso fui no github atrás de um plugin alternativo, acabei por encontrar o activerecord_symbolize, um plugin que na sua versão básica adiciona o suporte a atribuição de tipos simbólicos as propriedades de um modulo.

Mas lendo a documentação e testando o plugin acabei descobrindo que ele seria pouco para o que queria, por isso fiz um fork do projeto e adicionei algumas características ao plugin. Já fiz um pedido de pull para o projeto original e estou aguardando para ver se minhas modificações são aceitas. Enquanto isso vamos a forma de utiliza-lo.

Para instalar o plugin pode ser fazer o básico:

script/plugin install git://github.com/nuxlli/activerecord_symbolize.git

Na sua tabela usasse tipo string mesmo:

No seu model adicione:

Feito isso, User passa aceitar apenas os valores :female e :male para o atributo gender, gerando um erro de validação caso algum outro valor seja passado, o mesmo acontece com so. Se o symbolize fosse chamado sem a definição de in ele passaria a aceitar qualquer simbolo sem erro de validação.

Um outro recurso que adicionei foi dois helpers para facilitar na hora de criar formulários, ficando assim:

Com isso já se obtém dois campos radios para escolha do gênero e um select para escolha do SO, sendo que suas opções são puxadas diretamente da definição do symbolize.

Para mais informações: activerecord_symbolize

Vamos ajudar na tradução do livro Why’s (Poignant) Guide to Ruby

Posted on June 24, 2008, under Ruby/Rails.

Bom pessoa o Carlos Brando pede neste post por ajuda para terminar a tradução do livro Why’s (Poignant) Guide to Ruby.

Quem souber inglês o suficiente e queira participar veja-la como é fácil fazer. Eu não estou ajudando na tradução porque não domino inglês o suficiente o que pode atrapalhar em vez de ajudar, mas estou aqui fazendo minha parte e pedindo ajuda a quem puder, se assim como eu não pode ajudar na tradução, ajude-nos a pedir ajuda ;)

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!

Posted on June 24, 2008, under Uncategorized.

…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe – quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!

Webkit no maemo

Posted on June 14, 2008, under Desenvolvimento, N800, Uncategorized.

No projeto que começamos no fisl, o odfmobile, optamos por utilizar a engine Gecko do projeto Mozilla, para trabalhar a exibição dos documentos. O uso desta se deu através da biblioteca gtkmozembed para python.

A opção de usar o gtkmozembed foi mais por questão de tempo, e por consequência, disponibilidade da api, já integrada ao python. Mas depois de um tempo pesquisando sobre o desenvolvimento para plataforma maemo acabei esbarrando neste post. Lendo isso e tirando como base o navegador do N800 e do iPhone, fiquei me perguntando se o Webkit não seria uma opção melhor ao Gecko.

Para ter uma ideia do que seria melhor, resolvi baixar e compilar o Webkit para o maemo e ver no que dava. Então vamos aos passos para testar o Webkit no maemo, vou considerar que você já saiba com ter SDK do maemo em sua máquina e que esteja familiarizado com o mesmo.

Instale o m4:

> apt-get install m4

Depois baixe e instale os seguintes pacotes no seu scratchbox:

  • http://www.atoker.com/webkit-maemo/flex_2.5.33-12_armel.deb
  • http://www.atoker.com/webkit-maemo/gperf_3.0.3-1_armel.deb
  • http://www.atoker.com/webkit-maemo/libicu36_3.6-2_armel.deb
  • http://www.atoker.com/webkit-maemo/libicu36-dev_3.6-2_armel.deb

Existe duas maneiras de obter o Webkit, e elas estão descritas neste link.

Uma vez que tenha obtido o WebKit, rode o comandos:

> CPPFLAGS="-DMOBILE=1" ./autogen.sh --prefix=/opt/webkit --enable-video --disable-xslt --with-hildon
> make && make install

Ele deve criar uma pasta em /opt/webkit, para testar se deu certo a nossa instalação, vamos compilar um simples navegador feito em C.

> wget http://www.atoker.com/webkit-maemo/hildon-browser.c
> PKG_CONFIG_PATH=/opt/webkit/lib/pkgconfig:$PKG_CONFIG_PATH gcc -o hbrowser hildon-browser.c `pkg-config gtk+-2.0 hildon-1 webkit-1.0 --cflags --libs` -Wall

Uma vez feito isso podemos transferir os arquivos para o dispositivo e testar, copie a pasta /opt/webkit para o /opt do seu dispositivo, depois copie o hbrowser para onde desejar. Antes de testar instale a biblioteca: libicu36_3.6-2_armel.deb, que já foi citada acima, no seu dispositivo.

Para rodar o hbrowser faça:

> LD_LIBRARY_PATH=/opt/webkit/lib:$LD_LIBRARY_PATH run-standalone.sh ./hbrowser

Nenhuma das tarefas a cima são triviais, mas isso são apenas os primeiros testes, partindo do principio de que funciona, posso fazer mais testes sobre a performance e estabilidade de Webkit no maemo.

Aguardem em breve mais novidades!!

Passenger versos Thin

Posted on June 9, 2008, under Desenvolvimento, Passenger, Ruby/Rails.

Depois ler sobre o Passenger varias vezes no site do Akita, e utilizar ele na minha maquina para o desenvolvimento da aplicação de e-commerce, resolvi fazer alguns benchmarks e vê como ele se saia comparado ao thin.

Os testes a seguir foram executados com a aplicação em environment production, eles caem consideravelmente quando em development:

No / do site:

Thin (MRI) – Produção: 3.68 [#/sec] (mean)
Thin (Ruby Enterprise): 6.72 [#/sec] (mean)
Passenger (Ruby Enterprise): 2.64 [#/sec] (mean)

Em uma página secundaria de produto:

Thin (MRI): 19.11 [#/sec] (mean)
Thin (Ruby Enterprise): 36.49 [#/sec] (mean)
Passenger (Ruby Enterprise) : 5.53 [#/sec] (mean)

Com esses testes descobri algumas coisas:

  1. Que minha aplicação esta incrivelmente lenta, 6.77 (o melhor resultado) é inaceitável, preciso melhorar muita coisa para chegar onde preciso.
  2. O Passenger, pelo menos por hora, só compensa no ambiente de desenvolvimento, pois evita ter que ficar levantando processo para testar as aplicações. obs: isto é para a minha aplicação, para sua pode ser completamente diferente.
  3. Vou trocar o ruby do servidor de produção pela versão “Enterprise”, os resultados são sem duvida motivadores, a diferença no caso da página de produtos foi gritante.

O resultado não quer dizer absolutamente nada sobre o Passenger, se é ou não mais rápido para todos os casos, isto pode, e vai variar muito de aplicação para aplicação, principalmente no meu caso onde a aplicação ainda não passou por nenhum refatoramento nem um analise profunda de performance.

Além dos testes com a página inicial e com a página de produto, fiz um teste com arquivo estático, uma imagem para ser mais preciso, e deixo um aviso os mais eufóricos, o Passenger, sem a correta configuração pode ser um problema com os arquivos estáticos. A questão esta no fato de que apenas a configuração básica da aplicação no apache faz com que o arquivos estáticos sejam servidos através do ruby o que da um perda de desempenho em responder a esse tipo de arquivo violenta, o certo e fazer como é descrito na tópico 5.3.3 do manual do Passenger.

Pelo menos no meu caso a melhor maneira de servir arquivos estáticos tem sido a configuração do Apache para não passar a requisição das pastas estáticas para os cluster thin. Usando a opção “ProxyPass /images !” o Apache não envia a requisição dos arquivos no caminho /images para o cluster, o que evita processamento dos arquivos pelo ruby.

Meu grande problema agora vai ser refatorar aplicação, fiquei decepcionado em saber que do jeito que esta, estou com uma média de 3.68 [#/sec], isso é muito baixo, e depois do lançamento oficial dos sites pode ser um grande problema :(

BlogBlogs.Com.Br