<?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; Sinatra</title>
	<atom:link href="http://www.tbueno.com/blog/category/sinatra/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>RS on Rails 2010</title>
		<link>http://www.tbueno.com/blog/sinatra/2010/08/rs-on-rails-2010/</link>
		<comments>http://www.tbueno.com/blog/sinatra/2010/08/rs-on-rails-2010/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 03:02:44 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Rack]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=332</guid>
		<description><![CDATA[O RS on Rails desse ano foi um sucesso absoluto. Auditório com ótima ocupação, palestras inspiradas e lightning talks interessantes marcaram esta segunda edição do evento. Deixo aqui meus agradecimentos aos organizadores e ao público presente. Abaixo, segue minha apresentação sobre aplicações Rack. Aplicações Rack &#8211; RS on Rails 2010 View more presentations from thibusil.]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.rsrails.com.br/">RS on Rails</a> desse ano foi um sucesso absoluto. Auditório com ótima ocupação, palestras inspiradas e <em>lightning talks</em> interessantes marcaram esta segunda edição do evento.</p>
<p>Deixo aqui meus agradecimentos aos organizadores e ao público presente. Abaixo, segue minha apresentação sobre aplicações Rack.</p>
<div style="width:425px" id="__ss_5042732"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/thibusil/rack-rs-on-rails" title="Aplicações Rack - RS on Rails 2010">Aplicações Rack &#8211; RS on Rails 2010</a></strong><object id="__sse5042732" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rack-rsonrails-100823210931-phpapp02&#038;stripped_title=rack-rs-on-rails" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5042732" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rack-rsonrails-100823210931-phpapp02&#038;stripped_title=rack-rs-on-rails" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thibusil">thibusil</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/sinatra/2010/08/rs-on-rails-2010/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>Criando Uma Página Pessoal com Sinatra, Haml e Sass</title>
		<link>http://www.tbueno.com/blog/sinatra/2009/02/criando-uma-pagina-pessoal-com-sinatra-haml-e-sass/</link>
		<comments>http://www.tbueno.com/blog/sinatra/2009/02/criando-uma-pagina-pessoal-com-sinatra-haml-e-sass/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 03:40:42 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Haml]]></category>
		<category><![CDATA[Sass]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=63</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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.</p>
<p>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.</p>
<h2>APIs Diversas: Flickr, Twitter, Last.Fm em Ruby</h2>
<p><a href="http://www.tbueno.com/blog/scraping/2009/02/extendendo-apis-com-scraping/">Como já foi dito antes</a>, 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.</p>
<p>As APIs e suas respectivas gems utilizadas estão listadas abaixo:</p>
<p>Flickr &#8211; <a href="http://www.commonthread.com/projects/flickr_fu/rdoc/">flickr-fu</a><br />
Twitter – <a href="http://twitter.rubyforge.org/">Ruby Twitter</a><br />
Gravatar – Sem gem, mas de uso simples com Ruby.<br />
Last.fm – <a href="http://scrobbler.rubyforge.org/">Scrobbler</a></p>
<h2><a href="http://www.sinatrarb.com/"><img class="alignleft" title="sinatra" src="http://www.tbueno.com/blog/wp-content/uploads/2009/02/sinatra.gif" alt="" /></a></h2>
<p>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.</p>
<h2>Sinatra</h2>
<p><a href="http://www.sinatrarb.com/">Sinatra</a> é 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:</p>
<pre class="brush: ruby">require 'rubygems'
require 'sinatra'
get '/hi' do
  "Hello World!"
end</pre>
<p>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:</p>
<p><span id="more-63"></span></p>
<pre class="brush: ruby">require 'rubygems'
require 'sinatra'
require 'twitter'
require 'flickr_fu'
require 'scrobbler'
require 'MD5'

  get '/style.css' do
    content_type 'text/css', :charset =&gt; 'utf-8'
    #Generate CSS file from SASS
    sass :style
  end

  get '/' do
    #Get messages from twitter search API
    @twitter_messages = Twitter::Search.new.from('tbueno')
    #Call private method flickr sending my id
    @photos = flickr('93129732@N00')
    #get recent tracks from Last.fm
    @tracks = Scrobbler::User.new('tbueno').recent_tracks
    #Get public user's avatar from gravatar.com
    @avatar = gravatar('tbueno@gmail.com')
    #Call views/index.haml
    haml :index
  end

  private
  #Get public user's avatar from gravatar.com
  def gravatar(email)
    hash = MD5::md5(email)
    image_src = "http://www.gravatar.com/avatar/#{hash}"
  end 

  #Read Flickr API token from YAML file and look for the last 20 photos
  def flickr(id)
    flickr = Flickr.new(File.dirname(__FILE__) + '/conf/flickr.yml')
    flickr.photos.search(:user_id =&gt; id, 'per_page' =&gt; 20)
  end</pre>
<p>É importante seguir o padrão de diretórios do Sinatra:<br />
Egotrip<br />
- views<br />
&#8211;index.haml<br />
&#8211;style.sass<br />
egotrip.rb</p>
<p>Com isso, já temos nossas informações prontas. Precisamos então configurar a estrutura da nossa página.</p>
<p>O Sinatra já possui um suporte inteligente a diferentes templates, como o Haml. Aí eu achei mais uma oportunidade de aprendizado. Por que não colocar o Haml na jogada?</p>
<h2>Haml</h2>
<p><a href="http://haml.hamptoncatlin.com/"></a><a href="http://www.tbueno.com/blog/wp-content/uploads/2009/02/haml.jpg"><img class="alignleft size-full wp-image-73" title="haml" src="http://www.tbueno.com/blog/wp-content/uploads/2009/02/haml.jpg" alt="haml" width="166" height="143" /></a>Haml é uma alternativa ao largamente usado RHTML, aonde a proposta consistem em escrever templates de maneiras mais sucintas, evitando repetições, através de recursos interessantes como a substituição de abertura e fechamento de tags por identações, por exemplo.</p>
<p>Não entrarei muito a fundo sobre o funcionamento e sintaxe do Haml, pois a documentação oficial já é completa o suficiente, porém algumas observações são importantes para o entendimento do código a seguir.</p>
<ul>
<li>“%” são usados antes de tags oficiais de HTML (p, head, title, &#8230;)</li>
<li> “#” representam DIVs. A linha “#foo Hello!”gerará o código:</li>
<li><code>&lt; div id="foo"&gt;Hello! &lt;/div&gt;<!-- div--></code></li>
<li>“-“ serve para usar código ruby, equivalente ao “&lt;%”</li>
<li>“=” por sua vez é a alternativa ao “&lt;%=” do rhtml.</li>
</ul>
<p>O código da página é simples, apenas distribuindo o conteúdo em alguns divs:</p>
<pre>%html
  %head
    %title Egotrip
    %meta{"http-equiv" =&gt; "Content-Type", :content=&gt;"text/html; charset=UTF-8"}
    %link{:rel =&gt; 'stylesheet', :type =&gt;'text/css', :href =&gt; 'style.css' }
  %body
    #content
      #header
        %h1 Welcome to Egotrip
        %p
          %image{:src =&gt;@avatar, :align =&gt; 'left'}
        %p
          My name is Thiago Bueno Silva
        %p I am 25-years old
        %p and i am currently living in Brazil.
        %p Thanks for visiting me!
      #main
        %h2 My Photos
        - @photos.each do |photo|
          %image{:src =&gt; photo.url(:square) }
        %hr
        %h2 What i have been listening to:
        - @tracks.each do |track|
          %p= "#{track.name} - #{track.artist}"
      #right-column
        %h2 My Twitter
        - @twitter_messages.each do |m|
          %p= m.text
      #footer
        %p Egotrip - Thiago Bueno Silva - 2009</pre>
<p>Alem disso, do mesmo pessoal que mantém o Haml, vem o Sass, que é o equivalente do CSS ao que o Haml é ao RHTML. Como é em Ruby também, por que não usá-lo no nosso experimento?</p>
<h2>Sass</h2>
<p>Não falarei muito sobre o <a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html">SASS</a>, apenas colocarei abaixo o conjunto de descrições CSS descritos na maneira SASS de se expressa. É uma simples adaptação das regras do CSS.</p>
<pre>body
  :background-color #2E2922
#content
  :font-family 'Lucida Grande'
  :font-size 11px
  :margin 25px
#header
  :color #B39E81
#main
  :float left
  :width 600px
  :margin 0
  :margin-bottom 10px
  :background-color #807A73
  :border 5px solid #333
  :padding 25px
#right-column
  :float left
  :width 300px
  :margin 0
  :margin-bottom 10px
  :margin-left 10px
  :background-color #B39E81
  :border 5px solid #333
  :padding 25px
#footer
  :clear both</pre>
<h2>Screenshot e Melhorias Futuras</h2>
<p>Com esses três arquivos, já temos uma página inteira com informações pessoais coletadas através de APIs. A versão usada nesse exemplo pode ser vista nesse screenshot abaixo:</p>
<p><a href="http://www.tbueno.com/blog/wp-content/uploads/2009/02/egotrip.png"><img class="aligncenter size-medium wp-image-69" title="egotrip" src="http://www.tbueno.com/blog/wp-content/uploads/2009/02/egotrip-300x240.png" alt="egotrip" width="300" height="240" /></a></p>
<p>Como melhorias futuras, posso citar um controle de caching para que não seja necessário buscar todas as informações  a cada atualização de página e um controle de informações através de arquivos de configuração. Mas como exemplo prático do uso do Sinatra, Haml e Sass já mais que o suficiente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/sinatra/2009/02/criando-uma-pagina-pessoal-com-sinatra-haml-e-sass/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
