<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Blog do Phil]]></title>
  <link href="http://philipsampaio.com.br/atom.xml" rel="self"/>
  <link href="http://philipsampaio.com.br/"/>
  <updated>2016-03-27T05:29:47-03:00</updated>
  <id>http://philipsampaio.com.br/</id>
  <author>
    <name><![CDATA[Philip Sampaio]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[10 exemplos de pattern matching em Elixir]]></title>
    <link href="http://philipsampaio.com.br/blog/2015/01/08/10-exemplos-de-pattern-matching-em-elixir/"/>
    <updated>2015-01-08T02:14:41-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2015/01/08/10-exemplos-de-pattern-matching-em-elixir</id>
    <content type="html"><![CDATA[<p style="text-align:center;"> <img src="http://philipsampaio.com.br/images/posts-images/airplanes.jpg" alt="Pattern in airplanes" /></p>

<p>Como no texto anterior, hoje vou falar sobre o uso de
<code>pattern matching</code> em Elixir de uma forma mais detalhada.</p>

<p><em>Pattern matching</em> é um recurso muito poderoso (quase mágico!).
Vou começar demonstrando simples exemplos,
até chegar aos mais complexos.</p>

<h2>1) Associando valores</h2>

<p>Em Elixir não existe o conceito de variáveis como vemos nas linguagens
de programação &ldquo;convencionais&rdquo;. Isso occore porque em Elixir não temos
estado (na verdade temos, mas é um assunto pra outro post):
temos <em>valores</em> que são transformados de função em função.</p>

<p>Quando se cria uma expressão de associação (ex.: x = 10), na verdade o que
ocorre é uma tentativa de &ldquo;apelidar&rdquo; um valor a um nome (10 foi apelidado de x).
Essa tentativa é feita através de <code>pattern matching</code>.</p>

<p>Exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="c1"># Até aqui, tudo normal</span>
</span><span class='line'><span class="n">number</span> <span class="o">=</span> <span class="m">42</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Um teste estranho, mas dá certo porque o valor da direita é igual o da esquerda</span>
</span><span class='line'><span class="m">42</span> <span class="o">=</span> <span class="n">number</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Uma tentativa de match que vai gerar um erro</span>
</span><span class='line'><span class="m">52</span> <span class="o">=</span> <span class="n">number</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ** (MatchError) no match of right hand side value: 42</span>
</span></code></pre></td></tr></table></div></figure>


<p>A linguagem vai tentar sempre &ldquo;casar&rdquo; o <em>valor</em> da esquerda com o da direita.</p>

<h2>2) Um pouco mais complicado: Associando valores dentro de listas</h2>

<p>Agora queremos capturar valores dentro de uma lista simples:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="c1"># Um exemplo que funciona</span>
</span><span class='line'><span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="m">5</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">13</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 5</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 7</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 13</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Um exemplo com um valor igual do lado esquerdo:</span>
</span><span class='line'><span class="p">[</span><span class="n">d</span><span class="p">,</span> <span class="m">19</span><span class="p">,</span> <span class="n">f</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="m">17</span><span class="p">,</span> <span class="m">19</span><span class="p">,</span> <span class="m">23</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 17</span>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 23</span>
</span></code></pre></td></tr></table></div></figure>


<p>Como você pode ver, Elixir vai entender que o valor do elemento do meio é igual nos dois lados.
Mas caso esse valor seja diferente, não há match.</p>

<p>Exemplo com um erro de <code>match</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="c1"># Com um valor diferente do lado esquerdo:</span>
</span><span class='line'><span class="p">[</span><span class="n">d</span><span class="p">,</span> <span class="m">63</span><span class="p">,</span> <span class="n">f</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="m">17</span><span class="p">,</span> <span class="m">19</span><span class="p">,</span> <span class="m">23</span><span class="p">]</span>
</span><span class='line'><span class="c1"># ** (MatchError) no match of right hand side value: [17, 19, 23]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Os mesmos exemplos podem ser reproduzidos usando <a href="http://elixir-lang.org/getting_started/2.html#2.7-tuples">tuplas</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="p">{</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">status_code</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="m">200</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">status_code</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 200</span>
</span><span class='line'>
</span><span class='line'><span class="p">{</span><span class="n">d</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="n">e</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">status_code</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="m">500</span><span class="p">}</span>
</span><span class='line'><span class="c1"># ** (MatchError) no match of right hand side value: {:error, 500}</span>
</span></code></pre></td></tr></table></div></figure>


<p>É possível até repetir o nome da &ldquo;variável&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="p">{</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">1</span><span class="p">}</span>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 1</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Quando se repetem mas os valores são diferentes, ocorre um erro de `match`:</span>
</span><span class='line'><span class="p">{</span><span class="n">d</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span><span class="p">}</span>
</span><span class='line'><span class="c1"># ** (MatchError) no match of right hand side value: {3, 4, 5}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>3) Para pegar o primeiro item de uma lista e o restante da lista</h2>

<p>O conceito de <code>head</code> e <code>tail</code> é muito usado em linguagens funcionais,
e não é exceção em Elixir. Com ele é possível pegar o primeiro item
da lista e o restante da lista em uma só expressão de associação.</p>

<p>Li pela primeira vez sobre o assunto em um <a href="http://learnyouahaskell.com/starting-out#an-intro-to-lists">tutorial de haskell</a>, que recomendo!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">list</span> <span class="o">=</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="m">6</span><span class="p">,</span> <span class="m">7</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Sobre a lista `list`, podemos dizer:</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># O primeiro item, que vamos chamar de `head`,</span>
</span><span class='line'><span class="c1"># possue valor 1.</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># Todo o resto da lista, que vamos chamar</span>
</span><span class='line'><span class="c1"># de `tail`, possue o valor = [2, 3, 4, 5, 6, 7]</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># Para capturar esses valores, faremos o seguinte:</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">head</span><span class="o">|</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">list</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 1</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; [2, 3, 4, 5, 6, 7]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>4) Para pegar o segundo, ou n-itens do começo de uma lista</h2>

<p>Seguindo o exemplo anterior, para dar <em>match</em> nos dois
primeiros itens de uma lista:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">list</span> <span class="o">=</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">h1</span><span class="p">,</span> <span class="n">h2</span><span class="o">|</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">list</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">h1</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 1</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">h2</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 2</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; [3, 4]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>5) Para filtrar alguns resultados de uma lista usando <code>list comprehensions</code></h2>

<p>Aqui começa a complicar.
Quem já programou em Python deve ter
usado um recurso bem interessante: <a href="https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions">list comprehensions</a>.</p>

<p>Em Elixir também temos <a href="http://elixir-lang.org/getting_started/18.html">comprehensions</a>
que podemos usar em listas, tuplas, <code>binaries</code> e streams.</p>

<p>Primeiro, um exemplo usando associação simples:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">for</span> <span class="n">n</span> <span class="o">&lt;-</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">],</span> <span class="k">do</span><span class="p">:</span> <span class="n">n</span> <span class="o">*</span> <span class="n">n</span>
</span><span class='line'><span class="c1"># =&gt; [1, 4, 6]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Agora, um exemplo usando um padrão mais complicado:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">statuses</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="m">404</span><span class="p">},</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="m">201</span><span class="p">},</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="m">500</span><span class="p">},</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="m">301</span><span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="n">for</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">n</span><span class="p">}</span> <span class="o">&lt;-</span> <span class="n">statuses</span><span class="p">,</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;Error </span><span class="si">#{</span><span class="n">n</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; Error 404</span>
</span><span class='line'><span class="c1"># =&gt; Error 500</span>
</span></code></pre></td></tr></table></div></figure>


<p>Como o exemplo sugere, <em>comprehensions</em> retornam somente os itens que deram match no padrão.
Isso possibilita o uso de um filtro sem ter que escrever muito código.</p>

<h2>6) Para dividir uma <code>string</code> em partes</h2>

<p>É comum percorrer uma string (ou <code>binary</code>) por cada caracter. Podemos fazer isso
usando um <code>match</code> de <code>binary</code>, como no exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;Philip&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;&lt;</span> <span class="n">h</span><span class="p">::</span><span class="n">utf8</span><span class="p">,</span> <span class="n">t</span><span class="p">::</span><span class="n">binary</span> <span class="o">&gt;&gt;</span> <span class="o">=</span> <span class="n">name</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; &quot;hilip&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; 80 # a versão binária de &quot;P&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="o">&lt;&lt;</span> <span class="n">h</span><span class="p">::</span><span class="n">utf8</span><span class="o">&gt;&gt;</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; &quot;P&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>É interessante notar que estou especificando o encoding do binary.
Isso é necessário para que a linguagem entenda aquele caracter
como sendo parte de uma string.</p>

<p>Algo a se notar também é que usei uma vírgula ao
invés de um <em>pipe</em> (|) para separar <em>head</em> e tail da string.
Para que a representação de <em>h</em> seja a correta,
tenho que dizer que aquele binary é UTF8.</p>

<h2>7) Outra forma para dar match em uma string</h2>

