Posted by: anderson_leite on: November 7, 2009
Já está começando o Ceará on Rails, evento organizado por Alisson Sales, Rafael Cruz Rubert, Tiago Bastos e Victor Sobreira aqui em Fortaleza no campus da UNIFOR.
O campus é ótimo, a estrutura para o evento muito boa. Na foto abaixo, Fábio Akita, Nando Vieira e Rafael Lima carregando seus macs em baixo de um cavalo.
Você pode acompanhar os twitts do evento pelo trend.me =>http://trendti.me/cearaonrails #cearaonrails
Posted by: anderson_leite on: November 4, 2009
Há um tempo escrevi sobre Ruby Singleton Classes, já nesse post vou criar um plugin bem simples que facilita buscas no Rails e ver uma forma onde singleton classes podem ser úteis.
Atualmente pra fazer uma busca ordenada precisamos fazer algo como:

A partir do momento que instalarmos nosso plugin na aplicação poderemos fazer a busca dessa forma:
Nosso plugin não é nenhum idéia inovadora, mas sim uma necessidade ou problema onde precisaremos utilizar Singleton Classes. Vamos criar uma aplicação de exemplo para criar, instalar e usar o plugin:

Não vou colocar aqui toda a sequência para gerar a aplicação base, mas esse roteiro acima deve ajudar.
Agora vamos comecar a gerar nosso plugin, vamos chamá-lo de default_options.Para iniciar basta rodar => ruby script/generate plugin default_options
Rails plugins e Singleton classes
Agora é preciso adicionar um novo comportamento ao ActiveRecord, a necessidade do plugin é adicionar um método novo a base do ActiveRecord que mude seu comportamento padrão, para isso vamos utilizar Ruby Singleton Classes:

Esse codigo abre a classe Base do módulo ActiveRecord e podemos adicionar qualquer novo comportamento nele.
O objetivo agora é definir um comportamento default quando o método default_find_option for chamado.

Mas isso ainda não muda o comportamento do find, precisamos mesclar o find normal com os parametros passando pro nosso default_find_option. Pra isso vamos redefinir o find:

Quase bom, mas a chamada do find na última linha faz nosso código entrar em um loop infinito, vamos resolver isso da seguinte forma:
Agora podemos chamar nosso método adicionado ao ActiveRecord via plugin. Como teste podemos gerar alguns carrors com fixtures
(test/fixtures/carros.yml):

E rodar alguns testes pro nosso plugin (test/unit/carro_test.rb):
Não vou cobrir aqui como distribuir o plugin, isso fica pra um próximo post.
Posted by: anderson_leite on: November 4, 2009
Na documentação do JQuery não existe um efeito específico para reflection ou shadow, porém é possível chegar neles combinando duas outras funcões.
Uma, talvez a mais simples, é o hover. A function hover recebe dois parametros, obviamente o que deve acontecer antes e depois do evento ocorrer.
Combinando o hover com o animate é possível afastar elementos mudando características como “top”, “opacity”, etc.
O código abaixo é o core para criar um reflection com JQuery:
O demo e o fonte para download podem ser vistos clicando abaixo:

Posted by: anderson_leite on: October 27, 2009
A idéia de componentes sendo construídos a partir de “sub componentes” é algo bem comum em um software. Construir objetos a partir de “sub objetos” é o que sugere o padrão Composite, ou seja, objetos simples se integrando para resultar em um mais complexo e interessante para o sistema.
Vamos pegar um exemplo:
Contruir um Copo de suco é uma composição de uma série de tarefas.
Uma dos pontos positivos aqui é que qualquer objeto do sistema que precisar do CopoDeSuco não precisa se preocupar com a complexidade da criação desse objeto.

