<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ruby Vault &#187; Ruby</title>
	<atom:link href="http://www.tbueno.com/blog/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tbueno.com/blog</link>
	<description>Explorando o maravilhoso mundo de Ruby</description>
	<lastBuildDate>Tue, 24 Aug 2010 03:02:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Super Ruby Loops</title>
		<link>http://www.tbueno.com/blog/ruby/2009/08/super-ruby-loops/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/08/super-ruby-loops/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 18:16:48 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=206</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>Por curiosidade, resolvi tentar descobri todas as maneiras possíveis de se executar um loop com Ruby, e tentarei lista-las aqui.</p>
<h2>While</h2>
<p>Loops do tipo While no Ruby são exatamente iguais aos encontrados em Java, C# e outros. Um bloco deve ser executado <em>enquanto uma condição for verdadeira</em>.</p>
<pre class="brush: ruby">
x = 1
while(x <4)
	puts x
	x +=1
end

=> 1
   2
   3
</pre>
<p>O while também pode ser usado ao final de um bloco, de maneira semelhando ao &#8220;DO&#8230;WHILE&#8221; de outras linguagens.</p>
<pre class="brush: ruby">
x =1
begin
	puts x
	x+=1
end while (x<4)

=> 1
   2
   3
</pre>
<p>Irmão  inverso do while, o until executa um bloco de código <em>até que uma condição seja verdadeira</em>.</p>
<pre class="brush: ruby">
x = 1
until(x>3)
  puts x
  x +=1
end

=> 1
   2
   3
</pre>
<p>E, como no while, também pode ser usado como condição de execução ao fim de um bloco.</p>
<pre class="brush: ruby">
x = 1
begin
  puts x
  x+=1
end until (x>3)

=> 1
   2
   3
</pre>
<p><span id="more-206"></span></p>
<h2>For</h2>
<p>Outro loop clássico das linguagens, o for assume algumas particularidades no Ruby. Os <i>ranges</i> de Ruby podem ser usados em um for. Tanto na versão &#8220;intervalo aberto e fechado&#8221;.</p>
<pre class="brush: ruby">
#Intervalo aberto
for i in 1..3
  puts i
end

=> 1
   2
   3
#Intervalo fechado
for i in 1...4
  puts i
end

=> 1
   2
   3
</pre>
<p>Além disso, podemos iterar sobre letra do alfabeto, como no exemplo abaixo:</p>
<pre class="brush: ruby">
for x in 'a'..'d'
  puts x
end

=> a
   b
   c
   d
</pre>
<h2>Iteradores</h2>
<p>O  <em>iterator</em>, é um padrão de projeto que nos permite percorrer objetos agregados sem que sua verdadeira relação com o grupo ao qual pertence seja exposto. Ruby já fornece o padrão iterator através do método <em>each</em>.</p>
<pre class="brush: ruby">
[1,2,3].each do |i|
  puts i
end

=> 1
   2
   3
</pre>
<p>Que também pode ser usado com ranges:</p>
<pre class="brush: ruby">
(1..3).each do |i|
  puts i
end

=> 1
   2
   3
</pre>
<h2>Métodos da Classe Fixnum</h2>
<p>As opções não param nas citadas acima. Ainda temos alguns métodos da flasse Fixnum que nos fornecem comportamentos semelhante aos loops clássicos.</p>
<p>O método Fixnum#times recebe um bloco como parâmetro, e o executa o mesmo número de vezes do objeto Fixnum que o executou.</p>
<pre class="brush: ruby">
i = 1
3.times do
  puts i
  i+=1
end

=> 1
   2
   3
</pre>
<p>Temos também os métodos upto e downto que, como o times, também recebe um bloco e o executa, porém com um objeto de índice do bloco.</p>
<pre class="brush: ruby">
1.upto(3) {|i| puts i}

=> 1
   2
   3

3.downto(1) {|i| puts i}

=> 3
   2
   1
</pre>
<h2>Outras Esquisitices</h2>
<p>Em Ruby também temos um loop infinito, semelhante a um while(true), que deve ser quebrado mediante alguma condição definida dentro do bloco de execução. Um exemplo prático poderia ser uma verificação de senha via linha de comando:</p>
<pre class="brush: ruby">
loop do
  puts "Enter your password"
  gets
  chomp
  break if $_ =="123"
  puts "WRONG! Try again!"
end
</pre>
<p>E por fim, algumas malandragens típicas do Ruby. Como eu usei o mesmo exemplo em todo esse post, aqui vão algumas outras maneiras de imprimir na tela os números:</p>
<pre class="brush: ruby">
puts (1..3).to_a* "\n"

puts (1..3).to_a

puts *(1..3)