<p>Há uma maneira mais simples de dar match em uma string usando um operador de concatenação de
strings/binaries: o <code>&lt;&gt;</code>.</p>

<p>Sem matches, o usamos da seguinte forma:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="s2">&quot;Phil&quot;</span> <span class="o">&lt;&gt;</span> <span class="s2">&quot;ip&quot;</span>
</span><span class='line'><span class="c1">#=&gt; &quot;Philip&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Agora com o match:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="s2">&quot;Philip&quot;</span> <span class="o">=</span> <span class="s2">&quot;Phil&quot;</span> <span class="o">&lt;&gt;</span> <span class="n">sufix</span>
</span><span class='line'><span class="c1">#=&gt; &quot;Phil&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">sufix</span><span class="p">)</span>
</span><span class='line'><span class="c1">#=&gt; &quot;ip&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>É bem simples e útil quando se sabe o conteúdo do início de uma string,
e queremos pegar o restante dela que é variável,
como estou usando
<a href="https://github.com/philss/floki/blob/master/lib/floki.ex#L105">nesse parser e leitor de HTML</a>.</p>

<h2>8) Usando o <code>case</code></h2>

<p><em>Pattern matching</em> é usado com frequência em um bloco <code>case</code> que serve justamente
para fazer alguma ação de acordo com o padrão de entrada.
É como o <code>case</code> de C, no sentido de ter vários <em>branches</em> de decisão,
mas ao invés de tomar decisões por condições booleanas, o <code>case</code> da Elixir toma
decisões baseado em padrões.</p>

<p>Exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="c1"># Para abrir um arquivo, usamos `File.open/1`</span>
</span><span class='line'><span class="k">case</span> <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;name-of-file.txt&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'><span class="k">  </span><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">contents</span><span class="p">}</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;You use this contents: </span><span class="si">#{</span><span class="n">contents</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">reason</span><span class="p">}</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;ERROR while open file: </span><span class="si">#{</span><span class="n">reason</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>O <code>case</code> é a provavelmente a estrutura de controle mais usada em Elixir.
Faz parte da filosofia da linguagem escrever os programas levando em conta
situações adversas, como o erro que está sendo considerado no exemplo.</p>

<p>Ao invés de usar um tratamento de exceção, a linguagem propõe que os erros
sejam tratados como caminhos &ldquo;normais&rdquo; do programa. Sendo assim, o <code>case</code> é
bem prático para <em>casar</em> um padrão em situações onde um erro é esperado.</p>

<p>Podemos também usar o casamento de padrão em funções, como demonstrei no
<a href="http://philipsampaio.com.br/blog/2014/06/14/usando-pattern-matching-e-recursividade-com-elixir/">post anterior</a>.</p>

<h2>9) Para dar match em qualquer coisa</h2>

<p>É possível ignorar um determinado valor dentro
de um <code>match</code> usando o <code>underscore</code>.
Ele serve como um coringa, e é muito útil em determinadas
ocasiões.</p>

<p>Exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="n">values</span> <span class="o">=</span> <span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">case</span> <span class="n">values</span> <span class="k">do</span>
</span><span class='line'><span class="k">  </span><span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;5 in the middle&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;whatever in the middle&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; &quot;whatever in the middle&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Outro exemplo de case,</span>
</span><span class='line'><span class="c1"># dessa vez com _ para todo o valor:</span>
</span><span class='line'>
</span><span class='line'><span class="k">case</span> <span class="n">values</span> <span class="k">do</span>
</span><span class='line'><span class="k">  </span><span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="m">3</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;5 in the middle&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">_</span> <span class="o">-&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;default case when nothing else matches&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; default case when nothing else matches</span>
</span></code></pre></td></tr></table></div></figure>


<h2>10) Usando em blocos de comunicação entre processos</h2>

<p>Uma das <em>features</em> mais legais de Elixir é o modelo de comunicação entre
atores (ou processos). Com ela é possível enviar todo o tipo de mensagem
para um processo e processar essa mensagem através de <em>pattern matching</em>.
Esse assunto é bem complicado de início, por isso recomendo que <a href="http://elixir-lang.org/getting_started/11.html">leiam
um pouco mais sobre isso</a>.</p>

<p>Exemplos:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="c1"># Para criar um novo processo que irá</span>
</span><span class='line'><span class="c1"># receber mensagens, faça:</span>
</span><span class='line'>
</span><span class='line'><span class="n">pid</span> <span class="o">=</span> <span class="n">spawn</span><span class="p">(</span><span class="k">fn</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">receive</span> <span class="k">do</span>
</span><span class='line'><span class="k">                </span><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">msg</span><span class="p">}</span> <span class="o">-&gt;</span>
</span><span class='line'>                  <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;Received: </span><span class="si">#{</span><span class="n">msg</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>                <span class="n">_</span> <span class="o">-&gt;</span>
</span><span class='line'>                  <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">&quot;I don&#39;t understand you! :/&quot;</span><span class="p">)</span>
</span><span class='line'>              <span class="k">end</span>
</span><span class='line'>            <span class="k">end</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Envie uma mensagem para o processo:</span>
</span><span class='line'>
</span><span class='line'><span class="n">send</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="s2">&quot;Elixir is awesome!&quot;</span><span class="p">})</span>
</span><span class='line'><span class="c1"># =&gt; Received: Elixir is awesome</span>
</span></code></pre></td></tr></table></div></figure>


<p>Perceba que o bloco de <code>receive</code> é bem parecido com o
<code>case</code>, porém está trabalhando com uma mensagem recebida.</p>

<h2>Conclusão</h2>

