<?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>Wagner Andrade &#187; Snapshot</title>
	<atom:link href="http://www.wagnerandrade.com/blog/category/snapshot/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wagnerandrade.com/blog</link>
	<description>Simplificando a WEB</description>
	<lastBuildDate>Sun, 18 Oct 2009 05:58:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ruby Snapshot #6: Imagens do momento</title>
		<link>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/</link>
		<comments>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 14:46:47 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Imagens]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=66</guid>
		<description><![CDATA[Estou voltando depois de muito tempo sem escrever. Dei aula à noite durante dois meses e isso me exigiu uma atenção especial. E nada melhor do que voltar com Ruby!
Como vocês já devem ter percebido adoro scripts. Gosto de  automatizar algumas tarefas que costumo realizar varias vezes ao dia.
As vezes vou até a página da [...]]]></description>
			<content:encoded><![CDATA[<p>Estou voltando depois de muito tempo sem escrever. Dei aula à noite durante dois meses e isso me exigiu uma atenção especial. E nada melhor do que voltar com Ruby!</p>
<p>Como vocês já devem ter percebido adoro scripts. Gosto de  automatizar algumas tarefas que costumo realizar varias vezes ao dia.</p>
<p>As vezes vou até a página da <a href="http://www.globo.com">Globo.com</a> ver o que está acontecendo no mundo. Mas tem muita informação na tela pra quem só corre o olho &#8211; e metade é Big Brother (pelo menos quando escrevi isso).</p>
<p>Para me ajudar fiz um script que resume a página da Globo.com pegando apenas suas imagens. Como sempre faço primeiro vou colocar o script e depois explico:</p>
<p><script src="http://gist.github.com/149258.js"></script></p>
<p>Primeiramente percebe-se que utilizei o <a href="http://wiki.github.com/why/hpricot">Hpricot</a> para fazer parse do HTML. Excelente, diga-se. A variável <em>html</em> serve para concatenar o HTML que o script vai gerar.</p>
<p>Na linha 8 faço uma leitura na página <a href="http://www.globo.com">Globo.com</a>, utilizo <a href="http://wiki.github.com/why/hpricot">Hpricot</a> e <a href="http://www.ensta.fr/~diam/ruby/online/ruby-stdlib-0.10.1/stdlib/libdoc/open-uri/rdoc/index.html">open-uri</a> para isso. Na linha 10 busco todas as imagens da página. Na linha 11 faço uma verificação na url da imagem para ver se é absoluta (<em>http://www.globo.com/imagem.jpg</em>) ou relativa (<em>/imagem.jpg</em>), transformando todas em urls absolutas para serem visualizadas de fora do servidor da Globo.</p>
<p>Finalizo o HTML que geramos e na linha 17 salvo em um arquivo chamado &#8220;Agora.html&#8221;. Quem está utilizando o Windows pode descomentar a linha 19, para abrir o Internet Explorer (<strong>Eca!</strong>) com esse arquivo.</p>
<p><strong>Você pode, facilmente, alterar o script e buscar as imagens de outro portal</strong>, como o <a href="http://www.terra.com.br/">Terra</a>, por exemplo. Modifique e comente&#8230; Até mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2009/07/ruby-snapshot-6-imagens-do-momento/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #5: Cronometro de código</title>
		<link>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 14:02:43 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=21</guid>
		<description><![CDATA[Não é muito difícil de perceber que estou um pouco afastado do blog nas ultimas semanas. O motivo é sempre o mesmo: falta de tempo. Pra dizer a verdade acho essa uma desculpa esfarrapada, mas como a maioria dos seres humanos, gosto de utilizá-la.
Para retomar os artigos de códigos rápidos e úteis &#8211; nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Não é muito difícil de perceber que estou um pouco afastado do blog nas ultimas semanas. O motivo é sempre o mesmo: falta de tempo. Pra dizer a verdade acho essa uma desculpa esfarrapada, mas como a maioria dos seres humanos, gosto de utilizá-la.</p>
<p>Para retomar os artigos de códigos rápidos e úteis &#8211; <a href="http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-3-faca-o-mac-ler-rss-literalmente/">nem sempre tão úteis</a> &#8211; utilizando Ruby (<a href="http://www.wagnerandrade.com/blog/category/snapshot/">os Snapshots</a>) vou mostrar como fazer um &#8220;cronometro&#8221; de código. Calma, vou explicar melhor.</p>
<p><strong>Antes de iniciar quero lembrar a existência do modulo <a href="http://apidock.com/ruby/Benchmark">Benchmark</a>, que é o mais indicado a ser utilizado neste caso.</strong> Levamos em conta então que esse post servirá apenas para estudo.</p>
<p>Muitas vezes quero saber quanto tempo um determinado trecho de código leva para ser executado, assim posso fazer otimizações bem focadas em determinadas linhas.</p>
<p>Ruby é uma linguagem que torna simples a manipulação de blocos de código, por isso criaremos um método que receberá um determinado código que alem de executar essas instruções passadas dirá quanto tempo levou para fazer isso. Seu funcionamento é bem simples, mostrando apenas o tempo real que o código levou para ser executado, não é 100% preciso, mas em linhas gerais é bem eficiente. Segue o método:</p>
<p><script src="http://gist.github.com/13174.js"></script></p>
<p>Primeiro ele verifica se foi passado o bloco de código que vai ser &#8220;analisado&#8221;. Em seguida o tempo inicial é armazenado, o código é executado (yield) e por fim diminui-se o tempo inicial do tempo no momento em que o código termina de ser executado. É impresso na tela a identificação do teste (para os casos de haver mais de um) junto com o tempo que o código levou para ser executado, em segundos.</p>
<p>Para testar o método usei o <a href="http://apidock.com/ruby/Kernel/sleep">sleep</a>, que faz uma interrupção no código durante um determinado tempo, no caso 318 milissegundos. Ao rodar esse teste é possível notar que nunca dá 318 milissegundos no bechmark. Isso porque os métodos sleep e o bechmark não são exatos.</p>
<p>É possível fazer diversas melhorias nesse método, o que é um bom exercício para estudar a linguagem. Qualquer sugestão é bem vinda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/11/ruby-snapshot-5-cronometro-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #4: Conectando no orkut / Google</title>
		<link>http://www.wagnerandrade.com/blog/2008/08/ruby-snapshot-4-conectando-no-orkut-google/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/08/ruby-snapshot-4-conectando-no-orkut-google/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 18:51:31 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[orkut]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=17</guid>
		<description><![CDATA[Sempre gostei da web &#8220;por dentro&#8221;, para ser mais especifico, dos protocolos e por conseqüência das conexões e portas. Gosto de entender como as coisas funcionam. Um tempo atrás eu estava intrigado com o login do orkut, queria entender como o Google tratava a autenticação de um serviço. Comecei a analisar os requests com o [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre gostei da web &#8220;por dentro&#8221;, para ser mais especifico, dos protocolos e por conseqüência das conexões e portas. Gosto de entender como as coisas funcionam. Um tempo atrás eu estava intrigado com o login do orkut, queria entender como o Google tratava a autenticação de um serviço. Comecei a analisar os requests com o <a href="http://getfirebug.com/">Firebug</a> e até sniffer (<a title="Wireshark: Go deep." href="http://www.wireshark.org/">Wireshark</a>). Depois de bastante insistência consegui construir um script que fazia login no orkut, fazendo autenticação no Google. Depois de um baita esforço eu fui descobrir que o Google disponibiliza uma <a href="http://code.google.com/apis/accounts/">documentação</a> sobre autenticação em sua base &#8211; mais uma lição: procure antes.</p>
<p>O <a href="http://www.wagnerandrade.com/blog/category/snapshot/">Ruby Snapshot</a> de hoje é sobre isso: <strong>como conectar no orkut com um script Ruby?</strong> Abaixo do código vou explicar o que fiz. Vale lembrar que essa não é a melhor implementação &#8211; construir um objeto seria a melhor -, mas esse não é o objetivo do Snapshot, aqui são códigos curtos com grandes funcionalidades.<a href="http://gist.github.com/4597"> </a></p>
<p><script src="http://gist.github.com/4597.js"></script></p>
<p>Vejam que o código está organizado em seis blocos separados por uma linha em branco. No primeiro coloco os &#8220;requires&#8221; necessários para fazer os requests ao orkut e Google. Vou usar a forma segura de autenticação (HTTPS). No segundo bloco crio duas variáveis, nome do usuário e senha da conta no Google. Até aí, nada de mais.</p>
<p>No terceiro bloco crio um objeto <a href="http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html">Net::HTTP</a> para o host <em>www.google.com </em>na porta padrão para HTTPS, <em>443</em>. Depois atribuo valores relativo ao tipo de conexão segura (SSL). Agora vem uma parte importante, é necessário pegar o <em>token </em>de autenticação no Google, é uma chave que será usada para acessar o orkut &#8211; a &#8220;prova da autenticação sucedida&#8221;. Para pegá-la faço um request à <em>/accounts/ClientLogin</em> passando usuário, senha e o nome do serviço que quero fazer login, nesse caso, o orkut. Faço um tratamento com o retorno do request e coloco dentro da variável <em>auth</em>.</p>
<p>Agora vamos ao orkut, no quarto bloco. Crio um objeto HTTP para o host <em>www.orkut.com </em>e faço um request em <em>/RedirLogin.aspx</em>, passando a chave de autenticação que recebi do Google. Do retorno do request, pego o cabeçalho HTTP <em>set-cookie</em>. Esse cabeçalho solicita ao navegador &#8211; no nosso caso, script &#8211; que há um novo valor de cookie para armazenar. Esse cookie é muito importante, ele armazena a chave das nossas informações no servidor do orkut, a famosa chave de sessão.</p>
<p>Já estou logado no orkut! Agora só preciso fazer um request à qualquer página interna que terei seu conteúdo como retorno &#8211; só não esqueça do cookie. No exemplo faço um request à pagina inicial do usuário, mas poderia ser um outro perfil, comunidade e até uma busca no conteúdo do orkut. Depois salvo o resultado em um arquivo HTML, é só abrir no browser pra conferir.</p>
<p>Com poucas modificações é possível fazer login em outros serviços do Google, como GMail por exemplo.</p>
<p>Agora você pode conferir aquele perfil que é proibido pela patroa e ainda dizer que está programando!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/08/ruby-snapshot-4-conectando-no-orkut-google/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #3: Faça o Mac ler RSS &#8211; Literalmente!</title>
		<link>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-3-faca-o-mac-ler-rss-literalmente/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-3-faca-o-mac-ler-rss-literalmente/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 02:25:09 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=11</guid>
		<description><![CDATA[Aproveitando a onda do Mac cantar, dessa vez vou dar uma dica pra quem tem um computador do tio Jobs. Mas com poucas modificações pode-se usar o script de outra forma em qualquer outro sistema operacional.
Vou mostrar como, em poucas linhas &#8211; o objetivo do Ruby Snapshot é esse -, posso ler um RSS, ou [...]]]></description>
			<content:encoded><![CDATA[<p>Aproveitando a onda do <a title="Mac cantar" href="http://feeds.feedburner.com/~r/blogmacmagazine/~3/321478030/">Mac cantar</a>, dessa vez vou dar uma dica pra quem tem um computador do tio Jobs. Mas com poucas modificações pode-se usar o script de outra forma em qualquer outro sistema operacional.</p>
<p>Vou mostrar como, em poucas linhas &#8211; o objetivo do Ruby Snapshot é esse -, posso ler um RSS, ou melhor, como o Mac OS X pode ler pra mim. Segue:</p>
<pre>require 'rss/1.0'
require 'rss/2.0'
require 'open-uri'

content = ''
open('http://twitter.com/statuses/user_timeline/peepcode.rss').each { |i| content &lt;&lt; i }
RSS::Parser.parse(content).items.each { |i| system "say \"#{i.title}\"" }</pre>
<p>É bem simples, primeiro pego o conteúdo, neste caso o RSS do Twitter do Peepcode (Basta mudar o endereço para ler outro RSS). Em seguida converto o conteúdo na estrutura de RSS, mais precisamente no método <em>parse</em>. Depois, para cada item do RSS, utilizo o método <em>system</em> que envia comandos ao terminal ou console do SO. Neste caso estou enviando o comando <em>say</em> &#8211; que faz o Mac falar &#8211; com o titulo do item.</p>
<p>Vale lembrar que o Mac fala em inglês, fica bastante estranho se colocar um RSS com conteúdo em português. E novamente, aproveitando a onda do Mac cantar, substitua o <em>say </em>por <em>say -v Good</em>, aí sim ele vai cantar. É divertido, completamente fora do ritmo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-3-faca-o-mac-ler-rss-literalmente/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #2: Usando ActiveRecord fora do Rails</title>
		<link>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-2-usando-activerecord-fora-do-rails/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-2-usando-activerecord-fora-do-rails/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 14:08:28 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Active Record]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=10</guid>
		<description><![CDATA[Pra quem não sabe, o ActiveRecord é um dos frameworks que acompanham o Rails, pode-se ter ele individualmente inclusive. Toda aquela &#8220;mágica&#8221; &#8211; metaprogramação para ser mais exato &#8211; de mapeamento automático das tabelas e colunas de banco é feita por esse framework. E se eu quiser usar toda essa funcionalidade fora do Rails? Muito [...]]]></description>
			<content:encoded><![CDATA[<p>Pra quem não sabe, o ActiveRecord é um dos frameworks que acompanham o Rails, pode-se ter ele individualmente inclusive. Toda aquela &#8220;mágica&#8221; &#8211; metaprogramação para ser mais exato &#8211; de mapeamento automático das tabelas e colunas de banco é feita por esse framework. E se eu quiser usar toda essa funcionalidade fora do Rails? Muito simples!</p>
<pre>require 'activerecord'

ActiveRecord::Base.establish_connection :adapter =&gt; 'sqlite3', :database =&gt; 'blog.sqlite3'

class Post &lt; ActiveRecord::Base; end

f = File.new 'posts.xml', 'w'
f &lt;&lt; Post.find(:all).to_xml
f.close</pre>
<p>O que eu fiz aí foi conectar no banco SQLite &#8211; <em>blog.sqlite3 </em>-, criar uma classe que representa a tabela <em>Posts</em>, criar um arquivo xml &#8211; <em>posts.xml</em> &#8211; e fazer uma consulta à tabela <em>Posts</em> transformando o resultado em XML e escrevendo isso no arquivo. Percebam que fechei o arquivo no fim, nunca esqueçam disso &#8211; o mais correto seria criar um tratamento de erro, mas esse não é o objetivo deste Snapshot.</p>
<p>A questão da pluralização é feita pelo ActiveRecord, portanto deve-se levar isso em consideração ao mapear a classe. Pluralização: O fato da classe ser <em>Post</em> e a tabela ser <em>Posts</em>. Pra que Pluralização? A classe representa uma única entidade, enquanto a tabela &#8220;guarda&#8221; todas. Vou parar por aqui que esse também não é o objetivo desta vez.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/06/ruby-snapshot-2-usando-activerecord-fora-do-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby Snapshot #1</title>
		<link>http://www.wagnerandrade.com/blog/2008/05/ruby-snapshot-1/</link>
		<comments>http://www.wagnerandrade.com/blog/2008/05/ruby-snapshot-1/#comments</comments>
		<pubDate>Tue, 27 May 2008 16:22:17 +0000</pubDate>
		<dc:creator>Wagner Andrade</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snapshot]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hpricot]]></category>
		<category><![CDATA[Tradutor]]></category>

		<guid isPermaLink="false">http://www.wagnerandrade.com/blog/?p=7</guid>
		<description><![CDATA[Este é o primeiro post de uma serie chamada Ruby Snapshot. O objetivo desta serie é mostrar grandes soluções com poucas linhas de código Ruby. Quem quiser mandar um snapshot será muito bem vindo.
Para começar quero colocar um script que me quebra vários galhos, serve para traduzir uma palavra, frase ou texto de um idioma [...]]]></description>
			<content:encoded><![CDATA[<p>Este é o primeiro post de uma serie chamada Ruby Snapshot. O objetivo desta serie é mostrar grandes soluções com poucas linhas de código Ruby. <strong>Quem quiser mandar um snapshot será muito bem vindo</strong>.</p>
<p>Para começar quero colocar um script que me quebra vários galhos, serve para traduzir uma palavra, frase ou texto de um idioma para outro, através do Google Translate. Nesse script estou utilizado a gem <a title="Hpricot" href="http://code.whytheluckystiff.net/hpricot/" target="_blank">Hpricot</a>, que faz parse de HTML, recomendo!</p>
<pre>require 'net/http'
require 'hpricot'

html = Net::HTTP.new('translate.google.com').post('/translate_t', "langpair=en|pt&amp;text=#{ARGV[0]}").body
puts Hpricot(html).at('#result_box').inner_text</pre>
<p>Explicando: primeiro um post na página do Google Translate, passando como parâmetro o <em>langpair </em>e o texto a ser traduzido, que passo como parametro de console. O exemplo mostra uma tradução de inglês para português, mas é bem fácil alterar mudando o parâmetro do post: <em>langpair</em>, neste caso <em>en|pt</em> (English to Portuguese).</p>
<p>Depois, utilizando a gem Hpricot, faço um parse no HTML de resultado do post, pegando o trecho do resultado (o conteúdo de uma div com id <em>result_box</em>) e exibo no console.</p>
<p>Salvando esse script com o nome <em>traduza.rb</em>, por exemplo, o resultado seria o seguinte:</p>
<pre>&gt;&gt; traduza.rb "Hello World!"
=&gt; Olá Mundo!</pre>
<p>Simples, fácil e útil. Adapte e use na sua aplicação Rails!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wagnerandrade.com/blog/2008/05/ruby-snapshot-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
