<?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>Escalare - A louca jornada de um programador &#187; Programação</title>
	<atom:link href="http://gbenatti.net/blog/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://gbenatti.net/blog</link>
	<description>Um blog com a jornada deste que lhes fala no mundo da programação de dispositivos móveis, jogos e linguagens de programação.</description>
	<lastBuildDate>Mon, 19 Apr 2010 15:00:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Boo e Android</title>
		<link>http://gbenatti.net/blog/2010/04/boo-e-android/</link>
		<comments>http://gbenatti.net/blog/2010/04/boo-e-android/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 02:05:33 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[boo]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://gbenatti.net/blog/?p=87</guid>
		<description><![CDATA[Nas ultimas semanas, tenho trabalhado nas horas vagas no Boojay, com o intuito de programar para dispositivos com Android.
E os primeiros frutos apareceram, agora é possivel executar o que poderia ser considerado o Hello World do Android.



namespace net.gbenatti


&#160;


import android.app


import android.os


&#160;


class Main&#40;Activity&#41;:


&#160; &#160; override def onCreate&#40;savedInstance as Bundle&#41;:


&#160; &#160; &#160; &#160; super&#40;savedInstance&#41;


&#160; &#160; &#160; &#160; setContentView&#40;0&#215;7f030000&#41;



Na [...]]]></description>
			<content:encoded><![CDATA[<p>Nas ultimas semanas, tenho trabalhado nas horas vagas no <a href="http://github.com/bamboo/boojay">Boojay</a>, com o intuito de programar para dispositivos com Android.</p>
<p>E os primeiros frutos apareceram, agora é possivel executar o que poderia ser considerado o Hello World do Android.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">namespace net.<span class="me1">gbenatti</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> android.<span class="me1">app</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> android.<span class="kw3">os</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Main<span class="br0">&#40;</span>Activity<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; override <span class="kw1">def</span> onCreate<span class="br0">&#40;</span>savedInstance as Bundle<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span><span class="br0">&#40;</span>savedInstance<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setContentView<span class="br0">&#40;</span>0&#215;7f030000<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Na verdade esse código é meio diferente do original java, onde a constante hexadecimal é definida em uma classe, mas isso logo será resolvido.</p>
<p>Agora deixa eu voltar a assistir Fringe.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2010/04/boo-e-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curiosidades em Boo &#8211; Pipeline de compilação</title>
		<link>http://gbenatti.net/blog/2009/11/curiosidades-em-boo-pipeline-de-compilacao/</link>
		<comments>http://gbenatti.net/blog/2009/11/curiosidades-em-boo-pipeline-de-compilacao/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 14:53:51 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[boo]]></category>
		<category><![CDATA[truques]]></category>

		<guid isPermaLink="false">http://gbenatti.net/blog/?p=73</guid>
		<description><![CDATA[Como já comentei, Boo é uma linguagem que tem como uma das caracteristicas mais marcantes sua extensibilidade.
A extensibilidade se dá na forma de macros e atributos sintaticos que modificam o código gerado no momento da compilação, e também em mudanças no próprio compilador, através do conceito de pipelines de compilação.
Para se entender melhor, quando você [...]]]></description>
			<content:encoded><![CDATA[<p>Como já comentei, Boo é uma linguagem que tem como uma das caracteristicas mais marcantes sua extensibilidade.</p>
<p>A extensibilidade se dá na forma de macros e atributos sintaticos que modificam o código gerado no momento da compilação, e também em mudanças no próprio compilador, através do conceito de pipelines de compilação.<br />
Para se entender melhor, quando você usa o compilador booc, o mesmo executa uma série de passos, que começa com o parsing do arquivo, execução das analises semanticas, transformações na AST e por fim geração do assembly (exe ou dll). Isso é o que é conhecido como pipeline padão de compilação.<br />
O compilador booc já vem com várias outras pipelines definidas, e permite também que o programador defina outras.</p>
<p>Uma das pipelines bem interessantes que já vem com o compilador é a pipeline chamada boo, essa pipeline executa todo o processo de compilação normal, com todos os passos e todas as transformações que são aplicadas a AST e no final, invés de gerar um assembly, gera uma saida boo com todo o código que seria compilado para a criação do assembly.</p>
<p>Parece abstrato demais ? Vamos ao código então, o velho e bom Hello World.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&quot;Hello World&quot;</span></div>
</li>
</ol>
</div>
<p>Esse é um código mínimo em Boo que escreve a mensagem &#8220;Hello World&#8221; na tela, mas você pode se perguntar, esse não é um executavel .Net ? Cadê o static void Main&#8230; ?</p>
<p>Vamos usar a nossa nova conhecida, a pipeline boo, pra descobrir.  Salve o programa no arquivo hello.boo e rode:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">booc -p:boo hello.boo</div>
</li>
</ol>
</div>
<p>E você terá:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>System.<span class="me1">Runtime</span>.<span class="me1">CompilerServices</span>.<span class="me1">CompilerGlobalScopeAttribute</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">public final transient <span class="kw1">class</span> HelloModule<span class="br0">&#40;</span><span class="kw2">object</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private static <span class="kw1">def</span> Main<span class="br0">&#40;</span>argv as <span class="br0">&#40;</span><span class="kw3">string</span><span class="br0">&#41;</span><span class="br0">&#41;</span> as void:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; System.<span class="me1">Console</span>.<span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&#8216;Hello World&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw1">def</span> constructor<span class="br0">&#40;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>A saída mostra o código que seria compilado depois de todas as mágicas executadas pelo compilador.</p>
<p>Note o uso do parâmetro -p:boo, é ele que diz ao compilador pra usar a pipeline boo e não a padrão.</p>
<p>Um detalhe, a chamada a print virou um System.Console.WriteLine, porque print é uma macro que ao ser executada expande para a chamada equivalente WriteLine.</p>
<p>Isso é só uma pequena parte do que pode ser feito com as pipelines, de geração de código em outra linguagem, verificação de padrões de desenvolvimento, compilação em memória, code completing, as possibilidades são várias.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/11/curiosidades-em-boo-pipeline-de-compilacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truques em Scala &#8211; Extractors</title>
		<link>http://gbenatti.net/blog/2009/11/truques-em-scala-extractors/</link>
		<comments>http://gbenatti.net/blog/2009/11/truques-em-scala-extractors/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 14:41:46 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[truques]]></category>

		<guid isPermaLink="false">http://gbenatti.net/blog/?p=53</guid>
		<description><![CDATA[Scala muitas vezes me surpreende com a elegancia e integridade da linguagem. O que chamo aqui de integridade, é a forma como a linguagem combina vários conceitos de uma forma uniforme.
Uma das features interessantes de  Scala é que ela permite ao programador extrair informações de objetos usando pattern matching, por exemplo se você tiver o [...]]]></description>
			<content:encoded><![CDATA[<p>Scala muitas vezes me surpreende com a elegancia e integridade da linguagem. O que chamo aqui de integridade, é a forma como a linguagem combina vários conceitos de uma forma uniforme.</p>
<p>Uma das features interessantes de  Scala é que ela permite ao programador extrair informações de objetos usando pattern matching, por exemplo se você tiver o seguinte tipo chamado Email:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">case</span> <span class="kw1">class</span> Email<span class="br0">&#40;</span>name: <span class="kw3">String</span>, domain: <span class="kw3">String</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Seria possivel testar se um objeto é do tipo Email, e ao mesmo tempo retornar o name e domain com o seguinte código:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">unknownObject match <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> Email<span class="br0">&#40;</span>name, domain<span class="br0">&#41;</span> =&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; println<span class="br0">&#40;</span>name + <span class="st0">&quot; at &quot;</span> + domain<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> _ =&gt;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; println<span class="br0">&#40;</span><span class="st0">&quot;It&#8217;s not an email&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>No caso de unknownObject ser declarado como:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val unknownObject = Email<span class="br0">&#40;</span><span class="st0">&quot;georges&quot;</span>, <span class="st0">&quot;gbenatti.net&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>A saida seria <strong>&#8220;georges at gbenatti.net&#8221;</strong></p>
<p>Já se unknownObject fosse declarado como:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val unknownObject: Any = <span class="st0">&quot;georges@gbeatti.net&quot;</span></div>
</li>
</ol>
</div>
<p>A saida seria <strong>&#8220;It&#8217;s not an email&#8221;</strong></p>
<p>Mas não seria muito legal se fosse possivel fazer essa segunda opção funcionar ? Ai entra a elegância de Scala, você pode definir extractors que permitem que sejam extraidos dados de determinadas estruturas, sejam elas árvores, listas e até mesmo strings.</p>
<p>Um extractor é um objeto Scala que define um método unapply. A responsabilidade do unapply é fazer o matching de um valor e o separar em seus componentes, para o caso acima o extractor poderia ser definido assim:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">object EmailStr  <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> unapply<span class="br0">&#40;</span>str: <span class="kw3">String</span><span class="br0">&#41;</span>: Option<span class="br0">&#91;</span><span class="br0">&#40;</span><span class="kw3">String</span>, <span class="kw3">String</span><span class="br0">&#41;</span><span class="br0">&#93;</span> = <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; val parts = str <span class="kw3">split</span> <span class="st0">&quot;@&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parts.<span class="me1">length</span> == <span class="nu0">2</span><span class="br0">&#41;</span> Some<span class="br0">&#40;</span>parts<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>, parts<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">else</span> None</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Definido esse extractor poderiamos reescrever o match da seguinte forma:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">unknownObject match <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> Email<span class="br0">&#40;</span>name, domain<span class="br0">&#41;</span> =&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; println<span class="br0">&#40;</span>name + <span class="st0">&quot; at &quot;</span> + domain<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> EmailStr<span class="br0">&#40;</span>name, domain<span class="br0">&#41;</span> =&gt;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; println<span class="br0">&#40;</span>name + <span class="st0">&quot; at &quot;</span> + domain<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> _ =&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; println<span class="br0">&#40;</span><span class="st0">&quot;It&#8217;s not an email&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>E ele funcionaria tanto com objetos da classe Email quanto com strings no formato name@domain, ou seja, código final do usuário simples e elegante.</p>
<p>Até mais pp pessoal&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/11/truques-em-scala-extractors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truques em Scala &#8211; Structural Typing</title>
		<link>http://gbenatti.net/blog/2009/10/truques-em-scala/</link>
		<comments>http://gbenatti.net/blog/2009/10/truques-em-scala/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 22:06:43 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[boo]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[truques]]></category>

		<guid isPermaLink="false">http://escalare.wordpress.com/?p=22</guid>
		<description><![CDATA[As linguagens dinâmicas como Ruby e Python tem algumas capacidades bem interessantes, entre elas esta a possibilidade de passar um objeto para um método e desde que o objeto implemente os métodos necessários (ex: name, height), o método executará corretamente.
Já as linguagens estáticas normalmente não tem essa capacidade, algumas, como por exemplo Boo implementam essa [...]]]></description>
			<content:encoded><![CDATA[<p>As linguagens dinâmicas como Ruby e Python tem algumas capacidades bem interessantes, entre elas esta a possibilidade de passar um objeto para um método e desde que o objeto implemente os métodos necessários (ex: name, height), o método executará corretamente.</p>
<p>Já as linguagens estáticas normalmente não tem essa capacidade, algumas, como por exemplo Boo implementam essa possibilidade através de dispatch in runtime para os métodos que necessitam dessa caracteristica, já Scala tem uma solução bem elegante.</p>
<p>Por exemplo, digamos que você queira definir um método que espere um objeto que tenha as propriedades name e age, uma forma comumente usada em linguagens estáticas seria a seguinte:</p>
<p>Definir uma interface com os métodos que interessam:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">trait BasicProperties <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> name: <span class="kw3">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> age: Int</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>
Escrever as classes implementando BasicProperties e o método recebendo como parametro um objeto do tipo BasicProperties:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Pet<span class="br0">&#40;</span>val name: <span class="kw3">String</span>, val age: Int<span class="br0">&#41;</span> extends BasicProperties</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Person<span class="br0">&#40;</span>val name: <span class="kw3">String</span>, val age: Int<span class="br0">&#41;</span> extends BasicProperties</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> printProp<span class="br0">&#40;</span><span class="kw1">in</span>: BasicProperties<span class="br0">&#41;</span> =</div>
</li>
<li class="li2">
<div class="de2">&nbsp; println<span class="br0">&#40;</span><span class="kw1">in</span>.<span class="me1">name</span>+<span class="st0">&quot; is &quot;</span> + <span class="kw1">in</span>.<span class="me1">age</span> + <span class="st0">&quot; years old&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>
E então você poderia chamar o método assim:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">printProp<span class="br0">&#40;</span>new Pet<span class="br0">&#40;</span><span class="st0">&quot;Galfildo&quot;</span>, <span class="nu0">8</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">printProp<span class="br0">&#40;</span>new Person<span class="br0">&#40;</span><span class="st0">&quot;Maria&quot;</span>, <span class="nu0">18</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>
Se você tivesse uma classe tipo:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Antique<span class="br0">&#40;</span>val name: <span class="kw3">String</span>, val Age: Int, val cost: Int<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Você não poderia usar um objeto desse tipo como parametro para printProp, já que a classe não herda BasicProperties.</p>
<p>A solução está na capacidade que Scala tem de definir algo que poderia ser chamado de anonymous interfaces, no caso, o método printProp seria escrito assim:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">def</span> printProp<span class="br0">&#40;</span><span class="kw1">in</span>: <span class="br0">&#123;</span><span class="kw1">def</span> name: <span class="kw3">String</span>; <span class="kw1">def</span> age: Int<span class="br0">&#125;</span><span class="br0">&#41;</span> =</div>
</li>
<li class="li1">
<div class="de1">&nbsp; println<span class="br0">&#40;</span><span class="kw1">in</span>.<span class="me1">name</span>+<span class="st0">&quot; is &quot;</span> + <span class="kw1">in</span>.<span class="me1">age</span> + <span class="st0">&quot; years old&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>
Como se você estivesse definindo como parametro um tipo anonimo, que tem um método name do tipo String e um método age do tipo Int</p>
<p>E então poderia executar:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">printProp<span class="br0">&#40;</span>new Pet<span class="br0">&#40;</span><span class="st0">&quot;Galfildo&quot;</span>, <span class="nu0">8</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">printProp<span class="br0">&#40;</span>new Person<span class="br0">&#40;</span><span class="st0">&quot;Maria&quot;</span>, <span class="nu0">18</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">printProp<span class="br0">&#40;</span>new Antique<span class="br0">&#40;</span><span class="st0">&quot;Monalisa&quot;</span>, <span class="nu0">450</span>, <span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>
Como se ve, um código muito parecido com o escrito em Ruby e Python, mais ainda com uma caracteristica de documentação, já que o método é explicito sobre o que ele necessita.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/10/truques-em-scala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truques em Scala &#8211; Como fazer parsing de um xml</title>
		<link>http://gbenatti.net/blog/2009/10/truques-em-scala-como-fazer-parsing-de-um-xml/</link>
		<comments>http://gbenatti.net/blog/2009/10/truques-em-scala-como-fazer-parsing-de-um-xml/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 16:35:00 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[truques]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://escalare.wordpress.com/2009/10/27/truques-em-scala-como-fazer-parsing-de-um-xml</guid>
		<description><![CDATA[Ontem eu precisei extrair alguns dados de um xml, e acho que as lições aprendidas merecem ficar registradas, vai que mais alguem nesse mundão precisa fazer algo assim.



&#60;request service=&#34;Service 1&#34;&#62;


&#160; &#60;extra&#62;


&#160; &#160; &#60;entry key=&#34;key1&#34;&#62;value1&#60;/entry&#62;


&#160; &#160; &#60;entry key=&#34;key2&#34;&#62;value2&#60;/entry&#62;


&#160; &#60;/extra&#62;


&#60;/request&#62;



O objetivo era extrair o nome do service como uma string e as entries como um map de [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem eu precisei extrair alguns dados de um xml, e acho que as lições aprendidas merecem ficar registradas, vai que mais alguem nesse mundão precisa fazer algo assim.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;request</span> <span class="re0">service</span>=<span class="st0">&quot;Service 1&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;extra<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;entry</span> <span class="re0">key</span>=<span class="st0">&quot;key1&quot;</span><span class="re2">&gt;</span></span>value1<span class="sc3"><span class="re1">&lt;/entry<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;entry</span> <span class="re0">key</span>=<span class="st0">&quot;key2&quot;</span><span class="re2">&gt;</span></span>value2<span class="sc3"><span class="re1">&lt;/entry<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="sc3"><span class="re1">&lt;/extra<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/request<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>O objetivo era extrair o nome do service como uma string e as entries como um map de key values.</p>
<p>O servico como string é bem facil, considerando que o xml esta em uma variavel serviceXml, teriamos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val serviceName = <span class="br0">&#40;</span>serviceXml\<span class="st0">&quot;@service&quot;</span><span class="br0">&#41;</span>.<span class="me1">text</span></div>
</li>
</ol>
</div>
<p>O que isso faz é basicamente pegar o attributo service do nó em questão e com esse dado pegar o nó como text.</p>
<p>A segunda parte é um pouco mais complexa então vamos por parte, primeiro pegamos as entries:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val entries = serviceXml\<span class="st0">&quot;extra&quot;</span>\\<span class="st0">&quot;entry&quot;</span></div>
</li>
</ol>
</div>
<p>Esse codigo executa basicamente um XPath extraindo do xml o nó &#8220;extra&#8221; e deste a lista de nós &#8220;entry&#8221;</p>
<p>Então, para cada entry extraimos uma tupla com o valor da key e o value:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val entriesTuple = <span class="kw1">for</span> <span class="br0">&#40;</span>entry &lt;- entries<span class="br0">&#41;</span> <span class="kw1">yield</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>entry\<span class="st0">&quot;@key&quot;</span><span class="br0">&#41;</span>.<span class="me1">text</span>, entry.<span class="me1">text</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Aqui usamos um for expression para percorrer a lista entries e retornar (usando yield) uma tupla que contem o valor da key e o inner text da entry</p>
<p>E por fim criar um Map com esses dados:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val mapResult = Map<span class="br0">&#40;</span>entriesTuple: _*<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Por fim, como construir um Map apartir de uma lista, ou nesse caso de um generator ?</p>
<p>Maps podem ser contruidos usando de um numero variavel de tuplas usando algo como Map(tupla1, tupla2, tuplaN).</p>
<p>Se tentarmos usar Map(entriesTuple) o compilador vai reclamar falando que esse metodo nao pode ser executado com uma Seq[(String, String)], ou seja, uma sequencia de tuplas contendo duas Strings.</p>
<p>Temos que dar um jeito de passar essa Seq como um numero variavel de argumentos, e os desenvolvedores de Scala nos deram uma forma de fazer isso, quando temos que passar uma lista para um método que espera um número variavel de argumentos podemos fazer assim:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Map<span class="br0">&#40;</span>entriesTuples: _*<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Essa anotação diz ao compilador para expandir os parametros</p>
<p>Juntando tudo temos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">val mapResult = Map<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">for</span> <span class="br0">&#40;</span>entry &lt;- serviceXml\<span class="st0">&quot;extra&quot;</span>\\<span class="st0">&quot;entry&quot;</span><span class="br0">&#41;</span> <span class="kw1">yield</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>entry\<span class="st0">&quot;@key&quot;</span><span class="br0">&#41;</span>.<span class="me1">text</span>, entry.<span class="me1">text</span><span class="br0">&#41;</span><span class="br0">&#41;</span>: _*<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Muita explicação pra pouco código, assim é Scala</p>
<p>Cheers</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/10/truques-em-scala-como-fazer-parsing-de-um-xml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando Scala</title>
		<link>http://gbenatti.net/blog/2009/09/instalando-scala/</link>
		<comments>http://gbenatti.net/blog/2009/09/instalando-scala/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 01:18:00 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://escalare.wordpress.com/2009/09/10/instalando-scala</guid>
		<description><![CDATA[Para instalar Scala no Mac OS X, baixe o instalador do seguinte link:
http://www.scala-lang.org/downloads/distrib/files/scala-2.7.5.final-installer.jar
Esse link é pra versão 2.7.5 da linguagem.
Execute o instalador, entrando no terminal, vá até o diretório onde se encontra o instalador e digite:
sudo java -jar scala-2.7.5.final-installer.jar
Escolha a linguagem de sua preferência e o local de instalação. No meu caso eu vou aceitar [...]]]></description>
			<content:encoded><![CDATA[<p>Para instalar Scala no Mac OS X, baixe o instalador do seguinte link:</p>
<p><a href="http://www.scala-lang.org/downloads/distrib/files/scala-2.7.5.final-installer.jar">http://www.scala-lang.org/downloads/distrib/files/scala-2.7.5.final-installer.jar</a></p>
<p>Esse link é pra versão 2.7.5 da linguagem.</p>
<p>Execute o instalador, entrando no terminal, vá até o diretório onde se encontra o instalador e digite:</p>
<p>sudo java -jar scala-2.7.5.final-installer.jar</p>
<p>Escolha a linguagem de sua preferência e o local de instalação. No meu caso eu vou aceitar as opções Inglês e /usr/local/</p>
<p>Depois de terminada a instalação, adicione o path de instalação as variáveis de ambiente, edite o arquivo .profile no seu diretório HOME, e adicionar a seguinte linha:</p>
<p>export PATH=/usr/local/scala-2.7.5.final/bin:$PATH</p>
<p>Onde /usr/local/scala-2.7.5.final é o local onde o compilador foi instalado.</p>
<p>Para testar a instalação, feche o terminal e o abra novamente, digite scala -version e você deve ver a mensagem:</p>
<p>Scala code runner version 2.7.5.final &#8212; Copyright 2002-2009, LAMP/EPFL</p>
<p>É isso ai, até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/09/instalando-scala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como programar para Android no Mac OS X</title>
		<link>http://gbenatti.net/blog/2009/09/como-programar-para-android-no-mac-os-x-2/</link>
		<comments>http://gbenatti.net/blog/2009/09/como-programar-para-android-no-mac-os-x-2/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 16:07:00 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://escalare.wordpress.com/2009/09/01/como-programar-para-android-no-mac-os-x-2</guid>
		<description><![CDATA[Para desenvolver para Android você necessita ter instalado o Java, algum IDE e o Android SDK.
Java
Você necessita de uma versão do java instalado, o JDK 5 ou 6 por exemplo. A instalação apenas do runtime, conhecido como JRE não é suficiente, você precisa do development kit completo, eu recomendo a instalação do JDK 6.
IDE
Você precisa [...]]]></description>
			<content:encoded><![CDATA[<p>Para desenvolver para Android você necessita ter instalado o Java, algum IDE e o Android SDK.</p>
<p><b>Java</b></p>
<p>Você necessita de uma versão do <a href="http://java.sun.com/javase/downloads">java</a> instalado, o JDK 5 ou 6 por exemplo. A instalação apenas do runtime, conhecido como JRE não é suficiente, você precisa do development kit completo, eu recomendo a instalação do JDK 6.</p>
<p><b>IDE</b></p>
<p>Você precisa ter instalado também um IDE para desenvolvimento Java. Eclipse, Netbeans, Idea, todos eles tem suporte pare desenvolvimento Android. Nos meus testes tenho usado o <a href="http://www.netbeans.org/downloads/index.html">Netbeans (versão 6.7 ou maior)</a> e o <a href="http://www.eclipse.org/downloads">Eclipse (versão 3.3.1 ou maior)</a>, os dois tem prós e contras, acho o Netbeans mais estavel, mas o Eclipse tem algumas features a mais.</p>
<p><b>Android SDK</b></p>
<p>Depois, faça o download do Android SDK, a versão para download na página do projeto atualmente é a <a href="http://developer.android.com/sdk/1.5_r3/index.html">1.5 r3</a>. Faça o download e instale o SDK, esse será o seu <i>SDK install directory</i>, anote em algum lugar o path completo para esse diretório, pois o mesmo será usado no futuro.</p>
<p><b>Plugin de desenvolvimento</b></p>
<p>Para poder trabalhar com o desenvolvimento para android com o IDE que você escolheu será necessario a instalação de um plugin. Abaixo descrevo como instalar os plugin para Eclipse e para Netbeans.</p>
<p>Para instalar o plugin no Eclipse:</p>
<p>1 &#8211; Inicie o Eclipse, e selecione a opção de menu Help &gt; Software Updates&#8230;<br />2 &#8211; Clique a aba Avaiable Software<br />3 &#8211; Clique o botão Add Site&#8230;<br />4 &#8211; Entre o endereço do site de update do Android: https://dl-ssl.google.com/android/eclipse/</p>
<p>Clique o Ok</p>
<p>5 &#8211; O site de update do Android deve aparecer na lista de Avaiable Software. Selecione o checkbox ao lado do mesmo e então clique Install&#8230;<br />6 &#8211; Clique Finish para iniciar o processo de download e instalação.<br />7 &#8211; Assim que a instalação terminar, reinicie o Eclipse.<br />8 &#8211; Quando o Eclipse abrir novamente, será necessário configurar onde o Android SDK está instalado. Selecione o menu Eclipse &gt; Preferences &gt; Android, e entre o diretório de instalação que você anotou no começo. Clique Ok.</p>
<p>Bem, se tudo deu sorte e os Deuses do java permirtirem, você poderá começar a criação do seu tão sonhado software para Android.</p>
<p>Para instalar o plugin do Netbeans</p>
<p>1 &#8211; Inicie o Netbeans e selecione a opção de menu Tools &gt; Plugins<br />2 &#8211; Clique na aba Settings<br />3 &#8211; Clique no botão Add<br />4 &#8211; Entre um nome, por exemplo nbandroid e o endereço do update center do plugin  http://kenai.com/downloads/nbandroid/updates.xml</p>
<p>Clique o Ok</p>
<p>5 &#8211; Na aba Available plugins entre nbandroid, ou o nome que vc escolheu no campo de busca, selecione o checkbox ao lado do ite encontrado e clique Install&#8230;<br />6 &#8211; Clique Next, aceite a licença, clique em continue (ignore os avisos sobre &#8216;unsigned plugins&#8217;) e voilá.</p>
<p>Você agora pode usar todos seus Skills de Netbeans no desenvolvimento para Android.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/09/como-programar-para-android-no-mac-os-x-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O mundo de Android</title>
		<link>http://gbenatti.net/blog/2009/08/o-mundo-de-android-2/</link>
		<comments>http://gbenatti.net/blog/2009/08/o-mundo-de-android-2/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 13:22:00 +0000</pubDate>
		<dc:creator>gbenatti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://escalare.wordpress.com/2009/08/31/o-mundo-de-android-2</guid>
		<description><![CDATA[Começei a brincar nos ultimos dias com a plataforma Android. E gostei da forma como certas coisas são feitas no sistema, como a idéia de Activities e Intents, o fato de você poder executar o programa direto no aparelho, sem a necessidade de certificados, provisioning profiles e todas esses detalhes comuns no IPhone.
Espero escrever logo [...]]]></description>
			<content:encoded><![CDATA[<p>Começei a brincar nos ultimos dias com a plataforma Android. E gostei da forma como certas coisas são feitas no sistema, como a idéia de Activities e Intents, o fato de você poder executar o programa direto no aparelho, sem a necessidade de certificados, provisioning profiles e todas esses detalhes comuns no IPhone.</p>
<p>Espero escrever logo algumas impressoes sobre a programação para Android versus a programação IPhone.</p>
]]></content:encoded>
			<wfw:commentRss>http://gbenatti.net/blog/2009/08/o-mundo-de-android-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