Show me the code!
O GoF chama essa situação de “the sum acts like one of the parts”. Primeiro precisamos de uma interface comum aos objetos. Essa interface é chamada de component.
Cada tarefa “indivisível” do processo é chamada de leaf. Cada um desses objetos deve implementar a interface acima.
O Composite, enfim, é o componente no nível mais alto da hierarquia.
Nossa tarefa tem apenas um initialize e uma método “duracao”. Obviamente poderia ter muitas outras características.
Vamos a criação das tarefas:
AdicionarIngredientes e Mistura são dois leafs, ou seja, duas tarefas que não dividimos nesse modelo. Vamos criar um component a partir desses objetos.
O objeto Suco é o resultado dessa composição. Ao criarmos esse componente, precisamos de um array de sub tarefas. Criaremos os métodos que adicionam e removem essas sub tarefas.
Para evitar duplicação de código, vamos extrair um component e criaremos a classe Composite.
Aplicando a mesma lógica agora temos a classe Suco da seguinte forma:
E aplicamos a mesma idéia a classe CopoDeSuco. Essa classe é uma composição entre um component e um leaf.
Nossa classe composite poderia ter herdado diretamente de Array para receber os métodos que precisamos, porém essa seria uma implementação estranha. Um composite não é um tipo “especializado” de array, e estariamos utilizando a herança apenas por preguiça fazendo isso.
Posted by: anderson_leite on: October 25, 2009
Integração é um dos maiores desafios na construção de um sistema, cada
alteração causada por determinada parte do código pode causar mudanças
no sistema com um todo. Em uma planilha, ao alterar uma célula, vários
outros objetos podem mudar, como uma atualização de uma conta ou
recriar um gráfico. Manter esse tipo de integração não é simples, e alguns
padrões são voltados para diminuir esse tipo de acoplamento.
O Rails já implementa uma forma de atacar esse problema no próprio
Active Record, fazendo callbacks na classe ActiveRecord::Observer.
O código abaixo tenta demostrar uma implementação e solução desse problema.
Temos uma classe Funcionário e queremos manter avisados
todos os objetos do sistema que se interessem em modificações nele.
Agora vamos criar a classe Pagamento. Essa classe imprime um log a cada
vez que o salário do funcionário for alterado. Para isso, vamos laterar o
initialize da classe Funcionario para receber também um obejeto do tipo
Pagamento. Cada vez que o salário for alterado, agora chamanos o método
update do pagamento.
Mas e quando mais uma classe precisar ser informada das alterações no Funcionário ?
O código acima deixa as classe muito acompladas. Uma forma de diminnuir essa dependência pode ser criar uma lista de “observadores” ao criar o funcionário. Dessa forma poderiamos ingormar todos os objetos da lista quando uma alteração no funcionário for feita. Apenas precisamos aqui estabelecer uma interface, ou seja, todos os objetos que estão observando o funcionário terão o método update para serem notificados.
Agora podemos facilmente adicionar um novo observador, veja:
Nossa implementação agora está boa, mas e quando precisarmos observar um outro objeto do sistema ? Precisariamos então copiar a mesma idéia nesse outro objeto.
Um objeto que está sendo observado é chamado de Subject. Podemos resolver isso criando uma classe Subject que contém os métodos que adicionamos no Funcionario.
E usar herança nos objetos considerados Subject:

HERANÇA DE NOVO ! ? ! ?
Vamos dar preferência a composição ao invés da herança visando diminuir o acoplamento entre nossas classes. Para isso vamos alterar a classe Subject para um Módulo.
Utilizando o módulo Subject como mixin melhoramos a implementação:
Essa é exatamente a idéia da classe Observer encontrada na documentação do Ruby:
Portanto podemos incluir o próprio Observer do Ruby:
Melhorando o Observer usando blocos.
O método add_observer do Ruby não aceita blocos, mas podemos melhorar e solucionar isso aceitando blocos no módulo Subject que tinhamos criado anteriormente, chegando a uma implementação bem interessante de Observer:
Mais…
Entrevista com os autores do famoso livro do Gof, 15 anos depois de lançado:
Se você tem alguma sugestão para melhorar o código acima comente ou crie um fork no github.
Posted by: anderson_leite on: October 22, 2009
É interessante conhecer como outros programadores pensaram para solucionar casos que costumam se repetir durante o desenvolvimento de software. Alguns casos recorrentes foram catalogados em 1994 pela GoF, no livro sobre Design Patterns. Vamos ver como aplicar alguns casos em Ruby.
Considere um sistema complexo onde em uma determinada parte do código existe a necessidade de uma variação. As vezes esse núcleo pode fazer uma coisa enquanto outra vez é necessário fazer outra. Para exemplificar melhor, vamos usar uma classe “Relatorio”. Nosso relatório mostrará um conteúdo inicialmente em HTML.

