Fork me on GitHub

Teste com o Sinatra

August 27, 2008 at 21:28

Esses dias vi alguém no Twitter falando do Sinatra (não me lembro quem, e também fiquei com preguiça de procurar :P ) e resolvi testar. Fiz um script que monta um select com todos os episódios do Rails Podcast Brasil, e ainda dando a possibilidade de ver o show notes de cada um deles.

Para instalar o Sinatra basta um simples

    sudo gem install sinatra
    

Para ver se está funcionando basta criar um arquivo muito simples como esse: (test_sinatra.rb)

    require 'rubygems'
    require 'sinatra'
    
    get '/' do
        "Funciona muuuito esse Sinatra"
    end
    

Botar o webserver a rodar

    ruby test_sinatra.rb
    

E rodar no browser

    http://localhost:4567/
    

Se aparecer na sua tela: Funciona muito esse Sinatra então tudo funcionou como deveria :)

Agora vamos a parte mais "complicada". Vamos pegar o nosso arquivo test_sinatra.tb e colocar o código abaixo:

    require 'rubygems'
    require 'sinatra'
    require 'hpricot'
    require 'open-uri'
    
    get '/' do
      body = '<form method="post" action="/"><select name="link">'
    
      doc = Hpricot(open("http://podcast.rubyonrails.pro.br/"))
      (doc/'div.sub').each do |sub|
        a = sub.next_sibling.search('a').last
        if a
          (sub/'h1').each do |h1|
            number = h1.children[0].inner_text
            puts number.to_s
            if number[0] == 35 # igual a #
              body << '<option value="' + a[:href] + '">Episódio ' + number + ' - ' + h1.children[2].inner_text + '</option>'
            end
          end
        end
      end
      body << '</select><button>Ok</button></form>'
    end
    
    post '/' do
      body = '<form method="post" action="/"><select name="link">'
    
      doc = Hpricot(open("http://podcast.rubyonrails.pro.br/"))
      (doc/'div.sub').each do |sub|
        a = sub.next_sibling.search('a').last
        if a
          (sub/'h1').each do |h1|
            number = h1.children[0].inner_text
            if number[0] == 35 # igual a #
              body << '<option value="' + a[:href] + '">Episódio ' + number + ' - ' + h1.children[2].inner_text + '</option>'
            end
          end
        end
      end
      body << '</select><button>Ok</button></form>'
    
      doc = Hpricot(open("http://podcast.rubyonrails.pro.br#{params[:link]}"))
      body << (doc/'div.content ul').last.to_html
    end
    

Pelo código podemos ver que temos uma chamada para get '/' e outra post '/'. Elas tratam da mesma URL, porém dependendendo do método HTTP atual ele chama um ou outro, isso é bom para separar alguma lógica que seja diferente entre eles.

Mas temos um problema, o nosso código não está DRY, tem muito código duplicado. Para resolver isso o Sinatra possui helpers também, que podem ser criados facilmente usando o método helpers, assim:

    helpers do
        def meu_helper
            # faz alguma coisa e retorna o resultado
        end
    end
    

Depois é só usar onde quiser

    get '/minha_pagina' do
        meu_helper
    end
    

Simples assim. Abaixo o script atualizado usando um helper

    require 'rubygems'
    require 'sinatra'
    require 'hpricot'
    require 'open-uri'
    
    helpers do
      def episodes_form
        body = '<form method="post" action="/"><select name="link">'
    
        doc = Hpricot(open("http://podcast.rubyonrails.pro.br/"))
        (doc/'div.sub').each do |sub|
          a = sub.next_sibling.search('a').last
          if a
            (sub/'h1').each do |h1|
              number = h1.children[0].inner_text
              puts number.to_s
              if number[0] == 35 # igual a #
                body << '<option value="' + a[:href] + '">Episódio ' + number + ' - ' + h1.children[2].inner_text + '</option>'
              end
            end
          end
        end
        body << '</select><button>Ok</button></form>'
      end
    end
    
    get '/' do
      episodes_form
    end
    
    post '/' do
      body = episodes_form
    
      doc = Hpricot(open("http://podcast.rubyonrails.pro.br#{params[:link]}"))
      body << (doc/'div.content ul').last.to_html
    end
    

