<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris7ian</title>
	<atom:link href="http://christian7z.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://christian7z.wordpress.com</link>
	<description>Textos sobre tecnologia</description>
	<lastBuildDate>Thu, 23 Apr 2009 03:50:58 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='christian7z.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a8bcb3f0918aee683f7e47def44dd4a2?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Chris7ian</title>
		<link>http://christian7z.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://christian7z.wordpress.com/osd.xml" title="Chris7ian" />
		<item>
		<title>Aplicativos</title>
		<link>http://christian7z.wordpress.com/2009/04/23/aplicativos/</link>
		<comments>http://christian7z.wordpress.com/2009/04/23/aplicativos/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 03:50:58 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Programas]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=62</guid>
		<description><![CDATA[Venho, por meio deste, apenas demonstrar alguns aplicativos devéras úteis e, principlei almente, mostrar que ainda estou vivo.
E, importante:

Ainda estou usando o Opera (ou seja, estou usando a mais tempo que qualquer outro navegador, eu acho);
Instalei o Mandriva 2009.1 RC2 (está quase funcionando) em uma partição ext4;
Durante algum tempo, testei o Windows 7. Está muito [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=62&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Venho, por meio deste, apenas demonstrar alguns aplicativos devéras úteis e, principlei almente, mostrar que ainda estou vivo.</p>
<p>E, importante:</p>
<ol>
<li>Ainda estou usando o <a title="Opera Browser" href="http://www.opera.com/">Opera</a> (ou seja, estou usando a mais tempo que qualquer outro navegador, eu acho);</li>
<li>Instalei o <a title="Desenvolvimento Mandriva 2009.1" href="http://wiki.mandriva.com/pt/Desenvolvimento_2009.1">Mandriva 2009.1</a> <a title="Mandriva 2009.1 RC2" href="http://wiki.mandriva.com/pt/2009.1_RC_2">RC2</a> (está quase funcionando) em uma partição <a title="Fourth Extended Filesystem" href="http://en.wikipedia.org/wiki/Ext4">ext4</a>;</li>
<li>Durante algum tempo, testei o <a title="Windows 7" href="http://www.microsoft.com/windows/windows-7/">Windows 7</a>. Está muito bom, incrivelmente leve. Pena que o driver beta de vídeo da Intel (no note, é claro) NÃO implementava completamente <a title="OpenGL" href="http://www.opengl.org/">OpenGL</a>;</li>
</ol>
<p>Dessa vez, postarei alguns aplicativos, todos free, eu acho.</p>
<p>Então, indo direto ao ponto.</p>
<h2><a href="http://www.codesector.com/teracopy.php">TeraCopy</a></h2>
<p>Como todos sabem, o recurso de copiar/recortar e colar do Windows não é exatamente eficiente. Este aplicativo tenta consertar isso. Após a instalação, ele se registra como copiador padrão de arquivos. Além de, aparentemente, ele acelerar as cópias de arquivos, faz a checagem de integridade e permite o desligamente do PC após a cópia (opções não habilitadas por padrão, mas basta clicar no botão na janela de cópias) Recomendo a versão beta, que possui essas opcões citadas). Como devem ter percebido, roda apenas em Windows.</p>
<h2><a href="http://www.xmind.net/">XMind</a></h2>
<p>Um plugin para Eclipse para fazer mapas mentais. Também existe uma versão &#8220;stand alone&#8221;. Além dos recursos normais em aplicativos do genero, este possui uma parte &#8220;social&#8221;: seus mapas podem ser enviados para a comunidade XMind. No geral, os recursos deixarão usuários do Freemind bem confortáveis. Um tutorial com mais detalhes sobre o aplicativo ficará para um próximo post.</p>
<h2><a href="http://www.tiddlywiki.com/">TiddlyWiki</a></h2>
<p>Uma wiki pessoal que pode ser utilizada para o fim que o dono bem entender, como por exemplo, uma agenda, um catálogo, etc. No geral, sua sintexa se parece com a de uma wiki qualquer, mas podem ser adicionados alguns complementos para aumentar seu poder. Ficará para um próximo post também (pouco provavelmente o mesmo sobre mapas mentais) um tutorial sobre isso.</p>
<h2><a href="http://www.softwareok.com/?seite=freeware/Q-Dir">Q-Dir</a></h2>
<p>Mais um aplicativo que ajuda a copiar arquivos. Quando aberto, são exibidas quatro pastas ao mesmo tempo (lado a lado), e arquivos podem ser movidos, copiados, &#8230;, de uma para outra. Exclusivo para Windows.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=62&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2009/04/23/aplicativos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>zOMG Beta</title>
		<link>http://christian7z.wordpress.com/2008/10/27/zomg-beta/</link>
		<comments>http://christian7z.wordpress.com/2008/10/27/zomg-beta/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 11:54:17 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[sites]]></category>
		<category><![CDATA[gaia]]></category>
		<category><![CDATA[gaiaonline]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=60</guid>
		<description><![CDATA[Hoje começa o zOMG beta.
Aparentemente a turma do Gaia vai liberando acesso ao zOMG aos poucos, baseado na data de cadastro do usuário (usuários mais antigos poderão acessar primeiro).
Para quem não sabe, zOMG é o sistema de batalha do Gaia Online, que está em desenvolvimento há mais de um ano, e agora, finalmente, está entrando [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=60&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hoje começa o zOMG beta.</p>
<p>Aparentemente a turma do Gaia vai liberando acesso ao zOMG aos poucos, baseado na data de cadastro do usuário (usuários mais antigos poderão acessar primeiro).</p>
<p>Para quem não sabe, zOMG é o sistema de batalha do <a title="Gaia Online" href="http://www.gaiaonline.com" target="_self">Gaia Online</a>, que está em desenvolvimento há mais de um ano, e agora, finalmente, está entrando em fase de testes.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=60&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/10/27/zomg-beta/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>zOMG</title>
		<link>http://christian7z.wordpress.com/2008/09/17/zomg/</link>
		<comments>http://christian7z.wordpress.com/2008/09/17/zomg/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 23:01:17 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[sites]]></category>
		<category><![CDATA[gaiaonline]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=56</guid>
		<description><![CDATA[Meus caros colegas leitores (ou não)&#8230;
Uma boa notícia para vocês (que já não deve ser mais uma novidade, mas&#8230;)&#8230;
Hoje, após um bom tempo longe do Gaia Online, resolvi dar uma olhadinha na minha conta, quando notei que na parte de games havia um link para o zOMG.
Para quem não sabe, zOMG é o nome que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=56&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Meus caros colegas leitores (ou não)&#8230;</p>
<p>Uma boa notícia para vocês (que já não deve ser mais uma novidade, mas&#8230;)&#8230;</p>
<p>Hoje, após um bom tempo longe do <a href="http://www.gaiaonline.com">Gaia Online</a>, resolvi dar uma olhadinha na minha conta, quando notei que na parte de games havia um link para o <a href="http://www.gaiaonline.com/games/zomg">zOMG</a>.</p>
<p>Para quem não sabe, zOMG é o nome que será dado ao &#8220;RPG&#8221; que citei muito tempo atras que estava em desenvolvimento. Em julho (meio atrasado eu hein!) ele finalmente entrou em estágio beta de desenvolvimento, e aparentemente será lançado no verão (o que pode ser meio abstrato, mas enfim&#8230;)</p>
<p>Mas isso já é uma boa notícia, eu acho&#8230;<br />
Ainda no aguardo!!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/56/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/56/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=56&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/09/17/zomg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>Voltando</title>
		<link>http://christian7z.wordpress.com/2008/07/31/voltando/</link>
		<comments>http://christian7z.wordpress.com/2008/07/31/voltando/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 00:19:47 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Avisos]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Programas]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[metas]]></category>
		<category><![CDATA[opera]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=52</guid>
		<description><![CDATA[Desculpem a ausência, mas estive meio ocupado por uns tempos:
As novidades são que finalmente passei em Cálculo I (o problema é que semana que vem terei que encarar o Magossi em Cálculo II, eu acho).
Outra novidade é que agora estou usando o Opera. No começo eu achava o Safari melhor (ele renderiza as páginas melhor [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=52&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Desculpem a ausência, mas estive meio ocupado por uns tempos:</p>
<p>As novidades são que finalmente passei em Cálculo I (o problema é que semana que vem terei que encarar o <a href="http://www.ceset.unicamp.br/~magossi">Magossi</a> em Cálculo II, eu acho).</p>
<p>Outra novidade é que agora estou usando o <a title="Opera browser" href="http://www.opera.com">Opera</a>. No começo eu achava o <a href="http://www.apple.com/safari/">Safari</a> melhor (ele renderiza as páginas melhor e ele em si é bem mais &#8220;visualmente agradavel&#8221;). Mas depois de conhecer o Opera só pude dizer: Wow!</p>
<p>Confesso que comecei a usá-lo apenas porque o Firefox 3 me decepcionou (ao menos não achei ele tudo o que diziam que ele seria), e principalmente porque o Safari não roda em Linux, e agora estou usando meu <a href="http://mandriva.com/en/product/mandriva-linux-one">Mandriva</a> com uma certa frequência.</p>
<p>Claro que o <a title="Fernando Scherrer" href="http://www.fernando.scherrer.nom.br/">Fernandinho</a> tinha que perguntar &#8220;Como você faz para verificar seu <a title="GMail" href="http://mail.google.com">Gmail</a>, ou gerenciar seus links no Ma.gnolia?&#8221;.</p>
<p>Realmente, o Opera não é um &#8220;quebra-cabeça&#8221; como o <a title="Firefox" href="http://www.mozilla.com/firefox/">Firefox</a>,  onde você deve ir juntando as pecinhas para que ele funcione corretamente (precisa de extensão para baixar arquivos, extensão para renderizar as páginas, &#8230;).</p>
<p>Mas, que seja, o Opera já é um navegador completo, com um cliente de e-mail embutido, que pode ser usado para gerenciar o GMail bem (só cadastrar como uma conta <a href="http://en.wikipedia.org/wiki/Imap">IMAP</a> que você consegue até aplicar os labels nos e-mails).</p>
<p>Mas, se preferir, o Opera suporta widgets, que são mini-aplicativos que você pode rodar no desktop. Dentre estes existe um que eu até gostei, e que pode ajudar nisso. É o <a title="multiGmail" href="http://widgets.opera.com/widget/9141/">multiGmail</a>, que faz exatamente o que as extensões do Firefox fazem: informam se há ou não algum email.</p>
<p>Já para o <a title="Ma.gnolia" href="http://ma.gnolia.com">Ma.gnolia</a>,  como não encontrei nada que pudesse ajudar, resolvi fazer eu mesmo um widget. veja algumas imagens dele sobre a edição desse artigo.</p>
<p><a href="http://www.flickr.com/photos/hartung/2720405173/" title="Ma.gnolia Opera Widget Main por christian.hartung, no Flickr"><img src="http://farm4.static.flickr.com/3198/2720405173_165e1eb8f1.jpg" width="500" height="313" alt="Ma.gnolia Opera Widget Main" /></a></p>
<p><a href="http://www.flickr.com/photos/hartung/2721230200/" title="Ma.gnolia Opera Widget Config por christian.hartung, no Flickr"><img src="http://farm4.static.flickr.com/3106/2721230200_94f5562f8d.jpg" width="500" height="313" alt="Ma.gnolia Opera Widget Config" /></a></p>
<p>Claro que ele ainda está em seus passos iniciais, mas acho que não demorará tanto para ficar pronto (ou vai, nunca se sabe).</p>
<p>Outras metas:</p>
<ul>
<li>Estudar a <a href="http://www.oracle.com/technology/tech/oci/index.html">Oracle Call Interface</a> e dar uma ajuda com a <a href="http://dsource.org/projects/ddbi">DDBI</a>, já que há uma parte na interface com Oracle com um &#8220;return null;&#8221; que estava me intrigando.</li>
<li>Passar esse semestre sem nenhum exame (difícil, considerando Cálculo II, mas é uma meta).</li>
<li>Terminar meu primeiro artigo sobre E/S usando Tango (faz tempo que ele está como draft).</li>
<li>Brincar mais um pouco com a biblioteca para comunicação serial (e/ou paralela?) em D.</li>
<li>Terminar o sistema de comunicação instantânea que eu comecei.</li>
<li>E, além de tudo isso, levar uma vida comum (essa parte está difícil).</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=52&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/07/31/voltando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3198/2720405173_165e1eb8f1.jpg" medium="image">
			<media:title type="html">Ma.gnolia Opera Widget Main</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3106/2721230200_94f5562f8d.jpg" medium="image">
			<media:title type="html">Ma.gnolia Opera Widget Config</media:title>
		</media:content>
	</item>
		<item>
		<title>Ajude a Wikipédia</title>
		<link>http://christian7z.wordpress.com/2008/06/25/ajude-a-wikipedia/</link>
		<comments>http://christian7z.wordpress.com/2008/06/25/ajude-a-wikipedia/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 18:43:16 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Avisos]]></category>
		<category><![CDATA[campanhas]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=51</guid>
		<description><![CDATA[Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!
…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=51&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!</strong><br />
…e também a pen drives, card drives, camisetas geeks, livros e mais! O <a href="http://br-linux.org">BR-Linux</a> e o <a href="http://efetividade.net">Efetividade</a> lançaram uma <a href="http://br-linux.org/2008/campanha-wikipedia">campanha</a> para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e <a href="http://br-linux.org/2008/campanha-wikipedia">participe</a> &#8211; quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=51&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/06/25/ajude-a-wikipedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>Outro Blog</title>
		<link>http://christian7z.wordpress.com/2008/05/30/outro-blog/</link>
		<comments>http://christian7z.wordpress.com/2008/05/30/outro-blog/#comments</comments>
		<pubDate>Fri, 30 May 2008 21:08:53 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Avisos]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=49</guid>
		<description><![CDATA[Faz algum tempo já, mas só para informar:
Eu e o Diogo criamos um blog para mostrar o pouco que nós (não) sabemos sobre Haskell e programação funcional.
Então conforme nós formos aprendendo sobre a assunto postaremos por lá.
Não deixem de conferir&#8230;
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=49&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Faz algum tempo já, mas só para informar:</p>
<p>Eu e o <a href="http://diogobispo.wordpress.com/">Diogo</a> criamos um <a href="http://haskellguys.wordpress.com/">blog</a> para mostrar o pouco que nós (não) sabemos sobre <a href="http://www.haskell.org/">Haskell</a> e <a href="http://en.wikipedia.org/wiki/Functional_programming">programação funcional</a>.</p>
<p>Então conforme nós formos aprendendo sobre a assunto postaremos por lá.</p>
<p>Não deixem de conferir&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/49/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/49/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=49&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/05/30/outro-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>Funções</title>
		<link>http://christian7z.wordpress.com/2008/04/15/funcoes/</link>
		<comments>http://christian7z.wordpress.com/2008/04/15/funcoes/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 17:12:29 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[programaçao]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=48</guid>
		<description><![CDATA[Neste artigo vou falar um pouco mais sobre funções. Mais precisamente sobre como passar um número variável de parâmetros para elas.
Existem basicamente 3 (três) formas de se fazer isso:
1 &#8211; Passagem segura quanto ao tipo
Nesse tipo, a parte dos parâmetros com número variável é passada como um array. Sendo assim, apenas um tipo de parâmetro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=48&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Neste artigo vou falar um pouco mais sobre funções. Mais precisamente sobre como passar um número variável de parâmetros para elas.</p>
<p>Existem basicamente 3 (três) formas de se fazer isso:</p>
<h2>1 &#8211; Passagem segura quanto ao tipo</h2>
<p>Nesse tipo, a parte dos parâmetros com número variável é passada como um array. Sendo assim, apenas um tipo de parâmetro pode ser passado, mas em qualquer quantidade.</p>
<p>Considere o exemplo: </p>
<pre><code><strong>void</strong> func(<strong>int</strong>[] p...)
{
    <strong>foreach</strong>(i, v; p)
        Stdout.formatln("p[{}] = {}", i, v);
}</code></pre>
<p>Essa função pode ser usada como:<br />
<code>func()</code><br />
<code>func(10);</code><br />
<code>func(10, 15);</code></p>
<h2>2 &#8211; Passagem estilo D</h2>
<p>O porém de se usar a forma anterior é que apenas um tipo de argumento pode ser usado, e nem sempre isso é o desejado. Por isso existe um tipo, semalhante ao estilo C de se passar um número aleatório de parâmetros.</p>
<p>Considere o exemplo:</p>
<pre><code><strong>void </strong>func(...)
{
    <strong>foreach</strong>(i, arg; <em>_arguments</em>)
    {
        <strong>if</strong>(arg == <strong>typeid</strong>(<strong>int</strong>))
            Stdout.formatln("O argumento {} é um {} de valor {}", i, arg, *<strong>cast</strong>(<strong>int</strong>*)_argptr);
        <strong>else</strong> <strong>if</strong>(arg == <strong>typeid</strong>(<strong>float</strong>))
            Stdout.formatln("O argumento {} é um {} de valor {}", i, arg, *<strong>cast</strong>(<strong>float</strong>*)_argptr);
        _argptr += arg.tsize;
    }
}</code></pre>
<h3>Explanações</h3>
<p>Quando é encontrado um &#8220;&#8230;&#8221; como argumento, você ganha duas variáveis ocultas: _arguments, um array de TypeInfo, e _argptr, um ponteiro <strong>void</strong>* para o primeiro argumento.´</p>
<p>Uma intância de TypeInfo é retornada pela expressão <strong>typeid</strong>, usada para RTTI (Run Time Type Information).</p>
<p>O método &#8220;tsize()&#8221; da classe TypeInfo retorna o tamanho do tipo.</p>
<p>Então basta ir tratando para cada tipo que você deseja que seja válido ou inválido:</p>
<pre><code><strong>assert</strong>(arg == <strong>typeid</strong>(<strong>char</strong>), "Tipo inválido");</code></pre>
<p>Lembrando que um <strong>assert</strong> não termina o programa, simplesmente dispara um AssertError em Phobos ou um AssertException em Tango.</p>
<p>Só para frisar, se você estiver em um <strong>extern</strong>(C), você não ganha o _arguments.</p>
<h2>3 &#8211; Tuplas</h2>
<p>Esse tipo de passagem eu comecei a usar recentemente e, pelo menos para mim, já se tornou o melhor.</p>
<p>Uma tupla é um conjunto de coisas. Essas coisas podem ser tipos ou expressões, sendo que uma mesma tupla pode ter tipos e expressões, expressões de diferentes tipos, etc.</p>
<p>Esse tipo pode ser entendido como uma combinação dos dois anteriores, já que tuplas podem ser controladas como arrays, mas podem conter qualquer tipo em seu interior.</p>
<p>O único porém das tuplas é que seu tamanho deve estar disponível em tempo de compilação.</p>
<p>Para criar uma tupla, usa-se um template:</p>
<pre><code><strong>void</strong> func(P...)(P p)
{
    <strong>foreach</strong>(i, v; p)
        Stdout.formatln("p[{}] é um {} de valor {}", i, <strong>typeof</strong>(v).stringof, v);
}</code></pre>
<p>Lembrando que <code><strong>void</strong> func(P...)(P p)</code> é o mesmo que:</p>
<pre><code><strong>template</strong> func(P...)
{
    <strong>void</strong> func(P p)...
}</code></pre>
<p>Lembrando que <strong>typeof</strong> retorna o tipo de uma expressão e a propriedade &#8220;.stringof&#8221; converte qualquer expressão para uma string. E quando eu digo expressão, dessa vez é a expressão mesmo. Por exemplo: (5 + 1).stringof não rende a string &#8220;6&#8243;, mas sim &#8220;5 + 1&#8243;.</p>
<p>Por hoje é só. Logo entrarei em mais detalhes sobre Tuplas (e templates no geral).</p>
<p style="font-size:10px;text-align:right;">blogblogs tags:<a rel="tag" href="http://blogblogs.com.br/tag/linguagem">linguagem</a>, <a rel="tag" href="http://blogblogs.com.br/tag/programacao">programacao</a>, <a rel="tag" href="http://blogblogs.com.br/tag/d">d</a></p>
<p><!-- blogblogs tags end --></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/48/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/48/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=48&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/04/15/funcoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>Lazy Evaluation &#8211; Parte II</title>
		<link>http://christian7z.wordpress.com/2008/04/05/lazy-evaluation-parte-ii/</link>
		<comments>http://christian7z.wordpress.com/2008/04/05/lazy-evaluation-parte-ii/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 14:03:00 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[programaçao]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=47</guid>
		<description><![CDATA[No último post eu falei um pouco sobre as vantagens de se usar a a palavra lazy na passagem de parâmetros.
Então alguém pode pensar: &#8220;Legal, vou usar isso sempre&#8221;.
Mas não é bem assim que funciona.
Esse tipo de parâmetro tem a vantagem de ser avaliado apenas quando for usado, mas tem a desvantagem de ser avaliado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=47&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>No último post eu falei um pouco sobre as vantagens de se usar a a palavra <code><strong>lazy</strong></code> na passagem de parâmetros.</p>
<p>Então alguém pode pensar: &#8220;Legal, vou usar isso sempre&#8221;.<br />
Mas não é bem assim que funciona.</p>
<p>Esse tipo de parâmetro tem a vantagem de ser avaliado apenas quando for usado, mas tem a desvantagem de ser avaliado sempre que for usado.</p>
<p>Confuso? Considere este exemplo:</p>
<pre><code>/**
* testLazy.d - Exemplo de uso de parâmetros lazy.
*
 * Author: Christian Hartung &lt; hartung [at] live.com &gt;
 * Copyright: Domínio Público
 */
module testLazy;</code>import tango.io.Stdout;
import tango.text.convert.Format;

const nrTests = 10;

void testLazy(lazy char[] str, int times)
{
for(int i = 0; i &lt; times; i++)
 	Stdout(str())
}

void test(char[] str, int times)
{
    for(int i = 0; i &lt; times; i++)
 	Stdout(str)
}

void makeTests(alias Test)()
{
int j;

for(int i = 0; i &lt; nrTests; i++)
    {
 	Test(Format("{:d2} ", j++, 5), 10);
 	Stdout.newline()
    }

Stdout.formatln("j = {}", j)
}

void main()
{
    Stdout("Testando com lazy").newline
    makeTests!(testLazy)();

Stdout.newline();

Stdout("Testando sem lazy").newline;
    makeTests!(test)()
}</pre>
<p>Neste exemplo, seria esperado que <var>j</var> = 10 ao final, mas usando <code><strong>lazy</strong></code>, <var>j</var> = 100.</p>
<p>Isso ocorre porque a cada vez que <var>str</var> é usado dentro de <code>testLazy</code>, todo o <code>Format("{:d2} ", j++, 5)</code> é avaliado, e o <code><var>j</var>++</code> é executado.</p>
<p>Já na função <code>test</code> str é avaliado apenas quando ela é chamada, ou seja, o <code><var>j</var>++</code> é avaliado apenas uma vez a cada chamada.</p>
<p>Ou seja, se você for usar seu parâmetro várias vezes dentro de sua função, o desempenho ganho com o uso de <code><strong>lazy</strong></code> pode ser perdido.</p>
<p>Outro problema que pode ocorrer:</p>
<pre><code>int ops(bool b, lazy int i)
{
if(b)
return i();
    return 0;
}</code></pre>
<p>Se você chamar essa função como:</p>
<pre><code>i = 1;
test(false, i++);</code>Stdout.formatln("Sem lazy, i = {}", i);</pre>
<p>Você vai perceber que o <var>i</var> não foi incrementado! Afinal, o segundo parâmetro de test não foi avaliado nenhuma vez.</p>
<p>Ou seja, apesar do aumento no desempenho que o uso de parâmtros <code><strong>lazy</strong></code> pode proporcionar, eles devem ser usados com cuidado.</p>
<p><!-- blogblogs tags begin --></p>
<p style="font-size:10px;text-align:right;">blogblogs tags:<a rel="tag" href="http://blogblogs.com.br/tag/linguagem">linguagem</a>, <a rel="tag" href="http://blogblogs.com.br/tag/programacao">programacao</a>, <a rel="tag" href="http://blogblogs.com.br/tag/d">d</a></p>
<p><!-- blogblogs tags end --></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/47/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/47/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=47&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/04/05/lazy-evaluation-parte-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>Lazy Evaluation</title>
		<link>http://christian7z.wordpress.com/2008/02/19/lazy-evaluation/</link>
		<comments>http://christian7z.wordpress.com/2008/02/19/lazy-evaluation/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 23:13:50 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[programaçao]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=45</guid>
		<description><![CDATA[Agora, voltando a falar um pouco sobre funções, um conceito que pode ser muito útil é chamado Lazy Evaluation (Avaliação preguiçosa, ou algo do tipo).
Veja o exemplo dessa função:
string call(bool b,  string s)
{
if(b)
return s;
else
        return "";
}
Como podem ver, essa função (inútil, mas é apenas para demonstrar) retorna [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=45&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Agora, voltando a falar um pouco sobre funções, um conceito que pode ser muito útil é chamado Lazy Evaluation (Avaliação preguiçosa, ou algo do tipo).</p>
<p>Veja o exemplo dessa função:</p>
<pre><code>string call(<strong>bool</strong> b,  string s)
{
<strong>if</strong>(b)
<strong>return</strong> s;
<strong>else</strong>
        <strong>return</strong> <span style="color:#990000;">""</span>;
}</code></pre>
<p>Como podem ver, essa função (inútil, mas é apenas para demonstrar) retorna seu segundo argumento (s) se seu primeiro argumento (b) for verdadeiro.</p>
<p>Um problema com isso é que seu segundo argumento é sempre avaliado. Imaginando que ele seja uma função relativamente complexa, como a função &#8220;convert&#8221;, da classe <a href="http://dsource.org/projects/tango/docs/current/tango.text.convert.Layout.html">Layout</a> (função parecida com string.Format do C# ou String.format do Java), isso seria um desperdício de processamento) em casos como:</p>
<pre><code>call(<strong>false</strong>, Format(<span style="color:#990000;">"{}"</span>, i));</code></pre>
<p>(Format é uma &#8220;instância global&#8221; de Layout para <strong>char</strong>&#8217;s, definida em <code>tango.text.convert.Format</code><br />
Uma solução para isso seria passar um ponteiro para uma função ou um delegate (ponteiro para um membro, ou uma função interna) que faz a formatação:</p>
<pre><code>call(<strong>false</strong>, { <strong>return</strong> Format(<span style="color:#990000;">"{}"</span>, i); });</code></pre>
<p>Com isso, seria necessário trocar <code><strong>return</strong> s;</code> em <code>call</code> por <code><strong>return</strong> s();</code>.</p>
<p>Claro que é meio incomode ter que usar a sintaxe para delegates literais sempre que se quiser esse tipo de otimização, por isso foi criado o conceito de argumento preguiçoso (lazy), que basicamente é convertido para um delegate. Veja a função:</p>
<pre><code>string lazyCall(<strong>bool</strong> b, <strong>lazy</strong> string s)
{
<strong>if</strong>(b)
<strong>        return</strong> s();
<strong>else</strong>
<strong>        return</strong> <span style="color:#990000;">""</span>;
}</code></pre>
<p>Obs.: <code>string</code> é um alias que eu criei para um array de <code><strong>char</strong></code>&#8217;s ou <code><strong>invariant</strong>(<strong>char</strong>)</code>&#8217;s, dependendo da versão da linguagem ou biblioteca sendo usada. Ele é definido como:</p>
<pre><code><strong>static</strong> <strong>if</strong>(!<strong>is</strong>(string))
{
<strong>static</strong> <strong>if</strong>(<strong>is</strong>(<strong>typeof</strong>(object.Object.toString) R == <strong>return</strong>))
<strong>        alias</strong> R string;
}</code></pre>
<p>Esse trecho verifica se já não existe um tipo <code>string</code> já definido (lembrando que ele foi adicionado ao módulo &#8220;object&#8221; para Phobos v2). Se não existir, ele pega o tipo que o método <code>toString</code> (método existente em Phobos e adicionado à Tango na versão 0.99.4 Frank &#8211; antes disso era <code>toUtf8</code> da classe <code>Object</code> (classe esta existente em Phobos e em Tango no módulo <code>object</code>) em <code>R</code> e cria um alias para esse tipo como <code>string</code>. Uma observação: não vá confundir o <code><strong>typeof</strong></code> em D e em C#. Em C#, você usaria <code><strong>typeof</strong>(tipo)</code> para retornar uma instância de <code>System.Type</code> para o tipo (ou algo do tipo) passado. Em D, você usa <code><strong>typeof</strong>(variável)</code> para retornar o tipo da variável.</p>
<p><code><strong>static if</strong></code> é uma forma de compilação condicional da linguagem. A condição dessa instrução é avaliada em tempo de compilação, e não é criado um novo escopo para seu bloco de instruções.</p>
<p>Esta forma de <code><strong>is</strong></code> é para verificar, em tempo de compilação, a validade ou não de algum tipo. Mais informações sobre isso futuramente (assim espero!).</p>
<p>Para demonstrar a eficiência disso, criei este simples benchmark:</p>
<pre><code><strong>module</strong> Lazy;</code> <strong>import</strong> tango.io.Stdout;

<strong>import</strong> tango.text.convert.Format;

<strong>import</strong> tango.time.StopWatch;<strong>const</strong> j = 10000000u;<strong></strong> <strong>static if</strong>(!is(string))

{

<strong>static if</strong>(<strong>is</strong>(<strong>typeof</strong>(object.Object.toString) R == <strong>return</strong>))

<strong>alias</strong> R string;

}

string lazyCall(<strong>bool</strong> b, <strong>lazy string</strong> s)

{

<strong>if</strong>(b)

<strong>return</strong> s();

<strong>else</strong>

        <strong>return</strong> <span style="color:#990000;">""</span>;

}

string call(<strong>bool</strong> b,  string s)

{

<strong>if</strong>(b)

<strong>return</strong> s;

<strong>else</strong>

        <strong>return</strong> <span style="color:#990000;">""</span>;

}

<strong>private void</strong> benchmarkImpl(<strong>alias</strong> fn)(<strong>bool</strong> b)

{

StopWatch e;

Stdout.formatln(<span style="color:#990000;">"Executando {} vezes com b = {}"</span>, j, b);

e.start();

<strong>for</strong>(<strong>uint</strong> i = 0; i &lt; j; i++)

fn(b, Format(<span style="color:#990000;">"{}"</span>, i));

Stdout.formatln(<span style="color:#990000;">"Tempo de execução: {}"</span>, e.stop()).newline;

}

<strong>void</strong> benchmark(<strong>alias</strong> fn)()

{

benchmarkImpl!(fn)(<strong>true</strong>);

benchmarkImpl!(fn)(<strong>false</strong>);

}

<strong>void</strong> main()

{

Stdout(<span style="color:#990000;">"lazyCall"</span>).newline;

benchmark!(lazyCall)();

Stdout(<span style="color:#990000;">"-----------------------"</span>).newline;     Stdout(<span style="color:#990000;">"call"</span>).newline;

benchmark!(call)();

}</pre>
<p>Coloque isso em um arquivo chamado Lazy.d e compile (tomara que compile).</p>
<p>Acho que a única novidade nesse código é o <code><strong>private</strong> <strong>void</strong> benchmarkImpl(<strong>alias</strong> fn)(<strong>bool</strong> b)</code>.</p>
<p>Então, vejamos o que é isso:<br />
<code><strong>private</strong></code>, assim como para classes, torna a função <code>benchmarkImpl</code> visível apenas para o módulo <code>Lazy</code> (lembrando que em OOP em D, campos/métodos privados são visíveis para todo o módulo, não apenas para a classe, semelhantemente ao Delphi &#8211; mas não tente colocar <code>strict <strong>private</strong></code> para mudar isso).</p>
<p>Fora isso, sobrou apenas a parte legal da declaração:<br />
<code><strong>void</strong> benchmarkImpl(<strong>alias</strong> fn)(<strong>bool</strong> b)</code>.</p>
<p>Isso é equivalente a declarar um <code><strong>template</strong></code> da seguinte forma:</p>
<pre><code><strong>template</strong> benchmarkImpl(<strong>alias</strong> fn)

{

<strong>void</strong> benchmarkImpl(<strong>bool</strong> b) { ... }

}</code></pre>
<p>O <code><strong>alias</strong></code> na declaração do template, neste caso, aceita símbolos globais no geral (no caso, uma função).</p>
<p>Usando Phobos (a biblioteca padrão), o exemplo ficaria mais ou menos assim:</p>
<pre><code><strong>module</strong> Lazy;</code><strong>import</strong> std.perf;

<strong>import</strong> std.stdio;

<strong>import</strong> std.string;

<strong>const</strong> j = 10000000u;

<strong>static if</strong>(!<strong>is</strong>(string))

{

<strong>static if</strong>(<strong>is</strong>(<strong>typeof</strong>(object.Object.toString) R == <strong>return</strong>))

<strong>alias</strong> R string;

}

string lazyCall(<strong>bool</strong> b, <strong>lazy</strong> string s)

{

<strong>if</strong>(b)

<strong>return</strong> s();

<strong>else</strong>

 	<strong>return</strong> <span style="color:#990000;">""</span>;

}

string call(<strong>bool</strong> b,  string s)

{

<strong>if</strong>(b)

<strong>return</strong> s;

<strong>else</strong>

 	<strong>return</strong> <span style="color:#990000;">""</span>;

}

<strong>private void</strong> benchmarkImpl(<strong>alias</strong> fn)(<strong>bool</strong> b)

{

<strong>auto</strong> e = <strong>new</strong> PerformanceCounter();

writefln(<span style="color:#990000;">"Executando %s vezes com b = %s"</span>, j, b);

e.start();

<strong>for</strong>(<strong>uint</strong> i = 0; i &lt; j; i++)

fn(b, format(<span style="color:#990000;">"%s"</span>, i));

e.stop;

writefln(<span style="color:#990000;">"Tempo de execução: %s"</span>, e.milliseconds / 1000.0);

}

<strong>void</strong> benchmark(<strong>alias</strong> fn)(){
benchmarkImpl!(fn)(<strong>true</strong>);
benchmarkImpl!(fn)(<strong>false</strong>);
}

<strong>void</strong> main(){
writefln(<span style="color:#990000;">"lazyCall"</span>);
benchmark!(lazyCall)();

writefln(<span style="color:#990000;">"-----------------------"</span>); writefln(<span style="color:#990000;">"call"</span>);
benchmark!(call)();
}</pre>
<p><!-- blogblogs tags begin --></p>
<p style="font-size:10px;text-align:right;">blogblogs tags:<a rel="tag" href="http://blogblogs.com.br/tag/linguagem">linguagem</a>, <a rel="tag" href="http://blogblogs.com.br/tag/programacao">programacao</a>, <a rel="tag" href="http://blogblogs.com.br/tag/d">d</a></p>
<p><!-- blogblogs tags end --></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=45&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/02/19/lazy-evaluation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
		<item>
		<title>DSSS</title>
		<link>http://christian7z.wordpress.com/2008/02/14/dsss/</link>
		<comments>http://christian7z.wordpress.com/2008/02/14/dsss/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 21:09:47 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Dev]]></category>

		<guid isPermaLink="false">http://christian7z.wordpress.com/?p=44</guid>
		<description><![CDATA[O D Shared Software System é um &#8220;sistema de compartilhamento de software&#8221; criado para facilitar a utilização de bibliotecas de terceiros, e (o que eu uso com mais frequencia) como um sistema para automatizar a compilação de softwares.
Suponha que você esteja escrevendo uma biblioteca. Esta provavelmente terá vários módulos. Utilizando simplemente o compilador, você teria [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=44&subd=christian7z&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>O <a href="http://dsource.org/projects/dsss" title="D Shared Software System">D Shared Software System</a> é um &#8220;sistema de compartilhamento de software&#8221; criado para facilitar a utilização de bibliotecas de terceiros, e (o que eu uso com mais frequencia) como um sistema para automatizar a compilação de softwares.</p>
<p>Suponha que você esteja escrevendo uma biblioteca. Esta provavelmente terá vários módulos. Utilizando simplemente o compilador, você teria que especificar todos os módulos. Por exemplo:<br />
<span style="font-family:monospace;">dmd -c Soma.d Mul.d Sub.d Div.d</span><br />
(-c para não linkar, apenas compilar e não linkar &#8211; não gerando o executável)</p>
<p>Quando seu aplicativo vai crescendo, começa a ficar incomodo listar todos os arquivos (ou criar um script, como um makefile e especificá-los). É aí que entra uma ferramenta como o DSSS.</p>
<p>Continuando o exemplo anterior, teríamos os módulos:</p>
<pre><code><b>module</b> matematica.Soma;
<b>int</b> soma(<b>int</b> a, <b>int</b> b)
{
    <b>return</b> a + b;
}

<span style="color:#009900;">//--------------------------------</span></code><b>module</b> matematica.Sub;
<b>int</b> sub(<b>int</b> a, <b>int</b> b)
{
    <b>return</b> a - b;
}

<span style="color:#009900;">//--------------------------------</span><b>module</b> matematica.Mul;
<b>int</b> mul(<b>int</b> a, <b>int</b> b)
{
    <b>return</b> a * b;
}<span style="color:#009900;">
</span>

<span style="color:#009900;">//--------------------------------</span>

<b>module</b> matematica.Div;
<b>int</b> div(<b>int</b> a, <b>int</b> b)
{
    <b>if</b>(b == 0)
        <b>return</b> a;
    <b>return</b> a + b;
}

<span style="color:#009900;">//--------------------------------</span></pre>
<p>Para tornar essa biblioteca &#8220;usável&#8221; com o DSSS, você simplesmente deve criar um script chamado &#8220;dsss.conf&#8221; na raíz de seu aplicativo:</p>
<pre>- dsss.conf
- matematica
- - Soma.d
- - Sub.d
- - Mul.d
- - Div.d</pre>
<p>O script se assemelha à um arquivo .ini do Windows:</p>
<pre><code>name=matematica</code>[matematica]
type=library
target=matematica</pre>
<p>Esse script criará um sistema chamado matematica (se ele for instalado via DSSS, terá esse nome), que terá uma biblioteca compilada com os arquivos dentro do pacote &#8220;matematica&#8221;, e que se chamará &#8220;matematica.lib&#8221; no Windows e &#8220;libmatematica.a&#8221; em sistemas POSIX.</p>
<p>No geral, não é necessário informar o tipo, mas eu prefiro, só por documentação.</p>
<p>Agora, basta entrar no diretório que contém esse script e digitar no console <span style="font-family:monospace;">dsss build</span> (claro que isso depois de configurar o PATH, como já é de costume). Se houver documentação das funções no formato DDOC, você pode usar <span style="font-family:monospace;">dsss build &#8211;doc</span><br />
Se desejar instalar essa biblioteca, para que possa ser usada por outros sistemas, basta usar <span style="font-family:monospace;">dsss install</span>.</p>
<p>Se desejar adicionar um binário qualquer à sua biblioteca (por exemplo, main.d no diretório raíz):</p>
<pre>- dsss.conf
- matematica
- - Soma.d
- - Sub.d
- - Mul.d
- - Div.d
- main.d</pre>
<p>Basta adiciná-lo ao script dsss.conf:</p>
<pre><code>name=matematica</code>[matematica]
type=library
target=matematica

[main.d]type=binary
target=testmatematica</pre>
<p>Desta vez, além da biblioteca, também será gerado um executável (type=binary) chamado testmatematica(\.exe)?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/christian7z.wordpress.com/44/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/christian7z.wordpress.com/44/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/christian7z.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/christian7z.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/christian7z.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/christian7z.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/christian7z.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/christian7z.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/christian7z.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/christian7z.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/christian7z.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/christian7z.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=christian7z.wordpress.com&blog=447884&post=44&subd=christian7z&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://christian7z.wordpress.com/2008/02/14/dsss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/35698aeab3e9ce8722784ff1b3b24d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chrishartung</media:title>
		</media:content>
	</item>
	</channel>
</rss>