Vamos deixar de lado a questão do html na classe agora, apenas para efeito de análise do código.
Nesse momento nossa classe gera apenas o relatório em um formato, mas voltando ao problemas que estamos resolvendo, temos a necessidade de criar o mesmo relatório porém em um formato diferente, por exemplo pdf ou texto puro mesmo.
O que fazer agora que é necessário um relatório em formato diferente ?
Bem…(rs)..uma abordagem poderia ser:

Bonito nao ? ![]()
Para solucionar esse problema de forma orientada a objetos poderiamos criar uma classe abstrata que define o comportamento de um relatório, ou seja, que define que um relatório de ter um head, um body, um footer, etc. Mas como criar uma classe abstrata em Ruby ? Embora não exista a palavra chave reservada “abstract” o conceito permanece presente na linguagem. Vejamos:

A classe Relatorio agora possui os métodos que definem um relatório. Obviamente esses métodos podem ser invocados. A solução para isso normalmente é lançar uma exception nesses métodos não implementados.
Agora que temos nossa classe abstrata, podemos criar subclasses de Relatorio que contém a implementação de cada um dos tipos, por exemplo para HTML:

Agora para usar nossos relatórios podemos fazer:

Esse é o Template Method, um dos patterns que deram origem ao famos livro de Design Patterns do GoF.
Mas…um dos princípios mais discutidos em engenharia de software nãe era …”Prefira composição ao invés de Herança” ?
HERANÇA!?!?!?!
Compor e delegar são formas muito mais recomendadas de construir o design de uma aplicação. O que podemos fazer para melhorar nossa solução seguindo essas idéias ?
Primeiramente vamos parar de usar a classe relatório como uma superclasse, vamos refatorar o código e criar uma superclasse chamada “Formatter”. Essa classe servirá para pensarmos em composição. Nossas implementações de relatórios agora ficam assim:
Agora podemos começar a pensar em composição. De volta a classe Relatorio, agora o “initalize” receberá um Formatter. Fica mais fácil imprimir um relatório agora, veja:
Agora para usar nossos relatórios podemos fazer:
![]()
Executar um núcleo diferente agora depende de como nosso objeto foi composto. O acoplamento agora é bem menor. Essa é a idéia do Strategy, tiramos a herança e favorecemos a composição, onde todos os objetos suportam
suportam a mesma interface, mesmo que não exista a palavra chave reservada em ruby.
Mas da pra melhorar um pouco ainda, não ?
Repare no método “imprime_relatorio” da classe Relatorio. Esse método passa o titulo e o texto
para a implementação do relatório. Podemos melhorar isso passando uma referência do próprio objeto
Relatório com self!
E pra melhorar um pouco mais e utilizar uma das características importantes do Ruby, podemos passar o conteúdo
do relatório através de blocos, tirando de vez a herança!

Por mais que algumas palavras chaves da orientação a objetos não sejam explicitas no ruby, os conceitos estão muito presentes.
Se você tiver alguma sugestão para melhorar o código acima, por favor, comente ou crie um fork do gist do Diego Carrion no github.
Posted by: anderson_leite on: September 27, 2009
Ontem foi realizado mais um encontro do Guru-SP no auditório da Gonow com cerca de 50 pessoas debatendo o tema Testes Automatizados. O evento foi no esquem a de mesa redonda, com muitas boas discusões e bate papo.

Foi uma ótima oportunidade de expor a forma que temos desenvolvido com testes, conversar sobre o objetivo que usamos testes e compartilhar expêriencias. O Rafael Rosa Fu me convidou pra formar a mesa de debatedores junto com Cássio Marques, Thiago Scalone, Ricardo Yasuda e Jorge Diz.
Gostei muito que pudemos mesclar teoria e prática no encontro. Por duas vezes acabei fazendo live-coding, [TB]DD com Cucumber e depois com RSpec.
E pra finalizar aconteceu o #horaextrasp no buteco mais próximo.

Posted by: anderson_leite on: August 24, 2009
Acabou o Rails Rumble 09 que participei junto com a equipe the_annoyers formada por Rafael Carvalho, Leandro Silva e Douglas Campos.
Fomos patrocinados pela gonow que forneceu uma ambiente muito legal pro evento. Vou contar as primeiras impressões aqui do evento e depois um segundo post sobre detalhes técnicos do que usamos no projeto.