Para coisas muito simples, frameworks como o Sinatra ajudam bastante, deixando tudo mais prático, mas obviamente tudo tem um limite, não recomendaria ele para aplicações maiores, então, caso precise de algo "mais sério", vá de Rails :)

OBS: O código está usando Hpricot, um parser HTML, bem rápido e fácil de usar, caso você não tenha ele instalado basta fazer como sempre

    sudo gem install hpricot
    

OBS 2: Eu tinha colocado os códigos no gist, mas parece que ele não permite "embedar" diferentes revisões de um mesmo código, então resolvi tirar e colocar somente o link para lá, caso alguem queira dar uma fuçada.

http://gist.github.com/7610

Adicionando tipos de arquivo ao gedit

August 20, 2008 at 21:15

Estou testando agora o Malline, que está sendo assunto na lista rails-br, e precisei editar os templates no gedit, porém conforme eu ia renomeando os arquivos de .erb para .mn, que é a extensão do Malline, os arquivos iam desaparecendo do File Browser. Para resolver isso é simples, basta adicionar o mime-type no arquivo:

    /usr/share/mime/packages/rails.xml*
    

assim:

    <mime-type type="application/x-ruby">
        <comment xml:lang="en">Malline Template</comment>
        <glob pattern="*.mn"/>
    </mime-type>
    

salve o arquivo, feche o gedit e rode:

    sudo update-mime-database /usr/share/mime
    

abra o gedit e veja que os arquivos aparecem novamente no File Browser :)

* Não sei se esse arquivo já vem com o gedit ou se alguma extensão/plugin colocou ele ali.

Git com Ruby

August 19, 2008 at 23:47

http://jointheconversation.org/rubygit/

Paginando com acts_as_taggable

August 19, 2008 at 01:32

Para paginar modelos que usam acts_as_taggable é bem simples

Post.paginate_tagged_with('nome_da_tag', :page => params[:page], :per_page = 10)
    

Demorei um pouco até descobrir isso, então resolvi anotar aqui :)

Codificando e decodificando strings com HTML Entities

August 19, 2008 at 00:30

HTML Entities é uma gem para Ruby que serve para codificar e decodificar html entities.

gem install htmlentities
    

Para codificar uma string usamos

require 'rubygems'
    require 'htmlentities'
    
    he = HTMLEntities.new
    encoded = he.encode("essa gem é uma mão na roda!", :named)
    puts encoded # essa gem &eacute; uma m&atilde;o na roda!
    

e para decodificar

require 'rubygems'
    require 'htmlentities'
    
    he = HTMLEntities.new
    decoded = he.decode("essa gem &eacute; uma m&atilde;o na roda!")
    puts decoded # essa gem é uma mão na roda!
    

Mudança de Planos

July 31, 2008 at 23:02

Decidi que não vou mais migrar meu blog para o Mephisto, vou fazer melhor, vou desenvolver meu próprio blog, obviamente, usando Ruby on Rails.

Vou fazer isso por que acho que para mim que não trabalho diariamente com Rails, é uma forma de aprender mais, e é muito melhor do que pegar alguma coisa pronta.

Ele já está quase pronto, daqui a pouco esse blog estará de cara nova, aguardem! :)

Colocando mais Ruby na minha vida

July 15, 2008 at 22:01

Pronto, está decidido, tenho que tomar vergonha na cara e começar a me afundar no Ruby, não posso ficar na metade do caminho, indo para um lado e para outro, e para começar, vou migrar o esse blog para mephisto, usando edge :) Meu próximo post será quando a migração estiver completa, reportando tudo o que aconteceu.

até!

Aplicação usando Shoes

July 04, 2008 at 09:00

