Posted by: anderson_leite on: November 23, 2009
As vezes para executar uma operação precisamos analizar diversos estados de um recurso, fazer diversas requisições, analizar parametros, etc. Tudo isso por nao termos a real informação do que é possivel fazer com aquele recurso no estado atual em que ele se encontra.
Se ao pedir por um recurso que se encontra em qualquer servidor web, o xml retornado fosse um pouco mais dinâmico, inteligente suficiente para fornecer não todas as possibilidades de operações que aquele recurso possui em diversos estados, mas sim aquelas possíveis no estado atual do objeto, então diversas requisições ou análises seriam poupadas, permitindo com certeza execurtar as operações que naquele momento realmente importam.
server-side
O servidor aqui é responsável por disponibilizar um xml do recurso solicitado, (o que o cliente vai fazer com essas informações veremos adiante). O rails já automaticamente consegue renderizar os dados básicos do objetos solicitado, teriamos normalmente alogo do tipo:
Mas queremos disponibilizar aqui um pouco mais de informações. Um pedido pode ter sido pago ou não. Isso caracteriza o estado dessa informação, que muda totalmente o que podemos fazer com esse recurso.
Se o pedido já foi pago, podemos por exemplo liberar a funcionalidade de envia-lo para os correios, enquanto se ele não foi pago ainda não podemos liberar essa funcionalidade.
Isso é uma máquina de estados, determindos estados podem ser atingidos dependendo do estado atual do recurso.
Supondo que nosso pedido já foi pago e que é possível chamar a ação de despachar para os correios seria ideal que o xml retornado tivesse um pouco mais de informações, como por exemplo:
Ou seja, o cliente tem no xml recebido todas as informações necessarias sobre o que pode fazer com aquele recurso naquele momento, evitando por exemplo requisições desnecessárias ao servidor ou mesmo chamadas erradas de metodos.
E como defino esses estados ?
Obviamente o Rails não gera essa informação a mais que queremos no xml e é ai que entra o Restfulie. O Restfulie sobrescreve a geracao do xml padrão do Rails, adicionando informações em tempo real sobre o estado do objeto solicitado.
Tutorial
Vamos criar nossa aplicacao para fazer o teste:
rails restfulie_server
Abra o arquivo config/environment.rb e adicione:
![]()
Atualize fazendo:
rake gems:install
Já temos uma aplicação base com a gem do Restfulie instalada. Precisamos do recurso “Pedido” para fazer os testes. Vamos criá-lo com scaffold para facilitar o exemplo:
script/generate scaffold pedido preco:float descricao:string status:string
Status ?
Esse é um campo obrigatório no Restfulie atualmente. Para definir o que seu recurso pode liberar em tempo real, ele precisa ter um status. Por exemplo, para liberar o “despachar” do nosso pedido o status dele deve ser “pago”.
O status de pago poderia ainda lberar outras acoes em cima do recurso, como baixar o estoque
por exemplo, tudo dependendo da sua regra de negócio.
Definindo o estado
O Restfulie vai procurar pelo método “following_transitions” para saber o que colocar no xml em tempo real. Abra o arquivo models/pedido.rb e adicione:
Pronto! É disso que precisamos para em tempo real saber quando é possível despachar ou não nosso pedido, a url http://servidor/pedido/1 deve agora mostrar o seguinte resultado:
Podemos executar no cliente a chamada a esse recurso. O Restfulie devolverá um objeto serializado contendo os métodos possíveis para aquele estado:
Ao chamar “p.despachar” a action despachar do PedidosController será executada.
Mais utilizações
Informação certa no momento certo, o recurso disponibiliza seu estado verdadeiro atraves do Restfulie. É possivel fazer uma série de configurações ainda no Restfuliepara deixar sua maquina de estados corretamente implementada, configurar actions que não são padrão, etc. Além disso a parte do client também é facilitada com o Restfulie, mas isso fica para um próximo post.
Posted by: anderson_leite on: November 17, 2009
Serviços como o TinyURL tem se proliferado na web, principalmente por causa do Twitter que limita as menssagens em 140 caracteres.
A aplicação que será descrita agora não tem o objetivo de ser como o TinyURL e sim utilizar essa idéia diretamente na URL, algo como:
http://johntopley.com/post/#{params[:token]}
Sinatra é um framework ruby para desenvolvimento de aplicações web. Na verdade ele é um micro-framework interessante quando Rails é algo muito grande para sua necessidade (o que não quer dizer que não seja podereso).
Uma de suas vantagens, é que o fato de ser extremamente leve facilita um número alto de requests por segundo.
Outro aspecto positivo é que o Sinatra suporta o Rack. Ná prática isso quer dizer que qualquer
servidor que suporte Rack pode rodar seu projeto, além de te dar a possibilidade de ter sua aplicação dividida em pequenas outras, por exemplo uma parte Sinatra e outra Rails.
A parte Rails
A parte Rails da aplicação contém um model chamado Post, que contém a conversão basa Base 36
Sinatra App
O Sinatra não padroniza uma estrutura de diretórios então é possível estruturá-la como quiser.
Sinatra não é um framework MVC
Sinatra fornece uma DSL para criação de aplicações web. No código acima existem
dois blocos manipuladores esperando por metodos HTTP GET. O primeiro redireciona
para o site jtblog.me. O segundo interpola um token para ser passado para a aplicaço Rails.
Sete linhas de código até aqui, as duas linhas restantes são referentes ao arquivo config.ru
e são utilizadas para subir a aplicação:
Esse post é uma tradução curta do John Topley – Write A Web App In Nine Lines Of Code With Sinatra
O site pode ser visto em :jtblog.me
Posted by: anderson_leite on: November 16, 2009
Todo mundo sabe dizer alguma coisa sobre Singletons. Singleton é ruim, singleton é anti-pattern. Mas como implemento um em Ruby e por que não deveria utilizá-lo?
O próprio Rails os utiliza por exemplo no ActiveSupport e em algumas tarefas do Rake. A motivação de um singleton está no fato de que algumas coisas são únicas.
Um singleton geralmente deixa pra própria classe gerenciar a criação do objeto. Antes de chegar na implementação do singleton vamos ver alguns comportamentos do ruby.
Uma variável com um ‘@’ é uma váriável de instância. Já uma variável com duas arrobas é uma variável de classe. Um método em ruby é da classe caso tenha o ’self’ antes.
Podemos criar uma instância e incrementar tanto a variável de classe como a variável de instância.
Ao instanciar uma segunda vez, a variável de classe se mantém e a de instância é obviamente ‘zerada’.
Utilizando a idéia acima podemos criar uma classe simples de log, onde desejamos que apenas uma seja de fato criada. Para isso definiremos o método ‘instance’ como método de classe que sempre retorna a mesma instancia da classe, guardada pela variável de classe “@@instance”
Quase funcionando, porém ainda poderíamos instanciar a classe de log…Pra evitar isso podemos usar o metodo ‘private_class_method’ passado como parâmetro méthodo ‘new’.
A implementação do singleton está completa. A classe cria apenas uma instância dela mesma, não permitindo nunca a criação de uma segunda.
Mas..e se fosse necessário mais um singleton na aplicação ? Teríamos que repetir esse processo inteiro.
O ruby fornece uma alternativa a isso que é incluir o módulo ’singleton’.
Uma chamada a Logger.instance devolve a uma única intância sempre da mesma maneira que a implementação anterior.
eager instantiation x lazy
Existe uma diferença entre o singleton que construímos e o módulo singleton do ruby.
Na nossa implementação do singleton a instância é criada antes de qualquer chamada a Logger.instance. Criar uma instancia antes mesmo antes que ninguém necessite é chamado de ‘eager instantiation’. Já a forma utilizada no módulo singleton espera pela primeira invocação para criar a instância, essa chamada é a conhecida como ‘lazy instatiation’.
Variáveis globais x Singletons
Podemos, por exemplo, utilizar uma variável global como singleton. E é aqui que o negócio começa a ficar feio. Em Ruby, qualquer variável iniciada com ‘$’ é global, você pode acessar de qualquer lugar. Portanto essa poderia ser uma boa implementação para singletons.
NÃO. Não existe nada que controle o calor da variável global nese caso como fizemos com o singleton, além das variáveis globais serem impossíveis de serem criadas antes(eager instatiation). Além disso não existem nada que garanta que essa variável não seja recriada e substituída em outro lugar.
É por isso que em ruby um singleton é implementado como um módulo. Como não é possível implementar um módulo seus métodos claramentes são criados para serem chamados sem permitir a criação de um objeto.
Agora nunca mais teremos mais de uma instância da classe Gerenciador. Ainda não… Ainda seria possível utilizar o método clone do Ruby.
Não que isso seja uma boa idéia, mas mostra como Ruby é uma linguagem onde praticamente tudo pode ser mudado em tempo de execução. A filosofia do Ruby é que se você decide que realmente precisa de uma implementação diferenta da craida anteriormente, a linguagem e permitirá isso, fica a seu critério e a sua responsabilidade.
Singleton: Anti-pattern
Um singleton sempre será basicamente uma variável única de escopo global. Com isso você cria um canal de comunicação direto entre qualquer classe com o singleton, deixando totalmente acomplado o relacionamento entre eles.
Outro problema é a dificuldade de se fazer testes unitários quando sua implementação se relaciona com um singleton. Como o estado pode sempre variar, seus testes terão ganho uma complexidade maior do que a necessária.
A recomendação então é: Não use singleton! Singletons propriamente aplicados são executados apenas uma vez, mas mesmo assim, não use singleton!
Posted by: anderson_leite on: November 7, 2009
O Ceará on Rails é um evento organizado por Alisson Sales, Rafael Cruz Rubert, Tiago Bastos e Victor Sobreira em Fortaleza no campus da UNIFOR.
O campus é ótimo(2009), 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.