rails rumble
Pra quem nunca ouviu falar, rails rumble é uma competição de programação que dura 48 horas seguidas com equipes de no máximo 4 integrantes.
Nessa competição o objetivo é criar um site sem ter nada previamente pronto. Inclusive questões de ambiente, servidor e deploy devem ser todos feitos durante a competição.

a equipe
Nossa equipe se integrou muito bem e isso foi um dos pontos mais positivos pra nós ao fim do evento. Foi muito interessante o fato de cada um ter conhecimento de determinadas áreas que fizeram com que o time ficasse bem completo. Desde as idéias, passando pelo ambiente e programando o site final, tudo fluiu naturalmente, pareando quase sempre alternando horários de descanso sem precisar seguir nenhuma regra burocrática específica. Tirando o horário do almoço não tivémos nenhum momento em que o projeto ficou parado sem nenhum integrante trabalhando. Fica aqui meus agradecimentos especiais ao Rafael Carvalho pelo convite de integrar o time.

patrocinador
A gonow foi incrível e essa opnião é unanime. Além de tudo que aprendemos sobre desenvolver um projeto em 48 horas seguidas,
o ambiente fornecido pela gonow proporcionou uma interação com um monte de gente envolvida com desenvolvimento web, rails etc.
Na gonow tivemos comida boa toda hora, uma geladeira cheia de coisas, red bull a vontade! Um PS3 pra relaxar, lugar pra descansar
uma horinha ou outra, enfim tudo muito legal. Fica ai meus agradecimentos a eles, principalmente ao Diego Carion, Luiz Aguiar e Rafael Rosa.

what annoys you?
Nosso projeto partiu de uma idéia simples. Um site pra gerar estatísticas e formar grupos de pessoas interessadas em resolver os
mesmos problemas. Uma central de reclamações mundial. Nosso objetivo inicial foi bem “pé no chão”, criando o ambiente inicial pra isso
com área para reclamação, tags, painel de reclamações e fotos das reclamações,envio da reclamação por twitter, área de autenticação comum e por Open Id. Criamos testes
para as principais finalidades com cucumber e desenhamos o layout do projeto. Usamos coisas legais de rails que fica pro próximo post.
Chegamos no que queríamos. Algo fora de complexidade, buscando ser simples e funcional.

No próximo post falarei dos detalhes técnicos do projeto, ferramentas utilizadas etc. Abraços pro pessoal que encontrei por lá também como Felipe Kenobi, Rodrigo Yoshima, Caue Guerra, pessoal de Santa Catarina do hublator. Valeu gonow. Valeu the_annoyers !
Outros post sobre o evento:
Leandro Silva
Rodrigo Yoshima
Posted by: anderson_leite on: August 13, 2009
Muita gente que estuda ruby on rails acaba achando estranho a notação class << object, que aparece em alguns lugares da api.
Essa notação define as chamadas singleton classes em ruby. Por exemplo, uma classe normal em ruby poderia ser:
Podemos instancia e invocar o método normalmente:
Entretanto, também é possível definir métodos apenas para esse objeto “p”, pois tudo em ruby, até mesmo
as classes, são objetos, fazendo :
O método “anda” é chamado de singleton method do objeto “p”.
E onde estão os singleton methods ?
Um singleton method “vive” em uma singleton class. Todo objeto em ruby possui 2 classes:
A singleton class é exclusiva para guardar os metodos desse objeto, sem compartilhar com outras instâncias da mesma classe.
E como defino uma singleton class ?
Existe uma notação especial para definir uma singleton class:
Definindo o código dessa forma temos o mesmo que no exemplo anterior, porém definindo o método anda explicitamente na singleton class.
É possível ainda definir tudo na mesma classe:
Mais uma vez o método foi definido apenas para um obejto, no caso , o objeto “Pessoa”, podendo ser executado com:
Posted by: anderson_leite on: August 11, 2009
Outro plugin bem legal de JQuery é o Flip!.

Existem configurações de velocidade, direção, cor de fundo e callbacks.
Pra usar é simples.
1) faça o download do plugin. Ele já vem com as dependências que são o jquery e o jquery-ui.
2) coloque os arquivos javascript numa pasta jquery.
3) crie um html, como o abaixo

mais infos => http://lab.smashup.it/flip/