<?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, 18 Jul 2012 11:46:17 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</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>Terminal Velocity</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/lUFCA5oEBi4/</link>
		<comments>http://sysd.org/terminal-velocity/#comments</comments>
		<pubDate>Wed, 18 Jul 2012 11:46:17 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Computer-Human Interface]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[command-line interface]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[overhead]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[tty]]></category>
		<category><![CDATA[velocidade]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=414</guid>
		<description><![CDATA[&#160; Não, não se trata de um fenômeno físico, nem de um videogame, e muito menos de um filme com Charle Sheen. Já que passo a maior parte do dia na frente de um emulador de terminal (a famosa "tela preta com as letrinhas"),  observei que em alguns casos a user experience (se é que posso [...]]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><img class="alignnone size-full wp-image-415" title="Terminal Emulator Overhead" src="http://sysd.org/wp-content/uploads/2012/07/terminal_emulator_overhead.png" alt="" width="509" height="325" /></p>
<p>Não, não se trata de um <a href="http://en.wikipedia.org/wiki/Terminal_velocity" target="_blank">fenômeno físico</a>, nem de <a href="http://en.wikipedia.org/wiki/Terminal_Velocity_(video_game)" target="_blank">um videogame</a>, e muito menos de <a href="http://en.wikipedia.org/wiki/Terminal_Velocity_(film)" target="_blank">um filme com Charle Sheen</a>. Já que passo a maior parte do dia na frente de um emulador de terminal (a famosa "tela preta com as letrinhas"),  observei que em alguns casos a <em>user experience</em> (se é que posso falar assim de <a href="https://en.wikipedia.org/wiki/Command_line_interface" target="_blank">CLI</a>) é mais fluida e agradável do que em outros.</p>
<p>Em outras palavras, <em>bandwidth</em> de saída de caracteres na tela é bastante variável.</p>
<p>Isso é evidente em programas que subvertem a ideia do texto linear, os fabulosos <a href="https://en.wikipedia.org/wiki/Text-based_user_interface" target="_blank">TUI</a>, tais como <a href="http://www.vim.org/" target="_blank">Vim</a> ou <a href="http://www.gnu.org/software/mc/" target="_blank">Midnight Commander</a>. Não é tão evidente em <a href="http://caca.zoy.org/" target="_blank">libcaca</a> ou <a href="https://github.com/atextor/icat" target="_blank">icat</a>, pois são poucas as pessoas que sabem o que é isso e um número ainda menor encontra alguma utilidade para eles.</p>
<p>Felizmente, tendo reduzido "usabilidade" em "bandwidth", quantificar a métrica se torna fácil. É só pegar um texto grande, jogar na tela e cronometrar. "Texto grande", no caso do meu teste, foi o código-fonte do <a href="http://www.perl.org/" target="_blank">Perl v5.16.0</a>, "colorificado" através de <a href="http://www.gnu.org/software/src-highlite/" target="_blank">source-highlight</a>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> ~<span style="color: #000000; font-weight: bold;">/</span>perl-5.16.0 <span style="color: #660033;">-type</span> f <span style="color: #660033;">-name</span> <span style="color: #ff0000;">'*.[cht]'</span> <span style="color: #660033;">-or</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">'*.p[lm]'</span> <span style="color: #660033;">-exec</span> \
    source-highlight <span style="color: #660033;">--failsafe</span> <span style="color: #660033;">--infer-lang</span> <span style="color: #660033;">-f</span> esc <span style="color: #660033;">--style-file</span>=esc.style <span style="color: #660033;">-i</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span> \;</pre></td></tr></table></div>

<p>Depois, listei esse arquivo em cada emulador de terminal, dentro de VMs respectivos de cada OS (isso é, VM de Linux, de Windows e de Mac OS). VM fez-se necessário para "nivelar por baixo": seria injusto comparar VMs de Windows e Linux com o Mac OS nativo. Não mexi em configurações/preferências dos emuladores de terminal: fontes, cores e tamanho da tela são os default de cada "fabricante". O resultado está no gráfico no começo do post, e também nessa tabela:</p>
<table>
<tbody>
<tr>
<th>Terminal</th>
<th>Time (sec)</th>
</tr>
<tr>
<td><a href="http://www.iterm2.com/" target="_blank">iTerm2.app (Mac)</a></td>
<td align="right">12.72</td>
</tr>
<tr>
<td>Terminal.app (Mac)</td>
<td align="right">41.03</td>
</tr>
<tr>
<td>xterm (Mac)</td>
<td align="right">41.52</td>
</tr>
<tr>
<td><a href="https://code.google.com/p/mintty/" target="_blank">mintty (Win32)</a></td>
<td align="right">14.86</td>
</tr>
<tr>
<td>xterm (Linux)</td>
<td align="right">29.70</td>
</tr>
<tr>
<td>Gnome Terminal (Linux)</td>
<td align="right">61.68</td>
</tr>
<tr>
<td>80x24 text-mode console (Linux)</td>
<td align="right">276.68</td>
</tr>
</tbody>
</table>
<p>O que salta aos olhos é que justamente o Linux, o sistema que contribuiu tanto para o "revival" do CLI, é o que tem emuladores de terminal mais lentos. E o terminal mais simples (aquele que no Linux é acessível via Ctrl+Alt+F1; a telona DOS clássica) é, contra-intuitivamente, o mais ineficiente!</p>
<p>É claro que esse benchmark é muito tosco. Talvez seria mais representativo utilizar a mesma fonte em todos os terminais testados, e também maximizar a tela dos mesmos (a quebra de linhas longas costuma ser custosa), além de desabilitar o histórico de scrollback. Fonte com/sem antialiasing e uso/não-uso de <a href="https://en.wikipedia.org/wiki/ANSI_escape_code" target="_blank">ANSI escape sequences</a> também interferem na velocidade da saída. Mas, enfim: a diferença de velocidade é suficientemente grande e perceptível. Portanto, duvido muito que algum ajuste fino deixará Gnome Terminal mais rápido do que iTerm2.app.</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/lUFCA5oEBi4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/terminal-velocity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sysd.org/terminal-velocity/</feedburner:origLink></item>
		<item>
		<title>InterNOT Explorer</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/BysdkQynifk/</link>
		<comments>http://sysd.org/internot-explorer/#comments</comments>
		<pubDate>Sat, 14 Jul 2012 15:15:25 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[deprecation]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[navegador]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=409</guid>
		<description><![CDATA[Antes de me taxarem de hater ou fanboy: já usei muito o Internet Explorer. Também já usei muito o Netscape, Mozilla, Opera, Firefox e Chrome. E "muito", para mim, traduz como "por mais de um ano". Só não usei o Safari pois a primeira coisa que fiz ao migrar para Mac foi instalar um navegador [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-410" title="IE trollface" src="http://sysd.org/wp-content/uploads/2012/07/IE-trollface.png" alt="" width="469" height="450" /></p>
<p>Antes de me taxarem de hater ou fanboy: já usei muito o Internet Explorer. Também já usei muito o Netscape, Mozilla, Opera, Firefox e Chrome. E "muito", para mim, traduz como "por mais de um ano". Só não usei o Safari pois a primeira coisa que fiz ao migrar para Mac foi instalar um navegador familiar, para não se sentir tão deslocado.</p>
<p>Acredito que usei todos esses navegadores no seu auge, dadas as circunstâncias: Opera era imbatível nos Lentium com 32MB de RAM da faculdade. Firefox era absurdamente mais leve do que o Mozilla, e tão completo quanto. Depois que engordou, migrei pro Chrome. Netscape Gold não tinha muitas alternativas na época do Windows 3.11. E o Internet Explorer... Por um bom tempo estava na vanguarda, era leve e com recursos (proprietários) muito interessantes.</p>
<p>Como sempre acontece, tudo o que sobe, tem que descer. Hoje, todos os webdevelopers odeiam o Internet Explorer e vibram com a perda do <a href="https://en.wikipedia.org/wiki/Usage_share_of_web_browsers" target="_blank">browser share</a> pelo mesmo, porém, parafraseando o Mark Twain, "os rumores sobre a sua morte são, sempre, um tanto exagerados". Independente da métrica adotada (pois, dependendo da métrica, o share do IE varia de 16.7% a 32.31%, na metade de 2012), o declínio da popularidade é evidente.</p>
<p>Esta seria a história do lado dos usuários. Mas o que me chamou atenção, recentemente, é a história do lado dos webdevs. Especialmente essas três notícias:</p>
<ol>
<li><a href="http://www.internetnews.com/blog/skerner/skip-internet-explorer-for-web-dev.-save-100000.html">Startup afirma ter economizado 100 mil Obamas deixando do lado a compatibilidade do seu produto com o Internet Explorer</a>;</li>
<li><a href="http://www.afr.com/p/technology/use_old_internet_explorer_its_gonna_QkUaorCaSIWcDUqehtguOJ">Online shop cria "imposto Internet Explorer": clientes usando esse navegador pagam mais</a> (a justificativa é a dificuldade de manter uma versão compatível do site);</li>
<li><a href="http://arstechnica.com/information-technology/2012/07/jquery-2-0-javascript-framework-to-drop-support-for-ie-6-7-and-8/">jQuery 2.0 abandonará o suporte a Internet Explorer 6, 7 e 8</a>.</li>
</ol>
<p>Seria equivocado afirmar que são essas as medidas que colocarão os últimos pregos no caixão do infame navegador da Microsoft. Para mim, estas são as evidências de que o seu share está, de fato, baixo o bastante para ser desprezado.</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/BysdkQynifk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/internot-explorer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sysd.org/internot-explorer/</feedburner:origLink></item>
		<item>
		<title>Google Refine + Perl (English)</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/vOWfReg_1cU/</link>
		<comments>http://sysd.org/google-refine-perl-english/#comments</comments>
		<pubDate>Sat, 02 Jun 2012 13:19:16 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tradução]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[GeoDNA]]></category>
		<category><![CDATA[Google Refine]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[integration]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[Mojolicious]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=392</guid>
		<description><![CDATA[(Portuguese version here) Google Refine is awesome. If you're unaware of what it is, access their official page and watch at least the first screencast. You'll see it can be helpful for several ETL-related tasks. Currently, I use it a lot, specially for simple (but boring) tasks, like loading a CSV, trimming out some outliers and [...]]]></description>
				<content:encoded><![CDATA[<p>(<a href="http://sysd.org/google-refine-perl/">Portuguese version here</a>)</p>
<p><a href="https://code.google.com/p/google-refine/" target="_blank">Google Refine</a> is awesome. If you're unaware of what it is, access their official page and watch at least the first screencast. You'll see it can be helpful for several <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load" target="_blank">ETL</a>-related tasks.</p>
<p>Currently, I use it a lot, specially for simple (but boring) tasks, like loading a CSV, trimming out some outliers and saving as JSON to be imported into <a href="http://www.mongodb.org/" target="_blank">MongoDB</a>. Nothing a Perl one-liner couldn't do.</p>
<p>However, the opposite is not true: Perl one-liners are a lot more flexible than Google Refine. Now, what if we could merge both?</p>
<ol>
<li>Google Refine <a href="https://code.google.com/p/google-refine/wiki/FetchingURLsFromWebServices" target="_blank">could be easily integrated with any RESTful API</a>.</li>
<li>Perl transforms one-liners into <a href="http://mojolicio.us/perldoc/ojo" target="_blank">RESTful webservices</a>.</li>
<li>PROFIT!!!</li>
</ol>
<p>As a practical example, I'll use some georeferenced data I was working at. Let's suppose I have to deduplicate registers, and one of "duplicate" rules is their proximity on the map. Google Refine is far from a full-featured <a href="https://en.wikipedia.org/wiki/GIS" target="_blank">GIS</a>, and is unable to handle bidimensional coordinate system. Enter the <a href="http://www.geodna.org/docs/google-maps.html" target="_blank">GeoDNA</a>: an algorithm to lower geospatial dimensions. As it's FAQ says,</p>
<blockquote><p>GeoDNA is a way to represent a latitude/longitude coordinate pair as a string. That sounds simple enough, but it's a special string format: the longer it is, the more accurate it is. More importantly, each string uniquely defines a region of the earth's surface, so in general, GeoDNA codes with similar prefixes are located near each other. This can be used to perform proximity searching <strong>using only string comparisons</strong> (like the SQL "LIKE" operator).</p></blockquote>
<p>Another interesting property of GeoDNA is that when ordening a set of records by their GeoDNA code, close locations are likely to appear in adjacent rows (sometimes, close locations will share very different prefixes, but similar prefixes <strong>always</strong> represent close locations).</p>
<p>To incorporate GeoDNA into Google Refine, we'll use the <em>Add column by fetching URLs</em> option, clicking on the header of any column (which column it will be doesn't matter as we'll use two of them, anyway):</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 &gt; 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>As the expression, we'll paste the following code (here, pay attention to the correct latitude/longitude column names):</p>

<div class="wp_syntax"><table><tr><td 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></td></tr></table></div>

<p>Throttle delay can be zeroed, as our webservice is local. The final configuration should look like this (don't push the OK button, yet):</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>Now, check if you have <a href="https://metacpan.org/module/Mojolicious" target="_blank">Mojolicious</a> and <a href="https://metacpan.org/module/Geo::DNA" target="_blank">Geo::DNA</a> Perl modules (install them via CPAN, if not) and paste into your terminal:</p>

<div class="wp_syntax"><table><tr><td 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></td></tr></table></div>

<p>If you prefer a "human-readable" version, paste the following code into <code>geocode-webservice.pl</code>:</p>

<div class="wp_syntax"><table><tr><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>Once you started a webservice, it will report <em>Server available at http://127.0.0.1:3000</em>. Now, click OK on Google Refine dialog and wait. Even without delay, it could be a bit slow; however, even then this hack saved me a lot of time <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/vOWfReg_1cU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/google-refine-perl-english/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sysd.org/google-refine-perl-english/</feedburner:origLink></item>
		<item>
		<title>SQL  MongoDB</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/kOX2Paf9MRc/</link>
		<comments>http://sysd.org/sql-mongodb/#comments</comments>
		<pubDate>Sun, 27 May 2012 20:00:17 +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[cheatsheet]]></category>
		<category><![CDATA[cola]]></category>
		<category><![CDATA[infogrático]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[relação]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=401</guid>
		<description><![CDATA[Esse post nada mais é do que a divulgação de um fabuloso infográfico feito por Rick Osborne. Esbarrei nele buscando por alguma coisa relacionada ao MongoDB que não lembro mais, e fiquei encantado. Longe de ser algo que ninguém nunca fez (exemplos do driver do Perl são, convenhamos, mais práticos), ficou condensado e elegante. Have [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_403" class="wp-caption alignnone" style="width: 496px"><a href="http://sysd.org/wp-content/uploads/2012/05/SQL-to-MongoDB.pdf" target="_blank"><img class="size-full wp-image-403" title="SQL to MongoDB" src="http://sysd.org/wp-content/uploads/2012/05/SQL-to-MongoDB.png" alt="" width="486" height="384" /></a><p class="wp-caption-text">(clique para ampliar)</p></div>
<p>Esse post nada mais é do que a divulgação de um <a href="http://rickosborne.org/blog/2010/02/infographic-migrating-from-sql-to-mapreduce-with-mongodb/">fabuloso infográfico feito por Rick Osborne</a>. Esbarrei nele buscando por alguma coisa relacionada ao MongoDB que não lembro mais, e fiquei encantado. Longe de ser algo que ninguém nunca fez (<a href="https://metacpan.org/module/MongoDB::Examples" target="_blank">exemplos do driver do Perl</a> são, convenhamos, mais práticos), ficou condensado e elegante. Have fun!</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/kOX2Paf9MRc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/sql-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/sql-mongodb/</feedburner:origLink></item>
		<item>
		<title>DuckDuckGo por um mês: NICE!</title>
		<link>http://feedproxy.google.com/~r/sysd/~3/zujscHqvzdA/</link>
		<comments>http://sysd.org/duckduckgo-por-um-mes/#comments</comments>
		<pubDate>Sat, 26 May 2012 14:16:20 +0000</pubDate>
		<dc:creator>stas</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[alternativa]]></category>
		<category><![CDATA[duckduckgo]]></category>
		<category><![CDATA[SE]]></category>
		<category><![CDATA[search engine]]></category>

		<guid isPermaLink="false">http://sysd.org/?p=395</guid>
		<description><![CDATA[Disclaimer: isso não é um post patrocinado, eu realmente pretendo continuar usando o DuckDuckGo, e estou citando apenas algumas das razões. Também não sou hater, uso o Chrome, Gmail, Reader, Drive, Picasa, Maps, Calendar... Só não uso o Plus Deixando as coisas bem claras: não sou uma pessoa que se preocupa (excessivamente) com privacidade. Quanto [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://sysd.org/wp-content/uploads/2012/05/borat.jpg"><img class="alignnone size-full wp-image-396" title="Great Success!" src="http://sysd.org/wp-content/uploads/2012/05/borat.jpg" alt="" width="402" height="323" /></a></p>
<p><em>Disclaimer</em>: isso não é um post patrocinado, eu realmente pretendo continuar usando o <a href="http://duckduckgo.com/" target="_blank">DuckDuckGo</a>, e estou citando apenas algumas das razões. Também não sou <em>hater</em>, uso o Chrome, Gmail, Reader, Drive, Picasa, Maps, Calendar... Só não uso o Plus <img src='http://sysd.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Deixando as coisas bem claras: não sou uma pessoa que se preocupa (excessivamente) com privacidade. Quanto assunto é propaganda, Google faz um excelente trabalho, <strong>sugerindo</strong> produtos/serviços de acordo com o <a href="https://www.google.com/settings/ads/onweb/" target="_blank">perfil individual do usuário</a>. Não tenho nada contra Google montar o meu perfil para me direcionar propaganda mais relevante. Até já comprei produto pelo anúncio do Google.</p>
<p>O que me incomoda é a tentativa de adaptar os resultados de busca de acordo com o tal perfil: o infame <a href="http://en.wikipedia.org/wiki/Filter_bubble" target="_blank">filter bubble</a>. É o tipo de coisa que, quando acerta, pensamos <em>"ooown, que bonitinho!"</em>; já quando erra, <em>"programa imbecil do !@#$%ˆ&amp;"</em>. Concordo que pode funcionar muito bem para 99% das pessoas, mas evidentemente, não sou uma delas, pois para mim, enche o saco demais. Exemplo mais tosco possível: buscar por uma mensagem de erro em um programa relativamente popular. Para mim, Google retorna a pior fonte de informação possível: fóruns nacionais com um bando de gente perguntando o que é esse erro e ninguém sabendo resolver.</p>
<p>Ou então esses malditos de portais de downloads (não vou citar o nome pois "que falem mal, mas falem de mim" ainda é SEO). Quero o <strong>site oficial</strong> da bagaça, não alguma versão antiga para um sistema operacional tosco (sem nomes também)! Felizmente, <a href="https://www.google.com.br/reviews/t?hl=pt" target="_blank">dá para auto-censurar os resultados do Google</a> quanto a esse tipo de coisa. Mas eu ainda prefiro que esse não seja o comportamento default.</p>
<p>Sem falar do modo "Maria-vai-com-as-outras"; aquela relevância alavancada de acordo com o seu círculo de contatos. OK, de certa forma, a médio/longo prazo, isso ajudará as pessoas a perguntarem coisas para o Google antes de perguntarem para a pessoa do lado. Mas, a curto prazo, é uma diminuição da <em>filter bubble</em>.</p>
<p>Bom, enfim, eu já sabia que o <a href="http://duckduckgo.com/" target="_blank">DuckDuckGo</a> resolveria os meus problemas (imaginários ou não). Só faltava coragem para efetivamente começar a usar. O empurrãozinho veio do <a href="https://twitter.com/garu_rj/" target="_blank">@garu_rj</a>:</p>
<p><a href="https://twitter.com/garu_rj/status/194686950467321856"><img class="alignnone size-full wp-image-399" title="Twitter / garu_rj: Não uso a busca do Google" src="http://sysd.org/wp-content/uploads/2012/05/garu_rj_tweet.png" alt="" width="450" height="320" /></a></p>
<p>Então, é realmente possível sobreviver a base do DDG! Claro, estou nessa há apenas 1 mês... Já percebi que algumas vezes devo apelar para o "fallback" para Google; pois coisa muito obscura é com ele mesmo (o interessante é que coisas incomuns quase não sofrem dos efeitos do <em>filter bubble</em>: metadados são insuficientes para até para uma confusão). Mas, digamos, 99% das minhas buscas (segunda vez esse número nesse post...) o DDG atende.</p>
<p>Veredito: vale a pena!</p>
<img src="http://feeds.feedburner.com/~r/sysd/~4/zujscHqvzdA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sysd.org/duckduckgo-por-um-mes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sysd.org/duckduckgo-por-um-mes/</feedburner:origLink></item>
		<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"><table><tr><td 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></td></tr></table></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"><table><tr><td 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></td></tr></table></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"><table><tr><td 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></td></tr></table></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: #000066; 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: #000066; 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: #000066; 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: #000066; 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: #000066; 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: #000066; 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: #000066; 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: #000066; font-weight: bold;">var</span> prob <span style="color: #339933;">=</span> <span style="">Math</span>.<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> <span style="">Math</span>.<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: #000066; 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: #000066; 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: #000066; 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: #000066; 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><span style="color: #003366; font-weight: bold;">Infinity</span> <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: #000066; 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;
print<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>2</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>
	</channel>
</rss><!-- Dynamic page generated in 0.971 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-04-19 19:14:04 --><!-- Compression = gzip -->
