<?xml version="1.0" encoding="ISO-8859-1"?>
<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>Geek Vault &#187; Programação</title>
	<atom:link href="http://www.geekvault.org/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geekvault.org</link>
	<description>Because geeks, like to talk.</description>
	<lastBuildDate>Fri, 16 Jul 2010 12:47:14 +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>Autotools e CUDA</title>
		<link>http://www.geekvault.org/2010/06/autotools-e-cuda/</link>
		<comments>http://www.geekvault.org/2010/06/autotools-e-cuda/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 01:32:44 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[autoconf]]></category>
		<category><![CDATA[autoheader]]></category>
		<category><![CDATA[automake]]></category>
		<category><![CDATA[autotools]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CUDA]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=533</guid>
		<description><![CDATA[Quem gosta de CUDA e Linux, sabe que não existe (a não ser que você procure na internet) suporte para CUDA nas autotools. Bom, eu procurei a um bom tempo atrás e criei um template para iniciar todos os meus projetos de CUDA e agora, não apenas estou liberando ele como um template, mas também [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fautotools-e-cuda%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fautotools-e-cuda%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Quem gosta de CUDA e Linux, sabe que não existe (a não ser que você procure na internet) suporte para CUDA nas autotools. Bom, eu procurei a um bom tempo atrás e criei um template para iniciar todos os meus projetos de CUDA e agora, não apenas estou liberando ele como um template, mas também estou criando um <a href="http://trac.geekvault.org/cuda/" target="_blank">repositório</a> completo sobre CUDA no meu SVN onde obviamente esse é o primeiro projeto.<br />
Sem demoras, é possível efetuar o download e entender um pouco mais do projeto na <a href="http://trac.geekvault.org/cuda/wiki/autotools" target="_blank">página do projeto</a>.<br />
PS: Saiu a versão 3.1 com suporte a printf() em interfaces Fermin <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/06/autotools-e-cuda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Jogo da Vida e a primeira criatura auto-replicante.</title>
		<link>http://www.geekvault.org/2010/06/o-jogo-da-vida-e-a-primeira-criatura-auto-replicante/</link>
		<comments>http://www.geekvault.org/2010/06/o-jogo-da-vida-e-a-primeira-criatura-auto-replicante/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 13:06:57 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[ACs]]></category>
		<category><![CDATA[Novidades]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=522</guid>
		<description><![CDATA[Para quem não sabe, eu sou apaixonado por Autômatos Celulares (AC) e um AC famoso é o chamado Jogo da Vida (Game of Life, GOL) que apresenta computação universal de acordo com a configuração incial do seu reticulado (sei que parece &#8220;meio&#8221; sci-fi, mas ainda vou preparar um tutorialzinho em ACs, BEM básico). Enfim, qual [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fo-jogo-da-vida-e-a-primeira-criatura-auto-replicante%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fo-jogo-da-vida-e-a-primeira-criatura-auto-replicante%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Para quem não sabe, eu sou apaixonado por Autômatos Celulares (AC) e um AC famoso é o chamado Jogo da Vida (Game of Life, GOL) que apresenta computação universal de acordo com a configuração incial do seu reticulado (sei que parece &#8220;meio&#8221; sci-fi, mas ainda vou preparar um tutorialzinho em ACs, BEM básico). Enfim, qual a sacada do que vou falar, uma das coisas de ACs é a idéia principal que Von Neumann teve, de criar máquinas que se auto-replicam, pois bem, nunca haviam conseguindo, agora <a href="http://www.newscientist.com/article/mg20627653.800-first-replicating-creature-spawned-in-life-simulator.html" target="_blank">conseguiram</a> <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ainda não tive tempo de estudar como ele funciona, mas está na task list <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/06/o-jogo-da-vida-e-a-primeira-criatura-auto-replicante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Números aleatórios em C</title>
		<link>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/</link>
		<comments>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 22:09:55 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[stuff]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=486</guid>
		<description><![CDATA[Bom, todos nós sabemos que rand() nos retorna uma distribuição uniforme de números aleatórios, na realidade praticamente todos os geradores de números aleatórios nos retorna uma distribuição uniforme, o problema é como utilizamos. Procurando sobre isso, encontrei esse artigo que explica o motivo do &#8220;erro&#8221; de utilização e como corrigir o mesmo. Enquanto ele não [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F02%2Fnumeros-aleatorios-em-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F02%2Fnumeros-aleatorios-em-c%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, todos nós sabemos que rand() nos retorna uma distribuição uniforme de números aleatórios, na realidade praticamente todos os geradores de números aleatórios nos retorna uma distribuição uniforme, o problema é como utilizamos. Procurando sobre isso, encontrei <a href="http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx" target="_blank">esse</a> artigo que explica o motivo do &#8220;erro&#8221; de utilização e como corrigir o mesmo.<br />
Enquanto ele não resolve o problema para geração de números aleatórios em paralelo (minha mais nova paixão), ele dá boas dicas de como solucionar isso, e provavelmente como solucionar também em paralelismo (já que o problema está na utilização e não no algorítmo).<br />
Vale a pena dar uma lida, esse é um assunto muito importante para todos, principalmente para quem ainda gera os números dessa forma:</p>
<blockquote><p>
srand(time(NULL));<br />
int num = rand()%max;
</p></blockquote>
<p> <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CUDA: Supercomputadores em seu desktop</title>
		<link>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/</link>
		<comments>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 14:12:15 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[CUDA]]></category>
		<category><![CDATA[introdução]]></category>
		<category><![CDATA[paralelismo]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=481</guid>
		<description><![CDATA[Quem já programou em clusters (ou até mesmo utilizando paralelismo) sabe das enormes vantagens que o paralelismo pode trazer. O que poucas pessoas sabem é que você pode ter tudo isso na sua casa, programando em sua placa de vídeo nVidia utilizando CUDA, uma arquitetura de programação paralela genérica, disponibilizada Free pela nVidia. Diferente de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F01%2Fcuda-supercomputadores-em-seu-desktop%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F01%2Fcuda-supercomputadores-em-seu-desktop%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Quem já programou em clusters (ou até mesmo utilizando paralelismo) sabe das enormes vantagens que o paralelismo pode trazer. O que poucas pessoas sabem é que você pode ter tudo isso na sua casa, programando em sua placa de vídeo nVidia utilizando CUDA, uma arquitetura de programação paralela genérica, disponibilizada Free pela nVidia.<br />
Diferente de várias formas de programação paralela, as placas da nVidia utilizam muito mais transistores para para processamento de dados no lugar de memória, dessa forma temos o chamado SIMT(Single Instruction Multiple Threads), não vou explicar exatamente como o CUDA faz ou até mesmo como programar para CUDA agora (mais tarde sem dúvida vou colocar algum código bem explicado, mas o tempo está cada vez mais escasso). Basta falar que em uma GeForce 8500GT temos 16 cores separados em 2 processadores, e uma GTX280 conta com 280 cores, o que a nVidia fez que é extremamente elegante, foi separar o número de threads possíves pela quantidade de memória a ser processada, e não pela quantidade de processadores, dessa forma você tem uma escalabilidade praticamente perfeita.<br />
Explicando um pouco melhor isso, para rodar algo em uma GPU utilizando CUDA você precisa criar um Grid de execução, cada Grid possui um conjunto de Blocks (blocos de threads) e cada Block possui um número <em>n</em> de threads que é ditado pela quantidade de dados a ser processado. Mais interessante ainda é que cada bloco de thread possui um espaço de memória do tipo <em>shared </em>(compartilhada) que é extremamente rápida, porém apenas as threads daquele bloco podem acessar esse espaço de memória. Além disso existe a memória do tipo global, que fica toda na GPU e qualquer thread (ou bloco) pode acessar, e outros tipos (constant, register, local e texture).<br />
Bom, esse não é nem o básico sobre CUDA, é apenas um texto para dar um gostinho de quero mais. Um pequeno teste que fiz foi portar o algoritmo de ordenação <a href="http://en.wikipedia.org/wiki/Bitonic_sorter" target="_blank">Bitonic Sort</a> para CUDA (código retirado dessa <a href="http://forums.nvidia.com/index.php?showtopic=84651&amp;hl=Bitonic" target="_blank">thread</a> do <a href="http://forums.nvidia.com/index.php?showforum=62" target="_blank">Forum da nVidia</a>), e comparar a versão sem paralelismo com a versão do CUDA, pois bem, o programa faz isso:</p>
<ol>
<li>Cria um array de 2^25 números = 33.554.432</li>
<li>Copia a memória para a GPU (apnas na versão CUDA)</li>
<li>Popula o array com o indíce invertido (array[0]=33554432, &#8230;, array[33554432]=0)</li>
<li>Ordena utilizando o algoritmo Bitonic Sort</li>
<li>Copia de GPU para a memória local de volta (apenas na versão CUDA)</li>
<li>Valida os dados</li>
</ol>
<p>na versão simples (sem paralelismo) tudo isso demorou em média 4 minutos e meio para executar, na versão CUDA demorou 0.3 segundos em uma GeForce 8500GT. Isso convence do poder do CUDA?</p>
<p>Para saber mais:</p>
<p><a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAkQFjAA&amp;url=http%3A%2F%2Fwww.nvidia.com%2Fobject%2Fcuda_home.html&amp;ei=CTFLS97iLcjRlAefwKGKDQ&amp;usg=AFQjCNG1zNZv61fSdyiINfawS6rkA6z5xw&amp;sig2=3de3ZGegXoVKeF9Zq3Rpag" target="_blank">CUDA Zone</a>: Site oficial com uma extensa documentação sobre o CUDA<br />
<a href="http://www.ddj.com/architect/207200659" target="_blank">Dr.Dobbs</a>: Tutorial fantástico sobre CUDA</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nova especificação do C++ adiada para 2010</title>
		<link>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/</link>
		<comments>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:22:53 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=391</guid>
		<description><![CDATA[De acordo com essa notícia do Slashdot, a nova especificação do C++ (C++0X) será adiada para 2010 ou depois. O motivo é a sua mudança principal chamada &#8220;concepts&#8221;, que visam deixar os templates mais robustos. Honestamente eu não vi muito de C++ ainda para discutir a fundo templates, herança, polimorfismo, ou qualquer outra coisa, mas [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F07%2Fnova-especificacao-do-c-adiada-para-2010%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F07%2Fnova-especificacao-do-c-adiada-para-2010%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>De acordo com <a href="http://tech.slashdot.org/story/09/07/23/1817225/Stroustrup-Says-New-C-Standard-Delayed-Until-2010-Or-Later" target="_blank">essa</a> notícia do <a href="http://slashdot.org" target="_self">Slashdot</a>, a nova especificação do C++ (C++0X) será adiada para 2010 ou depois. O motivo é a sua mudança principal chamada &#8220;concepts&#8221;, que visam deixar os templates mais robustos. Honestamente eu não vi muito de C++ ainda para discutir a fundo templates, herança, polimorfismo, ou qualquer outra coisa, mas uma nova especificação sempre é bem vinda (quando bem feita, que aparentemente é o caso), e pelo que li sobre &#8220;concepts&#8221; realmente é uma coisa bem complexa, que esta sendo desenvolvida a mais de 7 anos e ainda não está pronta. Como ela será o motivo principal do atraso, ela será retirada e a nova especificação irá se focar em outras coisas (como paralelismo por exemplo).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando N95 para jogar no Blender</title>
		<link>http://www.geekvault.org/2009/06/utilizando-n95-para-jogar-no-blender/</link>
		<comments>http://www.geekvault.org/2009/06/utilizando-n95-para-jogar-no-blender/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 17:08:17 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=357</guid>
		<description><![CDATA[Pois bem, parece que um italiano sem muito o que fazer resolveu fazer um cliente/servidor entre seu Nokia N95 e o Blender (em Python) e conseguiu fazer o acelerômetro do N95 ser utilizado como joystick para jogos no Blender. Parabéns Veja aqui.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Futilizando-n95-para-jogar-no-blender%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Futilizando-n95-para-jogar-no-blender%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Pois bem, parece que um italiano sem muito o que fazer resolveu fazer um cliente/servidor entre seu Nokia N95 e o Blender (em Python) e conseguiu fazer o acelerômetro do N95 ser utilizado como joystick para jogos no Blender. Parabéns <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Veja <a href="http://www.blendernation.com/2009/06/12/nokia-n95-accelerometer-in-blender/" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/utilizando-n95-para-jogar-no-blender/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3dMagix ou Blender&#8230;</title>
		<link>http://www.geekvault.org/2009/06/3dmagix-ou-blender/</link>
		<comments>http://www.geekvault.org/2009/06/3dmagix-ou-blender/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 16:40:34 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[3dMagix]]></category>
		<category><![CDATA[Blender]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[leis]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=355</guid>
		<description><![CDATA[Se você tem a opção de um software free, ou pago, o que você pega? E se os softwares forem o mesmo, porém com outro nome? Pois é isso que a 3DMagix fez, pegou o Blender, mudou de nome, e vende por 47$. Isso pode não ser ilegal já que o Blender está na GPL, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2F3dmagix-ou-blender%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2F3dmagix-ou-blender%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Se você tem a opção de um software free, ou pago, o que você pega? E se os softwares forem o mesmo, porém com outro nome?<br />
Pois é isso que a <a href="http://www.3dmagix.com/index2.html" target="_blank">3DMagix</a> fez, pegou o <a href="http://www.blender.org/" target="_blank">Blender</a>, mudou de nome, e vende por 47$. Isso pode não ser ilegal já que o <a href="http://www.blender.org/" target="_self">Blender</a> está na GPL, mas ela deve falar de onde tirou e dar os crédito corretos. Eu não paguei 47$ para ver isso. E honestamente, entre pagar uma empresa e doar, eu prefiro doar à fundação Blender.<br />
<a href="http://www.blendernation.com/2009/06/11/3dmagix-re-branding-and-selling-the-free-software-blender/" target="_blank">Fonte</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/3dmagix-ou-blender/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Observers em C++</title>
		<link>http://www.geekvault.org/2009/06/observers-em-c/</link>
		<comments>http://www.geekvault.org/2009/06/observers-em-c/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 14:47:49 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[padrões]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=349</guid>
		<description><![CDATA[Observers são um patrão de design muito utilizado, principalmente quando você quer que camadas superiores do seu software saibam o que aconteceu nas camadas inferiores. O Ogre usa isso para renderizar Frames por exemplo, utilizando FrameListener. Pois bem, curioso como sou resolvi ir um pouco mais a fundo e ver como se faz isso na [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fobservers-em-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fobservers-em-c%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Observers são um patrão de design muito utilizado, principalmente quando você quer que camadas superiores do seu software saibam o que aconteceu nas camadas inferiores. O Ogre usa isso para renderizar Frames por exemplo, utilizando FrameListener. Pois bem, curioso como sou resolvi ir um pouco mais a fundo e ver como se faz isso na unha em C++, descobrindo o quão simples isso é, os passos são esses:</p>
<ol>
<li>Criar uma simples interface com um método que será chamado a toda atualização</li>
<li>Criar um objeto singleton que pode ser observado, adicionando as interfaces em uma lista (ou pilha, whatever), que irá chamar o método de atualização de todos as interface quando obtiver uma mudança</li>
<li>Criar um objeto que implementa sua interface.</li>
<li>A cada atualização, notificar todas as interfaces.</li>
</ol>
<p><span id="more-349"></span></p>
<p>O código mostrado aqui (apenas trechos) está disponível via svn em:</p>
<blockquote><p>http://svn.geekvault.org/cpp/ObserverExample</p></blockquote>
<p>Parece mais complexo do que realmente é, a mágica toda está em básicamente dois métodos (e obviamente na organização de listener mostrada):</p>
<ul>
<li>InputListener::notify()</li>
<li>Listener::notify()</li>
</ul>
<p>O nome dos métodos pode variar, mas a idéia básica é que cada objeto que implementar a interface Listener, será obrigado a implementar o método notify(), que será chamado pelo Singleton InputListener.<br />
Vamos ao código:</p>
<p><strong>InputListener::notify(void)</strong></p>
<p><code> std::set&lt;Listener*&gt;::iterator itr;<br />
for( itr = listeners.begin(); itr != listeners.end(); ++itr)<br />
(*itr)-&gt;notify();</code></p>
<p><strong>InputFilter::notify()</strong><br />
<code><br />
unsigned int qtdChars = 0;<br />
if(&amp;m_sInput!=NULL)<br />
{<br />
std::cout &lt;&lt; "We have the string: " &lt;&lt; m_sInput-&gt;c_str() &lt;&lt; std::endl;<br />
std::cout &lt;&lt; "That is " &lt;&lt; m_sInput-&gt;size() &lt;&lt; " chars wide\n";<br />
for(unsigned int i = 0; i &lt; m_sInput-&gt;size(); i++)<br />
{<br />
if((*m_sInput)[i]=='a') qtdChars++;<br />
}<br />
std::cout &lt;&lt; "And we found " &lt;&lt; qtdChars &lt;&lt; " of the 'a' character\n";<br />
}</code></p>
<p>InputFilter é uma classe que implementa a &#8220;complexa&#8221; interface Listener:</p>
<p><code>class Listener<br />
{<br />
public:<br />
virtual void notify() = 0;<br />
};</code></p>
<p>Onde InputFilter será definida como (no nosso caso):<br />
<code>class InputFilter : public Listener<br />
{<br />
public:<br />
InputFilter();<br />
~InputFilter();<br />
void addString(std::string&amp; str);<br />
private:<br />
void notify();<br />
InputListener* input;<br />
std::string *m_sInput;<br />
};</code></p>
<p>E sua utilização (também chamada como main())</p>
<p><code>int main(void)<br />
{<br />
string str;<br />
InputFilter* filter = new InputFilter();<br />
do<br />
{<br />
cout &lt;&lt; "Please type something:";<br />
getline(cin,str);filter-&gt;addString(str);<br />
InputListener::getInstance()-&gt;notify();<br />
}while(str.compare("quit")!=0);<br />
return 0;<br />
}</code></p>
<p>Acreditem, não fica mais complexo do que isso. A grande sacada de Listener (ou Observers, é a mesma coisa) é que você pode criar um Singleton e não se preocupar em avisar várias classes sobre sua atualização, faça-as implementares a interface Listener, e apenas as adicione no Listener criado, quando você quiser atualizar todos, chame o método de atualização do Listener, simples assim.</p>
<p>Have fun.</p>
<p>Zarnick</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/observers-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ogre, aos poucos&#8230;Menu 3D!</title>
		<link>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/</link>
		<comments>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 12:12:14 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Ogre]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[projetos]]></category>
		<category><![CDATA[Trechos]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=339</guid>
		<description><![CDATA[Bom, eu sei que faz tempo que não aparecem trechos de códigos por aqui, culpe a falta de tempo. Mas nada são más notícias, eu tenho um trecho aqui de um Menu 3D, com alfabeto e tudo mais Ainda estou trabalhando na documentação, mas se você possui Linux e OGRE, pode brincar um pouco já, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fogre-aos-poucosmenu-3d%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fogre-aos-poucosmenu-3d%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, eu sei que faz tempo que não aparecem trechos de códigos por aqui, culpe a falta de tempo.<br />
Mas nada são más notícias, eu tenho um trecho aqui de um Menu 3D, com alfabeto e tudo mais <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ainda estou trabalhando na documentação, mas se você possui Linux e OGRE, pode brincar um pouco já, a idéia é bem básica, existem um Zip com os .mesh representando o alfabeto (por falta de vocação em 3D e vontade, temos apenas de A-Z e 0-9), criei (estou aperfeiçoando) uma classe para cuidar de mostrar o alfabeto em um ambiente 3D e, uma classe de Menu, que utiliza esse alfabeto e umas animações bem básicas mesmo.<br />
Esse projeto eu vou fazer um pouco diferente, vou trabalhar no mesmo até conseguir entregar um binário de exemplo para Linux e Windows e, fazer com que esse binário rode em qualquer um desses SOs, com ou sem Ogre instalado.<br />
Para ver como está indo, o link do SVN é:</p>
<blockquote><p>http://svn.geekvault.org/ogre/MenuFramework</p></blockquote>
<p>Abraços, e até a próxima.<br />
Zarnick</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Falta de tempo e projetos com deadline</title>
		<link>http://www.geekvault.org/2009/05/falta-de-tempo-e-projetos-com-deadline/</link>
		<comments>http://www.geekvault.org/2009/05/falta-de-tempo-e-projetos-com-deadline/#comments</comments>
		<pubDate>Fri, 15 May 2009 11:07:36 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estudos]]></category>
		<category><![CDATA[tempo]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=320</guid>
		<description><![CDATA[É incrível o que a falta de tempo causa em projetos com &#8220;deadline&#8221;, acredito que deve fazer mais ou menos 1 mês que não consigo dormir direito por causa de um projeto no trabalho que está me obrigando a estudar J2ME, dai vem a constante falta de posts. Sim, eu sei que prometi Agentes Autônomos, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F05%2Ffalta-de-tempo-e-projetos-com-deadline%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F05%2Ffalta-de-tempo-e-projetos-com-deadline%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>É incrível o que a falta de tempo causa em projetos com &#8220;deadline&#8221;, acredito que deve fazer mais ou menos 1 mês que não consigo dormir direito por causa de um projeto no trabalho que está me obrigando a estudar J2ME, dai vem a constante falta de posts. Sim, eu sei que prometi Agentes Autônomos, mas tive que parar o desenvolvimento dos mesmos para estudar essa &lt;sarcasmo on&gt;&#8221;maravilha&#8221;&lt;/sarcasmo on&gt; chamada J2ME.<br />
Obviamente não escrevi isso apenas para me desculpar, vou deixar algumas dicas sobre J2ME:</p>
<ol>
<li>Lembre-se, cada celular implementa o J2ME como ele quiser, mas se você ficar nas coisas básicas (Forms, Canvas, etc), existe uma grande chance de ele se comportar corretamente</li>
<li>O livro <a href="http://www.amazon.com/Beginning-J2ME-Novice-Professional-Third/dp/1590594797" target="_blank">Beginning J2ME</a>, é extremamente bom e didático <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Se você tiver um OS 64Bits, não adianta chorar, não existe emulador de celular no computador, dura realidade.</li>
<li>O site da <a href="http://java.sun.com/javame/index.jsp" target="_blank">Sun</a> ainda é uma das melhores referências sobre J2ME, para quem tem tempo de ler.</li>
</ol>
<p>Fica ai as dicas, conforme eu vou estudando vou (com um pouco de tempo) postando alguns códigos aqui.</p>
<p>Aquele []</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/05/falta-de-tempo-e-projetos-com-deadline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
