<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Keep Learning &#187; Tutoriais</title>
	<atom:link href="http://blog.lucashungaro.com/category/tutoriais/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lucashungaro.com</link>
	<description>Conhecimento nunca é o bastante</description>
	<lastBuildDate>Sat, 03 Sep 2011 19:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Back-end caching com Ruby, parte 1 &#8211; Introdução</title>
		<link>http://blog.lucashungaro.com/2010/11/30/back-end-caching-com-ruby-parte-1-introducao/</link>
		<comments>http://blog.lucashungaro.com/2010/11/30/back-end-caching-com-ruby-parte-1-introducao/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 17:33:13 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://blog.lucashungaro.com/?p=378</guid>
		<description><![CDATA[Depois de pesquisar muito código e dar duas palestras em que falei um pouco sobre o tema, posso afirmar com convicção que caching é um dos aspectos mais negligenciados pelos desenvolvedores em nossa comunidade &#8211; não por preguiça ou algo do tipo, mas por falta de prática e exposição ao assunto. Resolvi contribuir para que [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de pesquisar muito código e dar duas palestras em que falei um pouco sobre o tema, posso afirmar com convicção que caching é um dos aspectos mais negligenciados pelos desenvolvedores em nossa comunidade &#8211; não por preguiça ou algo do tipo, mas por falta de prática e exposição ao assunto.</p>
<p>Resolvi contribuir para que o assunto seja mais discutido escrevendo alguns posts. Como a parte de cache em front-end já é mais difundida, vou focar no back-end.</p>
<p>Para começar, precisamos clarificar essa distinção importante: front-end cache e back-end cache. O primeiro tipo é o mais comum de encontrar em tutoriais e posts em blogs. Trata-se do cache de camadas relacionadas à interface da aplicação. No Rails, por exemplo, engloba: page, action e fragment cache. Já o segundo tipo, em geral, envolve fazer cache de resultados de operações pesadas (como queries complexas a banco de dados) utlizando algum storage como memcached. É desse tipo que vamos falar.</p>
<p>Sabemos que, quanto mais cedo no ciclo do request for feito o cache, mais eficiente ele é. Daí o cache no front-end ser o que traz mais retorno. No entanto, há momentos em que não é possível utilizar cache no front-end. Além disso, há situações em que outros tipos de cache são necessários, por exemplo quando utilizamos um back-end comum para a aplicação web e API (com clientes mobile e desktop, por exemplo) e queremos ter o benefício de desempenho do cache nessa parte também.</p>
<p>De modo geral, o que precisamos para o caching no back-end é um storage e um cliente para ele. Um dos storages mais comuns (em diversas plataformas) é o <a href="http://memcached.org/">memcached</a> &#8211; tão comum e consistente que vários frameworks o suportam <em>out of the box</em>, como é o caso do Rails.</p>
<p>Vamos a um simples exemplo utilizando a gem <a href="https://github.com/fauna/memcached">memcached</a> para o caching de um cálculo feito em cima do resultado de uma hipotética query a um banco de dados.</p>
<p>Primeiro, vamos iniciar um servidor do memcached localmente:</p>
<pre>
$ memcached -vv -l 127.0.0.1 -p 11211
</pre>
<p>Isso vai iniciar o servidor localmente na porta 11211 em modo <em>very verbose</em> para que possamos acompanhar o que está acontecendo.</p>
<p>Agora, vamos ao código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;mysql&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;memcached&quot;</span>
&nbsp;
connection = Mysql.<span style="color:#9900CC;">real_connect</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;127.0.0.1&quot;</span>, <span style="color:#996600;">&quot;root&quot;</span>, <span style="color:#996600;">&quot;pass&quot;</span>, <span style="color:#996600;">&quot;my_database&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
results = connection.<span style="color:#9900CC;">query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;select * from amazingly_big_table where non_indexed_column = 'some_value'&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
some_calc = <span style="color:#006666;">0</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># no inject on Mysql::Result :(</span>
results.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row<span style="color:#006600; font-weight:bold;">|</span>
   <span style="color:#008000; font-style:italic;"># do some processing using some_calc</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> some_calc</pre></div></div>

<p>Toda vez que esse código for executado, a query irá ser feita no banco de dados e o resultado será calculado novamente. Nesse exemplo, vamos adicionar cache para evitar que isso ocorra tantas vezes:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;mysql&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;memcached&quot;</span>
&nbsp;
connection = Mysql.<span style="color:#9900CC;">real_connect</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;127.0.0.1&quot;</span>, <span style="color:#996600;">&quot;root&quot;</span>, <span style="color:#996600;">&quot;pass&quot;</span>, <span style="color:#996600;">&quot;my_database&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
cache = Memcached.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;localhost:11211&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
some_calc = cache.<span style="color:#9900CC;">get</span> <span style="color:#996600;">&quot;some_calc&quot;</span> <span style="color:#008000; font-style:italic;">#busca o valor no cache</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">unless</span> some_calc <span style="color:#008000; font-style:italic;">#caso não esteja em cache</span>
  results = connection.<span style="color:#9900CC;">query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;select * from amazingly_big_table where non_indexed_column = 'some_value'&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  some_calc = <span style="color:#006666;">0</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># no inject on Mysql::Result :(</span>
  results.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#008000; font-style:italic;"># do some processing using some_calc</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  cache.<span style="color:#9900CC;">set</span> <span style="color:#996600;">&quot;some_calc&quot;</span>, some_calc, <span style="color:#006666;">3600</span> <span style="color:#008000; font-style:italic;"># coloca o valor no cache por 3600 segundos</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> some_calc</pre></div></div>

<p>As linhas importantes aqui são as que manipulam o cache. No caso do memcached (e na grande maioria dos outros storages para cache) utilizamos o esquema de chave-valor. Armazenamos um valor em uma determinada chave, que deve ser conhecida para que possamos recuperar os dados. O memcached também suporta um <em>time to live</em>, que é um tempo em que o dado deve ser mantido no cache. Após esse tempo, ele é considerado expirado e não será encontrado quando tentarmos um <em>get</em>.</p>
<p>Dessa forma, nosso resultado permanecerá em cache por 3600 segundos. Durante esse tempo, toda vez que o código for executado, o valor será trazido do memcached e mostrado ao final, sem execução da query e do cálculo novamente.</p>
<p>No terminal podemos ver a saída do memcached, mostrando quando armazenamos e buscamos o valor:</p>
<p><a href="http://blog.lucashungaro.com/wp-content/uploads/2010/11/memcached.png"><img src="http://blog.lucashungaro.com/wp-content/uploads/2010/11/memcached.png" alt="memcached" title="memcached" width="276" height="108" class="aligncenter size-full wp-image-382" /></a></p>
<p>Bom, para começar é só isso. Bem simples e não lá muito útil, mas precisamos começar do mais básico, certo? <img src='http://blog.lucashungaro.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>No próximo artigo vou mostrar alguns exemplos mais práticos, utilizando frameworks como Rails e Sinatra. Após isso vamos explorar áreas como: expiração de dados e coleções interdependentes, <em>dog pile effect</em> e outras coisas interessantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucashungaro.com/2010/11/30/back-end-caching-com-ruby-parte-1-introducao/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Entendendo sistemas distribuídos de controle de versão (Git, Mercurial etc)</title>
		<link>http://blog.lucashungaro.com/2008/01/23/entendendo-sistemas-distribuidos-de-controle-de-versao-git-mercurial-etc/</link>
		<comments>http://blog.lucashungaro.com/2008/01/23/entendendo-sistemas-distribuidos-de-controle-de-versao-git-mercurial-etc/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 13:02:24 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/2008/01/23/entendendo-sistemas-distribuidos-de-controle-de-versao-git-mercurial-etc/</guid>
		<description><![CDATA[Você ouviu falar de Git e DVCS (Distributed Version Control System) mas ainda não entendeu bem o conceito? Bom, você não está sozinho. Deixo aqui duas boas referências para aprender mais sobre o assunto: Intro to Distributed Version Control (Illustrated) Why Distributed Version Control Matters to You, Today Boa leitura.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://blog.lucashungaro.com/wp-content/uploads/2008/01/distributed_logo.png" alt="dvcs" /></p>
<p>Você ouviu falar de <a href="http://en.wikipedia.org/wiki/Git_(software)" target="_blank">Git</a> e DVCS (Distributed Version Control System) mas ainda não entendeu bem o conceito? Bom, você não está sozinho.</p>
<p>Deixo aqui duas boas referências para aprender mais sobre o assunto:</p>
<ul>
<li> <a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/" target="_blank">Intro to Distributed Version Control (Illustrated)</a></li>
<li> <a href="http://jamesgolick.com/2008/1/21/why-distributed-version-control-matters-to-you-today" target="_blank">Why Distributed Version Control Matters to You, Today</a></li>
</ul>
<p>Boa leitura.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucashungaro.com/2008/01/23/entendendo-sistemas-distribuidos-de-controle-de-versao-git-mercurial-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

