<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>sysd.org</title>
	
	<link>http://sysd.org</link>
	<description>A abordagem mais humana das ciências exatas, e a mais exata das humanas.</description>
	<lastBuildDate>Wed, 02 May 2012 22:05:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/sysd" /><feedburner:info uri="sysd" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://superfeedr.com/hubbub" /><item>
		<title>Google Refine + Perl</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/kKiBCf_5mWI/</link>
		<comments>http://sysd.org/google-refine-perl/#comments</comments>
		<pubDate>Wed, 02 May 2012 22:05:18 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[gambiarra]]></category>
		<category><![CDATA[GeoDNA]]></category>
		<category><![CDATA[Google Refine]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[Mojolicious]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=351</guid>
		<description><![CDATA[Google Refine é show. Para quem não conhece, acesse já o site oficial e assista pelo menos o primeiro vídeo. Serve para inúmeras tarefas envolvendo ETL. Eu, no momento, uso muito para coisas simples, como carregar um CSV, eliminar outliers e salvar em JSON para carregar no MongoDB. Nada que um one-liner em Perl não [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://code.google.com/p/google-refine/" target="_blank">Google Refine</a> é show. Para quem não conhece, acesse já o site oficial e assista pelo menos o primeiro vídeo. Serve para inúmeras tarefas envolvendo <a href="https://pt.wikipedia.org/wiki/Extract,_transform,_load" target="_blank">ETL</a>.</p>
<p>Eu, no momento, uso muito para coisas simples, como carregar um CSV, eliminar <em>outliers</em> e salvar em JSON para carregar no <a href="http://www.mongodb.org/" target="_blank">MongoDB</a>. Nada que um <em>one-liner</em> em Perl não pudesse fazer.</p>
<p>Infelizmente, a recíproca não é válida: <em>one-liners</em> em Perl são bem mais versáteis do que o Google Refine. Que tal integrar os dois?</p>
<ol>
<li>Google Refine <a href="https://code.google.com/p/google-refine/wiki/FetchingURLsFromWebServices" target="_blank">pode ser facilmente integrado com um web-service qualquer</a>.</li>
<li>Perl transforma <em>one-liners</em> em <a href="http://mojolicio.us/perldoc/ojo" target="_blank">webservices</a>.</li>
<li>PROFIT!!!</li>
</ol>
<p>Como exemplo concreto, utilizarei dados georeferenciados. Digamos que preciso eliminar registros duplicatas, e uma das formas de detectar é pela proximidade física dos pontos no mapa. Google Refine não é um <a href="https://pt.wikipedia.org/wiki/Sistema_de_informa%C3%A7%C3%A3o_geogr%C3%A1fica" target="_blank">GIS</a>, e não faz a menor ideia de como processar latitude/longitude. Entra o <a href="http://www.geodna.org/docs/google-maps.html" target="_blank">GeoDNA</a>: um algoritmo que transforma coordenadas numéricas bidimensionais em uma string com propriedade interessante: quanto mais longo o prefixo compartilhado de dois GeoDNAs, mais perto estão as respectivas coordenadas no mapa (infelizmente, GeoDNAs com prefixos totalmente distintos também podem estar fisicamente próximos; localidades próximas ao meridiano de Greenwich são um exemplo clássico). Portanto, ordenando os registros por GeoDNA, as localidades próximas tenderão a ficar em linhas adjascentes. Para a integração, usaremos o recurso <em>Add column by fetching URLs</em>, clickando em header de qualquer coluna (a coluna não importa pois, de qualquer maneira, usaremos dados de duas):</p>
<p><a href="http://sysd.org/wp-content/uploads/2012/04/Screen-Shot-2012-04-30-at-6.58.58-PM.png"><img class="alignnone size-full wp-image-387" title="Edit column > Add column by fetching URLs..." src="http://sysd.org/wp-content/uploads/2012/04/Screen-Shot-2012-04-30-at-6.58.58-PM.png" alt="" width="500" height="250" /></a></p>
<p>No diálogo que aparecer, colamos o seguinte código (atenção para o nome das colunas com as respectivas coordenadas):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #3366CC;">'http://127.0.0.1:3000/?lat='</span><span style="color: #339933;">+</span>
row.<span style="color: #660066;">cells</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'latitude'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>
<span style="color: #339933;">+</span><span style="color: #3366CC;">'&amp;lon='</span><span style="color: #339933;">+</span>
row.<span style="color: #660066;">cells</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'longitude'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span></pre></div></div>

<p>Não precisamos do <em>throttle delay</em>, pois o nosso webservice é local. O diálogo deve ficar assim (nada de clickar em OK, ainda):</p>
<p><a href="http://sysd.org/wp-content/uploads/2012/04/cities-Google-Refine.png"><img class="alignnone size-full wp-image-386" title="Diálogo do Add column by fetching URLs..." src="http://sysd.org/wp-content/uploads/2012/04/cities-Google-Refine.png" alt="" width="500" height="385" /></a></p>
<p>Agora, certifique-se de que você tem os módulos <a href="https://metacpan.org/module/Mojolicious" target="_blank">Mojolicious</a> e <a href="https://metacpan.org/module/Geo::DNA" target="_blank">Geo::DNA</a> instalados, e rode no terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> -MGeo::DNA <span style="color: #660033;">-Mojo</span> <span style="color: #660033;">-E</span> <span style="color: #ff0000;">'a(&quot;/&quot;=&gt;sub{my$s=shift;$s-&gt;render(json=&gt;{geocode=&gt;Geo::DNA::encode_geo_dna($s-&gt;param(&quot;lat&quot;),$s-&gt;param(&quot;lon&quot;))})})-&gt;start'</span> daemon</pre></div></div>

<p>Se preferir, aqui está a versão "por extenso":</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> Geo<span style="color: #339933;">::</span><span style="color: #006600;">DNA</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>encode_geo_dna<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Mojolicious<span style="color: #339933;">::</span><span style="color: #006600;">Lite</span><span style="color: #339933;">;</span>
&nbsp;
any <span style="color: #ff0000;">'/'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$self</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">render</span><span style="color: #009900;">&#40;</span>json <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span>
        geocode <span style="color: #339933;">=&gt;</span> encode_geo_dna<span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">param</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'lat'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">param</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'lon'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
app<span style="color: #339933;">-&gt;</span><span style="color: #006600;">start</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Uma vez iniciado o webservice, clique em OK lá no diálogo do Google Refine e aguarde. Mesmo sem o <em>delay</em>, é relativamente lento; porém o custo/benefício dessa gambiarrinha é, evidentemente, favorável <img src='http://sysd.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/kKiBCf_5mWI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/google-refine-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/google-refine-perl/</feedburner:origLink></item>
		<item>
		<title>Implementação de classificador Naïve Bayes em MongoDB</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/N3t2jeeyjqA/</link>
		<comments>http://sysd.org/implementacao-de-classificador-naive-bayes-em-mongodb/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 21:01:30 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Bayes]]></category>
		<category><![CDATA[classificador]]></category>
		<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=370</guid>
		<description><![CDATA[O presente artigo é derivado do que escrevi para o evento Equinócio de Outono de 2012, promovido por São Paulo Perl Mongers. Porém, ao invés de servir como uma espécie de complemento, é uma "volta às origens". O algoritmo original, desenvolvi em JavaScript puro, depois traduzi para Perl, refinei, detalhei e escrevi sobre. A intenção [...]]]></description>
			<content:encoded><![CDATA[<p>O presente artigo é derivado do que escrevi para o evento <a href="http://sao-paulo.pm.org/equinocio/2012/mar/12" target="_blank">Equinócio de Outono de 2012</a>, promovido por <a href="http://sao-paulo.pm.org/" target="_blank">São Paulo Perl Mongers</a>.</p>
<p>Porém, ao invés de servir como uma espécie de complemento, é uma "volta às origens". O algoritmo original, desenvolvi em JavaScript puro, depois traduzi para Perl, refinei, detalhei e escrevi sobre. A intenção agora é ser mais <b>show me the code</b> possível, com um exemplo simples, enxuto e prático. Portanto, a teoria e os detalhes continuam lá no <a href="http://sao-paulo.pm.org/equinocio/2012/mar/12" target="_blank">artigo original</a>. Aqui, é mão na massa!</p>
<h2>Ensinando o classificador</h2>
<p>O classificador funciona por palavras-chave, e o MongoDB, nesse estágio, atua como um mero <i>key/value storage</i>. Salve o código de inicialização a seguir como <code>init.js</code> e carregue com <code>mongo bayes init.js</code></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pelos'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'bigodes'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'rabo'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.gato'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pelos'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'rabo'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.cachorro'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'bico'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'asa'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'asa'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'penas'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.galo'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'bico'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pata'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'rabo'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">bayes</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>_id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'pelos'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>$inc<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>total<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'categ.ornitorrinco'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Agora, entrando em <a href="http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell" target="_blank">MongoDB Interactive Shell</a> com <code>mongo bayes</code>, podemos ver a estrutura resultante com <code>db.mongo.find()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;bigodes&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;gato&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;bico&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;galo&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ornitorrinco&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;asa&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;galo&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;penas&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;galo&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;pata&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;cachorro&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;galo&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;gato&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ornitorrinco&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">4</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">14</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;rabo&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;cachorro&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;gato&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ornitorrinco&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;_id&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;pelos&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;categ&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;cachorro&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;gato&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ornitorrinco&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;total&quot;</span> <span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Cada palavra-chave é associada aos contadores das categorias, além do contador geral de ocorrências. Agora, vamos processar essa estrutura de dados!</p>
<h2>Classificador em map/reduce</h2>
<p>O código a seguir é quase que um programa independente em JavaScript, salve-o como <code>bayes-mongodb.js</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> words <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> word <span style="color: #000066; font-weight: bold;">in</span> doc<span style="color: #009900;">&#41;</span>
    words.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>word<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> categ <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #3366CC;">'gato'</span><span style="color: #339933;">,</span>
    <span style="color: #3366CC;">'cachorro'</span><span style="color: #339933;">,</span>
    <span style="color: #3366CC;">'galo'</span><span style="color: #339933;">,</span>
    <span style="color: #3366CC;">'ornitorrinco'</span>
<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> guess <span style="color: #339933;">=</span> db.<span style="color: #660066;">runCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    mapreduce<span style="color: #339933;">:</span> <span style="color: #3366CC;">'bayes'</span><span style="color: #339933;">,</span>
    out<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> inline<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    query<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        _id<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
            $in<span style="color: #339933;">:</span> words
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    scope<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        categ<span style="color: #339933;">:</span> categ<span style="color: #339933;">,</span>
        doc<span style="color: #339933;">:</span> doc<span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    map<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> categ.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> ctg <span style="color: #339933;">=</span> categ<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #003366; font-weight: bold;">var</span> prob <span style="color: #339933;">=</span> Math.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>
                <span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">categ</span><span style="color: #009900;">&#91;</span>ctg<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span>
                <span style="color: #339933;">?</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">categ</span><span style="color: #009900;">&#91;</span>ctg<span style="color: #009900;">&#93;</span>
                <span style="color: #339933;">:</span> 1.18e<span style="color: #339933;">-</span>38
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            prob <span style="color: #339933;">-=</span> Math.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">total</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            emit<span style="color: #009900;">&#40;</span>ctg<span style="color: #339933;">,</span> prob <span style="color: #339933;">*</span> doc<span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">this</span>._id<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    reduce<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>key<span style="color: #339933;">,</span> values<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
        values.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            result <span style="color: #339933;">+=</span> value<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> res <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #339933;">-</span>Infinity <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> guess.<span style="color: #660066;">results</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>guess.<span style="color: #660066;">results</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">&gt;</span> res.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span>
        res <span style="color: #339933;">=</span> guess.<span style="color: #660066;">results</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span>res._id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Para passar parâmetros via linha de comando, usamos a opção <code>--eval</code> do <i>MongoDB Shell</i>, e o script imprime na tela a categoria "adivinhada":</p>
<pre>
$ mongo bayes --quiet --eval 'var doc = { bigodes: 1, rabo: 1 }' bayes-mongodb.js
gato
$ mongo bayes --quiet --eval 'var doc = { bico: 1, rabo: 1, patas: 4 }' bayes-mongodb.js
ornitorrinco
$ mongo bayes --quiet --eval 'var doc = { bico: 1, asa: 2 }' bayes-mongodb.js
galo
</pre>
<h2>Conclusão</h2>
<p>O básico do básico esta aí <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
É evidente que os resultados e a eficiência do classificador bayesiano variam de caso para caso, e até de implementação para implementação. Se a primeira tentativa não for um sucesso, se quiser entender para que serve o "número mágico" <code>1.18e-38</code>, ou se quiser automatizar o "treinamento" através de um pequeno script em Perl, consulte o <a href="http://sao-paulo.pm.org/equinocio/2012/mar/12" target="_blank">artigo original</a>!</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/N3t2jeeyjqA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/implementacao-de-classificador-naive-bayes-em-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/implementacao-de-classificador-naive-bayes-em-mongodb/</feedburner:origLink></item>
		<item>
		<title>As 10 coisas que me impressionam mais do que o Instagram</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/gIgmhHVNPNY/</link>
		<comments>http://sysd.org/as-10-coisas-que-me-impressionam-mais-do-que-o-instagram/#comments</comments>
		<pubDate>Sun, 22 Apr 2012 14:30:23 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=341</guid>
		<description><![CDATA[Neste post, não falarei nada a respeito do Instagram em si. Afinal, criticá-lo é estar na contramão do sucesso. Não, ao invés disso, irei enumerar algumas tecnologias relacionadas à imagem que me impressionaram nos últimos anos. E, é claro, Instagram não está entre elas. 1 - Memória Fotográfica Coletiva Qualquer um munido de um celular [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 470px"><img class=" " title="Caleidoscópio" src="https://p.twimg.com/Aq9AEGSCEAIlSAE.jpg:large" alt="" width="460" height="459" /><p class="wp-caption-text">Não, essa foto não foi tirada usando o Instagram</p></div>
<p>Neste post, não falarei nada a respeito do Instagram em si. Afinal, criticá-lo é estar na contramão do sucesso.</p>
<p>Não, ao invés disso, irei enumerar algumas tecnologias relacionadas à imagem que me impressionaram nos últimos anos. E, é claro, Instagram não está entre elas.</p>
<hr />
<h1>1 - Memória Fotográfica Coletiva</h1>
<p>Qualquer um munido de um celular se acha o Paganini do pincel hoje. Imagine se ostentar uma Canon 5D Mark II, então!</p>
<p>Pois bem, <a href="http://pt.wikipedia.org/wiki/Iain_M._Banks" target="_blank">Iain M. Banks</a> já idealizou em seu <a href="http://en.wikipedia.org/wiki/Feersum_Endjinn" target="_blank">Feersum Endjinn</a> que, caso seja possível transferir personalidade para um chip, poderíamos obter uma compressão desgraçada de boa, já que 99.99% da nossa individualidade não é tão... Individual <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Enfim, lembre-se: você é especial. Assim como todos os outros. E as suas fotos são super-originais e criativas. Assim como as dos outros, claro.</p>
<div class="wp-caption alignnone" style="width: 535px"><a href="http://www.mymodernmet.com/profiles/blogs/pep-ventosa-the-collective-snapshot"><img title="The Statue of Liberty" src="http://api.ning.com/files/IAsYlcPT9moic5sTownyi5dznFwwYAkV8tfeBjJ8*j7ZauSuo0deNrJz-4SnpKIsvcaLNadRWAHcuy2HzEhzMBGKvDjylMzz/PepVentosa6.jpg" alt="" width="525" height="700" /></a><p class="wp-caption-text">&quot;Landmarks Layered into a Collective Memory&quot;, clique na imagem para ver mais.</p></div>
<hr />
<h1>2 - ONE-BIT CAMERA</h1>
<p>Se lidar com limitações e restrições estimula a criatividade, esse seria o extremo absoluto na evolução dos filtros do Instagram.</p>
<p>Puxa, quando criança, sempre quis ter uma câmera Polaroid. Mas quando peguei numa câmera digital, a vontade passou na hora. Pois bem, muita gente ainda insiste nessa nostalgia. Sabem de onde vêm aquela ridícula borda branca em volta das "representações das fotos"? Aliás, já viu essa borda em uma foto qualquer? Pois é...</p>
<p>Enfim, se o objetivo não é mimetizar "velhos bons tempos", mas sim "conter para despertar a criatividade", por que não fotos monocromáticas? Não, não branco-e-preto; isso é mainstream demais! Só branco e preto!</p>
<div class="wp-caption alignnone" style="width: 488px"><a href="http://lindecrantz.com/onebitcamera/"><img class=" " title="1-BIT CAMERA" src="http://lindecrantz.com/onebitcamera/onebitcamera.png" alt="" width="478" height="781" /></a><p class="wp-caption-text">1-BIT CAMERA for iPhone®</p></div>
<hr />
<h1>3 - Microsoft Photosynth</h1>
<p>Outro extremo: ao invés de filtrar informação, agregar.<br />
Qualquer um com o mínimo de habilidade no Photoshop monta um panoraminha em questão de minutos. Pois bem, com <a href="http://photosynth.net/" target="_blank">Photosynth</a> e um celular com giroscópio/bússola, passa a ser uma questão de segundos.</p>
<div class="iframe-wrapper">
  <iframe src="http://photosynth.net/embed.aspx?cid=7298877f-5cda-4305-9ce2-ca53780be74c&amp;delayLoad=true&amp;slideShowPlaying=false" frameborder="0" style="height:300px;width:500px;">Please upgrade your browser</iframe>
</div><br />
<small>(infelizmente, requer o plugin do tal do Silverlight)</small></p>
<hr />
<h1>4 - Lytro</h1>
<p>E que tal agregar a informação de profundidade? OK, para isso, não basta um celular; o hardware precisa ser especializado.</p>
<p>Mas não é nada absurdo (custa a partir de 400 Washingtons, no momento da escrita). O efeito é imprescindível: <strong>primeiro</strong> se tira a foto, e <strong>depois</strong> ajusta o foco! Isso é, a imagem toda está em foco, e você tem a liberdade de escolher o plano de profundidade de uma imagem já "congelada"! Inclusive, <a href="http://www.lytro.com/" target="_blank">Lytro</a> promete soltar uma atualização de software que permita extrair uma espécie de voxel-maps a partir das fotos tiradas com o seu equipamento. Show!</p>
<p>Por mim, esse feito já merece o Oscar da Paz. Veja (clickando em diversos pontos na imagem):</p>
<div class="iframe-wrapper">
  <iframe src="http://lytro.com/pictures/lyt-64/embed?showBorder=false" frameborder="0" style="height:380px;width:380px;">Please upgrade your browser</iframe>
</div>
<hr />
<h1>5 - C3 Technologies</h1>
<p>Afastando-se um pouco da Terra... Que tal olhar o seu bairro com os olhos de um game da Blizzard?</p>
<div class="iframe-wrapper">
  <iframe src="http://www.youtube.com/embed/gSmunh6NIQI" frameborder="0" style="height:315px;width:420px;">Please upgrade your browser</iframe>
</div>
<p>Tá bom, isso só se aplicaria se você morasse em Oslo, Noruega, mas a tecnologia da 3D-ficação da imagem aérea é impressionante.</p>
<p>Sim, há rumores de que a Apple comprou esta tecnologia. É também fato comprovado de que a Nokia comprou. Instale o bendito do plugin e deleite-se: <a href="http://maps.nokia.com/40.6897386,-74.044671,17.8,293.62,60.04,3d.day" target="_blank">http://maps.nokia.com/40.6897386,-74.044671,17.8,293.62,60.04,3d.day</a></p>
<h2>Bônus</h2>
<p>Google Maps também tem uma renderização 3D, não tão <em>eye-candy</em>, mas que impressiona pelo seguinte fato:</p>
<div id="attachment_342" class="wp-caption alignnone" style="width: 476px"><a href="http://g.co/maps/yujur"><img class=" wp-image-342 " title="Google 3D Maps glitch" src="http://sysd.org/wp-content/uploads/2012/04/google3dmaps.jpg" alt="" width="466" height="406" /></a><p class="wp-caption-text">(clique para ver com os próprios olhos no Google Maps)</p></div>
<p>Sim, ele está tentando renderizar as árvores como se fossem prédios. Sabe o que isso significa, meu amigo? Uma gafe dessas indica que o processo é quase que totalmente automático! Isso é: uma falha (árvores = prédios) comprova a regra (prédios = prédios). Nada mal!</p>
<hr />
<h1>6 - Urthecast</h1>
<p>Continuando com a temática espacial... Que tal um crossover entre YouTube e Google Earth?!</p>
<p>Quer dizer... Todo mundo já ouviu uma piadinha sobre algum mentecapto ligando para amigo pedindo para apontar Google Earth para a própria casa, na esperança de aparecer "ao vivo"... Pois bem: ainda em 2012, isso será possível, graças ao <a href="http://www.urthecast.com/" target="_blank">Urthecast</a>:</p>
<div class="iframe-wrapper">
  <iframe src="http://www.youtube.com/embed/0ScNJ74SkPE" frameborder="0" style="height:315px;width:420px;">Please upgrade your browser</iframe>
</div>
<hr />
<h1>7 - Fotos coloridas tiradas em 1910</h1>
<div class="wp-caption alignnone" style="width: 485px"><a href="http://www.boston.com/bigpicture/2010/08/russia_in_color_a_century_ago.html"><img class="  " title="Catedral Nikolaevskii em Mozhaisk, 1911." src="http://inapcache.boston.com/universal/site_graphics/blogs/bigpicture/prokudin_08_20/p13_00004438.jpg" alt="" width="475" height="322" /></a><p class="wp-caption-text">Clique na imagem para ver galeria de mais 33 fotos como essa.</p></div>
<p>E não, não foram pintadas à mão! Sergei Mikhailovich Prokudin-Gorskii tirou fotos <strong>coloridas</strong> da Rússia no período de 1909 a 1912, valendo-se da técnica que utilizamos hoje em dia para tirar foto HDR com uma câmera comum: sucessão de imagens tiradas com parâmetros distintos. No caso dessas fotos, "parâmetro" era o filtro vermelho, azul e verde. Pois é, as fotos só puderam ser "reveladas" décadas mais tarde!</p>
<hr />
<h1>8 - Vídeo em HDR</h1>
<p>Fotos HDR são bem comuns; até iPhone tira. Já vídeos... São os famosos timelapses, que dão uma "acelerada" no tempo. Por que isso?</p>
<p>Simples: para tirar uma foto HDR (High-Dynamic Range) com uma máquina comum, precisa ajustá-la para várias configurações de exposição, tirando uma série de fotos, e depois recombiná-las através de um software. O ajuste do diafragma é mecânico, logo, leva tempo, logo, não dá para chegar nem nos 12 fps.</p>
<p>Mas e se usar duas câmeras, pré-configuradas para exposições distintas?! Confesso que não entendo nem como funciona a exposição para filmagem, mas para dividir a imagem, saquei que usaram um espelho semi-transparente:</p>
<div class="iframe-wrapper">
  <iframe src="http://www.youtube.com/embed/BlcLW2nrHaM" frameborder="0" style="height:315px;width:420px;">Please upgrade your browser</iframe>
</div>
<hr />
<h1>9 - GIFs animados fotorrealísticos!</h1>
<p>Se para você GIFs animados são sinônimo das homepages toscas da década de 90, está na hora de rever os seus conceitos!</p>
<p>Apesar da limitação técnica de empregar uma paleta de 256 cores, resultados surpreendentes podem ser obtidos:</p>
<div class="wp-caption alignnone" style="width: 453px"><a href="http://fromme-toyou.tumblr.com/tagged/cinemagraph"><img class="  " title="A quiet autumn rain… " src="http://farm7.staticflickr.com/6232/6377989417_aa1b07dedc_o.gif" alt="" width="443" height="250" /></a><p class="wp-caption-text">Clique para ir para um blog atualizado periodicamente com essas belezuras.</p></div>
<hr />
<h1>10 - Lente macro no celular</h1>
<p>E, para fechar com a chave de ouro, não poderia faltar essa gambiarra no melhor estilo MacGyver: transforme o celular em uma câmera macro (quase um microscópio) acoplando a ele... Uma lente do cabeçote de leitura do drive de DVD :S</p>
<p>Aliás, a imagem lá em cima, no header desse blog, foi feita exatamente desse jeito <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="wp-caption alignnone" style="width: 510px"><a href="http://www.diyphotography.net/super-macro-your-cellphone-camera-with-a-dvd-lens"><img title="DIY macro" src="http://www.diyphotography.net/files/images/2/3841826663_dccb5758f3.jpg" alt="" width="500" height="332" /></a><p class="wp-caption-text">Clique e faça você mesmo!</p></div>
<img src="http://feeds.feedburner.com/~r/sysd/~4/gIgmhHVNPNY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/as-10-coisas-que-me-impressionam-mais-do-que-o-instagram/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/as-10-coisas-que-me-impressionam-mais-do-que-o-instagram/</feedburner:origLink></item>
		<item>
		<title>Y is the new X</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/CRF0XoiCGfA/</link>
		<comments>http://sysd.org/y-is-the-new-x/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 16:53:50 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[ack]]></category>
		<category><![CDATA[alternativas]]></category>
		<category><![CDATA[bzip2]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[htop]]></category>
		<category><![CDATA[mosh]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tmux]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[xz]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=338</guid>
		<description><![CDATA[Segue aqui uma listinha de utilitários ligeiramente diferentes dos tradicionais e consolidados, mas cujas pequenas e grandes melhorias me fizeram renunciar quase que completamente os mais clássicos e abraçar os bleeding edge mosh is the new ssh Não me entenda mal: SSH é muito mais do que uma simples shell remota! Também serve para tunelamento de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sysd.org/wp-content/uploads/2012/04/Screen-Shot-2012-04-17-at-9.56.43-PM.png"><img class="size-full wp-image-339" title="usando mosh+tmux+htop+ack+xz" src="http://sysd.org/wp-content/uploads/2012/04/Screen-Shot-2012-04-17-at-9.56.43-PM.png" alt="" width="590" height="451" /></a></p>
<p>Segue aqui uma listinha de utilitários ligeiramente diferentes dos tradicionais e consolidados, mas cujas pequenas e grandes melhorias me fizeram renunciar quase que completamente os mais clássicos e abraçar os <em>bleeding edge</em> <code> <img src='http://sysd.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </code></p>
<h1>mosh is the new ssh</h1>
<p>Não me entenda mal: SSH é <strong>muito</strong> mais do que uma simples <em>shell</em> remota! Também serve para tunelamento de conexões, transferência de arquivos, autenticação remota... Aliás, o próprio <a href="http://mosh.mit.edu/" target="_blank">Mosh</a> se autentica via SSH. Só que daí em diante, é outra história.</p>
<p>Mosh utiliza o protocolo UDP ao invés do TCP, então não precisa <strong>manter</strong> uma conexão. Simplificando muito, Mosh faz sincronização do estado do terminal remoto com o local, ao invés de redesenhar as telas caractere por caractere.</p>
<p>Ou seja: o seu link pode ser muito ruim, que o Mosh não está nem aí. Pode perder conexão, pode colocar o notebook em <em>standby</em>; quando o link voltar, está aí a sua <em>shell</em>, do jeito que você deixou! <code>'Network error: Connection reset by peer'‎</code>, nunca mais.</p>
<p>Outro "efeito colateral" bacana do Mosh é que ele dispensa buffers. Já me ferrei dando um <code>lsof</code> numa conexão lerda; até que todo o output saia, SSH não deixa nem o input de Ctrl-C passar.</p>
<p>Para finalizar, o comparativo de tempo de resposta de SSH com Mosh, do <a href="http://mosh.mit.edu/" target="_blank">site oficial do MIT</a>:</p>
<p><img class="alignnone size-full wp-image-345" title="Mosh vs. SSH" src="http://sysd.org/wp-content/uploads/2012/04/cdfs.png" alt="" width="576" height="441" /></p>
<h1>tmux is the new screen</h1>
<p>Mesmo que você seja um ávido fã do <a href="http://www.gnu.org/software/screen/" target="_blank">screen</a>, o <a href="http://tmux.sourceforge.net/" target="_blank">tmux</a> vale uma espiada. O grande distintivo talvez seja o modelo client/server, que garante uma grande flexibilidade às sessões gerenciadas pelo tmux. Por exemplo, dá para mover janelas entre diversas sessões, ou então replicar o input em várias janelas (útil quando se quer iniciar o mesmo processo em diversos nós). Os atalhos de teclas tem perfis pré-definidos "emprestados" de Vim ou Emacs, e, é claro, dá para redefinir quase tudo do jeito que quiser pelo arquivo de configuração bastante legível. Ah, um bônus: split vertical da tela funciona sem patch adicional <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Um breve tutorial:</p>
<ol>
<li><a href="http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/" target="_blank">TMUX – The Terminal Multiplexer (Part 1)</a></li>
<li><a href="http://blog.hawkhost.com/2010/07/02/tmux-%E2%80%93-the-terminal-multiplexer-part-2/" target="_blank">TMUX – The Terminal Multiplexer (Part 2)</a></li>
</ol>
<h1>htop is the new top</h1>
<p>Esse dispensa apresentações. É praticamente um 'Activity Monitor.app' versão terminal. Infelizmente, a versão para MacOS tem algumas esquisitices (especialmente na parte que se refere à exibição da quantidade de memória). Ainda assim, é excelente para <em>overview</em> geral do sistema. Sempre mantenho um <a href="http://htop.sourceforge.net/" target="_blank">htop</a> aberto nos meus servidores <img src='http://sysd.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h1>ack is the new grep</h1>
<p>Descobri o <a href="http://betterthangrep.com/" target="_blank">ack</a> recentemente. Não é bem um grep, mas sim uma combinação de find/grep específica para trabalhar com código-fonte. Em suma, ele faz busca recursiva utilizando regexp "sabor Perl", e desconsidera coisas como subdiretórios do Git ou SVN. Por exemplo uma versão <em>(very) quick &amp; dirty</em> do<span style="font-size: small;"> <a href="https://metacpan.org/module/Perl::PrereqScanner" target="_blank">Perl::PrereqScanner</a> seria:</span></p>
<pre>ack -ho --perl '^\s*use\s+[\w+\.:]+' | sort -u</pre>
<h1>xz is the new bzip2</h1>
<p>Um pequeno devaneio: aparentemente, Inteligência Artificial e compressão de dados são assuntos afins. Os organizadores do <a href="http://en.wikipedia.org/wiki/Hutter_Prize" target="_blank">Hutter Prize</a>, por exemplo, acreditam que uma compressão eficiente de um texto natural seria de dificuldade equivalente a passar no <a href="http://pt.wikipedia.org/wiki/Teste_de_Turing" target="_blank">teste de Turing</a>.</p>
<p>Voltando ao tema original: anos atrás, quando clock de um PC <em>high-end</em> não passava de 1 GHz, e conexão broadband ainda estava engatinhando nos países do 3-o mundo, ver um código-fonte compactado com <a href="http://www.bzip.org/" target="_blank">bzip2</a> numa página de download era de restaurar a fé na humanidade. Pois era evidentemente um ato altruístico por parte do disponibilizador levar muito mais tempo para compactar para poupar um pouquinho de tempo e banda de quem fizer o download.</p>
<p>Hoje, o bzip2 roda na velocidade do <a href="http://www.gzip.org/" target="_blank">gzip</a> de outrora. Eis que revive o <a href="http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm" target="_blank">algoritmo LZMA</a>: muito mais voraz quanto à CPU/RAM, na grande maioria dos casos chuta bonito o traseiro do bzip2! O conheci através do <a href="http://www.7-zip.org/" target="_blank">7-Zip</a>, de longe o melhor compactador para Windows (xupem, WinZip e WinRAR!). Depois, para a minha alegria, descobri o <a href="http://tukaani.org/xz/" target="_blank">xz</a>, que:</p>
<ol>
<li>É mais fácil de digitar do que 'bzip2';</li>
<li>Compacta mais do que o bzip2;</li>
<li>Usa os mesmos parâmetros que o bzip2 (<code>cat ... | xz -cv9 &gt; dump.xz</code> continua válido).</li>
</ol>
<hr />
<p>E você, tem algum exemplo assim? Comente!</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/CRF0XoiCGfA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/y-is-the-new-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/y-is-the-new-x/</feedburner:origLink></item>
		<item>
		<title>Extreme WYSIWYG</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/0zAX137Rbvw/</link>
		<comments>http://sysd.org/extreme-wysiwyg/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 00:47:05 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Computer-Human Interface]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=335</guid>
		<description><![CDATA[Essa semana, Slashdot nos contemplou com dois deliciosos eye-candies na área de interface e usabilidade: Gliimpse Devo confessar que, se eu tivesse como utilizar esse tipo de preview para redigir HTML, esse blog teria updates muito mais frequentes Não me habituei com nenhum editor WYSIWIG, e até os meus slides faço em POD e renderizo [...]]]></description>
			<content:encoded><![CDATA[<p>Essa semana, <a href="http://slashdot.org/" target="_blank">Slashdot</a> nos contemplou com dois deliciosos <em>eye-candies</em> na área de interface e usabilidade:</p>
<h1>Gliimpse</h1>
<p><object style="height: 390px; width: 640px;" width="640" height="360" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/hG3ELslkHDY?version=3&amp;feature=player_detailpage" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><embed style="height: 390px; width: 640px;" width="640" height="360" type="application/x-shockwave-flash" src="http://www.youtube.com/v/hG3ELslkHDY?version=3&amp;feature=player_detailpage" allowFullScreen="true" allowScriptAccess="always" allowfullscreen="true" allowscriptaccess="always" /></object></p>
<p>Devo confessar que, se eu tivesse como utilizar <a href="http://www.aviz.fr/gliimpse/" target="_blank">esse tipo de <em>preview</em> para redigir HTML</a>, esse blog teria updates muito mais frequentes <code> <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </code></p>
<p>Não me habituei com nenhum editor WYSIWIG, e até os meus slides faço em <a href="http://perldoc.perl.org/perlpod.html" target="_blank">POD</a> e <a href="https://metacpan.org/module/Pod::S5" target="_blank">renderizo</a> com <a href="http://meyerweb.com/eric/tools/s5/" target="_blank">S5</a>.</p>
<blockquote><p>Realmente, me parece uma bela de uma mão na roda!</p>
<h1>Light Table</h1>
<p><iframe src="http://player.vimeo.com/video/40281991?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="640" height="360"></iframe><br />
<a href="http://vimeo.com/40281991">Light Table - a new IDE</a> from <a href="http://vimeo.com/user11261775">Chris Granger</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Demais esse <a href="http://www.chris-granger.com/2012/04/12/light-table---a-new-ide-concept/" target="_blank">conceito de IDE + REPL, que está para virar protótipo!</a></p>
<p>Só vejo um porém. Exemplificando metaforicamente: a melhor definição de uma "linguagem de programação" que conheço é "capacidade de produzir loop infinito". Por isso, falar "programador HTML", por exemplo, é meio que nonsense. Agora, apesar do loop infinito ser tão importante na teoria, não é nada bom na prática. Por exemplo, digitar <code>:&#8203;​(){ :​&#8203;|:&amp; };:</code> na linha de comando do Linux ou Mac e dar <em>ENTER</em> leva ao suicídio do sistema operacional. Enfim, quem já programou em JavaScript e usou <code>alert()</code> para debugar, sabe do que estou falando <code> <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </code></p>
<p>Agora, o cara usou um exemplo muito feliz: IDE dele é totalmente voltada para linguagens funcionais, tanto que a menor unidade de código, para ele, é a função. Por obséquio, linguagens funcionais não tem loop! Tem recursão, que até pode ser infinita, mas convenhamos: quem domina programação funcional, dificilmente vai cometer essa gafe...</p>
<p>Concluindo: a ideia é genial, mas daria certo para poucos. O meu palpite é que surgirá a versão dessa IDE para trabalhar com JavaScript, tanto <em>client-</em> quanto <em>server-side</em> (<a href="http://nodejs.org/" target="_blank">Node.js</a>), pois JavaScript, surpreendentemente, é funcional (tecnicamente falando, JavaScript é quase um <em>Domain Specific Language</em> de Scheme, que é dialeto de Lisp).</p></blockquote>
<img src="http://feeds.feedburner.com/~r/sysd/~4/0zAX137Rbvw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/extreme-wysiwyg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/extreme-wysiwyg/</feedburner:origLink></item>
		<item>
		<title>DBIx::Class HATE</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/1YfMHwdgWpM/</link>
		<comments>http://sysd.org/dbixclass-hate/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 20:47:13 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[RDBMS]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=326</guid>
		<description><![CDATA[Exercendo a minha liberdade de expressão, vou tentar explicar por que raios, afinal, eu detesto tanto o DBIx::Class. Ninguém é obrigado a concordar comigo, mas espero que os que leiam, reflitam. Sem dúvida, é um treco robusto e consistente, mas já dizia o Oscar Wilde: "Consistency is the last refuge of the unimaginative." Agora eu, felizmente (ou [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-329" title="Nuke Hell" src="http://sysd.org/wp-content/uploads/2011/11/Nuke-Hell.jpg" alt="" width="400" height="267" /></p>
<p>Exercendo a minha liberdade de expressão, vou tentar explicar por que raios, afinal, eu detesto tanto o <a href="https://metacpan.org/module/DBIx::Class" target="_blank">DBIx::Class</a>. Ninguém é obrigado a concordar comigo, mas espero que os que leiam, reflitam.</p>
<p>Sem dúvida, é um treco robusto e consistente, mas já dizia o <a href="http://pt.wikipedia.org/wiki/Oscar_Wilde" target="_blank">Oscar Wilde</a>: <em>"Consistency is the last refuge of the unimaginative."</em> Agora eu, felizmente (ou não), tenho imaginação de sobra. Sou conhecido por minhas gambiarras atrozes. Sou um péssimo programador, a ponto de ter largado a faculdade de computação no quarto ano e ter me formado em desenho industrial <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O que gosto no Perl é a sua capacidade de ser um <strong>master-glue</strong>, amarrando pedaços desconexos numa "coisa" que, magicamente, atende às necessidades.</p>
<p>Como bem ilustra o fabuloso poema <a href="http://en.wikipedia.org/wiki/Black_Perl" target="_blank">"Black Perl"</a>, o Perl é livre de preconceitos e purismos. Posso "furar" a privacidade dos atributos do <a href="https://metacpan.org/module/Moose" target="_blank">Moose</a>, subverter o <a href="http://pt.wikipedia.org/wiki/MVC" target="_blank">MVC</a> com o <a href="https://metacpan.org/module/Mojolicious" target="_blank">Mojolicious</a>, além de fazer todo tipo de <a href="http://en.wikipedia.org/wiki/Monkey_patch" target="_blank">monkeypatching</a> bizarro e <em>ad-hoc</em>.</p>
<p>Aí entra o DBIx::Class. Seu glorioso <a href="https://metacpan.org/module/dbicdump" target="_blank">dbicdump</a> já ofende os meus olhos:</p>
<pre># Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-08-24 13:26:20
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qqyhu9B0Vr7l1KsQ6CG7Jw</pre>
<p>Desgraçado, como assim?! Em primeiro lugar, a caralhada de classes (uma por tabela?!), para mim, por si só, é uma coisa javesca. E, em segundo lugar, o mentecapto é prolixo e nem posso ousar de intervir com o <a href="https://metacpan.org/module/Perl::Tidy" target="_blank">Perl::Tidy</a> para deixar o código legível do jeito que gosto. Sem falar que o schema é <em>"lossy"</em> e perde várias informações.</p>
<p>Mas isso é o de menos. Não consigo imaginar um <em>workflow</em> que me agrade. Eu gosto do <a href="http://www.pgadmin.org/" target="_blank">pgAdmin</a> e do <a href="http://www.heidisql.com/" target="_blank">HeidiSQL</a> e costumo elaborar as minhas tabelas e queries nessas GUIs. Isso me dá um retrabalho na hora de "portar" para Perl (diferentemente do <a href="https://metacpan.org/module/DBI" target="_blank">DBI</a>, aonde é só copiar e colar, ráááá).</p>
<p>E olha só, <a href="http://pt.wikipedia.org/wiki/CRUD" target="_blank">CRUD</a> não é o foco do meu trabalho. Às vezes, preciso dar uma cutucada no banco de dados, ou então um grande processamento em lote. Mas variedade de <em>queries</em>? Não me pertence.</p>
<p>Aliás, um ponto importante: em geral, sou "equipe de um homem só". E Perl dá um grande poder nas mãos das equipes de um homem só. Não preciso de um código de fácil manutenção. Eu assumo a penalidade e o risco de me perder nas próprias <em>queries</em> quilométricas. Me divirto muito com isso.</p>
<p>Nesse ponto, DBIx::Class me parece coisa de tiozão. Me lembra aqueles emails corporativos aonde a assinatura é 100x maior do que a mensagem, sendo o schema a assinatura e o uso da mesma, a mensagem <img src='http://sysd.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/1YfMHwdgWpM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/dbixclass-hate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://sysd.org/dbixclass-hate/</feedburner:origLink></item>
		<item>
		<title>TicketFeed – Alimentando o seu leitor de feeds!</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/TSDjGWHPudE/</link>
		<comments>http://sysd.org/ticketfeed-alimentando-o-seu-leitor-de-feeds/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 02:07:02 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Computer-Human Interface]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança da informação]]></category>
		<category><![CDATA[Atom]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Google Reader]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Ticket]]></category>
		<category><![CDATA[Ticket Alimentação]]></category>
		<category><![CDATA[Ticket Restaurante]]></category>
		<category><![CDATA[Vale Refeição]]></category>
		<category><![CDATA[VR]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=321</guid>
		<description><![CDATA[Sei lá o que posso prosear a respeito disso Mas vamos começar pelo começo. Um belo dia, estive eu no caixa de um restaurante, prestes a pagar pelo meu almoço, quando uma notícia nada agradável me surpreende: o meu saldo estava zerado!!! Como isso seria possível, se o meu ticket até está na minha planilha [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ticket.iwatcher.net/"><img class="aligncenter size-full wp-image-322" title="TicketFeed - Alimentando o seu leitor de feeds!" src="http://sysd.org/wp-content/uploads/2011/07/TicketFeed.png" alt="" width="384" height="252" /></a>Sei lá o que posso prosear a respeito disso <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Mas vamos começar pelo começo. Um belo dia, estive eu no caixa de um restaurante, prestes a pagar pelo meu almoço, quando uma notícia nada agradável me surpreende: o meu saldo estava zerado!!!</p>
<p>Como isso seria possível, se o meu ticket até está na minha planilha de gastos (isso é, sempre que uso ele, anoto quando e aonde foi)?! Pois é, foi clonado.</p>
<p>Então de que adiantou todo o meu acompanhamento de crédito/débito? Pfffffft <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Aí no processo de resgatar o rico dinheirinho do meu rango, me deparei com o site oficial, <a href="http://www.ticket.com.br/" target="_blank">http://www.ticket.com.br/</a>, que é uma tosqueira inigualável. Para começar, o "sistema de segurança" é tão pífio que requer apenas o número do cartão, <strong>sem senha alguma</strong>, para consultas de extrato/saldo! Tudo bem que não é uma informação pra lá de sigilosa, ainda assim... Qual a utilidade podemos extrair disso?</p>
<ol>
<li>Funcionários de uma mesma empresa recebem seus cartões do mesmo lote. A numeração dos cartões é sequencial, só muda o <a href="http://en.wikipedia.org/wiki/Luhn_algorithm" target="_blank">dígito verificador</a> (que segue o padrão do cartão de crédito). No extrato sai o nome do local aonde o dinheiro foi debitado. Assim, é perfeitamente possível rastrear os meus coleguinhas;</li>
<li>Posso fazer coleta automática do extrato, assim saberei de antemão se fui debitado indevidamente. Poderia receber avisos de débito/crédito por email, mas o email está morrendo, e o hype do momento são os leitores de feed (<em>sarcasmo mode off</em>).</li>
</ol>
<p>Acabei optando pela segunda opção. Aliás, aproveitei para fazer um test drive do <a href="https://www.dotcloud.com/" target="_blank">DotCloud</a>, e gostei!</p>
<p>Então, o negócio é o seguinte. Pegue o seu Ticket. Entre em <a href="http://ticket.iwatcher.net/" target="_blank">http://ticket.iwatcher.net/</a>. Preencha o respectivo campo, e gere URL do <em>tracker</em>. Eu gosto do <a href="https://www.google.com/reader/" target="_blank">Google Reader</a>, mas funciona em qualquer outro agregador de feeds. A ideia central é: para cada "ping" no <em>tracker</em>, o webservice rodará um scrapper no site oficial, e gerará um feed a partir dos dados coletados. Assim, você terá um feed de notícias gerado pelos seus hábitos gastronômicos <img src='http://sysd.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Uma observação importantíssima a respeito da privacidade dos dados: o número do seu Ticket é transferido em <em>plaintext</em>, assim como no site oficial. Obviamente, dessa forma ele acaba parando no <em>access.log</em> do servidor. Não tem como evitar isso. Já os dados das transações <strong>não estão sendo replicadas em nenhum banco de dados</strong>. Traduzindo: eu não sei o que se passa na sua conta, caso você venha a utilizar o meu webservice. Nem pretendo saber. Mas, de posse dos logs dos servidores, é perfeitamente possível acessar o extrato referente a cada Ticket consultado, visto que o site oficial não utiliza nenhum tipo de PIN/senha.</p>
<p>Ah, e o layout da página do gerador de feeds fica uma nhaca no Firefox. Eu não sei corrigir <img src='http://sysd.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Alguém com um bom domínio de CSS <a href="https://github.com/creaktive/TicketFeed" target="_blank">se habilita</a>?</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/TSDjGWHPudE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/ticketfeed-alimentando-o-seu-leitor-de-feeds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://sysd.org/ticketfeed-alimentando-o-seu-leitor-de-feeds/</feedburner:origLink></item>
		<item>
		<title>Perl e módulos na $HOME</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/ChHDHJn20Ko/</link>
		<comments>http://sysd.org/perl-e-modulos-na-home/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 14:03:37 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[CPAN]]></category>
		<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[local::lib]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=316</guid>
		<description><![CDATA[Mas, por quê?! Qual o sentido de alguém instalar os módulos dentro do seu $HOME? Normalmente, uma das duas: Você não tem permissão suficiente para instalar no próprio sistema (você está mexendo num servidor ou coisa do tipo); Você está desenvolvendo a bagaça, e quer manter a versão bleeding edge só para você. Bom, se for [...]]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: center;"><img class="aligncenter size-full wp-image-317" title="local::lib" src="http://sysd.org/wp-content/uploads/2011/06/local-lib.png" alt="" width="516" height="337" /></h2>
<h2>Mas, por quê?!</h2>
<p>Qual o sentido de alguém instalar os módulos dentro do seu <code>$HOME</code>? Normalmente, uma das duas:</p>
<ol>
<li>Você não tem permissão suficiente para instalar no próprio sistema (você está mexendo num servidor ou coisa do tipo);</li>
<li>Você está desenvolvendo a bagaça, e quer manter a versão <em>bleeding edge</em> só para você.</li>
</ol>
<p>Bom, se for o 2-o caso, existe o tal do <a href="http://search.cpan.org/perldoc?perlbrew" target="_blank">perlbrew</a>.</p>
<p>Mas eu gosto das instalações locais e as uso desde '97. E o <a href="http://search.cpan.org/perldoc?local::lib" target="_blank">local::lib</a> foi uma mão na roda e tanto! Então, vamos lá:</p>
<h2>Passo-a-passo:</h2>
<p>Download do local::lib:</p>
<pre>curl -LO http://search.cpan.org/CPAN/authors/id/A/AP/APEIRON/local-lib-1.008004.tar.gz
tar xzf local-lib-1.008004.tar.gz
cd local-lib-1.008004/</pre>
<p>Instalação do local::lib:</p>
<pre>perl Makefile.PL --bootstrap=$HOME/perl5
make
make test
make install</pre>
<p>Ativando local::lib na inicialização da shell (<a href="http://www.gnu.org/software/bash/" target="_blank">Bash</a>):</p>
<pre>cat &lt;&lt; PROFILE &gt;&gt; $HOME/.profile

export PERL_MM_USE_DEFAULT=1
eval \$(perl -I\$HOME/perl5/lib/perl5/ -Mlocal::lib)
PROFILE</pre>
<p>Agora, é hora de <em>logoff/logon</em> para quem está acostumado com o Windows, ou então:</p>
<pre>. $HOME/.profile</pre>
<p>Prosseguindo com a configuração/teste do CPAN (essa configuração faz as dependências serem instaladas automaticamente):</p>
<pre>cpan

cpan[1]&gt; o conf prerequisites_policy follow
cpan[2]&gt; o conf commit
cpan[3]&gt; install App::cpanminus
cpan[4]&gt; quit</pre>
<p>Enumerando os módulos instalados:</p>
<pre>perl -MExtUtils::Installed -E 'chdir $ENV{PERL_LOCAL_LIB_ROOT}; my $i = new ExtUtils::Installed; say for $i-&gt;modules'</pre>
<p><em><a href="http://search.cpan.org/perldoc?cpanm" target="_blank">cpanminus</a></em> permite atualizar todos de uma vez, de uma maneira eficiente:</p>
<pre>perl -MExtUtils::Installed -E 'chdir $ENV{PERL_LOCAL_LIB_ROOT}; my $i = new ExtUtils::Installed; say for $i-&gt;modules' | cpanm</pre>
<h2>Referências:</h2>
<ul>
<li><a href="http://sao-paulo.pm.org/artigo/2010/CatalystLocalLib" target="_blank">Catalyst com local::lib</a></li>
<li><a href="http://sipb.mit.edu/doc/cpan/#cheatsheet" target="_blank">Using CPAN</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/sysd/~4/ChHDHJn20Ko" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/perl-e-modulos-na-home/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://sysd.org/perl-e-modulos-na-home/</feedburner:origLink></item>
		<item>
		<title>AdWords + DropBox = WIN!</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/Cji45WmR0jA/</link>
		<comments>http://sysd.org/adwords-dropbox-win/#comments</comments>
		<pubDate>Thu, 19 May 2011 22:20:27 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[AdWords]]></category>
		<category><![CDATA[DropBox]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=307</guid>
		<description><![CDATA[Dropbox é MUITO foda. Se você está lendo isso, certamente concorda, e provavelmente está atrás de uma maneira milagrosa de expandir o storage sem pagar um tostão, não é mesmo? Afinal, 2GB (default no momento da escrita do presente post) é menor até do que a caixa do GMail. O próprio Dropbox oferece várias "gincanas" [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://j.mp/kpE9kx"><img class="size-full wp-image-314 aligncenter" title="Logo Dropbox" src="http://sysd.org/wp-content/uploads/2011/05/dropbox-logo1.png" alt="" width="350" height="350" /></a></p>
<p>Dropbox é <strong>MUITO</strong> foda. Se você está lendo isso, certamente concorda, e provavelmente está atrás de uma maneira milagrosa de expandir o <em>storage</em> sem pagar um tostão, não é mesmo? Afinal, 2GB (default no momento da escrita do presente post) é menor até do que a caixa do GMail.<br />
O próprio Dropbox oferece várias "gincanas" através das quais as pessoas tem chances de catar algumas migalhas de <em>storage</em>, mas o que realmente conta são 2 coisas:</p>
<ol>
<li><a href="http://www.dropbox.com/edu" target="_blank">Vincular e-mail de uma faculdade</a> dobra o bônus dos <em>referrals</em> e, conseqüentemente, o espaço máximo possível de ser obtido através dos mesmos (16GB);</li>
<li><em>Referrals</em>, propriamente ditos. Cada pessoa indicada que instala o cliente do Dropbox te acrescenta 250MB grátis (500MB, se você se qualificar no primeiro item).</li>
</ol>
<p>No caso do e-mail, não há muito o que fazer. Ou você tem, ou algum amigo/parente seu tem. Não, um e-mail <span style="text-decoration: underline;">@australia.edu</span> não funciona.</p>
<p>Já os <em>referrals</em>...</p>
<div id="attachment_308" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-308" title="Cupom do Google AdWords" src="http://sysd.org/wp-content/uploads/2011/05/cupom.jpg" alt="" width="400" height="266" /><p class="wp-caption-text">Se você trabalha com çáites já faz um tempinho, deve ter uns par desse no fundo da gaveta...</p></div>
<p>As imagens do <em>walkthrough</em> abaixo são clickáveis <img src='http://sysd.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div id="attachment_309" class="wp-caption aligncenter" style="width: 310px"><a href="http://sysd.org/wp-content/uploads/2011/05/adwords-dropbox.png"><img class="size-medium wp-image-309" title="Campanha de AdWords" src="http://sysd.org/wp-content/uploads/2011/05/adwords-dropbox-300x288.png" alt="" width="300" height="288" /></a><p class="wp-caption-text">Coube no orçamento de R$21,48, e olha que nem sei usar essa bagaça direito! Em apenas 3 dias, mission acomplished.</p></div>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://sysd.org/wp-content/uploads/2011/05/dropbox-referrals.png"></a></p>
<div id="attachment_311" class="wp-caption aligncenter" style="width: 291px"><a href="http://sysd.org/wp-content/uploads/2011/05/dropbox-referrals.png"><img class="size-medium wp-image-311" title="Página de Referrals do Dropbox" src="http://sysd.org/wp-content/uploads/2011/05/dropbox-referrals-281x300.png" alt="" width="281" height="300" /></a><p class="wp-caption-text">De fato, trouxe mais gente do que precisava, pois vários demoraram para instalar o programinha... Espero que algum dia aumentem o máximo de referrals para poder aumentar <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p></div>
<p style="text-align: center;"><a href="http://sysd.org/wp-content/uploads/2011/05/adwords-dropbox.png"></a></p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/Cji45WmR0jA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/adwords-dropbox-win/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/adwords-dropbox-win/</feedburner:origLink></item>
		<item>
		<title>Two thousand volts between my…</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/mBjzT5Yxs8w/</link>
		<comments>http://sysd.org/two-thousand-volts-between-my/#comments</comments>
		<pubDate>Thu, 05 May 2011 02:21:49 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[alta voltagem]]></category>
		<category><![CDATA[bizarro]]></category>
		<category><![CDATA[experimentos]]></category>
		<category><![CDATA[HV]]></category>
		<category><![CDATA[weird]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=300</guid>
		<description><![CDATA[Recapitulando o post mais explosivo desse blog sob uma perspectiva mais... chocante! Simplesmente demais! Bonus para quem curte coisas de cientista maluco de desenho animado, tais como Tesla Coils, Jacob's Ladders e afins: Mike's Electric Stuff - destaque para The Destruct-O-Tron: Tesla Downunder - fico até confuso para indicar algo em especial desse site da [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/Zi_bMYFmFGg?fs=1&amp;hl=pt_BR" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="560" height="349" src="http://www.youtube.com/v/Zi_bMYFmFGg?fs=1&amp;hl=pt_BR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Recapitulando o <a href="http://sysd.org/seek-destroy/">post mais explosivo desse blog</a> sob uma perspectiva mais... chocante! Simplesmente demais!</p>
<p>Bonus para quem curte coisas de cientista maluco de desenho animado, tais como <a href="http://pt.wikipedia.org/wiki/Bobina_de_Tesla" target="_blank">Tesla Coils</a>, <a href="http://en.wikipedia.org/wiki/High_voltage_traveling_arc#Visual_entertainment" target="_blank">Jacob's Ladders</a> e afins:</p>
<ul>
<li><a href="http://www.electricstuff.co.uk/" target="_blank">Mike's Electric Stuff</a> - destaque para <a href="http://www.electricstuff.co.uk/destructotron.html" target="_blank">The Destruct-O-Tron</a>:</li>
</ul>
<p><a href="http://sysd.org/wp-content/uploads/2011/05/mboard2.jpg"><img class="aligncenter size-medium wp-image-301" title="Placa-mãe sendo fritada por alta voltagem!" src="http://sysd.org/wp-content/uploads/2011/05/mboard2-300x132.jpg" alt="" width="300" height="132" /></a></p>
<ul>
<li><a href="http://tesladownunder.com/" target="_blank">Tesla Downunder</a> - fico até confuso para indicar algo em especial desse site da terra do ornitorrinco! Eu não sei o que está acontecendo aqui, mas também quero participar:</li>
</ul>
<p><img class="aligncenter size-full wp-image-303" title="WTF?!?!" src="http://sysd.org/wp-content/uploads/2011/05/Watermelon2.gif" alt="" width="600" height="399" /></p>
<ul>
<li><a href="http://www.lightninglab.org/" target="_blank">Nevada Lightning Laboratory</a> - destaque para <a href="http://www.lightninglab.org/Projects/Other/index.htm" target="_blank">Lorentz Gun</a>:</li>
</ul>
<p><img class="aligncenter size-full wp-image-302" title="Lorentz Gun: o mais perto que a humanidade chegou das pistolas a laser de Star Wars!" src="http://sysd.org/wp-content/uploads/2011/05/LorentzGun.jpg" alt="" width="396" height="318" /></p>
<ul>
<li>E, para fechar com a chave de tungstênio, isso só pode ser fake, de tão grotesco que é:</li>
</ul>
<p style="text-align: center;"><object width="425" height="349"><param name="movie" value="http://www.youtube.com/v/eMEzUp_8az8?fs=1&amp;hl=pt_BR" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="349" src="http://www.youtube.com/v/eMEzUp_8az8?fs=1&amp;hl=pt_BR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/mBjzT5Yxs8w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/two-thousand-volts-between-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/two-thousand-volts-between-my/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.657 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-05-20 04:38:16 --><!-- Compression = gzip -->