puts 1,2,3
</pre>
<p>Será que eu me esqueci de algum?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/08/super-ruby-loops/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Delicious-Ext Atualizado</title>
		<link>http://www.tbueno.com/blog/ruby/2009/08/delicious-ext-atualizado/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/08/delicious-ext-atualizado/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 22:02:06 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Projetos]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scraping]]></category>
		<category><![CDATA[Delicious]]></category>
		<category><![CDATA[Delicious-Ext]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=231</guid>
		<description><![CDATA[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. [...]]]></description>
			<content:encoded><![CDATA[<p>Quando eu <a href="http://www.tbueno.com/blog/scraping/2009/02/extendendo-apis-com-scraping/">fiz um post descrevendo a extensão da API</a> do Delicious feita com scraping, um dos riscos que eu citei era de o site mudar sua estrutura, fazendo com que os <em>scripts</em> de <em>scraping</em> quebrassem. </p>
<p>Pois há dois dias atrás aconteceu, o <a href="http://blog.delicious.com/blog/2009/08/delicious-homepage-gets-%e2%80%9cfresh%e2%80%9d.html">Delicious sofreu reformulações</a> e a implementação que eu tinha foi pro espaço.  </p>
<p>Já consertei todos os problemas e consegui implementar já algumas funções novas, como a busca por &#8220;Fresh links&#8221; que retornam páginas mais atuais, seguindo a tendência de <em>instant search</em> que anda sendo discutida bastante atualmente. Algumas features novas ainda não foram mapeadas, mas estas não afetam o funcionamento das atuais.</p>
<p>Hoje eu dei um <em>push</em> das correções pro Github e atualizei o <em>readme</em> para quem quiser usar. O código atualizado pode ser encontrado aqui:<br />
<a href="http://github.com/tbueno/delicious-ext/tree/master">http://github.com/tbueno/delicious-ext/tree/master</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/08/delicious-ext-atualizado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leitor de RSS Feito Com Ruby e Sinatra</title>
		<link>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 02:51:32 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Haml]]></category>
		<category><![CDATA[Rss]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=140</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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 é?</p>
<p>Então vamos ao que interessa.</p>
<p>Pré-Requisitos e Preparativos</p>
<p>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:</p>
<p><em>sqlite3 blue_eyes</em></p>
<p>SQLite version 3.4.0<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite> .quit</p>
<p>Usaremos algumas gems para nao reinventarmos a roda:</p>
<p>- <a href="http://www.sinatrarb.com">sinatra</a> &#8211; Nosso tão amado e querido micro-framework<br />
- <a href="http://github.com/pauldix/feedzirra/tree/master">feedzirra</a> &#8211; Parsing de RSS<br />
- <a href="http://sequel.rubyforge.org/">sequel</a> &#8211; Para gerenciamento simples do sqlite com ruby &#8211; http://sequel.rubyforge.org<br />
- <a href="http://haml.hamptoncatlin.com/">Haml</a> &#8211; Linguagem de marcação para nossos templates</p>
<p>Após instalarmos cada uma das gems necessárias, começaremos o desenvolvimento da aplicação.</p>
<h2>Leitor de RSS Feito Totalmente em Ruby! </h2>
<p>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 &#8220;feed&#8221;. 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.</p>
<p><strong>./feed.rb</strong></p>
<pre class="brush: ruby">
class Feed < Sequel::Model
  unless table_exists?
      set_schema do
        primary_key :id
        text :url
        text :name
      end
      create_table
    end
end
</pre>
<p>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.</p>
<p><strong>./blue_eyes.rb</strong></p>
<pre class="brush: ruby">
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
</pre>
<p>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.</p>
<p><span id="more-140"></span></p>
<p>O uso de POST Http foi adicionado para que possamos adicionar feed usando um form simples que recebe a url do feed a ser adicionado.</p>
<h2>Camada de Apresentação com Haml e Sass</h2>
<p>Como no tutorial anterior, usaremos o Haml e o Sass para geração de HTML e CSS respectivamente. Como esta é uma aplicação pequena, acho que fica interessante usarmos estas ferramentas para demonstrar como fica limpa a parte de apresentação usando elas.</p>
<p><strong>./views/index.haml</strong></p>
<pre>
%html
  %head
    %title Blue Eyes
    %meta{"http-equiv" => "Content-Type", :content=>"text/html; charset=UTF-8"}
    %link{:rel => 'stylesheet', :type =>'text/css', :href => 'style.css' }
  %body
    #menu
      %form{:action => 'add_feed', :method => 'post', :name => 'add_feed'}
        %input{:type =>'text', :name => 'feed_url', :id => 'feed_url' }
        %input{:type => 'submit', :value => 'Add Feed'}
      %ul
        - @feeds.each do |f|
          %li
            %a{:href => "/#{f.id}"}
              = f.name
    #content
      .feed
        %h1
          %a{:href => @feed.url}
            = @feed.title
        - @feed.entries.each do |entry|
          .entry
            %h2
              %a{:href => entry.url}
                = entry.title
            = entry.content
</pre>
<p>Sempre é bom lembrar que a identação é FUNDAMENTAL no Haml, portanto, preservem-na caso vocês forem copiar e colar estes códigos.</p>
<p><strong>./views/style.sass</strong></p>
<pre>
body
  :background-color #f0f0f0

a
  :color #B84300
  :text-decoration none

h2
  :font normal 1.2em/1.3em arial
  :margin 0
  :padding 0

.entry
  :border 1px solid #888
  :background #f9f9f9
  :padding 10px
  :width 90%
  :margin-bottom 1em

#content
  :float left
  :width 70%
  :margin 0px 0px 50px 0px
  :overflow auto

#menu
  :float left
  :width 25%
  :overflow auto
  :border 1px solid #888
  :margin-right 10px
</pre>
<p>Screenshot:<br />
<center><a href="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes.jpg"><img src="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes-300x225.jpg" alt="blue_eyes" title="blue_eyes" width="300" height="225" class="alignnone size-medium wp-image-151" /></a></center></p>
<h2>Trabalhos Futuros</h2>
<p>Obviamente, este exemplo não é uma aplicação completamente funcional. Ele serve mais como um exemplo de como explorar os recursos do Sinatra, mas como eu me diverti fazendo ele, logo tive a idéia de criar um projeto no Github para continuar o desenvolvimento. Sintam-se a vontade para clonar o projeto e sugerir melhorias. Existe uma lista de coisas que precisam ser melhoradas que incluem gerenciamento otimizado de feeds, caches, controle de datas para que os feeds não precisem ser buscados externamente a cada refresh, etc...<br />
<center><a href="http://github.com/tbueno/blue-eyes/tree/master"><img src="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes.gif" alt="blue_eyes" title="blue_eyes" width="237" height="144" class="alignnone size-full wp-image-148" /></a></center><br />
Provavelmente eu farei posts futuros descrevendo o desenvolvimento de novas features. Enquanto isso, confiram a página do<a href="http://github.com/tbueno/blue-eyes/tree/master"> RSS Reader BLUE EYES</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Acessando o Orkut com Ruby e Scraping</title>
		<link>http://www.tbueno.com/blog/ruby/2009/03/acessando-o-orkut-com-ruby-e-scraping/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/03/acessando-o-orkut-com-ruby-e-scraping/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 19:17:26 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scraping]]></category>
		<category><![CDATA[Orkut]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=109</guid>
		<description><![CDATA[Se você é brasileiro, provavelmente deve fazer parte do que foi chamado de &#8220;WTF Crazy Brazilian Invasion&#8220;, 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Se você é brasileiro, provavelmente deve fazer parte do que foi chamado de &#8220;<strong>WTF Crazy Brazilian Invasion</strong>&#8220;, 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.</p>
<p>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 &#8220;automatizadas&#8221;.</p>
<p>Mas que tipo de informação seria possível de obter do site?</p>
<h2>Acessando o Orkut com Ruby</h2>
<p>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 <a href="http://static4.orkut.com/js/gen/in_frame031.js">esse</a>, obviamente ofuscados de propósito.</p>
<p>Antigamente, alguns já haviam conseguido <a href="http://schf.uc.org/articles/2007/02/26/breaking-into-orkut-with-mechanize">quebrar</a> o Orkut com Ruby  e <em>scraping</em>, mas hoje os mesmos métodos não funcionam mais.</p>
<p>A solução encontrada para evitar as chamadas com Ajax foi acessar o &#8220;lado sem javascript&#8221; do site, no caso, a <a href="http://m.orkut.com">interface para dispositívos móveis do site</a>.</p>
<p><span id="more-109"></span></p>
<p>De cara, me deparei com a tela de login comum nos serviços do Google &#8211; que inclusive já possui uma<a href="http://code.google.com/apis/gdata/articles/gdata_on_rails.html"> api para Ruby</a>. Como o Orkut não faz parte dos serviços cobertos pela API oficial, tive que preencher o formulário de login usando o <a href="http://mechanize.rubyforge.org/mechanize/WWW/Mechanize.html">Mechanize</a>.</p>
<pre class="brush: ruby">
require 'mechanize'
require 'hpricot'

agent = WWW::Mechanize.new
page = @agent.get "https://www.google.com/accounts/ServiceLogin?service=orkut&#038;hl=en-US&#038;rm=false&#038;continue=http%3A%2F%2Fm.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fm.orkut.com%252FHome&#038;cd=US&#038;nui=5&#038;btmpl=mobile&#038;ltmpl=mobile&#038;passive=true&#038;skipvpage=true&#038;sendvemail=false"

form = page.forms.first
form.Email = @email
form.Passwd = @pass
page = @agent.submit form
</pre>
<p>Não se assustem com a URL gigantesca. Ela é mostrada quando você tenta acessar algum serviço privado sem estar logado. Após o login, o site gerará uma URL intermediária de autenticação antes de redirecionar para a home do usuário propriamente dita. Esse fluxo é reproduzido da seguinte maneira:</p>
<pre class="brush: ruby">
#Call home page to get the temporary URL that google generates
page = @agent.get "http://m.orkut.com/Home"
#Try to access the temporary URL to pass the authentication token
page = @agent.get page.meta[0].uri.to_s
</pre>
<h2>Lendo os Scraps Recebidos Usando Ruby</h2>
<p>Após os passos anteriores, conseguiremos acesso ao conteúdo da página. Depois, é só questão de mandar ver no scraping para obter as informações necessárias. </p>
<p>O código final é mostrado abaixo, e também pode ser <a href="http://gist.github.com/77639">acessado no gist</a>. Sempre é bom lembrar que ele foi feito às pressas e está sujeito a erros e melhorias.</p>
<pre class="brush: ruby">
require 'mechanize'
require 'hpricot'

class Orkut

  def initialize(email, pass)
    @agent = WWW::Mechanize.new
    @email = email
    @pass = pass
  end

  def print_scraps
    page = scrap_page
    scraps = page.search "div[@class='mblock']/div"
    scraps.each do |l|
      parts = Hpricot(l).inner_html.split("\n")
      puts "Name: #{parts[1]}"
      puts "Date: #{parts[3]}"
      puts "Message: "
      parts[4..parts.size-2].each {|line| puts line}
      puts "-" * 50
   end
  end

  private

  def scrap_page
    log_in
    #Call home page to get the temporary URL that google generates
    page = @agent.get "http://m.orkut.com/Home"
    #Try to access the temporary URL to pass the authentication token
    page = @agent.get page.meta[0].uri.to_s
    #Now, with authentication ready we can access the content
    page = @agent.get "http://m.orkut.com/Scrapbook"
  end

  def log_in
    page = @agent.get "https://www.google.com/accounts/ServiceLogin?service=orkut&#038;hl=en-US&#038;rm=false&#038;continue=http%3A%2F%2Fm.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fm.orkut.com%252FHome&#038;cd=US&#038;nui=5&#038;btmpl=mobile&#038;ltmpl=mobile&#038;passive=true&#038;skipvpage=true&#038;sendvemail=false"

    form = page.forms.first
    form.Email = @email
    form.Passwd = @pass
    page = @agent.submit form
  end
end

o = Orkut.new('your_email@gmail.com', 'your_pass')
o.print_scraps
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/03/acessando-o-orkut-com-ruby-e-scraping/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A Lógica Segundo Ruby</title>
		<link>http://www.tbueno.com/blog/ruby/2009/03/a-logica-segundo-ruby/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/03/a-logica-segundo-ruby/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 20:54:34 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Lógica]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=101</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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:</p>
<h2>Silogismo Aristotélico</h2>
<p>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.</p>
<p>&#8220;Todos os humanos são mortais&#8221;<br />
&#8220;Aristóteles é humano&#8221;<br />
-<br />
&#8220;Logo, Aristóteles é mortal&#8221;</p>
<pre class="brush: ruby">
#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
</pre>
<h2>Lógica Proposicional</h2>
<p>Segundo o wikipedia:</p>
<blockquote><p>
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 &#8220;teoremas&#8221; do sistema formal.
</p></blockquote>
<p>Dessa, os teoremas clássicos que me veem à cabeça são os seguintes:</p>
<p><span id="more-101"></span></p>
<h3>Dupla eliminação da negação</h3>
<pre class="brush: ruby">
#De ¬¬p, infere-se p
p = true
(not (not p))   #=> true
</pre>
<h3>Modus ponens (eliminação do condicional)</h3>
<pre class="brush: ruby">
#De p, (p → q), infere-se q.
p = true
if (p) and ( q = p);end
q            #=> true
</pre>
<h2>Exercícios de lógica</h2>
<p>Uma das coisas que me divertia antes da faculdade eram as tabelas-verdades, aonde era possível analisarmos uma fórmula para descobrir se ela era válida ou não. Um bom exercício para o cérebro é tentar descobrir se o resultado de uma fórmula é verdadeiro ou falso. Qual o resultado da expressão abaixo?</p>
<pre class="brush: ruby">
p = false
q = true
r = false

(!(q &#038; p) &#038;(r | q) | !((p &#038; r) |(r &#038; q)))
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/03/a-logica-segundo-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
