<?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"
	>

<channel>
	<title>HashCode</title>
	<atom:link href="http://www.hashcode.eti.br/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.hashcode.eti.br</link>
	<description>An organizer of symbols</description>
	<pubDate>Wed, 09 Dec 2009 12:13:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Pixily hiring RoR guy</title>
		<link>http://www.hashcode.eti.br/?p=253</link>
		<comments>http://www.hashcode.eti.br/?p=253#comments</comments>
		<pubDate>Wed, 09 Dec 2009 12:13:51 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=253</guid>
		<description><![CDATA[Pixily hiring RoR guy
]]></description>
			<content:encoded><![CDATA[<p><a href="http://gist.github.com/252431">Pixily hiring RoR guy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=253</wfw:commentRss>
		</item>
		<item>
		<title>Quando o RAID não funciona</title>
		<link>http://www.hashcode.eti.br/?p=250</link>
		<comments>http://www.hashcode.eti.br/?p=250#comments</comments>
		<pubDate>Thu, 03 Dec 2009 12:33:53 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=250</guid>
		<description><![CDATA[Ok esse não era pra ser o primeiro post do ano de 2009 mas o &#8220;RAID&#8221; do meu antigo provedor(que era cortesia) deu pau. 


Como diria o velho ditado modificado &#8220;na casa do espeto o churrasqueiro é de pau&#8221; eu tinha um script na cron fazendo backup diário mas o que eu não tinha percebido [...]]]></description>
			<content:encoded><![CDATA[<p>Ok esse não era pra ser o primeiro post do ano de 2009 mas o &#8220;RAID&#8221; do meu antigo provedor(que era cortesia) deu pau. </p>
<p><center><br />
<a href="http://www.hashcode.eti.br/wp-content/uploads/2009/12/raidcannotrebuild.png"><img src="http://www.hashcode.eti.br/wp-content/uploads/2009/12/raidcannotrebuild.png" alt="" title="raidcannotrebuild" width="479" height="232" class="aligncenter size-full wp-image-251" /></a></center></p>
<p>Como diria o velho ditado modificado &#8220;na casa do espeto o churrasqueiro é de pau&#8221; eu tinha um script na cron fazendo backup diário mas o que eu não tinha percebido era que minha chave publica tinha sido modificada <img src='http://www.hashcode.eti.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . </p>
<p>Recebi alguns emails de pessoas querendo acessar alguns links então acho que esse blog pode ser de certo modo útil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=250</wfw:commentRss>
		</item>
		<item>
		<title>Diário de um desenvolvedor by Daft Punk</title>
		<link>http://www.hashcode.eti.br/?p=245</link>
		<comments>http://www.hashcode.eti.br/?p=245#comments</comments>
		<pubDate>Fri, 16 Jan 2009 11:15:08 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=245</guid>
		<description><![CDATA[Nada mais que a verdade   Só faltou commit it, push it, list it &#8230;


Buy it, use it, break it, fix it,
Trash it, change it, mail - upgrade it,
Charge it, point it, zoom it, press it,
Snap it, work it, quick - erase it,
Write it, cut it, paste it, save it,
Load it, check it, quick [...]]]></description>
			<content:encoded><![CDATA[<p>Nada mais que a verdade <img src='http://www.hashcode.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Só faltou commit it, push it, list it &#8230;</p>
<div align='center' style='text-align: center'>
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/YtdWHFwmd2o&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/YtdWHFwmd2o&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Buy it, use it, break it, fix it,<br />
Trash it, change it, mail - upgrade it,<br />
Charge it, point it, zoom it, press it,<br />
Snap it, work it, quick - erase it,<br />
Write it, cut it, paste it, save it,<br />
Load it, check it, quick - rewrite it,<br />
Plug it, play it, burn it, rip it,<br />
Drag and drop it, zip - unzip it,<br />
Lock it, fill it, call it, find it,<br />
View it, code it, jam - unlock it,<br />
Surf it, scroll it, pause it, click it,<br />
Cross it, crack it, switch - update it,<br />
Name it, rate it, tune it, print it,<br />
Scan it, send it, fax - rename it,<br />
Touch it, bring it, Pay it, watch it,<br />
Turn it, leave it, start - format it.</p>
<h2> Remix </h2>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/_9MCbsdCLhI&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_9MCbsdCLhI&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=245</wfw:commentRss>
		</item>
		<item>
		<title>Instalando RGhost com Debgem no Ubuntu Hardy</title>
		<link>http://www.hashcode.eti.br/?p=240</link>
		<comments>http://www.hashcode.eti.br/?p=240#comments</comments>
		<pubDate>Wed, 07 Jan 2009 13:41:42 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=240</guid>
		<description><![CDATA[Acho que foi ontem que eu vi sobre o projeto DebGem dos caras da Phusion. O projeto consiste em portar uma gem para um pacote .deb. Fui testar achando que iria dar o maior pau mas eu estava errado, funcionou plug&#8217;n'play. O que eu fiz foi basicamente descrito abaixo.
Configurando o apt-get 
Configurei o novo source [...]]]></description>
			<content:encoded><![CDATA[<p>Acho que foi ontem que eu vi sobre o projeto <a href="http://www.debgem.com">DebGem</a> dos caras da <a href="http://www.phusion.nl/">Phusion</a>. O projeto consiste em portar uma gem para um pacote .deb. Fui testar achando que iria dar o maior pau mas eu estava errado, funcionou plug&#8217;n'play. O que eu fiz foi basicamente descrito abaixo.</p>
<h3>Configurando o apt-get </h3>
<p>Configurei o novo source para o apt-get colocando no arquivo /etc/apt/source.list a nova entrada</p>
<pre>
 deb http://www.debgem.com/apt ubuntu-8.04 rubyforge
</pre>
<p>No shell adicionei a nova chave</p>
<pre>
wget -q http://www.debgem.com/apt/debgem.gpg -O- | sudo apt-key add -
</pre>
<p>e por fim, atualizei o apt-get </p>
<pre>
sudo apt-get update
</pre>
<p>Tudo isso está bem documentado <a href="http://www.debgem.com/usage">aqui</a></p>
<h3> Obtendo o nome do pacote </h3>
<p>Entre no site <a href="http://www.debgem.com/usage">http://www.debgem.com/usage</a> e digite o nome da gem, no nosso caso &#8216;rghost&#8217;, aparecerá uma página com o nome e a descrição da gem</p>
<p><a href="http://www.hashcode.eti.br/wp-content/uploads/2009/01/rghost_debgem.png"><img src="http://www.hashcode.eti.br/wp-content/uploads/2009/01/rghost_debgem.png" alt="" title="rghost_debgem" width="500" height="279" class="alignnone size-full wp-image-241" /></a></p>
<p>Observe a linha <b>Install command  	apt-get install librghost-ruby </b>, instale com </p>
<pre>
sudo apt-get install librghost-ruby
</pre>
<h3> Testando </h3>
<p>Abra o irb ou crie um arquivo para testar </p>
<pre>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rghost</span><span class="punct">'</span>

<span class="constant">RGhost</span><span class="punct">::</span><span class="constant">Config</span><span class="punct">.</span><span class="ident">is_ok?</span> <span class="symbol">:render</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">/tmp/test.pdf</span><span class="punct">&quot;</span>

`<span class="ident">evince</span> <span class="punct">/</span><span class="ident">tmp</span><span class="punct">/</span><span class="ident">test</span><span class="punct">.</span><span class="ident">pdf`</span>
</pre>
<h3> Conclusão</h3>
<p>Perfeito! Não há nada que reclamar <img src='http://www.hashcode.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=240</wfw:commentRss>
		</item>
		<item>
		<title>IRB com reverse search no Apple Terminal</title>
		<link>http://www.hashcode.eti.br/?p=237</link>
		<comments>http://www.hashcode.eti.br/?p=237#comments</comments>
		<pubDate>Sat, 03 Jan 2009 15:17:19 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=237</guid>
		<description><![CDATA[Após muitas tentativa achei uma solução plausível, agora o meu irb aceita Ctrl+R. Solução simples
Edite o ~/.editrc e cole  

bind "^R" em-inc-search-prev

Que saudade do gnome-terminal &#8230;
]]></description>
			<content:encoded><![CDATA[<p>Após muitas tentativa achei uma solução plausível, agora o meu irb aceita Ctrl+R. Solução simples<br />
Edite o ~/.editrc e cole  </p>
<pre>
bind "^R" em-inc-search-prev
</pre>
<p>Que saudade do gnome-terminal &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=237</wfw:commentRss>
		</item>
		<item>
		<title>RGhost Barcode no Github</title>
		<link>http://www.hashcode.eti.br/?p=235</link>
		<comments>http://www.hashcode.eti.br/?p=235#comments</comments>
		<pubDate>Mon, 29 Dec 2008 19:36:55 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[RGhost]]></category>

		<category><![CDATA[RGhost Barcode]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=235</guid>
		<description><![CDATA[Onde posso encontrar 32 tipos de código de barras, de graça? Tenho que gerar em PDF ou imagens?
A solução está aqui no GitHub RGhost Barcode
Poli-hashcode sempre uma solução para salvar sua vida. 
]]></description>
			<content:encoded><![CDATA[<p>Onde posso encontrar 32 tipos de código de barras, de graça? Tenho que gerar em PDF ou imagens?</p>
<p>A solução está aqui no GitHub <a href="http://github.com/shairontoledo/rghost-barcode/wikis">RGhost Barcode</a></p>
<p>Poli-hashcode sempre uma solução para salvar sua vida. <img src='http://www.hashcode.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=235</wfw:commentRss>
		</item>
		<item>
		<title>Firulando código em ruby para wordpress</title>
		<link>http://www.hashcode.eti.br/?p=230</link>
		<comments>http://www.hashcode.eti.br/?p=230#comments</comments>
		<pubDate>Mon, 29 Dec 2008 13:00:45 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<category><![CDATA[Plugins]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=230</guid>
		<description><![CDATA[Ultimamente estou recebendo emails me perguntando qual o plugin do WordPress eu uso para deixar o código do meu blog &#8216;bonitinho&#8217;. Já enviei uns 6 emails para pessoas diferentes, já que o pessoal está gostando vou postar a minha solução.
Criei um programinha que chamei de compile_post.rb ele recebe um arquivo texto e formata as tags [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estou recebendo emails me perguntando qual o plugin do WordPress eu uso para deixar o código do meu blog &#8216;bonitinho&#8217;. Já enviei uns 6 emails para pessoas diferentes, já que o pessoal está gostando vou postar a minha solução.</p>
<p>Criei um programinha que chamei de <a href="http://www.hashcode.eti.br/wp-content/uploads/2008/12/compile_post.rb">compile_post.rb</a> ele recebe um arquivo texto e formata as tags <strong>code</strong> para html.</p>
<p>O programa requer as gems hpricot e syntax, para instalar basta</p>
<pre>
sudo gem install hpricot
sudo gem install syntax
</pre>
<p>O conteúdo é esse </p>
<pre>
<span class="comment">#!/usr/bin/ruby</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hpricot</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">syntax/convertors/html</span><span class="punct">'</span>

<span class="ident">convertor</span> <span class="punct">=</span> <span class="constant">Syntax</span><span class="punct">::</span><span class="constant">Convertors</span><span class="punct">::</span><span class="constant">HTML</span><span class="punct">.</span><span class="ident">for_syntax</span> <span class="punct">&quot;</span><span class="string">ruby</span><span class="punct">&quot;</span>
<span class="ident">source</span><span class="punct">=</span><span class="constant">ARGV</span><span class="punct">[</span><span class="number">0</span><span class="punct">]</span>

<span class="ident">abort</span> <span class="punct">&quot;</span><span class="string">usage: ruby compile_post.rb filename.txt</span><span class="punct">&quot;</span> <span class="keyword">unless</span> <span class="ident">source</span>

<span class="ident">doc</span> <span class="punct">=</span> <span class="constant">Hpricot</span><span class="punct">.</span><span class="ident">parse</span><span class="punct">(</span><span class="constant">File</span><span class="punct">.</span><span class="ident">readlines</span><span class="punct">(</span><span class="ident">source</span><span class="punct">).</span><span class="ident">join</span><span class="punct">)</span>
<span class="punct">(</span><span class="ident">doc</span><span class="punct">/&quot;</span><span class="string">code</span><span class="punct">&quot;).</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">c</span><span class="punct">|</span>
   <span class="ident">c</span><span class="punct">.</span><span class="ident">inner_html</span><span class="punct">=</span><span class="ident">convertor</span><span class="punct">.</span><span class="ident">convert</span><span class="punct">(</span><span class="ident">c</span><span class="punct">.</span><span class="ident">to_s</span><span class="punct">.</span><span class="ident">gsub</span><span class="punct">(/</span><span class="regex">&lt;code&gt;|&lt;<span class="escape">\/</span>code&gt;</span><span class="punct">/,'</span><span class="string"></span><span class="punct">'),</span><span class="constant">true</span><span class="punct">)</span>
<span class="keyword">end</span>
<span class="constant">File</span><span class="punct">.</span><span class="ident">open</span><span class="punct">(&quot;</span><span class="string"><span class="expr">#{source}</span>.post</span><span class="punct">&quot;,'</span><span class="string">w</span><span class="punct">'){|</span><span class="ident">f</span><span class="punct">|</span> <span class="ident">f</span><span class="punct">.</span><span class="ident">puts</span> <span class="ident">doc</span><span class="punct">.</span><span class="ident">to_s</span><span class="punct">.</span><span class="ident">gsub</span><span class="punct">(/</span><span class="regex">&lt;code&gt;|&lt;<span class="escape">\/</span>code&gt;</span><span class="punct">/,'</span><span class="string"></span><span class="punct">')</span> <span class="punct">}</span>
</pre>
<p>O programa gerará um arquivo .post é só copiar e colar no post editor do WordPress</p>
<p>Criei também um estilo <a href="http://www.hashcode.eti.br/wp-content/themes/siteground-wp61/mate.css">meia-boca TextMate-like</a>. Não se esqueça de</p>
<pre>
<span class="punct">&lt;</span><span class="ident">link</span> <span class="ident">href</span><span class="punct">=&quot;</span><span class="string">http://yoursite.com/mate.css</span><span class="punct">&quot;</span> <span class="ident">rel</span><span class="punct">=&quot;</span><span class="string">stylesheet</span><span class="punct">&quot;</span> <span class="ident">type</span><span class="punct">=&quot;</span><span class="string">text/css</span><span class="punct">&quot;</span> <span class="ident">media</span><span class="punct">=&quot;</span><span class="string">all</span><span class="punct">&quot;</span> <span class="punct">/&gt;</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=230</wfw:commentRss>
		</item>
		<item>
		<title>ActiveRecord ParseLine no GitHub</title>
		<link>http://www.hashcode.eti.br/?p=228</link>
		<comments>http://www.hashcode.eti.br/?p=228#comments</comments>
		<pubDate>Sun, 28 Dec 2008 17:10:18 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=228</guid>
		<description><![CDATA[ParseLine no GitHub. 
Versão em Português aqui
]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/shairontoledo/parseline/tree/master">ParseLine no GitHub</a>. </p>
<p>Versão em <a href="http://www.hashcode.eti.br/?p=205">Português aqui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=228</wfw:commentRss>
		</item>
		<item>
		<title>RGhost no Github</title>
		<link>http://www.hashcode.eti.br/?p=225</link>
		<comments>http://www.hashcode.eti.br/?p=225#comments</comments>
		<pubDate>Sat, 27 Dec 2008 04:13:12 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[RGhost]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=225</guid>
		<description><![CDATA[Depois de muita enrolação, configuração e formatação acabo de colocar o RGhost no Github, vou manter o código lá e as gems continuarão no Ruby Forge pois no Github não está funcionando direito.  
Criei umas 40 páginas de wiki(em inglês) e prometo(juro) que vou colocar mais exemplos.
Vou tentar migrar o RGhost Barcodes ainda este [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de muita enrolação, configuração e formatação acabo de colocar o <a href="http://github.com/shairontoledo/rghost/wikis">RGhost no Github</a>, vou manter o código lá e as gems continuarão no <a href="http://rghost.rubyforge.org/">Ruby Forge</a> pois no Github não está funcionando direito.  </p>
<p>Criei umas 40 páginas de wiki(em inglês) e prometo(juro) que vou colocar mais exemplos.</p>
<p>Vou tentar migrar o <a href="http://rghost-barcode.rubyforge.org/">RGhost Barcodes</a> ainda este ano(eu acho).</p>
<p>Gostaria de agradecer a toda comunidade nacional e internacional que colaboram dando dicas e reportando bugs. Obrigado a vcs!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=225</wfw:commentRss>
		</item>
		<item>
		<title>Para arquivos offline use a gem Parseline</title>
		<link>http://www.hashcode.eti.br/?p=205</link>
		<comments>http://www.hashcode.eti.br/?p=205#comments</comments>
		<pubDate>Fri, 14 Nov 2008 19:27:33 +0000</pubDate>
		<dc:creator>shairon</dc:creator>
		
		<category><![CDATA[Coisas]]></category>

		<guid isPermaLink="false">http://www.hashcode.eti.br/?p=205</guid>
		<description><![CDATA[Parsear um arquivo texto em Ruby é algo fácil, persistir os dados no banco com Rails é trivial.
Vou demostrar como carregar arquivos csv e arquivos com layout largura fixa no braço, e mais a frente a nova gem Parseline.
Caso 1: Largura fixa
Suponhamos que seja necessário carregar dados de produtos de um arquivo denominado &#8220;data.txt&#8221; com [...]]]></description>
			<content:encoded><![CDATA[<p>Parsear um arquivo texto em Ruby é algo fácil, persistir os dados no banco com Rails é trivial.<br />
Vou demostrar como carregar arquivos csv e arquivos com layout largura fixa no braço, e mais a frente a nova gem Parseline.</p>
<h2>Caso 1: Largura fixa</h2>
<p>Suponhamos que seja necessário carregar dados de produtos de um arquivo denominado &#8220;data.txt&#8221; com o conteúdo</p>
<pre>
000001PRODUTO 1       S 21/11/2008000090.00
000002PRODUTO 2       N 22/11/2008000341.33
000003PRODUTO 3       N 01/11/2008000001.99
000004PRODUTO 4       S 15/11/2008000034.98
000005PRODUTO 5       N 14/11/2008000130.44
000006PRODUTO 6       S 05/11/2008000020.11
</pre>
<p>sendo o layout definido dessa forma:<br />
  - posição 0 até 5 =  código do produto 00221<br />
  - posiçao 6 até 21 =  nome do produto <br />
  - posição 22  =  &#8216;S&#8217; se tem em estoque e &#8216;N&#8217; não tem<br />
  - posição 23  =  reservado para uso futuro <br />
  - posição 24 até 33 =  a data do cadastro<br />
  - posição 34 até 42 =  preço do produto</p>
<p>Nossa tabela/model será <b>Product</b> definida por<br />
</p>
<pre>
<span class="keyword">class </span><span class="class">CreateProducts</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Migration</span>
  <span class="keyword">def </span><span class="method">self.up</span>
    <span class="ident">create_table</span> <span class="symbol">:products</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span>
      <span class="ident">t</span><span class="punct">.</span><span class="ident">integer</span>  <span class="symbol">:code</span>
      <span class="ident">t</span><span class="punct">.</span><span class="ident">string</span>  <span class="symbol">:name</span>
      <span class="ident">t</span><span class="punct">.</span><span class="ident">boolean</span> <span class="symbol">:in_stock</span>
      <span class="ident">t</span><span class="punct">.</span><span class="ident">date</span>    <span class="symbol">:date</span>
      <span class="ident">t</span><span class="punct">.</span><span class="ident">float</span>   <span class="symbol">:price</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">self.down</span>
    <span class="ident">drop_table</span> <span class="symbol">:products</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>
</pre>
<p>Vamos percorrer cada linha do arquivo fazendo parser dos campos, como descrito no layout acima</p>
<pre>
<span class="constant">File</span><span class="punct">.</span><span class="ident">readlines</span><span class="punct">('</span><span class="string">data.txt</span><span class="punct">').</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">line</span><span class="punct">|</span>
  <span class="ident">line</span><span class="punct">.</span><span class="ident">strip!</span> <span class="comment">#retirando caracteres não imprimiveis</span>
  <span class="comment">#definindo os campos</span>
  <span class="ident">code</span>    <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">0</span><span class="punct">..</span><span class="number">5</span><span class="punct">]</span>
  <span class="ident">name</span>    <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">6</span><span class="punct">..</span><span class="number">21</span><span class="punct">].</span><span class="ident">strip</span>
  <span class="ident">in_stock</span>   <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">22</span><span class="punct">..</span><span class="number">22</span><span class="punct">]</span>
  <span class="ident">nothing</span> <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">23</span><span class="punct">..</span><span class="number">23</span><span class="punct">]</span>
  <span class="ident">date</span>    <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">24</span><span class="punct">..</span><span class="number">33</span><span class="punct">]</span>
  <span class="ident">price</span>   <span class="punct">=</span> <span class="ident">line</span><span class="punct">[</span><span class="number">34</span><span class="punct">..</span><span class="number">42</span><span class="punct">]</span>
  <span class="comment">#trantando os dados</span>
  <span class="ident">in_stock</span><span class="punct">=(</span><span class="ident">in_stock</span><span class="punct">=='</span><span class="string">S</span><span class="punct">')</span> <span class="comment">#=&gt; true se 'S', false se 'N'</span>
  <span class="ident">date</span><span class="punct">=</span><span class="ident">date</span><span class="punct">.</span><span class="ident">split</span><span class="punct">(/</span><span class="regex"><span class="escape">\/</span></span><span class="punct">/).</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">join</span><span class="punct">('</span><span class="string">-</span><span class="punct">')</span> <span class="comment">#=&gt; formata data para '2008-11-05'</span>

  <span class="comment">#attribuindo os valores no AR</span>
  <span class="ident">product</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:code</span> <span class="punct">=&gt;</span> <span class="ident">code</span><span class="punct">,</span>
                      <span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="ident">name</span><span class="punct">,</span>
                      <span class="symbol">:in_stock</span> <span class="punct">=&gt;</span> <span class="ident">in_stock</span><span class="punct">,</span>
                      <span class="symbol">:date</span> <span class="punct">=&gt;</span> <span class="ident">date</span><span class="punct">,</span>
                      <span class="symbol">:price</span> <span class="punct">=&gt;</span> <span class="ident">price</span>
  <span class="ident">product</span><span class="punct">.</span><span class="ident">save</span> <span class="comment"># salvando <img src='http://www.hashcode.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />                     </span>

<span class="keyword">end</span>
</pre>
<p>Pronto, tá lá no banco.</p>
<h2>Caso 2: Arquivos CSV</h2>
<p>Arquivos delimitados por um caracter geralmente , ou ;<br />
Esse será o nosso arquivo &#8220;data.csv&#8221; com o conteúdo</p>
<pre>
1;PRODUTO 1;S;;21/11/2008;90.00
2;PRODUTO 2;N;;22/11/2008;341.33
3;PRODUTO 3;N;;01/11/2008;1.99
4;PRODUTO 4;S;;15/11/2008;34.98
5;PRODUTO 5;N;;14/11/2008;130.44
6;PRODUTO 6;S;;05/11/2008;20.11
</pre>
<p>temos o layout para cada linha</p>
<pre>
código do produto;nome;se tem em estoque;*reservado*;data;preço
</pre>
<p>Utilizaremos a mesma migration CreateProducts. Vamos ao código</p>
<pre>
<span class="constant">File</span><span class="punct">.</span><span class="ident">readlines</span><span class="punct">(&quot;</span><span class="string">data.csv</span><span class="punct">&quot;).</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">line</span><span class="punct">|</span>
  <span class="comment">#definindo os campos</span>
  <span class="ident">code</span><span class="punct">,</span><span class="ident">name</span><span class="punct">,</span><span class="ident">in_stock</span><span class="punct">,</span><span class="ident">nothing</span><span class="punct">,</span><span class="ident">date</span><span class="punct">,</span><span class="ident">price</span> <span class="punct">=</span> <span class="ident">line</span><span class="punct">.</span><span class="ident">strip</span><span class="punct">.</span><span class="ident">split</span><span class="punct">('</span><span class="string">;</span><span class="punct">')</span>

  <span class="comment">#trantando </span>
  <span class="ident">in_stock</span><span class="punct">=(</span><span class="ident">in_stock</span><span class="punct">=='</span><span class="string">S</span><span class="punct">')</span> <span class="comment">#true se 'S', false se 'N'</span>
  <span class="ident">date</span><span class="punct">=</span><span class="ident">date</span><span class="punct">.</span><span class="ident">split</span><span class="punct">(/</span><span class="regex"><span class="escape">\/</span></span><span class="punct">/).</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">join</span><span class="punct">('</span><span class="string">-</span><span class="punct">')</span> <span class="comment">#formata data para '2008-11-05'</span>

  <span class="comment">#atribuindo os valores</span>
  <span class="ident">product</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:code</span> <span class="punct">=&gt;</span> <span class="ident">code</span><span class="punct">,</span>
                      <span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="ident">name</span><span class="punct">,</span>
                      <span class="symbol">:in_stock</span> <span class="punct">=&gt;</span> <span class="ident">in_stock</span><span class="punct">,</span>
                      <span class="symbol">:date</span> <span class="punct">=&gt;</span> <span class="ident">date</span><span class="punct">,</span>
                      <span class="symbol">:price</span> <span class="punct">=&gt;</span> <span class="ident">price</span>

  <span class="ident">product</span><span class="punct">.</span><span class="ident">save</span>                      

<span class="keyword">end</span>
</pre>
<p></p>
<h2>Nova gem ParseLine</h2>
<p>O que ela faz? Nos ajuda a carregar dados externos de arquivos offline de uma forma mais elegante.<br />
Suporta CSV ou largura fixa.</p>
<h3>Funcionamento</h3>
<p> Basta extender o módulo <b>ParseLine::CSV</b> ou <b>ParseLine::FixedWidth</b> e definir o layout.</p>
<h2>Caso 1: Largura fixa</h2>
<p>Utilizaremos o módulo <b>ParseLine::FixedWidth</b> com o arquivo &#8220;data.txt&#8221;, a sintáxe é</p>
<pre>
  <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:nome_do_campo</span><span class="punct">,</span> <span class="ident">intervalo</span><span class="punct">,</span> <span class="ident">lambda</span><span class="punct">{|</span><span class="ident">campo</span><span class="punct">|</span> <span class="ident">fomatador</span><span class="punct">}</span>
</pre>
<p>Olha como é simples</p>
<pre>
<span class="ident">require</span> <span class="punct">'</span><span class="string">parseline</span><span class="punct">'</span>

<span class="keyword">class </span><span class="class">Product</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
  <span class="ident">extend</span> <span class="constant">ParseLine</span><span class="punct">::</span><span class="constant">FixedWidth</span>
  <span class="ident">fixed_width_layout</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">parse</span><span class="punct">|</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:code</span> <span class="punct">,</span> <span class="number">0</span><span class="punct">..</span><span class="number">5</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:name</span><span class="punct">,</span>  <span class="number">6</span><span class="punct">..</span><span class="number">21</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:in_stock</span><span class="punct">,</span> <span class="number">22</span><span class="punct">..</span><span class="number">22</span><span class="punct">,</span> <span class="ident">lambda</span> <span class="punct">{|</span><span class="ident">f</span><span class="punct">|</span> <span class="ident">f</span> <span class="punct">==</span> <span class="punct">'</span><span class="string">S</span><span class="punct">'</span> <span class="punct">}</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:date</span> <span class="punct">,</span> <span class="number">24</span><span class="punct">..</span><span class="number">33</span><span class="punct">,</span>    <span class="ident">lambda</span> <span class="punct">{|</span><span class="ident">d</span><span class="punct">|</span> <span class="ident">d</span><span class="punct">.</span><span class="ident">split</span><span class="punct">(/</span><span class="regex"><span class="escape">\/</span></span><span class="punct">/).</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">join</span><span class="punct">('</span><span class="string">-</span><span class="punct">')</span> <span class="punct">}</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:price</span><span class="punct">,</span> <span class="number">34</span><span class="punct">..</span><span class="number">42</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>
</pre>
<p>então posso carregar apenas uma linha</p>
<pre>
<span class="ident">dados</span><span class="punct">=</span><span class="constant">File</span><span class="punct">.</span><span class="ident">readlines</span><span class="punct">(&quot;</span><span class="string">data.txt</span><span class="punct">&quot;)</span>
<span class="attribute">@product</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">load_line</span> <span class="ident">dados</span><span class="punct">[</span><span class="number">0</span><span class="punct">]</span>
<span class="attribute">@product</span><span class="punct">.</span><span class="ident">save</span>
<span class="comment">#&lt;Product id: nil, code: &quot;1&quot;, name: &quot;PRODUTO 1&quot;, in_stock: false, date: &quot;2008-11-21&quot;, price: 90.0&gt;</span>
</pre>
<p>ou carregar automáticamente todo arquivo em um array de Product</p>
<pre>
<span class="attribute">@products</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">load_lines</span> <span class="punct">&quot;</span><span class="string">data.txt</span><span class="punct">&quot;</span>
</pre>
<p>conteúdo de @products</p>
<pre>
<span class="punct">[</span>
<span class="comment">#&lt;Product id: 29, code: &quot;1&quot;, name: &quot;PRODUTO 1&quot;, in_stock: true, date: &quot;2008-11-21&quot;, price: 90.0&gt;,</span>
<span class="comment">#&lt;Product id: 30, code: &quot;2&quot;, name: &quot;PRODUTO 2&quot;, in_stock: false, date: &quot;2008-11-22&quot;, price: 341.33&gt;,</span>
<span class="comment">#&lt;Product id: 31, code: &quot;3&quot;, name: &quot;PRODUTO 3&quot;, in_stock: false, date: &quot;2008-11-01&quot;, price: 1.99&gt;,</span>
<span class="comment">#&lt;Product id: 32, code: &quot;4&quot;, name: &quot;PRODUTO 4&quot;, in_stock: true, date: &quot;2008-11-15&quot;, price: 34.98&gt;,</span>
<span class="comment">#&lt;Product id: 33, code: &quot;5&quot;, name: &quot;PRODUTO 5&quot;, in_stock: false, date: &quot;2008-11-14&quot;, price: 130.44&gt;,</span>
<span class="comment">#&lt;Product id: 34, code: &quot;6&quot;, name: &quot;PRODUTO 6&quot;, in_stock: true, date: &quot;2008-11-05&quot;, price: 20.11&gt;</span>
<span class="punct">]</span>
</pre>
<p><br/></p>
<h2>Caso 2: Arquivos CSV</h2>
<p>Utilizaremos o módulo <b>ParseLine::CSV</b> com o arquivo &#8220;data.csv&#8221;, a sintáxe é</p>
<pre>
  <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:nome_do_campo</span><span class="punct">,</span> <span class="ident">lambda</span><span class="punct">{|</span><span class="ident">campo</span><span class="punct">|</span> <span class="ident">fomatador</span><span class="punct">}</span>
</pre>
<p>para ignorar um campo como aquele &#8220;reservado para uso futuro&#8221; basta invocar o método <b>ignore_field</b></p>
<p>Veja</p>
<pre>
<span class="keyword">class </span><span class="class">Product</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
  <span class="ident">extend</span> <span class="constant">ParseLine</span><span class="punct">::</span><span class="constant">CSV</span>
  <span class="ident">csv_layout</span> <span class="symbol">:delimiter</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">;</span><span class="punct">&quot;</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">parse</span><span class="punct">|</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:code</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:name</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">ignore_field</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:in_stock</span><span class="punct">,</span> <span class="ident">lambda</span> <span class="punct">{|</span><span class="ident">f</span><span class="punct">|</span> <span class="ident">f</span> <span class="punct">==</span> <span class="punct">'</span><span class="string">S</span><span class="punct">'</span> <span class="punct">}</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:date</span> <span class="punct">,</span>    <span class="ident">lambda</span> <span class="punct">{|</span><span class="ident">d</span><span class="punct">|</span> <span class="ident">d</span><span class="punct">.</span><span class="ident">split</span><span class="punct">(/</span><span class="regex"><span class="escape">\/</span></span><span class="punct">/).</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">join</span><span class="punct">('</span><span class="string">-</span><span class="punct">')</span> <span class="punct">}</span>
    <span class="ident">parse</span><span class="punct">.</span><span class="ident">field</span> <span class="symbol">:price</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>
</pre>
<p>O <b>ParseLine::CSV</b> também tem os métodos <b>Model.load_line</b> e <b>Model.load_lines</b>.<br />
Então temos para uma linha de dados</p>
<pre>
<span class="ident">dados</span><span class="punct">=</span><span class="constant">File</span><span class="punct">.</span><span class="ident">readlines</span><span class="punct">(&quot;</span><span class="string">data.csv</span><span class="punct">&quot;)</span>
<span class="attribute">@product</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">load_line</span> <span class="ident">dados</span><span class="punct">[</span><span class="number">0</span><span class="punct">]</span>
<span class="attribute">@product</span><span class="punct">.</span><span class="ident">save</span>
<span class="comment">#&lt;Product id: nil, code: &quot;1&quot;, name: &quot;PRODUTO 1&quot;, in_stock: false, date: &quot;2008-11-21&quot;, price: 90.0&gt;</span>
</pre>
<p>Ou carregar tudo de um array</p>
<pre>
<span class="attribute">@products</span><span class="punct">=</span><span class="constant">Product</span><span class="punct">.</span><span class="ident">load_lines</span> <span class="punct">&quot;</span><span class="string">data.txt</span><span class="punct">&quot;</span>
</pre>
<p><br/></p>
<h2>Instalação</h2>
<pre>
#rubyforge
sudo gem install parseline
</pre>
<p>Se ainda não estiver disponível <a href="http://rubyforge.org/frs/download.php/46790/parseline-1.0.2.gem">baixe aqui </a><br />
Espero que gostem.</p>
<p>ps. em breve no GitHub em inglês</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hashcode.eti.br/?feed=rss2&amp;p=205</wfw:commentRss>
		</item>
	</channel>
</rss>
