<?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>CØdeZØne! &#187; erlang</title>
	<atom:link href="http://leandrosilva.com.br/category/erlang/feed/" rel="self" type="application/rss+xml" />
	<link>http://leandrosilva.com.br</link>
	<description>Coisas sobre desenvolvimento de software</description>
	<lastBuildDate>Mon, 23 Aug 2010 13:04:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Erlang: system_info pode te dizer coisas legais</title>
		<link>http://leandrosilva.com.br/2010/05/09/erlang-system_info-pode-te-dizer-coisas-legais/</link>
		<comments>http://leandrosilva.com.br/2010/05/09/erlang-system_info-pode-te-dizer-coisas-legais/#comments</comments>
		<pubDate>Sun, 09 May 2010 05:01:30 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=676</guid>
		<description><![CDATA[Ontem à noite, antes da sessão pão de queijo com chá mate aqui em casa, resolvi brincar um pouco com uns módulos de baixo nível de Erlang, porque de manhã havia me lembrado de um post bem legal, de um cara chamado Krzysztof Kliś, que li no ano passado. (Aliás, aproveitei e colei o código dele [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem à noite, antes da sessão <a href="http://twitter.com/codezone/status/13636980898" target="_blank">pão de queijo com chá mate</a> aqui em casa, resolvi brincar um pouco com uns <a href="http://www.erlang.org/doc/man/os_mon_app.html" target="_blank">módulos de baixo nível</a> de Erlang, porque de manhã havia me lembrado de <a href="http://weblambdazero.blogspot.com/2008/08/web-services-need-balance.html" target="_blank">um post</a> bem legal, de um cara chamado <a href="http://www.blogger.com/profile/03518001329895236884" target="_blank">Krzysztof Kliś</a>, que li no ano passado. (Aliás, aproveitei e <a href="http://gist.github.com/394820" target="_blank">colei o código</a> dele no <a href="http://gist.github.com/leandrosilva" target="_blank">meu gist</a>, pra favorecer a leitura com <em>syntax highlighting</em>.)</p>
<p>Bem, dessa brincadeira saiu o módulo <a href="http://github.com/leandrosilva/erlang-learning/blob/master/getting_system_info/src/system_info.erl" target="_blank"><strong>system_info</strong></a>, que você pode conferir no <a href="http://github.com/leandrosilva" target="_blank">meu GitHub</a>, no projeto de estudo <a href="http://github.com/leandrosilva/erlang-learning/tree/master/getting_system_info/" target="_blank">getting_system_info</a>.</p>
<h3>O que ele faz?</h3>
<p>Basicamente, ele oferece informações de load da máquina, quantidade de processos rodando e uso de memória do nó atual ou do cluster. Você pode ter mais detalhes sobre o formato dessas informações dando uma olhada nos <a href="http://github.com/leandrosilva/erlang-learning/blob/master/getting_system_info/test/system_info_test.erl" target="_blank">testes</a> do projeto.</p>
<h3>Qual a utilidade disso?</h3>
<p>Como disse, escrevi esse código depois de me lembrar do post do Krzysztof Kliś sobre seu <em>load balancer </em>[de apenas 48 linha]. Escrevi por pura diversão.</p>
<p>Mas, sim, se amanhã ou depois eu precisar escrever algum <em>load balancer</em> ou aplicativo que monitore load, processos e memória do meu cluster, ele poderá me servir de <em>helper</em>.</p>
<h3>Dá pra testar e ver se funciona?</h3>
<p>Sim, a menos que você seja usuário de Windows. Não, não é preconceito, é que algumas funções que uso não estão disponíveis pra Windows, apenas pra sistemas operacionais <em><a href="http://en.wikipedia.org/wiki/Unix-like" target="_blank">Unix-like</a></em>.</p>
<p>Você pode fazer isso de duas maneiras:</p>
<p><strong>1- Rodando os testes</strong></p>
<p>Clone o <a href="http://github.com/leandrosilva/erlang-learning" target="_blank">projeto</a> <em>&#8211; o único problema é que você vai levar uma porção de outros projetos de brinde. I&#8217;m sorry! &#8211;</em> e em seu diretório raíz, compile e rode os testes.</p>
<pre class="brush: bash;">
$ ./compile.sh
$ ./test.sh
</pre>
<p>Só que dessa maneira você não consegue ver nenhuma informação útil. Vamos à segunda maneira.</p>
<p><strong>2- Rodando as funções no Eshell</strong></p>
<p>Depois de devidamente clonado e compilado, crie um cluster com três nós. (Se não souber como a arquitetura de cluster de runtimes Erlang funciona, tenho <a href="http://leandrosilva.com.br/2010/05/08/erlang-programacao-distribuida-de-maneira-simples/" target="_self">um post introdutório pra você</a>.)</p>
<p>Na raíz do projeto:</p>
<p>a. Inicie três nós, um em cada terminal</p>
<pre class="brush: bash;">
$ erl -sname n1 -pa ebin/
</pre>
<pre class="brush: bash;">
$ erl -sname n2 -pa ebin/
</pre>
<pre class="brush: bash;">
$ erl -sname n3 -pa ebin/
</pre>
<p>b. No <em>n1</em>, estabeleça conexão entre os nós</p>
<pre class="brush: bash;">
(n1@codezone)1&gt; net_kernel:connect('n2@codezone').
(n1@codezone)2&gt; net_kernel:connect('n3@codezone').
</pre>
<p>Agora, todos os três nós estão conectados uns aos outros, já que, por padrão, os nós compartilham suas conexões uns com os outros.</p>
<p>c. Ainda no <em>n1</em>, verifique as informações de <em>system_info</em></p>
<pre class="brush: bash;">
(n1@codezone)3&gt; system_info:node_load().
(n1@codezone)4&gt; system_info:cluster_load().
(n1@codezone)5&gt; system_info:node_processes().
(n1@codezone)6&gt; system_info:cluster_processes().
(n1@codezone)7&gt; system_info:node_memory().
(n1@codezone)8&gt; system_info:cluster_memory().
</pre>
<p>Agora, sim, você tem informações a valer!</p>
<h3>Gostou?</h3>
<p>Espero que sim, porque <em><strong>system_info</strong></em> pode te dizer coisas legais. <em>=)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/05/09/erlang-system_info-pode-te-dizer-coisas-legais/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Erlang: Programação Distribuída de maneira simples</title>
		<link>http://leandrosilva.com.br/2010/05/08/erlang-programacao-distribuida-de-maneira-simples/</link>
		<comments>http://leandrosilva.com.br/2010/05/08/erlang-programacao-distribuida-de-maneira-simples/#comments</comments>
		<pubDate>Sat, 08 May 2010 05:38:54 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[erlang]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=645</guid>
		<description><![CDATA[Fazia tempo que estava para blogar algo sobre como é fácil fazer programação distribuída com Erlang. Derrepente, hoje, acabei perdendo o sono e eis aqui o post. O mais simples do mundo Pra começar, vamos ver o exemplo mais simples de computação distribuída que se pode fazer e aprender alguma coisa com ele. Ele é [...]]]></description>
			<content:encoded><![CDATA[<p>Fazia tempo que estava para blogar algo sobre como é fácil fazer <a href="http://www.erlang.org/doc/reference_manual/distributed.html" target="_blank">programação distribuída</a> com Erlang. Derrepente, hoje, acabei perdendo o sono e eis aqui o post.</p>
<h3>O mais simples do mundo</h3>
<p>Pra começar, vamos ver o exemplo mais simples de <a href="http://en.wikipedia.org/wiki/Distributed_computing" target="_blank">computação distribuída</a> que se pode fazer e aprender alguma coisa com ele. Ele é como um simples chat. Pois muito bem, vejamos!</p>
<p><strong>Fazendo o setup</strong></p>
<p>No terminal, inicie um Eshell com o seguinte comando:</p>
<pre class="brush: bash;">
$ erl -sname jose
</pre>
<p>E num outro terminal, inicie outro Eshell com:</p>
<pre class="brush: bash;">
$ erl -sname maria
</pre>
<p>Agora vá no primeiro terminal, no Eshell do José, e execute o seguinte comando:</p>
<pre class="brush: bash;">
(jose@codezone)1&gt; register(console_jose, self()).
</pre>
<p>E no segundo terminal, no Eshell da Maria, faça o mesmo:</p>
<pre class="brush: bash;">
(maria@codezone)1&gt; register(console_maria, self()).
</pre>
<p>Tudo bem, setup feito, hora do bate-papo!</p>
<p><strong>Jogando conversa fora</strong></p>
<p><em>&#8220;Ei José, diga oi&#8230;&#8221;</em></p>
<pre class="brush: bash;">
(jose@codezone)2&gt; {console_maria, 'maria@codezone'} ! &quot;Oi Maria, tudo bem?&quot;.
</pre>
<p>Veja o terminal da Maria. O que aconteceu? Nada? A mensagem não chegou? Chegou, chegou sim. Vejamos:</p>
<pre class="brush: bash;">
(maria@codezone)2&gt; regs().
</pre>
<p>Na primeira coluna, procure pelo processo <em>console_maria</em>. Achou? Agora veja na última coluna desse processo. Que número tem aí? 1? Pois é, isso nos indica uma coisa. Ainda nesse Eshell, execute o seguinte comando:</p>
<pre class="brush: bash;">
(maria@codezone)3&gt; flush().
</pre>
<p>Opa! E agora? <em>Shell got &#8220;Oi Maria, tudo bem?&#8221;</em>, certo? Taí a mensagem que a Maria recebeu do José.</p>
<p>Agora, que tal a Maria ser gentil com o José e responde-lo cordialmente?</p>
<pre class="brush: bash;">
(maria@codezone)4&gt; {console_jose, 'jose@codezone'} ! &quot;Vou bem, e voce?&quot;.
</pre>
<p>Se você quiser, pode ver o registro de processos no Eshell do José, como fez anteriormente com o da Maria. Ou pode simplesmente:</p>
<pre class="brush: bash;">
(jose@codezone)3&gt; flush().
</pre>
<p>E receber a mensagem <em>Shell got &#8220;Vou bem, e voce?&#8221;</em>.</p>
<h3>Entendendo tudo isso</h3>
<p>Por sorte, não há muito o que explicar até aqui <em>&#8211; já que fizemos o exemplo mais simples do mundo.</em> Uff!</p>
<p><strong>Que tal começar do começo? Vamos entender os passos de setup?</strong></p>
<p><em>1- A primeira coisa que fizemos foi iniciar dois Eshell que, na verdade, tornaram-se dois nós do nosso cluster de runtimes Erlang.</em></p>
<p>Todas as vezes que você inicia um Eshell com a flag <em>-sname</em>, o que você está fazendo é criar um <a href="http://www.erlang.org/doc/reference_manual/distributed.html#id2280079" target="_blank">nó de runtime Erlang</a> na sua rede. Na verdade, isso pode ser feito também com a flag <em>-name</em>.</p>
<p>Qual a diferença entre elas?</p>
<p><em><span style="color: #800000;">-sname</span></em> cria o nó e dá a ele um <em>&#8220;short name&#8221;</em>: <span style="color: #000080;">nome_do_no@host<span style="color: #000000;">;</span></span><br />
<em><span style="color: #800000;">-name</span></em>, pelo contrário, cria o nó dá a ele um <em>&#8220;long name&#8221;</em>: <span style="color: #000080;">nome_do_no@ip_address</span> ou <span style="color: #000080;">nome_do_no@host.local<span style="color: #000000;">, no caso de rede local.</span></span></p>
<p>Você pode perfeitamente iniciar diversos nós em uma mesma máquina, como fizemos a pouco. No entanto, você não pode duplicar os nomes dos nós, uma vez que estes são usados para identificá-los no cluster e torná-los comunicáveis uns com os outros.</p>
<blockquote><p><em>&#8220;Lembrando que o nome dos nós são sempre sufixados pelo nome/ip do host, não há problema algum em ter o mesmo nome de nó em máquinas diferentes.&#8221;</em></p></blockquote>
<p>Uma outra coisa interessante de aprender aqui é como os nós se comunicam. Toda comunicação entre nós é feita por um <em>daemon</em> chamado <a href="http://www.erlang.org/doc/man/epmd.html" target="_blank">epmd</a>. Este programa faz parte do sistema de runtime Erlang e tem um papel fundamental em sua arquitetura de clusters, porque sempre que &#8220;o primeiro nó&#8221; é iniciado numa máquina, automaticamente, ele também é iniciado, caso ainda não tenha sido, e passa a escutar mensagens na porta 4369 e rotea-las para o nó apropriado.</p>
<blockquote><p><em>&#8220;Independente de quantos nós estejam rodando numa máquina, sempre haverá apenas uma instância do <strong>epmd</strong> rodando.&#8221;</em></p></blockquote>
<p>Por fim, ainda sobre o setup dos nós do cluster, há uma outra flag que não demonstrei no exemplo acima, mas que é bem interessante e você depois pode pesquisar a respeito.</p>
<p><em><span style="color: #800000;">-setcookie</span></em> define um <em>&#8220;secret cookie&#8221;</em> que serve como um tipo de <em>token</em> para autenticar a comunicação entre os nós do <em>cluster</em>. Isso quer dizer que, somente os nós iniciados com um mesmo <em>cookie</em> podem se comunicar. Por outro lado, sempre que um nó é iniciado sem especificar um <em>cookie</em>, o runtime Erlang toma a liberdade de cria um e gravar no arquivo ~/.erlang.cookie. Nestes casos, todos os nós não iniciados com um <em>cookie</em> compartilharão o mesmo <em>cookie</em> guardado nesse arquivo.</p>
<p>No caso do nosso exemplo ultra simples, um <em>cookie</em> poderia ser usado para criar uma sala de bate-papo, onde: se um nós é iniciado informando um <em>cookie</em>, ele entra na sala equivalente; no entanto, quando não informado, vai para uma sala genérica.</p>
<p>Interessante? Pois é&#8230; E esse assunto acaba puxando o da flag <em>-hidden</em>, que você pode aproveitar e pesquisar também.</p>
<p><em>2- A segunda coisa que fizemos no setup foi registrar um processo alvo de nossas mensagens.</em></p>
<p>Como a idéia aqui é explicar <em>&#8211; um pouco, porque ainda há uma porção de coisas que poderiam ser faladas, mas isso deixaria esse post imenso! Dê uma olhada na </em><a href="http://www.erlang.org/doc/reference_manual/distributed.html" target="_blank"><em>documentação oficial</em></a><em> &#8211;</em> como funciona a arquitetura de cluster de runtimes Erlang e mostrar como este provê uma maneira simples de programação distribuída, preferi não escrever um programa de chat, mas apenas usar o próprio Eshell para isso.</p>
<p>Com este pré-requisito em mente, o que fiz foi apenas <a href="http://www.erlang.org/doc/reference_manual/processes.html#id2279433" target="_blank">registrar o próprio processo</a> do Eshell <em>&#8211; usando <strong>self()</strong>, que você <a href="http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self" target="_self">entende como </a></em><em><a href="http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self" target="_self">funciona</a> &#8211;</em> com um nome especifico em cada nó do cluster (<em>console_jose</em> para um e <em>console_maria</em> em o outro) para fazer a troca de mensagens entre eles.</p>
<p><strong>E o bate-papo, como é que rolou?</strong></p>
<p>Essa é a parte mais fácil da coisa, na minha opinião. Se você já lidou com <a href="http://www.erlang.org/doc/reference_manual/processes.html#id2279365" target="_blank">processos</a> em Erlang, vai tirar de letra.</p>
<p><em>1- Trocamos mensagens entre os dois processos de maneira bem semelhante ao que fazemos normalmente com processos contidos num único runtime.</em></p>
<p>A única diferença aqui é que, em vez de simplesmente codarmos algo como <em><strong>console_jose ! &#8220;Show de bola&#8221;</strong></em>, codamos <em><strong>{console_jose, &#8216;jose@codezone&#8217;} ! &#8220;Show de bola&#8221;</strong></em>. Ou seja, além no nome do processo, informamos também em que nó do cluster ele está, tudo em uma tupla.</p>
<p>Um exercício legal de você fazer é o seguinte&#8230;</p>
<p>a. No Eshell da Maria execute:<em><strong><br />
<span style="font-weight: normal;"><span style="font-style: normal;"> </span></span></strong></em></p>
<pre class="brush: bash;">
(maria@codezone)5&gt; console_maria ! &quot;Show de bola&quot;.
(maria@codezone)6&gt; flush().
</pre>
<p><em><strong><span style="font-weight: normal;"><span style="font-style: normal;">b. Depois, ainda no Eshell dela, execute:</span></span></strong></em></p>
<pre class="brush: bash;">
(maria@codezone)7&gt; console_jose ! &quot;Show de bola&quot;.
</pre>
<p>O que aconteceu? Na primeira execução, o Eshell da Maria recebeu uma mensagem, correto? Mas na segunda execução, o Eshell &#8220;crasheou&#8221;. Por quê? Porque ele não reconheceu o átomo <em>console_jose</em> como sendo o nome de um processo, uma vez que o processo registrado como <em>console_jose</em> está em outro nó do cluster. Aliás, como o Eshell da Maria crasheou, se você tentar enviar mensagens a ele novamente, como fez anteriormente e havia funcionado, ele vai crashear novamente, porque a referência ao processo que havia sido registrada tornou-se inválida.</p>
<p>Você precisa ficar muito atento a isso, porque quando você manda um mensagem para um processo que está em outro nó, mesmo que ele não exista, você não receberá erro <em>&#8211; exatamente como acontece com envio de mensagens pra processos locais inexistentes.</em></p>
<p>Quer ver? Faça o seguinte teste:</p>
<pre class="brush: bash;">
(maria@codezone)8&gt; {console_jose_123, 'jose_abc@codezone_xyz'} ! &quot;Nao vai crashear&quot;.
</pre>
<p>E agora, o que aconteceu? Nada!</p>
<p><span style="font-weight: normal;"><span style="font-style: normal;"><em>2- Outra coisa que fizemos foi usar os truques de flush()<strong> </strong>e regs(), mas esses já são bem conhecidos.</em></span></span></p>
<p><span style="font-weight: normal;"><span style="font-style: normal;">Se você costuma usar o Eshell, com certeza, já deve ter usado <strong><em>flush()</em></strong> e <strong><em>regs()</em></strong>. Caso ainda não tenha usado, aqui vai um resumo:</span></span></p>
<p><span style="font-weight: normal;"><span style="font-style: normal;">- <em><span style="color: #000080;">flush()</span></em> descarrega as mensagens contidas na caixa postal do Eshell (que como você sabe, nada mais é do que um processo Erlang qualquer);<br />
- <em><span style="color: #000080;">regs()</span></em> lista os processos registrados do runtime em execução.</span></span></p>
<h3>Só o gostinho</h3>
<p><span style="font-weight: normal;"><span style="font-style: normal;">Como disse em algum canto nesse post, ainda há bastante o que falar sobre programação distribuída com Erlang. Só pra variar, esse post foi só pra dar o gostinho. Ainda há muito mais!</span></span></p>
<p><span style="font-weight: normal;"><span style="font-style: normal;">Bem, quem sabe qualquer dia desses não perco o sono novamente e escrevo um pouco mais sobre o assunto. Quem sabe?</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/05/08/erlang-programacao-distribuida-de-maneira-simples/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Um pouco de TDD com Eunit</title>
		<link>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/</link>
		<comments>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 00:03:30 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=604</guid>
		<description><![CDATA[No final do ano passado estava bem empolgado com a implementação Erlang do Restfulie e, algum tempo depois de ter começado o projeto, resolvi deixar de ser cowboy e escrever alguns testes. De lá pra cá, vez ou outra, dei uma melhorada nos testes, primeiro pra ficar mais útil, depois pra deixar mais fluente. Ainda [...]]]></description>
			<content:encoded><![CDATA[<p>No final do ano passado estava bem empolgado com a implementação Erlang do <a href="http://github.com/caelum/restfulie" target="_blank">Restfulie</a> e, algum tempo depois de ter começado o projeto, resolvi deixar de ser cowboy e escrever alguns testes. De lá pra cá, vez ou outra, dei uma melhorada nos testes, primeiro pra ficar mais útil, depois pra deixar mais fluente. Ainda não está lá essas coisas, mas já está, no mínimo, interessante. Se você quiser, pode conferir no <a href="http://github.com/leandrosilva/restfulierl/tree/master/test/" target="_blank">meu GitHub</a>.</p>
<p>Bem, no final das contas, isso acabou me motivando a escrever esse post, como um tutorial básico de TDD (talvez alguns queriam chamar de BDD, não tem problema, podem chamar como assim) com <a href="http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html" target="_blank">Eunit</a>, a biblioteca de testes padrão que vem com qualquer instalação de Erlang.</p>
<p>A idéia desse tutorial é seguir numa linha um pouco diferente da documentação do Eunit e dos exemplos contidos no próprio projeto, escrevendo testes mais fluentes e interessantes de ler.</p>
<h3>Mão na massa</h3>
<h4>Passo 1: criar a estrutura do projeto</h4>
<p>O nome do nosso projeto será <em>making_tdd_with_eunit</em> (bem criativo!). Vamos criar então a seguinte estrutura de diretórios, que é frequentemente encontrada em projetos Erlang:</p>
<pre><span style="color: #000080;">- making_tdd_with_eunit
  |
  +-- ebin
  +-- src
  +-- test</span></pre>
<p>OK, apesar dos diretórios terem nomes auto explicativos, não custa nada reforçar, né?</p>
<p>- <strong>ebin</strong>, contém os binários (.beam) resultantes da compilação dos fontes;<br />
- <strong>src</strong>, contém os fontes (.erl) dos módulos;<br />
- <strong>test</strong>, contém os fontes (.erl) dos testes.</p>
<h4>Passo 2: escrever o primeiro teste que inevitavelmente falhará</h4>
<p>Qual é o fluxo de trabalho com TDD mesmo, hein? Escrever o código a ser testado, rodar e, se funcionar, escrever o tal teste que passa de primeira, não é isso? Não, não é. Isso não é TDD.</p>
<p>Pois muito bem, vamos fazer então como realmente tem que ser feito. No diretório <em>test</em>, crie o seguinte teste (<em>mobile_test.erl</em>):</p>
<pre class="brush: java;">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    [fun should_have_a_number/0]}.

should_have_a_number() -&gt;
  ?assertMatch({number, _}, mobile:number()).
</pre>
<p>Feito isso, compile e rode o teste com os seguintes comandos:</p>
<pre class="brush: bash;">
$ erlc -o ebin/ test/mobile_test.erl
</pre>
<pre class="brush: bash;">
$ erl -pa ebin/ -noshell -run mobile_test test -run init stop
</pre>
<p>Qual foi o resultado? O teste falhou, certo? Pois é, como manda o figurino!</p>
<p><em>&#8220;Escreva um teste, rode todos os testes e veja-o falhar; escreva o código mais simples possível para fazê-lo passar, mesmo que num primeiro momento não seja o mais bonito e eficiente; rode todos os testes e veja-os passar; depois, refatore para remover duplicações</em><em>.&#8221; [1]<br />
</em></p>
<h4>Passo 3: fazer o teste passar</h4>
<p>Agora vamos fazer esse teste passar. No diretório <em>src</em>, crie o seguinte módulo:</p>
<pre class="brush: java;">
-module(mobile).

-export([number/0]).

number() -&gt;
  {number, &quot;1212-1212&quot;}.
</pre>
<p>Como fizemos anteriormente <em>&#8211; agora acrescentando o módulo mobile à compilação &#8211;</em>, compile e rode o teste com os seguintes comandos:</p>
<pre class="brush: bash;">
$ erlc -o ebin/ src/mobile.erl test/mobile_test.erl
</pre>
<pre class="brush: bash;">
$ erl -pa ebin/ -noshell -run mobile_test test -run init stop
</pre>
<p>Resultado? &#8220;Test passed.&#8221;</p>
<h4>Passo 4: escrever mais testes</h4>
<p>Só para não prolongar muito <em>&#8211; este que deveria ser um pequeno tutorial &#8211;</em> vamos para o ponto em que magicamente passamos a ter testes para as quatro funções (ultra dummies) contidas no módulo mobile, tudo bem?</p>
<pre class="brush: java;">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    [fun should_have_a_number/0,
     fun should_have_a_area_code/0,
     fun should_have_a_company/0,
     fun should_have_a_owner/0]}.

should_have_a_fixed_number() -&gt;
  ?assertMatch({number, &quot;1212-1212&quot;}, mobile:number()).

should_have_a_fixed_area_code() -&gt;
  ?assertMatch({area_code, &quot;11&quot;}, mobile:area_code()).

should_have_a_fixed_company() -&gt;
  ?assertMatch({company, &quot;DEAD&quot;}, mobile:company()).

should_have_a_fixed_owner() -&gt;
  ?assertMatch({owner, &quot;Little Jose&quot;}, mobile:owner()).
</pre>
<pre class="brush: java;">
-module(mobile).

-export([number/0, area_code/0, company/0, owner/0]).

number() -&gt;
  {number, &quot;1212-1212&quot;}.

area_code() -&gt;
  {area_code, &quot;11&quot;}.

company() -&gt;
  {company, &quot;DEAD&quot;}.

owner() -&gt;
  {owner, &quot;Little Jose&quot;}.
</pre>
<p>OK, repetindo o passo anterior de compilação e execução dos testes, temos quatro testes passando, certo? Então é hora de um pouco de refatoração&#8230;</p>
<h4>Passo 5: refatorar os testes para ficarem mais fluentes</h4>
<p>Nesse ponto, vamos adicionar mais fluência ao nosso teste e melhorar a sua comunicação, inclusive, descrevendo um cenário &#8220;bem interessante&#8221;.</p>
<pre class="brush: java;">
-module(mobile_test).

-include_lib(&quot;eunit/include/eunit.hrl&quot;).

describe_client_test_() -&gt;
  {&quot;Mobile&quot;,
    {&quot;when is a dummy&quot;,
      [
        {&quot;should have a fixed number&quot;,
          fun should_have_a_fixed_number/0},
        {&quot;should have a fixed area code&quot;,
          fun should_have_a_fixed_area_code/0},
        {&quot;should have a fixed company&quot;,
          fun should_have_a_fixed_company/0},
        {&quot;should have a fixed owner&quot;,
          fun should_have_a_fixed_owner/0}
      ]}}.

should_have_a_fixed_number() -&gt;
  ?assertMatch({number, &quot;1212-1212&quot;}, mobile:number()).

should_have_a_fixed_area_code() -&gt;
  ?assertMatch({area_code, &quot;11&quot;}, mobile:area_code()).

should_have_a_fixed_company() -&gt;
  ?assertMatch({company, &quot;DEAD&quot;}, mobile:company()).

should_have_a_fixed_owner() -&gt;
  ?assertMatch({owner, &quot;Little Jose&quot;}, mobile:owner()).
</pre>
<p>Compilando e rodando os testes: &#8220;All 4 tests passed.&#8221;</p>
<h4>Próximo passo: escrever mais testes e refatorar o módulo mobile</h4>
<p>Até aqui, temos um módulo mobile totalmente dummy e um teste que usa apenas a macro <em>?assertMatch</em>. Ainda há muito que pode ser feito, desde adicionar algum comportamento útil ao módulo <em>mobile</em>, até melhorar os testes, fazer diferentes asserções, adicionar <em>befor_all</em> e <em>after_all</em> (<a href="http://github.com/leandrosilva/restfulierl/tree/master/test/" target="_blank">como nos testes do Restfulierl</a>, por exemplo) para estado inicial e final, e por aí vai.</p>
<p>Bem, esse passo deixo por sua conta. É um bom exercício pra você praticar mais Erlang e Eunit.</p>
<p>Espero que tenha gostado e até mais!</p>
<p><em>[1] Beck, K. Test-Driven Development: By Example. Addison-Wesley Professional, 2002.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2010/04/12/um-pouco-de-tdd-com-eunit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Geração e build de projetos Erlang/OTP</title>
		<link>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/</link>
		<comments>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 03:08:54 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[agilidade]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=489</guid>
		<description><![CDATA[OK. Hora do jabá&#8230; Há alguns meses, quando comecei a mexer mais com Erlang/OTP, senti a necessidade de ter uma ferramenta que gerasse a estrutura dos projetos, bem como stubs dos módulos necessários. Não encontrei nenhuma que fosse realmente simples. O que fiz? Cocei minha própria coceira, crie o projeto otp_kickoff. Agora, de saco cheio [...]]]></description>
			<content:encoded><![CDATA[<p>OK. Hora do jabá&#8230;</p>
<p>Há alguns meses, quando comecei a mexer mais com <a href="http://erlang.org/" target="_blank">Erlang/OTP</a>, senti a necessidade de ter uma ferramenta que gerasse a estrutura dos projetos, bem como stubs dos módulos necessários. Não encontrei nenhuma que fosse realmente simples. O que fiz? Cocei minha própria coceira, crie o projeto <a href="http://github.com/leandrosilva/otp_kickoff" target="_blank">otp_kickoff</a>.</p>
<p>Agora, <span style="text-decoration: line-through;">de saco cheio</span> desconfortável de usar <a href="http://www.gnu.org/software/make/manual/make.html" target="_blank">Make</a> para automatizar tarefas de build, resolvi coçar minha própria coceira novamente, crie o projeto <a href="http://github.com/leandrosilva/ebuilder" target="_blank">ebuilder</a>.</p>
<p>Se você também está mexendo com Erlang/OTP, sugiro que dê uma olhada nestes projetos, quem sabe eles também não facilitam sua vida, ahmmm?</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/12/28/geracao-e-build-de-projetos-erlangotp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang/OTP no Caelum Tech Day 2009</title>
		<link>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/</link>
		<comments>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 01:14:20 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=480</guid>
		<description><![CDATA[Hoje aconteceu o Caelum Tech Day 2009, um evento de tecnologia voltado à própria galera que trabalha na Caelum, que ano passado contou com nada menos que Jim Weber falando de RESTful, com exclusividade, antes de sua fantástica palestra no Falando em Java. O objetivo do evento é compartilharmos entre nós mesmos as coisas que [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje aconteceu o <strong>Caelum Tech Day 2009</strong>, um evento de tecnologia voltado à própria galera que trabalha na Caelum, que ano passado contou com nada menos que <a href="http://jim.webber.name/" target="_blank">Jim Weber</a> falando de RESTful, com exclusividade, antes de sua fantástica palestra no Falando em Java.</p>
<p>O objetivo do evento é compartilharmos entre nós mesmos as coisas que estudamos durante todo o ano. Levantamos então uma porção de assuntos que gostariamos de compartilhar, votamos nos que gostaríamos de ver, e no final, os mais votados são apresentados.</p>
<p>Este ano não tivemos o Jim, mas tivemos muita gente boa da Caelum falando sobre Ruby, JavaScript, Scala, Java, o <a href="http://guilhermesilveira.wordpress.com/" target="_blank">Guilherme Silveira</a> falando de<a href="http://www.slideshare.net/guilhermecaelum/caelum-2009-rest-ao-restful" target="_blank"> RESTful</a> junto com o Cauê Guerra e eu falando de <a href="http://erlang.org/" target="_blank">Erlang/OTP</a> junto com o Thadeu Russo.</p>
<p>Veja a nossa apresentação logo abaixo e divirtam-se com Erlang!</p>
<div id="__ss_2661328" style="width: 425px;"><strong><a title="Erlang/OTP - Caelum Tech Day 2009" href="http://www.slideshare.net/leandrodoze/erlang-otp-caelum-tech-day-2009">Erlang/OTP &#8211; Caelum Tech Day 2009</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erlangotp-caelumtechday2009-091206134352-phpapp02&amp;rel=0&amp;stripped_title=erlang-otp-caelum-tech-day-2009" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=erlangotp-caelumtechday2009-091206134352-phpapp02&amp;rel=0&amp;stripped_title=erlang-otp-caelum-tech-day-2009" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/leandrodoze">Leandro Silva</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/12/06/erlangotp-no-caelum-tech-day-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo um tiquinho de self()</title>
		<link>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/</link>
		<comments>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 22:37:31 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[concorrência]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[programação funcional]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=457</guid>
		<description><![CDATA[Uma confusão bem comum quando se começa a escrever programas concorrentes em Erlang é quanto ao uso da BIF (built-in function) self(). Mais especificamente, quanto ao seu retorno. A BIF self() é analoga ao this do Java, por exemplo, que é capaz de responder quem é o objeto contenedor do método atualmente em execução. Semelhantemente, [...]]]></description>
			<content:encoded><![CDATA[<p>Uma confusão bem comum quando se começa a escrever programas concorrentes em Erlang é quanto ao uso da <em>BIF</em> (built-in function) <strong><code>self()</code></strong>. Mais especificamente, quanto ao seu retorno.</p>
<p>A <em>BIF</em> <strong><code>self()</code></strong> é analoga ao <strong><code>this</code></strong> do Java, por exemplo, que é capaz de responder quem é o objeto contenedor do método atualmente em execução. Semelhantemente, em Erlang, <strong><code>self()</code></strong> é capaz de dizer quem é o processo contenedor da função atualmente em <span style="text-decoration: line-through;">execução</span> avaliação. Assim, se você chamar <strong><code>self()</code></strong> no Erlang shell, você vai receber como retorno o <strong><code>Pid</code></strong> (identificador de processo) do próprio Erlang shell.</p>
<p>Faça um teste no seu Erlang shell:</p>
<pre class="brush: bash;">
1&gt; self().
</pre>
<p>Você deve ter recebido algo semelhante a <strong><code>&lt;0.31.0&gt;</code></strong> com retorno. Isto porque o Erlang shell nada mais é do que um processo Erlang com um comportamento <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop" target="_blank">REPL</a>.</p>
<p>Ok. Agora, o que acontece se você tiver um programa com um único módulo em que há duas funções que trocam mensagens entre dois processos? Qual seria o retorno de <strong><code>self()</code></strong> nestas duas funções?</p>
<h3>Um pequeno exemplo</h3>
<p><em> </em>Vejamos um exemplo bem simples deste caso extraído do livro <a href="http://www.amazon.com/gp/product/0596518188/ref=pd_lpo_k2_dp_sr_1?pf_rd_p=486539851&amp;pf_rd_s=lpo-top-stripe-1&amp;pf_rd_t=201&amp;pf_rd_i=193435600X&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=05FTR2BVN92ZF31Y1408" target="_blank">Erlang Programming</a>:</p>
<pre class="brush: java;">
-module(add_two).
-export([start/0, request/1, loop/0]).

start() -&gt;
  process_flag(trap_exit, true),
  Pid = spawn_link(add_two, loop, []),
  register(add_two, Pid),
  {ok, Pid}.

request(Int) -&gt;
  add_two ! {request, self(), Int},
  receive
    {result, Result}       -&gt; Result;
    {'EXIT', _Pid, Reason} -&gt; {error, Reason}
    after 1000             -&gt; timeout
  end.

loop() -&gt;
  receive
    {request, Pid, Msg} -&gt;
       Pid ! {result, Msg + 2}
  end,
  loop().
</pre>
<p>De maneira bem objetiva, o que este código faz é o seguinte:</p>
<p>1- Quando um <em>processo já existente</em> <em>&#8211; que no nosso caso será o próprio Erlang shell &#8211;</em> faz uma chamada à função <strong><code>start()</code></strong>, um <em>novo processo</em> é gerado, tendo como ponto de partida a função <strong><code>loop()</code></strong>, o seu identificador é associado à variável <strong><code>Pid</code></strong> e, por fim, ele recebe o apelido <strong><code>add_two</code></strong>.</p>
<p>2- Todas as vezes que a função <strong><code>request(Int)</code></strong> é chamada, uma mensagem é enviada para o processo <strong><code>add_two</code></strong>, para que este some 2 ao número passado como parâmetro e envie o resultado de volta ao processo solicitante.</p>
<p>3- Sempre que o processo <strong><code>add_two</code></strong> recebe uma nova mensagem, esta é capturada na sentença <strong><code>receive ... end</code></strong> da função <strong><code>loop()</code></strong>, que verifica se é um &#8220;pedido de soma&#8221;, e então, envia o resultado da soma ao processo solicitante, identificado por <strong><code>Pid</code></strong>.</p>
<h3>A confusão</h3>
<p>Bem simples mesmo, certo? Então, por que acontece a tal confusão?</p>
<p>A confusão acontece, porque o retorno de <strong><code>self()</code></strong> não é o mesmo em todas as funções deste módulo. Isto porque a função <strong><code>loop()</code></strong>, apesar de estar contida no mesmo módulo que as funções <strong><code>start()</code></strong> e <strong><code>request(Int)</code></strong>, não está <span style="text-decoration: line-through;">rodando</span> sendo avaliada no mesmo processo que elas estão. A função <strong><code>loop()</code></strong> está sendo avaliada no processo <strong><code>add_two</code></strong>, enquanto que <strong><code>start()</code></strong> e <strong><code>request()</code></strong> estão sendo avaliadas no primeiro processo <em>&#8211; o Erlang shell</em>. Assim, <strong><code>self()</code></strong> em <strong><code>loop()</code></strong> retorna um identificador de processo diferente do que retornaria as demais funções.</p>
<p>Quer tirar a prova?</p>
<h3>Mais um simples exemplo, só que desta vez, esclarecedor!</h3>
<p>Eu adicionei um bocado de &#8220;prints&#8221; no código que apresentei anteriormente e se você executá-lo agora, terá a prova do que foi discutido. <em>(Tá tudo bem, você não precisa de uma prova a estas alturas do campeonato, mas vai ser divertido.)</em></p>
<pre class="brush: java;">
-module(add_two).
-export([start/0, request/1, loop/0]).

start() -&gt;
io:format(&quot;: start -&gt; self() = ~w~n&quot;, [self()]),
  process_flag(trap_exit, true),
  Pid = spawn_link(add_two, loop, []),
  io:format(&quot;: start -&gt; Pid  = ~w~n&quot;, [Pid]),
  register(add_two, Pid),
  {ok, Pid}.

request(Int) -&gt;
  io:format(&quot;: request -&gt; self() = ~w~n&quot;, [self()]),
  add_two ! {request, self(), Int},
  receive
    {result, Result}       -&gt; Result;
    {'EXIT', _Pid, Reason} -&gt; {error, Reason}
    after 1000             -&gt; timeout
  end.

loop() -&gt;
  receive
    {request, Pid, Msg} -&gt;
       io:format(&quot;: loop/receive -&gt; self() = ~w~n&quot;, [self()]),
       io:format(&quot;: loop/receive -&gt; Pid    = ~w~n&quot;, [Pid]),
       Pid ! {result, Msg + 2}
  end,
  loop().
</pre>
<p>Após fazer a devida compilação, faz o seguinte teste no Erlang shell:</p>
<p>1- Veja o identificador de processo <em>(aka Pid)</em> do Erlang shell:</p>
<pre class="brush: bash;">
1&gt; self().
</pre>
<p>2- Inicie o processo <strong><code>add_two</code></strong>:</p>
<pre class="brush: bash;">
2&gt; add_two:start().
</pre>
<p>3- Chame a função <strong><code>request(Int)</code></strong>:</p>
<pre class="brush: bash;">
3&gt; add_two:request(10).
</pre>
<p>Executou? Comparou os <em>Pids</em>? Viu a diferença de escopo entre as três funções? Pois muito bem, então fica aqui a lição:</p>
<p><em>&#8220;Módulos servem para agrupar funções com um mesmo escopo conceitual, mas nem sempre com o mesmo escopo de processo&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/09/26/entendendo-um-tiquinho-de-self/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Você deveria considerar Erlang para seu próximo grande projeto</title>
		<link>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/</link>
		<comments>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 02:49:44 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[concorrência]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[programação funcional]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=433</guid>
		<description><![CDATA[Ao ler o título deste post, talvez você esteja se perguntando: por que eu deveria considerar Erlang para meu próximo grande projeto? Bem, meu objetivo com este post é te apresentar alguns importantes motivos para fazer isto. Erlang nasceu no laboratório de ciência da computação da Ericsson na década de 1980, influenciada por linguagens como [...]]]></description>
			<content:encoded><![CDATA[<p>Ao ler o título deste post, talvez você esteja se perguntando: <em>por que eu deveria considerar </em><a href="http://en.wikipedia.org/wiki/Erlang_(programming_language)" target="_blank"><em>Erlang</em></a><em> para meu próximo grande projeto?</em> Bem, meu objetivo com este post é te apresentar alguns importantes motivos para fazer isto.</p>
<p><img class="aligncenter" src="http://erlang.org/images/erlang.gif" alt="" width="114" height="96" /></p>
<p>Erlang nasceu no laboratório de ciência da computação da Ericsson na década de 1980, influenciada por linguagens como ML, Ada, Module, Prolog e Smalltalk, quando um time de três cientistas <em>&#8211; entre eles, o grande <a href="http://armstrongonsoftware.blogspot.com/" target="_blank">Joe Armstrong</a> &#8211;</em> receberam a missão de descobrir qual seria a melhor linguagem de programação para escrever a próxima geração de sistemas de telecom. Após dois anos de investigação e prototipação, estes cientistas descobriram que nenhuma linguagem era completa o bastante para tal objetivo e, conclusivamente, decidiram criar uma nova linguagem. Nasceu então Erlang, <em>the Ericsson Language</em>.</p>
<p>De lá pra cá, Erlang tem sido evoluida e usada para escrever grandes sistemas críticos, porque é exatamente nesse cenário que Erlang faz mais sentido. Se seu projeto é construir um sistema crítico, altamente tolerante a falhas, com disponibilidade 24&#215;7 e veloz como o papa-léguas, sim, Erlang é para você. Mas se não é bem esta sua necessidade, se você quer apenas construir um pequeno sistema, com baixa concorrência, poucos usuários, pouca necessidade de performance e possibilidade de passar horas <em>down</em> em manutenção, não, você não precisa de Erlang. <span style="text-decoration: line-through;">Que tal Basic?</span></p>
<p>Diferente de algumas linguagens que nascem para encontrar um nicho, Erlang nasceu com um problema a ser resolvido, com requisitos a serem atendidos. Tolerância a falhas, concorrência realmente pesada, computação distribuída, atualização da aplicação sem derrubá-la, sistemas de tempo real, este é o nicho de Erlang; foi para isto que Erlang nasceu.</p>
<p><strong>Quem usa Erlang atualmente?</strong></p>
<p>Além da Ericsson, é lógico, há algumas outras grandes empresas e projetos usando Erlang, como por exemplo:</p>
<p>- <em>Facebook</em>, no backend de seu sistema de chat, lidando com 100 milhõs de usuários ativos;<br />
- <em>Delicious</em>, que tem mais de 5 milhões de usuários e mais de 150 milhões de bookmarks;<br />
- <em>Amazon SimpleDB</em>, o serviço de dados do seu poderoso EC2;<br />
- <em>Motorola</em>, <em>CouchDB</em>, <em>RabbitMQ</em>, <em>Ejabbed</em>, etc.</p>
<p><strong>Ok, mas Erlang é propriedade da Ericsson?</strong></p>
<p>Não, felizmente, não. Em 1998 a Ericsson tornou Erlang open source sob a licença EPL.</p>
<p>Quer mais uma boa notícia? Você não precisa de um servidor de aplicações para rodar sua aplicação Erlang, nem mesmo uma pesada IDE para escrevê-las. Tudo o que você precisa é de uma distribuição de Erlang para sua plataforma, seja Mac OS X, Linux, Windows, Solaris, ou qualquer outro sistema <em>Unix-like</em>, que traz consigo máquina virtual, compilador e vasta bibliotéca de módulos muito úteis <em>&#8211; além do banco de dados <a href="http://en.wikipedia.org/wiki/Mnesia" target="_blank">Mnesia</a></em>; e um editor de textos de sua preferência <em>&#8211; <a href="http://macromates.com" target="_blank">TextMate</a>, por exemplo, tem um ótimo bundle para Erlang.</em></p>
<p><strong>Algumas características de Erlang</strong></p>
<p><em>1- Expressividade e beleza</em></p>
<p>Há quem diga que não, mas Erlang é uma linguagem muito bonita &#8212; <em>ao menos pra mim.</em> Dado as já citadas influências de Erlang, ela é uma linguagem bem expressiva e declarativa, que encoraja a escrita de código simples e objetivo, o que certamente torna seu código fácil de ler, de escrever e de organizar [em módulos reutilizáveis]. O snippet abaixo é um exemplo de implementação do famoso fatorial:</p>
<pre class="brush: java;">
-module(sample1).
-export([fac/1]).

fac(0) -&gt; 1;
fac(N) -&gt; N * fac(N-1).
</pre>
<p><em>2- Forte uso de recursividade</em></p>
<p>Isto certamente é uma herança da veia funcional de Erlang que torna o código muito menos imperativo e mais declarativo. Mas além da beleza declarativa óbvia, é importante saber que Erlang foi projetada para lidar com iterações recursivas gigantescas sem qualquer degradação <em>&#8211; e sem estourar o &#8220;heap&#8221; de memória.</em></p>
<p><em>3- Livre de efeito colateral</em></p>
<p>Uma das grandes capacidades dadas por Erlang é a construção de sistemas altamente concorrentes rodando em processadores com multiplos núcleos. Isto não combina nada com efeito colateral, por isso, em Erlang, uma vez que um dado valor tenha sido atribuído a uma variável, esta não poderá mais ser modificada <em>&#8211; ou seja, estão mais para o que conhecemos por constantes do que para o que conhecemos por variaveis.</em></p>
<p>Se você já escreveu código concorrênte sabe o quanto tê-lo livre de efeitos colaterais te faz livre de dores de cabeça. Poucas coisas são tão deprimentes quanto debugar código concorrênte repleto de efeitos colaterais.</p>
<p><em>4- Pattern matching</em></p>
<p><a href="http://en.wikipedia.org/wiki/Pattern_matching" target="_blank">Pattern matching</a> em Erlang é usado para associar valores a variáveis, controlar fluxo de execução de programs, extrair valores de estruturas de dados compostas e lidar com argumentos de funções. Mais um ponto para código declarativo e expressividade. Vejamos o código abaixo:</p>
<pre class="brush: java;">
-module(sample2).
-export([convert_length/1]).

convert_length(Length) -&gt;
    case Length of
        {centimeter, X} -&gt;
            {inch, X / 2.54};
        {inch, Y} -&gt;
            {centimeter, Y * 2.54}
    end.
</pre>
<p>Fala por si, não?</p>
<p><em>5- Concorrência baseada em passagem de mensagens (a.k.a. Actors)</em></p>
<p>Acho que concorrência baseada em <a href="http://en.wikipedia.org/wiki/Message_passing" target="_blank">passagem de mensagem</a> entre <a href="http://en.wikipedia.org/wiki/Actor_model" target="_blank">atores</a> é uma das features mais populares de Erlang. Vejamos o porque com o famoso exemplo do Ping-Pong:</p>
<pre class="brush: java;">
-module(sample3).

-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) -&gt;
    Pong_PID ! finished,
    io:format(&quot;Ping finished~n&quot;, []);

ping(N, Pong_PID) -&gt;
    Pong_PID ! {ping, self()},
    receive
        pong -&gt;
            io:format(&quot;Ping received pong~n&quot;, [])
    end,
    ping(N - 1, Pong_PID).

pong() -&gt;
    receive
        finished -&gt;
            io:format(&quot;Pong finished~n&quot;, []);
        {ping, Ping_PID} -&gt;
            io:format(&quot;Pong received ping~n&quot;, []),
            Ping_PID ! pong,
            pong()
    end.

start() -&gt;
    Pong_PID = spawn(sample3, pong, []),
    spawn(sample3, ping, [3, Pong_PID]).
</pre>
<p>Neste pequeno snippet podemos observar algumas características de Erlang já citadas neste post, tal como <em>pattern matching</em> na captura das mensagens e recursividade no controle das iterações.</p>
<p>Agora, falando do aspecto concorrente em sim, algumas coisas são particularmente interessantes aqui:</p>
<p>a. Em Erlang, a concorrência acontece entre processos leves, diferente de linguagens como C++ e Java, que baseiam sua concorrência em threads nativas de sistema operacional [caríssimas];<br />
b. Em Erlang, há um tipo de dado chamado <em>PID</em>, o qual é o identificador do processo paralelo (mais conhecido como Actor) e para o qual as mensagens podem ser enviadas.</p>
<p>Releia o código acima com estas informações em mente e veja como concorrência em Erlang é algo completamente descomplicado e natural. Depois, pense no mesmo código implementado em C#, Java ou C++.</p>
<p><strong>Gostei de Erlang, há algum livro para eu começar a estudar?</strong></p>
<p>Sim, há dois livros excepcionais. <a href="http://www.amazon.com/Programming-Erlang-Software-Concurrent-World/dp/193435600X" target="_blank">Um</a>, do próprio criador da linguagem, Joe Armstrong:</p>
<p><img class="aligncenter" src="http://ecx.images-amazon.com/images/I/41XOOpdBzKL._SL500_AA240_.jpg" alt="" width="240" height="240" /></p>
<p>E <a href="http://www.amazon.com/Erlang-Programming-Francesco-Cesarini/dp/0596518188/ref=pd_sim_b_3" target="_blank">outro</a> de Francesco Cesarini e Simon Thompson:</p>
<p><img class="aligncenter" title="Erlang Programming" src="http://covers.oreilly.com/images/9780596518189/cat.gif" alt="" width="180" height="236" /></p>
<p>Além disso, há o próprio <a href="http://erlang.org/starting.html" target="_blank">material on line</a> que é muito bom e barato. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Conclusão</strong></p>
<p>Erlang possui muitas outras características e informações bem interessantes, mas que me falta espaço neste post para citar e apresentar, senão ele ficará absurdamente gigantesco para o meu gosto. Mas acredito que pelo que já apresentei até aqui, você já tenha motivos suficientes para pensar em Erlang com carinho e conciderá-la para seu próximo grande projeto.</p>
<p>Em breve devo escrever algo sobre <a href="http://en.wikipedia.org/wiki/Open_Telecom_Platform_%28OTP%29" target="_blank">OTP</a>, já que neste post apresentei características mais inerentes à linguagem em si e nem tanto sobre a plataforma.</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/09/08/voce-deveria-considerar-erlang-para-seu-proximo-grande-projeto/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Quer saber onde será seu próximo trabalho?</title>
		<link>http://leandrosilva.com.br/2009/07/30/quer-saber-onde-sera-seu-proximo-trabalho/</link>
		<comments>http://leandrosilva.com.br/2009/07/30/quer-saber-onde-sera-seu-proximo-trabalho/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 16:16:08 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[ioke]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[smalltalk]]></category>
		<category><![CDATA[trabalho]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=358</guid>
		<description><![CDATA[Então não deixe de visitar&#8230; O site é recém-nascido, mas já tem uns recursos bem legais, como sistema de pesquisa por palavras-chave, núvem de tags e entre outros. Vale a pena conferir e acompanhar sua evolução &#8211; e oportunidades de bons trabalhos. Mais uma iniciativa bem interessante da Caelum.]]></description>
			<content:encoded><![CDATA[<p><strong>Então não deixe de visitar&#8230;</strong></p>
<p><a href="http://ondetrabalhar.com"><img class="alignnone" src="http://ondetrabalhar.com/images/ondetrabalhar.png" alt="" width="475" height="118" /></a></p>
<p style="text-align: center;"><a href="http://ondetrabalhar.com"><img class="aligncenter" src="http://ondetrabalhar.com/images/mascote.png" alt="" width="333" height="612" /></a></p>
<p>O site é recém-nascido, mas já tem uns recursos bem legais, como sistema de <a href="http://ondetrabalhar.com/Ruby+or+Rails" target="_blank">pesquisa</a> por palavras-chave, núvem de tags e entre outros. Vale a pena conferir e acompanhar sua evolução <em>&#8211; e oportunidades de bons trabalhos.</em></p>
<p>Mais uma iniciativa bem interessante da <a href="http://blog.caelum.com.br/2009/07/29/ondetrabalharcom-uma-iniciativa-da-caelum/" target="_blank">Caelum</a>. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/07/30/quer-saber-onde-sera-seu-proximo-trabalho/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pontapé inicial para aprender Erlang</title>
		<link>http://leandrosilva.com.br/2009/02/18/pontape-inicial-para-aprender-erlang/</link>
		<comments>http://leandrosilva.com.br/2009/02/18/pontape-inicial-para-aprender-erlang/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 05:17:52 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[pragmatismo]]></category>
		<category><![CDATA[programação funcional]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=161</guid>
		<description><![CDATA[Ano passado, no mês de outubro, resolvi começar a aprender Erlang &#8211; que é uma linguagem fantástica, digasse de passagem &#8211; e logo dei o pontapé inicial com material do próprio site da versão open-source da linguagem. Lá você encontra dois canais de conteúdos bem interessantes para o seu aprendizado. O primeiro canal é o [...]]]></description>
			<content:encoded><![CDATA[<p>Ano passado, no mês de outubro, resolvi começar a aprender <a href="http://pt.wikipedia.org/wiki/Erlang_(linguagem_de_programa%C3%A7%C3%A3o)" target="_blank">Erlang</a> &#8211; que é uma linguagem fantástica, digasse de passagem &#8211; e logo dei o pontapé inicial com material do próprio site da <a href="http://www.erlang.org/about.html" target="_blank">versão open-source</a> da linguagem. Lá você encontra dois canais de conteúdos bem interessantes para o seu aprendizado.</p>
<p>O primeiro canal é o do famoso <a href="http://www.erlang.org/starting.html" target="_blank">getting started</a>, como estamos acontumados a encontrar em outras linguagens, só que em três versões diferentes, uma para cada <span style="text-decoration: line-through;">saco</span> gosto para leitura. Tem a versão rápida, a lenta, e a muito, muito, muito lenta. Já o segundo canal é uma coleção de diversas <a href="http://www.erlang.org/doc.html" target="_blank">publicações</a> interessantes, que vale a pena ao menos saber que existe.</p>
<p>Bom, com todo esse material disponível, seria chover no molhado eu querer dizer <em>&#8220;o que é Erlang&#8221;</em>, <em>&#8220;qual o seu propósito&#8221;</em>, e <em>&#8220;blá blá blá&#8221;</em>. Os materiais supra citado já fazem isso muito bem. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Em lugar disso, vou deixar aqui um passo a passo sucinto para instalar no <a href="http://www.ubuntu-br.org" target="_blank">Ubuntu</a> a versão mais atual a partir dos fontes (já que não queremos a versão desatualizada disponível por <strong>apt-get</strong>) e mais alguns links para estudo rápido e mastigado. Ou seja, vou <span style="text-decoration: line-through;">te dar um empurrãozinho</span> te ajudar a dar o seu próprio pontapé inicial no aprendizado de Erlang.</p>
<blockquote><p><em>Lembrando que, mesmo que você seja usuário de Windows, não há problema algum, este post também é pra você. Basta você fazer o download do <strong>.exe</strong> de instalação mais atual <a href="http://www.erlang.org/download.html" target="_blank">aqui</a> e pular o próximo tópico.  E, caso você seja usuário de outra distro de Linux, I&#8217;m so sorry! Você vai ter que procurar sua própria receita de instalação no Google. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p></blockquote>
<p><strong>Instalação no Ubuntu<br />
</strong></p>
<p>Antes de começar a instalação, você precisará fazer duas coisas:</p>
<p><em>1) Criar o diretório onde você fará a instalação</em></p>
<p>No meu caso, o path que é:</p>
<pre class="brush: ruby;">

/home/leandro/Desenvolvimento/erlang/tools/otp_r12b-5
</pre>
<p>Vou usá-lo em toda a receita, então, fique atento e não se esqueça substituir pelo seu próprio path.</p>
<p><em>2) Baixar a última versão dos fontes <a href="http://www.erlang.org/download.html" target="_blank">aqui</a> e depois descompactá-la no diretório criado no passo anterior</em></p>
<p>Feito isso, ótimo! É hora de começar a instalação de verdade. Vamu qui vamu!</p>
<p><em>1) Instale o conjunto básico de ferrametas para fazer o build</em></p>
<pre class="brush: ruby;">

sudo apt-get install build-essential libncurses5-dev m4
</pre>
<p><em>2) Instale um conjunto de ferrametas de SSL, caso você ainda não tenha</em></p>
<pre class="brush: ruby;">

sudo apt-get install openssl libssl-dev
</pre>
<p><em>3) Execute a configuração do build</em></p>
<pre class="brush: ruby;">

./configure
</pre>
<p><em>4) Faça o build!</em></p>
<pre class="brush: ruby;">

make &amp;&amp; sudo make install
</pre>
<p>Aguarde, aguarde, aguarde&#8230;</p>
<p><em>5) Configure o diretório bin no PATH do sistema</em></p>
<p>Com seu editor de texto preferido, edite o arquivo <strong>/etc/bash.bashrc</strong> e insira o bloco abaixo:</p>
<pre class="brush: ruby;">

# Setting the ERLANG_HOME and PATH to Erlang otp_r12b-5
ERLANG_HOME=/home/leandro/Desenvolvimento/erlang/tools/otp_r12b-5
PATH=$ERLANG_HOME/bin:$PATH
export ERLANG_HOME PATH
</pre>
<p>Ou faça como você preferir, esse passo é bem <em>a la vonté</em> mesmo. <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>6) Teste!</em></p>
<p>No console, digite <strong>erl</strong>. Se carregar o <strong>Erlang (BEAM) emulator</strong> é porque está tudo OK!</p>
<p>Se não carregar o <strong>Erlang (BEAM) emulator</strong>, revise os passos anteriores com calma, para ver se você fez tudo certinho, se não errou ou se esqueceu de algum detalhe. Caso ainda tenha problemas, o <a href="http://www.google.com.br" target="_blank">Google</a> é seu amigo!</p>
<p><strong>Mais dicas de referências<br />
</strong></p>
<p>Como disse, além dos links que citei no início que estão realmente repletos de material interessante, queria indicar também <a href="http://caioariede.com/2009/aprendendo-erlang-parte-1" target="_blank">uma série de posts</a> do <a href="http://caioariede.com/">Caio Ariede</a>, que também está aprendendo a fantástica Erlang.</p>
<p>Outra dica é <a href="http://github.com/leandrosilva/erlang-learning/tree/master" target="_blank">um projeto</a> que criei no meu <a href="http://github.com/leandrosilva" target="_blank">GitHub</a> [que vergonhosamente não tinha nada desde outubro] para colocar os códigos dos meus estudos, mas até agora só subi uns poucos programinhas bem didáticos do <a href="http://www.erlang.org/doc/getting_started/part_frame.html" target="_blank">Getting Started Lento</a>. Vamos ver se logo arranjo um tempo para organizar a coisas por aqui e subir mais coisas legais. Fique de olho nele.</p>
<p>Mais uma, ainda no GitHub, é <a href="http://github.com/fnando/notes/tree/master/erlang" target="_blank">o projeto</a> que o <a href="http://simplesideias.com.br/" target="_blank">Nando Vieira</a> criou para publicar suas anotações da leitura do livro <a href="http://www.pragprog.com/titles/jaerlang/programming-erlang" target="_blank">Programming Erlang, Software for a concurrent world</a>, de ninguém menos que Joe Armstrong.</p>
<p>E para finalizar, não deixe de ler <a href="http://leandrosilva.com.br/2008/11/03/sim-programacao-funcional-e-relevante-hoje/" target="_blank">meu post</a> sobre <strong>programação funcional</strong>, se você quiser ter uma rápida introdução a esse assunto.</p>
<p>É isso ai, até mais!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/02/18/pontape-inicial-para-aprender-erlang/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
