<?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>George Guimarães on Tech</title>
	
	<link>http://blog.georgeguimaraes.com</link>
	<description>Tecnologia, computação, novidades, startups, geek stuff e afins</description>
	<lastBuildDate>Tue, 14 Jul 2009 01:06:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GeorgeOnTech" type="application/rss+xml" /><feedburner:browserFriendly>Você está prestes a assinar o feed do meu blog. Se você usa algum dos serviços ao lado, basta clicar no botão correspondente. Se você usa seu próprio agregador RSS, basta usar a URL desta página (http://feeds.feedburner.com/GeorgeOnTech). Ou se você quer apenas ler o feed através do seu browser, sinta-se à vontade e leia o conteúdo abaixo. O endereço do blog é http://georgeguimaraes.blogspot.com .</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Remova arquivos do cache de disco</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/5c9vgHZpvh4/</link>
		<comments>http://blog.georgeguimaraes.com/2009/07/remova-arquivos-do-cache-de-disco/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 01:06:07 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=245</guid>
		<description><![CDATA["Será que o George tá louco? Cache não é bom?"
Quem lê meu blog sabe que gosto muito de estratégias de cache, principalmente usando o famoso memcached.
Porém às vezes o cache do seu file system atrapalha. Em procedimentos de benchmark (principalmente de DB), no qual você quer analisar apenas uma das camadas de software, o ideal [...]]]></description>
			<content:encoded><![CDATA[<p>"Será que o George tá louco? Cache não é bom?"</p>
<p>Quem lê meu blog sabe que gosto muito de estratégias de cache, principalmente usando o famoso <a href="http://www.danga.com/memcached/">memcached</a>.</p>
<p>Porém às vezes o cache do seu file system atrapalha. Em procedimentos de benchmark (principalmente de DB), no qual você quer analisar apenas uma das camadas de software, o ideal é desativar o cache. Você pode fazer isso setando algumas opções no /proc, desativando o cache pelo /etc/fstab ou melhor ainda: use o <a href="http://mituzas.lt/2009/06/26/uncache/">uncache</a>!</p>
<p>A vantagem do <a href="http://mituzas.lt/2009/06/26/uncache/">uncache</a> é 'descachear' arquivos específicos, sem alterar os outros arquivos do disco. Afinal, você pode querer desativar o cache dos arquivos de banco de dados (que deveriam estar num disco separado, pra aumentar o throughput), mas não desativar o cache do restante dos arquivos.</p>
<p>E o código fonte (em C) é muito pequeno. Mais um ponto positivo.</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/5c9vgHZpvh4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2009/07/remova-arquivos-do-cache-de-disco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2009/07/remova-arquivos-do-cache-de-disco/</feedburner:origLink></item>
		<item>
		<title>Brain teaser sobre criptografia</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/sQQMnYtG_ao/</link>
		<comments>http://blog.georgeguimaraes.com/2009/07/brain-teaser-sobre-criptografia/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 03:12:12 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=243</guid>
		<description><![CDATA[Essa eu li num livro sobre brain teasers (aqueles quebra-cabeças que às vezes o pessoal de RH usa nas contratações) e que pode ser usado pra testar se um candidato realmente entendeu os conceitos de chaves públicas e privadas (pra ser usado, por exemplo no SSH).
Esse é um dos melhores do livro.
O teaser envolve objetos [...]]]></description>
			<content:encoded><![CDATA[<p>Essa eu li num livro sobre brain teasers (aqueles quebra-cabeças que às vezes o pessoal de RH usa nas contratações) e que pode ser usado pra testar se um candidato realmente entendeu os conceitos de chaves públicas e privadas (pra ser usado, por exemplo no SSH).</p>
<p>Esse é um dos melhores do livro.</p>
<p>O teaser envolve objetos reais. A decisão é sua se você vai fazer o teaser com os objetos na frente da pessoa ou se vai deixar o cara pensar de modo abstrato.</p>
<blockquote><p>Entrevistador: Tenho um pequeno baú com uma aba que pode ser trancada com cadeado. Quero te mandar o conteúdo do baú de modo seguro através de uma transportadora (meio físico não-confiável). Obviamente, não faz muito sentido mandar o baú e depois mandar a chave do cadeado ('segredo' do cadeado fica comigo). Como fazer?</p></blockquote>
<p>Uma resposta aceitável seria:</p>
<blockquote><p>Mande-me o baú trancado com seu cadeado. Irei trancá-lo uma segunda vez com um cadeado <strong>meu</strong> e manderei o baú de volta. Você poderá destrancar o <strong>seu</strong> cadeado e mandar o baú novamente pra mim. Quando ele chegar, basta destrancar o <strong>meu</strong> cadeado e terei acesso ao conteúdo. Durante todo o tempo na transportadora, o baú permanecerá trancado.</p></blockquote>
<p>Não sou muito fã de brain teasers em contratações, mas gosto de discutir sobre eles.</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/sQQMnYtG_ao" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2009/07/brain-teaser-sobre-criptografia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2009/07/brain-teaser-sobre-criptografia/</feedburner:origLink></item>
		<item>
		<title>Vídeos da NOSQL</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/ePAsL8Bc6YM/</link>
		<comments>http://blog.georgeguimaraes.com/2009/07/videos-da-nosql/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 01:18:13 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=241</guid>
		<description><![CDATA[Quem quiser dar uma pincelada sobre bancos de dados não-relacionais, pode acessar esse link.
São gravações das palestras que rolaram na NOSQL, em São Francisco, em maio. São palestras de 40 minutos com diversos bancos de dados "do momento", como Hypertable, CouchDB, MongoDB, Voldemort.
Fiquei com vontade de organizar algo assim. Estou pensando seriamente no assunto. =)
]]></description>
			<content:encoded><![CDATA[<p>Quem quiser dar uma pincelada sobre bancos de dados não-relacionais, pode acessar esse <a href="http://vimeo.com/user1906695/videos">link</a>.</p>
<p>São gravações das palestras que rolaram na NOSQL, em São Francisco, em maio. São palestras de 40 minutos com diversos bancos de dados "do momento", como Hypertable, CouchDB, MongoDB, Voldemort.</p>
<p>Fiquei com vontade de organizar algo assim. Estou pensando seriamente no assunto. =)</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/ePAsL8Bc6YM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2009/07/videos-da-nosql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2009/07/videos-da-nosql/</feedburner:origLink></item>
		<item>
		<title>Instalando a gem rmagick no Ubuntu 9.04</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/Sgv03nJ7Cls/</link>
		<comments>http://blog.georgeguimaraes.com/2009/06/instalando-a-gem-rmagick-no-ubuntu-904/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 20:23:17 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=239</guid>
		<description><![CDATA[Este é um post rápido para que eu lembre depois. Se servir para você, melhor ainda =)
Estou usando o Ubuntu 9.04 Jaunty Jackalope mas com ruby compilado por mim. Não estou usando os pacotes do Ubuntu. Mas quero usar o ImageMagick pelos pacotes do Ubuntu, sem ter que compilar o fonte.
Então...
sudo apt-get install libmagickcore-dev libmagick++-dev
sudo [...]]]></description>
			<content:encoded><![CDATA[<p>Este é um post rápido para que eu lembre depois. Se servir para você, melhor ainda =)</p>
<p>Estou usando o Ubuntu 9.04 Jaunty Jackalope mas com ruby compilado por mim. Não estou usando os pacotes do Ubuntu. Mas quero usar o ImageMagick pelos pacotes do Ubuntu, sem ter que compilar o fonte.</p>
<p>Então...</p>
<p><code>sudo apt-get install libmagickcore-dev libmagick++-dev</code><br />
<code>sudo gem install rmagick</code></p>
<p>Happy coding!</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/Sgv03nJ7Cls" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2009/06/instalando-a-gem-rmagick-no-ubuntu-904/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2009/06/instalando-a-gem-rmagick-no-ubuntu-904/</feedburner:origLink></item>
		<item>
		<title>Apresentação no Rails Summit Latin America 2008</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/1Vd9BiRYl8E/</link>
		<comments>http://blog.georgeguimaraes.com/2008/10/apresentacao-no-rails-summit-latin-america-2008/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 13:13:51 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[capacity planning]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[guerrilla capacity planning]]></category>
		<category><![CDATA[pagestacker]]></category>
		<category><![CDATA[rails summit]]></category>
		<category><![CDATA[railssummit]]></category>
		<category><![CDATA[web operations]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=231</guid>
		<description><![CDATA[Coloquei abaixo os slides que usei na minha apresentação no Rails Summit. Quem tiver alguma dúvida, sugestão, reclamação, pode mandar para mim (george@pagestacker.com), ou deixar um comentário nesse post.
Rails Summit 2008 - Web Operations - George Guimarães - Pagestacker
View SlideShare presentation or Upload your own. (tags: georgeguimaraes guimaraes)

Ainda quero comentar melhor sobre o Summit, mas [...]]]></description>
			<content:encoded><![CDATA[<p>Coloquei abaixo os slides que usei na minha apresentação no Rails Summit. Quem tiver alguma dúvida, sugestão, reclamação, pode mandar para mim (george@pagestacker.com), ou deixar um comentário nesse post.</p>
<div id="__ss_672677" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Rails Summit 2008 - Web Operations - George Guimarães - Pagestacker" href="http://www.slideshare.net/georgeguimaraes/rails-summit-2008-web-operations-george-guimares-pagestacker-presentation?type=powerpoint">Rails Summit 2008 - Web Operations - George Guimarães - Pagestacker</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slideshare.net/swf/ssplayer2.swf?doc=rails-summit-2008-george-guimaraes-1224519583331091-9&amp;stripped_title=rails-summit-2008-web-operations-george-guimares-pagestacker-presentation" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=rails-summit-2008-george-guimaraes-1224519583331091-9&amp;stripped_title=rails-summit-2008-web-operations-george-guimares-pagestacker-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration:underline;" title="View Rails Summit 2008 - Web Operations - George Guimarães - Pagestacker on SlideShare" href="http://www.slideshare.net/georgeguimaraes/rails-summit-2008-web-operations-george-guimares-pagestacker-presentation?type=powerpoint">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/georgeguimaraes">georgeguimaraes</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/guimaraes">guimaraes</a>)</div>
</div>
<p>Ainda quero comentar melhor sobre o Summit, mas fica pra outro post... aguardem... =D</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/1Vd9BiRYl8E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/10/apresentacao-no-rails-summit-latin-america-2008/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/10/apresentacao-no-rails-summit-latin-america-2008/</feedburner:origLink></item>
		<item>
		<title>Pagestacker agora é poliglota. Detecção de idiomas funcionando lindamente.</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/n3dQyy2UNuA/</link>
		<comments>http://blog.georgeguimaraes.com/2008/10/pagestacker-agora-e-poliglota-deteccao-de-idiomas-funcionando-lindamente/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 05:52:40 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[idioma]]></category>
		<category><![CDATA[n-gram]]></category>
		<category><![CDATA[pagestacker]]></category>
		<category><![CDATA[rails rumble]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=202</guid>
		<description><![CDATA[Desde que foi inicialmente criado, o Pagestacker sempre teve interfaces em português e em inglês (mas ainda não é isso que faz dele poliglota).
Quando estávamos perto de começar o nosso trabalho no Pagestacker, ficamos sabendo de um torneio mundial de programação em que os participantes tinham que construir um aplicativo web do zero em exatamente [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que foi inicialmente criado, o <a href="http://www.pagestacker.com">Pagestacker </a>sempre teve interfaces em português e em inglês (mas ainda não é isso que faz dele poliglota).</p>
<p>Quando estávamos perto de começar o nosso trabalho no Pagestacker, ficamos sabendo de um torneio mundial de programação em que os participantes tinham que construir um aplicativo web do zero em exatamente 48 horas.</p>
<p>Achamos que seria uma boa idéia participar e, de fato, dentre cerca de 200 projetos concorrentes, chegamos muito perto de vencer, tendo recebido uma vasta votação do público e uma menção honrosa ao seu final.</p>
<p>O torneio se chama <a href="http://www.railsrumble.com">Rails Rumble</a> e a sua edição seguinte começou neste último final de semana.</p>
<p>Como o idioma oficial do torneio é o inglês, o aplicativo precisava ter interfaces nesse idioma.</p>
<p>Você pode ver abaixo um vídeo, em inglês, com a demonstração dessa primeira versão do Pagestacker (a criação deste vídeo fazia parte dos requisitos da competição) e notar o quanto nós evoluímos desde então, apesar de a maior evolução ter ocorrido mesmo na arquitetura e nos componentes de sistema que ficam "sob o capô" do aplicativo.</p>
<p>httpv://www.youtube.com/watch?v=NRR-XegqI50</p>
<p>Por outro lado, como desenvolvedores brasileiros, não queríamos construir um software cuja interface não estivesse disponível também em português (não havia restrições quanto a isso) e foi assim que o Pagestacker ganhou telas em dois idiomas.</p>
<p>Mas, como eu disse, ainda não é isso que faz do Pagestacker poliglota...</p>
<h3>O Desafio</h3>
<p>Nossa interface em inglês e o destaque internacional (ainda que breve) decorrente do nosso resultado no Rails Rumble nos trouxeram uma ativa comunidade de usuários estrangeiros, principalmente nos Estados Unidos e na Índia.</p>
<p>Por causa disso, os resultados do nosso mecanismo de busca e os rankings de páginas e de sites mais populares no Pagestacker quase sempre mostravam links de diferentes idiomas na mesma tela, independentemente do idioma de interface escolhido pelo usuário.</p>
<p>Nossos usuários nos avisaram de que isso era um grande incômodo para eles (mesmo para os que falam bem os dois idiomas) e decidimos tomar uma providência.</p>
<h3>Aprendendo a falar vários idiomas</h3>
<p>Em nossa pesquisa por métodos de detecção automática de idiomas, encontramos alguns modelos interessantes (como o de bloom filters), mas nenhum deles atingia resultados completamente satisfatórios para nós.</p>
<p>Finalmente, descobrimos o método estatístico das n-grams através do artigo científico abaixo:<br />
<a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.53.9367&amp;rep=rep1&amp;type=pdf">"N-Gram Bases Text Categorization", William B. Cavnar and John M. Trenkle</a> (PDF Download)</p>
<p>Em seguida, procuramos por implementações desse método em software de código aberto (reuso de código é uma virtude).</p>
<p>Encontramos implementações em Perl e em C e fizemos testes de benchmark com elas. A primeira era até bem feita e tinha um índice de acerto razoável, mas era muito lenta. A segunda tinha uma boa performance, mas o algoritmo não estava bem implementado e por isso seus resultados deixavam a desejar.</p>
<p>Inconformados mas decididos, fizemos a nossa própria implementação. Para isso, usamos a linguagem Ruby (já que boa parte do Pagestacker é feita com o framework Ruby on Rails).</p>
<h3>Resultados</h3>
<p>Nossa implementação não só superou as demais nos mesmos testes de benchmark que tínhamos feito antes, tanto em performance como em taxa de acerto, como na verdade chegou a taxas de acerto muito próximas de 100%.</p>
<p>Alguns exemplos de resultados de testes abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;je suis an ingénieur&quot;</span>.<span style="color:#9900CC;">lang</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:fr</span><span style="color:#006600; font-weight:bold;">&#93;</span> Francês
&nbsp;
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;お元気ですか&quot;</span>.<span style="color:#9900CC;">lang</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:ja</span><span style="color:#006600; font-weight:bold;">&#93;</span> Japonês
&nbsp;
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;您好吗&quot;</span>.<span style="color:#9900CC;">lang</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:zh</span><span style="color:#006600; font-weight:bold;">&#93;</span> Chinês
&nbsp;
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;idziemy&quot;</span>.<span style="color:#9900CC;">lang</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:pl</span><span style="color:#006600; font-weight:bold;">&#93;</span> Polonês
&nbsp;
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;olla mundo&quot;</span>.<span style="color:#9900CC;">lang</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:es</span>, <span style="color:#ff3333; font-weight:bold;">:it</span><span style="color:#006600; font-weight:bold;">&#93;</span> Espanhol, Italiano</pre></div></div>

<h3>No Pagestacker</h3>
<p>Ao acessar o Pagestacker pela primeira vez, o idioma da interface que o usuário vê é definido pela sua localização geográfica.</p>
<p>Esse idioma pode ser facilmente alterado pelo usuário, se assim ele quiser, como indicado na imagem abaixo:</p>
<p style="text-align: center;"><a href="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/fotos-idiomas11.jpg"><img class="size-full wp-image-205 aligncenter" title="fotos-idiomas11" src="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/fotos-idiomas11.jpg" alt="" width="500" height="209" /></a></p>
<p style="text-align: center;">
<p style="text-align: center;">
<p>Além disso, durante o processo de criação da sua conta no Pagestacker, o usuário pode escolher o idioma da interface que quer ver quando estiver logado.</p>
<p>Daí em diante, sempre que o usuário voltar ao Pagestacker, o idioma da interface será aquele em uso na sua última visita (tenha ele criado uma conta, feito login ou nenhuma das duas ações).</p>
<p>Quanto ao idioma das páginas nos resultados de busca e nos rankings de páginas e de sites, ele é, a princípio, o mesmo idioma da interface. No entanto, o usuário pode expandir essa opção para incluir as páginas de todos os idiomas, como visto na figura abaixo:</p>
<p><a href="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/fotos-idiomas2.jpg"><img class="aligncenter size-full wp-image-207" title="fotos-idiomas2" src="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/fotos-idiomas2.jpg" alt="" width="500" height="200" /></a></p>
<p>Assim, sempre que o usuário desejar ver apenas as páginas em um dado idioma específico, ele só precisa mudar o idioma da interface tal como indicado na primeira das imagens.</p>
<p>No momento, apesar de já conseguirmos fazer a identificação automática de dezenas de idiomas, oferecemos interfaces apenas em Português e em Inglês.</p>
<p>Interfaces em mais idiomas estão a caminho. =D</p>
<h3>Como o Google faz</h3>
<p>Fizemos todo esse trabalho no Pagestacker de forma completamente independente e empírica, sem referências externas iniciais.</p>
<p>Pouco tempo depois de colocarmos esses resultados no ar, estivemos no evento do Google para webmasters, o Google Search Masters 2008, aqui mesmo em São Paulo.</p>
<p>Foi interessante descobrir durante uma das apresentações que a análise estatística com n-grams é utilizada também pelo Google e não só em seus serviços de tradução automática como também em outras funções como sugestão de correções ortográficas em termos de busca (aquele famoso "Você quis dizer:") e reconhecimento de comandos de voz.</p>
<p><a href="http://googleresearch.blogspot.com/2006/08/all-our-n-gram-are-belong-to-you.html">http://googleresearch.blogspot.com/2006/08/all-our-n-gram-are-belong-to-you.html</a></p>
<p>Posteriormente, descobrimos que as n-grams são ainda empregadas em outras áreas como em seqüenciamento genômico.</p>
<h3>Concluindo</h3>
<p>Este post acabou ficando mais longo do que eu gostaria, mas não mais que o mínimo necessário para fazer justiça a mais essa "aventura" que tive a oportunidade de vivenciar no dia-a-dia do Pagestacker.</p>
<p>Acredito que isso ilustra bem os tipos de problemas com que nos deparamos e nossa forma de trabalho para resolvê-los.</p>
<p>Nossa preocupação número 1 é sempre a qualidade da experiência de uso do nosso aplicativo e não medimos esforços para maximizá-la a fim de tornar o Pagestacker útil e relevante para todos os usuários.</p>
<p>Nossa equipe ainda é pequena e por isso ainda não pudemos fazer tudo aquilo que temos em nossa lista de prioridades nesse sentido, mas estamos avançando de forma sistemática e constante.</p>
<p>Não sabemos de tudo, mas abordamos os problemas de uma forma empírica que freqüentemente tem nos levado a boas soluções (não raramente as melhores possíveis), como no exemplo acima.</p>
<p>Por fim, se você se identifica com esse tipo de rotina e essa forma de trabalho, pode me procurar. =D</p>
<p>O escopo do que fazemos envolve não apenas software, mas também hardware, network, estatística, matemática e usabilidade.</p>
<p>Estamos à procura de engenheiros (e de programadores, designers, estatísticos, matemáticos e cientistas da computação) com esse perfil para nos ajudar em nossa missão com o Pagestacker.</p>
<p>Ainda somos um time de apenas <a href="http://www.pagestacker.com/br/team">5 pessoas</a>. Estamos só começando. =D</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/n3dQyy2UNuA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/10/pagestacker-agora-e-poliglota-deteccao-de-idiomas-funcionando-lindamente/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/10/pagestacker-agora-e-poliglota-deteccao-de-idiomas-funcionando-lindamente/</feedburner:origLink></item>
		<item>
		<title>Desmistificando o load nos sistemas unix, linux, mac e afins</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/osuYY8yKadM/</link>
		<comments>http://blog.georgeguimaraes.com/2008/10/desmistificando-o-load-nos-sistemas-unix-linux-mac-e-afins/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 15:44:16 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[capacity planning]]></category>
		<category><![CDATA[guerrilla capacity planning]]></category>
		<category><![CDATA[gunther]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[neil gunther]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=179</guid>
		<description><![CDATA[Quem administra servidores sabe que diversos comandos do *nix, como o top, uptime mostram uma métrica de carga no servidor, chamado "load average".
Como exemplo, o comando top nos mostra:

top - 15:48:52 up 58 days, 23:14,  1 user,  load average: 0.13, 0.11, 0.07
Tasks:  85 total,   1 running,  84 sleeping,  [...]]]></description>
			<content:encoded><![CDATA[<p>Quem administra servidores sabe que diversos comandos do *nix, como o top, uptime mostram uma métrica de carga no servidor, chamado "load average".</p>
<p>Como exemplo, o comando top nos mostra:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">top - <span style="color: #000000;">15</span>:<span style="color: #000000;">48</span>:<span style="color: #000000;">52</span> up <span style="color: #000000;">58</span> days, <span style="color: #000000;">23</span>:<span style="color: #000000;">14</span>,  <span style="color: #000000;">1</span> user,  load average: <span style="color: #000000;">0.13</span>, <span style="color: #000000;">0.11</span>, <span style="color: #000000;">0.07</span>
Tasks:  <span style="color: #000000;">85</span> total,   <span style="color: #000000;">1</span> running,  <span style="color: #000000;">84</span> sleeping,   <span style="color: #000000;">0</span> stopped,   <span style="color: #000000;">0</span> zombie</pre></div></div>

<p>Na primeira linha, temos as três métricas do load. Já vou adiantando e dizendo que elas se referem a uma média de 5, 10 e 15 minutos da carga do computador.</p>
<p>Essa métrica é importante do ponto de vista de planejamento de operações de servidores e data centers. Contudo, é difícil obter mais informações de como essas métricas são obtidas.</p>
<p>O <a href="http://en.wikipedia.org/wiki/Neil_Gunther">Neil Gunther</a>, um pesquisador renomado em capacity planning e autor do excelente <a href="http://www.amazon.com/gp/product/3540261389?ie=UTF8&amp;tag=geoontec-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=3540261389">Guerrilla Capacity Planning</a> publicou uma série de artigos sobre o load average no TeamQuest. Pra resumir um pouco, os pontos principais (fugindo um pouco do formalismo matemático):</p>
<p>Intuitavamente, aprendemos que devemos nos manter longe de números altos no load average. Mas ninguém sabe direito o quão alto.</p>
<p>O load aproxima a curva do tamanho da fila de processos no kernel (em estado RUNNING ou RUNNABLE). Como essa fila muda muito rapidamente, o load é, na verdade, uma média móvel com atenuação exponencial. Na verdade, isso é um filtro passa-baixas, muito comuns em engenharia elétrica. Ou melhor ainda, é um sistema de primeira ordem (para os engenheiros de controle de plantão) com diferentes constantes de tempo (5, 10 e 15min).<br />
<center><br />
<div id="attachment_195" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/lafull.gif"><img class="size-medium wp-image-195" title="lafull" src="http://blog.georgeguimaraes.com/wp-content/uploads/2008/10/lafull.gif" alt="Exemplo do Load Average" width="300" height="187" /></a><p class="wp-caption-text">Exemplo do Load Average</p></div><br />
</center><br />
Portanto, o load é um número absoluto. E não uma porcentagem de uso, ou de carga, como estamos acostumados a ver (como a ocupação do processador).</p>
<p>Bem, não vou ficar repetindo o artigo todo. Quem tiver curiosidade de saber mais sobre esses números mágicos, os artigos principais são:</p>
<p><a href="http://www.teamquest.com/resources/gunther/display/5/index.htm">UNIX Load Average Part 1: How It Works</a></p>
<p><a href="http://www.teamquest.com/resources/gunther/display/7/index.htm">UNIX Load Average Part 2: Not Your Average Average</a></p>
<p>Boa leitura!</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/osuYY8yKadM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/10/desmistificando-o-load-nos-sistemas-unix-linux-mac-e-afins/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/10/desmistificando-o-load-nos-sistemas-unix-linux-mac-e-afins/</feedburner:origLink></item>
		<item>
		<title>Autenticação delegada no Pagestacker</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/lejNHHOhNyw/</link>
		<comments>http://blog.georgeguimaraes.com/2008/10/autenticacao-delegada-no-pagestacker/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 21:06:31 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=191</guid>
		<description><![CDATA[O Hugo fez um belo post sobre os conceitos da autenticação delegada e sobre como usamos isso dentro do Pagestacker, para importar seus contatos de emails sem saber a sua senha.
Além disso, o Hugo é criador da biblioteca Contacts, para acessar os webservices do Gmail, Hotmail e Yahoo Mail.
Confira aqui.
]]></description>
			<content:encoded><![CDATA[<p>O Hugo fez um belo post sobre os conceitos da autenticação delegada e sobre como usamos isso dentro do <a href="http://www.pagestacker.com">Pagestacker</a>, para importar seus contatos de emails sem saber a sua senha.</p>
<p>Além disso, o Hugo é criador da biblioteca Contacts, para acessar os webservices do Gmail, Hotmail e Yahoo Mail.</p>
<p>Confira <a href="http://hugobarauna.blogspot.com/2008/10/importando-sua-lista-de-contatos-de.html">aqui</a>.</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/lejNHHOhNyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/10/autenticacao-delegada-no-pagestacker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/10/autenticacao-delegada-no-pagestacker/</feedburner:origLink></item>
		<item>
		<title>Programação Assíncrona</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/E7VvdBUZvNY/</link>
		<comments>http://blog.georgeguimaraes.com/2008/10/programacao-assincrona/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 12:49:46 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[pagestacker]]></category>
		<category><![CDATA[rails summit]]></category>
		<category><![CDATA[railssummit]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=176</guid>
		<description><![CDATA[Um dos conceitos que considero chave para a escalabilidade é a programação assíncrona.
Ela consiste em realizar qualquer tarefa (job) mais pesada em termos de recursos computacionais em um processo ou até mesmo máquina separada, fora do workflow natural do seu aplicativo web.
Aprendemos isso desde o começo do Pagestacker. Na primeira versão, a que ficou pronta [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos conceitos que considero chave para a escalabilidade é a programação assíncrona.</p>
<p>Ela consiste em realizar qualquer tarefa (job) mais pesada em termos de recursos computacionais em um processo ou até mesmo máquina separada, fora do workflow natural do seu aplicativo web.</p>
<p>Aprendemos isso desde o começo do <a href="http://www.pagestacker.com">Pagestacker</a>. Na primeira versão, a que ficou pronta em 48 horas para o <a href="http://blog.georgeguimaraes.com/2007/09/pagestackr-bookmark-inteligente/">Rails Rumble 2007</a>, a importação de itens do delicious era síncrona. Ou seja, assim que o usuário clicava em 'importar', o processo Rails acessava o webservice do delicious, baixava o XML, lia o arquivo todo e começava a processar cada item e adicionar ao Pagestacker.</p>
<p>Obviamente, se o usuário tivesse poucos itens no delicious, a importação funcionava sem problemas. Porém, se o cara tivesse mais de mil itens, o processo Rails demorava tanto que ele "esquecia" de responder ao navegador do usuário, e um erro de timeout ocorria (geralmente na conexão TCP do sistema operacional do usuário).</p>
<p>Uma das primeiras mudanças que fizemos após o Rails Rumble foi deixar esse processamento assíncrono. Agora, o processo Rails apenas baixa o XML do usuário e retorna à operação normal. Um outro processo, em background, cuida de ler esse XML e criar os bookmarks dentro do Pagestacker.</p>
<p>Temos portanto, três componentes fundamentais:</p>
<ul>
<li>o produtor, que vai gerar os jobs que serão executados;</li>
<li>o consumidor, que vai executar os jobs;</li>
<li>a fila, que é a "cola" (ou seja, a interface) entre o produtor e o consumidor.</li>
</ul>
<p>Na minha opinião, o componente mais importante é a fila. Ela tem um trabalho crítico. Guardar as mensagens com os jobs a serem executados e distribuir essas mensagens quando for requisitada.</p>
<p>Um jeito simples de construir essa fila é guardando essas tarefas em uma tabela no banco de dados. Não é muito escalável, há alguns problemas de concorrência, mas é um jeito simples e em 99,9% dos casos o banco de dados já está lá pronto e rodando.</p>
<p>Para fugir de banco de dados, sugiro usar o <a href="http://aws.amazon.com/sqs/">Amazon Simple Queue Service (SQS)</a>. É parte da <a href="http://aws.amazon.com/">Amazon Web Services</a>, o serviço de "cloud computing" da Amazon (isso mesmo, a livraria).</p>
<p>O SQS é, sem dúvida, o serviço mais simples da Amazon Web Services (AWS) e uma excelente forma de começar a usar a AWS. Mas não se deixe enganar pelo conceito simples, usar o SQS pode trazer benefícios enormes à sua aplicação.</p>
<p>Claro que você pode utilizar outros "gerenciadores de fila", como o <a href="http://xph.us/software/beanstalkd/">beanstalkd</a>, <a href="http://code.google.com/p/activemessaging/wiki/ActiveMessaging">ActiveMessaging </a>e mesmo o <a href="http://backgroundrb.rubyforge.org/">BackgroundRB</a>. Mas ter mais um serviço rodando na sua infra pode ser trabalhoso demais. E o SQS aguenta muito tráfego. E, como eu já disse, é um jeito simples de começar a usar os serviços da Amazon.</p>
<h3>Idempotência</h3>
<p>Quando estiver programando sua lógica para funcionar assincronamente, é importante que seu código seja idempotente.</p>
<p>O que é isso? Simples. Às vezes, algumas mensagens podem ser processadas duas vezes. Seja porque a mensagem foi gravada duas vezes pelos produtores, seja porque o gerenciador de fila enviou a mesma mensagem duas vezes.</p>
<p>Seu código deve ser capaz de consumir a mesma mensagem diversas vezes e não "quebrar" por causa disso.</p>
<p>Uma característica interessante do SQS ligada à idempotência é que quando você lê uma mensagem da fila, você define um tempo no qual essa mensagem não será mais exibida. Ela ficará invisível por um tempo. Assim você pode processar a informação da mensagem (executá-la) e só depois apagar a mensagem da fila (geralmente antes que a mensagem fique "visível" novamente).</p>
<h3>Conclusão</h3>
<p>Usar o conceito de programação assíncrona será certamente um benefício dentro do seu código.</p>
<p>É interessante notar como um conceito simples como um gerenciador de fila pode mudar totalmente a forma como você constrói aplicativos.</p>
<p>A fila está gigante e os jobs estão acumulando? Lance mais consumidores. Simples assim, pois eles já estão configurados para ler da fila. Pode ser em outra máquina, ou até mesmo em outro datacenter.</p>
<p>Tenho mais alguns estudos de casos, mas isso eu deixo para quem for assistir à minha palestra no <a href="http://www.locaweb.com.br/railssummit/">Rails Summit 2008</a>, na semana que vem! =D</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/E7VvdBUZvNY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/10/programacao-assincrona/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/10/programacao-assincrona/</feedburner:origLink></item>
		<item>
		<title>o Twitter quase acabou com meu blog</title>
		<link>http://feedproxy.google.com/~r/GeorgeOnTech/~3/P5w--b0ZIs4/</link>
		<comments>http://blog.georgeguimaraes.com/2008/09/o-twitter-quase-acabou-com-meu-blog/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 19:36:32 +0000</pubDate>
		<dc:creator>George Guimarães</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[pessoal]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.georgeguimaraes.com/?p=173</guid>
		<description><![CDATA[Pois é galera. Com essa onda de micro-blogging capitaneada pelo Twitter, acabei deixando o blog juntar umas moscas e teias de aranhas.
Íncrivel como você acaba canalizando sua vontade de escrever para um serviço que só te deixa escrever 140 caracteres de cada vez.
Mas agora estou voltando com o blog.
Stay tuned! (Enquanto isso, meu twitter é [...]]]></description>
			<content:encoded><![CDATA[<p>Pois é galera. Com essa onda de micro-blogging capitaneada pelo Twitter, acabei deixando o blog juntar umas moscas e teias de aranhas.</p>
<p>Íncrivel como você acaba canalizando sua vontade de escrever para um serviço que só te deixa escrever 140 caracteres de cada vez.</p>
<p>Mas agora estou voltando com o blog.</p>
<p>Stay tuned! (Enquanto isso, meu twitter é <a href="http://www.twitter.com/georgeguimaraes" target="_blank">@georgeguimaraes</a> =D ).</p>
<img src="http://feeds.feedburner.com/~r/GeorgeOnTech/~4/P5w--b0ZIs4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.georgeguimaraes.com/2008/09/o-twitter-quase-acabou-com-meu-blog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.georgeguimaraes.com/2008/09/o-twitter-quase-acabou-com-meu-blog/</feedburner:origLink></item>
	</channel>
</rss>
