Você está visualizando a página de arquivos do blog Ruby Vault no mês de February, 2009.

Entendendo como funcionam class_eval, module_eval e instance_eval

Feb 26 2009 / 2:24 pm Escrito por bueno Nenhum Comentário

Para quem como eu, vem de linguagens não-dinâmicas, o que mais impressiona (e dificulta no início) é a capacidade de Ruby em se moldar e executar códigos dinamicamente. E seguindo a nossa saga pelos conceitos de metaprogramação, vamos explorar um pouco mais um recurso interessantíssimo de Ruby chamado eval.

Ruby Eval

O nome eval tem origem na palavra inglesa evaluation, que em uma tradução livre significa “avaliar o valor de algo”, no caso de Ruby, o valor de uma expressão ou trecho de código.

No caso de Ruby, a melhor definição seria “interpretar”, devido ao fato que além de avaliar, o código recebido também é executado, como no exemplo abaixo:

eval("puts 'Hello World'") # => Hello World

No post anterior sobre metaprogramação, eu utilizei o método instance_variable_set da classe Object.

Esse método pode ser utilizado para evitar repetições de código. No código abaixo eu mostro como é a implementação desse método e como ele é usado na prática:

Implementação redundante de um construtor de uma classe:

class CalendarEvent
  def initialize(start_time=0, end_time=0, attendees=0)
    @start_time = start_time
    @end_time = end_time
    @attendees = attendees
  end
end

Implementação melhorada com o uso de eval:

#Primeiro, adicionamos o seguinte código à classe Object,
#para torná-lo disponível para as instâncias de quaisquer classe
class Object
  private
  def set_instance_variables(binding, *variables)
    variables.each do |var|
      instance_variable_set("@#{var}", eval(var, binding))
   end
  end
end

#Depois podemos melhorar a nossa classe

class CalendarEvent
  def initialize(start_time=0, end_time=0, attendees=0)
    set_instance_variables(binding, *local_variables)
  end
end

c = CalendarEvent.new(4,5,2)

puts c.instance_eval "@start_time"   # => 4

Continue lendo…

Este post pertence à(s) categoria(s) Metaprogramação   —   Leia mais   —  

Veja mais posts na(s) categoria(s): ,

Criando Uma Página Pessoal com Sinatra, Haml e Sass

Feb 19 2009 / 8:40 pm Escrito por bueno 6 Comentários

Sempre procuro tornar o processo de aprendizagem o mais prático possível. O estudo se torna muito mais prazeroso e desafiador se utilizarmos um objetivo prático a ser alcançado ao final dos estudos.

Há algum tempo venho querendo experimentar o Sinatra, pequeno framework web escrito em ruby, mas estava esperando por um motivo pra isso. Quando eu estava acabando a criação deste blog, me surgiu a idéia de ter uma página inicial, semelhante à página de perfil de sites de relacionamento.

Unindo ao útil ao agradável, resolvi implementar essa parte do meu site usando Sinatra. Mas primeiros, precisamos juntar as informações necessárias para apresentar na página.

APIs Diversas: Flickr, Twitter, Last.Fm em Ruby

Como já foi dito antes, eu amo APIs e a possibilidade infinita que elas proporcionam. Nada melhor do que uma coleção de informações pessoais deixadas em sites que eu utilizo para rechear minha página de apresentação. A maioria das APIs disponíveis publicamente já possuem sua implementação em Ruby, tornando o uso das mesmas extremamente simples através das rubygems.

As APIs e suas respectivas gems utilizadas estão listadas abaixo:

Flickr – flickr-fu
Twitter – Ruby Twitter
Gravatar – Sem gem, mas de uso simples com Ruby.
Last.fm – Scrobbler

Com as Gems devidamente instaladas, precisamos configurar a parte que liga toda nossa página, através das routes e configurações adicionais do Sinatra.

Sinatra

Sinatra é um framework para pequenas aplicações web, pequeno e elegante, que nos permite criar pequenas páginas rapidamente com o uso de uma DSL própria, como nesse pequeno exemplo contido na página inicial:

require 'rubygems'
require 'sinatra'
get '/hi' do
  "Hello World!"
end

Certo, mas agora vamos a um exemplo mais prático. Com o seguinte código, é possível coletar os dados necessários para a nossa página:

Continue lendo…

Este post pertence à(s) categoria(s) Sinatra   —   Leia mais   —  

Veja mais posts na(s) categoria(s): , , ,