<p>Nesse artigo mostrei alguns exemplos de <em>pattern matching</em> em Elixir.
Para entender mais e melhor,
recomendo a leitura do livro <a href="https://pragprog.com/book/elixir/programming-elixir">Programming Elixir</a>
do <a href="https://twitter.com/pragdave">Dave Thomas</a> que é bem completo.
Recomendo também dar uma fuçada em <a href="https://github.com/trending?l=elixir">projetos abertos</a>
e tentar entender o código.</p>

<p>Deixo aqui meu convite à comunidade brasileira de Elixir, que é bem pequena ainda,
a escrever mais sobre a linguagem. Em português ou inglês, o importante é trazer o
máximo de devs que puder! :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Usando pattern matching e recursividade com Elixir]]></title>
    <link href="http://philipsampaio.com.br/blog/2014/06/14/usando-pattern-matching-e-recursividade-com-elixir/"/>
    <updated>2014-06-14T19:42:10-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2014/06/14/usando-pattern-matching-e-recursividade-com-elixir</id>
    <content type="html"><![CDATA[<p>Uma das linguagens de programação que mais tem me animado ultimamente é a <a href="http://elixir-lang.org/">Elixir</a>. Ela possui muitas <em>features</em> legais, e uma delas é o <em>pattern matching</em>.</p>

<p><em>Patter maching</em> é uma <em>feature</em>, assim como muitas outras, herdada da <a href="http://www.erlang.org/">Erlang</a>, que é a linguagem em que Elixir se basea. Em uma tradução livre, <em>pattern maching</em> quer dizer &ldquo;casamento de padrão&rdquo;. O termo é meio exquisito em português, mas vamos a um exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">name</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="s2">&quot;Philip&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Nesse exemplo, estamos &ldquo;casando&rdquo; o que está do lado direito com um padrão do lado esquerdo. Explico: do lado esquerdo temos uma <a href="http://elixir-lang.org/getting_started/2.html">tupla</a> com o primeiro elemento <code>:ok</code> e o segundo elemento como uma variável <code>name</code>.</p>

<p>A linguagem vai tentar fazer bater o tipo e o conteúdo dos dois lados. No caso, o tipo bate:
  &ndash; é uma tupla;
  &ndash; o primeiro elemento da tupla bate: <code>:ok</code> é <code>:ok</code>;
  &ndash; o segundo argumento também bate: do lado esquerdo temos uma variável a ser &ldquo;preenchida&rdquo;, do lado direito temos um valor para ela.</p>

<p>Agora um exemplo onde o <em>pattern</em> não bate:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="s2">&quot;João&quot;</span> <span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="s2">&quot;Philip&quot;</span><span class="p">}</span>
</span><span class='line'><span class="c1"># =&gt; ** (MatchError) no match of right hand side value: {:ok, &quot;Philip&quot;}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Por mais que o tipo do segundo elemento seja o mesmo, não há casamento porque os conteúdos das strings são diferentes.</p>

<h2>Usando pattern matching em funções</h2>

<p>Um dos usos mais poderosos para o pattern maching é na declaração de funções.</p>

<p>Em Elixir, as funções são definidas por três combinações: o seu nome, o número de argumentos, e o &ldquo;padrão&rdquo; desses argumentos. Em suma, são definidas pelo nome e argumentos.</p>

<p>Isso quer dizer que uma função <code>somar(numero1, numero2)</code> é diferente da função <code>somar(numero1, numero2, numero3)</code>. E as funções <code>check({200, body})</code> e <code>check({404, body})</code> são diferentes por conta do padrão de seus argumentos (a diferença do primeiro elemento da tupla).</p>

<p>Uma aplicação muito legal pra isso é na construção de funções recursivas.</p>

<p>O exemplo a seguir mostra como somar números de uma lista através de recursividade. Ele é bem parecido com o encontrado no guia <a href="http://elixir-lang.org/getting_started/9.html">Getting started</a> do site oficial da linguagem, mas considero o meu (IMHO) um pouco mais simples.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='elixir'><span class='line'><span class="k">defmodule</span> <span class="no">Math</span> <span class="k">do</span>
</span><span class='line'><span class="k">  def</span> <span class="n">sum_list</span><span class="p">([])</span> <span class="k">do</span>
</span><span class='line'><span class="k">    </span><span class="m">0</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">sum_list</span><span class="p">([</span><span class="n">head</span><span class="o">|</span><span class="n">tail</span><span class="p">])</span> <span class="k">do</span>
</span><span class='line'><span class="k">    </span><span class="n">head</span> <span class="o">+</span> <span class="n">sum_list</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Exemplos:</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1">#   Math.sum_list([10])</span>
</span><span class='line'><span class="c1">#   # =&gt; 10</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1">#   Math.sum_list([17, 13, 7, 5])</span>
</span><span class='line'><span class="c1">#   # =&gt; 42</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1">#   Math.sum_list([])</span>
</span><span class='line'><span class="c1">#   # =&gt; 0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Como você pode perceber, os nomes das funções são idênticos, mas o que muda são seus argumentos.
Todas as três recebem listas, porém cada uma com um padrão diferente:</p>

<ul>
<li>A primeira definição recebe uma lista vazia, e como uma lista vazia não tem números, retorna zero;</li>
<li>A terceira função recebe uma lista e divide ela em duas partes: cabeça e &ldquo;calda&rdquo;.

<ul>
<li>A cabeça (head) é composta por um único elemento, que é o primeiro elemento da lista;</li>
<li>A &ldquo;calda&rdquo; é o restante da lista. Então uma lista <code>[2, 3, 4]</code> será dividida em <code>head = 2</code> e <code>tail = [3, 4]</code>. Feito isso, a função ira somar recursivamente o primeiro elemento da lista com o resultado da próxima chamada da função recebendo a lista da calda.</li>
</ul>
</li>
</ul>


<p>Quando há somente um item na lista, <code>head</code> é igual a esse elemento, e <code>tail</code> é vazia ([]).</p>

<p>As chamadas recursivas de &ldquo;sum_list&rdquo; serão processadas levando em conta o &ldquo;padrão&rdquo; dos argumentos passados. A &ldquo;condição de parada&rdquo; da terceira função é quando <code>tail</code> for uma lista com somente um elemento. Neste caso a função que será utilizada é a segunda, que recebe uma lista com um elemento.</p>

<h2>Para onde ir agora?</h2>

<p>Nos exemplos usados aqui vimos um pouco do que é possível fazer com o uso de <a href="http://elixir-lang.org/getting_started/4.html">pattern matching</a>.
Essa não é uma característica exclusiva da Elixir, mas para mim ficou muito mais fácil de entender com essa linguagem (já havia tentado com Haskell).</p>

<p>Experimente implementar os exemplos e deixe suas dúvidas e sugestões nos comentários.</p>

<p>Recomendo esses links para mais detalhes da linguagem:</p>

<ul>
<li><a href="http://elixir-lang.org/">Site oficial</a></li>
<li><a href="https://github.com/elixir-lang/elixir">Elixir lang &ndash; Código do projeto no Github</a></li>
<li><a href="https://www.eventials.com/locaweb/elixir-uma-aproximacao-pragmatica-e-concorrente-a-programacao/">Elixir: uma aproximação pragmática e concorrente à programação</a> (começa em 11min)</li>
<li><a href="http://elixirsips.com/">Elixir Sips: screencast com tutorias semanais de Elixir</a></li>
<li><a href="http://benjamintanweihao.github.io/">Benjamin Tan Wei Hao Blog</a>.</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Executando seus testes em uma App Rails na velocidade máxima com Vim e Zeus]]></title>
    <link href="http://philipsampaio.com.br/blog/2013/12/13/executando-seus-testes-em-uma-app-rails-na-velocidade-maxima-com-vim-e-zeus/"/>
    <updated>2013-12-13T16:49:17-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2013/12/13/executando-seus-testes-em-uma-app-rails-na-velocidade-maxima-com-vim-e-zeus</id>
    <content type="html"><![CDATA[<p>Configurei meu Vim para rodar os testes da minha aplicação Rails (dependendo ou não do Rails)
bem mais rápidos, através do Zeus.</p>

<p>O <a href="https://github.com/burke/zeus">Zeus</a> pré-carrega (faz um <em>preload</em>) sua aplicação Rails, e tudo que é dependência dela.
Você pode instalá-lo com o comando:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem install zeus</span></code></pre></td></tr></table></div></figure>


<p>É importante lembrar que o Zeus não deve ser declarado no seu Gemfile.</p>

<p>Para executar o Zeus, vá a seu projeto Rails e execute <code>zeus start</code>. A partir daí, você conseguirá subir seu servidor (<code>zeus s</code>) ou
executar comandos (<code>zeus rake/generate/etc</code>) de forma muito rápida!</p>

<p>Para rodar seus testes usando RSpec direto do seu Vim, você pode usar o plugin <a href="https://github.com/thoughtbot/vim-rspec">vim-rspec</a>.
Instale-o pela maneira mais recomendada, usando <a href="https://github.com/gmarik/vundle">Vundle</a> ou a que você preferir.</p>

<p>Em seguida é necessário configurar o comando que executa os testes.
Adicione a linha abaixo ao seu <code>.vimrc</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='vim'><span class='line'><span class="k">let</span> <span class="k">g</span>:rspec_command <span class="p">=</span> <span class="s2">&quot;! zeus rspec {spec}&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>O comando padrão para executar os testes (todos do arquivo) é <code>\\t</code> (<code>&lt;Leader&gt;t</code>)
Se quiser executar um teste específico, mova o cursos para ele e execute <code>\\s</code>(<code>&lt;Leader&gt;s</code>).
Há também um comando para executar o último teste: <code>\\l</code>(<code>&lt;Leader&gt;l</code>)).</p>

<p>Com o <code>rspec-vim</code> sua produtividade pode aumentar consideravelmente, evitando
a mudança de abas ou terminais para executar seus códigos.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Declaração de variável no Ruby: por valor ou referência?]]></title>
    <link href="http://philipsampaio.com.br/blog/2013/11/18/declaracao-de-variavel-no-ruby-valor-ou-referencia/"/>
    <updated>2013-11-18T00:00:41-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2013/11/18/declaracao-de-variavel-no-ruby-valor-ou-referencia</id>
    <content type="html"><![CDATA[<p>Toda declaração de variável na linguagem Ruby é feita por referência.
Isso significa que quando declaramos uma variável, na verdade estamos declarando
uma referência para um objeto em memória.
Essa informação parece ser básica e dificilmente você terá problemas com isso.
Mas aconteceu comigo, onde por engano eu esqueci deste pequeno detalhe.</p>

<p>Meu caso foi com um código mais ou menos como o abaixo.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">a</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class='line'><span class="n">b</span> <span class="o">=</span> <span class="n">a</span>
</span><span class='line'><span class="n">b</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">b</span>
</span><span class='line'><span class="c1">#=&gt; [1, 2, 3, 4, 5]</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">a</span>
</span><span class='line'><span class="c1">#=&gt; [1, 2, 3, 4, 5]</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">a</span><span class="o">.</span><span class="n">object_id</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="n">object_id</span>
</span><span class='line'><span class="c1">#=&gt; true</span>
</span></code></pre></td></tr></table></div></figure>


<p>O código não era tão simples, mas o exemplo ilustra bem como aconteceu. Meu intuito
era trabalhar com o conteúdo &ldquo;armazenado&rdquo; em <code>b</code> e deixar o conteúdo em <code>a</code> intacto.
Porém quando alterei o valor de <code>b</code> (adicionando 5), também alterei em <code>a</code>. Isso causou
um bug que foi corrigido no processo de <code>code review</code>.</p>

<p>Isso porque em Ruby todas as declarações são feitas através de referências para objetos.</p>

<p>Para resolver possíveis problemas (como alterar acidentalmente o objeto errado), você
pode &ldquo;clonar&rdquo; ou &ldquo;duplicar&rdquo; (veja a diferença nos links abaixo) um objeto quando
for <em>referenciá-lo</em> a uma variável.</p>

<p>Exemplo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">a</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class='line'><span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">dup</span>
</span><span class='line'><span class="n">b</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">b</span>
</span><span class='line'><span class="c1">#=&gt; [1, 2, 3, 4, 5]</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">a</span>
</span><span class='line'><span class="c1">#=&gt; [1, 2, 3, 4]</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">a</span><span class="o">.</span><span class="n">object_id</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="n">object_id</span>
</span><span class='line'><span class="c1">#=&gt; false</span>
</span></code></pre></td></tr></table></div></figure>


<p>Alguns links do Stack Overflow sobre o assunto:</p>

<ul>
<li><a href="http://stackoverflow.com/a/10183477/1055602">What&rsquo;s the difference between Ruby&rsquo;s dup and clone methods?</a></li>
<li><a href="http://stackoverflow.com/q/17638460/1055602">Prevent side effects in Ruby</a></li>
<li><a href="http://stackoverflow.com/q/3430280/1055602">Ruby &ndash; how does object_id assignment work?</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Estatísticas de submissões no SPOJ]]></title>
    <link href="http://philipsampaio.com.br/blog/2012/05/20/estatisticas-de-submissoes-no-spoj/"/>
    <updated>2012-05-20T01:48:00-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2012/05/20/estatisticas-de-submissoes-no-spoj</id>
    <content type="html"><![CDATA[<p>Por volta de setembro do ano passado iniciei o desenvolvimento
de uma app para mostrar <em>estatísticas</em> e promover <em>desafios</em> entre
usuários(equipes) do <a href="http://br.spoj.pl/">SPOJ</a>.</p>

<p>Percebi que já existiam algumas pequenas aplicações para estatísticas,
mas nada que promovesse desafios entre usuários(times). Eu queria
unir as duas características. Mas o tempo passou e essa app acabou ficando de lado.</p>

<p>Foi então que decidi lançar o que foi feito, mesmo com alguns bugs.</p>

<p>O site fica no <a href="http://heroku.com/">Heroku</a>, e você pode
<a href="http://spojstats.heroku.com/">acessar aqui</a>.
Não sei se vou continuar desenvolvendo essa aplicação, mas
já valeu a pena pois
<a href="http://spojstats.heroku.com/about">aprendi muito com isso</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Usando tmux e vim para pair programming remoto]]></title>
    <link href="http://philipsampaio.com.br/blog/2012/02/20/usando-tmux-e-vim-para-pair-programming-remoto/"/>
    <updated>2012-02-20T00:53:00-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2012/02/20/usando-tmux-e-vim-para-pair-programming-remoto</id>
    <content type="html"><![CDATA[<p>Há um tempo li o
<a href="http://gustavodutra.com/geek/usando-screen-e-vim-para-pair-programming-remoto">post</a>
do <a href="http://gustavodutra.com/">Gustavo Dutra</a> e achei muito legal a possibilidade de fazer
programação em par via terminal remoto. Usando o screen é possível compartilhar facilmente
uma sessão do terminal e sair programando. Mas não consegui compartilhar informações
de outras sessões abertas. Foi então que conheci o tmux.</p>

<p><img src="http://farm8.staticflickr.com/7190/6907679291_4c69291e4e.jpg" alt="image" /></p>

<p>Com <a href="http://tmux.sourceforge.net/">tmux</a> é possível criar sessões com
várias &ldquo;janelas&rdquo; (inclusive com separação vertical e horizontal) e usar 256 cores sem problemas.</p>

<p>Seguindo o mesmo esquema do post do Gustavo, separei em &ldquo;host&rdquo; e &ldquo;client&rdquo;.</p>

<h2>Host</h2>

<p>Na máquina que servirá como servidor de desenvolvimento será preciso criar uma sessão:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ tmux -2 -S /tmp/pair new-session -s PairProgramming</span></code></pre></td></tr></table></div></figure>


<p>Os parâmetros significam:</p>

<ul>
<li>-2 : Aceita 256 cores</li>
<li>-S : Cria o socket no caminho especificado (no caso, /tmp/pair)</li>
<li>new-session -s: Cria uma nova sessão com o nome atribuido (no caso, PairProgramming)</li>
</ul>


<p>Você vai precisar dar permissão no arquivo socket criado:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ chmod 777 /tmp/pair</span></code></pre></td></tr></table></div></figure>


<p>Feito isso, é só abrir o vim e aguardar o client =)</p>

<h2>Client</h2>

<p>Para que funcione, o client precisa estar conectado ao host via ssh com um usuário
qualquer (o importante é ter acesso ao arquivo socket em /tmp/pair).</p>

<p>Depois de conectado, basta executar o comando:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ tmux -2 -S /tmp/pair attach-session -t PairProgramming</span></code></pre></td></tr></table></div></figure>


<p>O parâmetro &ldquo;attach-session&rdquo; faz o client se conectar à uma sessão alvo (-t nome-da-sessao)</p>

<h2>Comandos básicos do tmux</h2>

<p>Para ativar algum comando do tmux, por padrão (é <a href="http://blog.hawkhost.com/2010/07/02/tmux-%E2%80%93-the-terminal-multiplexer-part-2/#rebinding-action-key">possível mudar</a>)você precisa precionar Ctrl+b</p>

<p>Comandos básicos (assumindo que você esteja no Linux):</p>

<ul>
<li>Ctrl+b ? # Lista todos comandos</li>
<li>Ctrl+b c # Cria nova janela</li>
<li>Ctrl+b n # Vai para próxima janela</li>
<li>Ctrl+b % # Divide a janela atual em duas verticais</li>
<li>Ctrl+b &ldquo;seta para direita|esquerda&rdquo; # Move entre as janelas divididas</li>
<li>Ctrl+b : # Abre o modo comando do tmux</li>
</ul>


<h2>Conclusão</h2>

<p>É possível fazer muita coisa com o tmux. Para saber mais, sugiro
que siga os links:</p>

<ul>
<li><a href="http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/">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/">TMUX – The Terminal Multiplexer (Part 2)</a></li>
<li><a href="http://thechangelog.com/post/17827235767/episode-0-7-3-tmux-with-brian-hogan-and-josh-clayton">Episode 0.7.3 &ndash; Tmux with Brian Hogan and Josh Clayton &ndash; The Changelog</a></li>
<li><a href="http://tmux.sourceforge.net/">Site do projeto Tmux</a></li>
<li><a href="https://github.com/aziz/tmuxinator">tmuxinator &ndash; Uma gem para gerenciar sessões</a></li>
</ul>


<p><em>UPDATE</em> (01/04/2013):</p>

<p>Chris Hunt palestrou na LA Ruby Conf 2013 sobre o Vim e Tmux. Ele faz o que este
tutorial apresentou, e muito mais: <a href="https://www.youtube.com/watch?v=vHdiXoHKSgU">https://www.youtube.com/watch?v=vHdiXoHKSgU</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rankings com Redis]]></title>
    <link href="http://philipsampaio.com.br/blog/2012/02/07/rankings-com-redis/"/>
    <updated>2012-02-07T00:34:00-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2012/02/07/rankings-com-redis</id>
    <content type="html"><![CDATA[<p>Se você deseja criar um ranking para sua aplicação, é muito provável que precisará
saber:</p>

<ul>
<li>o total de registros;</li>
<li>a posição de um elemento específico;</li>
<li>os primeiros colocados;</li>
<li>os ultimos colocados;</li>
</ul>


<p>Além disso, você vai querer inserir e retirar elementos de forma transparente e
rápida.</p>

<p>Para isso, recomendo que use o Redis e seus <a href="http://redis.io/topics/data-types#sorted-sets">sorted sets</a>!
Funciona de maneira bem simples e pode ser implementado em várias linguagens que
possuam o <a href="http://redis.io/clients">cliente do Redis</a>
Acredito que seja muito mais rápido e eficiente do que armazenar em uma base convencional, fazer
consultas ordenadas por score e salvar posição.</p>

<h2>Exemplos</h2>

<p>Todos os comandos a seguir estão muito bem(!) documentados no <a href="http://redis.io/commands#sorted_set">site do redis</a></p>

<h3>Adicionando membros ao ranking</h3>

<p>Comando: <a href="http://redis.io/commands/zadd">ZADD</a></p>

<p>Cria o ranking(sorted set), se não existir, e adiciona &ldquo;membro_um&rdquo; com 100 pontos de score:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZADD rankingx 100 "membro_um"</span></code></pre></td></tr></table></div></figure>


<p>Adiciona &ldquo;membro_dois&rdquo; com 422.1 de score e &ldquo;membro_tres&rdquo; o 142 de score:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZADD rankingx 422.1 "membro_dois"
</span><span class='line'>ZADD rankingx 142 "membro_tres"</span></code></pre></td></tr></table></div></figure>


<h3>&ldquo;Selecionando&rdquo; membros do ranking por range</h3>

<p>Comando: <a href="http://redis.io/commands/zrange">ZRANGE</a> e <a href="http://redis.io/commands/zrevrange">ZREVRANGE</a></p>

<p>Você pode selecionar membros de determinado ranking passando um range:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZRANGE rankingx 0 10</span></code></pre></td></tr></table></div></figure>


<p>O comando acima vai devolver 11 elementos, ordenados de forma crescente.
Para ordenar de forma decrescente, utilize o <a href="http://redis.io/commands/zrevrange">ZREVRANGE</a>.</p>

<h3>Obtendo a posição de um elemento</h3>

<p>Comando: <a href="http://redis.io/commands/zrank">ZRANK</a> e <a href="http://redis.io/commands/zrevrank">ZREVRANK</a></p>

<p>Algumas vezes é preciso saber a posição de um elemento relativo a todo o ranking.
Isso se torna um pouco complicado quando se faz utilizando SQL e bancos convencionais.
No Redis é muito simples:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZRANK rankingx "membro_tres"</span></code></pre></td></tr></table></div></figure>


<p>Para pegar a posição relativa ao ranking ordenado de forma decrescente, utilize o ZREVRANK:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZREVRANK rankingx "membro_tres"</span></code></pre></td></tr></table></div></figure>


<h3>Total de membros no ranking</h3>

<p>Comando: <a href="http://redis.io/commands/zcard">ZCARD</a></p>

<p>O total de membros de um determinado ranking pode ser obtido com:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ZCARD rankingx</span></code></pre></td></tr></table></div></figure>


<h2>Conclusão</h2>

<p>O Redis foi muito útil em uma historia onde era preciso otimizar a performance de
páginas de rankings no <a href="http://www.kademi.com.br/">Kademi</a>. Especialmente porque
usávamos vários rankings na mesma página e fazíamos grandes consultas para saber
a posição atual de um membro relativo ao ranking. Utilizamos Ruby e o cliente redis-rb,
e foi bem legal ver os resultados(a página em questão carrega em média 10x mais rápido agora)!</p>

<p>Há vários outros comandos disponíveis para <a href="http://redis.io/commands#sorted_set">Sorted set</a> e outras estruturas de dados.
Para saber mais sobre o Redis e testar os comandos em questão, acesse o <a href="http://redis.io">site do projeto</a>
e siga o <a href="http://twitter.com/antirez">@antires</a>, seu criador.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pacotes extras para Enterprise Linux]]></title>
    <link href="http://philipsampaio.com.br/blog/2012/01/14/pacotes-extras-para-enterprise-linux/"/>
    <updated>2012-01-14T23:13:00-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2012/01/14/pacotes-extras-para-enterprise-linux</id>
    <content type="html"><![CDATA[<p>Para quem tem servidores com instalações do CentOS fica complicado instalar
alguns pacotes, pois eles não existem nos repositórios oficiais e é preciso
compilá-los e instalá-los manualmente. Isso é legal para determinados
programas como servidores web, mas fica bem chato quando é algo que não
precisa de tanto.</p>

<p>Para contornar este &ldquo;problema&rdquo; o pessoal do Fedora criou o
<a href="http://fedoraproject.org/wiki/EPEL#History_and_background_of_the_project">EPEL(Extra Packages for Enterprise Linux)</a>,
que disponibiliza milhares de pacotes para seu CentOS, Red Hat Enterprise Linux e Scientific Linux.</p>

<h2>Instalando o EPEL</h2>

<p>Baixe uma das versões disponíveis:</p>

<p>EL 6:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ wget -c http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm</span></code></pre></td></tr></table></div></figure>


<p>EL 5:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ wget -c http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm</span></code></pre></td></tr></table></div></figure>


<p>EL 4:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ wget -c http://download.fedoraproject.org/pub/epel/4/i386/epel-release-4-10.noarch.rpm</span></code></pre></td></tr></table></div></figure>


<p>Para instalar:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># rpm -iv epel-release-5-4.noarch.rpm</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby e o início de minha carreira]]></title>
    <link href="http://philipsampaio.com.br/blog/2011/08/10/ruby-e-o-inicio-de-minha-carreira/"/>
    <updated>2011-08-10T00:18:34-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2011/08/10/ruby-e-o-inicio-de-minha-carreira</id>
    <content type="html"><![CDATA[<p>A linguagem Ruby foi um grande acontecimento em minha carreira. Carreira
esta que só está começando. Justamente por estar no início, foi muito
importante para que eu começasse a ter contato com coisas importantes,
muito além da linguagem.</p>

<p>As primeiras linhas que escrevi em um projeto real foram códigos de teste.
Esse foi o primeiro grande conceito que veio junto com a linguagem: o TDD.
Logo no início tive contato Scrum e pair programming. Metodologias incríveis
e que eu provavelmente não  conheceria tão facilmente. Acredito que essa
cultura de desenvolvimento ágil e inovação tem muito a ver com a comunidade
Ruby. São pessoas geralmente abertas à ideias que possam melhorar o
desenvolvimento de software. São desenvolvedores pragmáticos!</p>

<p>Isso tudo certamente -foi- está sendo bom pra mim. Eu já era muito
ligado ao -movimento- &ldquo;universo&rdquo; open source e gostava
bastante de Python, então foi muito legal começar a trabalhar com Ruby!</p>

<p>Conheci pessoas muito espertas que me influenciaram(e influenciam) na
busca pelo conhecimento, não necessariamente na linguagem Ruby. Não acho
que Ruby é a melhor linguagem do mundo, mas com certeza é uma das
melhores para se conhecer. A verdade é que todos que trabalham ou vão
conhecer a linguagem terão contato com conceitos muito importantes.</p>

<p>Recomendo a todos que deem uma chance ao Ruby. Para começar:
<a href="http://www.ruby-lang.org/pt/">http://www.ruby-lang.org/pt/</a>&ndash; Site da
linguagem em português
<a href="http://groups.google.com/group/ruby-sp">http://groups.google.com/group/ruby-sp</a>
&ndash; Grupo de usuários Ruby de São Paulo
<a href="http://tryruby.org/">http://tryruby.org/</a> &ndash; Try Ruby in your Browser
<a href="http://rubyonrails.org/">http://rubyonrails.org/</a> &ndash; Ruby on Rails &ndash;
Framework Web &ndash; Você precisa conhecer! =)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Software livre e o desenvolvimento do país]]></title>
    <link href="http://philipsampaio.com.br/blog/2011/02/05/software-livre-e-o-desenvolvimento-do-pais/"/>
    <updated>2011-02-05T02:38:28-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2011/02/05/software-livre-e-o-desenvolvimento-do-pais</id>
    <content type="html"><![CDATA[<p>Uma grande revolução vem acontecendo há alguns anos: a adoção de
tecnologias de código aberto para o desenvolvimento de softwares. Essa
tendência vem se mostrando cada vez mais forte no Brasil. Posso ver
através das propostas de emprego divulgadas em vários sites que o
conhecimento por algo que envolva software livre está cada vez mais
sendo requisitado. As principais tecnologias estão diretamente ligadas à
Web. Acredito que o melhor foco de atuação é relacionado às tecnologias
abertas! Há muitos motivos para o projeto ser baseado essencialmente em
código aberto. A visão quase &ldquo;romântica&rdquo; de ligar Software Livre ao
desenvolvimento do país tem explicação:</p>

<ol>
<li>Os programadores ficam mais independentes em relação à plataforma;</li>
<li>Há muito mais chance de contribuir para &ldquo;comunidade&rdquo;(empresas,
hobbistas, hackers, a própria equipe, etc) quando trabalha se com
código aberto &ndash; dessa forma, todos ganham;</li>
<li>Pode-se aprender MUITO, já que há muitos projetos
abertos(<a href="https://github.com/?locale=pt-BR">http://github.com/</a> &ndash;
Milhares de projetos livres) e muita comunicação online;</li>
<li>Você tem farta documentação na internet;</li>
<li>Pode-se utilizar código de terceiros em seu projeto;</li>
<li>Você expõe sua habilidade ao mundo. Sendo assim, para sobrevivência
do projeto(livre), você será &ldquo;forçado&rdquo; a escrever um bom software,
mesmo que isso demore um pouco mais;</li>
<li>O software, que pode ser uma biblioteca que a ser usada em seu
projeto, tem qualidade em relação à bugs, devido à quantidade de
usuários testando e reportando erros que escaparam dos testes;</li>
<li>A rápida atualização de sua plataforma de desenvolvimento pode ser
um bom motivo para melhorias no software como um todo;</li>
<li>Contato com diferentes tecnologias &ndash; a maior realidade;</li>
<li>Migrações menos traumáticas, já que não é preciso comprar licenças
para rodar o projeto em um novo ambiente!</li>
<li>Uma comunidade apaixonada por tecnologia, que sempre tem vontade de
crescer!</li>
</ol>


<p>Acredito realmente que deve-se buscar alternativas abertas, pois isso
pode salvar o seu projeto!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Android SDK no Fedora 12 x86_64]]></title>
    <link href="http://philipsampaio.com.br/blog/2010/05/29/android-sdk-no-fedora-12-x86_64/"/>
    <updated>2010-05-29T13:18:00-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2010/05/29/android-sdk-no-fedora-12-x86_64</id>
    <content type="html"><![CDATA[<p>Esse tal de Android me deixa bem animado com a programação para
dispositivos móveis! Parece um bom investimento aprender a desenvolver
para celulares&hellip; Bem, eu queria muito saber como é rodar um sistema
desses, emulado. Sei que a Google especifica um sistema 32bits para
rodar, porém o meu sistema é de 64bits. Não desisti e corri atrás de
informações. Consegui encontrar uma mensagem no mainlist do grupo
android-developers do groups(google) relacionada a isso.</p>

<p>Resumidamente: precisa-se instalar bibliotecas 32 bits, mas a lista é
grande, então rode e instale tudo com:</p>

<p><strong>#yum install glibc.i686 glibc-devel.i686
libstdc++.i686 zlib-devel.i686 ncurses-devel.i686 libX11-devel.i686
glibc.i686 ncurses-libs.i686 libgcc.i686 ncurses-libs.i686
libstdc++.i686 libX11.i686 zlib.i686 SDL.i686 libXext.i686 libXv.i686
libXrandr.i686 alsa-lib.i686 alsa-plugins-pulseaudio.i686</strong> Em seguida
rode o seu sistema emulado:</p>

<p><strong>$./emulator -audio alsa @nomedasuaAVD</strong></p>

<p><a href="http://philipsampaio.com.br/wp-content/uploads/2010/05/captura_de_tela-16.png"><img src="http://philipsampaio.com.br/wp-content/uploads/2010/05/captura_de_tela-16.png" title="Tela do Android" alt="image" /></a></p>

<p>Não abordei a instalação do SDK porque é fácil pra caramba.
Na verdade é só baixar e descompactar. Agora vou estudar mais sobre isso&hellip; quem sabe
eu consiga construir uma boa app!*&ndash;*</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Aprendendo Django no Planeta Terra]]></title>
    <link href="http://philipsampaio.com.br/blog/2010/03/12/aprendendo-django-no-planeta-terra/"/>
    <updated>2010-03-12T16:57:47-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2010/03/12/aprendendo-django-no-planeta-terra</id>
    <content type="html"><![CDATA[<p>Eis uma tecnologia promissora: o <a href="http://www.djangoproject.com/" title="Site do projeto Django">Django
Framework</a>. Para
quem não conhece, o Django é como uma grande coleção de bibliotecas e
rotinas prontas, feitas para agilizar o desenvolvimento de um sistema
web. Por exemplo: em um site, sempre haverá as rotinas de adicionar,
editar e excluir uma determinada informação. Programando da forma
&ldquo;clássica&rdquo;, sem framework, você terá que criar cada processo na &ldquo;mão&rdquo;.
Quando não há muitas coisas para criar, fica fácil, mas se é um sistema
com muitas coisas para se editar, aí o bicho pega! Com o Django, você só
cria uma classe modelo, com o tipo de informação. Daí ele cria todo o
processo de edição de determinada informação. Isso não fará com que você
não tenha contato com a linguagem de programação, mas simplificará todo
o processo. Esse é o papel do Django! Você pode obter mais informações
no <a href="http://www.djangobrasil.org/" title="Projeto django">site da comunidade brasileira de desenvolvimento
Django</a>. Se ficou
interessado e deseja começar a aprender, vai no link
<a href="http://www.aprendendodjango.com/">http://www.aprendendodjango.com/</a> e
surpreenda-se! Mesmo se você não souber programar muito bem! Mas terás
que entender bem o padrão MVC para progredir com mais facilidade no
curso. Ainda não tive tempo para terminar o curso online, mas fiquei
super animado com o que vi! Espero encontrar muitos sites, em um futuro
próximo, sendo desenvolvidos sob o Django.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Agora sou um FEDERAL!]]></title>
    <link href="http://philipsampaio.com.br/blog/2010/03/12/agora-sou-um-federal/"/>
    <updated>2010-03-12T15:28:56-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2010/03/12/agora-sou-um-federal</id>
    <content type="html"><![CDATA[<p>Ora, vejam só&hellip; aquele menino está virando gente grande. Ele até já faz
faculdade!
<img src="http://philipsampaio.com.br/wp-content/uploads/2010/03/if10.png" title="Instituto Federal de educação, ciência e tecnologia" alt="image" />](/wp-content/uploads/2010/03/if10.png)
Estou no Instituto Federal de São Paulo, meio que sem ter planejado, e
adorando muito o curso de Análise e Desenvolvimento de Sistemas!
A instituição é um tanto desorganizada, mas as aulas são ótimas(há
exceções, claro)!
Meu título, ao terminar o curso, será de tecnólogo, mas isso não é mais
um problema! Tô fazendo o que gosto!
Talvez ciência da computação fosse legal, mas duvido que eu estaria tão
animado pra ir às aulas!
Além disso, o pessoal de lá é muito gente boa!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Algumas mudanças]]></title>
    <link href="http://philipsampaio.com.br/blog/2009/04/09/algumas-mudancas/"/>
    <updated>2009-04-09T21:12:13-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2009/04/09/algumas-mudancas</id>
    <content type="html"><![CDATA[<p>Acho que se eu disser novamente que vou recomeçar a postar, você irá rir
disso. Pois bem, não direi isso. Quero dizer que estou vivo e que
aconteceram coisas muito legais nesse tempo todo! Fiz 18 anos de idade!
A liberdade agora está estampada na minha testa! XD Me alistei no
serviço militar, o que não foi nada legal porque tive que ir até 3
juntas por aqui(pq não sabia qual era e me informaram errado)! Mas foi
uma boa experiência! Bom, o melhor é que estou trabalhando
(supostamente) com o que gosto de fazer! Ser desenvolvedor web! Bom, vou
fazer cursinho no meu tempo vago, mas quando tiver tempo e arrumar meu
PC(minha placa-mãe foi pro saco!) eu volto a postar. Abraços!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fim de uma etapa]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/12/09/fim-de-uma-etapa/"/>
    <updated>2008-12-09T01:22:40-02:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/12/09/fim-de-uma-etapa</id>
    <content type="html"><![CDATA[<p>Finalmente terminei meu TCC, conseqüentemente meu curso técnico de
informática na Escola Técnica Parque da Juventude &ndash; São Paulo &ndash; olha o
orgulho &ndash; ! Também terminei o ensino médio, sem repetir nenhum ano XD
([é porque tem gente que ainda consegue essa proeza nos dias de hoje).
Estou bastante feliz pois além de concluir tudo numa boa, fiz uma ótima
apresentação com meu TCC. Pena não ter nenhum vídeo. Obrigado a todos
que me ajudaram! Próximo passo é a 2ª fase da Fuvest. Logo logo postarei
novamente!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Democracia digital]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/10/17/democracia-digital/"/>
    <updated>2008-10-17T12:58:41-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/10/17/democracia-digital</id>
    <content type="html"><![CDATA[<p>É muito bom ver que algumas áreas de nosso governo são tão empenhadas em
democratizar o acesso à informação.. mas as vezes é decepcionante:
<a href="http://philipsampaio.com.br/wp-content/uploads/2008/10/captura_da_tela-19.png"><img src="http://philipsampaio.com.br/wp-content/uploads/2008/10/captura_da_tela-19.png?w=510" title="Secretaria da educação do estado de São Paulo" alt="image" /></a>
Caso você NÃO possua o navegador proprietário Internet Explorer, e muito
menos possua alguma versão do Windows, você terá a agradável surpresa de
não vizualizar este site! Claro que você pode formatar seu hd e instalar
uma cópia do Windows só para acessar este site. Mas para isso, você
pagará no mínimo R$400,00(a não ser que sua consciência permita comprar
uma cópia pirata). Você também pode instalar o
<a href="http://www.tatanka.com.br/ies4linux/page/Main_Page" title="IEs4Linux">IEs4Linux</a>.
Mas convenhamos: haja paciência! Para testar, acesse o <a href="http://censo.edunet.sp.gov.br/2008/">Censo da
secretaria da educação de São
Paulo</a> e clique em algum dos links
do site.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mais um ótimo IDE: Geany]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/09/20/mais-um-otimo-ide-geany/"/>
    <updated>2008-09-20T18:54:13-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/09/20/mais-um-otimo-ide-geany</id>
    <content type="html"><![CDATA[<p>Vou fazer uma rápida apresentação sobre este IDE. É um IDE extremamente
rápido! Possui syntax highlighting(deixa o código colorido e mais fácil
de vizualizar), suporta várias linguagens, pode compilar e executar os
programas(ou até páginas web.. executa em um navegador) e etc. O que
mais chama atenção é a velocidade e estabilidade. Um Screenshot do
programa:</p>

<p><a href="http://philipsampaio.com.br/wp-content/uploads/2008/09/captura_da_tela-7.png"><img src="http://philipsampaio.com.br/wp-content/uploads/2008/09/captura_da_tela-7.png" title="captura_da_tela-7" alt="Geany IDE" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[As novidades do emesene]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/09/18/as-novidades-do-emesene/"/>
    <updated>2008-09-18T13:49:55-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/09/18/as-novidades-do-emesene</id>
    <content type="html"><![CDATA[<p>A versão em desenvolvimento do emesene, mensageiro instantâneo para
redes Windows Live Messenger<sup>TM</sup>^, está cheia de novidades, como o
suporte ao novo protocolo usado pela Microsoft<sup>TM</sup><sup>msnp15</sup>. Se você teve
algum problema para se logar, é por causa deste protocolo e as vezes
dava problema até no Live Messenger<sup>TM</sup>^.
<a href="http://philipsampaio.com.br/wp-content/uploads/2008/09/captura_da_tela-13.png"><img src="http://philipsampaio.com.br/wp-content/uploads/2008/09/captura_da_tela-13.png" title="emesene-truck" alt="image" /></a></p>

<p>Outra novidade é que as cores, e inclusive os gradientes, do MSN Plus!
já estão disponíveis nesta nova versão(versões de testes). O suporte a
webcams está avançando&hellip; você já pode visualizar a webcam de seu amigo
=D (embora eu não tenha testado). Para testar as versões em
desenvolvimento do emesene, você deve instalar o
<a href="http://en.wikipedia.org/wiki/Subversion_(software">Subversion</a>) que é
um &ldquo;controle de versões&rdquo;. Para isto, abra seu terminal e digite:</p>

<p>Para quem usa Ubuntu ou Debian, etc:</p>

<p><strong><code>#apt-get install subversion</code></strong></p>

<p>Para quem usa Red Hat, Fedora:</p>

<p><strong><code>#yum install subversion</code></strong></p>

<p>Para obter obter o emesene-trunk(trunk é o nome dado a versões &ldquo;não oficiais&rdquo;) faça:</p>

<p><strong><code>$svn co https://emesene.svn.sourceforge.net/svnroot/emesene/trunk/emesene/ emesene-trunk</code></strong></p>

<p>Este comando copiará todo o código fonte do emesene e salvará na pasta
emesene-trunk(criada com o mesmo comando). Em seguida:
<strong><code>$cd emesene-trunk</code></strong> e <strong><code>$./emesene</code></strong> Você perceberá que não é
muito conveniente ficar fazendo isso toda vez que for iniciar o
programa. Então crie um lançador apontando para o emesene ;D. Para
manter os códigos atualizados, você deve entrar na pasta emesene-trunk e
digitar o comando svn up. Lembre-se que estas são versões em
desenvolvimento e podem ser muito instáveis! Recomenda-se usar a versão
dos repositórios da sua distro! Quem deseja estudar <strong>Python</strong> e a
biblioteca <strong>PyGTK,</strong> vai se deliciar com esta belezura. Para mais
informações sobre o desenvolvimento deste (ótimo) software, acesse:
<a href="http://emesene.org/smf/">http://emesene.org/smf/</a> Até mais.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recomeçando a postar]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/08/28/recomecando-a-postar/"/>
    <updated>2008-08-28T17:42:35-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/08/28/recomecando-a-postar</id>
    <content type="html"><![CDATA[<p>Se algum dia você passou por este blog, percebeu que ele ficou
muitíssimo tempo sem posts! Pois é, eu tive alguns problemas pessoais
que me deixaram sem muito ânimo pra seguir postando aqui. Mas agora
estou de volta, e cheio de idéias! Vou mudar o foco do blog para ficar
algo mais amplo&hellip; Vou falar sobre tudo que puder(e se o tempo deixar!).
Então é isso ai, let&rsquo;s rock!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalando a ZeosLib no Delphi 7]]></title>
    <link href="http://philipsampaio.com.br/blog/2008/08/28/instalando-a-zeoslib-no-delphi-7/"/>
    <updated>2008-08-28T17:40:18-03:00</updated>
    <id>http://philipsampaio.com.br/blog/2008/08/28/instalando-a-zeoslib-no-delphi-7</id>
    <content type="html"><![CDATA[<p>Sim, eu desenvolvo em Delphi! Preferiria aprender Python no meu técnico,
mas eles consideram &ldquo;fora de mercado&rdquo;. Querem criar mão-de-obra
barata(Ok, você pode ganhar muito com isso!). Mas, como diz uma grande
amiga minha, nem tudo é como agente quer&hellip; Tenho que usar Windows
contra a minha vontade, mas tudo bem. Conhecimento que vier é lucro. A
dica está
<a href="http://lauroernesto.wordpress.com/2008/07/18/instalar-a-palheta-de-componentes-zeos-access-no-delphi/">aqui</a>,
e serve para quem está com problemas em instalar pelo método ensinado
<a href="http://imasters.uol.com.br/artigo/3377/delphi/conexao_nativa_com_banco_de_dados_no_delphi/">aqui</a>.
Em breve eu mostro com instalar no Lazarus.</p>
]]></content>
  </entry>
  
</feed>