Criei ontem de noite um aplicação de teste para traduzir palavras/frases usando Ruby, Shoes e Google AJAX Language API, ela é bem simples, não tem nada que não foi feito por aí, mas futuramente vou colocar a opção de salvar outras palavras/frases em um banco de dados local, usando SQLite provavelmente, já que estou reforcando meus estudos em inglês, acho que isto vai me ajudar bastante ;)

Mas nem tudo são flores nessa vida de programador, passei um trabalhinho para poder rodar o Shoes com as gems que eu usei, ele não funciona com gems instaladas usando gem install, por que ele tem uma espécie de "interpretador" próprio ou coisa parecida. Depois de instalar o Shoes tive que colocar as gems (json, rest-client) e a lib rexml dentro da Shoes-land - como vi uns chamando por ai.

Fiz um passo a passo de como rodar. Isso também serve para outras apps feitas usando Shoes que você queira rodar, não apenas para este projeto.

Copie as gems/libs - verifique antes se os diretórios são os mesmos

json - usei json_pure por que a outra é nativa, então não sei se funcionaria

sudo cp -R /usr/lib/ruby/gems/1.8/gems/json_pure-1.1.2/lib/json* /usr/local/lib/shoes/ruby/lib/
    

rest-client

sudo cp /usr/lib/ruby/gems/1.8/gems/rest-client-0.5.1/lib/* /usr/local/lib/shoes/ruby/lib/
    

rexml

sudo cp -R /usr/lib/ruby/1.8/rexml /usr/local/lib/shoes/ruby/lib/
    

Feito isso, clone o projeto

git clone git://github.com/rafaelss/shoes-translator.git
    

e quando terminar execute

cd shoes-translator
    shoes translator.rb
    

Tirando as Teias

May 12, 2008 at 13:11

É, deixei esse blog meio abandonado, mas foi por uma boa causa, últimamente os dias andam corrido para mim, ainda estou finalizando a construção da minha casa, então tem dias que não consigo fazer mais nada além de pintar paredes, marcos e janelas, o que faz com que eu tenha que deixar algumas coisas meio de lado.

Semana passada também tive que organizar meu note para instalar um Linux nele, tentei primeiro o Kubuntu com KDE4 mas não rolou, não consegui fazer funcionar o modem da Claro 3G, então depois de horas resolvi instalar o Ubuntu mesmo, funcionou muito melhor e não precisei perder tantas horas para funcionar a internet.

E tudo isso por causa de um novo projeto que vou começar a desenvolver com mais dois amigos meu, esse projeto vai usar Ruby, Merb, Git e um monte de outras coisas que eu quero aprender a usar, e para isso, nada melhor que estar com uma distro Linux redondinha rodando.

A partir de agora vou tentar postar coisas relacionadas aos assuntos citados acima, para tentar ajudar mais a comunidade brasileira.

Rubygems na eApps

April 28, 2008 at 00:25

Para hospedar este blog eu contratei a eApps, sabia de alguns blogs que estavam hospedados lá e que eram boas recomendações para mim. Esses dias, tentei instalar o merb no servidor usando a instalação normal, gem install merb, mas o processo acaba assim:


    [root@joeh ~]# gem install merb
    Bulk updating Gem source index for: http://gems.tron.name/gems.rubyforge.org/
    Terminated
    
Achei que poderia ser algum bloqueio por parte deles para a instalação de gems, por isso, como consta ali em cima, a url é um mirror, coloquei na tentativa de tentar burlar esse bloqueio, mas não funcionou. Até que fui atrás para descobrir o problema, e acabei chegando na resposta, como não é necessário para mim ainda ter um servidor mega potente para rodar o blog, contratei o plano mais básico da eApps, mas parece que os 160MB de RAM não são suficientes para o Rubygems :( É, meu primeiro projeto usando Ruby + Merb já começou dando trabalho :D **Update:** Consegui resolver o problema instalando o Rubygems 1.2.0, hoje instalei o rails normalmente.