Extendendo APIs Com Scraping

Feb 16 2009 / 12:49 pm Escrito por bueno 1 Comentário

APIs públicas são uma das coisas mais bacanas da internet, a força propulsora da revolução web 2.0. A possibilidade da criação de mashups através de dados disponibilizados publicamente por sites como Flickr, NYTimes, Digg e outros, nos permite uma possibilidade de combinações limitadas apenas à nossa imaginação. Porém, como nem tudo são flores, nem sempre os sites que disponibilizam seus dados fornecem 100% das funcionalidades oferecidas no próprio site em si. Na verdade, nem deveriam.

Como faríamos para extender as possibilidades fornecidas por estas Apis?

Scraping

De acordo com o Wikipedia:

“Web scraping (or Web harvesting, Web data extraction) is a computer technique of extracting information from websites using specially coded software programs. Usually, such software programs simulate human exploration of the Web by either implementing the low-level Hypertext Transfer Protocol (HTTP), or embedding certain full-fledged Web browsers, such as the Internet Explorer (IE) and the Mozilla Web browser.”

Resumindo de maneira mais técnica, (X)HTML é no fundo XML. Ao navegarmos pelo conteúdo de uma página, podemos extrair informações através de parsing desse conteúdo. Existem diversas ferramentas, tanto de parsing quanto de scraping:

Scraping

  • ScRUBYt
  • Mechanize

Parsing

  • Hpricot
  • Nokogiri
  • REXML

Neste exemplo, utilizarei o Hpricot, por razões pessoais. Nunca parei para avaliar critérios como velocidade, facilidade, etc…

Continue lendo…

Este post pertence à(s) categoria(s) Scraping   —   Leia mais   —  

Veja mais posts na(s) categoria(s): ,

Tudo que você sempre quis saber sobre Metaprogramação mas tinha vergonha de perguntar

Feb 13 2009 / 1:15 pm Escrito por bueno 3 Comentários

A arte de escrever programas que escrevem programas está presente desde o início da ciência da computação, com o objetivo de aumentar a produtividade diminuindo a quantidade de código a ser escrito. O prefixo grego meta está presente na nossa língua, tornando mais fácil o entendimento do conceito por nós brasileiros logo de cara, bastando apenas lembrar das aulas de literatura ou dos livros de Machado de Assis.

Machadão, o rei da Metaliteratura

Machadão, o rei da Metaliteratura

Metaclasses

Lembra daquela frase que dizia que “em Ruby tu é objeto”? Pois é, vamos olhar o seguinte código:

class Zombie
  def self.alive
    puts "i am alive"
  end
end

Zombie.class     # => Class
Zombie.alive      # => "i am alive"
z = Zombie.new
z.class              # => Zombie

Continue lendo…

Este post pertence à(s) categoria(s) Metaprogramação   —   Leia mais   —  

Veja mais posts na(s) categoria(s): , ,

Em Obras

Feb 13 2009 / 1:13 pm Escrito por bueno Nenhum Comentário

Não reparem nos trechos em inglês que volta e meia aparecem no blog. Ainda estou adaptando o template do wordpress.

Obrigado pela compreensão!

Este post pertence à(s) categoria(s) Blog   —   Leia mais   —  

Veja mais posts na(s) categoria(s):

Apresentação

Feb 13 2009 / 1:09 pm Escrito por bueno Nenhum Comentário

Meu nome é Thiago Bueno Silva, nasci no dia 10 de fevereiro, no ano de 1984. Após 4 anos de experiência com Java, durante o ano de 2006 comecei a pesquisar sobre Web 2.0, que me levou a conhecer Ruby on Rails, que me abriu os olhos para a linguagem Ruby.

Desde então, venho trabalhando (ainda) com Java oficialmente, mas estudando e desenvolvendo projetos open-source e “free-las” com Ruby e Rails. Após cerca de 2 anos de estudos e práticas, decidi que era a hora criar um blog para me aproximar mais da comunidade rubista e aumentar meus conhecimentos no assunto. O resultado desta decisão é este blog que você está lendo.

Este post pertence à(s) categoria(s) Blog   —   Leia mais   —  

Veja mais posts na(s) categoria(s):

Autor

Thiago Bueno download vcard icon

Ruby Vault

Porto Alegre - RS - Brasil

Mensagens do Twitter

Twitter Updates

    Me siga no Twitter

    Links Internacionais

    Links Nacionais