Ruby

Super Ruby Loops

Uma das coisas que mais me confundiu a cabeça quando comecei a aprender Ruby foram os loops. Vindo de Java e C, não me entrava na cabeça como uma coisa simples como um loop poderia ser escrito de tantas maneiras diferentes. Isso simplesmente não parecia certo pra mim. Passado um bom tempo, comecei a compreender essa liberdade dada ao programador e a creditar isso ao poder e dinamicidade do Ruby.

Por curiosidade, resolvi tentar descobri todas as maneiras possíveis de se executar um loop com Ruby, e tentarei lista-las aqui.

While

Loops do tipo While no Ruby são exatamente iguais aos encontrados em Java, C# e outros. Um bloco deve ser executado enquanto uma condição for verdadeira.

x = 1
while(x <4)
	puts x
	x +=1
end

=> 1
   2
   3

O while também pode ser usado ao final de um bloco, de maneira semelhando ao “DO…WHILE” de outras linguagens.

x =1
begin
	puts x
	x+=1
end while (x<4)

=> 1
   2
   3

Irmão inverso do while, o until executa um bloco de código até que uma condição seja verdadeira.

x = 1
until(x>3)
  puts x
  x +=1
end

=> 1
   2
   3

E, como no while, também pode ser usado como condição de execução ao fim de um bloco.

x = 1
begin
  puts x
  x+=1
end until (x>3)

=> 1
   2
   3

Read more…

Delicious-Ext Atualizado

Quando eu fiz um post descrevendo a extensão da API do Delicious feita com scraping, um dos riscos que eu citei era de o site mudar sua estrutura, fazendo com que os scripts de scraping quebrassem.

Pois há dois dias atrás aconteceu, o Delicious sofreu reformulações e a implementação que eu tinha foi pro espaço.

Já consertei todos os problemas e consegui implementar já algumas funções novas, como a busca por “Fresh links” que retornam páginas mais atuais, seguindo a tendência de instant search que anda sendo discutida bastante atualmente. Algumas features novas ainda não foram mapeadas, mas estas não afetam o funcionamento das atuais.

Hoje eu dei um push das correções pro Github e atualizei o readme para quem quiser usar. O código atualizado pode ser encontrado aqui:
http://github.com/tbueno/delicious-ext/tree/master

Leitor de RSS Feito Com Ruby e Sinatra

Após o meu primeiro post/tutorial que descreveu como criar uma párgina de perfil usando Sinatra, Haml e Sass, vou me aprofundar mais no tema criando uma outra aplicação de exemplo que explora melhor os conceitos por trás do Sinatra.

O exemplo anterior se resumia a simples GETs Http, mas nós sabemos que aplicações web são muito mais que isso, não é?

Então vamos ao que interessa.

Pré-Requisitos e Preparativos

Será necessário a instalação do sqlite3 em seu computador. Os passos para fazer isso fogem do escopo deste tutorial, mas você não encontrará dificuldades para esse procedimento(usuários de mac não precisam). Após a instalação, crie via linha de comando uma database, como no exemplo abaixo:

sqlite3 blue_eyes

SQLite version 3.4.0
Enter “.help” for instructions
sqlite> .quit

Usaremos algumas gems para nao reinventarmos a roda:

- sinatra – Nosso tão amado e querido micro-framework
- feedzirra – Parsing de RSS
- sequel – Para gerenciamento simples do sqlite com ruby – http://sequel.rubyforge.org
- Haml – Linguagem de marcação para nossos templates

Após instalarmos cada uma das gems necessárias, começaremos o desenvolvimento da aplicação.

Leitor de RSS Feito Totalmente em Ruby!

O idéia é criar um leitor de RSS básico, com as features mínimas necessárias para o seu funcionamento. Melhorias futuras serão tratadas em outros posts. Para que possamos gerenciar nossos feeds, criaremos um Model simples, representando objetos “feed”. Percebam que, assim como os conhecidos exemplos do ActiveRecord usado no Rails, aqui a gente também extende uma classe model do nosso framework de acesso ao BD, o Sequel. É possível notar também a semelhança com um Migration na definição do schema da tabela.

./feed.rb

class Feed < Sequel::Model
  unless table_exists?
      set_schema do
        primary_key :id
        text :url
        text :name
      end
      create_table
    end
end

Pronto. Nosso Model já está pronto, agora vamos para o Controller. Como essa é uma implementação bem simples, usaremos apenas a raiz do site para apresentar o conteúdo. Isso pode ser comprovado nos GETS que esperam apenas um parâmetro, no caso o "id" do feed no nosso banco.

./blue_eyes.rb

require 'sinatra'
require 'feedzirra'
require 'sequel'

configure do
  Sequel.sqlite('blue_eyes.db')
end
require 'feed'

get '/style.css' do
   content_type 'text/css', :charset => 'utf-8'
   sass :style
end

get '/' do
   @feeds = Feed.all
     @feed = Feedzirra::Feed.fetch_and_parse("http://www.tbueno.com/blog/feed/")
   haml :index
end

get '/:id' do
    @feeds = Feed.all
    @model = Feed.find(:id => params[:id])
    @feed = Feedzirra::Feed.fetch_and_parse(@model.url)
    haml :index
end

post '/add_feed' do
  f = Feedzirra::Feed.fetch_and_parse(params[:feed_url])
  feed = Feed.new(:url => f.feed_url, :name => f.title)
  feed.save
  redirect '/'
end

Outra novidade em relação ao tutorial anterior é o uso do “configure”, que é uma espécie de “initializer” do Rails e é executado, como o nome diz, apenas uma vez no início. Usaremos ele para conectarmos ao nosso banco.

Read more…

Acessando o Orkut com Ruby e Scraping

Se você é brasileiro, provavelmente deve fazer parte do que foi chamado de “WTF Crazy Brazilian Invasion“, lá pelos idos de 2006/2007, ao site de relacionamentos Orkut. Quando assumimos a liderança no número de usuários do Orkut, logo um efeito colateral começou a se manifestar: o excesso de scams, spams e outras filhadaputices tão típicas de brasileiros e países do leste europeu.

Essa ploriferação do mal, fez com que o Google começasse a aprimorar a parte de segurança do site, tornando ele hoje um dos sub-sites do conglomerado mais difíceis de se acessar por vias “automatizadas”.

Mas que tipo de informação seria possível de obter do site?

Acessando o Orkut com Ruby

Uma das medidas adotadas pelo Google para evitar os bots que atazanavam a vida de todos, foi a adoção de chamadas via Ajax, muito mais difíceis de ser capturadas e entendidas. Passei um bom tempo tentando entender o fluxo de dados de login, através do firebug, mas sempre esbarrava em arquivos javascript como esse, obviamente ofuscados de propósito.

Antigamente, alguns já haviam conseguido quebrar o Orkut com Ruby e scraping, mas hoje os mesmos métodos não funcionam mais.

A solução encontrada para evitar as chamadas com Ajax foi acessar o “lado sem javascript” do site, no caso, a interface para dispositívos móveis do site.

Read more…

A Lógica Segundo Ruby

Preparando-me para o início do meu mestrado, me vi com uma vontade forte de rever meus materiais da faculdade. Logo veio a lembrança de como eu me divertia nas cadeiras de lógica. Pouca coisa eu ainda lembro de cabeça, e dessas, resolvi reproduzí-las à maneira Ruby:

Silogismo Aristotélico

O silogismo consiste no fato de duas premissas inferirem, através de um termo em comum, na conclusão de uma terceira premissa também verdadeira.

“Todos os humanos são mortais”
“Aristóteles é humano”
-
“Logo, Aristóteles é mortal”

#Todos os humanos são mortais
class Human
	self.module_eval do
  	define_method :mortal? do
    	true
	  end
 	end
end

#Aristóteles é humano
class Aristotle < Human
end

#logo...
a = Aristotle.new
a.mortal?     #=> true

Lógica Proposicional

Segundo o wikipedia:

Em lógica e matemática, uma lógica proposicional (ou cálculo sentencial) é um sistema formal no qual as fórmulas representam proposições que podem ser formadas pela combinação de proposições atômicas usando conectivos lógicos, e um sistema de regras de derivação que permite que certas fórmulas sejam estabelecidas como “teoremas” do sistema formal.

Dessa, os teoremas clássicos que me veem à cabeça são os seguintes:

Read more…