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

	<title>Planet ccppbrasil.org</title>
	<link rel="self" href="http://ccppbrasil.org/planet/atom.xml"/>
	<link href="http://ccppbrasil.org/planet/"/>
	<id>http://ccppbrasil.org/planet/atom.xml</id>
	<updated>2010-09-03T21:20:23+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Resenha: Embedded Software The Works</title>
		<link href="http://www.sergioprado.org/2010/09/01/resenha-embedded-software-the-works/"/>
		<id>http://www.sergioprado.org/?p=850</id>
		<updated>2010-09-01T11:00:05+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;Terminei recentemente a leitura do Livro “&lt;a href=&quot;http://www.amazon.com/Embedded-Software-Works-Colin-Walls/dp/0750679549&quot; target=&quot;_blank&quot;&gt;Embedded Software The Works&lt;/a&gt;”, escrito por Colin Walls, experiente engenheiro e um dos pioneiros da indústria de sistemas embarcados, que trabalha atualmente na &lt;a href=&quot;http://www.mentor.com/&quot; target=&quot;_blank&quot;&gt;Mentor Graphics&lt;/a&gt;. O livro é uma coletânea de vários artigos, separados por temas de interesse em 9 capítulos. &lt;br /&gt;
	&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A linguagem utilizada é simples, e apesar de manter certa ordem de apresentação do conteúdo, você não precisa ler na ordem apresentada. Alguns artigos, que foram escritos na década de 90, estão um pouco defasados, mas no geral é um livro que vale a pena pelo menos dar uma olhada em alguns capítulos, que são bem interessantes.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O capítulo 1 apresenta uma introdução à sistemas embarcados e sua evolução durante os últimos 30 anos, falando sobre memória, arquitetura de CPUs e seu processo de seleção, além de dois artigos bem interessantes sobre a interface USB. O capítulo 2 é sobre design de sistemas embarcados, abrangendo tópicos como UML e Eclipse. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Os capítulos 3, 4 e 5 são inteiramente voltados ao desenvolvimento de software embarcado em C e C++, com algumas dicas valiosas principalmente para quem está começando na área. Os capítulos 6 e 7 também são bem interessantes, discutindo tópicos relacionados à sistemas de tempo real. Os dois últimos capítulos falam sobre protocolos de rede e FPGAs.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O site do livro é &lt;a href=&quot;http://embeddedsoftwareworks.com/&quot; target=&quot;_blank&quot;&gt;este aqui&lt;/a&gt;, e quem se interessar pode dar uma folheada no &lt;a href=&quot;http://books.google.com.br/books?id=FLvsis4_QhEC&amp;dq=embedded+software+the+works&amp;printsec=frontcover&amp;source=bn&amp;hl=pt-BR&amp;ei=PoN9TOOHK8KC8gbOvJD1Bg&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CCsQ6AEwAw#v=onepage&amp;q&amp;f=false&quot; target=&quot;_blank&quot;&gt;Google Books&lt;/a&gt;. Vale a pena também acompanhar o &lt;a href=&quot;http://blogs.mentor.com/colinwalls/&quot; target=&quot;_blank&quot;&gt;The Colin Walls Blog&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abraço!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/05/27/misra-c-padrao-para-software-em-c/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Misra-C — Padrão para software em C&quot;&gt;Misra-C — Padrão para software em C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/02/24/como-se-tornar-um-desenvolvedor-de-software-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Como se tornar um desenvolvedor de software embarcado&quot;&gt;Como se tornar um desenvolvedor de software embarcado&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Por que goto é considerado prejudicial?</title>
		<link href="http://software.pedro.lamarao.nom.br/2010/08/por-que-goto-e-considerado-prejudicial.html"/>
		<id>tag:blogger.com,1999:blog-2393468880781945441.post-5345023746414866916</id>
		<updated>2010-08-30T15:37:19+00:00</updated>
		<content type="html">Recentemente, o Fabiano Vasconcelos abriu uma &lt;a href=&quot;http://groups.google.com/group/ccppbrasil/t/179f11adc8c8d634&quot;&gt;discussão&lt;/a&gt; no Grupo de Usuários de C e C++:&lt;br /&gt;&lt;blockquote&gt;De cara eu vi algo aqui um pouco estranho, se que o amigo Márcio me permite comentar: que muitos programadores, inclusive eu (se que posso ser rotulado como programador) foram instruídos com o princípio de NUNCA usar o goto, por ser considerado um mau estilo de programação.&lt;/blockquote&gt;Durante a discussão, o Eduardo Vieira puxou um &lt;a href=&quot;http://kerneltrap.org/node/553/2131&quot;&gt;artigo&lt;/a&gt; da KernelTrap sobre uma discussão similar ocorrida no grupo de desenvolvimento do Linux, onde Robert Wilken disse o seguinte:&lt;br /&gt;&lt;blockquote&gt;In general, if you can structure your code properly, you should never need a goto, and if you don't need a goto you shouldn't use it. It's just &quot;common sense&quot; as I've always been taught. Unless you're intentionally trying to write code that's harder for others to read.&lt;/blockquote&gt;É preciso colocar a máxima &quot;goto considered harmful&quot; na perspectiva histórica adequada.&lt;br /&gt;&lt;br /&gt;Acredito que praticamente todo programador treinado nos últimos vinte anos aprendeu a programar com if e while. Essas são as estruturas básicas de programas e aparecem rapidamente nos manuais e nos cursos de programação. Toda linguagem de programação moderna tem if e while, e variantes como switch, for etc.&lt;br /&gt;&lt;br /&gt;Essas coisas são chamadas estruturas de controle porque fazem exatamente isso: controlam a execução do programa, às vezes indo para uma sequência de sentenças, às vezes indo para outra, de acordo com testes explícitos. Arranjar um programa com sequências de sentenças, if e while é fazer programação estruturada.&lt;br /&gt;&lt;br /&gt;Agora, a não ser que algum curso maravilhoso e desconhecido por mim tenha história da programação no seu currículo, este programador provavelmente não percebe que if e while nem sempre existiram e que a programação estruturada foi inventada mais ou menos na década de 70.&lt;br /&gt;&lt;br /&gt;Durante a discussão no grupo de desenvolvimento do Linux, Scott Robert Ladd disse o seguinte:&lt;br /&gt;&lt;blockquote&gt;Your attitude against &quot;goto&quot; is perhaps based upon an excellent but dated article, &quot;Goto Considered Harmful&quot;, written by Edsger W. Dijkstra, and published by the ACM in 1968. (A recent reprint can be found at http://www.acm.org/classics/oct95/.) As you can tell from the date, this article predates modern programming languages and idioms; it comes from a time when Fortran ruled, and before Fortran 77 provided significant tools for avoiding spaghetti code.&lt;/blockquote&gt;e mais o seguinte:&lt;br /&gt;&lt;blockquote&gt;Used over short distances with well-documented labels, a &quot;goto&quot; can be more effective, faster, and cleaner than a series of complex flags or other constructs. The &quot;goto&quot; may also be safer and more intuitive than the alternative. A &quot;break&quot; is a goto; a &quot;continue&quot; is a &quot;goto&quot; -- these are statements that move the point of execution explicitly.&lt;/blockquote&gt;Dijkstra, e outros, iniciaram a pequena revolta estruturada e assim ocorreu que diversas linguagens de programação introduziram novidades como if e while. Mas como é possível programar sem if e while?&lt;br /&gt;&lt;br /&gt;Considere este fragmento:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;char * i = input;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;while (*i != '\0')&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;if (*i == SPECIAL) goto exit;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;else ++i;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;:exit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;return i;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este fragmento _não_ é o objeto da objeção ao uso de goto. Este fragmento exibe honrada programação estruturada. goto está ali como bem poderia estar break. Tanto faz.&lt;br /&gt;&lt;br /&gt;Agora, observe este fragmento:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;char * i = input;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;:loop&lt;/span&gt;&lt;br /&gt;&lt;span&gt;if (*i == '\0') goto exit;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;if (*i == SPECIAL) goto exit;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;++i;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;goto loop;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;:exit&lt;/span&gt;&lt;br /&gt;&lt;span&gt;return i;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isto é o que você deve evitar.&lt;br /&gt;&lt;br /&gt;O objetivo do combate ao goto era combater a programação não-estruturada, e esse combate foi vencido com a introdução das linguagens estruturadas. Tais linguagens levam o programador naturalmente ao caminho certo e proíbem os maiores absurdos.&lt;br /&gt;&lt;br /&gt;Existem linguagens em que o último fragmento acima era _a única alternativa_. (Ou coisa pior.)&lt;br /&gt;&lt;br /&gt;Em retrospectiva, sabemos que a programação não-estruturada dominante na época causava um modo de pensar não-estruturado sobre os programas, de modo que o &quot;spagetthi code&quot; clássico era um único fluxo de instruções com gotos arbitrários para cima e para baixo, algo muito pior que o último fragmento acima, o tipo de código que eu não saberia construir artificialmente.&lt;br /&gt;&lt;br /&gt;Se você conhece e pratica a programação de acordo com os bons princípios da programação estruturada, não precisa temer o goto. Existem diversas situações excepcionais às quais as estruturas de controle do C não se adequam perfeitamente; aquela que me ocorre com mais frequência são switches dentro de for quando é preciso terminar o for dentro de um case.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;for (char * i = input; *i != '\0'; ++i)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;switch (state)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;case FOO:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; /* many things */&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;case BAR:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; if (*i == SPECIAL) goto exit;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; /* many things */&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span&gt;exit:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sempre existe uma maneira de remover o goto; nem sempre essa maneira é desejável. O goto acima, cujo label está exatamente na saída do laço, me parece uma parte bastante adequada da estrutura de controle. Java, que não possui goto, permite dizer &quot;break exit&quot;, com exatamente o mesmo significado.&lt;br /&gt;&lt;br /&gt;Durante a discussão no grupo de desenvolvimento do Linux, Robert Love disse o seguinte sobre a substituição do goto por outras estruturas:&lt;br /&gt;&lt;blockquote&gt;As a final argument, it does not let us cleanly do the usual stack-esque wind and unwind, i.e.&lt;/blockquote&gt;&lt;span&gt;do A&lt;/span&gt;&lt;br /&gt;&lt;span&gt;if (error) goto out_a;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;do B &lt;/span&gt;&lt;br /&gt;&lt;span&gt;if (error) goto out_b;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;do C&lt;/span&gt;&lt;br /&gt;&lt;span&gt;if (error) goto out_c;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;goto out;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out_c:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;undo C&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out_b:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;undo B:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out_a:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;undo A&lt;/span&gt;&lt;br /&gt;&lt;span&gt;out:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;return ret;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Now stop this.&lt;/blockquote&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2393468880781945441-5345023746414866916?l=software.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://software.pedro.lamarao.nom.br/search/label/cxx</uri>
		</author>
		<source>
			<title type="html">Pedro sobre Software</title>
			<subtitle type="html">Artigos sobre usar software e fazer software. E, às vezes, algum apócrifo sobre hardware.</subtitle>
			<link rel="self" href="http://software.pedro.lamarao.nom.br/feeds/posts/default/-/cxx"/>
			<id>tag:blogger.com,1999:blog-2393468880781945441</id>
			<updated>2010-09-01T09:55:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mini2440 — Linux com U-Boot e Emdebian</title>
		<link href="http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/"/>
		<id>http://www.sergioprado.org/?p=852</id>
		<updated>2010-08-30T11:00:07+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;No &amp;uacute;ltimo artigo vimos com mais detalhes a arquitetura do kit FriendlyARM mini2440 e o bootloader que vem instalado de f&amp;aacute;brica. Quem ainda n&amp;atilde;o leu este post, pode acess&amp;aacute;-lo &lt;a href=&quot;http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Vamos agora colocar a m&amp;atilde;o na massa. Nosso objetivo aqui &amp;eacute; carregar na flash NAND o bootloader &lt;a href=&quot;http://www.denx.de/wiki/U-Boot&quot; target=&quot;_blank&quot;&gt;U-Boot&lt;/a&gt;, bastante usado em sistemas embarcados, e depois faz&amp;ecirc;-lo carregar uma imagem do &lt;a href=&quot;http://www.emdebian.org/&quot; target=&quot;_blank&quot;&gt;Emdebian&lt;/a&gt;, uma vers&amp;atilde;o do Debian mais leve.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O &amp;uacute;nico pr&amp;eacute;-requisito &amp;eacute; um kit FriendlyARM mini2440 conectado &amp;agrave; uma m&amp;aacute;quina Linux pela serial (para acessar a console), pela USB (para transferir a imagem do U-boot) e por um cabo de rede (para carregar as imagens do kernel e do rootfs do Emdebian).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Usei o bin&amp;aacute;rio do U-boot deste link &lt;a href=&quot;http://mini2440.spaceopera.org/site/servlet/org.meshcms.core.DownloadServlet/androidonthemini2440/files/android-install-kit-mini2440.tar.gz&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;. O kernel eu baixei &lt;a href=&quot;http://www.friendlyarm.net/dl.php?file=android-kernel_20090825.tgz&quot; target=&quot;_blank&quot;&gt;daqui&lt;/a&gt;, mas precisei customiz&amp;aacute;-lo para habilitar o suporte &amp;agrave; sistema de arquivos JFFS2 e corrigir o mapeamento das parti&amp;ccedil;&amp;otilde;es da MTD no driver da Flash. O rootfs eu peguei &lt;a href=&quot;http://mini2440.googlecode.com/files/emdebian-grip-090306-armel-lenny-installed.tar.bz2&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;, mas tamb&amp;eacute;m precisei &amp;quot;dar um tapa&amp;quot;, e corrigir um problema que impedia de subir o terminal pela console RS232.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Para facilitar o trabalho daqueles que ir&amp;atilde;o executar este passo-a-passo, criei um &amp;quot;pacote especial&amp;quot; com todas as ferramentas e imagens necess&amp;aacute;rias para dar vida ao Emdebian no mini2440. Este pacote pode ser baixado &lt;a href=&quot;http://rapidshare.com/files/415759764/uboot-emdebian.tar.gz.html&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;. Descompacte-o para sua m&amp;aacute;quina e m&amp;atilde;os &amp;agrave; obra!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;Bootloader U-Boot&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O bootloader &amp;eacute; uma aplica&amp;ccedil;&amp;atilde;o que &amp;eacute; carregada e executada assim que o hardware &amp;eacute; ligado. No universo desktop, estamos familiarizados com o LILO ou o GRUB para carregar sistemas Unix-like, mas no universo embedded as coisas s&amp;atilde;o um pouco mais complicadas. Um bootloader para sistemas embarcados possui 3 principais responsabilidades:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Inicializar o hardware.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Possibilitar a carga e grava&amp;ccedil;&amp;atilde;o da aplica&amp;ccedil;&amp;atilde;o na flash via alguma interface de I/O, como porta serial, USB ou interface de rede.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Carregar e executar aplica&amp;ccedil;&amp;otilde;es da RAM.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Um bootloader bem conhecido no universo embedded &amp;eacute; o Das U-Boot, tamb&amp;eacute;m conhecido apenas como U-Boot, um bootloader multi-plataforma e open-source, com suporte &amp;agrave; diversas arquiteturas como PowerPC, ARM, MIPS, Coldfire e x86. A p&amp;aacute;gina do projeto pode ser acessada &lt;a href=&quot;http://www.denx.de/wiki/U-Boot&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O U-Boot ser&amp;aacute; o bootloader que utilizaremos para carregar o Emdebian pela NAND. O processo para carregar e gravar o U-Boot na flash &amp;eacute; simples.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Primeiro iremos carregar a imagem do U-Boot na RAM. Para isso precisaremos da imagem do U-Boot (&amp;quot;u-boot-256M.bin&amp;quot; ou &amp;quot;u-boot-128M.bin&amp;quot;, dependendo do seu kit), e da ferramenta &amp;quot;usbpush&amp;quot;. Todos os arquivos encontram-se no link que passei no in&amp;iacute;cio deste post. N&amp;atilde;o esque&amp;ccedil;a tamb&amp;eacute;m que a serial e a USB devem estar conectadas.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Inicie o kit pela NOR, no menu do supervivi selecione a op&amp;ccedil;&amp;atilde;o &amp;quot;q&amp;quot; e&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;prepare-o para receber a imagem do U-Boot e salvar em RAM:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;q&lt;span&gt;&amp;#93;&lt;/span&gt; Goto shell of vivi
Enter your selection&lt;span&gt;:&lt;/span&gt; q
Supervivi&lt;span&gt;&amp;gt;&lt;/span&gt; load ram &lt;span&gt;0x31000000&lt;/span&gt; &lt;span&gt;242360&lt;/span&gt; u&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Obs: O par&amp;acirc;metro &amp;quot;242360&amp;quot; deve ser o tamanho em bytes da imagem do U-Boot (&amp;quot;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;u-boot-256M.bin&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;quot; para a flash de 256M no meu caso).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ent&amp;atilde;o, em um shell do Linux, digite o comando abaixo:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ sudo .&lt;span&gt;/&lt;/span&gt;usbpush u&lt;span&gt;-&lt;/span&gt;boot&lt;span&gt;-&lt;/span&gt;256M.&lt;span&gt;bin&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;A console ir&amp;aacute; exibir uma mensagem indicando que a transfer&amp;ecirc;ncia foi realizada com sucesso.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Agora iremos executar o U-Boot da RAM mesmo, assim podemos formatar a NAND e depois copiar o U-Boot para l&amp;aacute;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Digite ent&amp;atilde;o na console do mini2440:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;Supervivi&lt;span&gt;&amp;gt;&lt;/span&gt; go &lt;span&gt;0x31000000&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ap&amp;oacute;s algumas mensagens, ir&amp;aacute; aparecer o shell do U-Boot.&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Agora vamos formatar a flash. A execu&amp;ccedil;&amp;atilde;o dos comandos abaixo podem demorar um pouco, portanto tenha paci&amp;ecirc;ncia :)&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# nand scrub&lt;/span&gt;
....
&lt;span&gt;MINI2440&lt;/span&gt; &lt;span&gt;# nand createbbt&lt;/span&gt;
....&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Depois &amp;eacute; s&amp;oacute; escrever o U-Boot na flash Nand.&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# nand write.e 0x31000000 0 242360&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Obs: N&amp;atilde;o se esque&amp;ccedil;a de que novamente o par&amp;acirc;metro &amp;quot;242360&amp;quot; deve ser o tamanho em bytes da imagem do U-Boot.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Muito bem. Voc&amp;ecirc; acabou de instalar o U-Boot na sua flash NAND. Desligue a placa, mude a chave para bootar pela NAND para a console cair no shell do U-Boot.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Este bootloader tem bastante recursos. O comando &amp;quot;help&amp;quot; vai exibir uma lista. Podemos por exemplo listar informa&amp;ccedil;&amp;otilde;es da placa ou das parti&amp;ccedil;&amp;otilde;es da flash, conforme abaixo:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# bdinfo&lt;/span&gt;
arch_number &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x000007CF&lt;/span&gt;
env_t       &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x00000000&lt;/span&gt;
boot_params &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x30000100&lt;/span&gt;
DRAM bank   &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x00000000&lt;/span&gt;
&lt;span&gt;-&amp;gt;&lt;/span&gt; start    &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x30000000&lt;/span&gt;
&lt;span&gt;-&amp;gt;&lt;/span&gt; size     &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x04000000&lt;/span&gt;
ethaddr     &lt;span&gt;=&lt;/span&gt; &lt;span&gt;08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;27&lt;/span&gt;
ip_addr     &lt;span&gt;=&lt;/span&gt; 10.0.0.111
baudrate    &lt;span&gt;=&lt;/span&gt; &lt;span&gt;115200&lt;/span&gt; bps
&amp;nbsp;
MINI2440 &lt;span&gt;# mtdparts &lt;/span&gt;
device nand0 &lt;span&gt;&amp;lt;&lt;/span&gt;mini2440&lt;span&gt;-&lt;/span&gt;nand&lt;span&gt;&amp;gt;,&lt;/span&gt; &lt;span&gt;# parts = 4&lt;/span&gt;
 &lt;span&gt;#: name                size            offset          mask_flags&lt;/span&gt;
 &lt;span&gt;0&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; u&lt;span&gt;-&lt;/span&gt;boot              &lt;span&gt;0x00040000&lt;/span&gt;      &lt;span&gt;0x00000000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
 &lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; env                 &lt;span&gt;0x00020000&lt;/span&gt;      &lt;span&gt;0x00040000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
 &lt;span&gt;2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; kernel              &lt;span&gt;0x00500000&lt;/span&gt;      &lt;span&gt;0x00060000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
 &lt;span&gt;3&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; root                &lt;span&gt;0x0faa0000&lt;/span&gt;      &lt;span&gt;0x00560000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
active partition&lt;span&gt;:&lt;/span&gt; nand0&lt;span&gt;,&lt;/span&gt;&lt;span&gt;0&lt;/span&gt; &lt;span&gt;-&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;u&lt;span&gt;-&lt;/span&gt;boot&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;0x00040000&lt;/span&gt; @ &lt;span&gt;0x00000000&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;mini2440&lt;span&gt;-&lt;/span&gt;nand&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Podemos carregar uma aplica&amp;ccedil;&amp;atilde;o via serial com os comandos &amp;quot;loadb&amp;quot;, &amp;quot;loads&amp;quot; e &amp;quot;loady&amp;quot;, via NFS com o comando &amp;quot;nfs&amp;quot;, via TFTP com o comando &amp;quot;tftpboot&amp;quot; ou via USB com o comando &amp;quot;usbboot&amp;quot;. Podemos tamb&amp;eacute;m testar a RAM com os comandos &amp;quot;mtest&amp;quot; e &amp;quot;mw&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Carregando o Emdebian&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O Emdebian &amp;eacute; uma vers&amp;atilde;o do Debian para sistemas embarcados. Mant&amp;eacute;m as principais caracter&amp;iacute;sticas do Debian, como sistema de gerenciamento de pacotes, sistema de licen&amp;ccedil;as e portabilidade entre diversas plataformas. O sistema de build &amp;eacute; customizado para trabalhar com pacotes pequenos e gerar distribui&amp;ccedil;&amp;otilde;es bem mais leves. A p&amp;aacute;gina do projeto pode ser acessada &lt;a href=&quot;http://www.emdebian.org/&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A carga do kernel (&amp;quot;uImage&amp;quot;) e do rootfs (&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;emdebian-jffs2.img&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;quot;) &amp;eacute; feita atrav&amp;eacute;s de uma conex&amp;atilde;o de rede. Ligue seu PC com o mini2440 atrav&amp;eacute;s de um cabo de rede, configure o endere&amp;ccedil;o IP do seu PC com 10.0.0.1, e o do kit com 10.0.0.2. Configure o mini2440 atrav&amp;eacute;s dos comandos abaixo na console do U-Boot:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# dynenv set 40000&lt;/span&gt;
MINI2440 &lt;span&gt;# setenv ipaddr 10.0.0.2&lt;/span&gt;
MINI2440 &lt;span&gt;# setenv serverip 10.0.0.1&lt;/span&gt;
MINI2440 &lt;span&gt;# saveenv&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Use o comando &amp;quot;ping 10.0.0.1&amp;quot; na console do U-Boot para verificar se a conex&amp;atilde;o com o PC est&amp;aacute; funcionando corretamente.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Vamos agora gravar o kernel. O processo consiste em carregar a imagem do kernel para a RAM, e ent&amp;atilde;o de l&amp;aacute; gravar na flash:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# tftp 0x31000000 uImage&lt;/span&gt;
MINI2440 &lt;span&gt;# nand erase kernel&lt;/span&gt;
MINI2440 &lt;span&gt;# nand write.e 0x31000000 kernel 0x205f58&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Para o rootfs, o processo &amp;eacute; id&amp;ecirc;ntico:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# tftp 0x31000000 emdebian-jffs2.img&lt;/span&gt;
MINI2440 &lt;span&gt;# nand erase root &lt;/span&gt;
MINI2440 &lt;span&gt;# nand write.e 0x31000000 root 0x23e0000&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Agora s&amp;oacute; falta setar as vari&amp;aacute;veis de ambiente do U-Boot para iniciar o kernel do Linux corretamente:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;MINI2440 &lt;span&gt;# setenv bootcmd nboot.e kernel ; bootm&lt;/span&gt;
MINI2440 &lt;span&gt;# setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200&lt;/span&gt;
MINI2440 &lt;span&gt;# saveenv&lt;/span&gt;
MINI2440 &lt;span&gt;# boot&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Pronto! O Emdebian j&amp;aacute; est&amp;aacute; rodando no nosso kit mini2440:&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
	&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;294&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/mini2440-emdebian.png&quot; width=&quot;500&quot; /&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Quando comecei a escrever este post, minha inten&amp;ccedil;&amp;atilde;o original era carregar o &lt;a href=&quot;http://www.android.com/&quot; target=&quot;_blank&quot;&gt;Android&lt;/a&gt;, mas acabei &amp;quot;descobrindo&amp;quot; durante o processo que a quantidade de RAM do mini2440 (64M) n&amp;atilde;o &amp;eacute; suficiente para este SO. O que o pessoal acabou fazendo foi rod&amp;aacute;-lo a partir de um cart&amp;atilde;o de mem&amp;oacute;ria SD usando um mecanismo de swap. Se isso funciona mesmo ou n&amp;atilde;o, veremos no meu pr&amp;oacute;ximo post...:)&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Memory layout e bootloader&quot;&gt;Mini2440 — Memory layout e bootloader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Kit de desenvolvimento FriendlyARM mini2440&quot;&gt;Kit de desenvolvimento FriendlyARM mini2440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Vídeo: Introdução ao Linux Embarcado&quot;&gt;Vídeo: Introdução ao Linux Embarcado&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Leptoniando: Toda computação é sempre física</title>
		<link href=""/>
		<id>http://techberto.wordpress.com/?p=220</id>
		<updated>2010-08-25T17:46:11+00:00</updated>
		<content type="html">Seja C, C++, Python, Java, Ruby ou Brainf*ck, independente de sua linguagem preferida, durante a análise léxica, sintática, semântica, geração do código executável ou em qualquer outra operação, na execução de programas, independente da arquitetura de run-time e dependência que ela tenha, seja instruções bare-metal ou dependente de algum sistema operacional, rodando na CPU de [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=220&amp;subd=techberto&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">“Duvida basica de ponteiros de c”</title>
		<link href="http://wend.elmaqu.es/?p=133"/>
		<id>http://wend.elmaqu.es/?p=133</id>
		<updated>2010-08-24T23:53:35+00:00</updated>
		<content type="html">Então, essa é básica e ocorre aos montes quando estamos iniciando em C, segue abaixo uma discussão bem interessante entre os veteranos da cppbrasil. O bom da cppbrasil é que as respostas são ótimas, bem esclarecedoras. Eita comunidade pequena, mas organizada essa do C++. A dúvida abaixo é do &amp;#8220;Diego Henrique Oliveira&amp;#8221;: Galera, to com [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Beginner’s Guide to Linkers</title>
		<link href="http://wend.elmaqu.es/?p=129"/>
		<id>http://wend.elmaqu.es/?p=129</id>
		<updated>2010-08-23T18:01:42+00:00</updated>
		<content type="html">Beginner&amp;#8217;s Guide to Linkers This article is intended to help C &amp;#38; C++ programmers understand the essentials of what the linker does. I&amp;#8217;ve explained this to a number of colleagues over the years, so I decided it was time to write it down so that it&amp;#8217;s more widely available (and so that I don&amp;#8217;t have [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mini2440 — Memory layout e bootloader</title>
		<link href="http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/"/>
		<id>http://www.sergioprado.org/?p=801</id>
		<updated>2010-08-17T16:13:13+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;Recentemente comprei o kit &lt;a href=&quot;http://www.friendlyarm.net/products/mini2440&quot; target=&quot;_blank&quot;&gt;FriendlyARM Mini2440&lt;/a&gt;, e escrevi um post introdut&amp;oacute;rio sobre ele &lt;a href=&quot;http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Minhas impress&amp;otilde;es iniciais s&amp;atilde;o muito boas. Ele &amp;eacute; possivelmente um dos melhores kits existentes (que conhe&amp;ccedil;o) para se aprender sobre Linux embarcado, por ser um hardware robusto, pelas ferramentas existentes e pela rela&amp;ccedil;&amp;atilde;o custo/benef&amp;iacute;cio.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Vamos ver ent&amp;atilde;o com um pouco mais de detalhes a arquitetura da CPU, o layout de mem&amp;oacute;ria e o bootloader que vem instalado de f&amp;aacute;brica.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;CPU E O LAYOUT DE MEM&amp;Oacute;RIA&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O kit, com todas as suas interfaces de I/O e mem&amp;oacute;ria, pode ser visto na figura abaixo:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;img alt=&quot;&quot; height=&quot;400&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/mini2440(1).png&quot; width=&quot;580&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A CPU &amp;eacute; um&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot;&gt;Samsung &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;S3C2440 baseado no core&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/ARM9&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;RM920T&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;, RISC, arquitetura Harvard e voltado para aplica&amp;ccedil;&amp;otilde;es de baixo consumo. O datasheet pode ser baixado &lt;a href=&quot;http://www.armkits.com/download/s3c2440.pdf&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Tem capacidade de endere&amp;ccedil;amento de at&amp;eacute; 1GB, sendo 8 bancos de mem&amp;oacute;ria de 128M selecion&amp;aacute;veis atrav&amp;eacute;s de 8 chip select's (nGCS0...nGCS7).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A mem&amp;oacute;ria RAM de 64MB (2 x 32MB) est&amp;aacute; mapeada para o endere&amp;ccedil;o f&amp;iacute;sico 0x30000000&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot;&gt;atrav&amp;eacute;s do nGCS6.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Existem duas mem&amp;oacute;rias de programa neste kit, o que acaba sendo um diferencial perante outros kits ARM voltados para aprendizado. O kit possui 2MB de mem&amp;oacute;ria flash do tipo NOR e 64MB de mem&amp;oacute;ria flash do tipo NAND.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Para quem n&amp;atilde;o conhece, vale aqui uma explica&amp;ccedil;&amp;atilde;o sobre as diferen&amp;ccedil;as entre estes dois tipos de mem&amp;oacute;ria.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Ambas foram inventadas na d&amp;eacute;cada de 80 pela Toshiba. As primeiras mem&amp;oacute;rias NOR foram vendidas pela Intel em 88. Com tempo de resposta para apagar e escrever muito grande, mas com a possibilidade de acesso &amp;agrave; leitura em qualquer posi&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria, foi uma aplica&amp;ccedil;&amp;atilde;o ideal para mem&amp;oacute;rias do tipo ROM, para armazenar programas que dificilmente s&amp;atilde;o alterados, como a BIOS de PCs &amp;nbsp;e firmware de equipamentos eletr&amp;ocirc;nicos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;J&amp;aacute; as mem&amp;oacute;rias do tipo NAND possui um tempo de escrita bem menor, e uma maior densidade, ou seja, mais MB de dados pelo mesmo espa&amp;ccedil;o se comparados com as mem&amp;oacute;rias NOR. Por outro lado, n&amp;atilde;o &amp;eacute; poss&amp;iacute;vel acesso de leitura &amp;agrave; qualquer posi&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria. A leitura e grava&amp;ccedil;&amp;atilde;o &amp;eacute; feita por blocos de mem&amp;oacute;ria (4kB por exemplo). Isso d&amp;aacute; a ela a aplica&amp;ccedil;&amp;atilde;o ideal para armazenamento de dados. Quando usada como mem&amp;oacute;ria de programa, &amp;eacute; necess&amp;aacute;rio ter um bootloader que carrega seu conte&amp;uacute;do em mem&amp;oacute;ria RAM para ser executado.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O kit mini2440 consegue fazer o boot pelas duas mem&amp;oacute;rias atrav&amp;eacute;s de uma chave (NAND &amp;lt;-&amp;gt; NOR) no canto inferior direito da imagem acima.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Ao fazer o boot pela NAND, a CPU possui uma regi&amp;atilde;o especial chamada de&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;quot;Boot internal SRAM&amp;quot;, onde s&amp;atilde;o carregados e executados os primeiros 4KB da NAND. Estes primeiros 4K de programa ser&amp;atilde;o os respons&amp;aacute;veis por carregar o resto do programa da NAND para a RAM, e rodar a aplica&amp;ccedil;&amp;atilde;o a partir de l&amp;aacute;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ao fazer o boot pela NOR, &amp;eacute; carregado o bootloader Supervivi,&amp;nbsp;que v&amp;ecirc;m instalado de f&amp;aacute;brica. Ele &amp;eacute;&amp;nbsp;baseado no bootloader open source vivi da Samsung. Vamos dar uma olhada nele com mais detalhes.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;BOOTLOADER SUPERVIVI&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Para acessar o bootloader ligue os cabos RS323 e USB e deixe a chave de sele&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria na posi&amp;ccedil;&amp;atilde;o NOR. Voc&amp;ecirc; pode usar qualquer aplica&amp;ccedil;&amp;atilde;o para consoles como o &lt;a href=&quot;http://technet.microsoft.com/en-us/library/bb457166.aspx&quot; target=&quot;_blank&quot;&gt;HyperTerminal&lt;/a&gt; para Windows ou o &lt;a href=&quot;http://alioth.debian.org/projects/minicom/&quot; target=&quot;_blank&quot;&gt;minicom&lt;/a&gt; para Linux. Este &amp;eacute; o menu inicial do bootloader Supervivi:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;364&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/supervivi_menu.png&quot; width=&quot;479&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A op&amp;ccedil;&amp;atilde;o &amp;quot;q&amp;quot; oferece um shell para o bootloader e as outras op&amp;ccedil;&amp;otilde;es automatizam determinada tarefa.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Apesar da manipula&amp;ccedil;&amp;atilde;o do bootloader ser pela console (porta serial), a transfer&amp;ecirc;ncia de arquivos &amp;eacute; pela USB. Voc&amp;ecirc; vai precisar de uma aplica&amp;ccedil;&amp;atilde;o adicional para transferir arquivos e imagens: &lt;a href=&quot;http://www.friendlyarm.net/dl.php?file=dnw.zip&quot; target=&quot;_blank&quot;&gt;DNW for Windows&lt;/a&gt;&amp;nbsp;ou &lt;a href=&quot;http://www.friendlyarm.net/dl.php?file=usbpush.tar.gz&quot; target=&quot;_blank&quot;&gt;Usb-push for Linux&lt;/a&gt;.&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot;&gt;Nos nossos exemplos usaremos um PC com Linux, mas os procedimentos com Windows s&amp;atilde;o similares, e mais informa&amp;ccedil;&amp;otilde;es podem ser encontradas no manual de usu&amp;aacute;rio do kit &lt;a href=&quot;http://www.friendlyarm.net/dl.php?file=download.pdf&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;CARREGANDO UMA APLICA&amp;Ccedil;&amp;Atilde;O STANDALONE&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Para carregar uma aplica&amp;ccedil;&amp;atilde;o standalone na flash NAND, basta usar a op&amp;ccedil;&amp;atilde;o &amp;quot;a&amp;quot;. Esta aplica&amp;ccedil;&amp;atilde;o standalone pode ser qualquer bin&amp;aacute;rio pronto para execu&amp;ccedil;&amp;atilde;o. Pode ser uma simples aplica&amp;ccedil;&amp;atilde;o para piscar leds ou uma aplica&amp;ccedil;&amp;atilde;o mais completa com RTOS. Vamos carregar aqui o bin&amp;aacute;rio &amp;quot;myled.bin&amp;quot; na flash, que vem como exemplo junto com o kit:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Primeiro devemos preparar o bootloader para carregar o arquivo com a op&amp;ccedil;&amp;atilde;o &amp;quot;a&amp;quot;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;a&lt;span&gt;&amp;#93;&lt;/span&gt; Absolute User Application
Enter your selection&lt;span&gt;:&lt;/span&gt; a
USB host is connected. &lt;span&gt;Waiting&lt;/span&gt; a download.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Depois devemos disparar a transfer&amp;ecirc;ncia com a aplica&amp;ccedil;&amp;atilde;o usb-push:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ sudo .&lt;span&gt;/&lt;/span&gt;usbpush &lt;span&gt;/&lt;/span&gt;media&lt;span&gt;/&lt;/span&gt;cdrom0&lt;span&gt;/&lt;/span&gt;sample\ code\ without\ OS&lt;span&gt;/&lt;/span&gt;myled.&lt;span&gt;bin&lt;/span&gt;
csum &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x83c6&lt;/span&gt;
send_file&lt;span&gt;:&lt;/span&gt; addr &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x30000000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; len &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x0000084c&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O bootloader vai exibir o status da transfer&amp;ecirc;ncia:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;Now&lt;span&gt;,&lt;/span&gt; Downloading &lt;span&gt;&amp;#91;&lt;/span&gt;ADDRESS&lt;span&gt;:&lt;/span&gt;30000000h&lt;span&gt;,&lt;/span&gt;TOTAL&lt;span&gt;:&lt;/span&gt;&lt;span&gt;2134&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;
RECEIVED FILE SIZE&lt;span&gt;:&lt;/span&gt;    &lt;span&gt;2134&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;2KB&lt;span&gt;/&lt;/span&gt;S&lt;span&gt;,&lt;/span&gt; 1S&lt;span&gt;&amp;#41;&lt;/span&gt;
Downloaded file at &lt;span&gt;0x30000000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; size &lt;span&gt;=&lt;/span&gt; &lt;span&gt;2124&lt;/span&gt; bytes
Write to flash ok&lt;span&gt;:&lt;/span&gt; skipped size &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; size &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0x84c&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ent&amp;atilde;o &amp;eacute; s&amp;oacute; mudar a chave para NAND e reiniciar o kit.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;div&gt;&amp;nbsp;&lt;/div&gt;
	&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Vale aqui ressaltar um detalhe que j&amp;aacute; expliquei mais acima: como sua aplica&amp;ccedil;&amp;atilde;o esta rodando pela NAND, o processador vai carregar os primeiros 4K para a SRAM interna e executar. Portanto, os primeiros 4K da sua aplica&amp;ccedil;&amp;atilde;o dever&amp;aacute; ter um c&amp;oacute;digo para copiar seu conte&amp;uacute;do para a RAM e ent&amp;atilde;o bootar a aplica&amp;ccedil;&amp;atilde;o de l&amp;aacute;.&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&amp;nbsp;&lt;/div&gt;
	&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;strong&gt;CARREGANDO O LINUX&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&amp;nbsp;&lt;/div&gt;
	&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O bootloader divide a flash em 4 parti&amp;ccedil;&amp;otilde;es. Acesse o menu do bootloader com a op&amp;ccedil;&amp;atilde;o &amp;quot;q&amp;quot; e digite o comando &amp;quot;part show&amp;quot;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&amp;nbsp;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;Supervivi&lt;span&gt;&amp;gt;&lt;/span&gt; part show
Number of partitions&lt;span&gt;:&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;
name            &lt;span&gt;:&lt;/span&gt;       offset          size            flag
&lt;span&gt;------------------------------------------------------------&lt;/span&gt;
vivi            &lt;span&gt;:&lt;/span&gt;       &lt;span&gt;0x00000000&lt;/span&gt;      &lt;span&gt;0x00040000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
param           &lt;span&gt;:&lt;/span&gt;       &lt;span&gt;0x00040000&lt;/span&gt;      &lt;span&gt;0x00020000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
kernel          &lt;span&gt;:&lt;/span&gt;       &lt;span&gt;0x00060000&lt;/span&gt;      &lt;span&gt;0x00500000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;
root            &lt;span&gt;:&lt;/span&gt;       &lt;span&gt;0x00560000&lt;/span&gt;      &lt;span&gt;0x3fa80000&lt;/span&gt;      &lt;span&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



	&lt;div&gt;&lt;span&gt;&lt;span&gt;Na primeira parti&amp;ccedil;&amp;atilde;o est&amp;aacute; o pr&amp;oacute;prio bootloader da NAND, a segunda &amp;eacute; uma regi&amp;atilde;o para armazenar par&amp;acirc;metros e vari&amp;aacute;veis usadas pelo bootloader, na terceira est&amp;aacute; o kernel e na quarta o rootfs.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Esta forma de trabalho facilita o desenvolvimento, porque voc&amp;ecirc; pode fazer altera&amp;ccedil;&amp;otilde;es no rootfs sem ter que alterar o kernel, por exemplo.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Para ent&amp;atilde;o carregar o linux, o processo &amp;eacute; bem parecido com a aplica&amp;ccedil;&amp;atilde;o standalone explicada acima. A diferen&amp;ccedil;a &amp;eacute; que voc&amp;ecirc; vai precisar executar separadamente os comandos &amp;quot;v&amp;quot; para o bootloader, &amp;quot;k&amp;quot; para o kernel e &amp;quot;y&amp;quot; para o rootfs.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;O QUE MAIS POSSO FAZER COM ESTE BOOTLOADER&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Voc&amp;ecirc; pode ainda carregar um WINDOWS CE (op&amp;ccedil;&amp;otilde;es &amp;quot;n&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;w&amp;quot;), carregar uma aplica&amp;ccedil;&amp;atilde;o diretamente para a mem&amp;oacute;ria e rodar de l&amp;aacute; (op&amp;ccedil;&amp;atilde;o &amp;quot;d&amp;quot;), formatar a flash (op&amp;ccedil;&amp;atilde;o &amp;quot;f&amp;quot;) e at&amp;eacute; fazer backup/restore&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;da NAND&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;(op&amp;ccedil;&amp;otilde;es &amp;quot;u&amp;quot; e &amp;quot;r&amp;quot;).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;A regra aqui &amp;eacute; usar o bootloader Supervivi na mem&amp;oacute;ria NOR para manipular a flash NAND, e assim n&amp;atilde;o correr o risco de travar o kit. Se voc&amp;ecirc; apagar o conte&amp;uacute;do da NOR, s&amp;oacute; com um JTAG para voc&amp;ecirc; carregar novamente o bootloader.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Este bootloader, apesar de ajudar inicialmente, tem algumas defici&amp;ecirc;ncias, como suportar apenas sistemas de arquivo yaffs. No pr&amp;oacute;ximo post vamos carregar o u-boot, um bootloader bem mais flexivel, e brincar um pouco com o Android. At&amp;eacute; l&amp;aacute;!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Kit de desenvolvimento FriendlyARM mini2440&quot;&gt;Kit de desenvolvimento FriendlyARM mini2440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Linux com U-Boot e Emdebian&quot;&gt;Mini2440 — Linux com U-Boot e Emdebian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Memory leak em linguagem C&quot;&gt;Memory leak em linguagem C&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Evento C++</title>
		<link href="http://www.caloni.com.br/blog/archives/evento-c"/>
		<id>http://www.caloni.com.br/blog/archives/evento-c</id>
		<updated>2010-08-16T16:36:58+00:00</updated>
		<content type="html">&lt;p&gt;Esse fim-de-semana houve o tão falado evento C++, com a presença de dezenas de pessoas, algo que eu sinceramente não esperava. O bom desse evento foi saber que existem tantas pessoas interessadas em manter contato com quem gosta e pratica essa linguagem e também em saber que o nível técnico das palestras estão de alto para avançado.&lt;/p&gt;
&lt;p&gt;Infelizmente em nenhuma das duas palestras práticas (minha e do Fernando) houve participação interativa, e ninguém que eu saiba abriu meu pacote-surpresa com os dumps a serem analisados. De qualquer forma, minha palestra ficou bagunçada pelo excesso de conteúdo e falta de tempo, o que me fez dar boas risadas ao ouvir no twitter que &lt;a href=&quot;http://twitter.com/nicolasgavlak/status/21201995301&quot; title=&quot;Twitter&quot;&gt;minha palestra foi mais um brainstorm&lt;/a&gt;. A intenção não era essa, claro, mas meu claro despreparo para muito conteúdo gerou essa impressão. Espero que do pouco que consegui explicar alguém tenha achado utilidade.&lt;/p&gt;
&lt;p&gt;E, pelo jeito, futuramente irei aplicar essa mesma metodologia brainstorm em um videocast, que ainda não decidi como irei preparar. A ideia é analisarmos alguns dumps em conjunto e, para os que acompanharem online, a interatividade de perguntas &amp;amp; respostas.&lt;/p&gt;
&lt;p&gt;Mas enquanto isso não acontece vamos dar uma olhada no que tínhamos no &lt;a href=&quot;http://www.caloni.com.br/blog/archives/nao-e-minha-culpa&quot;&gt;pacote-surpresa&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;1. NotMyFaultEither.exe.mdmp - Stack Trash&lt;/h4&gt;
&lt;pre&gt;0:000&amp;gt; kv
ChildEBP RetAddr  Args to Child
0012b200 7c90df3c 7c8025db 000000e8 00000000 ntdll!KiFastSystemCallRet
0012b204 7c8025db 000000e8 00000000 0012b238 ntdll!NtWaitForSingleObject+0xc
0012b268 7c802542 000000e8 000493e0 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012b27c 6998ada6 000000e8 000493e0 003a0043 kernel32!WaitForSingleObject+0x12
0012bd70 6998aff1 000000c4 00000568 000000d0 faultrep!InternalGenerateMinidumpEx+0x335
0012bd9c 6998b50a 000000c4 00000568 0012c698 faultrep!InternalGenerateMinidump+0x75
0012c678 69986652 000000c4 00000568 0012c698 faultrep!InternalGenFullAndTriageMinidumps+0x8a
0012dea0 69987d3d 0012df18 0015c300 00000000 faultrep!ReportFaultDWM+0x4e5
0012e398 699882d8 0040a1dc 0012f1e0 ffffffff faultrep!StartManifestReportImmediate+0x268
0012f404 7c8643c6 0040a1dc ffffffff 0012fc24 faultrep!ReportFault+0x55a
Unable to load image C:\Documents and Settings\Administrador\Desktop\NotMyFaultEither.exe
*** WARNING: Unable to verify timestamp for NotMyFaultEither.exe
*** ERROR: Module load completed but symbols could not be loaded for NotMyFaultEither.exe
0012f678 004018aa 0040a1dc e280eec4 1d7f113b kernel32!UnhandledExceptionFilter+0x55b
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9ac 00401357 &lt;font color=&quot;#ff0000&quot;&gt;dededede dededede dededede&lt;/font&gt; NotMyFaultEither+0x18aa
0012fbe8 &lt;font color=&quot;#ff0000&quot;&gt;dededede dededede dededede dededede&lt;/font&gt; NotMyFaultEither+0x1357
0012fbec &lt;font color=&quot;#ff0000&quot;&gt;dededede dededede dededede dededede&lt;/font&gt; 0xdededede
0012fbf4 &lt;font color=&quot;#ff0000&quot;&gt;dededede dededede dededede dededede&lt;/font&gt; 0xdededede
...&lt;/pre&gt;
&lt;p&gt;Como foi visto na palestra, uma pilha nesse estado demonstra claramente alguma variável que estourou e corrompeu o resto da pilha de chamadas. Na hora de voltar para a função chamadora, o endereço usado foi o endereço reescrito por lixo, e daí temos o &quot;crash-pattern&quot; Stack Trash.&lt;/p&gt;
&lt;h4&gt;2. NotMyFaultEither.mdmp - Dead Lock&lt;/h4&gt;
&lt;pre&gt;0:000&amp;gt; kv
ChildEBP RetAddr  Args to Child
0012f900 7c90df3c 7c8025db 0000007c 00000000 ntdll!KiFastSystemCallRet
0012f904 7c8025db &lt;font color=&quot;#ff0000&quot;&gt;0000007c &lt;/font&gt;00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0012f968 7c802542 0000007c ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012f97c 00401176 0000007c ffffffff 00000111 kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9c0 7c910202 00000002 001506e8 00150000 NotMyFaultEither+0x1176
0012f9f8 7e3746d3 01010050 00000000 00000000 ntdll!RtlpAllocateFromHeapLookaside+0x42
0012fa5c 7e382672 01010050 01100068 7e3a4716 user32!DrawStateW+0x5cd
0012fae8 7e382c75 001563ac 01010050 00000003 user32!xxxBNDrawText+0x313
0012fb20 002d0036 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x2d0036
0012fb3c 7e375ba2 0000800a 002d0036 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 002d0036 004011b0 dcbaabcd user32!ButtonWndProcWorker+0x79b
0:000&amp;gt; !handle 0000007c
Handle &lt;font color=&quot;#ff0000&quot;&gt;0000007c&lt;/font&gt;
  Type         	&lt;font color=&quot;#ff0000&quot;&gt;Thread&lt;/font&gt;
0:000&amp;gt; ~* kv

.  0  Id: 5e4.&lt;font color=&quot;#008000&quot;&gt;39c &lt;/font&gt;Suspend: 0 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr  Args to Child
0012f900 7c90df3c 7c8025db 0000007c 00000000 ntdll!KiFastSystemCallRet
0012f904 7c8025db 0000007c 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0012f968 7c802542 0000007c ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012f97c 00401176 0000007c ffffffff 00000111 kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9c0 7c910202 00000002 001506e8 00150000 NotMyFaultEither+0x1176
0012f9f8 7e3746d3 01010050 00000000 00000000 ntdll!RtlpAllocateFromHeapLookaside+0x42
0012fa5c 7e382672 01010050 01100068 7e3a4716 user32!DrawStateW+0x5cd
0012fae8 7e382c75 001563ac 01010050 00000003 user32!xxxBNDrawText+0x313
0012fb20 002d0036 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x2d0036
0012fb3c 7e375ba2 0000800a 002d0036 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 002d0036 004011b0 dcbaabcd user32!ButtonWndProcWorker+0x79b

   1  Id: 5e4.6a4 Suspend: 0 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr  Args to Child
00b8ff10 7c90df3c 7c91b22b 00000080 00000000 ntdll!KiFastSystemCallRet
00b8ff14 7c91b22b 00000080 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
00b8ff9c 7c901046 0040e940 004010e0 0040e940 ntdll!RtlpWaitForCriticalSection+0x132
00b8ffa4 004010e0 &lt;font color=&quot;#0000ff&quot;&gt;0040e940 &lt;/font&gt;00000000 00000000 ntdll!RtlEnterCriticalSection+0x46
WARNING: Stack unwind information not available. Following frames may be wrong.
00b8ffec 00000000 004010c0 0012f99c 00000000 NotMyFaultEither+0x10e0
0:000&amp;gt; !cs &lt;font color=&quot;#0000ff&quot;&gt;0040e940&lt;/font&gt;
-----------------------------------------
Critical section   = 0x0040e940 (NotMyFaultEither+0xE940)
DebugInfo          = 0x00154498
&lt;font color=&quot;#0000ff&quot;&gt;LOCKED&lt;/font&gt;
LockCount          = 0x1
OwningThread       = &lt;font color=&quot;#008000&quot;&gt;0x0000039c&lt;/font&gt;
RecursionCount     = 0x1
LockSemaphore      = 0x80
SpinCount          = 0x00000000&lt;/pre&gt;
&lt;p&gt;A thread ativa no momento do dump aguardava por outra thread. Listando todas as threads do processo temos a primeira e a segunda, que tenta entrar em um critical section. Quando vemos que aquele CS estava sendo bloqueado pela primeira thread vemos claramente se tratar de um dead lock.&lt;/p&gt;
&lt;h4&gt;3. NotMyFaultEither_100808_172407.dmp - Access Violation&lt;/h4&gt;
&lt;pre&gt;0:000&amp;gt; kv
ChildEBP RetAddr  Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9cc 7e37f916 01010052 005a0049 0012f9f4 NotMyFaultEither+0x10a3
0012fa58 7e37f991 01010052 00000043 01100076 user32!ClientFrame+0xe0
0012fa7c 7e382909 01010052 0012fa98 00000000 user32!DrawFocusRect+0x40
0012fae8 7e382c75 00156304 01010052 00000003 user32!xxxBNDrawText+0x3e9
0012fb20 001100a0 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x1100a0
0012fb3c 7e375ba2 0000800a 001100a0 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 001100a0 004010f0 dcbaabcd user32!ButtonWndProcWorker+0x79b
0:000&amp;gt; &lt;font color=&quot;#ff0000&quot;&gt;? eax+edx&lt;/font&gt;
Evaluate expression: 0 = &lt;font color=&quot;#ff0000&quot;&gt;00000000&lt;/font&gt;
0:000&amp;gt; u
NotMyFaultEither+0x10a3:
004010a3 66890c02        mov     word ptr [&lt;font color=&quot;#ff0000&quot;&gt;edx+eax&lt;/font&gt;],cx
004010a7 83c002          add     eax,2
004010aa 6685c9          test    cx,cx&lt;/pre&gt;
&lt;p&gt;O disassemble da instrução inválida tenta escrever claramente em cima do endereço zerado (edx + eax). Dessa forma fica fácil saber que esse tipo de escrita não é permitido, constituindo nosso famosíssimo AV.&lt;/p&gt;
&lt;h4&gt;4. NotMyFaultEither_100808_175404.dmp - Exception not Handled&lt;/h4&gt;
&lt;pre&gt;eax=00000000 ebx=00000111 ecx=7c91003d edx=00010000 esi=00330120 edi=7e374dfa
eip=7c90120e esp=0012f9a0 ebp=00000001 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
&lt;font color=&quot;#ff0000&quot;&gt;7c90120e cc              int     3&lt;/font&gt;
0:000&amp;gt; kv
ChildEBP RetAddr  Args to Child
0012f99c 004011ec 0012fc24 004010d0 0012fbe8 &lt;font color=&quot;#ff0000&quot;&gt;ntdll!DbgBreakPoint&lt;/font&gt; (FPO: [0,0,0])
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9cc 7e37f916 01010054 005a0049 0012f9f4 NotMyFaultEither+0x11ec
0012fa58 7e37f991 01010054 00000043 01100076 user32!ClientFrame+0xe0&lt;/pre&gt;
&lt;p&gt;Esse foi meio de brinde. Uma exceção de breakpoint (int 3, ntdll!DbgBreakPoint) lançada sem um depurador atachado implica em derrubamento do processo, pois é uma exceção como outra qualquer. O programador deve ter esquecido um DebugBreak ou algo que o valha no código de produção, que acabou sendo executado.&lt;/p&gt;
&lt;h5&gt;5. ntdll_cliente.dll - Importação de símbolos&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/vm-sony-xp-2010-08-08-17-59-22.png&quot; title=&quot;vm-sony-xp-2010-08-08-17-59-22.png&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/vm-sony-xp-2010-08-08-17-59-22.png&quot; alt=&quot;vm-sony-xp-2010-08-08-17-59-22.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Essa foi a DLL encontrada no cliente quando ocorreu o problema relatado na imagem, também em anexo. Isso foi demonstrado na palestra com a ajuda do meu script que carrega DLLs, além de um pouco de sorte. Podemos analisar esse caso com mais calma em outro artigo. Acho que já falei demais por aqui.&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Linuxcon 2010</title>
		<link href="http://www.sergioprado.org/2010/08/13/linuxcon-2010/"/>
		<id>http://www.sergioprado.org/?p=790</id>
		<updated>2010-08-14T02:26:08+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;Esta semana, em Boston/EUA, a &lt;a href=&quot;http://www.linuxfoundation.org&quot; target=&quot;_blank&quot;&gt;Linux Foundation&lt;/a&gt; organizou a &lt;a href=&quot;http://events.linuxfoundation.org/events/linuxcon/live-video-streaming&quot; target=&quot;_blank&quot;&gt;Linuxcon 2010&lt;/a&gt;, reunindo desenvolvedores, administradores, usuários e executivos que trabalham com Linux.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Muita coisa aconteceu por lá, em áreas tão diversas como mobile, servidores e sistemas embarcados.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;A Linux Foundation divulgou um programa, chamado de “&lt;a href=&quot;http://www.linuxfoundation.org/programs/legal/compliance&quot; target=&quot;_blank&quot;&gt;Open Compliance Program&lt;/a&gt;”, cujo intuito é ajudar as empresas a disponibilizar os códigos-fonte utilizados sob licenças open-source, como a GPL. Segundo a Linux Foundation, muitas empresas não divulgam seu código-fonte por falta de conhecimento dos aspectos legais ou operacionais. A Linux Foundation irá disponibilizar ferramentas, manuais, cursos e modelos de documento para que as empresas evitem o desrespeito às licenças de software livre.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Sabendo da importância que o Linux vem assumindo nos últimos anos em sistemas embarcados e dispositivos móveis, a &lt;a href=&quot;http://www.qualcomm.com/quicinc/&quot; target=&quot;_blank&quot;&gt;Qualcomm Inovation Center&lt;/a&gt;, uma subsidiária da &lt;a href=&quot;http://www.qualcomm.com/&quot; target=&quot;_blank&quot;&gt;Qualcomm&lt;/a&gt;, fabricante de chips para celulares, tornou-se um membro Platinum da Linux Foundation. Isso significa um melhor suporte e avanço do Linux no mercado mobile.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;No keynote da &lt;a href=&quot;http://www.novell.com&quot; target=&quot;_blank&quot;&gt;Novell&lt;/a&gt;, no segundo dia do evento, falou-se bastante sobre a evolução da computação em nuvem, balanceamento de carga em servidores Linux e virtualização. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Foi divulgada também uma pesquisa realizada Forrester Research, sobre a utilização do Linux como host entre desenvolvedores de software, e o resultado mostrou um crescimento do Linux nos últimos 3 anos:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img alt=&quot;&quot; height=&quot;320&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/pesquisa_linux.png&quot; width=&quot;371&quot; /&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Falou-se também da plataforma &lt;a href=&quot;http://meego.com/&quot; target=&quot;_blank&quot;&gt;Meego&lt;/a&gt;, junção dos projetos &lt;a href=&quot;http://en.wikipedia.org/wiki/Moblin&quot; target=&quot;_blank&quot;&gt;Moblin&lt;/a&gt; da Intel e &lt;a href=&quot;http://maemo.org/&quot; target=&quot;_blank&quot;&gt;Maemo&lt;/a&gt; da Nokia, baseado na arquitetura Atom da Intel.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Pelo que li em sites e blogs de tecnologia, o grande foco este ano foi a importância do software livre e aberto, e do crescimento da plataforma Linux no mercado mobile.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Nos dias 31/08 e 01/09, em São Paulo, vai acontecer a Linuxcon Brasil. Palestrantes de nome estarão por lá, como Linus Torvalds (criador do Linux), Jim Zelim (diretor da Linux Foundation) e Jane Silber (CEO da Canonical), além do inusitado &lt;a href=&quot;http://pt.wikipedia.org/wiki/Jon_Hall&quot; target=&quot;_blank&quot;&gt;Jon “maddog” Hall&lt;/a&gt;, que sempre esta em todos os eventos de Linux.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Eu estarei lá para ouvir o que o pessoal tem a dizer sobre o futuro do Linux, principalmente no mercado embedded. Se você quiser participar, a página do evento pode ser acessada &lt;a href=&quot;http://events.linuxfoundation.org/events/linuxcon-brazil/pt/inicio&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;, e o ingresso para o evento pode ser comprado no site da &lt;a href=&quot;http://www.linuxnewmedia.com.br/shopping/cart/&quot; target=&quot;_blank&quot;&gt;Linux Magazine&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abraço,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Kernel Linux 2.6.35&quot;&gt;Kernel Linux 2.6.35&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2009/10/03/ii-seminario-programacao-cc-para-sistemas-embarcados/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Seminário Programação C/C++ para Sistemas Embarcados 2009&quot;&gt;Seminário Programação C/C++ para Sistemas Embarcados 2009&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Meld 2.0 para desenvolvedores de linux embarcado&quot;&gt;Meld 2.0 para desenvolvedores de linux embarcado&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Meld 2.0 para desenvolvedores de linux embarcado</title>
		<link href="http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/"/>
		<id>http://www.sergioprado.org/?p=782</id>
		<updated>2010-08-12T22:34:01+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;A &lt;a href=&quot;http://www.mvista.com/&quot; target=&quot;_blank&quot;&gt;MontaVista&lt;/a&gt;, empresa l&amp;iacute;der no mercado de Linux Embarcado, liberou esta semana a nova vers&amp;atilde;o do site da comunidade online para desenvolvidores de Linux embarcado, o Meld 2.0.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A primeira vers&amp;atilde;o havia sido lan&amp;ccedil;ada em 2009, e sofreu v&amp;aacute;rias altera&amp;ccedil;&amp;otilde;es, principalmente na interface.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Apesar de ser patrocinado pela MontaVista, o site &amp;eacute; voltado para qualquer t&amp;oacute;pico relacionado &amp;agrave; sistemas embarcados com Linux, incluindo desenvolvimento com Android, customiza&amp;ccedil;&amp;atilde;o do Linux, gerenciamento de mem&amp;oacute;ria e I/O, multi-core, etc.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Muito bom para solucionar problemas, ajudar outros desenvolvedores e fazer networking.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O novo site pode ser acessado em &lt;a href=&quot;http://meld.org&quot; target=&quot;_blank&quot;&gt;meld.org&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Vídeo: Introdução ao Linux Embarcado&quot;&gt;Vídeo: Introdução ao Linux Embarcado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Kernel Linux 2.6.35&quot;&gt;Kernel Linux 2.6.35&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/07/15/nova-ferramenta-para-debug-de-consumo-de-energia/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Nova ferramenta para debug de consumo de energia&quot;&gt;Nova ferramenta para debug de consumo de energia&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Renesas oferece kit de avaliação gratuitamente</title>
		<link href="http://www.sergioprado.org/2010/08/11/renesas-oferece-kit-de-avaliacao-gratuitamente/"/>
		<id>http://www.sergioprado.org/?p=771</id>
		<updated>2010-08-12T01:22:37+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;Por um tempo determinado a &lt;a href=&quot;http://www.renesas.com&quot; target=&quot;_blank&quot;&gt;Renesas&lt;/a&gt; esta oferecendo gratuitamente seu kit de avaliação RX-Stick for RX610. A RX600 é uma série high-end da família RX de processadores, sucessora das famílias H8SX e R32C, arquiteturas de 32 bits da Renesas. Mais informações sobre a série RX600 podem ser lidas &lt;a href=&quot;http://www.renesas.eu/products/mpumcu/rx/rx600/rx600_landing.jsp&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O kit tem uma CPU de 32bits rodando a 100MHz, 2MB de Flash e 128KB de RAM, gravação e debugging pela USB, matriz de leds, potenciômetro, joystick de quatro direções, etc. A Renesas criou uma &lt;a href=&quot;http://www.renesasrulz.com/community/demoboards/rx610stick&quot; target=&quot;_blank&quot;&gt;página no site de sua comunidade online&lt;/a&gt; para este kit com bastante documentação e software de exemplos para a utilização do kit, além de um vídeo demonstrando seu funcionamento:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;&lt;span&gt;&lt;span&gt;Se você quiser participar e receber um kit gratuitamente, basta fazer um cadastro no site da Renesas aqui.&lt;/span&gt;&lt;/span&gt;&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Atualização: Infelizmente a Renesas não pode atender toda a demanda, e a promoção está cancelada.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abraço,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Memory layout e bootloader&quot;&gt;Mini2440 — Memory layout e bootloader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Kit de desenvolvimento FriendlyARM mini2440&quot;&gt;Kit de desenvolvimento FriendlyARM mini2440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/07/15/nova-ferramenta-para-debug-de-consumo-de-energia/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Nova ferramenta para debug de consumo de energia&quot;&gt;Nova ferramenta para debug de consumo de energia&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Kit de desenvolvimento FriendlyARM mini2440</title>
		<link href="http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/"/>
		<id>http://www.sergioprado.org/?p=763</id>
		<updated>2010-08-08T23:21:04+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;A pouco menos de 2 meses comprei no site do &lt;a href=&quot;http://ebay.com&quot; target=&quot;_blank&quot;&gt;eBay&lt;/a&gt; o kit de desenvolvimento &lt;a href=&quot;http://www.friendlyarm.net/products/mini2440&quot; target=&quot;_blank&quot;&gt;FriendlyARM mini2440&lt;/a&gt;. O produto foi importado da China e chegou este fim de semana. Fui ao estabelecimento dos Correios, paguei os impostos devidos e retirei o produto.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;No total (valor do kit + frete + impostos) o kit saiu em torno de R$360,00. Valor bem mais barato do que se adquirisse por aqui, ou se comprasse um kit ARM similar.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;E realmente este kit tem algumas caracteristicas interessantes. A come&amp;ccedil;ar pelo tamanho, de 10cm x 10cm. Veja uma foto com a placa do lado do meu Nokia E71:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;367&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/mini2440_size.png&quot; width=&quot;580&quot; /&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Al&amp;eacute;m da placa o kit acompanha&amp;nbsp;um display touch screen de 3,5 polegadas e&amp;nbsp;alguns cabos (serial, JTAG, USB, Ethernet), e vem pre-carregado com uma imagem rodando Linux e &lt;a href=&quot;http://en.wikipedia.org/wiki/Qt_Extended&quot; target=&quot;_blank&quot;&gt;Qtopia&lt;/a&gt;. Veja abaixo o kit montado e rodando:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;377&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/mini2440.png&quot; width=&quot;580&quot; /&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Suas configura&amp;ccedil;&amp;otilde;es s&amp;atilde;o impressionantes: CPU ARM9 da Samsung de 400MHz (S3C2440A), 64M de SDRAM, 64M de Nand Flash e 2M de NOR Flash, al&amp;eacute;m de v&amp;aacute;rias interfaces incluindo serial RS232, USB, Ethernet, Cart&amp;atilde;o SD e JTAG.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;J&amp;aacute; vem com um bootloader que possibilita carregar a aplica&amp;ccedil;&amp;atilde;o via USB, e &amp;eacute; compat&amp;iacute;vel com os sistemas operacionais Windows CE, GNU/Linux e Android.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Este kit ser&amp;aacute;, durante as pr&amp;oacute;ximas semanas, a plataforma que utilizarei para me aprofundar em ARM e linux embarcado, e especialmente no sistema operacional &lt;a href=&quot;http://www.android.com/&quot; target=&quot;_blank&quot;&gt;Android&lt;/a&gt; do Google.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Alguns posts interessantes sobre este kit est&amp;atilde;o por vir. Aguardem!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Memory layout e bootloader&quot;&gt;Mini2440 — Memory layout e bootloader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Linux com U-Boot e Emdebian&quot;&gt;Mini2440 — Linux com U-Boot e Emdebian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/07/17/wind-river-apostando-na-plataforma-android/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Wind River apostando na plataforma Android&quot;&gt;Wind River apostando na plataforma Android&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Kernel Linux 2.6.35</title>
		<link href="http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/"/>
		<id>http://www.sergioprado.org/?p=758</id>
		<updated>2010-08-05T02:17:31+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;No &amp;uacute;ltimo dia 01/08 foi liberada a nova vers&amp;atilde;o do kernel do Linux vers&amp;atilde;o 2.6.35, que al&amp;eacute;m de v&amp;aacute;rios bug fixes, inclui tamb&amp;eacute;m algumas altera&amp;ccedil;&amp;otilde;es para sistemas multicore.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Uma das principais altera&amp;ccedil;&amp;otilde;es &amp;eacute; uma tecnologia desenvolvida pelo Google para o tratamento de pacotes de rede entre v&amp;aacute;rias CPUs. Essa tecnologia &amp;eacute; dividida em duas t&amp;eacute;cnicas chamadas de RPS (Receive Packet Steering) e RFS (Receive Flow Steering), e consegue quase triplicar a performance da rede. Uma explica&amp;ccedil;&amp;atilde;o sobre seu funcionamento pode ser lida &lt;a href=&quot;http://lwn.net/Articles/382428/&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Esta nova vers&amp;atilde;o tamb&amp;eacute;m tem melhorias no sistema de arquivos &lt;a href=&quot;http://en.wikipedia.org/wiki/Btrfs&quot; target=&quot;_blank&quot;&gt;Btrfs&lt;/a&gt;, considerado como o sucessor do &lt;a href=&quot;http://pt.wikipedia.org/wiki/Ext4&quot; target=&quot;_blank&quot;&gt;Ext4&lt;/a&gt;, um frontend para o KDB (debugger do Kernel), um novo mecanismo de desfragmenta&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria e muitas outras altera&amp;ccedil;&amp;otilde;es em drivers e corre&amp;ccedil;&amp;otilde;es de bugs.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Uma descri&amp;ccedil;&amp;atilde;o mais completa das altera&amp;ccedil;&amp;otilde;es pode ser lida &lt;a href=&quot;http://kernelnewbies.org/Linux_2_6_35&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Meld 2.0 para desenvolvedores de linux embarcado&quot;&gt;Meld 2.0 para desenvolvedores de linux embarcado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Mini2440 — Linux com U-Boot e Emdebian&quot;&gt;Mini2440 — Linux com U-Boot e Emdebian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Vídeo: Introdução ao Linux Embarcado&quot;&gt;Vídeo: Introdução ao Linux Embarcado&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">O Caos, a Moda e o Hacker</title>
		<link href="http://blog.blabos.org/2010/07/o-caos-a-moda-e-o-hacker/"/>
		<id>http://blog.blabos.org/?p=725</id>
		<updated>2010-07-31T20:57:45+00:00</updated>
		<content type="html">&lt;h3&gt;O Caos&lt;/h3&gt;
&lt;p&gt;Nesta sexta feira aconteceu a última aula do curso de férias de 20hs que eu e alguns amigos ministramos na &lt;a href=&quot;http://www.fei.edu.br&quot;&gt;FEI&lt;/a&gt; sobre introdução ao Linux. Gostaria de registrar mais uma vez nosso agradecimento por todo o apoio que recebemos da instituição, representada pelo &lt;a href=&quot;http://www.fei.edu.br/~plinio.aquino/&quot;&gt;Professor Plínio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O curso foi carinhosamente redefinido durante a semana como &amp;#8220;Uma caótica e divertida introdução ao mundo Linux&amp;#8221;, pois ao invés de nos focarmos em memorização de comandinhos, tentamos mostrar aos alunos como se virar sozinhos, habituando-os a usar o manual e deixando-os confortáveis o suficiente para experimentar.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-725&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A temática foi mais ou menos no estilo de &amp;#8220;O que acontece se eu apertar esse botão vermelho?&amp;#8221;, onde até mesmo os instrutores faziam coisas erradas para utilizar isso como gancho para o tópico seguinte.&lt;/p&gt;
&lt;p&gt;No primeiro dia falamos para os alunos que eles não precisavam de um curso com especialistas para que pudessem explorar o sistema, então a frase mais usada foi &amp;#8220;Não sei. Vamos procurar no man?&amp;#8221;, seguida de uma ajudinha sobre como localizar e entender o manual corretamente.&lt;/p&gt;
&lt;p&gt;Nesse formato, interagimos sobre manuais, comandos básicos, organização do sistema de arquivos, permissões, pipes, descritores de arquivos, redirecionamento de E/S, particioamento entre outros tópicos, sempre focando nas dúvidas dos alunos, ao invés de no programa do curso, mostrando que eles poderiam destrinchar um determinado assunto tão profundamente quanto quisessem.&lt;/p&gt;
&lt;p&gt;Naturalmente, acabamos não tendo tempo de entrar em vários assuntos, mas os tópicos que não abordamos, ou os termos mais específicos eram deixados no quadro para que eles anotassem e pesquisassem por conta própria, sempre tomando o cuidado de dar uma direção, de forma que eles não ficassem perdidos ou com tudo mastigado.&lt;/p&gt;
&lt;p&gt;Na quata feira, abordamos a instalação do Linux, tomando como exemplo o Ubuntu. Até mesmo um pendrive que corrompeu algumas ISOs serviu de gancho para falarmos de checksum. Em pouco tempo eles já estavam configurando o sistema sozinhos, atualizando e instalando pacotes sem que precisássemos interferir muito.&lt;/p&gt;
&lt;p&gt;A quinta feira foi o dia mais audacioso para um curso introdutório. Focando nas necessidades dos alunos, abordamos ferramentas de desenvolvimento e debug. Demos uma visão geral das etapas de compilação, mostramos como as macros são pre-processadas, como é gerado código objeto e como os objetos são linkados. Falamos brevemente sobre cpp, gcc, ld, gdb, nm, objdump, e sobre como as bibliotecas são criadas, sem assustar com os comandos, focando nos conceitos por trás de tudo.&lt;/p&gt;
&lt;p&gt;Embora esse seja um tópico razoavelmente avançado, mostramos para os alunos que eles tinham plenas condições de entender o que estava acontecendo e se aprofundarem no assunto caso quisessem. Mostramos que existe e deixamos por conta da curiosidade de cada um.&lt;/p&gt;
&lt;h3&gt;A moda&lt;/h3&gt;
&lt;p&gt;Na sexta feira trouxemos um questionamento sobre a humanidade das pessoas que operam as máquinas e sobre como a tecnologia pode ser prejudicial para elas. Tentamos fazer os alunos questionarem-se sobre o porquê de terem escolhido essa carreira.&lt;/p&gt;
&lt;p&gt;A esse bate papo seguiu-se uma sessão de perguntas sobre mercado onde foi perguntado quais tecnologias deveriam ser aprendidas para se destacar no mercado. Foi levantada a questão do conhecimento motivado pelo produto, sendo que a visão do mercado é que devemos buscar o conhecimento somente se motivados por um problema ou criação de produtos.&lt;/p&gt;
&lt;p&gt;Infelizmente, não tivemos tempo suficiente para uma discussão mais abrangente, mas neste ponto, a opinião dos instrutores diverge da opinião do mercado.&lt;/p&gt;
&lt;p&gt;Todos sabemos que a necessidade motiva. Não discordamos disto. O que não aceitamos é que a busca pelo conhecimento seja podada pela existência ou não de uma determinada necessidade.&lt;/p&gt;
&lt;p&gt;Quando estamos sujeitos às modas do mercado estamos sempre um passo atrás do que está acontecendo. Alguém determinou que a tecnologia X é o estado da arte da computação e só nos resta correr feito loucos para continuar fazendo parte do rebanho. Nós nos tornamos escravos. Seres passivos, reativos.&lt;/p&gt;
&lt;p&gt;E sem liberdade de pensamento, sem sentimentos, sem criatividade, nós perdemos aquilo que nos faz humanos. Nós nos tornamos máquinas.&lt;/p&gt;
&lt;p&gt;Querem um exemplo?&lt;/p&gt;
&lt;p&gt;Na década de 90, a moda do mercado era Delphi. Toda vez que um aluno perguntava o que deveria aprender para entrar no mercado, a resposta era: Delphi. Porque Delphi era utilizado em muitas empresas, porque a maioria das vagas em aberto eram para programadores Delphi, etc. Assim, uma massa enorme de pessoas foi estimulada a aprender uma ferramenta, sem se preocupar com base algorítmica, lógica, estrutura ou estilo. Grande parte tornou-se mão de obra barata e dispensável.&lt;/p&gt;
&lt;p&gt;Quando os ventos do mercado sopraram em uma outra direção, quem não estava realmente preparado foi varrido do mapa.&lt;/p&gt;
&lt;p&gt;Depois vieram o Java, o .NET, o Ruby, entre outros.&lt;/p&gt;
&lt;p&gt;Então você está dizendo que essas linguagens são ruins? Definitivamente não, e esse nem é o foco. A sacada é que mesmo nessas linguagens da moda, poucas pessoas estão realmente preparadas e bem posicionadas, enquanto a maioria é só mão de obra substituível e barata.&lt;/p&gt;
&lt;p&gt;O que faz um profissional ser bem sucedido é sua capacidade de resolver problemas, e não quantas ferramentas ele sabe manipular.&lt;/p&gt;
&lt;p&gt;É claro que quanto mais ferramentas à sua disposição, mais fácil tende a ser o seu trabalho, mas isso só é verdade se você possuir base o suficiente para escolher qual ferramenta se aplica e qual não se aplica. Essa talvez seja a melhor medida de competência.&lt;/p&gt;
&lt;p&gt;Voltando ao questionamento anterior, se você só buscar o conhecimento quando houver uma necessidade, você provavelmente não terá à sua disposição conteúdo suficiente para fazer uma boa escolha quando precisar. Na verdade a escolha já terá sido feita por outra pessoa e só te restará a opção de acatar e seguir, depois é claro de correr atrás para aprender o que outra pessoa decidiu que é melhor para você.&lt;/p&gt;
&lt;h3&gt;Non Dvcor Dvco&lt;/h3&gt;
&lt;p&gt;Quando alguém me pergunta o que deve aprender para entrar no mercado de trabalho, em sempre me lembro da frase que está na bandeira da cidade de São Paulo: Não sou conduzido, conduzo.&lt;/p&gt;
&lt;p&gt;Então eu digo que a pergunta está invertida. Está tudo errado e essa falácia é vendida com pompa e circunstância. Você não tem que aprender nada para agradar ao mercado, na verdade o que você tem que fazer é deixar o mercado querendo ter você, te desejando.&lt;/p&gt;
&lt;p&gt;Se você fica sempre preocupado com o que os outros querem que você faça, você estará sempre um passo atrás, buscando algo que não é o que você deseja, e que assim que o vento mudar pode se tornar inútil.&lt;/p&gt;
&lt;p&gt;Pergunte ao invés disso &lt;strong&gt;quais as características que você precisa desenvolver para se tornar um profissional desejado&lt;/strong&gt;. A resposta é simples. Seja excelente. Escolha aquilo que mais lhe dá prazer e dedique-se com afinco. Prepare-se, busque embasamento, não se prenda a ferramentas e comandos, procure conhecer o que está em torno do que você está fazendo. Seja curioso, &lt;a href=&quot;http://www.istf.com.br/?page=perguntas&quot;&gt;pergunte&lt;/a&gt;. Aprenda a ser um &lt;a href=&quot;http://www.linux.ime.usp.br/~rcaetano/docs/hacker-howto-pt.html&quot;&gt;hacker&lt;/a&gt; no verdadeiro sentido da palavra.&lt;/p&gt;
&lt;p&gt;Quando você parar de se preocupar com o que está na moda você vai perceber que há vagas que não conseguem ser preenchidas por empurradores de rato.&lt;/p&gt;
&lt;p&gt;Busque sempre o conhecimento, mesmo que sem uma aplicação óbvia, pois as grandes invenções da humanidade só foram possíveis depois de integrar idéias muitas vezes não relacionadas. Há sempre mais de uma ciência por trás de tudo que você toca.&lt;/p&gt;
&lt;p&gt;Explore com paixão o máximo de suas habilidades, que o sucesso será uma mera cosequência.&lt;/p&gt;
&lt;h3&gt;Apêndice&lt;/h3&gt;
&lt;p&gt;Especialmente mas não exclusivamente para os alunos do curso, deixo alguns links interessantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://catb.org/esr/faqs/hacker-howto.html&quot;&gt;How To Become A Hacker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://catb.org/esr/faqs/smart-questions.html&quot;&gt;How To Ask Questions The Smart Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.unix.org/&quot;&gt;The UNIX System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gnu.org/&quot;&gt;GNU Operating System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.minix3.org/&quot;&gt;The MINIX 3 Operating System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freebsd.org/&quot;&gt;Free BSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kernel.org/&quot;&gt;Linux Kernel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gnu.org/software/bash/&quot;&gt;Bash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kornshell.com/&quot;&gt;KornShell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tldp.org/&quot;&gt;The Linux Documentation Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tldp.org/LDP/abs/html/&quot;&gt;Advanced Bash-Scripting Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tldp.org/HOWTO/Program-Library-HOWTO/&quot;&gt;Program Library HOWTO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://focalinux.cipsga.org.br/&quot;&gt;Guia Foca GNU/Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.projetofedora.org/&quot;&gt;Fedora Brasil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ubuntu-br.org/&quot;&gt;Ubuntu-BR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slackware.com/&quot;&gt;Slackware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gcc.gnu.org/&quot;&gt;GCC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perl.org/&quot;&gt;Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.xfree86.org/&quot;&gt;XFree86&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.x.org/&quot;&gt;Xorg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.compiz.org/&quot;&gt;Compiz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Blabos de Blebe</name>
			<uri>http://blog.blabos.org</uri>
		</author>
		<source>
			<title type="html">Blog do Blabos de Blebe » C/C++</title>
			<subtitle type="html">Qt, Perl, tecnologia e algum blá blá blá</subtitle>
			<link rel="self" href="http://blog.blabos.org/category/c-cpp/feed/"/>
			<id>http://blog.blabos.org/category/c-cpp/feed/</id>
			<updated>2010-08-30T19:35:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Qt – Password and encryption</title>
		<link href="http://wend.elmaqu.es/?p=124"/>
		<id>http://wend.elmaqu.es/?p=124</id>
		<updated>2010-07-30T18:06:30+00:00</updated>
		<content type="html">Warning: this is a mail about security, not about Qt, so skip it if you are not interested. On Friday 24 February 2006 16:27, ing. Federico Fuga wrote: &amp;#62; On Fri, 24 Feb 2006 08:25:47 -0600 &amp;#62; Andrew Vick wrote: &amp;#62; &amp;#62; Perhaps if you MD5 sum the password, that would be sufficient. &amp;#62; &amp;#62; [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Memory leak em linguagem C</title>
		<link href="http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/"/>
		<id>http://www.sergioprado.org/?p=739</id>
		<updated>2010-07-30T00:01:49+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Dependendo do problema que queremos resolver, precisamos de uma quantidade vari&amp;aacute;vel de espa&amp;ccedil;o para armazenar alguma informa&amp;ccedil;&amp;atilde;o. Isso pode acontecer, por exemplo, quando estamos trabalhando com protocolos de comunica&amp;ccedil;&amp;atilde;o onde a quantidade de dados trafegados &amp;eacute; vari&amp;aacute;vel. Ou ent&amp;atilde;o quando trabalhamos com estruturas de dados como listas ligadas, onde elementos desta lista s&amp;atilde;o adicionados/removidos dinamicamente.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A biblioteca C padr&amp;atilde;o fornece as fun&amp;ccedil;&amp;otilde;es malloc() para alocar mem&amp;oacute;ria dinamicamente e free() para desalocar uma regi&amp;atilde;o de mem&amp;oacute;ria previamente alocada.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;malloc&lt;span&gt;&amp;#40;&lt;/span&gt;size_t size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;void&lt;/span&gt; free&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;ptr&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Estas rotinas usam uma regi&amp;atilde;o de mem&amp;oacute;ria chamada de heap. &amp;Eacute; no heap que os bytes s&amp;atilde;o alocados com malloc() e liberados com free(). O tamanho do heap &amp;eacute; vari&amp;aacute;vel, dependendo de v&amp;aacute;rios fatores como o tamanho da mem&amp;oacute;ria, capacidade de endere&amp;ccedil;amento da CPU, etc. Mas claramente &amp;eacute; uma regi&amp;atilde;o de mem&amp;oacute;ria finita. A cada chamada a malloc(), uma pequena parte desta regi&amp;atilde;o de mem&amp;oacute;ria &amp;eacute; consumida. E se n&amp;atilde;o for liberada, corremos o risco de ficar sem mem&amp;oacute;ria.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O uso de malloc() e free() de maneira descontrolada pode causar dois principais problemas:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Fragmenta&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria: A cada malloc(), um peda&amp;ccedil;o de mem&amp;oacute;ria &amp;eacute; alocado, e fica indispon&amp;iacute;vel para a aplica&amp;ccedil;&amp;atilde;o. Se o software abusar das chamadas a malloc(), a mem&amp;oacute;ria poder&amp;aacute; ficar fragmentada em pequenos peda&amp;ccedil;os alocados para a aplica&amp;ccedil;&amp;atilde;o. Depois as rotinas de aloca&amp;ccedil;&amp;atilde;o ter&amp;atilde;o dificuldades de encontrar &amp;quot;peda&amp;ccedil;os&amp;quot; de mem&amp;oacute;ria que atendem &amp;agrave;s novas chamadas &amp;agrave; malloc(). A forma como ocorre esta fragmenta&amp;ccedil;&amp;atilde;o &amp;eacute; dependente da biblioteca ou do sistema operacional respons&amp;aacute;vel pela aloca&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Memory leak: Se voc&amp;ecirc; alocar regi&amp;otilde;es de mem&amp;oacute;ria com malloc(), mas depois do uso n&amp;atilde;o liberar estas regi&amp;otilde;es com o free(), temos caracterizado o memory leak, um dos principais pesadelos do desenvolvedor de software embarcado. &amp;Eacute; um pesadelo porque a memoria come&amp;ccedil;a a ser consumida aos poucos, e a aplica&amp;ccedil;&amp;atilde;o pode ficar dias sem apresentar algum problema. Mas ent&amp;atilde;o num belo dia, quando toda a mem&amp;oacute;ria &amp;eacute; consumida, coisas estranhas come&amp;ccedil;am a acontecer. A performance da aplica&amp;ccedil;&amp;atilde;o come&amp;ccedil;a a se degradar, e travamentos ou reboot automaticos ir&amp;atilde;o invariavelmente acontecer.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Nosso foco neste artigo &amp;eacute; o memory leak. Vamos analisar ent&amp;atilde;o algumas t&amp;eacute;cnicas para tratar e identificar este problema.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;T&amp;eacute;cnica 0: N&amp;atilde;o usar malloc()&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Usar aloca&amp;ccedil;&amp;atilde;o dinamica de mem&amp;oacute;ria em sistemas embarcados deve ser seu ultimo recurso. Padr&amp;otilde;es como o MISRA-C, que tratei em um &lt;a href=&quot;http://www.sergioprado.org/2010/05/27/misra-c-padrao-para-software-em-c/&quot; target=&quot;_blank&quot;&gt;artigo passado&lt;/a&gt;, proibem categoricamente seu uso. Portanto pensem bastante na solu&amp;ccedil;&amp;atilde;o. Depois pensem de novo. E de novo. At&amp;eacute; ter certeza de que aloca&amp;ccedil;&amp;atilde;o din&amp;acirc;mica de mem&amp;oacute;ria &amp;eacute; a &amp;uacute;nica solu&amp;ccedil;&amp;atilde;o para seu problema.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;T&amp;eacute;cnica 1: Code review&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Ent&amp;atilde;o voc&amp;ecirc; usou aloca&amp;ccedil;&amp;atilde;o din&amp;acirc;mica de mem&amp;oacute;ria em seu c&amp;oacute;digo, e agora precisa garantir a aus&amp;ecirc;ncia de memory leak na aplica&amp;ccedil;&amp;atilde;o. E uma das primeiras t&amp;eacute;cnicas a serem aplicadas &amp;eacute; o &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_review&quot; target=&quot;_blank&quot;&gt;Code Review&lt;/a&gt;, ou revis&amp;atilde;o de c&amp;oacute;digo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A t&amp;eacute;cnica de revis&amp;atilde;o de c&amp;oacute;digo deveria ser aplicada independentemente do uso de malloc(). N&amp;oacute;s devemos revisar nossos c&amp;oacute;digos. E ent&amp;atilde;o devemos pedir para outras pessoas revis&amp;aacute;-los. E depois revisar o c&amp;oacute;digo de outras pessoas. Uma boa parte dos bugs podem ser encontrados com esta t&amp;eacute;cnica.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A id&amp;eacute;ia aqui &amp;eacute; ler o c&amp;oacute;digo, identificar todas as chamadas &amp;agrave; malloc(), e verificar se existe o free() correspondente. D&amp;ecirc; uma olhada na fun&amp;ccedil;&amp;atilde;o abaixo:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;int&lt;/span&gt; txData&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;ptr &lt;span&gt;=&lt;/span&gt; NULL&lt;span&gt;,&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;buf &lt;span&gt;=&lt;/span&gt; NULL&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;int&lt;/span&gt; size &lt;span&gt;=&lt;/span&gt; strlen&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* allocate buffer */&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ptr &lt;span&gt;=&lt;/span&gt; buf &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;malloc&lt;span&gt;&amp;#40;&lt;/span&gt;size &lt;span&gt;+&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; NULL&lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* STX */&lt;/span&gt;
    &lt;span&gt;*&lt;/span&gt;ptr&lt;span&gt;++&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; STX&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* data */&lt;/span&gt;
    strncpy&lt;span&gt;&amp;#40;&lt;/span&gt;ptr&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;,&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    ptr &lt;span&gt;+=&lt;/span&gt; size&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* ETX */&lt;/span&gt;
    &lt;span&gt;*&lt;/span&gt;ptr&lt;span&gt;++&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; ETX&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* send data */&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;txSerial&lt;span&gt;&amp;#40;&lt;/span&gt;buf&lt;span&gt;,&lt;/span&gt; size &lt;span&gt;+&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* free buffer */&lt;/span&gt;
    free&lt;span&gt;&amp;#40;&lt;/span&gt;buf&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Temos aqui um exemplo cl&amp;aacute;ssico de memory leak. Esta fun&amp;ccedil;&amp;atilde;o recebe uma string, formata em um buffer, e envia pela serial. Como o tamanho da string &amp;eacute; vari&amp;aacute;vel, o buffer de comunica&amp;ccedil;&amp;atilde;o &amp;eacute; alocado dinamicamente. Veja que na linha 7 o buffer &amp;eacute; alocado, e na linha 25 o buffer &amp;eacute; liberado. Por&amp;eacute;m, quando ocorre um erro ao enviar os dados (linha 21), a fun&amp;ccedil;&amp;atilde;o retorna sem desalocar o buffer, caracterizando o memory leak. Este erro &amp;eacute; muito comum. Quando usamos malloc() devemos nos certificar de que todos os pontos de retorno da fun&amp;ccedil;&amp;atilde;o possuem uma chamada a free().&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Esta t&amp;eacute;cnica pode ser muito custosa para aplica&amp;ccedil;&amp;otilde;es com milhares de linhas de c&amp;oacute;digo, e isso nos leva ao uso de ferramentas para automatizar esta verifica&amp;ccedil;&amp;atilde;o.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;T&amp;eacute;cnica 2: Uso de ferramentas&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Ferramentas s&amp;atilde;o uma parte essencial do processo de desenvolvimento, e n&amp;atilde;o ser&amp;aacute; diferente quando nosso objetivo &amp;eacute; analisar um problema de memory leak. Existem v&amp;aacute;rios tipos de ferramentas, algumas que fazem an&amp;aacute;lise est&amp;aacute;tica de c&amp;oacute;digo (analisa diretamente o c&amp;oacute;digo-fonte) e outras que fazem verifica&amp;ccedil;&amp;atilde;o din&amp;acirc;mica (em tempo de execu&amp;ccedil;&amp;atilde;o).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Para testar algumas ferramentas, vamos complementar a fun&amp;ccedil;&amp;atilde;o txData() com uma fun&amp;ccedil;&amp;atilde;o main(), e for&amp;ccedil;ar um memory leak. Nosso c&amp;oacute;digo final ficou assim:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;/* leak.c */&lt;/span&gt;
&lt;span&gt;#include &amp;quot;stdio.h&amp;quot;&lt;/span&gt;
&lt;span&gt;#include &amp;quot;string.h&amp;quot;&lt;/span&gt;
&lt;span&gt;#include &amp;quot;malloc.h&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define STX 0x02&lt;/span&gt;
&lt;span&gt;#define ETX 0x03&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; txSerial&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;buffer&lt;span&gt;,&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; txData&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;ptr &lt;span&gt;=&lt;/span&gt; NULL&lt;span&gt;,&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;buf &lt;span&gt;=&lt;/span&gt; NULL&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;int&lt;/span&gt; size &lt;span&gt;=&lt;/span&gt; strlen&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* allocate buffer */&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ptr &lt;span&gt;=&lt;/span&gt; buf &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;malloc&lt;span&gt;&amp;#40;&lt;/span&gt;size &lt;span&gt;+&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; NULL&lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* STX */&lt;/span&gt;
    &lt;span&gt;*&lt;/span&gt;ptr&lt;span&gt;++&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; STX&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* data */&lt;/span&gt;
    strncpy&lt;span&gt;&amp;#40;&lt;/span&gt;ptr&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;,&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    ptr &lt;span&gt;+=&lt;/span&gt; size&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* ETX */&lt;/span&gt;
    &lt;span&gt;*&lt;/span&gt;ptr&lt;span&gt;++&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; ETX&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* send data */&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;txSerial&lt;span&gt;&amp;#40;&lt;/span&gt;buf&lt;span&gt;,&lt;/span&gt; size &lt;span&gt;+&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;/* free buffer */&lt;/span&gt;
    free&lt;span&gt;&amp;#40;&lt;/span&gt;buf&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;msg &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;MemoryLeak&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;txData&lt;span&gt;&amp;#40;&lt;/span&gt;msg&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
        &lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Mensagem enviada com sucesso!&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;else&lt;/span&gt;
        &lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Erro ao enviar mensagem!&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Primeiro vamos testar com uma ferramenta de analise est&amp;aacute;tica de c&amp;oacute;digo, o SPLINT, j&amp;aacute; tratado anteriormente no meu &lt;a href=&quot;http://www.sergioprado.org/2010/01/28/analise-estatica-codigo/&quot; target=&quot;_blank&quot;&gt;artigo aqui&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ splint leak.&lt;span&gt;c&lt;/span&gt;
Splint 3.1.2 &lt;span&gt;---&lt;/span&gt; &lt;span&gt;03&lt;/span&gt; May &lt;span&gt;2009&lt;/span&gt;
....
&lt;span&gt;leak&lt;/span&gt;.&lt;span&gt;c&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;37&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; Owned storage ptr not released before &lt;span&gt;return&lt;/span&gt;
  A memory leak has been detected. &lt;span&gt;Only&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;qualified storage is not released
  before the last reference to it is lost. &lt;span&gt;&amp;#40;&lt;/span&gt;Use &lt;span&gt;-&lt;/span&gt;mustfreeonly to inhibit
  warning&lt;span&gt;&amp;#41;&lt;/span&gt;
   leak.&lt;span&gt;c&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; Storage ptr becomes owned
....&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Voil&amp;aacute;! A ferramenta encontrou facilmente o memory leak que inserimos no c&amp;oacute;digo. O interessante de uma ferramenta de an&amp;aacute;lise est&amp;aacute;tica &amp;eacute; que, como a analisa &amp;eacute; feita nos fontes da aplica&amp;ccedil;&amp;atilde;o, ela pode ser usada em qualquer c&amp;oacute;digo-fonte, independente da arquitetura ou do sistema operacional que estamos usando, desde que esteja no padr&amp;atilde;o ANSI C.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;J&amp;aacute; o uso de ferramentas de an&amp;aacute;lise din&amp;acirc;mica podem pegar casos espec&amp;iacute;ficos que passariam despercebidos quando usamos ferramentas de an&amp;aacute;lise est&amp;aacute;tica. Por outro lado, estas ferramentas s&amp;atilde;o dependentes de determinado sistema operacional, ou ent&amp;atilde;o exigem que voc&amp;ecirc; compile seu c&amp;oacute;digo com uma biblioteca espec&amp;iacute;fica. Isso porque estas ferramentas adicionam uma camada extra na sua aplica&amp;ccedil;&amp;atilde;o, monitorando cada chamada a malloc() e free(), para depois gerar um relat&amp;oacute;rio que pode indicar um memory leak quando a quantidade de chamadas a malloc() for diferente da quantidade de chamadas a free() por exemplo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Uma destas ferramentas, muito utilizada para detectar memory leak em aplica&amp;ccedil;&amp;otilde;es para sistemas Unix, &amp;eacute; o &lt;a href=&quot;http://valgrind.org/&quot; target=&quot;_blank&quot;&gt;Valgring&lt;/a&gt;. Esta ferramenta de debug, dentre outras funcionalidades, monitora o uso de mem&amp;oacute;ria pela aplica&amp;ccedil;&amp;atilde;o em tempo de execu&amp;ccedil;&amp;atilde;o. Vamos testar o comportamento desta ferramenta com a nossa aplica&amp;ccedil;&amp;atilde;o.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ valgrind .&lt;span&gt;/&lt;/span&gt;leak
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; Memcheck&lt;span&gt;,&lt;/span&gt; a memory error detector
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; Copyright &lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;2002&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;2009&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; and GNU GPL&lt;span&gt;,&lt;/span&gt; by Julian Seward et al.
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; Using Valgrind&lt;span&gt;-&lt;/span&gt;3.6.0.&lt;span&gt;SVN&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;Debian and LibVEX&lt;span&gt;;&lt;/span&gt; rerun with &lt;span&gt;-&lt;/span&gt;h &lt;span&gt;for&lt;/span&gt; copyright info
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; Command&lt;span&gt;:&lt;/span&gt; .&lt;span&gt;/&lt;/span&gt;leak
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; 
Erro ao enviar mensagem&lt;span&gt;!&lt;/span&gt;
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; 
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; HEAP SUMMARY&lt;span&gt;:&lt;/span&gt;
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;     in use at exit&lt;span&gt;:&lt;/span&gt; &lt;span&gt;13&lt;/span&gt; bytes in &lt;span&gt;1&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;   total heap usage&lt;span&gt;:&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; allocs&lt;span&gt;,&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; frees&lt;span&gt;,&lt;/span&gt; &lt;span&gt;13&lt;/span&gt; bytes allocated
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; 
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; LEAK SUMMARY&lt;span&gt;:&lt;/span&gt;
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;    definitely lost&lt;span&gt;:&lt;/span&gt; &lt;span&gt;13&lt;/span&gt; bytes in &lt;span&gt;1&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;    indirectly lost&lt;span&gt;:&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; bytes in &lt;span&gt;0&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;      possibly lost&lt;span&gt;:&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; bytes in &lt;span&gt;0&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;    still reachable&lt;span&gt;:&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; bytes in &lt;span&gt;0&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;         suppressed&lt;span&gt;:&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; bytes in &lt;span&gt;0&lt;/span&gt; blocks
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; Rerun with &lt;span&gt;--&lt;/span&gt;leak&lt;span&gt;-&lt;/span&gt;check&lt;span&gt;=&lt;/span&gt;full to see details of leaked memory
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; 
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; For counts of detected and suppressed errors&lt;span&gt;,&lt;/span&gt; rerun with&lt;span&gt;:&lt;/span&gt; &lt;span&gt;-&lt;/span&gt;v
&lt;span&gt;==&lt;/span&gt;&lt;span&gt;3811&lt;/span&gt;&lt;span&gt;==&lt;/span&gt; ERROR SUMMARY&lt;span&gt;:&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; errors from &lt;span&gt;0&lt;/span&gt; contexts &lt;span&gt;&amp;#40;&lt;/span&gt;suppressed&lt;span&gt;:&lt;/span&gt; &lt;span&gt;13&lt;/span&gt; from &lt;span&gt;8&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Veja que ap&amp;oacute;s executar a aplica&amp;ccedil;&amp;atilde;o ela imprime um relat&amp;oacute;rio do uso de mem&amp;oacute;ria, indicando a ocorrencia do memory leak.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Se voc&amp;ecirc; quiser, d&amp;ecirc; uma olhada tamb&amp;eacute;m na biblioteca &lt;a href=&quot;http://dmalloc.com/&quot; target=&quot;_blank&quot;&gt;dmalloc&lt;/a&gt;. Ela adiciona uma camada adicional na sua aplica&amp;ccedil;&amp;atilde;o, possibilitando o debug de aloca&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria em tempo de execu&amp;ccedil;&amp;atilde;o. Esta biblioteca foi escrita em ANSI C e pode ser facilmente portada para qualquer arquitetura.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;T&amp;eacute;cnica 3: Desenvolva sua pr&amp;oacute;pria biblioteca&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Se nenhuma solu&amp;ccedil;&amp;atilde;o dispon&amp;iacute;vel lhe servir, sempre existe a possibilidade de voc&amp;ecirc; colocar a m&amp;atilde;o na massa e desenvolver suas pr&amp;oacute;prias rotinas de aloca&amp;ccedil;&amp;atilde;o de mem&amp;oacute;ria. Reinventar a roda &amp;eacute; sempre mais trabalhoso e custoso, mas se voc&amp;ecirc; se sentir aventureiro, pode analisar esta possibilidade. D&amp;ecirc; uma olhada neste artigo &lt;a href=&quot;http://www.eetimes.com/design/other/4023946/More-on-Memory-Leaks&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Normalmente, s&amp;oacute; damos aten&amp;ccedil;&amp;atilde;o a um problema quando o vivenciamos. Sempre achamos que n&amp;atilde;o vai acontecer conosco. E quando acontece, temos que lidar com as consequencias e aprender com os erros. Mas melhor do que aprender com seus pr&amp;oacute;prios erros, &amp;eacute; aprender com os erros dos outros. Portanto, seja mais proativo. memory leak &amp;eacute; igual a press&amp;atilde;o alta, uma doen&amp;ccedil;a silenciosa, mas que quando apresenta os sintomas, estes provavelmente ser&amp;atilde;o fatais!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abra&amp;ccedil;o,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/06/12/tratamento-de-erros-em-linguagem-c/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Tratamento de erros em Linguagem C&quot;&gt;Tratamento de erros em Linguagem C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2009/10/03/otimizacao-de-codigo-em-linguagem-c-parte-2/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Otimização de código em Linguagem C — Parte 2&quot;&gt;Otimização de código em Linguagem C — Parte 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2009/09/26/otimizacao-de-codigo-em-linguagem-c-parte-1/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Otimização de código em Linguagem C — Parte 1&quot;&gt;Otimização de código em Linguagem C — Parte 1&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Microsoft em novo acordo com a ARM</title>
		<link href="http://www.sergioprado.org/2010/07/26/microsoft-em-novo-acordo-com-a-arm/"/>
		<id>http://www.sergioprado.org/?p=735</id>
		<updated>2010-07-27T01:21:36+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;No último dia 23 de julho a Microsoft anunciou um novo acordo de licenciamento com a ARM, dando a ela o acesso à arquitetura e à liberdade de produzir chips com a arquitetura ARM.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A Microsoft segue o mesmo caminho da Apple, que licenciou a arquitetura ARM para produzir seus chips &lt;a href=&quot;http://en.wikipedia.org/wiki/Apple_A4&quot; target=&quot;_blank&quot;&gt;A4&lt;/a&gt; para o iPad e o iPhone4.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Muito têm-se especulado sobre qual o objetivo da Microsoft ao licenciar a arquitetura ARM. Podem ser produtos voltados ao mercado de consumo como smartphones, netbooks e tablets, usando aí seu novo SO, o &lt;a href=&quot;http://www.windowsphone7.com/&quot; target=&quot;_blank&quot;&gt;Windows Phone 7&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Ou então especula-se também a utilização de chips ARM nos servidores que rodam o sistema de buscas da Microsoft, o &lt;a href=&quot;http://www.bing.com&quot; target=&quot;_blank&quot;&gt;Bing&lt;/a&gt;, principalmente porque ela divulgou recentemente uma &lt;a href=&quot;http://www.eetimes.com/electronics-news/4088639/Microsoft-job-ad-hints-at-ARM-based-servers&quot; target=&quot;_blank&quot;&gt;posição aberta&lt;/a&gt; para um engenheiro de software com experiencia em ARM para atuar em seus Data Centers.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;É esperar para ver.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O press release do acordo pode ser lido &lt;a href=&quot;http://www.arm.com/about/newsroom/microsoft-licenses-arm-architecture.php&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Um abraço,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Sergio Prado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/08/13/linuxcon-2010/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Linuxcon 2010&quot;&gt;Linuxcon 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/07/17/open-source-hardware/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Open Source Hardware&quot;&gt;Open Source Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2009/10/03/ii-seminario-programacao-cc-para-sistemas-embarcados/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Seminário Programação C/C++ para Sistemas Embarcados 2009&quot;&gt;Seminário Programação C/C++ para Sistemas Embarcados 2009&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Sétimo Encontro de Programadores C++</title>
		<link href="http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c"/>
		<id>http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c</id>
		<updated>2010-07-26T02:44:31+00:00</updated>
		<content type="html">&lt;p&gt;Mais um fim-de-semana no ócio e na vadiagem. Tenho que manter minhas &lt;a href=&quot;http://c2.com/cgi/wiki?LazinessImpatienceHubris&quot;&gt;qualidades de bom programador&lt;/a&gt; que sou: preguiçoso, impaciente e pretensioso.&lt;/p&gt;
&lt;p&gt;Mas nem por isso deixei de terminar uma primeira versão do aplicativo que irei usar como base na minha palestra do nosso próximo &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VII&quot;&gt;encontro C++&lt;/a&gt;: &lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/crashdumpanalysis.7z&quot; title=&quot;CrashDumpAnalysis&quot;&gt;Crash Dump Analysis&lt;/a&gt;. Se alguém tiver dicas de quais os problemas mais difíceis do Universo para analisar em um dump de memória, comente a respeito e veremos o que dá pra fazer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/crash-dump.png&quot; alt=&quot;crash-dump.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Enquanto isso, continuo descobrindo maravilhas do WinDbg. Essa semana fiquei brincando de colocar breakpoint em user-mode, mas depurando o kernel, como fizeram &lt;a href=&quot;http://blogs.msdn.com/b/ntdebugging/archive/2010/07/20/debugging-services-startup-in-svchost-from-a-kernel-mode-debug-session.aspx&quot;&gt;os rapazes do Ntdebugging&lt;/a&gt;. A conclusão é que ele vale para todos os aplicativos abertos. Tente com o MessageBox!&lt;/p&gt;
&lt;pre&gt;!process 0 0 notepad.exe
.reload /user
bp user32!MessageBoxW&lt;/pre&gt;
&lt;p&gt;Mas devaneio. Talvez outra boa qualidade de um bom programador.&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Padrão ELF para arquivos-objeto</title>
		<link href="http://www.sergioprado.org/2010/07/24/padrao-elf-para-arquivos-objeto/"/>
		<id>http://www.sergioprado.org/?p=715</id>
		<updated>2010-07-24T23:13:51+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O &lt;a href=&quot;http://en.wikipedia.org/wiki/Executable_and_Linkable_Format&quot; target=&quot;_blank&quot;&gt;ELF&lt;/a&gt; (Executable and Linkable Format) é um padrão para arquivos executáveis, arquivos-objeto e bibliotecas. Foi usado inicialmente no &lt;a href=&quot;http://en.wikipedia.org/wiki/System_V&quot; target=&quot;_blank&quot;&gt;System V Unix&lt;/a&gt;, sistema operacional comercial da AT&amp;amp;T na década de 80. Em 1993 o controle do padrão passou para um Comitê, o TIS (Tool Interface Standards) formado por um grupo de empresas como IBM, Intel e Borland. Em 1995 foi lançada a versão 1.2 do padrão, versão atual usada até hoje em muitos sabores UNIX, incluindo o GNU/Linux.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Mas porque precisamos de um padrão para arquivos-objeto? A resposta é portabilidade. Para que possamos linkar códigos gerados por diferentes compiladores, linkar nossa aplicação com bibliotecas de diferentes fornecedores, executar o código em diferentes sistemas operacionais, etc.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Na definição do padrão, existem 3 tipos principais de arquivos-objeto:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Arquivos relocáveis: são os arquivos-objeto propriamente ditos, por exemplo os arquivos “.o” gerados pelo gcc quando compilamos um módulo “.c”&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Arquivos executáveis: são arquivos que podem ser executados pelo sistema operacional.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span&gt;&lt;span&gt;Arquivos-objeto compartilhados: são as bibliotecas, “.so” ou “.a” em sistemas GNU/Linux.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;O padrão ELF tem a estrutura exibida na figura abaixo:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;283&quot; src=&quot;http://www.sergioprado.org/wp-content/uploads/elf-spec.png&quot; width=&quot;580&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O Header descreve informações sobre o arquivo, como o tipo de arquivo (objeto, biblioteca ou executável), arquitetura (MIPS, x86 68K, etc), versão, endereços de memória, etc. Já o Section/Segment são os trechos de código compilados. O Program Header Table é usado pelo SO para carregar o programa executável em memória, e o Session Header Table possui informações sobre o Session (trechos) do programa.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Nosso programa de teste será o mais simples possível. Nosso objetivo aqui é apresentar ferramentas de análise do formato ELF presente em sistemas GNU/Linux.&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;#include &amp;quot;stdio.h&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Blog do Sergio Prado&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Compile com o gcc, usando os comandos abaixo:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ gcc &lt;span&gt;-&lt;/span&gt;c main.&lt;span&gt;c&lt;/span&gt;
$ gcc main.&lt;span&gt;o&lt;/span&gt; &lt;span&gt;-&lt;/span&gt;o app&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Foram gerados dois arquivos, o arquivo objeto “main.o” e o executável “app”.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O comando “file” irá exibir informações genéricas sobre os arquivos gerados:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ file main.&lt;span&gt;o&lt;/span&gt;
main.&lt;span&gt;o&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; ELF &lt;span&gt;32&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;bit LSB relocatable&lt;span&gt;,&lt;/span&gt; Intel &lt;span&gt;80386&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; version &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;SYSV&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; not stripped
&amp;nbsp;
$ file app
app&lt;span&gt;:&lt;/span&gt; ELF &lt;span&gt;32&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;bit LSB executable&lt;span&gt;,&lt;/span&gt; Intel &lt;span&gt;80386&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; version &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;SYSV&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; dynamically linked &lt;span&gt;&amp;#40;&lt;/span&gt;uses shared libs&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;for&lt;/span&gt; GNU&lt;span&gt;/&lt;/span&gt;Linux 2.6.15&lt;span&gt;,&lt;/span&gt; not stripped&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Com o comando “readelf”, podemos analisar todas as informações do arquivo gerado. Vamos olhar o header o arquivo objeto main.o:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ readelf &lt;span&gt;-&lt;/span&gt;h main.&lt;span&gt;o&lt;/span&gt;
ELF Header&lt;span&gt;:&lt;/span&gt;
  Magic&lt;span&gt;:&lt;/span&gt;   &lt;span&gt;7f&lt;/span&gt; &lt;span&gt;45&lt;/span&gt; 4c &lt;span&gt;46&lt;/span&gt; &lt;span&gt;01&lt;/span&gt; &lt;span&gt;01&lt;/span&gt; &lt;span&gt;01&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; &lt;span&gt;00&lt;/span&gt; 
  Class&lt;span&gt;:&lt;/span&gt;                             ELF32
  Data&lt;span&gt;:&lt;/span&gt;                              2s complement&lt;span&gt;,&lt;/span&gt; little endian
  Version&lt;span&gt;:&lt;/span&gt;                           &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;current&lt;span&gt;&amp;#41;&lt;/span&gt;
  OS&lt;span&gt;/&lt;/span&gt;ABI&lt;span&gt;:&lt;/span&gt;                            UNIX &lt;span&gt;-&lt;/span&gt; System V
  ABI Version&lt;span&gt;:&lt;/span&gt;                       &lt;span&gt;0&lt;/span&gt;
  Type&lt;span&gt;:&lt;/span&gt;                              REL &lt;span&gt;&amp;#40;&lt;/span&gt;Relocatable file&lt;span&gt;&amp;#41;&lt;/span&gt;
  Machine&lt;span&gt;:&lt;/span&gt;                           Intel &lt;span&gt;80386&lt;/span&gt;
  Version&lt;span&gt;:&lt;/span&gt;                           &lt;span&gt;0x1&lt;/span&gt;
  Entry point address&lt;span&gt;:&lt;/span&gt;               &lt;span&gt;0x0&lt;/span&gt;
  Start of program headers&lt;span&gt;:&lt;/span&gt;          &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;bytes into file&lt;span&gt;&amp;#41;&lt;/span&gt;
  Start of section headers&lt;span&gt;:&lt;/span&gt;          &lt;span&gt;220&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;bytes into file&lt;span&gt;&amp;#41;&lt;/span&gt;
  Flags&lt;span&gt;:&lt;/span&gt;                             &lt;span&gt;0x0&lt;/span&gt;
  Size of this header&lt;span&gt;:&lt;/span&gt;               &lt;span&gt;52&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;bytes&lt;span&gt;&amp;#41;&lt;/span&gt;
  Size of program headers&lt;span&gt;:&lt;/span&gt;           &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;bytes&lt;span&gt;&amp;#41;&lt;/span&gt;
  Number of program headers&lt;span&gt;:&lt;/span&gt;         &lt;span&gt;0&lt;/span&gt;
  Size of section headers&lt;span&gt;:&lt;/span&gt;           &lt;span&gt;40&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;bytes&lt;span&gt;&amp;#41;&lt;/span&gt;
  Number of section headers&lt;span&gt;:&lt;/span&gt;         &lt;span&gt;11&lt;/span&gt;
  Section header &lt;span&gt;string&lt;/span&gt; table index&lt;span&gt;:&lt;/span&gt; &lt;span&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Veja que o header é flexivel o suficiente para manter a portabilidade do formato entre diferentes arquiteturas.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Com o comando readelf você pode ler qualquer informação de um arquivo no formato ELF, mas existem alguns outros comandos que podem te ajudar a analisar um arquivo objeto:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O comando “nm” lista os simbolos do arquivo objeto:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ nm app
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484bc R _IO_stdin_used
         w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
080482b8 T _init
&lt;span&gt;08048330&lt;/span&gt; T _start
0804a014 b completed.7021
0804a00c W data_start
0804a018 b dtor_idx.7023
080483c0 t frame_dummy
...........................
&lt;span&gt;080483e4&lt;/span&gt; T main
         U puts@@GLIBC_2.0&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;O comando “ldd” lista as dependencias de bibliotecas linkadas dinamicamente:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ ldd app 
linux&lt;span&gt;-&lt;/span&gt;gate.&lt;span&gt;so&lt;/span&gt;.1 &lt;span&gt;=&amp;gt;&lt;/span&gt;  &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0x0088d000&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
libc.&lt;span&gt;so&lt;/span&gt;.6 &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;tls&lt;span&gt;/&lt;/span&gt;i686&lt;span&gt;/&lt;/span&gt;cmov&lt;span&gt;/&lt;/span&gt;libc.&lt;span&gt;so&lt;/span&gt;.6 &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0x00d1f000&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;ld&lt;span&gt;-&lt;/span&gt;linux.&lt;span&gt;so&lt;/span&gt;.2 &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0x0099f000&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Mas porque você precisa saber de tudo isso? Talvez porque você vai se aventurar no desenvolvimento de um compilador. Ou porque você encontrou algum problema ao tentar linkar arquivos-objeto ou bibliotecas geradas por diferentes toolchains. Ou porque você esta tendo alguma dificuldade ao tentar executar uma aplicação compilada em um ambiente diferente do ambiente de execução.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Recentemente trabalhei em um projeto onde uma aplicação compilada em uma máquina x86 não rodava em outra máquina de mesma arquitetura por incompatibilidade da versão da biblioteca GLIBC. Na minha máquina rodava a GLIBC_2.7 e na máquina destino rodava a GLIBC_2.6.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Tinhas duas opções, recompilar a aplicação em um ambiente com a versão da GLIBC correta, que poderia levar um certo tempo. Ou então deixar minha aplicação mais portável para rodar em qualquer versão de GLIBC, e encontrar qual a função que estava requisitando a GLIBC_2.7. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Com o comando “nm” descobri que a função “sscanf” estava requisitando a GLIBC_2.7.&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;$ nm app &lt;span&gt;|&lt;/span&gt; grep &lt;span&gt;2.7&lt;/span&gt;
U sscanf@@GLIBC_2.7&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Reescrevi o trecho da aplicação que usava a função sscanf, e o problema foi resolvido de forma bem rápida.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Vale a pena dar uma lida no padrão ELF e entender como todo o processo de linkagem de objetos, geração do executável, carga de bibliotecas dinâmicas e execução funciona. O padrão pode ser baixado &lt;a href=&quot;http://refspecs.freestandards.org/elf/elf.pdf&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Para quem se interessar, existem ainda outros formatos além do ELF, como o &lt;a href=&quot;http://en.wikipedia.org/wiki/A.out&quot; target=&quot;_blank&quot;&gt;a.out&lt;/a&gt; usado nos primórdios de sistemas UNIX, o &lt;a href=&quot;http://en.wikipedia.org/wiki/COFF&quot; target=&quot;_blank&quot;&gt;COFF&lt;/a&gt; usado em alguns UNIX e adaptado para o Microsoft Windows e o &lt;a href=&quot;http://en.wikipedia.org/wiki/Mach-O&quot; target=&quot;_blank&quot;&gt;Mach-O&lt;/a&gt; usado no MacOS X.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Um abraço,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Sergio Prado&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Posts relacionados:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/05/27/misra-c-padrao-para-software-em-c/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Misra-C — Padrão para software em C&quot;&gt;Misra-C — Padrão para software em C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2010/06/17/ferramentas-open-source-para-pic/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Ferramentas open-source para pic&quot;&gt;Ferramentas open-source para pic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sergioprado.org/2009/10/03/ii-seminario-programacao-cc-para-sistemas-embarcados/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Seminário Programação C/C++ para Sistemas Embarcados 2009&quot;&gt;Seminário Programação C/C++ para Sistemas Embarcados 2009&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Sétimo Encontro de Programadores C++</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/ccppbr_setimo"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/ccppbr_setimo</id>
		<updated>2010-07-22T20:09:08+00:00</updated>
		<content type="html">&lt;p&gt;O grupo C &amp;amp; C++ Brasil (ccppbrasil) tem o imenso orgulho em anunciar (agora oficialmente) o nosso sétimo encontro. Detalhes:

&lt;ul&gt;
&lt;li&gt;Sétimo Encontro de Programadores C &amp;amp; C++
&lt;li&gt;dia 14 de agosto de 2010, sábado
&lt;li&gt;em São Paulo, SP. &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=Century+Paulista&amp;sll=-23.573176,-46.649657&amp;sspn=0.008034,0.008272&amp;ie=UTF8&amp;hq=Century+Paulista&amp;hnear=&amp;z=17&amp;iwloc=A&quot;&gt;Rua Teixeira da Silva, 647 - Paraíso&lt;/a&gt;
&lt;li&gt;As palestras de qualidade de sempre
&lt;li&gt;O ótimo chopp/tubaína/networking de sempre após o evento
&lt;li&gt;&lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VII&quot;&gt;Mais detalhes na página do grupo&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/ccppbr_setimo#comments&quot;&gt;1 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-09-03T21:20:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Concepts e templates condicionais</title>
		<link href="http://www.zimbrao.com/cpp/?p=425"/>
		<id>http://www.zimbrao.com/cpp/?p=425</id>
		<updated>2010-07-15T19:43:27+00:00</updated>
		<content type="html">Concepts
O comitê de padronização do C++ox decidiu excluir concepts da proposta de evolução corrente da linguagem. Dessa forma uma importante ferramenta foi deixada de lado.
Na proposta discutida, concepts seria uma forma de garantir que determinado parâmetro de uma template implementa métodos específicos (obedecendo a um padrão) ou possui determinados tipos. Enfim, uma forma de garantir que [...]</content>
		<author>
			<name>Geraldo Zimbrão</name>
			<uri>http://www.zimbrao.com/cpp</uri>
		</author>
		<source>
			<title type="html">BLOG C++</title>
			<subtitle type="html">O BLOG do Zimbrão sobre a linguagem de programação C++!</subtitle>
			<link rel="self" href="http://www.zimbrao.com/cpp/?feed=rss2"/>
			<id>http://www.zimbrao.com/cpp/?feed=rss2</id>
			<updated>2010-08-30T19:35:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Test Driven em C++ cross-compiled é possível</title>
		<link href="http://software.pedro.lamarao.nom.br/2010/07/test-driven-em-c-cross-compiled-e.html"/>
		<id>tag:blogger.com,1999:blog-2393468880781945441.post-4924649353404381248</id>
		<updated>2010-07-06T23:07:36+00:00</updated>
		<content type="html">afe!&lt;br /&gt;&lt;br /&gt;Enquanto não rola um estudo retrospectivo maneiro, aqui vão minhas primeiras impressões.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;por mais que pareça andar de ré, tenha um porting para o sistema do desenvolvedor, onde a compilação não é cruzada;&lt;/li&gt;&lt;li&gt;não exija frameworks xUnit e faça bilhões de programecos se necessário;&lt;/li&gt;&lt;li&gt;guarde no coração que não é preciso reflection nem mesmo shared objects para aplicar dependency injection;&lt;/li&gt;&lt;li&gt;não despreze a tediosa tarefa de testar parte a parte, pequena parte a pequena parte;&lt;/li&gt;&lt;li&gt;não tenha escrúpulos para satisfazer dependências aleatórias com stubs.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;A maior revelação para mim nesse processo foram os pontos 2, 3 e 5 acima.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Após um longo tempo digerindo o problema, e após diversas discussões sobre que framework de testes usar, por fim completei a tarefa da forma mais tosca possível: cada teste é um programa executável individual. &amp;nbsp;O projeto usa cmake para configurar a construção, e o ctest funciona legal com essa lista de programas de teste.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O maior esforço nesse processo foi refatorar o código o suficiente para conseguir testar uma unidade isolada realmente. A dificuldade percebida pela equipe desde o início era devido ao acoplamento entre as diversas unidades teóricas do sistema, e a quantidade de código de inicialização de coisas irrelevantes ao teste. Eventualmente tropecei na idéia de dependency injection. Apesar de ser algo que ocorre em super frameworks de componentes empresariais, o conceito é simples e se mostrou aplicável mesmo em um sistema ligado estaticamente, desde que as unidades fossem desacopladas o suficiente uma da outra. No nosso caso, isso se dá na forma de um Factory central para todo o sistema, pré-existente ao meu esforço.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Claro que esse desacoplamento &quot;suficiente&quot; é um graal e nunca ocorre, especialmente em um ambiente tão confortável quanto o da ligação estática -- onde tudo se junta no final numa grande sopa de elementos.&amp;nbsp;Ocorreu que algumas funções que eram parte da unidade mas não eram exercitadas faziam referência a algum nome que acabava indefinido no programa final -- função ou variável extern.&amp;nbsp;Eventualmente realizei que isso simplesmente não tem solução prática e aceitei a seguinte possibilidade: se uma unidade não compila sem uma função de outra unidade, e a função é irrelevante para o teste, vamos enfiar um stub na jogada e ponto final.&amp;nbsp;De certa forma, isso pode ser considerado um Mock do mundo pré-componentização.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Acaba que, por fim, se não lindamente xUnit, meu objeto de manutenção agora possui uma suite de testes de unidade. Entre os vinte e trinta testes bem básicos que eu bolei pra começar, já descobri umas cinco funções implementadas diferente do que o meu projeto previa. O cmake suporta bem a lista de testes e gera um relatoriozinho bem legal.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2393468880781945441-4924649353404381248?l=software.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://software.pedro.lamarao.nom.br/search/label/cxx</uri>
		</author>
		<source>
			<title type="html">Pedro sobre Software</title>
			<subtitle type="html">Artigos sobre usar software e fazer software. E, às vezes, algum apócrifo sobre hardware.</subtitle>
			<link rel="self" href="http://software.pedro.lamarao.nom.br/feeds/posts/default/-/cxx"/>
			<id>tag:blogger.com,1999:blog-2393468880781945441</id>
			<updated>2010-09-01T09:55:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Depuração: Parte 1</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/FvFBrXVEeLQ/"/>
		<id>http://blog.jorgepereira.com.br/?p=952</id>
		<updated>2010-07-01T03:06:46+00:00</updated>
		<content type="html">&lt;blockquote&gt;
&lt;h2&gt;Seja Elegante&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;p&gt;Talvez possa ser algo que passe despercebido por vários desenvolvedores, porém dúvido quem nunca tenha se deparado com mensagens de &amp;#8220;log&amp;#8221; vagas ou sem nenhum nexo ou bem pior, como mensagens idênticas replicadas por várias partes do código!  &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_eek.gif&quot; alt=&quot;:shock:&quot; class=&quot;wp-smiley&quot; /&gt;&lt;br /&gt;
A algum tempo atrás estava trabalhando em um projeto em que &lt;em&gt;um respectivo desenvolvedor&lt;/em&gt; da equipe possuia o costume de espalhar ou replicar centenas de printf() pelo código com mensagens tipo!&lt;/p&gt;
&lt;p&gt;printf(&amp;#8220;!!! FULANO &amp;#8211; Aqui!!!&amp;#8221;);&lt;/p&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;p&gt;printf(&amp;#8220;!!! FULANO &amp;#8211; Arquivo.cpp:  Aqui!!!\n&amp;#8221;);&lt;/p&gt;
&lt;p&gt;Precisa falar que isto e pessímo? Certo que e preciso um bom senso com o uso de mensagens de depuração pois dependendo ao invés de ajudar podem só atrapalhar. principalmente quando você necessita ter controle sobre tais mensagens, como por exemplo obter a localização da mensagem através do nome da função, arquivo e linha.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;note&quot;&gt;&lt;div class=&quot;notewarning&quot;&gt;Lembrando que dependendo da situação e contexto eu sou a favor de utilizar o pragma no compilador ativando o &amp;#8220;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Directive_(programming)&quot; target=&quot;_blank&quot;&gt;poison&lt;/a&gt;&lt;/em&gt;&amp;#8221; desativando dentre várias funções o printf (), evitando de ter espalhada pelo sistema! Futuramente um post sobre o &lt;em&gt;poison&lt;/em&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;O pré-processador do GCC oferece (*) várias macros, as que irei utilizar em questão são:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;__FILE__ : Substituída pelo nome do arquivo.&lt;/li&gt;
&lt;li&gt;__PRETTY_FUNCTION__ : Substituídas pelo nome nome da função.&lt;/li&gt;
&lt;li&gt;__LINE__ : Substituída pelo número da linha de código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(*) &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html&quot; target=&quot;_blank&quot;&gt;Mais detalhes sobre as macros do GCC.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;A utilização dessas macros irá facilitar a localização das mensagens de depuração, Abaixo um simples exemplo demonstrado em &lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/debug1.c&quot;&gt;debug1.c&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;/**
 * By Jorge Pereira &amp;lt;jpereiran@gmail.com&amp;gt;
 * Date: Tue Jun 29 02:51:44 BRT 2010
 */

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

// Macro condicional
#ifdef DEBUG
#	warning &quot;Debug is enabled&quot;
#	define TRACE_DEBUG(fmt, ...) \
	fprintf(stderr, &quot; ** DEBUG: %s:%d %s(): &quot;fmt&quot;\n&quot;, \
	__FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#	warning &quot;Debug is disabled&quot;
#	define TRACE_DEBUG(fmt, ...)
#endif

#define MAX_STRING 5 /* tamanho maximo de uma string */

// Função simples de exemplo...
void
show_name (const char* name,
		   size_t len)
{
	size_t offset = len;

	// Verificação qualquer...
	if (len &amp;gt; MAX_STRING)
	{
		// Abaixo mensagem de depuração, perceba que ela será ativada apenas
                // quando em tempo de compilação você ativar a macro &quot;&lt;strong&gt;DEBUG&lt;/strong&gt;&quot;
		TRACE_DEBUG (&quot;Ooops! Tamanho da string(%d) e excedeu o limite(%d)...&quot;,
			len, MAX_STRING);
		offset = MAX_STRING;
	}

	// Manipulação qualquer...
	write (STDOUT_FILENO, name, offset);
	write (STDOUT_FILENO, &quot;\n&quot;, 1);
}

int
main (int argc, char* argv[])
{
	if (argc &amp;lt; 2)
	{
		printf (&quot;Usage: %s &amp;lt;string&amp;gt;\n&quot;, argv[0]);
		exit (1);
	}

	show_name (argv[1], strlen (argv[1]));

	return 0;
}&lt;/pre&gt;
&lt;p&gt;Com este exemplo básico em mãos, vamos compilar e executar.&lt;/p&gt;
&lt;pre&gt;[jpereira@miracleworld Codes]$ gcc -Wall -o debug1 debug1.c
debug1.c:18:3: warning: #warning &quot;Debug is disabled&quot;
[jpereira@miracleworld Codes]$ ./debug1 &quot;Jorge&quot;
Jorge
[jpereira@miracleworld Codes]$ ./debug1 &quot;Jorge Pereira&quot;
Jorge
[jpereira@miracleworld Codes]$&lt;/pre&gt;
&lt;p&gt;Imagine que seu sistema possui inúmeros arquivos e você precisa em determinados pontos obter o máximo de informação sobre as mensagens de depuração, talvez seja interessante ter além de uma mensagem objetiva obter juntamente o nome da função, arquivo e linha de onde foi invocada tal mensagem.&lt;/p&gt;
&lt;pre&gt;[jpereira@miracleworld Codes]$ gcc -Wall -DDEBUG -o debug1 debug1.c
debug1.c:13:3: warning: #warning &quot;Debug is enabled&quot;
[jpereira@miracleworld Codes]$ ./debug1 &quot;Jorge&quot;
Jorge
[jpereira@miracleworld Codes]$ ./debug1 &quot;Jorge Pereira&quot;
 ** DEBUG: &lt;strong&gt;debug1.c:36 show_name()&lt;/strong&gt;: Ooops! Tamanho da string(13) e excedeu o limite(5)...
Jorge
[jpereira@miracleworld Codes]$&lt;/pre&gt;
&lt;p&gt;&lt;div class=&quot;note&quot;&gt;&lt;div class=&quot;notetip&quot;&gt; Agora veja situação que você está trabalhando em um sistema com várias checagens complexas de cenários &lt;em&gt;&amp;#8220;nada convencionais&amp;#8221;&lt;/em&gt; em que você não tem certeza se vai acontecer sempre ou não.&lt;br /&gt;
Sem falar que torna-se um atrativo a possibilidade de você poder ativar/desativar o simples mecanismo, como por exemplo poder criar macros para depuração de componentes específicos (ex.: relacionadas a sockets, I/O, sgdb, &amp;#8230;), isto poderá facilitar a identificação e remoção de bugs.&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;note&quot;&gt;&lt;div class=&quot;noteclassic&quot;&gt;Lembrando que este e o primeiro post entre vários que pretendo publicar relacionados a sugestões e técnicas de depuração. Fique de olho na segunda parte desta &lt;em&gt;saga&lt;/em&gt; em que irei explicar uma mais dinâmica do mesmo assunto abordado neste post associando ao uso de variáveis de ambiente.&lt;br /&gt;
Dúvidas e Sugestões, são sempre bem vindas! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;  &lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Autor: Jorge Pereira&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/TXXmBu8ntDgjKiS58cTtN5kSCgI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/TXXmBu8ntDgjKiS58cTtN5kSCgI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/TXXmBu8ntDgjKiS58cTtN5kSCgI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/TXXmBu8ntDgjKiS58cTtN5kSCgI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Adicionado ao Kernel o suporte nativo as teclas especiais do notebook “Sony Vaio VPC-EB15FB”</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/fKVK-p0xyhI/"/>
		<id>http://blog.jorgepereira.com.br/?p=901</id>
		<updated>2010-06-27T07:02:49+00:00</updated>
		<content type="html">&lt;p&gt;Sempre tive preferência pelos produtos produzidos pela Sony, em especial os notebooks. O meu antigo VGN-FS750 começou a apresentar alguns problemas após eu ter dado um tombo nele, desde então nunca mais foi o mesmo. &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_rolleyes.gif&quot; alt=&quot;:roll:&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Porém no mês passado resolvi comprar um novo notebook que fosse preferencialmente da Sony, e após várias buscas cheguei ao modelo &lt;a href=&quot;http://www.sonystyle.com.br/br/site/catalog/ProductDisplay.jsp?parentCatId=cat3890002&amp;category=informatica&amp;tabNum=1&amp;from=1&amp;id=VPCEB15FB/BI&amp;page=searchResult&quot; target=&quot;_blank&quot;&gt;VPC-EB15FB&lt;/a&gt;. Então fui ao shopping e comprei diretamente na loja da SonyStyle o brinquedinho abaixo.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;size-full wp-image-1074 aligncenter&quot; title=&quot;Novo  Notebook, Sony VPC-EB15FB&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/DSC_8288-lower.jpg&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;429&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Assim que cheguei em casa fiz o download do &lt;em&gt;Ubuntu 9.10&lt;/em&gt; e instalei, após o primeiro boot que iniciei a configuração e recuperação dos meus backups do notebook antigo percebi que algumas teclas de atalhos não funcionaram, estranho né? Abaixo imagem das teclas na qual estou me referindo.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-1080&quot; title=&quot;Novo  Notebook, Sony VPC-EB15FB&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/DSC_8278-lower.jpg&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;429&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Obviamente que não fiquei de braços cruzados, fiz checkout diretamente pelo GIT do Kernel o modulo &amp;#8220;&lt;a href=&quot;http://git.kernel.org/?p=linux/kernel/git/mjg59/platform-drivers-x86.git;a=summary&quot; target=&quot;_blank&quot;&gt;platform-drivers-x86&lt;/a&gt;&amp;#8221; e após alguns ajustes já estava adicionado o suporte das novas teclas da &lt;a href=&quot;http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&amp;storeId=10151&amp;langId=-1&amp;categoryId=8198552921644699998&amp;N=4294953240&quot; target=&quot;_blank&quot;&gt;série &lt;/a&gt;&lt;strong&gt;&lt;a href=&quot;http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&amp;storeId=10151&amp;langId=-1&amp;categoryId=8198552921644699998&amp;N=4294953240&quot; target=&quot;_blank&quot;&gt;EB&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&amp;storeId=10151&amp;langId=-1&amp;categoryId=8198552921644699998&amp;N=4294953240&quot; target=&quot;_blank&quot;&gt; de notebooks da Sony&lt;/a&gt; ao Kernel do Linux.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;note&quot;&gt;&lt;div class=&quot;noteclassic&quot;&gt;Resumindo, suporte adicionado seguido de patch gerado e submetido ao Kernel. Agora e aguardar a próxima versão do Kernel para termos por padrão o suporte a tais teclas! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/patchs/0001-sony-laptop-Adding-support-for-new-keys-ASSIST-WEB-a.patch&quot; target=&quot;_blank&quot;&gt;Patch gerado a partir do Kernel ??2.6.35-rc3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/patchs/0001-sony-laptop-Adding-support-for-new-keys-ASSIST-WEB-a.patch&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/LMRtBrX0jKsB_8SQWbW_dRuzKWo/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/LMRtBrX0jKsB_8SQWbW_dRuzKWo/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/LMRtBrX0jKsB_8SQWbW_dRuzKWo/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/LMRtBrX0jKsB_8SQWbW_dRuzKWo/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Introdução aos Linux Device Drivers (ILDD)</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/J-ubtAspNBk/"/>
		<id>http://blog.jorgepereira.com.br/?p=1031</id>
		<updated>2010-06-21T20:10:00+00:00</updated>
		<content type="html">&lt;p&gt;Olá,&lt;/p&gt;
&lt;p&gt;Caso você tenha necessidade ou curiosidade em relação a &lt;em&gt;Device Drivers&lt;/em&gt; no Linux, este com certeza será um bom material para iniciar-se na &amp;#8220;brincadeira&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;size-full wp-image-1043 aligncenter&quot; title=&quot;Linux Device Driver&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/device_driver.jpg&quot; alt=&quot;&quot; width=&quot;241&quot; height=&quot;241&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Introdução aos Linux Device Drivers (ILDD) é um curso que tem por objectivo apresentar os princípios básicos do desenvolvimento de &lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Device_driver&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;device drivers&lt;/em&gt;&lt;/a&gt;&lt;em&gt; no &lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Linux&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Linux&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href=&quot;http://www.kernel.org&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;kernel&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Pretende-se com este curso, que o leitor tenha contacto com várias ferramentas e sub-sistemas existentes no &lt;/em&gt;&lt;a href=&quot;http://www.kernel.org&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;kernel&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, adquirindo assim as bases que lhe irão permitir desenvolver o suporte para a grande maioria dos dispositivos. Alguns dos temas introduzidos são: estrutura básica de um device driver, comunicação com o userspace, memória dinâmica, eventos assíncronos, primitivas de sincronização e comunicação com o hardware.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Este curso aborda o tema de uma perspectiva pedagógica, através da sistematização dos conceitos em conjunto com uma forte componente prática, na qual se convida o leitor à implementação gradual de um &lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Device_driver&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;device driver&lt;/em&gt;&lt;/a&gt;&lt;em&gt; que dará suporte a um dispositivo especificamente concebido para o efeito. O leitor poderá ainda consultar a literatura de referência, de onde se destacam os excelentes títulos: &lt;/em&gt;&lt;a href=&quot;http://lwn.net/Kernel/LDD3&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Linux Device Drivers&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href=&quot;http://www.oreilly.com/catalog/linuxkernel&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Understanding the Linux Kernel&lt;/em&gt;&lt;/a&gt;&lt;em&gt; e &lt;/em&gt;&lt;a href=&quot;http://www.kroah.com/lkn&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Linux Kernel in a Nutshell&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;O autor, com a ajuda dos seus revisores, investiu mais de um ano de trabalho na elaboração e preparação deste curso, no sentido de oferecer à comunidade, não só um manual de aprendizagem abrangente, mas também uma importante referência futura. Caso encontre alguns erros ou tenha sugestões que visam melhorar ou complementar este trabalho, não hesite em &lt;/em&gt;&lt;a href=&quot;http://www.adassumpcao.net/contacts&quot;&gt;&lt;em&gt;contactar&lt;/em&gt;&lt;/a&gt;&lt;em&gt; o autor.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.adassumpcao.net/introducao-aos-linux-device-drivers&quot; target=&quot;_blank&quot;&gt;Download aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/fQop0jWJneLP-ZP_XeR7m0r-yCw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/fQop0jWJneLP-ZP_XeR7m0r-yCw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/fQop0jWJneLP-ZP_XeR7m0r-yCw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/fQop0jWJneLP-ZP_XeR7m0r-yCw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Qualidade de código</title>
		<link href=""/>
		<id>http://0xc0de.wordpress.com/?p=380</id>
		<updated>2010-06-19T21:59:09+00:00</updated>
		<content type="html">Go to english version Recentemente tive a oportunidade de assitir uma palestra do Mark Shuttleworth na Linux Tag 2010. Naturalmente, foram abordados os assuntos de open-source de uma forma mais abrangente e do próprio Ubuntu. Não consegui acompanhar todos os detalhes pois não sou tão envolvido assim com Linux. Mas achei bem interessante quando ele [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=380&amp;subd=0xc0de&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Leandro Melo</name>
			<uri>http://0xc0de.wordpress.com</uri>
		</author>
		<source>
			<title type="html">0xc0de</title>
			<subtitle type="html">Computadores, Programação e TI. Divagações...</subtitle>
			<link rel="self" href="http://0xc0de.wordpress.com/feed/"/>
			<id>http://0xc0de.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Imagens talvez jamais vistas?</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/rqeMSf_WLM0/"/>
		<id>http://blog.jorgepereira.com.br/?p=947</id>
		<updated>2010-06-16T03:00:10+00:00</updated>
		<content type="html">&lt;p&gt;Para descontrair, abaixo segue algumas imagens que registrei durante o passar do tempo.&lt;/p&gt;

&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/ghp-aeroport-santiago-1/&quot; title=&quot;GHP: Vejam está simples tela de informações no aeroporto de santiago.&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/ghp-aeroport-santiago-1-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Vejam está simples tela de informações no aeroporto de santiago.&quot; title=&quot;GHP: Vejam está simples tela de informações no aeroporto de santiago.&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/ghp-aeroport-santiago-2/&quot; title=&quot;GHP: Aeroporto de Santiago, Chile&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/ghp-aeroport-santiago-2-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;GHP: Aeroporto de Santiago, Chile&quot; title=&quot;GHP: Aeroporto de Santiago, Chile&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/onibus-not-found/&quot; title=&quot;O ônibus 'Not Found'&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/onibus-not-found-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;O ônibus 'Not Found'&quot; title=&quot;O ônibus 'Not Found'&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/jogo-para-hackers/&quot; title=&quot;Hackers, o jogo do sysadmin!&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/jogo-para-hackers-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Hackers, o jogo do sysadmin!&quot; title=&quot;Hackers, o jogo do sysadmin!&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/alerj/&quot; title=&quot;Caixa da Alerj&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/alerj-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Caixa da Alerj&quot; title=&quot;Caixa da Alerj&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.jorgepereira.com.br/2010/06/16/imagens-talvez-jamais-vistas/rede-caindo-lower/&quot; title=&quot;Rede caindo direto...&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/rede-caindo-lower-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Rede caindo direto...&quot; title=&quot;Rede caindo direto...&quot; /&gt;&lt;/a&gt;

&lt;p&gt;(*) &lt;a href=&quot;http://gohorseprocess.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Go Horse Process&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/j_wqEyauEhBEfevu_P5_ng92JLw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/j_wqEyauEhBEfevu_P5_ng92JLw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/j_wqEyauEhBEfevu_P5_ng92JLw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/j_wqEyauEhBEfevu_P5_ng92JLw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Por que as empresas teimam em contratar programadores mercenários?</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/oyOsen7t6RQ/"/>
		<id>http://blog.jorgepereira.com.br/?p=925</id>
		<updated>2010-06-13T04:18:55+00:00</updated>
		<content type="html">&lt;p&gt;Recentemente li &lt;a href=&quot;http://www.paulgraham.com/pypar.html&quot;&gt;The  Python Paradox&lt;/a&gt;, de &lt;a href=&quot;http://www.paulgraham.com/&quot;&gt;Paul Graham&lt;/a&gt;,  e sua tradução &lt;a href=&quot;http://www.sounerd.com.br/index.php/component/content/article/191.html&quot;&gt;O  Paradoxo Python&lt;/a&gt; no &lt;a href=&quot;http://www.sounerd.com.br/&quot;&gt;#!SouNerd&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O  texto faz todo sentido: quem aprende a fazer qualquer coisa por gosto  tende a fazer melhor do que quem aprende a fazer por dinheiro. É uma  verdade.&lt;/p&gt;
&lt;p&gt;Assim, quem aprende a programar porque gosta de  programar tende a programar melhor do que quem aprende para ganhar  dinheiro e a grande maioria de quem aprende a programar Java só o faz  por dinheiro (claro que há lá suas exceções), enquanto quem aprende  linguagens mais esóticas o faz por prazer.&lt;/p&gt;
&lt;p&gt;Então por que as  empresas teimam em contratar programadores mercenários?&lt;/p&gt;
&lt;p&gt;Pensando  sobre nisso e observando a comunidade, pensei em uma resposta…&lt;/p&gt;
&lt;p&gt;Eu  vejo três tipos de programadores, como três vértices de um triângulo  cromático, e cada um está em uma região dessa área, mais próximo ou  distante de cada vértice.&lt;/p&gt;
&lt;p&gt;Esses três tipos são: &lt;strong&gt;amador&lt;/strong&gt;,  &lt;strong&gt;mercenário&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;empolgado&lt;/em&gt;&lt;/strong&gt; (por  falta de palavra melhor).&lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mercenário&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O mercenário é  aquele que quer dinheiro e lucro é tudo o que o impulsiona. Geralmente  não tem escrúpulos e faz tudo o que lhe mandam. Seu mantra é: «Pagando  bem, que mal tem?»&lt;/p&gt;
&lt;p&gt;Quem é 100% mercenário geralmente acaba  largando a profissão por algo que dê mais dinheiro, mas basta estar um &lt;em&gt;pentelésimo&lt;/em&gt; mais para o centro do triângulo que permanece na profissão.&lt;/p&gt;
&lt;p&gt;Normalmente  aprende uma linguagem que dê muitas opções de emprego – e que, por  consequência, tenha de competir com muita gente –, como Java, C# ou PHP,  e rejeita todas as demais. Quando as trata como inferiores, é apenas  para tentar justificar a própria incompetência, resultante da falta de  gosto pelo que faz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amador&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O amador é aquele que  gosta de verdade do que está fazendo, ele &lt;em&gt;ama&lt;/em&gt; programar, daí &lt;em&gt;amador&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Quem  é 100% amador quase sempre se perde aprendendo coisas inúteis e não  consegue ganhar dinheiro porque muitas vezes perde o foco do que precisa  fazer, distraindo-se com besteiras.&lt;/p&gt;
&lt;p&gt;Normalmente aprende  linguagens bem diferentes, que poucos sabem, como Lisp, Smalltalk ou  Fortran – talvez LOLCODE –, e não é incomum que aprenda uma penca de  linguagens, nesse caso, também os &lt;em&gt;hypes&lt;/em&gt;, como Python e Ruby.&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Empolgado&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;O  &lt;em&gt;empolgado&lt;/em&gt; é aquele que vai atrás de algum &lt;em&gt;hype&lt;/em&gt;,  linguagem da moda. Há uns anos eram de Java, mas os &lt;em&gt;empolgados&lt;/em&gt; da atualidade querem Python e/ou Ruby.&lt;/p&gt;
&lt;p&gt;Quem é 100% &lt;em&gt;empolgado&lt;/em&gt; sabe tudo que acontece na comunidade, mas quase nada de programação.  Conhece todas as metodologias em alta, sabe todos os macetes e &lt;em&gt;design  patterns&lt;/em&gt; de sua linguagem que precisa para impressionar os  iniciantes, mas não é lá muito eficiente. É tão preocupado com a  auto-imagem e o que acontece na comunidade que se esquece que há todo um  &lt;em&gt;background&lt;/em&gt; a ser aprendido por trás da Computação.&lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Felizmente  (quase) ninguém é 100% alguma coisa.&lt;/p&gt;
&lt;p&gt;Depois de toda  esta dissertação, por que diabos as empresas mais engessadas preferem os  mercenários?&lt;/p&gt;
&lt;p&gt;Por causa de seu mantra! Basta pagar o que o  mercenário acha muito – o que muitas vezes é quase nada pra empresa – e  ele faz qualquer coisa que mandarem, torna-se um cão bem adestrado.  Essas empresas não querem eficiência, querem obediência.&lt;/p&gt;
&lt;p&gt;O que as  empresas não veem é que esses cães não são tão ágeis quanto os gatos  que pulam pelos telhados: aqueles que, apesar de em nenhum extremo, se  encontram mais próximos do vértice do amador.&lt;/p&gt;
&lt;p&gt;Na verdade as  metodologias ágeis &lt;strong&gt;não&lt;/strong&gt; são práticas de trabalho, mas  técnias sociais para atrair programadores que, apesar de ainda um pouco  mercenários, sejam muito mais amadores – ser um pouco &lt;em&gt;empolgado&lt;/em&gt; também ajuda, já que as linguagens &lt;em&gt;hype&lt;/em&gt; facilitam pela grande  mobilidade da comunidade. As empresas mais espertas e as &lt;em&gt;start-up&lt;/em&gt; viram isso e usam as metodologias ágeis para criar equipes enxutas e  mais eficientes do que qualquer equipe de mercenários jamais conseguirá  ser.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://kodumaro.blogspot.com/2010/06/programadores-mercenarios.html&quot; target=&quot;_blank&quot;&gt;Fonte&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/mNQ2NbXlyq5f3zG-24gddRPF4X4/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/mNQ2NbXlyq5f3zG-24gddRPF4X4/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/mNQ2NbXlyq5f3zG-24gddRPF4X4/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/mNQ2NbXlyq5f3zG-24gddRPF4X4/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Conhecendo e utilizando a LD_PRELOAD</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/90o_vw04VVA/"/>
		<id>http://blog.jorgepereira.com.br/?p=460</id>
		<updated>2010-06-11T06:55:59+00:00</updated>
		<content type="html">&lt;p&gt;Muitas pessoas utilizam, utilizaram ou vão utilizar a variável &lt;strong&gt;LD_PRELOAD&lt;/strong&gt;, e por sua vez nem sempre sabem para que ela serve! Caso este seja o seu problema, problema este não mais será!! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;O que acontece basicamente e que o linker dinâmico do Linux (assim como em tantos outros sistemas operacionais) utiliza diversas formas, alguma delas sendo através de variáveis de ambiente para controlar seu comportamento. Sendo que neste caso a variável &lt;strong&gt;LD_PRELOAD&lt;/strong&gt; informa ao linker dinâmico que carregue as bibliotecas listadas nela antes de carregar quaisquer outras bibliotecas necessárias, enquando &lt;strong&gt;LD_LIBRARY_PATH&lt;/strong&gt; especifica um caminho alternativo para usar ao procurar bibliotecas que serão carregadas.&lt;/p&gt;
&lt;p&gt;Partindo deste principio podemos fazer com que um programa a ser executado seja &amp;#8220;hijacked&amp;#8221; por outro programa, ou seja. Podemos fazer por &lt;em&gt;exemplo&lt;/em&gt; que a função hehe() previamente chamada pelo programa &amp;#8220;A&amp;#8221; tenha seu comportamento alterado sem precisar fazer quaisquer alteração no programa &amp;#8220;A&amp;#8221;. Um pouco complexo? talvez! Mais vamos por a mão na massa! hands on!&lt;/p&gt;
&lt;p&gt;Digamos que você tem o programa &amp;#8220;main&amp;#8221; conforme o código de exemplo abaixo, perceba que o código e super simples. apenas declaro um ponteiro de caracteres, aloco memória e em seguida copio uma sequência de caracteres para o ponteiro previamente alocado. Simples, certo?&lt;/p&gt;
&lt;p&gt;1) Abaixo código de exemplo de nosso &amp;#8220;&lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/main.c&quot;&gt;main.c&lt;/a&gt;&amp;#8221; ou clique aqui para download.&lt;/p&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;/*
 *  Filename: hijack_main.c
 *  Created: Wed Jun  9 22:11:12 BRT 2010
 *  Author: Jorge Pereira &amp;lt;jpereiran@gmail.com&amp;gt;
 */
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int
main (int argc,
      char* argv[])
{
  char* nome = (char*)malloc (100);

  strcpy (nome, &quot;Jorge Pereira&quot;);
  printf (&quot;NOME: %s\n&quot;, nome);

  free (nome);
  return 0;
}&lt;/pre&gt;
&lt;p&gt;# Vamos compilar e executar o nosso exemplo &amp;#8220;main.c&amp;#8221;&lt;/p&gt;
&lt;pre&gt;$ gcc -Wall -o main main.c
$ ./main
NOME: Jorge Pereira
$&lt;/pre&gt;
&lt;p&gt;Até aqui tudo bem, porém imagine você em uma determinada situação em que precisa saber quantos bytes está sendo alocado por um determinado programa? e você por alguns instantes imagina sobre a possibilidade de poder fazer algum tipo de &amp;#8220;overload&amp;#8221; de uma determinada função na qual você conhece sua assinatura. (Digamos, você sabe a assinatura do método, quantidade e tipos dos parâmetros, &amp;#8230;).&lt;/p&gt;
&lt;p&gt;Pois bem, neste exemplo que irei demonstrar será para sobrecarregar todas as chamadas feitas pelo meu programa &amp;#8220;main&amp;#8221; às funções malloc() e free() e em seguida exibir uma mensagem no caso do malloc() imprimindo seu parâmetro que e o tamanho de bytes alocados, e na função free() exibindo os ponteiros que foram liberados.&lt;/p&gt;
&lt;p&gt;Neste caso, iremos criar uma biblioteca chamada &amp;#8220;libhijack_hehe.so&amp;#8221; que será carregada através da variável mágica &lt;strong&gt;LD_PRELOAD&lt;/strong&gt; em parceria com nosso querido linker dinâmico.&lt;/p&gt;
&lt;p&gt;2) Abaixo código de exemplo de &amp;#8220;&lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/hijack_hehe.c&quot;&gt;hijack_hehe.c&lt;/a&gt;&amp;#8220;, ou clique aqui para download.&lt;/p&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;/*
 *  Filename: hijack_hehe.c
 *  Created: Wed Jun  9 22:11:12 BRT 2010
 *  Author: Jorge Pereira &amp;lt;jpereiran@gmail.com&amp;gt;
 */
#define _GNU_SOURCE
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdarg.h&amp;gt;

#include &amp;lt;dlfcn.h&amp;gt;

#define HIJACK_DEBUG(fmt, ...) \
	fprintf(stderr, &quot; ** DEBUG: %s:%d %s(): &quot;fmt&quot;\n&quot;, \
	__FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)

static void* (*hack_malloc)(size_t size) = NULL;
static void  (*hack_free)(void *p) = NULL;

static void* rest_malloc = NULL;

void*
malloc (size_t size)
{
  if (hack_malloc == NULL)
  {
    hack_malloc = (void *(*)(size_t)) dlsym (RTLD_NEXT, &quot;malloc&quot;);
    rest_malloc = NULL;
  }

  if (rest_malloc == NULL)
  {
    rest_malloc = hack_malloc (size);
    HIJACK_DEBUG (&quot;Alocando (%d) bytes, chunck(%p)&quot;, size, (void*)rest_malloc);
    return rest_malloc;
  }

  hack_malloc = NULL;
  return rest_malloc;
}

void
free (void *p)
{
	HIJACK_DEBUG (&quot;Desalocando (%p)&quot;, p);

  if (hack_free == NULL)
  {
    hack_free = (void (*)(void *)) dlsym(RTLD_NEXT, &quot;free&quot;);
  }

  hack_free (p);
}&lt;/pre&gt;
&lt;p&gt;Agora vamos compilar, executar e analisar o comportamento.&lt;/p&gt;
&lt;pre&gt;$ gcc -Wall -shared -ldl -o libhijack_hehe.so hijack_hehe.c
$ LD_PRELOAD=./libhijack_hehe.so ./main
 ** DEBUG: hijack_hehe.c:35 malloc(): Alocando (100) bytes, chunck(0x9273008)
NOME: Jorge Pereira
 ** DEBUG: hijack_hehe.c:46 free(): Desalocando (0x9273008)
$&lt;/pre&gt;
&lt;p&gt;Percebeu algo diferente na execução com a &lt;strong&gt;LD_PRELOAD&lt;/strong&gt; passando como parâmetro a nossa libhijack_hehe.so? pois bem, todas as chamadas às funções malloc() e free() foram sobrecarregadas e passaram a se comportar conforme as versões que escrevi em &lt;strong&gt;hijack_hehe.c&lt;/strong&gt;. Caso tenha ficado curioso, e so re-escrever tais exemplos com outras funções que você deseja sobrecarregar e ver o comportamento. Lembrando que basta utilizar a criatividade e perceberá na quantidade de coisas que podem ser feita com tal técnica.&lt;/p&gt;
&lt;p&gt;Exemplo: Nas funções que fazem checagem com strcmp(), uso da crypt(), &amp;#8230; entre outras.&lt;/p&gt;
&lt;p&gt;Referências&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;man 8 ld.so&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt; Autor: &lt;/strong&gt;Jorge Pereira&lt;br /&gt;
&lt;strong&gt; Data:&lt;/strong&gt; Wed Jun  9 23:42:26 BRT 2010&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/NBJTOKTkpH7_fgKfh7JCpYProMg/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/NBJTOKTkpH7_fgKfh7JCpYProMg/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/NBJTOKTkpH7_fgKfh7JCpYProMg/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/NBJTOKTkpH7_fgKfh7JCpYProMg/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Que poeira danada!</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/DBRa30KMAec/"/>
		<id>http://blog.jorgepereira.com.br/?p=906</id>
		<updated>2010-06-09T23:56:01+00:00</updated>
		<content type="html">&lt;p&gt;Caso tenho alguém por aqui ainda, saiba que &lt;span&gt;ao contrário deste blog&lt;/span&gt; estou vivo, embora muita coisa tenha mudado nestes meses que me ausentei do blog. Confesso que inúmeros problemas desde de uma cirurgia para retirada de um pequeno tumor entre o esôfago e pulmão, notebook quebrou, muito e muito trabalho na empresa, outros problemas de saúde até tantos outros imprevistos e inconvenientes que surgiram ao decorrer do tempo!&lt;/p&gt;
&lt;p&gt;Pois bem, parece que foi ontem! E já se passaram mais de um ano que estou morando e trabalhando aqui no Rio de Janeiro. E confesso que está sendo muito difícil ter tempo livre para quaisquer tipo de atividade que costumava ter, uma delas era o fato de &amp;#8220;blogar&amp;#8221;. Mais as coisas se acertaram e agora e a hora da reviravolta. &lt;em&gt;move on&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;E antes de mais nada, e preciso passar uma vassoura por aqui pois está muito empoeirado. Por esses meses que se passaram desde o meu último post em 23 de outubro, eu estarei mudando a cara do Blog para marcar a minha volta a comunidade OpenSource e principalmente aos projetos pessoais e em especial as contribuições com o GNOME (Pois é, estou em falta com muita coisa!), inclusive sobre um patch que fiz para o kernel recentemente adicionando suporte ao novo modelo de notebook da Sony VPCEB15FB que tem algumas funcionalidades diferente antes não suportada no Kernel. Estarei comentando mais sobre o assunto brevemente!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/faxina.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-907    aligncenter&quot; title=&quot;Faxina&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/faxina.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;E isto, só tenho a agradecer aos amigos que acompanharam os problemas que surgiram e agora e bola pra frente e correr atrás do tempo perdido!!&lt;/p&gt;
&lt;p&gt;De volta a comunidade, Happy hacking! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;obs&amp;gt;A Imagem foi copiada do blog do meu parceiro &lt;a href=&quot;http://www.larryjr.com/&quot; target=&quot;_blank&quot;&gt;Larry.Jr&lt;/a&gt;, thanks! =)&amp;lt;/obs&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/T8suyH0b7B0ywTun3Bq3Fzdg4_g/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/T8suyH0b7B0ywTun3Bq3Fzdg4_g/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/T8suyH0b7B0ywTun3Bq3Fzdg4_g/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/T8suyH0b7B0ywTun3Bq3Fzdg4_g/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jorge Pereira</name>
			<uri>http://blog.jorgepereira.com.br</uri>
		</author>
		<source>
			<title type="html">.:: Jorge Pereira ::.</title>
			<subtitle type="html">&quot;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&quot;</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JorgePereira"/>
			<id>http://feeds.feedburner.com/JorgePereira</id>
			<updated>2010-09-01T04:50:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">typenames e templates</title>
		<link href="http://www.zimbrao.com/cpp/?p=411"/>
		<id>http://www.zimbrao.com/cpp/?p=411</id>
		<updated>2010-06-07T13:24:24+00:00</updated>
		<content type="html">Manipulação de tipos em C++
Há uma certa dificuldade para os programadores iniciantes na área de templates que se aventuram a manipular tipos. A primeira delas é quanto ao uso da palavra reservada typename. Essa palavra deve ser utilizada para informar ao compilador que o nome que vem em seguida é um tipo, e não um [...]</content>
		<author>
			<name>Geraldo Zimbrão</name>
			<uri>http://www.zimbrao.com/cpp</uri>
		</author>
		<source>
			<title type="html">BLOG C++</title>
			<subtitle type="html">O BLOG do Zimbrão sobre a linguagem de programação C++!</subtitle>
			<link rel="self" href="http://www.zimbrao.com/cpp/?feed=rss2"/>
			<id>http://www.zimbrao.com/cpp/?feed=rss2</id>
			<updated>2010-08-30T19:35:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Const e Volatile</title>
		<link href="http://www.caloni.com.br/blog/archives/const-e-volatile"/>
		<id>http://www.caloni.com.br/blog/archives/const-e-volatile</id>
		<updated>2010-06-04T17:26:33+00:00</updated>
		<content type="html">&lt;pre&gt;Padrão C (ISO/IEC 9899:1990)

6.5.3 type-qualifier
 const
 volatile&lt;/pre&gt;
&lt;pre&gt;Padrão C++ (ISO/IEC 14882:1998)

cv-qualifier
 const
 volatile&lt;/pre&gt;
&lt;h4&gt;Qualificadores de tipo&lt;/h4&gt;
&lt;p&gt;Chamamos de qualificador de tipo as palavrinhas mágicas &lt;strong&gt;const &lt;/strong&gt;e &lt;strong&gt;volatile&lt;/strong&gt;. Na prática elas definem como uma determinada variável será usada e se comportará durante a vida do programa.&lt;/p&gt;
&lt;h4&gt;Const&lt;/h4&gt;
&lt;p&gt;Uma variável const não pode ser alterada pelo programa durante sua execução, apenas durante sua inicialização:&lt;/p&gt;
&lt;pre&gt;const float pi = 3.14; // até onde sabemos, pi não irá mudar neste Universo&lt;/pre&gt;
&lt;p&gt;No exemplo acima, o valor de pi não pode mais ser alterado. Só que repare que ele foi, em determinado momento, alterado com um valor constante: na sua inicialização. Isso quer dizer que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pi é uma variável no programa representada por um local na memória &lt;strong&gt;endereçável &lt;/strong&gt;pelo programa&lt;/li&gt;
&lt;li&gt;pi não é um define do pré-processador que irá virar uma constante literal (3.14, por exemplo)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;// eu posso endereçar uma constante,
// desde que qualifique corretamente meu ponteiro
const float* ppi = &amp;amp; pi;&lt;/pre&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/const-memory.png&quot; alt=&quot;const-memory.png&quot; height=&quot;291&quot; width=&quot;133&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Teoricamente a região da memória que contiver uma variável const pode ser qualificada pelo sistema operacional como somente-leitura, mas isso não é uma obrigação. É obrigação do compilador avisar sobre tentativas de alteração da variável no meio do programa, mas nem sempre é possível enxergar que a memória não é alterável. Dessa forma, resultados imprevisíveis podem ocorrer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/const-gpf.png&quot; alt=&quot;const-gpf.png&quot; height=&quot;506&quot; width=&quot;545&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Uso prático&lt;/h4&gt;
&lt;p&gt;Eu costumo usar variáveis const no lugar de defines. Além de ganhar na tipagem as constantes não precisam ser necessariamente globais, nem acessíveis por outros módulos. Um outro uso muito comum é criar variáveis locais que você sabe que não devem ser alteráveis por ninguém, como o tamanho de matrizes primitivas.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;namespace&lt;/span&gt; Math
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;const&lt;/span&gt; &lt;span&gt;float&lt;/span&gt; Pi = &lt;span&gt;3&lt;/span&gt;.&lt;span&gt;14&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;//...&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; func1&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; x&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;float&lt;/span&gt; calc = x * Math::&lt;span&gt;Pi&lt;/span&gt;;
	&lt;span&gt;return&lt;/span&gt; calc;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;//...&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; func2&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; y&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;const&lt;/span&gt; &lt;span&gt;size_t&lt;/span&gt; PathSize = MAX_PATH * &lt;span&gt;2&lt;/span&gt;;
	&lt;span&gt;//...&lt;/span&gt;
	&lt;span&gt;//...&lt;/span&gt;
	&lt;span&gt;char&lt;/span&gt; path&lt;span&gt;&amp;#91;&lt;/span&gt;PathSize&lt;span&gt;&amp;#93;&lt;/span&gt;;
	&lt;span&gt;//...&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;h4&gt;Volatile&lt;/h4&gt;
&lt;p&gt;O significado do volatile teoricamente muda de implementação para implementação, mas na prática é uma forma de definir uma variável que está sendo acessada por outros programas/threads/entidades espíritas que podem alterar o seu valor sem seu programa notar quando.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/volatile-girl.jpg&quot; title=&quot;Se concentre! Não é esse tipo de volatile!&quot; alt=&quot;Se concentre! Não é esse tipo de volatile!&quot; height=&quot;189&quot; width=&quot;189&quot; /&gt;&lt;/p&gt;
&lt;p&gt;O exemplo clássico da API Win32 é o &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms683614%28VS.85%29.aspx&quot;&gt;InterlockedIncrement&lt;/a&gt;, que realiza operações atômicas em valores inteiros. Para fazer isso é necessário usar um recurso interno disponível pelo processador que irá modificar a memória sem intrusão de outras threads/processadores.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/interlocked-increment.png&quot; alt=&quot;interlocked-increment.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Uso prático&lt;/h4&gt;
&lt;p&gt;Variáveis volatile geralmente interagem de alguma forma com o sistema em que rodam, e são representadas por ponteiros para memória retornada por esse sistema ou documentada como sendo de uso específico.&lt;/p&gt;
&lt;h4&gt;Const e Volatile&lt;/h4&gt;
&lt;p&gt;É possível que exista uma variável que não pode ser modificada pelo seu programa, mas é modificada pelo sistema, de forma que ela é uma mutante!&lt;/p&gt;
&lt;pre&gt;/// endereça o relógio do sistema, atualizado a cada 1/100 milissegundos
const volatile int* g_systemClock = (const volatile int*) 0x7689B9D4;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://fotos-videos-incriveis.blogspot.com/2009/04/tubarao-mutante.html&quot; title=&quot;mutante.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fotos-videos-incriveis.blogspot.com/2009/04/tubarao-mutante.html&quot; title=&quot;mutante.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/mutante.jpg&quot; alt=&quot;mutante.jpg&quot; height=&quot;102&quot; width=&quot;129&quot; /&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A definição de *g_systemClock é de uma memória que não pode ser alterada; só que ela é, pelo sistema. Então a variável também é volatile. No entanto, independente de ser const ou volatile, o tipo nunca será &lt;strong&gt;alterado&lt;/strong&gt;, apenas &lt;strong&gt;qualificado&lt;/strong&gt;. São duas coisas diferentes na linguagem.&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">C: como passar estrutura pra função usando ponteiros</title>
		<link href="http://wend.elmaqu.es/?p=119"/>
		<id>http://wend.elmaqu.es/?p=119</id>
		<updated>2010-06-03T15:17:00+00:00</updated>
		<content type="html">Abaixo, um exemplo, sobre como passar uma estrutura de dados para uma função. Ao receber a estrutura a função f() faz modificações nessa estrutura. #include &amp;#60;stdio.h&amp;#62; #include &amp;#60;string.h&amp;#62; #include &amp;#60;stdlib.h&amp;#62; // a estrutura. *d vai guardar somente o endereço do bloco de letras, // não as letras, as letras vão tá na memória em algum [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enum</title>
		<link href="http://www.caloni.com.br/blog/archives/enum"/>
		<id>http://www.caloni.com.br/blog/archives/enum</id>
		<updated>2010-05-31T17:11:09+00:00</updated>
		<content type="html">&lt;pre&gt;Padrão C (ISO/IEC 9899:1990)

6.5.2.2 enum-specifier
 &lt;strong&gt;enum&lt;/strong&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;Padrão C++ (ISO/IEC 14882:1998)

type-specifier
 enum-specifier

enum-specifier
 &lt;strong&gt;enum&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;Uma enumeração faz duas coisas: define um novo tipo, parecido com um inteiro, e cria uma &lt;strong&gt;lista de constantes com nomes significativos&lt;/strong&gt;. A definição técnica do tipo de um enum é mais complicada, mas basicamente ele é um novo int.&lt;/p&gt;
&lt;p&gt;Como funciona: definimos uma lista com cada elemento tendo um valor inteiro, geralmente único. Todos os nomes usados na lista passam a fazer parte do espaço de nomes atual e funcionam como constantes com o seu valor definido no início.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;enum&lt;/span&gt; FileType &lt;span&gt;// criamos o novo tipo inteiro FileType&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   Binary = &lt;span&gt;1&lt;/span&gt;, &lt;span&gt;// Binary &amp;eacute; uma constante com valor igual a 1&lt;/span&gt;
   Text = &lt;span&gt;2&lt;/span&gt;, &lt;span&gt;// Text &amp;eacute; uma constante com seu sizeof igual a sizeof(FileType)&lt;/span&gt;
   Mixed = &lt;span&gt;3&lt;/span&gt; &lt;span&gt;// Todas as constantes da enumera&amp;ccedil;&amp;atilde;o s&amp;atilde;o do mesmo tipo&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Obs.: Os elementos que não possuem valor definido são definidos automaticamente como o valor do elemento anterior acrescidos de um. Se for o primeiro elemento, seu valor padrão é zero.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;enum&lt;/span&gt; Numbers
&lt;span&gt;&amp;#123;&lt;/span&gt;
   zero,  &lt;span&gt;// igual a zero&lt;/span&gt;
   one,   &lt;span&gt;// igual a um&lt;/span&gt;
   two,   &lt;span&gt;// igual a dois&lt;/span&gt;
   three  &lt;span&gt;// igual a tres&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;enum&lt;/span&gt; Hexa
&lt;span&gt;&amp;#123;&lt;/span&gt;
   JulioCesar = &lt;span&gt;1&lt;/span&gt;,
   Lucio = &lt;span&gt;3&lt;/span&gt;,
   Juan,                &lt;span&gt;// Juan = 3 + 1 = 4&lt;/span&gt;
   Gilberto Silva = &lt;span&gt;6&lt;/span&gt;,
   Felipe Melo          &lt;span&gt;// 6 + 1 = 7&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;
&lt;em&gt;Detalhe bizarro&lt;/em&gt;: você sabia que, apesar da vírgula ser usada para separar valores de enumeração, ela pode também terminar uma listagem? Por algum motivo exdrúxulo (se alguém quiser explicar), um valor de enumeração foi definido de tal forma que sempre poderá existir uma vírgula terminando ele:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;enum&lt;/span&gt; VirgulaSafada &lt;span&gt;&amp;#123;&lt;/span&gt; 
   um = &lt;span&gt;1&lt;/span&gt;, 
   dois, 
   tres, &lt;span&gt;// o que essa v&amp;iacute;rgula no final t&amp;aacute; fazendo aqui?&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;&lt;/p&gt;
&lt;h4&gt;Uso prático&lt;/h4&gt;
&lt;p&gt;Geralmente usamos enumerações para definir valores únicos (tag) em um argumento de função, ou, mais moderno, como substituto daqueles antigos defines em C para mapas de bits. Nesse último caso não usamos o tipo da enumeração, pois ele pode conter apenas um valor único definido, e não um conjunto deles:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;enum&lt;/span&gt; ModoDeServir
&lt;span&gt;&amp;#123;&lt;/span&gt;
   assado,
   cozido,
   frito,
   cru
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; Cook&lt;span&gt;&amp;#40;&lt;/span&gt;Prato p, ModoDeServir ms&lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   Cook&lt;span&gt;&amp;#40;&lt;/span&gt;frango, cozido&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;enum&lt;/span&gt; FileOpenMode
&lt;span&gt;&amp;#123;&lt;/span&gt;
   fomRead   = 0x0001,
   fomWrite  = 0x0002,
   fomOver   = 0x0004,
   fomDel    = 0x0008,
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; OpenFile&lt;span&gt;&amp;#40;&lt;/span&gt;DWORD fileOpenMode&lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   OpenFile&lt;span&gt;&amp;#40;&lt;/span&gt;fomRead | fomWrite&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Note que usamos uma enumeração nesse último caso para termos um nome significativo para uma flag, além desse nome fazer de fato parte dos nomes do programa, e não um define que, para o compilador, não existe.&lt;/p&gt;
&lt;h4&gt;Boas práticas&lt;/h4&gt;
&lt;p&gt;Como os tipos da enumeração passam a pertencer ao namespace atual, eles podem se misturar facilmente com todos os nomes daquele namespace. Dessa forma, é útil e bem organizado definir um prefixo para os nomes, que pode ser formado pelas iniciais do nome da enumeração, como no exemplo acima (fom = &lt;strong&gt;F&lt;/strong&gt;ile&lt;strong&gt;O&lt;/strong&gt;pen&lt;strong&gt;M&lt;/strong&gt;ode).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/enum-namespace.png&quot; alt=&quot;enum-namespace.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;O surgimento do enum veio como evolução de uma prática já consagrada pelo uso na linguagem C, que eram as listas de valores constantes criados através de defines com algum prefixo em comum (FILE_SHARE_*, SW_SHOW_*, etc). Portanto, sempre que se encontrar em uma situação para criar esse tipo de lista, a enumeração é o caminho atualmente ideal.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;// A listagem abaixo pode virar um enum...&lt;/span&gt;
&lt;span&gt;#define FOM_READ   0x0001&lt;/span&gt;
&lt;span&gt;#define FOM_WRITE  0x0002&lt;/span&gt;
&lt;span&gt;#define FOM_OVER   0x0004&lt;/span&gt;
&lt;span&gt;#define FOM_DEL    0x0008&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// ... como este aqui!&lt;/span&gt;
&lt;span&gt;enum&lt;/span&gt; FileOpenMode
&lt;span&gt;&amp;#123;&lt;/span&gt;
   FOM_READ   = 0x0001,
   FOM_WRITE  = 0x0002,
   FOM_OVER   = 0x0004,
   FOM_DEL    = 0x0008,
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;// esse peda&amp;ccedil;o de c&amp;oacute;digo abaixo...&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   OpenFile&lt;span&gt;&amp;#40;&lt;/span&gt;path, FOM_WRITE&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// ... vira isso ap&amp;oacute;s ser pr&amp;eacute;-processado...&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   OpenFile&lt;span&gt;&amp;#40;&lt;/span&gt;path, 0x0002&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// ... mas isso se fossem usados enums...&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   OpenFile&lt;span&gt;&amp;#40;&lt;/span&gt;path, FOM_WRITE&lt;span&gt;&amp;#41;&lt;/span&gt;; &lt;span&gt;// FOM_WRITE faz parte da linguagem&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;h4&gt;Atualização: e qual a diferença?&lt;/h4&gt;
&lt;p&gt;Perguntado &lt;a href=&quot;http://www.caloni.com.br/blog/archives/enum#comment-17806&quot;&gt;por um leitor&lt;/a&gt; sobre qual a diferença prática do último exemplo, onde temos praticamente o mesmo resultado entre usar defines e enumerações, imaginei que a mesma dúvida pode ter surgido para várias pessoas, porque é uma boa dúvida. Dá a entender que o autor deste artigo está se atentando a preciosismos da linguagem (e está mesmo!), mas à vezes as aparências enganam.&lt;/p&gt;
&lt;p&gt;Para ilustrar melhor fiz um mais elaborado. Aqui, estamos lendo pedaços de dados que tiveram que ser alinhados com alguma &quot;gordura&quot;.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;// alinhamento obrigat&amp;oacute;rio pelo leiaute dos dados&lt;/span&gt;
&lt;span&gt;#define CHUNKSZ_BASE 0x5000&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define CHUNKSZ_TINY   0x1000 + CHUNKSZ_BASE&lt;/span&gt;
&lt;span&gt;#define CHUNKSZ_SMALL  0x2000 + CHUNKSZ_BASE&lt;/span&gt;
&lt;span&gt;#define CHUNKSZ_MEDIUM 0x4000 + CHUNKSZ_BASE&lt;/span&gt;
&lt;span&gt;#define CHUNKSZ_HUGE   0x8000 + CHUNKSZ_BASE&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;// alinhamento obrigat&amp;oacute;rio pelo leiaute dos dados&lt;/span&gt;
&lt;span&gt;static&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; chunkSizeBase = 0x5000;
&amp;nbsp;
&lt;span&gt;enum&lt;/span&gt; ChunkSize
&lt;span&gt;&amp;#123;&lt;/span&gt;
   chunkszTiny   = 0x1000 + chunkSizeBase,
   chunkszSmall  = 0x2000 + chunkSizeBase,
   chunkszMedium = 0x4000 + chunkSizeBase,
   chunkszHuge   = 0x8000 + chunkSizeBase,
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;// Fonte original&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;// lendo quadro peda&amp;ccedil;os de dados (tamanho m&amp;eacute;dio)&lt;/span&gt;
   ReadChunkFromFile&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;, CHUNKSZ_MEDIUM * &lt;span&gt;4&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
	&lt;span&gt;// lendo quadro peda&amp;ccedil;os de dados (tamanho m&amp;eacute;dio)&lt;/span&gt;
   ReadChunkFromFile&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;, chunkszMedium * &lt;span&gt;4&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;// P&amp;oacute;s-processado&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;// lendo sei l&amp;aacute; o que (perde alinhamento)&lt;/span&gt;
   ReadChunkFromFile&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;, 0x4000 + CHUNKSZ_BASE * &lt;span&gt;4&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
	&lt;span&gt;// lendo quadro peda&amp;ccedil;os de dados (tamanho m&amp;eacute;dio)&lt;/span&gt;
   ReadChunkFromFile&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;, chunkszMedium * &lt;span&gt;4&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aviso para os programadores mais calejados, eu omiti propositalmente os parênteses obrigatórios para qualquer define que tenha cálculos matemáticos, para ilustrar que muitas vezes o que vemos &lt;strong&gt;antes&lt;/strong&gt; não é o que aparece &lt;strong&gt;depois.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">An introduction to libvirt’s LXC (LinuX Container) support</title>
		<link href="http://wend.elmaqu.es/?p=115"/>
		<id>http://wend.elmaqu.es/?p=115</id>
		<updated>2010-05-30T14:16:55+00:00</updated>
		<content type="html">This is a short^H^H^H^H^H long mail to introduce / walk-through some recent developments in libvirt to support native Linux hosted container virtualization using the kernel capabilities the people on this list have been adding in recent releases. We've been working on this for a few months now, but not really publicised it before now, and [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Modificadores e qualificadores de tipo</title>
		<link href="http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo"/>
		<id>http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo</id>
		<updated>2010-05-28T12:06:29+00:00</updated>
		<content type="html">&lt;blockquote&gt;&lt;em&gt;@caloni poderia pensar em fazer um artigo sobre os modificadores de tipo em c? os mais complexo, acho eu: volatile, enum, union, extern, etc&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;Uma coisa de cada vez: existem &lt;strong&gt;modificadores &lt;/strong&gt;(ou qualificadores) de tipo e &lt;strong&gt;especificadores&lt;/strong&gt; de tipo. &lt;em&gt;Volatile&lt;/em&gt; e &lt;em&gt;extern&lt;/em&gt; se encaixam na primeira categoria, &lt;em&gt;enum&lt;/em&gt; e &lt;em&gt;union&lt;/em&gt; na segunda. Veremos um pouco desses dois lados da linguagem em doses paliativas.&lt;/p&gt;
&lt;h4&gt;Padrão C (ISO/IEC 9899:1990)&lt;/h4&gt;
&lt;pre&gt;6.5.2.2 enum-specifier
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/enum&quot;&gt;enum&lt;/a&gt;

6.5.3 type-qualifier
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/const-e-volatile&quot;&gt;const&lt;/a&gt;
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/const-e-volatile&quot;&gt;volatile&lt;/a&gt;

6.5.2.1 struct-or-union
 struct
 union

6.5.1 storage-class-specifier
 typedef
 extern
 static
 auto
 register&lt;/pre&gt;
&lt;h4&gt;Padrão C++ (ISO/IEC 14882:1998)&lt;/h4&gt;
&lt;pre&gt;type-specifier
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/enum&quot;&gt;enum-specifier&lt;/a&gt;

enum-specifier
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/enum&quot;&gt;enum&lt;/a&gt;

cv-qualifier
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/const-e-volatile&quot;&gt;const&lt;/a&gt;
 &lt;a href=&quot;http://www.caloni.com.br/blog/archives/const-e-volatile&quot;&gt;volatile&lt;/a&gt;

class-key
 class
 struct
 union

storage-class-specifier
 auto
 register
 static
 extern
 mutable

decl-specifier
 storage-class-specifier
 typedef&lt;/pre&gt;
&lt;h4&gt;Modificadores de tipo&lt;/h4&gt;
&lt;p&gt;Um modificador de tipo é opcional na definição de um tipo e deve estar sempre relacionado com a declaração de alguma variável. Ele determina, em termos gerais, qual será a função dessa variável. Ela pode ser modificada? Onde ela se encontra no programa? Como ela será modificada?&lt;/p&gt;
&lt;p&gt;Como exemplo rápido, temos abaixo uma variável que é atualizada pelo clock do processador e uma variável que não pode ser alterada após sua primeira atribuição:&lt;/p&gt;
&lt;pre&gt;volatile int* clockSecs = &amp;lt;algum-endereço-do-sistema&amp;gt;;&lt;/pre&gt;
&lt;pre&gt;
const float pi = 3.14;&lt;/pre&gt;
&lt;p&gt;Fica meio óbvio que a primeira variável possui seu valor volátil, ou seja, muda conforme o tempo passa, e não depende do próprio código (pode mudar sem sua permissão). A segunda variável também tem um uso explícito, uma vez que o valor de pi nunca será alterado (não nesse Universo).&lt;/p&gt;
&lt;h4&gt;Especificadores de tipo&lt;/h4&gt;
&lt;p&gt;Os especificadores de tipo possuem cada um sua peculiaridade. Os mais peculiares, que veremos nos próximos artigos, serão as enumerações e as construções bizarras de structs e unions.&lt;/p&gt;
&lt;pre&gt;enum Contador { um = 1, dois, tres, };&lt;/pre&gt;
&lt;pre&gt;
union Atoms { struct { int part1; int part2; } parts; int64 total; };&lt;/pre&gt;
&lt;p&gt;Aqui não é um compêndio teórico sobre a linguagem. Vamos falar particularmente da programação Windows, mas esteja livre para dar seus pitacos com respeito a outros sistemas operacionais e suas implementações igualmente exdrúxulas =)&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Spiral Fill Puzzle</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!303.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!303</id>
		<updated>2010-05-26T03:57:03+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;At the Algorithms (O) Group in LinkedIn, there is a puzzle to fill a matrix N x M using a spiral form.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;An example of 3 x 3 matrix:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;1 2 3&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;8 9 4&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;7 6 5&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;You can encounter the &lt;/font&gt;&lt;a href=&quot;http://www.linkedin.com/groupAnswers?viewQuestionAndAnswers=&amp;gid=1920463&amp;discussionID=18134577&amp;sik=1274844376638&amp;trk=ug_qa_q&amp;goback=.anh_1920463.ana_1920463_1274844376638_5_1&quot;&gt;&lt;font size=&quot;2&quot;&gt;original post here&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;2&quot;&gt;.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt; My suggestion, written in C++, was:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;cstdio&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; TROWS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; TCOLUMNS&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;1&quot;&gt;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; matrix&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ROWS = TROWS, COLUMNS = TCOLUMNS;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; v[row][col]; }&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; set( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; value ) { v[row][col] = value; }&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;private&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; v[TROWS][TCOLUMNS];&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ROWS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; COLUMNS&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; spiral_fill( matrix&amp;lt;ROWS, COLUMNS&amp;gt;&amp;amp; m, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; rows = ROWS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; cols = COLUMNS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; top_left = 0, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; seed = 0 )&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; n = seed;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; cols_minus_2 = cols - 2, rows_minus_2 = rows - 2; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; top_left_plus_rows = top_left + rows, top_left_plus_cols = top_left + cols;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; top_left_plus_1 = top_left + 1;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; i = top_left; i &amp;lt; top_left_plus_cols; ++i ) &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//top&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;m.set( top_left, i, ++n );&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; i = top_left_plus_1; i &amp;lt; top_left_plus_rows - 1; ++i ) &lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//right&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;m.set( i, top_left_plus_cols - 1, ++n );&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( rows &amp;gt; 1 ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; i = top_left_plus_cols - 1; i &amp;gt;= top_left; --i ) &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//bottom&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;m.set( top_left_plus_rows - 1, i, ++n );&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( cols &amp;gt; 1 ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; i = top_left_plus_rows - 2; i &amp;gt; top_left; --i ) &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//left&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;m.set( i, top_left, ++n );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( rows &amp;gt; 2 &amp;amp;&amp;amp; cols &amp;gt; 2 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font size=&quot;1&quot;&gt;        //int new_seed = seed + rows * cols - rows_minus_2 * cols_minus_2;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;        &lt;/font&gt;int&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;new_seed = seed + 2 * rows + 2 * cols - 4; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot; size=&quot;1&quot;&gt;//expression simplification pointed by Eldar Musayev (check the original post link at the top)&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;spiral_fill( m, rows_minus_2, cols_minus_2, top_left_plus_1, new_seed ); &lt;/font&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ROWS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; COLUMNS&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; display( &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; matrix&amp;lt;ROWS, COLUMNS&amp;gt;&amp;amp; m )&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    using&lt;/font&gt;&lt;/font&gt; std::printf;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; i = 0; i &amp;lt; m.ROWS; ++i )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; j = 0; j &amp;lt; m.COLUMNS; ++j )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;printf( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;%03d &amp;quot;&lt;/font&gt;&lt;/font&gt;, m.get(i, j) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;printf( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\n&amp;quot;&lt;/font&gt;&lt;/font&gt; );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;printf( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\n&amp;quot;&lt;/font&gt;&lt;/font&gt; );&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ROWS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; COLUMNS&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; fill_and_display_matrix(){ matrix&amp;lt;ROWS, COLUMNS&amp;gt; m; spiral_fill( m ); display( m ); }&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; main()&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;1, 1&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;1, 2&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;1, 9&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;9, 1&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;9, 2&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;2, 1&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;2, 2&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;3, 3&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    f&lt;/font&gt;ill_and_display_matrix&amp;lt;4, 4&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;5, 5&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;10, 10&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;fill_and_display_matrix&amp;lt;15, 10&amp;gt;();&lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;The results:&lt;/div&gt;&lt;a href=&quot;https://auulma.bay.livefilestore.com/y1mKw5Bb9ybHqUaEAO28qg819mGpXnoIUZgbfKlm5UXXqUB-DkbNhhpXpHAjEYggwezWHXbSCT_G0qZq_m0BYOsoHyBsZ2tYyFRPb9dwiBzC1J7XogOvlOac8cECLFsYtmsXWqgUgXS6IJbQTfr-zssNA/SpiralFillPuzzle.png&quot; rel=&quot;wlpp;url=https://auulma.bay.livefilestore.com/y1mkw5bb9ybhquaeao28qg819mgpxnoiuzgbfklm5uxxqub-dkbnhhpxphajeyggwezwhxbsct_g0qzq_m0byosohybsz2tyyfrpb9dwibzc1j7xogovloac8ceclfsytmsxwqgugxs6ijbqtfr-zssna/spiralfillpuzzle.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://auulma.bay.livefilestore.com/y1mKw5Bb9ybHqUaEAO28qg819mGpXnoIUZgbfKlm5UXXqUB-DkbNhhpXpHAjEYggwezWHXbSCT_G0qZq_m0BYOsoHyBsZ2tYyFRPb9dwiBzC1J7XogOvlOac8cECLFsYtmsXWqgUgXS6IJbQTfr-zssNA/SpiralFillPuzzle.png&quot; width=&quot;379&quot; height=&quot;537&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://auulma.bay.livefilestore.com/y1m2zXtzC9j7VtWmGrwLQi6QOz5JUfywKhHzMqJ2o3hkddphxdFTAbcPOnDM3zyPoioyzklg_IDUY7FzdYC5Ikns7mettD7pBJHdZ98q5Zpxzk1MViAr_bsB83_uddQ1byLOL-oigwf5fTV0saJcNA3VA/SpiralFillPuzzle.png&quot; rel=&quot;wlpp;url=https://auulma.bay.livefilestore.com/y1m2zxtzc9j7vtwmgrwlqi6qoz5jufywkhhzmqj2o3hkddphxdftabcpondm3zypoioyzklg_iduy7fzdyc5ikns7mettd7pbjhdz98q5zpxzk1mviar_bsb83_uddq1bylol-oigwf5ftv0sajcna3va/spiralfillpuzzle.png&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://auulma.bay.livefilestore.com/y1mBFAh8ldBe2QbG8e_4lcpLatc2t-II7OnaEC5LrY3r1vg4UyBl_Sc6B7FcuW4E7s1AD95p3L_4Mx6Io6E-nrMwzccfF15rWz27ZiGt6fMslOu1qjWDlWxw9CsZJygSCbdULL89TyHu-kiZFuZ8enh7A/SpiralFillPuzzleWin.png&quot; rel=&quot;wlpp;url=https://auulma.bay.livefilestore.com/y1mbfah8ldbe2qbg8e_4lcplatc2t-ii7onaec5lry3r1vg4uybl_sc6b7fcuw4e7s1ad95p3l_4mx6io6e-nrmwzccff15rwz27zigt6fmslou1qjwdlwxw9cszjygscbdull89tyhu-kizfuz8enh7a/spiralfillpuzzlewin.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://auulma.bay.livefilestore.com/y1mBFAh8ldBe2QbG8e_4lcpLatc2t-II7OnaEC5LrY3r1vg4UyBl_Sc6B7FcuW4E7s1AD95p3L_4Mx6Io6E-nrMwzccfF15rWz27ZiGt6fMslOu1qjWDlWxw9CsZJygSCbdULL89TyHu-kiZFuZ8enh7A/SpiralFillPuzzleWin.png&quot; width=&quot;271&quot; height=&quot;574&quot; /&gt;&lt;/a&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;I hope to know if this could be considered a &lt;a href=&quot;http://en.wikipedia.org/wiki/Applied_aesthetics&quot;&gt;beautiful code&lt;/a&gt; (search for beautiful code) - &amp;quot;...it is clear, concise, explains the intent of the programmer, and expands the understanding that one can gain by simply looking at the code.&amp;quot; - &lt;a href=&quot;http://en.wikipedia.org/&quot;&gt;Wikipedia&lt;/a&gt;.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;This version can be parallelized too. It's not a perfect parallelization (ok, I can see some false sharing here and there), but works... Maybe I'll write a CUDA or DirectCompute (or both) version of this puzzle &lt;img title=&quot;Sorriso&quot; alt=&quot;Sorriso&quot; src=&quot;http://shared.live.com/rzvDQW1qjIikH13dsbM42g/emoticons/smile_regular.gif&quot; /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;To parallelize using PPL, only these adds:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;ppl.h&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; Concurrency;&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;structured_task_group g_Tasks;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;...&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;auto&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; task = make_task( [&amp;amp;]{ spiral_fill( m, rows_minus_2, cols_minus_2, top_left_plus_1, new_seed ); } );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;1&quot;&gt;g_Tasks.run_and_wait( task );&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/div&gt;</content>
		<author>
			<name>Fábio Galuppo</name>
			<uri>http://fabiogaluppo.spaces.live.com/</uri>
		</author>
		<source>
			<title type="html">The House of Software Engineer</title>
			<link rel="self" href="http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/Main?$format=rss20"/>
			<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/-5300274535508806924</id>
			<updated>2010-09-03T21:20:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Mais Tio</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/tio_after_launch"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/tio_after_launch</id>
		<updated>2010-05-15T21:29:11+00:00</updated>
		<content type="html">&lt;p&gt;Aos que foram à palestra e lançamento do Tio no &lt;a href=&quot;http://nosqlbr.com&quot;&gt;nosqlbr&lt;/a&gt;, algumas coisas que eu esqueci de falar:

&lt;ul&gt;
&lt;li&gt;O Tio funciona com 3 campos: key, value e metadata. Esses campos podem ter o tipo string, int, double e raw (blob).
&lt;li&gt;As chaves dos maps só podem ser strings. Mas você pode acessar por índice numérico para ler o n-ésimo item do map
&lt;li&gt;Todo container tem suporte à propriedades. Por exemplo, você pode criar uma propriedade &quot;schema&quot; em um container para saber como serializar ou desserializar o que está no campo value
&lt;li&gt;Para fazer um &lt;a href=&quot;http://en.wikipedia.org/wiki/upsert&quot;&gt;upsert&lt;/a&gt;, é só fazer algo como &quot;my_map['rodrigo'] = 'strauss'&quot;
&lt;li&gt;Eu quebrei o build do Linux... Quem for testar hoje, tem que compilar em Release e usar somente os containers em memória (volatile/list, volatile/list, etc). Corrijo isso essa semana :-)
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Quase tudo que eu falei está na &lt;a href=&quot;http://code.google.com/p/tio/w&quot;&gt;documentação do projeto&lt;/a&gt;. Quem tiver mais dúvidas, o melhor canal para perguntar são as duas listas de discussão (&lt;a href=&quot;http://groups.google.com/group/tio-project&quot;&gt;inglês&lt;/a&gt; e &lt;a href=&quot;http://groups.google.com/group/tio-project-brasil&quot;&gt;português&lt;/a&gt;).

&lt;p&gt;A apresentação está em &lt;a href=&quot;http://docs.google.com/present/view?id=dg9kbfzn_73m4c7qvc6&quot;&gt;http://docs.google.com/present/view?id=dg9kbfzn_73m4c7qvc6&lt;/a&gt;
&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/tio_after_launch#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-09-03T21:20:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">C++0x vai mudar sua vida: listas de inicialização</title>
		<link href="http://software.pedro.lamarao.nom.br/2010/05/c0x-vai-mudar-sua-vida-listas-de.html"/>
		<id>tag:blogger.com,1999:blog-2393468880781945441.post-7126722537848820208</id>
		<updated>2010-05-15T20:27:49+00:00</updated>
		<content type="html">Com a nova sintaxe para listas de inicialização, é como se agora houvesse uma notação para o valor literal de praticamente qualquer estrutura de dados.&lt;br /&gt;&lt;br /&gt;Observe meu teste de unidade construindo um &quot;attribute template&quot; PKCS #11 com std::vector direto na inicialização:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;std::vector attributes&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; CK_ATTRIBUTE { CKA_CLASS, &amp;amp;object_class, sizeof(object_class) },&lt;br /&gt;&amp;nbsp; CK_ATTRIBUTE { CKA_TOKEN, &amp;amp;on_token, sizeof(on_token) },&lt;br /&gt;&amp;nbsp; CK_ATTRIBUTE { CKA_LABEL, &amp;amp;label, sizeof(label) },&lt;br /&gt;&amp;nbsp; CK_ATTRIBUTE { CKA_APPLICATION, &amp;amp;application, sizeof(application) },&lt;br /&gt;&amp;nbsp; CK_ATTRIBUTE { CKA_VALUE, &amp;amp;data, sizeof(data) }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;O segredo da notação está nessa pseudo-gramática:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; type-name identifier &lt;/i&gt;{ &lt;i&gt;initializer-list&lt;/i&gt; };&lt;br /&gt;&lt;br /&gt;que é análoga em significado a:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; type-name identifier&lt;/i&gt; ( &lt;i&gt;argument-list&lt;/i&gt; );&lt;br /&gt;&lt;br /&gt;ou:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;i&gt;type-name identifier = type-name &lt;/i&gt;( &lt;i&gt;argument-list&lt;/i&gt; );&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2393468880781945441-7126722537848820208?l=software.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://software.pedro.lamarao.nom.br/search/label/cxx</uri>
		</author>
		<source>
			<title type="html">Pedro sobre Software</title>
			<subtitle type="html">Artigos sobre usar software e fazer software. E, às vezes, algum apócrifo sobre hardware.</subtitle>
			<link rel="self" href="http://software.pedro.lamarao.nom.br/feeds/posts/default/-/cxx"/>
			<id>tag:blogger.com,1999:blog-2393468880781945441</id>
			<updated>2010-09-01T09:55:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">vim + minibufexpl + vtreeexplorer + mswin + mouse=a + screen = VIM IDE</title>
		<link href="http://wend.elmaqu.es/?p=108"/>
		<id>http://wend.elmaqu.es/?p=108</id>
		<updated>2010-05-14T17:46:56+00:00</updated>
		<content type="html">Então, o QT Creator é ótimo, mas, muitas vezes é preciso trabalhar dentro de uma VM ou remotamente, fazendo algum serviço que irá fornecer dados para a interface em Qt. Sendo assim, trabalhar com o VIM cru, fica dificil, pra editar, compilar e depurar o código. Abaixo, meu .vimrc que tornar o VIM praticamente uma [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">vim + qt + autocomplete</title>
		<link href="http://wend.elmaqu.es/?p=103"/>
		<id>http://wend.elmaqu.es/?p=103</id>
		<updated>2010-05-14T13:14:57+00:00</updated>
		<content type="html">Baseado no post Code completion in VIM for C/C++/Java/Python, segue dicas rápidas para adicionar suporte ao autocomplete do Qt4 ao VIM (Unbutu). ~/.vimrc source $VIMRUNTIME/mswin.vim syntax enable se nu set tabstop=4 set shiftwidth=4 set expandtab filetype on filetype plugin on set nocp autocmd FileType python set omnifunc=pythoncomplete#Complete autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS autocmd FileType html [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Apresentação do Tio dia 15 de maio no nosqlbr</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/tio_launch"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/tio_launch</id>
		<updated>2010-05-11T13:11:31+00:00</updated>
		<content type="html">&lt;p&gt;Esse sábado acontecerá o &lt;a href=&quot;http://nosqlbr.com&quot;&gt;primeiro evento brasileiro sobre nosql&lt;/a&gt;, organizado pelo @porcelli do &lt;a href=&quot;http://porcelli.github.com/OpenSpotLight/index.html&quot;&gt;OpenSpotlight&lt;/a&gt;. Eu farei a palestra &quot;Tio: um nosql Made in Brasil&quot;. Tio? Ãh?

&lt;p&gt;Eu ando parindo um nosql já faz mais de um ano, depois de passar mais de um ano pensando no conceito. Aproveitando esse evento e a modinha do nosql, acho que agora é a hora de publicar os fontes e divulgar. Os fontes e a documentação estão em &lt;a href=&quot;http://code.google.com/p/tio&quot;&gt;http://code.google.com/p/tio&lt;/a&gt; (apesar da insistência do @porcelli para que eu colocasse no github :-)) 

&lt;p&gt;Para o pessoal de C++, o Tio nada mais é do que containers STL em um servidor remoto, mas tudo construído sobre um base &lt;a href=&quot;http://www.1bit.com.br/en.wikipedia.org/wiki/Publish/subscribe&quot;&gt;publish/subscribe&lt;/a&gt;. Olha como fica simples construir alguns softwares server side com esse conceito:

&lt;ul&gt;
&lt;li&gt;Servidor de filas: criar uma lista, o producer manda as coisas fazendo push_back na lista e o consumer usa pop_front. Ou o commando &lt;a href=&quot;http://code.google.com/p/tio/wiki/TioAsClusterCoordinator&quot;&gt;wnp_next&lt;/a&gt;, que facilitar a contrução de clusters computacionais.
&lt;li&gt;Servidor de chat: criar uma lista de mensagem para cada usuário. O usuário assina as modificações da própria lista e quem quiser mandar uma mensagem pra ele faz um push_back na lista. Você pode criar um map com os IDs dos usuários, onde o valor é o nome da lista de mensagens. Se você assinar esse mapa, ainda será notificado automagicamente sobre todos os usuários criados ou apagados
&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Minha idéia é: todo software server mantém estado e notifica clientes das modificações nesses estados. Eu faço isso bastante usando C++, e é sempre isso. Um monte de containers STL para controlar o estado da aplicação, e código para enviar notificações via TCP para os interessados. O Tio faz quase todo esse serviço sozinho. Muitos protótipos de aplicação podem ser feito com zero linhas de código server.

&lt;p&gt;Os fontes e a documentação estão lá &lt;a href=&quot;http://code.google.com/p/tio&quot;&gt;no site do projeto Tio&lt;/a&gt;. Para compilar no Windows, tem um projeto do Visual Studio 2008 (não testei no Express, mas deve funcionar). No Linux, você vai precisa do CMake (&quot;cmake . &amp;amp;&amp;amp; make&quot; faz o serviço). Você vai precisar do Boost devidamente instalado, compilado e configurado, o Tio é feito usando Boost Asio. O fonte é bem simples e direto, deve ser um bom ponto de aprendizado para quem está estudando Boost Asio.

&lt;p&gt;Criei duas listas de discussão: uma &lt;a href=&quot;http://groups.google.com/group/tio-project&quot;&gt;em inglês&lt;/a&gt;, e uma &lt;a href=&quot;http://groups.google.com/group/tio-project-brasil&quot;&gt;em português&lt;/a&gt;. Note que o site do Tio é todo em inglês (e os comentários do Wiki devem ser em inglês). Está nos planos ter documentação em português também. Mas eu sou um só :-)&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;Nos fontes você vai achar um client para C++ e um client Python. Por falta de tempo, o client Python está mais refinado do que o client C++. Em C++ tudo é feito usando algo como 

&lt;pre&gt;shared_ptr&amp;lt;TioContainer&amp;gt;&lt;/pre&gt; 
e
&lt;pre&gt;container-&gt;PushBack(TIONULL, &quot;abcdef&quot;)&lt;/pre&gt;
Em Python você usa um container remoto como se fosse local, com coisas tipo 
&lt;pre&gt;container[&quot;rodrigostrauss&quot;] = &quot;messages/rodrigostrauss&quot;&lt;/pre&gt;

&lt;p&gt;Para maiores explicações e o chopp/happyhour/networking de sempre, nos encontramos no evento de nosql esse sábado. Traga suas perguntas e comparações com outros nosql.&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/tio_launch#comments&quot;&gt;1 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-09-03T21:20:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Último post pelo Blogger</title>
		<link href="http://www.driverentry.com.br/blog/2010/04/ultimo-post-pelo-blogger.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-4010019450307371183</id>
		<updated>2010-04-28T21:26:37+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.driverentry.com.br/images/BloggerToWP.png&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Olá cambada! Puts, eu já estava com saudade de postar alguma coisa. Pena este ser mais um daqueles chatos posts Off-Topic. O que posso fazer? É o que temos para o momento.&lt;/p&gt;&lt;p&gt;Hoje pela manhã recebi um mais um e-mail de aviso do &lt;a href=&quot;http://www.blogger.com&quot;&gt;Blogger&lt;/a&gt; dizendo que o suporte à publicação via FTP estão com os dias contatos. Como este recurso é utilizado por menos de 5% dos seus usuários, resolveram dar fim à ele. Mas essa não foi a principal razão pela qual eu decidi deixar de postar pelo Blogger para usar o &lt;a href=&quot;http://www.wordpress.org&quot;&gt;WordPress&lt;/a&gt;. Eu já vinha ensaiando essa transição há pelo menos dois anos. A faculdade e outras desculpinhas esfarrapadas não me deixavam pôr essa idéia em prática. Alguns leitores já vinham reclamando da falta de um índice geral e da separação dos posts em categorias, coisas que o WordPress faz com uma mão nas costas.&lt;/p&gt;&lt;p&gt;Como um web designer, eu sou um excelente desenvolvedor de drivers, e eu já tinha ouvido falar que o WordPress usava PHP e MySQL, assuntos os quais eu não tenho a menor intimidade. Inicialmente contei com a ajuda do meu irmão que já possuia um &lt;a href=&quot;http://www.kabloc.com.br&quot;&gt;blog&lt;/a&gt; pelo WordPress, mas assim como eu, ele também tinha faculdade e outras prioridades. Por um tempo eu contratei os serviços de um web designer que colocava em prática as minhas ídéias com relação ao novo layout, mas por fim ele se envolveu com algo maior e fiquei na mão novamente.&lt;/p&gt;&lt;p&gt;A idéia de migrar o blog persistia, mas a preguiça, a falta de tempo e de domínio de HTML e CSS me fizeram ir empurrando esse problema com a barriga. Cheguei até a ler o guia o oficial da famosa série &lt;span&gt;&quot;Preciso aprender isso de qualquer jeito&quot;&lt;/span&gt;, o livro &lt;a href=&quot;http://www.amazon.com/WordPress-Dummies-Computer-Tech/dp/0470149469&quot;&gt;&quot;WordPress for Dummies&quot;&lt;/a&gt;. Pra quem está acostumado a ler livros de assuntos um tanto mais cabeludos, as mais de 380 páginas do livro foram como um passeio no parque. O mais surpreendente pra mim foi descobrir que o WordPress é uma ferramenta que não requer prática nem tampouco habilidade, e isso incluia as habilidades de PHP e MySQL que eu não tenho. Uma ferramenta poderosa, flexível e simples. A parte desagradável dessa história é que tudo que o livro falou sobre HTML e CSS é que ele não falava a respeito.&lt;/p&gt;&lt;a href=&quot;http://www.amazon.com/WordPress-Dummies-Computer-Tech/dp/0470149469&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/wordpress-for-dummies.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p&gt;Até aqui excelente. Os 67 posts poderiam ser migrados mas o layout ainda foi o meu carma. Outras tentativas de encontrar alguém disposto a fazer o design pra mim me mostrou que estou no emprego errado. Esse negócio de desenvolver drivers não está com nada. Pra ganhar dinheiro mesmo o negócio é fazer Web Design.&lt;/p&gt;&lt;p&gt;Há uns três meses, quando recebi o primeiro aviso do Blogger sobre o fim do suporte ao FTP foi o momento &lt;span&gt;&quot;Agora ou nunca&quot;&lt;/span&gt;. Minha faculdade não me servia mais de desculpa e aos poucos fui colocando a mão na massa. Depois de muito trabalho manual de migrar cada post e cada comentário, veio o layout. Graças ao site &lt;a href=&quot;http://www.w3schools.com/&quot;&gt;W3Schools&lt;/a&gt;, às aulas particulares de Photohop do meu irmão e à ajuda de alguns amigos, essa semana consegui publicar o novo blog. Ainda faltam muitas coisas. A página &lt;span&gt;&quot;About Me&quot;&lt;/span&gt; ainda não tem nada &lt;span&gt;about me&lt;/span&gt;. A página de treinamentos, que vai falar sobre os cursos que ofereço ainda fala exatamente isso: &lt;span&gt;&quot;Essa página vai falar sobre os cursos que ofereço&quot;&lt;/span&gt;. Ainda estou instalando alguns plug-ins que vão ajudar em uma coisa aqui e outra ali. Mas o fato é que há dois dias do prazo final do suporte ao FTP, o novo blog já está no ar.&lt;/p&gt;&lt;p&gt;Esse post foi o último a ser contruído no Blogger com o objetivo principal de avisar àqueles que seguem o RSS original de que o endereço agora mudou. O novo RSS será provido em um novo endereço.&lt;/p&gt;&lt;p&gt;Eu não poderia terminar esse blog sem agraceder às pessoas que tiveram a paciência de me aturar com testes e dúvidas sobre HTML, CSS e sei-lá mais o que. Um muito obrigado aos meus amigos &lt;a href=&quot;http://www.caloni.com.br&quot;&gt;Lesma&lt;/a&gt;, Thiago &lt;a href=&quot;http://twitter.com/thiago_morais&quot;&gt;Oliveira&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/tgbrito&quot;&gt;Thiago Brito&lt;/a&gt;, meu irmão &lt;a href=&quot;http://www.kabloc.com.br&quot;&gt;Kabloc&lt;/a&gt;, &lt;a href=&quot;http://william.net.br/yap/&quot;&gt;Willam&lt;/a&gt;, &lt;a href=&quot;http://www.oblita.com/&quot;&gt;Francisco&lt;/a&gt;, à minha esposa Magda que migrou todos os comentários e a todos os outros que não me lembro agora (eu perturbei muita gente).&lt;/p&gt;&lt;p&gt;Se você não conhecia o blog antigo, &lt;a href=&quot;http://www.driverentry.com.br/blogger&quot;&gt;aqui&lt;/a&gt; estão as páginas do velho aposentado.&lt;br /&gt;Valeu!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-4010019450307371183?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-08-30T19:35:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">C/C++: NULL vs 0</title>
		<link href="http://wend.elmaqu.es/?p=100"/>
		<id>http://wend.elmaqu.es/?p=100</id>
		<updated>2010-04-22T01:49:11+00:00</updated>
		<content type="html">Mais um assunto bacana que foi discutido na lista CPPBRASIL. O André fez algumas observações sobre o uso de NULL ou 0 e o Hugo complementou com informações bem interessantes. Essa informação é bem bacana para os novatos como eu que está tentando aprender essa complexa e poderosa linguagem que é o C++. Segue abaixo [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Concurrency Double Coverage</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!286.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!286</id>
		<updated>2010-04-21T22:13:56+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This post is equivalent to 2 of them.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Here I'm pointing the materials for 2 talks I'd given about Concurrency: &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&amp;EventID=1032443622&amp;CountryCode=BR&quot;&gt;Paralelismo com .NET Framework 4.0&lt;/a&gt; - MSDN Brazil WebCast &lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Paralelismo com .NET Framework 4 WebCast/DotNet4^_ParallelSamples.zip&quot;&gt;Samples&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Paralelismo com .NET Framework 4 WebCast/Paralelismo com .NET Framework 4.0.pdf&quot;&gt;Slides&lt;/a&gt; from this talk&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;&lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&quot;&gt;Introduction to Visual C++ 10 Concurrency Runtime&lt;/a&gt; - 6. Encontro C&amp;amp;C++ Brasil&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Introdu%c3%a7%c3%a3o a Concurrency Runtime do Visual C++ 10 - 6. encontro grupo C ^0 C++ Brasil/ConcRTSamples.zip&quot;&gt;Samples&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Introdu%c3%a7%c3%a3o a Concurrency Runtime do Visual C++ 10 - 6. encontro grupo C ^0 C++ Brasil/ConcRT - 0x06 Encontro de Programadores C ^0 C++.pdf&quot;&gt;Slides&lt;/a&gt; from this talk&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;Both talks covered concurrency/parallel programming, of course. &lt;img title=&quot;Wink&quot; alt=&quot;Wink&quot; src=&quot;http://shared.live.com/rzvDQW1qjIikH13dsbM42g/emoticons/smile_wink.gif&quot; /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The first one was about .NET Framework 4.0 and the new features including: Task Parallel Library, PLINQ, Concurrency Collections, and a lot of managed code and concurrency stuff. The samples was written in C#. During the Q&amp;amp;A section someone asked about the use of those features with UI. I put an extra sample covering this issue!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The second one was about &lt;strong&gt;&lt;font size=&quot;4&quot;&gt;C++&lt;/font&gt;&lt;/strong&gt;, my &lt;u&gt;number one&lt;/u&gt; favorite programming language, and concurrency. In fact, was about a Introduction to &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd504870.aspx&quot;&gt;ConcRT&lt;/a&gt;, a concurrency runtime &lt;a href=&quot;http://blogs.msdn.com/vcblog/archive/2010/04/13/visual-studio-2010-is-now-available.aspx&quot;&gt;shipped with Visual C++ 10&lt;/a&gt;.  &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://auulma.bay.livefilestore.com/y1mE7NBsngdnYxp7ncbe7GFDEpIpD3-RbNSjcjQU_oY9kYokbYi3HgWv5vg3u38e1w7SKl3HZLEyWcjmtbtnUl_JGsDqQLLtgIGUOtNxq3RO4QqrhKy7CYRnfb3-RL6rQkTJmG66PGNUDCAjqasaGb_-A/ParallelSamples.png&quot; rel=&quot;wlpp;url=https://auulma.bay.livefilestore.com/y1me7nbsngdnyxp7ncbe7gfdepipd3-rbnsjcjqu_oy9kyokbyi3hgwv5vg3u38e1w7skl3hzleywcjmtbtnul_jgsdqqlltgiguotnxq3ro4qqrhky7cyrnfb3-rl6rqktjmg66pgnudcajqasagb_-a/parallelsamples.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://auulma.bay.livefilestore.com/y1mE7NBsngdnYxp7ncbe7GFDEpIpD3-RbNSjcjQU_oY9kYokbYi3HgWv5vg3u38e1w7SKl3HZLEyWcjmtbtnUl_JGsDqQLLtgIGUOtNxq3RO4QqrhKy7CYRnfb3-RL6rQkTJmG66PGNUDCAjqasaGb_-A/ParallelSamples.png&quot; width=&quot;712&quot; height=&quot;439&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;If you want to try these samples and amazing features for free, you can download the &lt;a href=&quot;http://www.microsoft.com/express/Downloads/#2010-Visual-CPP&quot;&gt;Visual C++ 10 Express&lt;/a&gt; and the other &lt;a href=&quot;http://www.microsoft.com/express/Downloads/&quot;&gt;Visual Studio 10 tools&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Every post has a code. Thus, it isn't different:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Find Files (sequential and parallel) in C#:&lt;/div&gt;
&lt;div&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.Collections.Generic;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.Threading.Tasks;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; System.Collections.Concurrent;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; DotNet4_ParallelSamples&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;dir&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; = System.IO.&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Directory&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot; size=&quot;1&quot;&gt;FileFinder&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;gt; FindFiles(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; dir_path, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; filenameHint)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addItem;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; filesFound = CreateResultBuffer(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;out&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; addItem);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;FindFilesCore(dir_path, filenameHint, addItem);&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; filesFound;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;[] GetFiles(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; dir_path)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; files = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;[&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;];&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        try&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;files = &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot; size=&quot;1&quot;&gt;dir&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;.GetFiles(dir_path);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;/* ignore */&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;UnauthorizedAccessException&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;) { }&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (System.IO.&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IOException&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;) { }&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;/* ignore */&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; files;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;[] GetDirectories(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; dir_path)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; directories = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;[&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;];&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;        try&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;directories = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;dir&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;.GetDirectories(dir_path);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;/* ignore */&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;UnauthorizedAccessException&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;) { }&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (System.IO.&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IOException&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;) { }&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;/* ignore */&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; directories;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;gt; CreateResultBuffer(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;out&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addFunc);&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; dir_path, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; filenameHint, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addToResult);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;SequentialFileFinder&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; : &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;FileFinder&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;override&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;gt; CreateResultBuffer(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;out&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addFunc)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; buffer = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;List&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;addFunc = buffer.Add;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; buffer;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;override&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; dir_path, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; filenameHint, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addToResult)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        foreach&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; file &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;in&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; GetFiles(dir_path))&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;            if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; (file.Contains(filenameHint))&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;                &lt;/font&gt;addToResult(file);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        foreach&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; (&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; directory &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;in&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; GetDirectories(dir_path))&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;FindFilesCore(directory, filenameHint, addToResult);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;ParallelFileFinder&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; : &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;FileFinder&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;override&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; dir_path, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; filenameHint, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addToResult)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Parallel&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;.ForEach(GetFiles(dir_path), (file) =&amp;gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;            if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; (file.Contains(filenameHint))&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;                &lt;/font&gt;addToResult(file);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;});&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Parallel&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;.ForEach(GetDirectories(dir_path), (directory) =&amp;gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;FindFilesCore(directory, filenameHint, addToResult);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;});&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;override&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;gt; CreateResultBuffer(&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;out&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Action&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt; addFunc)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; buffer = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;ConcurrentBag&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;addFunc = buffer.Add;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; buffer;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;Find Files (sequential and parallel) in C++:&lt;/div&gt;
&lt;div&gt; &lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;windows.h&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;ppl.h&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; Concurrency;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;list&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;string&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;algorithm&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; std;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;quot;_helper.hpp&amp;quot;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; Directory&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;static&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; GetDirectories( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;* path, __out list&amp;lt;wstring&amp;gt;&amp;amp; directories )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;EnumIOItems( path, [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; WIN32_FIND_DATA&amp;amp; ffd )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; ( ffd.dwFileAttributes &amp;amp; FILE_ATTRIBUTE_DIRECTORY &amp;amp;&amp;amp; L&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;'.'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; != ffd.cFileName[&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;] )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;                &lt;/font&gt;directories.push_back( wstring( path ).append( ffd.cFileName ).append( L&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\\&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;});&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;static&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; GetFiles( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;* path, __out list&amp;lt;wstring&amp;gt;&amp;amp; files )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;EnumIOItems( path, [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; WIN32_FIND_DATA&amp;amp; ffd )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; ( !(ffd.dwFileAttributes &amp;amp; FILE_ATTRIBUTE_DIRECTORY) )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;                &lt;/font&gt;files.push_back( wstring( path ).append( ffd.cFileName ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;});&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; Function&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;static&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; EnumIOItems( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;* path, __in Function _Func )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;WIN32_FIND_DATA ffd = { NULL };&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;HANDLE hFind = FindFirstFile( wstring( path ).append(L&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;*&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;).c_str(), &amp;amp;ffd );&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; ( INVALID_HANDLE_VALUE != hFind )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;/font&gt;do&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; _Func( ffd ); &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;while&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;( &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; != FindNextFile( hFind, &amp;amp;ffd ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;            &lt;/font&gt;FindClose( hFind );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; FileFinder&lt;/font&gt;&lt;br /&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;typedef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; list&amp;lt;wstring&amp;gt; result_type;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;typedef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; result_type&amp;amp; result_type_ref;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;FileFinder(){}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;virtual&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; ~FileFinder(){}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFiles( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;* filenameHint, __out result_type_ref filesFound )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;FindFilesCore( path, filenameHint, filesFound );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; GetFiles( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __out result_type_ref files ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;Directory::GetFiles( path, files );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; GetDirectories( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __out result_type_ref directories ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;Directory::GetDirectories( path, directories );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Container, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Item&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; add( Container&amp;amp; c, &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Item&amp;amp; i ) &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; { c.push_back( i ); }&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;virtual&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* filenameHint, __out result_type_ref filesFound ) &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; = &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;font color=&quot;#a52a2a&quot;&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; SequentialFileFinder : &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; FileFinder&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;:&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;virtual&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* filenameHint, __out result_type_ref filesFound ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;list&amp;lt;wstring&amp;gt; files;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;GetFiles( path, files );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;for_each( files.begin(), files.end(), [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; wstring&amp;amp; file )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;( wstring::npos != file.find( filenameHint ) )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;                &lt;/font&gt;add( filesFound, file );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;} );&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;list&amp;lt;wstring&amp;gt; directories;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;GetDirectories( path, directories );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;for_each( directories.begin(), directories.end(), [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; wstring&amp;amp; dir )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;            &lt;/font&gt;FindFilesCore( dir.c_str(), filenameHint, filesFound );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;} );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; ParallelFileFinder : &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; FileFinder&lt;/font&gt;&lt;br /&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;protected&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;virtual&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; FindFilesCore( __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* path, __in &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;* filenameHint, __out result_type_ref filesFound ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;combinable&amp;lt;result_type&amp;gt; filesFound_partial;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;list&amp;lt;wstring&amp;gt; files;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;GetFiles( path, files );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;parallel_for_each( files.begin(), files.end(), [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; wstring&amp;amp; file )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;( wstring::npos != file.find( filenameHint ) )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;                &lt;/font&gt;add( filesFound_partial.local(), file ); &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot; size=&quot;1&quot;&gt;//&amp;lt;-&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;} );&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;join( filesFound_partial, filesFound ); &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot; size=&quot;1&quot;&gt;//&amp;lt;-&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;list&amp;lt;wstring&amp;gt; directories;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;GetDirectories( path, directories );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;parallel_for_each( directories.begin(), directories.end(), [&amp;amp;]( __in &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; wstring&amp;amp; dir )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;            &lt;/font&gt;FindFilesCore( dir.c_str(), filenameHint, filesFound );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;} ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; join( __in combinable&amp;lt;result_type&amp;gt;&amp;amp; filesFound_partial, __out result_type_ref filesFound ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;filesFound_partial.combine_each( [&amp;amp;](result_type_ref local)&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;            &lt;/font&gt;copy( local.begin(), local.end(), back_insert_iterator&amp;lt;result_type&amp;gt;( filesFound ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;            &lt;/font&gt;local.clear();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;        &lt;/font&gt;} );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;</content>
		<author>
			<name>Fábio Galuppo</name>
			<uri>http://fabiogaluppo.spaces.live.com/</uri>
		</author>
		<source>
			<title type="html">The House of Software Engineer</title>
			<link rel="self" href="http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/Main?$format=rss20"/>
			<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/-5300274535508806924</id>
			<updated>2010-09-03T21:20:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Typedef arcaico</title>
		<link href="http://www.caloni.com.br/blog/archives/typedef-arcaico"/>
		<id>http://www.caloni.com.br/blog/archives/typedef-arcaico</id>
		<updated>2010-04-20T12:26:03+00:00</updated>
		<content type="html">&lt;p&gt;A &lt;a href=&quot;http://msdn.microsoft.com/&quot; title=&quot;MSDN&quot;&gt;API do Windows&lt;/a&gt; geralmente prima pela excelência em maus exemplos. A &lt;a href=&quot;http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara&quot; title=&quot;Wikipédia&quot;&gt;Notação Húngara&lt;/a&gt; e o Typedef Arcaico são duas técnicas que, por motivos históricos, são usados a torto e a direito pelos códigos de exemplo.&lt;/p&gt;
&lt;p&gt;Já foi escrito muita coisa sobre os prós e contras da notação húngara. Já o typedef arcaico, esse pedacinho imprestável de código, ficou esquecido, e hoje em dia traz mais dúvidas na cabeça dos principiantes em C&lt;font color=&quot;#ff0000&quot;&gt;++&lt;/font&gt; do que deveria. Para tentar desobscurecer os mitos e fatos, vamos tentar explicar o que significa essa construção tão atípica, mas comum no dia-a-dia.&lt;/p&gt;
&lt;p&gt;Vejamos um exemplo típico desse pequeno Frankenstein semântico:&lt;/p&gt;
&lt;pre&gt;typedef struct _MINHASTRUCT {
   int x;
   int y;
}
MINHASTRUCT, *LPMINHASTRUCT;&lt;/pre&gt;
&lt;p&gt;Bom, eu nem sei por onde começar. Talvez pelo conceito de typedef.&lt;/p&gt;
&lt;h4&gt;Typedefs&lt;/h4&gt;
&lt;p&gt;Um typedef, basicamente, é um apelido. Você informa um tipo e define &quot;outro tipo&quot;.&lt;/p&gt;
&lt;pre&gt;typedef &amp;lt;tipo&amp;gt; apelido;&lt;/pre&gt;
&lt;p&gt;O &amp;lt;tipo&amp;gt; é tudo que fica entre o typedef e o novo nome, que deve ser um identificador válido na linguagem. Por exemplo, a empresa onde trabalho fez um typedef informal do meu nome:&lt;/p&gt;
&lt;pre&gt;typedef Wanderley Caloni Wandeco;&lt;/pre&gt;
&lt;p&gt;Se, futuramente, eu sair da empresa e entrar outro &quot;Wanderley alguma-coisa&quot;, será possível usar o apelido novamente, bastando alterar o typedef:&lt;/p&gt;
&lt;pre&gt;typedef Wanderley Cardoso Wandeco;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Bom, &quot;outro tipo&quot; é forma de dizer. Isso é uma descrição errônea em muitos livros. De fato, o compilador enxerga &lt;strong&gt;o mesmo tipo com outro nome&lt;/strong&gt;, daí chamarmos o typedef de apelido, mesmo.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;span&gt;/** @file dois_apelidos.cpp */&lt;/span&gt;
&lt;span&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;using&lt;/span&gt; &lt;span&gt;namespace&lt;/span&gt; std;
&amp;nbsp;
&lt;span&gt;struct&lt;/span&gt; Struct
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;int&lt;/span&gt; x;
   &lt;span&gt;int&lt;/span&gt; y;
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;Struct&lt;/span&gt; Struct1;
&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;Struct&lt;/span&gt; Struct2;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   Struct1 s1;
   Struct2 s2;
&amp;nbsp;
   &lt;span&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span&gt;typeid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;s1&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &amp;lt;&amp;lt; endl;
   &lt;span&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span&gt;typeid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;s2&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &amp;lt;&amp;lt; endl;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;C:\Tests&amp;gt;cl /EHsc dois_apelidos.cpp
...
/out:dois_apelidos.exe
dois_apelidos.obj

C:\Tests&amp;gt;dois_apelidos.exe
&lt;font color=&quot;#ff0000&quot;&gt;struct Struct
struct Struct&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Granularidade dos tipos&lt;/h4&gt;
&lt;p&gt;Tipos simples são fáceis de entender porque possuem seus símbolos no mesmo lugar:&lt;/p&gt;
&lt;pre&gt;&lt;font color=&quot;#ff0000&quot;&gt;int &lt;/font&gt;x;
&lt;font color=&quot;#ff0000&quot;&gt;char &lt;/font&gt;c;
&lt;font color=&quot;#ff0000&quot;&gt;long &lt;/font&gt;p;&lt;/pre&gt;
&lt;p&gt;Já os tipos um pouco mais complicados permite alguma mudança aqui e acolá:&lt;/p&gt;
&lt;pre&gt;&lt;font color=&quot;#ff0000&quot;&gt;int*&lt;/font&gt; x;
&lt;font color=&quot;#ff0000&quot;&gt;char *&lt;/font&gt;y;
&lt;font color=&quot;#ff0000&quot;&gt;long *&lt;/font&gt; p;&lt;/pre&gt;
&lt;p&gt;Essa liberdade da linguagem, mesmo sendo um recurso útil, pode ser bem nocivo dependendo de quem olha o código:&lt;/p&gt;
&lt;pre&gt;int x, y; // dois inteiros
int * x, y; // um ponteiro para inteiro e um inteiro
int x, *y; // um inteiro e um ponteiro para inteiro
int *x, y; // um ponteiro para inteiro e um inteiro&lt;/pre&gt;
&lt;p&gt;Em algumas formas da sintaxe, além de ser inevitável, gera bastante desconfiança:&lt;/p&gt;
&lt;pre&gt;// Um ponteiro para função que recebe dois inteiros e não retorna nada.
typedef &lt;font color=&quot;#ff0000&quot;&gt;void (*&lt;/font&gt;FP&lt;font color=&quot;#ff0000&quot;&gt;)(int, int)&lt;/font&gt;;

// Um ponteiro para função que recebe dois inteiros e não retorna nada.
void (*)(int, int);

// Um cast para ponteiro para função que recebe dois inteiros e não retorna nada.
( ( &lt;font color=&quot;#ff0000&quot;&gt;void (*)(int, int)&lt;/font&gt; ) pf )(x, y);&lt;/pre&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; x, &lt;span&gt;int&lt;/span&gt; y&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   std::&lt;span&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &lt;span&gt;'-'&lt;/span&gt; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &lt;span&gt;'&lt;span&gt;\n&lt;/span&gt;'&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;void&lt;/span&gt;* pf = func;
   &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;*&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt; pf &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;, &lt;span&gt;14&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;h4&gt;Structs em C&lt;font color=&quot;#ff0000&quot;&gt;++&lt;/font&gt;&lt;/h4&gt;
&lt;p&gt;Antigamente, as structs eram construções em C que definiam &lt;strong&gt;um agregado de tipos primitivos&lt;/strong&gt; (ou outras structs) e que poderiam gerar variáveis desse tipo em qualquer lugar, desde que informado seu nome e que se tratasse de uma struct:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;/** @file structs.cpp */&lt;/span&gt;
&lt;span&gt;struct&lt;/span&gt; MyStruct &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; x, y; &lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func1&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;struct&lt;/span&gt; MyStruct ms;
   &lt;span&gt;//...&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func2&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; MyStruct msa&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;//...&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;struct&lt;/span&gt; MyStruct ms;
   func2&lt;span&gt;&amp;#40;&lt;/span&gt;ms&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Para evitar toda essa digitação, os programadores usavam um pequeno truque criando um apelido para a estrutura, e usavam o apelido no lugar da struct (apesar de ambas representarem a mesma coisa).&lt;/p&gt;
&lt;pre&gt;&lt;font color=&quot;#ff0000&quot;&gt;struct MyStruct&lt;/font&gt; { int x, y; };
typedef &lt;font color=&quot;#ff0000&quot;&gt;struct MyStruct&lt;/font&gt; MS;&lt;/pre&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;pre&gt;typedef struct MyStruct { int x, y; } MS;
&lt;font color=&quot;#ff0000&quot;&gt;struct MyStruct&lt;/font&gt; ms1; // ainda prolixo
&lt;font color=&quot;#ff0000&quot;&gt;MS&lt;/font&gt; ms2; // mais simples&lt;/pre&gt;
&lt;p&gt;Com a definição da linguagem C++ padrão, e mais moderna, essa antiguidade  foi removida, apesar de ainda suportada. Era possível usar apenas o nome  do struct como seu tipo:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;/** @file structs.cpp */&lt;/span&gt;
&lt;span&gt;struct&lt;/span&gt; MyStruct &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; x, y; &lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func1&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;/*struct*/&lt;/span&gt; MyStruct ms;
   &lt;span&gt;//...&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func2&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;/*struct*/&lt;/span&gt; MyStruct msa&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;//...&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;/*struct*/&lt;/span&gt; MyStruct ms;
   func2&lt;span&gt;&amp;#40;&lt;/span&gt;ms&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Porém, isso vai um pouco além de quando a Microsoft começou a fazer código para seu sistema operacional. Naquela época, o padrão ainda estava se formando e existia mais ou menos um consenso de como seria a linguagem C&lt;font color=&quot;#ff0000&quot;&gt;++&lt;/font&gt; (sem muitas alterações do que de fato a linguagem C já era). De qualquer forma, a linguagem C imperava bem mais que C&lt;font color=&quot;#ff0000&quot;&gt;++&lt;/font&gt;. Dessa forma, já era bem formada a ideia de como declarar uma struct: a forma antiga.&lt;/p&gt;
&lt;pre&gt;typedef struct _MINHASTRUCT {
   int x;
   int y;
}
MINHASTRUCT, *LPMINHASTRUCT;&lt;/pre&gt;
&lt;p&gt;Além do uso controverso do&lt;strong&gt; _sublinhado&lt;/strong&gt; para nomear entidades (que no padrão foi recomendado que se reservasse aos nomes internos da biblioteca-padrão) e do uso de &lt;strong&gt;MAÍUSCULAS_NO_NOME&lt;/strong&gt; (historicamente atribuído a nomes definidos no pré-processador), o uso do typedef atracado a um struct era muito difundido. E ficou ainda mais depois que a API do Windows foi publicada com essas definições.&lt;/p&gt;
&lt;h4&gt;Como fazer,então?&lt;/h4&gt;
&lt;p&gt;Ora, do mesmo jeito que é feito há vinte anos: sem typedefs. O próprio paradigma da linguagem, independente de padrões de APIs, de sistemas operacionais ou de projetos específicos já orienta o programador para entender o que o espera na leitura de um código-fonte qualquer. Qualquer pessoa que aprendeu o básico do básico sobre ponteiros e structs consegue ler o código abaixo:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;// Papai, o que que &amp;eacute; isso?&lt;/span&gt;
&lt;span&gt;// Ora, filho, apenas uma defini&amp;ccedil;&amp;atilde;o de estrutura!&lt;/span&gt;
&lt;span&gt;//&lt;/span&gt;
&lt;span&gt;struct&lt;/span&gt; MinhaStruct &lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;int&lt;/span&gt; x;
   &lt;span&gt;int&lt;/span&gt; y;
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;// muitas linhas abaixo...&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func&lt;span&gt;&amp;#40;&lt;/span&gt;MinhaStruct* ms&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;// asterisco significa ponteiro para MinhaStruct!&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   MinhaStruct ms;
   func&lt;span&gt;&amp;#40;&lt;/span&gt;&amp;amp;ms&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Agora, para entender a forma antiga, ou você se baseou no copy&amp;amp;paste dos modelos Microsoftianos, ou seja, decoreba, ou você é PhD em Linguagem C&lt;font color=&quot;#ff0000&quot;&gt;/C++&lt;/font&gt; e padrões históricos de linguagens legadas. Se não é, deveria começar o curso agora.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;// Papai, o que que &amp;eacute; isso?&lt;/span&gt;
&lt;span&gt;// Ora, filho, apenas uma defini&amp;ccedil;&amp;atilde;o de sin&amp;ocirc;nimo da struct&lt;/span&gt;
&lt;span&gt;// _MINHASTRUCT, cujo nome n&amp;atilde;o &amp;eacute; usado, para dois nomes&lt;/span&gt;
&lt;span&gt;// em mai&amp;uacute;sculas, apesar se n&amp;atilde;o serem defines, com uma&lt;/span&gt;
&lt;span&gt;// nomenclatura de ponteiro que eu nunca vi na vida (obs: &lt;/span&gt;
&lt;span&gt;// papai programa em um sistema n&amp;atilde;o-Windows).&lt;/span&gt;
&lt;span&gt;//&lt;/span&gt;
&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; _MINHASTRUCT &lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;int&lt;/span&gt; x;
   &lt;span&gt;int&lt;/span&gt; y;
&lt;span&gt;&amp;#125;&lt;/span&gt;
MINHASTRUCT, *LPMINHASTRUCT;
&amp;nbsp;
&lt;span&gt;// muitas linhas abaixo...&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; func&lt;span&gt;&amp;#40;&lt;/span&gt;LPMINHASTRUCT ms&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   &lt;span&gt;// o que diabos &amp;eacute; um LP, mesmo?&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
   MINHASTRUCT ms;
   func&lt;span&gt;&amp;#40;&lt;/span&gt;&amp;amp;ms&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/antes-depois.png&quot; title=&quot;Código Antes x Depois no Visual Studio&quot; alt=&quot;Código Antes x Depois no Visual Studio&quot; align=&quot;bottom&quot; /&gt;Da mesma forma, o uso de uma estrutura simples de tipos mantém a lista de nomes do seu projeto limpa e clara. Compare o visualizador de classes em projetos Windows com algo mais C++ para ter uma ideia.&lt;/p&gt;
&lt;p&gt;É claro, essa é apenas uma sugestão. Existem vantagens em sua utilização. Existe alguma vantagem no modo antigo? Existe: a Microsoft usa, e talvez mais pessoas usem. Basta a você decidir qual deve ser o melhor caminho.&lt;/p&gt;
&lt;h4&gt;Atualização&lt;/h4&gt;
&lt;p&gt;De acordo com o leitor  &lt;a href=&quot;http://www.caloni.com.br/blog/archives/typedef-arcaico#comment-17016&quot; title=&quot;Comentário do blogue&quot;&gt;Adriano dos Santos Fernandes&lt;/a&gt;, a obrigatoriedade do nome struct após seu nome continua valendo para a linguagem C padrão, assim como no compilador GCC ocorre um erro ao tentar omiti-la. Apenas na linguagem C++ essa obrigatoriedade não existe mais.&lt;/p&gt;
&lt;p&gt;Eu não fiz meus testes, mas confio no diagnóstico de nosso amigo. A maior falha do artigo, no entanto, é usar a linguagem C como base, quando na verdade ele deveria falar sobre o uso desses typedefs em C++. Esse erro também foi corrigido no original.&lt;/p&gt;</content>
		<author>
			<name>Wanderley Caloni</name>
			<uri>http://www.caloni.com.br/blog</uri>
		</author>
		<source>
			<title type="html">Caloni.com.br » C++</title>
			<subtitle type="html">C++, Windows, Programação, Depuração e Transpiração</subtitle>
			<link rel="self" href="http://www.caloni.com.br/blog/archives/category/c/feed"/>
			<id>http://www.caloni.com.br/blog/archives/category/c/feed</id>
			<updated>2010-08-31T01:15:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">0xc0de</title>
		<link href="http://0xc0de.wordpress.com/2010/04/05/zero-default-value_initialization/"/>
		<id>http://0xc0de.wordpress.com/?p=337</id>
		<updated>2010-04-05T18:54:24+00:00</updated>
		<content type="html">&lt;p&gt;Recentemente resolvi fazer alguns testes relacionados a inicialização de objetos em C++ em diferentes ambientes. Tive algumas surpresas&amp;#8230;&lt;/p&gt;
&lt;p&gt;O padrão C++ define três tipos de inicialização:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;zero-initialization&lt;/strong&gt; &amp;#8211; Neste texto traduzido como &lt;em&gt;inicialização por zeros&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;default-initialization&lt;/strong&gt; &amp;#8211; Traduzido como &lt;em&gt;inicialização padrão&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;value-initialization&lt;/strong&gt; &amp;#8211; Traduzido como &lt;em&gt;inicialização por valor&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O significado de cada um é explicado detalhadamente [§8.5.5]. Mas a linguagem e formalismo utilizados em documentos técnicos normalmente não são os mais triviais possíveis. Portanto, não é raro aparecerem algumas dúvidas.&lt;/p&gt;
&lt;p&gt;O caso em que estava interessado é relativamente simples e abrange apenas um sub-conjunto das regras de inicialização. Colocando em termos práticos, queria analisar qual seria o valor de um membro inteiro de um &lt;code&gt;struct&lt;/code&gt; em situações distintas.&lt;/p&gt;
&lt;p&gt;Além de coisas mais simples e conhecidas como chamadas convencionais a construtores, as informações do padrão que considerei pertinentes para o seguinte trecho de código são as seguintes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um objeto construído através de um par vazio de parêntesis deve passar por uma inicialização por valor [§ 8.5.7]. Note que isso se aplica a uma inicialização do tipo &lt;code&gt;T * t = new T();&lt;/code&gt; [§ 5.3.4] ou até mesmo do tipo &lt;code&gt;T();&lt;/code&gt;[§ 5.2.3].&lt;/li&gt;
&lt;li&gt;Quando um objeto de tipo não-POD (Plain Old Data) não tem nenhum inicializador ele deve passar por uma inicialização padrão. Esse é o caso, por exemplo, de uma expressão como &lt;code&gt;T * t = new T;&lt;/code&gt; ou &lt;code&gt;T t;&lt;/code&gt;. No entanto, se o objeto for de tipo POD ele e seus sub-objetos não passam por inicialização alguma e, consequentemente, têm valor indeterminado [§ 8.5.9].&lt;/li&gt;
&lt;li&gt;Uma inicialização padrão de um objeto tipo POD como &lt;code&gt;int&lt;/code&gt; (não para arrays) resulta em uma inicialização por zeros [§ 8.5.5].&lt;/li&gt;
&lt;li&gt;Uma inicialização por valor de um objeto de um tipo classe (excluindo &lt;code&gt;union&lt;/code&gt;) promove uma inicialização por valor de seus membros não-estáticos e classes bases.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;
struct PlainOldData //POD
{
  int id_;
};

struct NonPOD_CompilerCtor
{
  int id() const { return id_; }

private:
  int id_;
};

struct NonPOD_UserCtor
{
  NonPOD_UserCtor() : id_() {}
  int id() const { return id_; }

private:
  int id_;
};
&lt;/pre&gt;
&lt;p&gt;O programinha que escrevi apenas cria objetos dos tipos definidos acima com duas sintaxes diferentes. Em seguinda, inspeciono os valores do membro &lt;code&gt;id_&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;
int main()
{
  PlainOldData * a = new PlainOldData;
  NonPOD_CompilerCtor * b = new NonPOD_CompilerCtor;
  NonPOD_UserCtor * c = new NonPOD_UserCtor;

  //...

  PlainOldData * d = new PlainOldData();
  NonPOD_CompilerCtor * e = new NonPOD_CompilerCtor();
  NonPOD_UserCtor * f = new NonPOD_UserCtor();

  //...
}
&lt;/pre&gt;
&lt;p&gt;Os valores que esperava para o membro &lt;code&gt;id_&lt;/code&gt; são os seguintes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;a&lt;/strong&gt; &amp;#8211; O objeto é criado sem parêntesis e o tipo é POD. Logo, não há inicialização e o valor de &lt;code&gt;id_&lt;/code&gt; é indeterminado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;b&lt;/strong&gt; &amp;#8211; O objeto é criado sem parêntesis e o tipo é não-POD. Logo, a inicialização é padrão. No entanto, o construtor é o gerado pelo compilador, o qual não faz inicialização de nenhum membro. Portanto, o valor de &lt;code&gt;id_&lt;/code&gt; é indeterminado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;c&lt;/strong&gt; &amp;#8211; O objeto é criado sem parêntesis e o tipo é não-POD. Novamente, temos inicialização padrão. Agora, com a diferença de que existe um construtor definido pelo usuário que inicializa explicitamente &lt;code&gt;id_&lt;/code&gt;. Este, então, sofre inicialização por valor, a qual resulta em inicialização por zeros devido ao fato de &lt;code&gt;int&lt;/code&gt; ser POD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d&lt;/strong&gt; &amp;#8211; O objeto é criado com parêntesis vazios e, assim como nos outros dois casos abaixo, a inicialização é por valor. Este caso se trata de um POD. Logo, a inicialização por valor resulta diretamente em inicialização por zeros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;e&lt;/strong&gt; &amp;#8211; Como dito acima, o objeto sofre inicialização por valor, já que foi criado com parêntesis vazios. O membro &lt;code&gt;id_&lt;/code&gt; também sofre inicialização por valor que, devido ao fato de se tratar de um POD, resulta em inicialização por zeros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;f&lt;/strong&gt; &amp;#8211; Novamente, inicialização por valor. Naturalmente, o construtor definido pelo usuário é invocado. Este inicializa por valor o membro &lt;code&gt;id_&lt;/code&gt;, que por ser um POD sofre inicialização por zeros.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Testando com compiladores diferentes obtive os seguintes resultados.&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;em&gt;&lt;strong&gt;Compilador&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;a&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;b&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;c&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;d&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;f&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;G++ 4.2.4&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Mingw – G++ 4.4.0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;VC++ 2008 Express&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Digital Mars 8.5.1&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Para completar a avaliação também resolvi utilizar sintaxes correspondentes às usadas acima só que com alocação na pilha.&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;
int main()
{
  PlainOldData aa;
  NonPOD_CompilerCtor bb;
  NonPOD_UserCtor cc;

  //...

  PlainOldData const&amp;amp; dd = PlainOldData();
  NonPOD_CompilerCtor const&amp;amp; ee = NonPOD_CompilerCtor();
  NonPOD_UserCtor const&amp;amp; ff = NonPOD_UserCtor();

  //...
}
&lt;/pre&gt;
&lt;p&gt;Já que nesses casos o fator determinante na inicialização é a presença ou não dos parêntesis, esperava obter exatamente os mesmos resultados do código anterior. Apenas uma observação: As referências para &lt;code&gt;const&lt;/code&gt; dos últimos três casos são apenas uma estratégia artificial para testar a inicialização através da expressão &lt;code&gt;X()&lt;/code&gt;, já que &lt;code&gt;X x();&lt;/code&gt; é na verdade a declaração de uma função que não recebe parâmetros e retorna &lt;code&gt;X&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Desta vez os resultados foram os seguintes:&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Compilador&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;aa&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;bb&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;cc&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;dd&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;ee&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;ff&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;G++ 4.2.4&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Mingw – G++ 4.4.0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Indeterm.&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;VC++ 2008 Express&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;Digital Mars 8.5.1&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Indeterm.&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Bom, como pode ser visto encontrei muitas variações de comportamento entre os compiladores. Espero não ter cometido alguma interpretação errônea pelos meandros do padrão, mas os únicos compiladores que foram conformantes na primeira leva de testes foram o G++ 4.4.0 (Mingw) e o Visual C++ 2008. Já para a segunda parte, na qual esperava exatamente os mesmos resultados, apenas o G++ 4.4.0.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/337/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/337/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/337/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/337/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/337/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/337/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/337/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/337/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/337/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/337/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=337&amp;subd=0xc0de&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Leandro Melo</name>
			<uri>http://0xc0de.wordpress.com</uri>
		</author>
		<source>
			<title type="html">0xc0de</title>
			<subtitle type="html">Computadores, Programação e TI. Divagações...</subtitle>
			<link rel="self" href="http://0xc0de.wordpress.com/feed/"/>
			<id>http://0xc0de.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mysql.c (conectando ao MySQL via C)</title>
		<link href="http://wend.elmaqu.es/?p=95"/>
		<id>http://wend.elmaqu.es/?p=95</id>
		<updated>2010-03-30T03:39:24+00:00</updated>
		<content type="html">Abaixo um programinha simples de exemplo, sobre como acessar o MySQL via C. A idéia é bem simpls, mas, bem útil se você estiver aprendendo, um dos piores problemas será como colocar os dados recebidos do MySQL em uma estrutura de dados (array) para usar posteriormente, essa é a parte difícil, que fiz, usando &amp;#8220;ponteiro [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Entrevista com o criador do C++ em 1998 (Bjarne Stroustrup)</title>
		<link href="http://wend.elmaqu.es/?p=86"/>
		<id>http://wend.elmaqu.es/?p=86</id>
		<updated>2010-03-30T02:03:08+00:00</updated>
		<content type="html">Em 1 de Janeiro de 1998, Bjarne Strustrup (criador do C++) deu essa entrevista. Lembrando que, em 1998 ainda não  tinha sido implementado os &amp;#8220;templates&amp;#8221; do C++ que foram incluídos somente em 2001. Original do texto abaixo encontra-se aqui. I would like to find the proper credit for the material below. Please mail me if [...]</content>
		<author>
			<name>Wendel Maques</name>
			<uri>http://wend.elmaqu.es</uri>
		</author>
		<source>
			<title type="html">Wendelmaques</title>
			<subtitle type="html">C, C++, Unix, FreeBSD, Linux, Virtualization, Xen, network services, etc...</subtitle>
			<link rel="self" href="http://wend.elmaqu.es/?feed=rss2"/>
			<id>http://wend.elmaqu.es/?feed=rss2</id>
			<updated>2010-08-30T19:35:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Sistemas de Tempo Real – Part 1</title>
		<link href="http://www.embarcados.com.br/blog/2010/03/15/sistemas-de-tempo-real-part-1/"/>
		<id>http://www.embarcados.com.br/blog/?p=303</id>
		<updated>2010-03-16T02:33:38+00:00</updated>
		<content type="html">Neste post vou falar um pouco sobre Sistemas de Tempo Real, as principais motivações para sua utilização, sua arquitetura básica e alguns critérios para a escolha de um RTOS disponível no mercado.</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Sexto Encontro de Programadores C/C++</title>
		<link href="http://www.driverentry.com.br/blog/2010/02/sexto-encontro-de-programadores-cc.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-8637318931798652424</id>
		<updated>2010-03-10T11:55:35+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.driverentry.com.br/images/logo_com_c++_160x115.jpg&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Começo de ano é sempre a mesma correria. Depois que a gente começa a se acostumar com a idéia de que o feriadão de Natal e Ano Novo acabaram, logo vem o carnaval e desanda tudo. Aproveitei este início de ano para tirar merecidas férias, já que finalmente meu curso de Engenharia da Computação terminou. Como um belo &lt;span&gt;start&lt;/span&gt; para minha reintegração à sociedade, nada melhor que uma viajem ao nordeste brasileiro. Semanas antes desta viajem fiquei sabendo do novo encontro da comunidade de programadores C/C++. Por causa da viagem eu perderia o evento.&lt;/p&gt;&lt;p&gt;Um mês se passou e semana passada vi que o evento foi adiado para o próximo dia &lt;span&gt;seis de março&lt;/span&gt;. Muito boa notícia já que além de poder participar do evento também vou falar um pouquinho. &lt;a href=&quot;http://www.driverentry.com.br/blog/2008/03/driverentrycombr-d-as-caras.html&quot;&gt;Já participei de outro encontro&lt;/a&gt; de programadores e fiquei muito feliz de poder falar para tantas pessoas sobre esse assunto tão misterioso para muitos, que é o desenvolvimento de drivers para Windows.&lt;/p&gt;&lt;p&gt;Sob meu ponto de vista os resultados foram muito bons. A palestra deu uma introdução ao assunto de desenvolvimento de drivers e obviamente os 60 minutos de palestra não foram suficientes para explicar o assunto com detalhes, mas foi interessante mostrar a ponta do &lt;span&gt;iceberg&lt;/span&gt; e poder responder a algumas perguntas dos presentes. Eu escrevi um &lt;a href=&quot;http://www.driverentry.com.br/blog/2008/06/tirando-o-atraso-p.html&quot;&gt;post&lt;/a&gt; que comenta sobre o encontro, mas recomendo o &lt;a href=&quot;http://www.caloni.com.br/blog/archives/epa-ccpp-4-nossa-comunidade-ganhando-forma&quot;&gt;post do meu amigo Lesma&lt;/a&gt; que ficou muito bom.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;Lidando com Memória Virtual em Drivers&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Bem, neste novo encontro não vou dar novamente uma introdução ao assunto, mas vou comentar sobre algumas carasterísticas e curiosidades sobre Memória Virtual no desenvolvimento de drivers. Entenda que não vou fazer um resumo do capítulo 9 do Windows Internals, &quot;Memory Management&quot; que fala sobre Page Table Entries e Working Sets, mas sim demonstrar que, diferentes de uma aplicação User-Mode, drivers precisam estar cientes dos conceitos fundamentais de memória virtual e paginação, controlando paginação de objetos e atendendo à requisítos de paginação de memória e espaço de endereçamento.&lt;/p&gt;&lt;p&gt;Os tópicos a serem discutidos na palestra serão os seguintes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Overview de Memória Virtual e Paginação.&lt;/li&gt;&lt;li&gt;Operações de I/O e manipulação de Buffers.&lt;/li&gt;&lt;li&gt;Prioridade de thread e acesso à memória.&lt;/li&gt;&lt;li&gt;Pools de alocação, Tags e Quotas.&lt;/li&gt;&lt;li&gt;Evitando Fragmentação.&lt;/li&gt;&lt;li&gt;Drivers no caminho da paginação.&lt;/li&gt;&lt;li&gt;Controlando paginação de funções.&lt;/li&gt;&lt;li&gt;Obtendo endereços reais de memória.&lt;/li&gt;&lt;li&gt;Dispositivos de acesso direto à memória (DMA).&lt;/li&gt;&lt;li&gt;Recursos do Driver Verifier.&lt;/li&gt;&lt;li&gt;Hands on: Operações de memórias por drivers no WinDbg.&lt;/li&gt;&lt;li&gt;Dúvidas.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Esta é a &lt;a href=&quot;http://ccppbrasil.org/wiki/Grupo:Encontro_VI&quot;&gt;página oficial&lt;/a&gt; do evento e as &lt;a href=&quot;http://www.temporealeventos.com.br/inscricoes/inscricoes.php?area=95&amp;form=367&quot;&gt;inscrições&lt;/a&gt; estão abertas.
Até lá!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.driverentry.com.br/downloads/Palestra-060310.zip&quot;&gt;Download dos slides&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-8637318931798652424?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-08-30T19:35:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2010/03/07/armadilha-de-arco-iris-e-o-futuro-da-computacao/"/>
		<id>http://techberto.wordpress.com/?p=204</id>
		<updated>2010-03-08T00:48:15+00:00</updated>
		<content type="html">&lt;p&gt;Em 2007 dois pesquisadores britânicos teorizaram um dispositivo que eles chamaram de &amp;nbsp;&amp;#8221;alçapão de&amp;nbsp;arco-íris&amp;#8221;, sendo um dispositivo composto por uma lente&lt;img class=&quot;alignright&quot; src=&quot;http://www.newscientist.com/data/images/ns/cms/dn18205/dn18205-2_300.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;229&quot; /&gt;que seria responsável pela reflexão, dispersão e refração de um feixe de luz para o interior do artefato que teria uma&amp;nbsp;&amp;nbsp;placa com várias camadas de espelhos de metamateriais que poderia capturar o feixe de luz, não permitindo sua dispersão:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://techberto.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif&quot; alt=&quot;&quot; class=&quot;mceWPmore mceItemNoResize&quot; title=&quot;Mais...&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://spie.org/x25478.xml?ArticleID=x25478&quot; target=&quot;_blank&quot;&gt;Stopping light in metamaterials: the trapped rainbow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Na época vários grupos ao redor do mundo, acreditando na teoria trabalharam alucinadamente tentando criar um protótipo funcional deste dispositivo e no final de 2009 um grupo de pesquisadores americanos conseguiu obter sucesso e com um aparato muito simples provaram o conceito da &amp;#8220;armadilha de arco-íris&amp;#8221;, demonstrando que os físicos britânicos estavam certos:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.newscientist.com/article/dn18205-rainbow-trapped-for-the-first-time.html&quot; target=&quot;_blank&quot;&gt;Rainbow trapped for the first time&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quando comentei este feito com um colega pela primeira vez, logo que via a notícia na semana que ela foi publicada na &lt;a href=&quot;http://www.newscientist.com/article/dn18205-rainbow-trapped-for-the-first-time.html&quot; target=&quot;_blank&quot;&gt;New Scientist,&lt;/a&gt; ele fez aquele clássico comentário: este pessoal não tem nada mais importante para fazer?&lt;/p&gt;
&lt;p&gt;Bem, esta técnica poderá ser útil para armazenar informações de forma puramente ótica, algo que irá revolucionar a computação (e talvez a vida) no futuro, eliminando a necessidade de conversões de sinais óticos em eletrônicos, facilitando o processo de &amp;nbsp;manipulação de fótons&amp;nbsp;e proporcionando a criação de &amp;nbsp;meios de armazenamento de informações revolucionário. E considerando que em 2009 também surgiu o primeiro&amp;nbsp;&lt;a href=&quot;http://www.sciencemag.org/cgi/content/abstract/325/5945/1221&quot; target=&quot;_blank&quot;&gt;processador quântico fotônico autêntico&lt;/a&gt; podemos elucubrar que parte do futuro da computação está na fotônica e esta nova descoberta é certamento um grande marco.&lt;/p&gt;
&lt;p&gt;Quer algo mais útil do que isto? &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Ruminando e divagando sobre este assunto com um amigo este final de semana, ele lembrou do filme Minority Report e de um cartão &amp;nbsp;de armazenamento que parecia que as imagens estavam armazenadas de modo fotônico, visto que elas podiam ser parcialmente vistas sem mesmo estar no seu respectivo driver de leitura.&lt;/p&gt;
&lt;p&gt;Com a evolução das pesquisas do grafeno, dos metamateriais e outros daqui a alguns anos silício será coisa do passado, se bobear armazenamento magnético também e por consequencias do entrelaçamento quântico a velocidade da luz irá parecer velocidade tartarugal, imaginou como será a computação e o futuro das telecomunicações?&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter&quot; src=&quot;http://www.revistaogrito.com/page/wp-content/uploads/2009/08/computer-mediated-telepathy.jpg&quot; alt=&quot;&quot; width=&quot;520&quot; height=&quot;250&quot; /&gt;&lt;/p&gt;
&lt;p&gt;No final de 2008, escrevi um &lt;a href=&quot;http://techberto.wordpress.com/2008/12/04/prospeccoes/&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt; onde eu brincava que em 2050 &amp;#8220;telepatia sintética&amp;#8221; seria coisa do passado, bom, o &lt;a href=&quot;http://www.wired.com/dangerroom/2008/08/army-funds-synt/&quot; target=&quot;_blank&quot;&gt;DARPA tem financiado pesquisas nesta área&lt;/a&gt; e isto&amp;nbsp;&lt;img class=&quot;alignright&quot; src=&quot;http://www.thinkgeek.com/images/products/front/bf1b_star_wars_force_trainer_combo.jpg&quot; alt=&quot;&quot; width=&quot;220&quot; height=&quot;242&quot; /&gt;da tem a ver com ESP, visto que a tecnologia é puramente baseada em neurociência e telecomunicações, sendo-se que o artefato que possibilitará tal feito é puramente um dispositivo de neuroengenharia, área que tende a evoluir muito no futuro e aposto que vários dos &amp;#8220;neuroengenheiros&amp;#8221; serão nascerão a partir do fascínio pelos brinquedos &lt;a href=&quot;http://mindflexgames.com/&quot; target=&quot;_blank&quot;&gt;Mindflex&lt;/a&gt; e o &lt;a href=&quot;http://www.thinkgeek.com/geek-kids/7-13-years/bf1b/&quot; target=&quot;_blank&quot;&gt;Star Wars Force Trainer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mas o quê a armadilha de arco-íris e a q-telepatia tem em comum? A resposta é: computação quântica. A neuroengenharia continuará presente, porém o processador quântico será peça fundamental.&lt;/p&gt;
&lt;p&gt;E breve, os&amp;nbsp;&lt;a href=&quot;http://malditoscyborgs.org/dam/english/articles/cyborgism/basement_neurohackers.html&quot; target=&quot;_blank&quot;&gt;neurohackers&lt;/a&gt; já não serão mais atores da ficção cyberpunk e sim do novo contexto neurotecnológico do balaio de gato que será o admirável mundo novo da computação, fico imaginando a segunda (ou será terceira?) geração que será os &lt;span class=&quot;Apple-style-span&quot;&gt;q-neurohackers&lt;/span&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=204&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PS3 e o bug do ano bissexto</title>
		<link href="http://www.embarcados.com.br/blog/2010/03/04/ps3-e-o-bug-do-ano-bissexto/"/>
		<id>http://www.embarcados.com.br/blog/?p=273</id>
		<updated>2010-03-05T02:12:34+00:00</updated>
		<content type="html">Como profissional da área de tecnologia, sou um leitor assíduo de notícias da área. Gosto em especial de dois sites, o Gizmodo [1] e o Engadget [2]. Na segunda pela manhã uma notícia me chamou a atenção, milhões de videogames PlayStation 3 da Sony haviam parado de funcionar da noite para o dia.

No decorrer do dia, descobriu-se que o problema estava no relógio interno do aparelho, que identificou 2010 como um ano bissexto, e passou do dia 28/02 para 29/02 ao invés de 01/03. Como diversas funções do videogame dependiam do valor correto da data do sistema para funcionar, o aparelho começou a apresentar vários problemas.</content>
		<author>
			<name>Sergio Prado</name>
			<uri>http://www.sergioprado.org</uri>
		</author>
		<source>
			<title type="html">Blog do Sergio Prado</title>
			<subtitle type="html">Sistemas embarcados e tecnologia em geral</subtitle>
			<link rel="self" href="http://www.sergioprado.org/feed/"/>
			<id>http://www.sergioprado.org/feed/</id>
			<updated>2010-09-03T17:25:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Namespaces: colocando cada coisa em seu lugar</title>
		<link href="http://www.zimbrao.com/cpp/?p=391"/>
		<id>http://www.zimbrao.com/cpp/?p=391</id>
		<updated>2010-03-02T23:22:55+00:00</updated>
		<content type="html">Evitando conflitos de nomes
namespace é uma palavra reservada do C++ que implementa um mecanismo capaz de expressar agrupamento lógico. Em outras palavras, se um conjunto de declarações estão logicamente associadas de acordo com algum critério, elas podem ser colocadas juntas no mesmo namespace para expressar este fato. Um namespace também pode ser chamado de um [...]</content>
		<author>
			<name>Geraldo Zimbrão</name>
			<uri>http://www.zimbrao.com/cpp</uri>
		</author>
		<source>
			<title type="html">BLOG C++</title>
			<subtitle type="html">O BLOG do Zimbrão sobre a linguagem de programação C++!</subtitle>
			<link rel="self" href="http://www.zimbrao.com/cpp/?feed=rss2"/>
			<id>http://www.zimbrao.com/cpp/?feed=rss2</id>
			<updated>2010-08-30T19:35:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Escrevendo Filtros</title>
		<link href="http://www.driverentry.com.br/blog/2010/01/escrevendo-filtros.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-4208475676533334470</id>
		<updated>2010-02-22T16:38:45+00:00</updated>
		<content type="html">&lt;p&gt;Vamos brincar de algo mais interessante agora. Obviamente ainda vamos dar passos pequenos para não nos perder com tantos detalhes. Hoje falarei sobre filtros de drivers. O &lt;span&gt;IoManager&lt;/span&gt; do Windows nos permite adicionar funcionalidade a determinados drivers sem que tenhamos que substituí-lo. Um exemplo clássico seria um driver de criptografia de arquivos. Você não precisa escrever um novo driver de &lt;span&gt;file system&lt;/span&gt; para que se tenha tal funcionalidade. Você pode simplesmente escrever um filtro que ficaria entre o driver de &lt;span&gt;file system&lt;/span&gt; e o restante do sistema.&lt;/p&gt;&lt;p&gt;Na figura abaixo podemos observar o fluxo de &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/02/legal-mas-o-que-uma-irp.html&quot;&gt;IRPs&lt;/a&gt; que vão do &lt;span&gt;IoManager&lt;/span&gt; para um certo driver, um filtro é instalado sobre o driver existente e passa a receber as IRPs no lugar do driver original. Com isso o filtro tem a oportunidade de alterar os parâmetros das IRPs recebidas, ou logar a atividade do driver original, ou duplicar solicitações do sistema para esse driver, ou mesmo negar serviço do driver original.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/NewFilterDev.png&quot; /&gt;&lt;/div&gt;&lt;p&gt;Numa operação de escrita, um filtro poderia criptografar os dados antes de enviá-los ao driver original, e de maneira similar, numa operação de leitura o filtro poderia decriptografar dados antes de entregá-los ao sistema.&lt;/p&gt;&lt;p&gt;Ainda não vai ser desta vez que construiremos um filtro de criptografia de &lt;span&gt;file system&lt;/span&gt;. Filtros de criptografia de arquivos em tempo real estão entre os drivers mais complexos a serem escritos. Vamos escolher um driver mais simples, pra não dizer um bem besta, para aplicar os conceitos básicos demonstrados aqui.&lt;/p&gt;&lt;p&gt;Por falar em driver besta, vamos utilizar o driver &lt;a href=&quot;http://www.driverentry.com.br/blog/2009/07/strings-no-kernel.html&quot;&gt;deste post&lt;/a&gt; que já foi visto aqui. Este driver simplesmente armazena uma lista de strings enviadas por uma aplicação em operações de escrita. Tais strings são retornadas à aplicação em operações de leituras.&lt;/p&gt;&lt;p&gt;
&lt;span&gt;&lt;strong&gt;Escrevendo a DriverEntry&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Como vimos neste &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/06/nos-queremos-exemplos.html&quot;&gt;outro post&lt;/a&gt;, uma das das coisas que a função &lt;span&gt;DriverEntry()&lt;/span&gt; faz num driver comum é setar as &lt;span&gt;Dispatch Routines&lt;/span&gt; que o driver vai atender para certo dispositivo. Para isso deve-se preencher o array de &lt;span&gt;Major Functions&lt;/span&gt; que fica na estrutura &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd852039.aspx&quot;&gt;DRIVER_OBJECT&lt;/a&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Seta as dispatch routines do driver.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[IRP_MJ_CREATE] = OnCreate;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[IRP_MJ_CLEANUP] = OnCleanup;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[IRP_MJ_CLOSE] = OnClose;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[IRP_MJ_READ] = OnRead;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[IRP_MJ_WRITE] = OnWrite;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;No caso do nosso filtro de exemplo, queremos apenas monitorar a atividade do driver ao qual estamos atachados, dessa forma teremos sempre que encaminhar quaisquer IRPs recebidas ao driver de baixo. Uma forma simples e comum de fazer isso é setar todas dispath routines para uma única função. Essa função se encarrega de simplesmente logar a solicitação recebida e passá-la a diante.&lt;/p&gt;&lt;p&gt;Se dermos uma olhada na definicão de IRP_MJ_CREATE e seus amigos, veremos o seguinte trecho do arquivo wdm.h.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;// Define the major function codes for IRPs.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_CREATE&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span&gt;0x00&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_CREATE_NAMED_PIPE&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x01&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_CLOSE&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x02&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_READ&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x03&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_WRITE&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x04&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_QUERY_INFORMATION&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x05&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SET_INFORMATION&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x06&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_QUERY_EA&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x07&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SET_EA&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span&gt;0x08&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_FLUSH_BUFFERS&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x09&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_QUERY_VOLUME_INFORMATION &lt;span&gt;0x0a&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SET_VOLUME_INFORMATION&amp;nbsp;&amp;nbsp; &lt;span&gt;0x0b&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_DIRECTORY_CONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x0c&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_FILE_SYSTEM_CONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x0d&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_DEVICE_CONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span&gt;0x0e&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_INTERNAL_DEVICE_CONTROL&amp;nbsp; &lt;span&gt;0x0f&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SHUTDOWN&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x10&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_LOCK_CONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x11&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_CLEANUP&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x12&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_CREATE_MAILSLOT&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x13&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_QUERY_SECURITY&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span&gt;0x14&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SET_SECURITY&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x15&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_POWER&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x16&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SYSTEM_CONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span&gt;0x17&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_DEVICE_CHANGE&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x18&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_QUERY_QUOTA&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x19&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_SET_QUOTA&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x1a&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_PNP&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;0x1b&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_PNP_POWER&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_PNP&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;// Obsolete....&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;#define&lt;/span&gt; IRP_MJ_MAXIMUM_FUNCTION&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;0x1b&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Note que existe uma definição especial, a &lt;span&gt;IRP_MJ_MAXIMUM_FUNCTION&lt;/span&gt;, que indica o índice máximo da tabela de &lt;span&gt;dispatch rotines&lt;/span&gt;. Utilizaremos um loop simples para fazer com que todas rotinas em nossa tabela aponte para uma única rotina que daremos o nome de &lt;span&gt;OnForwardDispatch&lt;/span&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Seta todas as dispatch routines do driver para&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; uma que encaminhe a IRP para o driver original.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;for&lt;/span&gt; (i = &lt;span&gt;0&lt;/span&gt;; i &amp;lt;= IRP_MJ_MAXIMUM_FUNCTION; i++)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[i] = OnForwardDispatch;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Veremos a implementação dessa rotina mais tarde. O próximo passo que daremos aqui é localizar o device ao qual vamos nos atachar. Para fazer isso, usaremos a rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms801459.aspx&quot;&gt;IoGetDeviceObjectPointer()&lt;/a&gt;. Ela basicamente recebe o nome do device e nos retorna uma referência para ele.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;NTSTATUS &lt;/pre&gt;&lt;pre&gt;&amp;nbsp; IoGetDeviceObjectPointer(&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PUNICODE_STRING&amp;nbsp; ObjectName,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN ACCESS_MASK&amp;nbsp; DesiredAccess,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUT PFILE_OBJECT&amp;nbsp; *FileObject,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUT PDEVICE_OBJECT&amp;nbsp; *DeviceObject&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Observe que são dois os parâmetros de saída dessa rotina. Além do ponteiro para o &lt;span&gt;device object&lt;/span&gt; ainda recebemos um ponteiro para um &lt;span&gt;file object&lt;/span&gt;. Já ví algumas pessoas fazerem confusão com estes dois parâmetros, então vou dar alguma ênfase nisso.&lt;/p&gt;&lt;p&gt;O ponteiro para o &lt;span&gt;file object&lt;/span&gt; representa uma conexão criada entre seu driver e o device que você abriu. Como vimos &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/08/usando-fileobject-e-fscontext.html&quot;&gt;neste post&lt;/a&gt;, um &lt;span&gt;file object&lt;/span&gt; é criado para respresentar conexões entre aplicações user mode e seu driver. Aplicações usam esse &lt;span&gt;file object&lt;/span&gt; através do &lt;span&gt;handle&lt;/span&gt; obtido na chamada à rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx&quot;&gt;CreateFile()&lt;/a&gt;. Aqui temos algo similar, mas apenas o Kernel foi envolvido. Isso significa que se você quizesse, você poderia lançar IRPs para o device solicitando operações como uma aplicação faria, mas não veremos isso hoje, ainda temos um filtro para terminar.&lt;/p&gt;&lt;p&gt;A grande confusão referente a estes dois parâmetros é com relação às referências entre os objetos. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms801459.aspx&quot;&gt;Na documentação&lt;/a&gt; vemos que o chamador desta rotina deverá liberar a referência que ganhou quando o device não for mais utilizado. Fazemos isso simplesmente usando a rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms802945.aspx&quot;&gt;ObDereferenceObject()&lt;/a&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;VOID &lt;/pre&gt;&lt;pre&gt;&amp;nbsp; ObDereferenceObject(&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PVOID&amp;nbsp; Object&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Já sei! Como estamos obtendo uma referência para um device object, então devo passar o ponteiro do device object. Certo?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Er... Na verdade não. O &lt;span&gt;file object&lt;/span&gt; é uma referência indireta ao &lt;span&gt;device object&lt;/span&gt;. Conforme a figura abaixo, se imaginarmos que os contadores de referência apenas dizem respeito às nossas referências, quando chamarmos &lt;span&gt;ObDereferenceObject()&lt;/span&gt; para o &lt;span&gt;file object&lt;/span&gt;, seu contador de referência cairia para zero e uma nova chamada para &lt;span&gt;ObDeferenceObject()&lt;/span&gt; seria feita indiretamente para o &lt;span&gt;device object&lt;/span&gt;, fazendo com que seu contador de referência também caisse para zero destruindo o objeto.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/DeviceReferences.png&quot; /&gt;&lt;/div&gt;&lt;p&gt;Depois de obter o ponteiro para o device destino, teremos que criar nosso próprio device, o qual receberá as IRPs no lugar do device original. Para isso ainda usaremos a rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa490468.aspx&quot;&gt;IoCreateDevice()&lt;/a&gt; como faziamos com drivers, mas com algumas diferenças.&lt;/p&gt;&lt;p&gt;A primeira diferença é que seu device normalmente não tem nome. É possível criar filtros com nomes, mas isso pode gerar uma falha de segurança. Isso acontece pois quando um nome é consultado no &lt;span&gt;Object Manager&lt;/span&gt;, suas regras de segurança são avaliadas. Quando criamos um filtro com nome, criamos a possibilidade de o mesmo objeto ser obtido por um nome diferente e que pode ter regras menos restritivas de segurança. Mas esse é outro assunto.&lt;/p&gt;&lt;p&gt;Quando criamos um device, precisamos informar o tamanho do &lt;span&gt;device extension&lt;/span&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;O que vem a ser um device extension?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;Device extension&lt;/span&gt; é simplesmente um espaço de memória que está associada ao &lt;span&gt;device object&lt;/span&gt;. Tal espaço normalmente mantém informações que dizem respeito ao device. O endereço do device ao qual estamos atachados normalmente fica no &lt;span&gt;device extension&lt;/span&gt;. Desta forma, podemos definir que nosso &lt;span&gt;device extension&lt;/span&gt; deve conter a seguinte estrutura.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;//-f--&amp;gt; Nosso device externsion conter&amp;#225; apenas o endere&amp;#231;o&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; do device ao qual estamos atachados.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; _DEVICE_EXTENSION&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_OBJECT&amp;nbsp; pNextDeviceObj;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;} DEVICE_EXTENSION, *PDEVICE_EXTENSION;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Depois de criar nosso &lt;span&gt;device object&lt;/span&gt;, configuramos o método de I/O copiando os bits &lt;span&gt;DO_BUFFERED_IO&lt;/span&gt; e &lt;span&gt;DO_DIRECT_IO&lt;/span&gt;. Se você não se lembra destes bits, dê uma olhada &lt;a href=&quot;http://www.driverentry.com.br/blog/2008/10/buffered-direct-ou-neither.html&quot;&gt;neste post&lt;/a&gt;. O filtro deve propagar a escolha do driver original e o driver tem o compromisso de não mudar método durante seu tempo de vida.&lt;/p&gt;&lt;p&gt;Agora estamos prontos para nos atachar ao device escolhido, e faremos isso utilizando a rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms795450.aspx&quot;&gt;IoAttachDeviceToDeviceStackSafe()&lt;/a&gt; para fazer nosso device entrar na pilha de dispositivos.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;NTSTATUS&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; IoAttachDeviceToDeviceStackSafe(&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PDEVICE_OBJECT&amp;nbsp; SourceDevice,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PDEVICE_OBJECT&amp;nbsp; TargetDevice,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN OUT PDEVICE_OBJECT&amp;nbsp; *AttachedToDeviceObject &lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Com esta chamada obteremos o ponteiro do device ao qual estaremos atachados, esse device será o próximo device que receberá a IRP depois que você a passar a diante.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Mas Fernando, nós já não temos o ponteiro do device de destino?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Muito bem, quando você obtém o ponteiro para um device, você teoricamente não sabe se existem filtros já atachados sobre ele. O ponteiro que você recebe nesta rotina pode não ser o ponteiro para o device de destino. Na figura abaixo podemos entender como essa relação acontece.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/NextDevice.png&quot; /&gt;&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Fernando, existe uma versão unsafe desta rotina?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Na verdade existe, a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa490466.aspx&quot;&gt;IoAttachDeviceToDeviceStack()&lt;/a&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;PDEVICE_OBJECT &lt;/pre&gt;&lt;pre&gt;&amp;nbsp; IoAttachDeviceToDeviceStack(&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PDEVICE_OBJECT&amp;nbsp; SourceDevice,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PDEVICE_OBJECT&amp;nbsp; TargetDevice&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ela é considerada unsafe por causa de uma pequena janela de tempo que pode causar um race condition. Repare que a diferença entre estas rotinas é a forma de obter o endereço do próximo device. Na versão original, este endereço é obtido pelo retorno na função. Se colocarmos essa função para rodar em câmera lenta veremos os seguintes passos.&lt;/p&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt;Seu device é atachado à pilha de dispositivos.&lt;/li&gt;&lt;li&gt;O endereço do próximo device é retornado pela função.&lt;/li&gt;&lt;li&gt;Seu driver recebe este endereço no retorno da função e atualiza o device extension.&lt;/li&gt;&lt;li&gt;IRPs começam a chegar e seu driver às encaminham para o próximo device da lista.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Tudo parece lindo e até dá a impressão de que tudo vai funcionar muito bem em qualquer situação, mas desenvolvedor de driver é um bixo treinado para buscar race conditions. Dê mais uma olhada na sequência, mas agora em câmera super lenta. Com essa câmera super lenta agora podemos observar os passos que podem ocorrer entre os passos 2 e 3.&lt;/p&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt;Seu device é atachado à lista de dispositivos.&lt;/li&gt;&lt;li&gt;O endereço do próximo device é retornado pela função.
&lt;ol&gt;&lt;li&gt;Sua thread é interrompida e uma IRP lançada por uma aplicação que roda em paralelo começa sua viagem por essa pilha de dispositivos.&lt;/li&gt;&lt;li&gt;Seu device, que já está atachado, recebe a IRP e tenta encaminhá-la ao device de baixo.&lt;/li&gt;&lt;li&gt;Oops! Nosso &lt;span&gt;device extension&lt;/span&gt; ainda não foi atualizado com tal endereço.&lt;/li&gt;&lt;li&gt;Seu driver se lembra de quando era uma criança e de tudo o que vivera até ali.&lt;/li&gt;&lt;li&gt;Ele decide entrar de vez naquela dança e enviar a IRP para um device cujo ponteiro ainda é NULL causando um BSOD.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&quot;Jeremias, eu sou homem. Coisa que você não é e não atiro pelas costas não...&quot;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Enfim, entenda que mesmo que você utilize o retorno da rotina &lt;span&gt;IoAttachDeviceToDeviceStack(&lt;/span&gt;) diretamente para atualizar seu device extension, ainda assim existe uma janela de tempo em que seu device estará atachado, mas que o valor ainda não foi atualizado no device extension. Isso porque o valor de retorno de uma rotina vem por um registrador. Pegar o valor desse registrador e atualizar uma variável ainda dá chances para o azar.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; ----==== N&amp;#195;O COPIE ISSO ====----&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Aqui ainda temos uma janela de tempo entre o device ser&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; atachado e o valor de pNextDeviceObj ser atualizado.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDeviceExt-&amp;gt;pNextDeviceObj = IoAttachDeviceToDeviceStack(pMyDeviceObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTargetDeviceObj);&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;A rotina &lt;span&gt;IoAttachDeviceToDeviceStackSafe(&lt;/span&gt;) faz o sistema interromper o fluxo de IRPs nesta pilha até que a variável apontada pelo ponteiro de saída seja atualizado. Por essa razão, o endereço passado nesta rotina deve ser o endereço final da variável onde este valor será armazenado, que em nosso caso é &lt;span&gt;pDeviceExt-&gt;pNextDeviceObj&lt;/span&gt; sem passar por variáveis intermediárias.&lt;/p&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/homer_doh.png&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Esses detalhes são importantes e farão você entender que usar a versão safe desta rotina não é garantia de que tudo dará certo. Imagine que usando a versão safe você receba o endereço do próximo device em uma variável local e depois atualize seu device extension. Esse é um daqueles típicos casos que é necessário substituir aquele componente que fica entre o teclado e a cadeira.&lt;/p&gt;&lt;p&gt;Acha preciosismo? Tente ler o capítulo 5 do livro &lt;a href=&quot;http://www.amazon.com/Programming-Microsoft-Windows-Driver-Model/dp/0735618038/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1264044523&amp;sr=1-1&quot;&gt;&quot;Programming the Microsoft Windows Driver Model&quot;&lt;/a&gt; onde Walter Oney fala sobre como lidar com cancelamento de IRPs.&lt;/p&gt;&lt;p&gt;Depois de atacharmos nosso device já podemos liberar a referência obtida por &lt;span&gt;IoGetDeviceObjectPointer()&lt;/span&gt; utilizando a rotina &lt;span&gt;ObDereferenceObject()&lt;/span&gt;, já que a rotina &lt;span&gt;IoAttachDeviceToDeviceStackSafe()&lt;/span&gt; já garantiu a referência até que essa ligação seja desfeita.&lt;/p&gt;&lt;p&gt;Muito bem. Pra quem não conseguiu entender quase nada do que eu disse, segue o código fonte da implementação da nossa &lt;span&gt;DriverEntry()&lt;/span&gt; de exemplo. Sabe como é cabeça de programador, as vezes um &lt;span&gt;if&lt;/span&gt; vale mais que mil páginas de explicação.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;/****&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;***&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DriverEntry&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Ponto de entrada do driver.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Bem vindo ao inferno.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;extern&lt;/span&gt; &lt;span&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;NTSTATUS&lt;/pre&gt;&lt;pre&gt;DriverEntry(IN PDRIVER_OBJECT&amp;nbsp; pDriverObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IN PUNICODE_STRING pusRegistryPath)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NTSTATUS&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nts;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_OBJECT&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pMyDeviceObj;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;int&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNICODE_STRING&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; usDeviceName;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_OBJECT&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pTargetDeviceObj;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PFILE_OBJECT&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pFileObj;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_EXTENSION&amp;nbsp;&amp;nbsp; pDeviceExt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Seta a rotina de descarga do driver.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;DriverUnload = OnDriverUnload;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Seta todas as dispatch routines do driver para&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; uma que encaminhe a IRP para o driver original.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;for&lt;/span&gt; (i = &lt;span&gt;0&lt;/span&gt;; i &amp;lt;= IRP_MJ_MAXIMUM_FUNCTION; i++)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pDriverObj-&amp;gt;MajorFunction[i] = OnForwardDispatch;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Inicializamos a string com o nome do device ao&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; qual queremos nos atachar.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RtlInitUnicodeString(&amp;amp;usDeviceName,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L&lt;span&gt;&amp;quot;\\Device\\StringList&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Obtemos o ponteito do device de destino&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nts = IoGetDeviceObjectPointer(&amp;amp;usDeviceName,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; FILE_READ_DATA,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;amp;pFileObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;amp;pTargetDeviceObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;if&lt;/span&gt; (!NT_SUCCESS(nts))&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;return&lt;/span&gt; nts;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Criamos nosso device object&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nts = IoCreateDevice(pDriverObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;sizeof&lt;/span&gt;(DEVICE_EXTENSION),&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTargetDeviceObj-&amp;gt;DeviceType,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTargetDeviceObj-&amp;gt;Characteristics,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pMyDeviceObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;if&lt;/span&gt; (!NT_SUCCESS(nts))&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Oops!&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ObDereferenceObject(pFileObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;return&lt;/span&gt; nts;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Obtem nosso DEVICE_EXTENSION&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDeviceExt = (PDEVICE_EXTENSION)pMyDeviceObj-&amp;gt;DeviceExtension;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Utiliza o mesmo m&amp;#233;todo de IO do driver original&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMyDeviceObj-&amp;gt;Flags |= pTargetDeviceObj-&amp;gt;Flags &amp;amp; (DO_BUFFERED_IO | DO_DIRECT_IO);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Aqui nosso driver entra na pilha de dispositivos&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nts = IoAttachDeviceToDeviceStackSafe(pMyDeviceObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pTargetDeviceObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;amp;pDeviceExt-&amp;gt;pNextDeviceObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;if&lt;/span&gt; (!NT_SUCCESS(nts))&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Oops!&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IoDeleteDevice(pMyDeviceObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Aqui n&amp;#227;o est&amp;#225; faltando um return.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Independente de estarmos atachados ou n&amp;#227;o, devemos liberar&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; a refer&amp;#234;ncia obtida do device de destino.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObDereferenceObject(pFileObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;return&lt;/span&gt; nts;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;
&lt;span&gt;&lt;strong&gt;Escrevendo a OnDriverUnload&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Aqui é onde a festa acaba, antes de o nosso driver ser descarregado pelo sistema, teremos que remover nosso device da pilha de dispositivos e destruí-lo. (Risadas maléficas)&lt;/p&gt;&lt;p&gt;O código aqui é simples e não requer explicações se você for capaz de ler os comentários contidos nele.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;/****&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;***&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnDriverUnload&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Rotina de descarga do driver.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;VOID&lt;/pre&gt;&lt;pre&gt;OnDriverUnload(IN PDRIVER_OBJECT&amp;nbsp; pDriverObj)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_OBJECT&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pMyDeviceObj;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_EXTENSION&amp;nbsp;&amp;nbsp; pDeviceExt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Nosso device est&amp;#225; na lista de devices criados por este driver&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; ent&amp;#227;o vamos obt&amp;#234;-lo simples assim:&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMyDeviceObj = pDriverObj-&amp;gt;DeviceObject;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Aqui obt&amp;#234;mos o device extension.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDeviceExt = (PDEVICE_EXTENSION)pMyDeviceObj-&amp;gt;DeviceExtension;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Aqui removemos nosso device da pilha passando o endere&amp;#231;o do&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pr&amp;#243;ximo device para a rotina abaixo.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IoDetachDevice(pDeviceExt-&amp;gt;pNextDeviceObj);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Agora podemos destruir nosso device (risadas mal&amp;#233;ficas)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IoDeleteDevice(pMyDeviceObj);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Fernando, nosso driver é forçado a se descarregar quando o driver original é descarregado?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Essa é a filosofia do &lt;span&gt;WDM&lt;/span&gt;, drivers são carregados automáticamente quandos seus dispositivos são detectados e descarregados quando seus dispositivos são desativados ou removidos. Os filtros seguem as mesmas regras e são carregados/descarregados basendo-se nestes eventos.&lt;/p&gt;&lt;p&gt;Mas não é isso o que acontece aqui. Os drivers de exemplo que uso neste blog são do modelo &lt;span&gt;Legacy&lt;/span&gt;, e não WDM. No modelo Legacy, drivers são iniciados seguindo sua ordem de carga no registry, e não tem nada a ver com a detecção do seu dispositivo. Os filtros precisam iniciar depois dos drivers originais, e isso também é controlado pela sua ordem de carga. &lt;a href=&quot;http://www.driverentry.com.br/blog/2009/12/drivers-de-boot-no-windows.html&quot;&gt;Este post&lt;/a&gt; fala sobre a ordem de carga dos legacy drivers.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Tá! Falou, falou e não respondeu minha pergunta. O que acontece se eu solicitar a descarga do driver original enquanto houver um filtro atachado sobre ele?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A descarga dos drivers que formam uma pilha deve ocorrer de forma inversa à sua carga. Neste caso o filtro deve ser descarregado antes do driver original, desempilhando os devices de cima para baixo. Caso o driver original receba uma solicitação de descarga enquanto ainda hoverem referências a seus devices, seja por um filtro ou por uma aplicação, a descarga é adiada até que suas referências sejam desfeitas. Até lá, a tentativa de obter novas referências para um device que recebeu a solicitação de descarga serão negadas.&lt;/p&gt;&lt;p&gt;
&lt;span&gt;&lt;strong&gt;Escrevendo Dispatch Routines&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As &lt;span&gt;dispatch routines&lt;/span&gt; de um filtro também são diferentes das &lt;span&gt;dispatch routine&lt;/span&gt;s de um driver. Apensar de elas poderem completar uma IRP chamando &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa490590.aspx&quot;&gt;IoCompleteRequest()&lt;/a&gt;, elas normalmente repassam a socilitação adiante utilizando a rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa490633.aspx&quot;&gt;IoCallDriver()&lt;/a&gt;. Vou falar mais sobre o comportamento das &lt;span&gt;dispatch routines&lt;/span&gt; de um filtro em posts futuros. Neste filtro de exemplo vamos apenas logar a atividade e repassar a solicitação ao próximo driver.&lt;/p&gt;&lt;p&gt;Quando falamos em repassar uma solicitação estamos na verdade falando de repassar IRPs. A leitura deste &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/02/legal-mas-o-que-uma-irp.html&quot;&gt;outro post&lt;/a&gt; é essencial para o que vamos fazer na implementação de nossas &lt;span&gt;dispatch routines&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Para acabar esse post ainda nessa vida, segue código da implementação de nossa &lt;span&gt;dispatch routine&lt;/span&gt;. Depois de ler o post sobre IRPs que acabei de recomendar, ler os comentários deste código devem ser suficientes para entender tudo o que foi feito aqui, ou não.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;/****&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;***&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnForwardDispatch&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Nossa dispatch routine simplesmente loga a IRP&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; recebida e repassa a solicita&amp;#231;&amp;#227;o adiante.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;**&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;NTSTATUS&lt;/pre&gt;&lt;pre&gt;OnForwardDispatch(IN PDEVICE_OBJECT&amp;nbsp;&amp;nbsp;&amp;nbsp; pDeviceObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; IN PIRP&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pIrp)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_EXTENSION&amp;nbsp;&amp;nbsp; pDeviceExt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIO_STACK_LOCATION&amp;nbsp; pStack;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Obt&amp;#233;m ponteiro para o device extesion&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj-&amp;gt;DeviceExtension;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Obt&amp;#233;m stack location corrente&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pStack = IoGetCurrentIrpStackLocation(pIrp);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Manda o nome na major routine da IRP&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASSERT(pStack-&amp;gt;MajorFunction &amp;lt;= IRP_MJ_MAXIMUM_FUNCTION);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DbgPrint(&lt;span&gt;&amp;quot;[StringFilter] : %s\n&amp;quot;&lt;/span&gt;, g_szMajorNames[pStack-&amp;gt;MajorFunction]);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Como n&amp;#227;o estamos modificando nada na stack location,&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; vamos deix&amp;#225;-la para que o pr&amp;#243;ximo device a use.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IoSkipCurrentIrpStackLocation(pIrp);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;//-f--&amp;gt; Encaminha a IRP para o pr&amp;#243;ximo device.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;return&lt;/span&gt; IoCallDriver(pDeviceExt-&amp;gt;pNextDeviceObj,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pIrp);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Caso não tenham entendido nada, não esqueçam de me mandar um e-mail expondo suas dúvidas (sem ofenças pessoais). Isso me ajudará a entender suas dificuldades e a melhorar minhas explicações.&lt;/p&gt;&lt;p&gt;
&lt;span&gt;&lt;strong&gt;Testando o Filtro&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Essa é a parte fácil do post. Para testar o filtro teremos primeiro que compilar, instalar e iniciar o driver &lt;a href=&quot;http://www.driverentry.com.br/blog/2009/07/strings-no-kernel.html&quot;&gt;deste post&lt;/a&gt;. Se você ainda não sabe como fazer isso, este &lt;a href=&quot;http://www.driverentry.com.br/blog/2006/09/getting-started.html&quot;&gt;outro post&lt;/a&gt; pode te dar um ponto de partida. Depois disso, compile, instale e inicie o filtro.&lt;/p&gt;&lt;p&gt;Depois de instalados, podemos utilizar a aplicação de teste para exercitar o driver. Poderemos acompanhar a atividade do filtro observando suas mensagens de debug que podem ser vistas no depurador de Kernel ou simplemente usando &lt;a href=&quot;http://www.osronline.com/article.cfm?article=99&quot;&gt;esta aplicação&lt;/a&gt;, que dispensa o uso de um depurador para ver as mensagens de debug de um driver.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/Filtering.png&quot; /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;&quot;Fernando, fiz um teste aqui e ví que ao iniciar o filtro ele loga um evento de &lt;span&gt;IRP_MJ_CLOSE&lt;/span&gt; mesmo antes de iniciar a aplicação de teste. O que eu fiz de errado?&quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/LogClose.png&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Não há nada de errado. Isso acontece por causa da sequência de passos seguidos na rotina &lt;span&gt;DriverEntry()&lt;/span&gt; do filtro. Inicialmente o driver chama a rotina &lt;span&gt;IoGetDeviceObjectPointer()&lt;/span&gt;, isso faz com que o &lt;span&gt;IoManager&lt;/span&gt; envie uma solicitação de &lt;span&gt;IRP_MJ_CREATE&lt;/span&gt; para o driver original. Depois disso nos atachamos à pilha de dispositivos e por fim chamamos a rotina &lt;span&gt;ObDereferenceObject()&lt;/span&gt; que vai finalizar a única referência do &lt;span&gt;file object&lt;/span&gt; que recebemos, enviando uma solicitação de &lt;span&gt;IRP_MJ_CLOSE&lt;/span&gt; para o driver de baixo. Como já estamos atachados a ele, então somos capazes de ver nossa própria atividade sobre o driver original. Isso pode ser observado pela pilha de chamadas que teremos se houver um &lt;span&gt;breakpoint&lt;/span&gt; em nossa &lt;span&gt;dispatch routine&lt;/span&gt; quando liberarmos a referência do &lt;span&gt;file object&lt;/span&gt; ao final da &lt;span&gt;DriverEntry()&lt;/span&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot; id=&quot;codemain&quot;&gt;&lt;div&gt;&lt;pre&gt;kd&amp;gt; k&lt;/pre&gt;&lt;pre&gt;ChildEBP RetAddr&amp;nbsp; &lt;/pre&gt;&lt;pre&gt;f8af9bcc 804ee129 StringFilter!OnForwardDispatch&lt;/pre&gt;&lt;pre&gt;f8af9bdc 80578f6a nt!IopfCallDriver+0x31&lt;/pre&gt;&lt;pre&gt;f8af9c14 805b0b18 nt!IopDeleteFile+0x132&lt;/pre&gt;&lt;pre&gt;f8af9c30 80522bd1 nt!ObpRemoveObjectRoutine+0xe0&lt;/pre&gt;&lt;pre&gt;f8af9c54 f8c80663 nt!ObfDereferenceObject+0x5f&lt;/pre&gt;&lt;pre&gt;f8af9c7c 805767ff StringFilter!DriverEntry+0xf3&lt;/pre&gt;&lt;pre&gt;f8af9d4c 8057690f nt!IopLoadDriver+0x66d&lt;/pre&gt;&lt;pre&gt;f8af9d74 80534c12 nt!IopLoadUnloadDriver+0x45&lt;/pre&gt;&lt;pre&gt;f8af9dac 805c61ee nt!ExpWorkerThread+0x100&lt;/pre&gt;&lt;pre&gt;f8af9ddc 80541de2 nt!PspSystemThreadStartup+0x34&lt;/pre&gt;&lt;pre&gt;00000000 00000000 nt!KiThreadStartup+0x16&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Como de costume, o fonte do filtro que foi implementado neste post está disponível para download. Nosso filtro não faz quase nada, mas já servirá de base para posts futuros que darão mais funcionalidade a ele explicando como tais funcionalidades são implementadas.&lt;/p&gt;&lt;p&gt;Até mais!&lt;/p&gt;&lt;p&gt;Download &lt;a href=&quot;http://www.driverentry.com.br/samples/StringFilter.zip&quot;&gt;StringFilter.zip&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-4208475676533334470?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-08-30T19:35:37+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Symbian agora totalmente opensource</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/QJOxuMaDoUM/symbian-agora-totalmente-opensource.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-7312382292519754634</id>
		<updated>2010-02-06T01:40:22+00:00</updated>
		<content type="html">Antes o kernel e agora toda a plataforma. A Symbian Foundation decidiu abrir todo o código-fonte para os desenvolvedores. É certo que muitas das ferramentas necessárias para a compilação e construção do sistema operacional ainda são proprietárias, mas com a ajuda da comunidade de desenvolvedores, esta migração será questão de tempo.  Ao mer ver, a abertura do código-fonte é parte da estratégia</content>
		<author>
			<name>Thiago Delgado Pinto</name>
			<email>noreply@blogger.com</email>
			<uri>http://devhints.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">devhints</title>
			<subtitle type="html">Desenvolvimento de software</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/devhints"/>
			<id>tag:blogger.com,1999:blog-41480276002288545</id>
			<updated>2010-08-30T19:35:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2010/01/31/mrnn-brasil-para-discussao-de-solucoes-mrnn-n1nf-nosql-notonlysql/"/>
		<id>http://techberto.wordpress.com/?p=198</id>
		<updated>2010-01-31T15:45:33+00:00</updated>
		<content type="html">&lt;p&gt;Apesar de extremamente prazeroso (ou às vezes nem tanto) acompanhar mailists e foruns nem sempre é tarefa fácil, seja pelo rumo que certas discussões geram, pela falta de tempo  ou às vezes pela questão do foco. Acredito eu, que eventualmente todos vêem um assunto que é meio (ou inteiramente) off-topic sendo tratado com certo pudor, mas que você gostaria que a discussão evoluísse mas a própria lista e a netiqueta não permite.&lt;/p&gt;
&lt;p&gt;Alguns dizem que a relação entre arquiteto e programador é de confiança e compreensão, arquitetos não confiam em programadores e estes não compreendem os arquitetos!&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-198&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esta afirmação pode parecer exagerada (como de fato é) mas recentemente identifiquei exatamente esta situação numa reunião onde o foco era NoSQL, atritos à parte, na hora pensei que este é um assunto que merece ser profundamente e adequadamente discutido e difundido e ver ele restrito a censura ou limite dos off topics era algo cruel, e isto me fez lembrar de algumas conversas que tive, sendo uma delas com o &lt;a href=&quot;http://blog.pedro.lamarao.nom.br/&quot; target=&quot;_blank&quot;&gt;Pedro Lamarão&lt;/a&gt; (figura carimbada do grupo C &amp;amp; C++ Brasil) num happy hour e outra com o &lt;a title=&quot;Jack Ganssle&quot; href=&quot;http://www.ganssle.com/bio.htm&quot; target=&quot;_blank&quot;&gt;Jack Ganssle&lt;/a&gt; (quando ele esteve no Brasil para o workshop que o &lt;a href=&quot;http://www.embarcados.com.br/&quot; target=&quot;_blank&quot;&gt;Portal Embarcados&lt;/a&gt; promoveu sobre Engenharia de Software) no qual o foco de ambas conversas foi o estímulo e a iniciativa. Pra ser sincero, foi com este foco que convidamos o &lt;a href=&quot;http://felipetonello.com/blog/&quot; target=&quot;_blank&quot;&gt;Felipe Tonello &lt;/a&gt; para palestrar no &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&quot; target=&quot;_blank&quot;&gt;VI Encontro de Programadores do grupo C &amp;amp; C++ Brasil&lt;/a&gt; (que vai ocorrer no próximo sábado dia 06/02/2010) para falar sobre seu projeto RoboQT, é com esta abordagem em mente pensei que era necessários fazer algo em ralação ao NoSQL&amp;#8230;&lt;/p&gt;
&lt;p&gt;Como muitos sabem:&lt;/p&gt;
&lt;p&gt;DBMS != SQL&lt;br /&gt;
SQL != Evil&lt;br /&gt;
NoSQL != Paraíso&lt;/p&gt;
&lt;p&gt;Para aqueles que apreciam o assunto e desejam discuti-los sem a preocupação de criar &amp;#8220;OFF TOPICS&amp;#8221;, com o  propósito de criar um canal&lt;br /&gt;
independente (de linguagens de programação e DBMS) destinada para a discussão de Banco (não bando) de Dados não relacionais - NF², NF2, N1NF (non first normal form) , MRNN (Modelo Relacional Não-Normalizado) também conhecidos como nested relational, dimensional, multivalue, free-form, schemaless porém mais populares como NoSQL (Not Only SQL) criei a lista MRNN-Brasil:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/MRNN-Brasil&quot; target=&quot;_blank&quot;&gt;http://groups.google.com/group/MRNN-Brasil&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O foco é tratar o assunto sem pudores de abordagens acadêmicas,&lt;br /&gt;
profissionais ou produtos podendo ser tratado tanto BigTable (???),&lt;br /&gt;
Dynomite, Riak, Cassandra, CouchDB,  HBase, Sherpa, Voldemort, Tokyo&lt;br /&gt;
Cabinet, MongoDB como as bibliotecas das mais diversas linguagens, sejam elas C, C++, Python, ERlang, Go, Haskell, Ruby, Brainfuck ou Whitespace ou até novas iniciativas; seja do ponto de vista de arquitetura, programação, segurança ou o que for, mas obviamente relacionado com MRNNs.&lt;/p&gt;
&lt;p&gt;Talvez eu não tenha procurado direito, mas como eu não havia encontrado nada semelhante em Pt-BR, resolvi tomar esta iniciativa.&lt;/p&gt;
&lt;p&gt;A escolha de um nome do vernáculo foi em razão de que NoSQL não intui muito para o que ele realmente representa (Not Only SQL) e esta NÃO é uma lista não para aqueles que relacionam SQL com algo do mal e NoSQL dá impressão de ser  uma campanha anti-SQL; mesmo que no fundo esta &amp;#8221;buzzword&amp;#8221; não (?!?!) signifique  isto e após estímulo (indireto) do &lt;a href=&quot;http://blog.ramgarlic.com/&quot; target=&quot;_blank&quot;&gt;Luciano Ramalho&lt;/a&gt; (que é um entusiasta do assunto tanto quanto ele é de Python) acabei adotando o nome MRNN-Brasil ao invés de NoSQL-Brasil.&lt;/p&gt;
&lt;p&gt;Espero que  iniciativa possa ser útil para a comunidade.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=198&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Um Helimodelo no XV Simpósio Multidisciplinar</title>
		<link href="http://www.driverentry.com.br/blog/2009/09/um-helimodelo-no-xv-simposio.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-5799639373011183591</id>
		<updated>2010-01-26T12:00:58+00:00</updated>
		<content type="html">&lt;p&gt;Esse é mais um daqueles posts Off-Topic que não tem nada a ver com nada. Ou quase nada. Acho que a maioria de vocês já esta cansada de saber que este é meu último ano da universidade e que este ano estou todo enrolado com nosso Trabalho de Graduação (TG). Quem acompanha &lt;a href=&quot;http://twitter.com/driverentry&quot;&gt;meu Twitter&lt;/a&gt; tem uma idéia de como isso tem tomado meu tempo. Você pode estar se perguntando: &lt;span&gt;&lt;span&gt;&quot;O que faz este projeto?&quot;&lt;/span&gt;&lt;/span&gt;. Em uma palavra: &lt;span&gt;&lt;span&gt;&quot;Nada&quot;&lt;/span&gt;&lt;/span&gt;. Estamos trabalhando a mais de um ano desenvolvendo hardware, firmware, driver, software e controle para que o projeto não faça nada. Na verdade, o objetivo é que não aconteça nada com um helimodelo em voo. Tá, tudo bem, desde o começo agora.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;Era uma vez um helimodelo&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Alguns de vocês já sabem que além de programador retardado, também tento gastar o tempo que não tenho como helimodelista. Um helimodelo é um helicóptero em escala reduzida, equipado com motor à combustão ou mesmo elétrico. Com as funcionalidades de um helicóptero convencional, é capaz de realizar voos com as mesmas características e liberdade de movimentos. Na verdade, quanto à capacidade de voo, um helimodelo pode fazer mais que um helicóptero real. Não é incomum ver um helimodelo voando de cabeça para baixo.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/RaptorTitan.jpg&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Um helimodelo é controlado por um sistema de rádio controle que determina os movimentos de servomotores instalados na aeronave. Cada servo tem seu papel específico dentro do helimodelo. Um controla o acelerador, outro a inclinação das pás do rotor de cauda e assim por diante.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;É fácil controlar um helimodelo?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Não mesmo. O rádio controle possui dois sticks, e assim, são 4 os movimentos que você deve comandar ao mesmo tempo, isso além das chaves adicionais. O grande problema é que para ganhar os reflexos necessários para fazer a correção leva um certo tempo de treino. Acredite, você não vai querer um helimodelo voando desgovernado perto de você. Além do risco de se ferir, é quase certo que o helimodelo acertará algo e se dividirá em vários pedaços. Posso dizer que este não é um equipamento barato e cada queda pode significar centenas de reais para colocar tudo para funcionar novamente. Para começar com esse hobby normalmente utilizamos um simulador.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/SimuladorG45.PNG&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Um simulador é muito parecido com um vídeo-game. Com ele você recebe um joystick especial que é uma réplica de um rádio controle, mas que faz interface USB com seu computador. Você utiliza tal joystick para controlar um helimodelo na tela do seu computador. Assim, a cada queda que o modelo sofrer, basta apertar um botão de reset no próprio controle para que você possa tentar novamente. Quando eu estava começando no hobby, todos me indicaram um simulador até que comprei um. Fiquei pensando: &lt;span&gt;&lt;span&gt;&quot;Que dificil que nada... Pra cima de mim? Só se for pra esses coroas. Tenho mais de vinte anos de vídeo-game nas costas&quot;.&lt;/span&gt;&lt;/span&gt; Quando comecei a brincar com o simulador ví que não era tão fácil assim. Dezenas e dezenas de quedas. Os simuladores são realmente um excelente início. Eles conseguem reproduzir com grandes detalhes o comportamento de um modelo.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/AulaVoo.PNG&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Depois do simulador, você normalmente faz aulas de voo. E para isso você contrata um instrutor. Mas o que pode fazer um instrutor além de lhe desejar boa sorte? O que acontece é que rádios controles podem ser ligados por um cabo de treinamento. Esse cabo permite que o instrutor possa controlar o helimodelo, e com o mudar de uma chave, o controle passa para a mão do aluno. Se o aluno perder o controle sobre o modelo, o instrutor pode tomar o controle de volta e evitar que seu helimodelo novinho se transforme num monte de lixo.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;Legal, mas e o projeto?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nosso projeto tem como objetivo controlar um helimodelo em voo de forma a estabilizá-lo. Por isso digo que nosso projeto vai fazer nada. Houve professor que ainda disse: &lt;span&gt;&lt;span&gt;&quot;Caramba! Vocês vão fazer tudo isso para fazer um helicóptero ficar parado?&quot;&lt;/span&gt;&lt;/span&gt;. Se você é um helimodelista, sabe que manter o helimodelo parado é o primeiro desafio de um piloto. Mesmo em ambientes sem vento, estabilizar um helimodelo requer uma boa quantidade de experiência. Nosso objetivo final seria descrever um plano de voo simples onde ele decole, estabilize no ar, faça alguns movimentos e finalmente pouse. Não queremos dar um passo maior que a perna. Vamos ver o que conseguimos até o dia da apresentação.&lt;/p&gt;&lt;p&gt;Para detectar os movimentos do helimodelo, nós instalamos alguns sensores no helimodelo, os dados dos sensores são reunidos por um microcontrolador que está instalado numa placa também a bordo do helimodelo. Depois de reunidos, os dados são enviados à uma outra placa em solo através de um módulo &lt;a href=&quot;http://pt.wikipedia.org/wiki/ZigBee&quot;&gt;ZigBee&lt;/a&gt;. Na foto abaixo pode-se ver nossa plaquinha. Essa placa em solo é &lt;a href=&quot;http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3185&quot;&gt;um kit da Atmel&lt;/a&gt; que tem suporte a diversas interfaces, sendo a USB uma delas. Assim, escrevemos o &lt;a href=&quot;http://pt.wikipedia.org/wiki/Firmware&quot;&gt;firmware&lt;/a&gt; e o driver USB para fazer com que tais leituras agora fossem recebidas pelo nosso software de controle.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/DiagramaTG.PNG&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Para fazer o controle, utilizaremos o novo Toolkit de &lt;a href=&quot;http://pt.wikipedia.org/wiki/L%C3%B3gica_difusa&quot;&gt;lógica Fuzzy&lt;/a&gt; que está disponível no novo &lt;a href=&quot;http://www.ni.com./labview/&quot;&gt;LabVIEW 2009&lt;/a&gt; da &lt;a href=&quot;http://www.ni.com/&quot;&gt;National Instruments&lt;/a&gt;. Para quem não conhece, o LabVIEW é uma das principais ferramentas de controle utilizadas pela engenharia moderna. É possível fazer programas de controle apenas desenhando e arrastando componentes sobre a tela, pode parecer contraditório um desenvolvedor de baixo nível dizer isso, mas toda essa abstração nos dá tempo para dedicar às coisas que realmente precisam de tempo. A ferramenta também dispõe de interfaces de I/O permitindo trabalhar com sensores e atuadores diretamente sobre o meio eletrônico.&lt;/p&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/BrunoNI.PNG&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Uma outra informação interessante é que o Toolkit de PID e Lógica Fuzzy foi completamente re-escrito e reformulado com a ajuda de um brasileiro. Isso mesmo, &lt;a href=&quot;http://www.linkedin.com/pub/bruno-cesar/5/517/832&quot;&gt;Bruno Cesar&lt;/a&gt; (na foto ao lado) trabalha na National Instruments Brasil e foi um dos responsáveis por esse desenvolvimento. Acha isso conhecidência? Então o que você me diria ao saber que ele também se formou na Universidade São Judas Tadeu? Bruno esteve semana passada no campus da Mooca dando uma palestra sobre o novo módulo de lógica Fuzzy. Isso nos deu mais certeza de que a lógica Fuzzy é a ideal para nosso problema de controle, já que ela é perfeita para lidar com problemas complexos onde não se tem o modelo matemático que descreva o comportamento de um helimodelo. A lógica Fuzzy se baseia na experiência de um operador para atuar sobre os controles. É bem interessante.&lt;/p&gt;&lt;p&gt;O LabVIEW também nos permite que façamos chamadas à DLLs. Essa foi uma maneira simples que conseguimos para fazer com os dados que estavam no driver chagar ao software de controle. Assim, criamos uma DLL que abstraísse muitas das complicações de se interagir com um dispositivo USB. O LabVIEW apenas chama funções do tipo &lt;span&gt;LeAmostra()&lt;/span&gt; que já retorna o dado pronto para o uso. Todo aquele código com &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx&quot;&gt;CreateFile()&lt;/a&gt; e &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx&quot;&gt;DeviceIoControl()&lt;/a&gt; ficou por conta da DLL, além de outras funções auxiliares.&lt;/p&gt;&lt;p&gt;Agora vocês podem estar se perguntando: &lt;span&gt;&lt;span&gt;&quot;Mas como o LabVIEW vai atuar sobre o helimodelo?&quot;&lt;/span&gt;&lt;/span&gt;. Lembra daquele cabo de treinamento? Nossa placa USB vai receber as ações de controle do LabVIEW através da mesma DLL. Para fazer com que tais comandos sejam aplicados sobre o helimodelo, fizemos com que nossa placa USB se comporte como um rádio controle, que utilizará o cabo de treinamento para aplicar o controle sobre o helimodelo. Obviamente ainda teremos um piloto segurando o rádio no papel de instrutor, principalmente para evitar acidentes, onde um mal funcionamento de nosso projeto poderia transformar meu helimodelo num monte de lixo.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;O Simpósio Multidisciplinar&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/XV_SIMPOSIO.JPG&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Desde que comecei a escrever sobre o projeto neste blog, algumas pessoas ficaram curiosas e disseram: &lt;span&gt;&lt;span&gt;&quot;Me avise quando houver alguma apresentação&quot;&lt;/span&gt;&lt;/span&gt;. Bom, esta é a sua chance de dar uma olhada em alguns projetos. Nosso projeto foi aceito para ter um espaço neste evento que vai acontecer de 18 a 25 de setembro na &lt;a href=&quot;http://www.usjt.br&quot;&gt;Universidade São Judas Tadeu&lt;/a&gt;. Serão várias apresentações curtas de 15 cada. Os projetos ainda não estão terminados, e dessa forma, você ainda não verá nenhum helimodelo voando sozinho por lá, mas estaremos com nosso equipamento dispostos a responder algumas perguntas. O simpósio é aberto à visitação pública. Não é necessário ser aluno para participar, basta se inscrever gratuitamente no site da universidade e pronto. Se quiser discutir um pouco sobre sensores, microcontroladores, firmwares, drivers, controle ou ainda helimodelismo, mesmo que durante um café, é só aparecer.&lt;/p&gt;&lt;p&gt;Bom, é isso aí. Já escrevi demais. Agora preciso voltar ao meu projeto.&lt;br /&gt;Até mais!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-5799639373011183591?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-08-30T19:35:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Jack Sullivan rodeado de Woodsprites</title>
		<link href="http://techberto.wordpress.com/2010/01/25/luminescencia-meu-tio-jose-e-avatar/"/>
		<id>http://techberto.wordpress.com/?p=190</id>
		<updated>2010-01-25T19:43:21+00:00</updated>
		<content type="html">&lt;p&gt;Final de ano, num rancho a beira-rio, curtindo o feriadão com a família, meus primos tiveram a idéia de fazer uma festa (que para minha surpresa havia sido&lt;img class=&quot;alignright&quot; title=&quot;Lightstick&quot; src=&quot;http://images.quebarato.com.br/photos/big/E/B/3792EB_4.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;320&quot; /&gt; preparada com boa antecedência) com direito a vários badulaques e inclusive com &lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt;lightsticks&lt;/a&gt; (à volonté como diria os franceses ou à la vonté como nós abrasileiramos e gostamos de dizer) que sempre dá um tom alegre a festas noturnas e sempre leva a criançada (e inclusive vários marmanjos) a brincar diante das lâmpadas ultra-violetas, devido aos agradáveis efeitos visuais que tal combinação produz, sendo sempre um bom elemento para complementar a diversão.&lt;/p&gt;
&lt;p&gt;Após a festa e em momento oportuno, meu sábio tio José, que tem uma curiosidade que eu muito aprecio,  me fez a seguinte pergunta:&lt;/p&gt;
&lt;p&gt;- O que faz estas pulseiras brilharem? Elas são realmente de neon?&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-190&quot;&gt;&lt;/span&gt;Estes são um daqueles momentos que você sente imenso prazer, afinal perguntaram algo do que eu sabia responder e pelo qual naquele momento eu estava pensando por razões que vocês irão descobrir abaixo.  Sem contar que com certas pessoas é sempre prazeiroso compartilhar um pouco de erudição  ou como alguns preferem chamar, um pouco de cultura inútil para desopilar o fígado; apesar que se tratando de cultura eu nunca a acho inútil, mesmo que seja para filosofar sobre o  bater de asas das borboletas  do ponto de vista entomológico, neural, da física tratando da teoria do caos, da perspectiva cinematográfica comentando sobre criativo filme &amp;#8220;&lt;em&gt;&lt;strong&gt;efeito borboleta&lt;/strong&gt;&lt;/em&gt;&amp;#8221; ou poético lembrando por exemplo da famosa pretensão de Mhuammad Ali de &amp;#8220;&lt;em&gt;&lt;strong&gt;float like a butterfly, sting like a bee&lt;/strong&gt;&lt;/em&gt;&amp;#8220;. Mas dependendo do contexto isto pode ser um porre para quem está participando e ninguém gosta de ser desagradável, mas este não era o caso.&lt;/p&gt;
&lt;p&gt;O neon é um gás nobre incolor, abundante no universo, mas presente em pequena quantidade no ar atmosférico, ele foi descoberto pelos químicos britânicos &lt;em&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Morris_Travers&quot; target=&quot;_blank&quot;&gt;Morris Travers&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; (que eu sempre confundo com Tavares) e &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/William_Ramsay&quot; target=&quot;_blank&quot;&gt;William Ramsay&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; no século 19, os mesmos que descobriram o gás xenônio e o criptônio;  que apesar do nome &lt;a href=&quot;http://en.wikipedia.org/wiki/Krypton&quot; target=&quot;_blank&quot;&gt;krypton&lt;/a&gt; nada tem a ver com a saga de Kal-EL.&lt;/p&gt;
&lt;p&gt;Segundo gás nobre mais leve, com um alto poder de refrigeração, 40 vezes maior que do hélio líquido e três vezes maior que o hidrogênio líquido, ele &lt;strong&gt;não está presente no light-stick&lt;/strong&gt;&lt;strong&gt;!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A tradução de ligh-stick é &amp;#8220;bastão luminoso&amp;#8221;, mas sei lá por que cargas d&amp;#8217;água (talvez pela mesma razão que vulgarizaram a expressão francesa &lt;em&gt;&lt;strong&gt;à volonté&lt;/strong&gt;&lt;/em&gt; para &lt;strong&gt;&lt;em&gt; à la vonté&lt;/em&gt;&lt;/strong&gt;) o mercado abrasileirou  o nome para bastão de neon ou pulseira de neon,  devido a sutil semelhança com as lâmpadas de neon, porém não é o gás nobre o responsável pela fonte de energia luminosa deste artefato, mas sim uma reação que ocorre com o &lt;a href=&quot;http://en.wikipedia.org/wiki/Cyalume&quot; target=&quot;_blank&quot;&gt;cyalume&lt;/a&gt; (que está no bastão) similar e mais barato que ao &lt;a href=&quot;http://en.wikipedia.org/wiki/Luminol&quot; target=&quot;_blank&quot;&gt;luminol&lt;/a&gt;. No caso do luminol, ele reage com cobre e ferro, e como há ferro na hemoglobina, o luminol é vastamente empregado por equipes de investigação forense (como de CSI) para investigações criminais.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/luminol.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-191&quot; title=&quot;Luminol&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/luminol.jpg?w=300&amp;h=225&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O que presenciamos no &lt;em&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt;ligh-tstick&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt; &lt;/a&gt;(e nas cenas de CSI quando eles encontram sangue em algum local ou objeto) é o efeito conhecido como &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot;&gt;luminescência&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot;&gt; &lt;/a&gt;(nome com origem no latim &amp;#8220;lumem&amp;#8221;) que é a emissão de luz através por estímulo de radiação ionizante, luz ou reação  onde uma energia química  é transformada em energia luminosa. Na realidade quando o efeito é obtido através de algum composto químico sintético, como no caso do light-stick, ele é chamado de &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Chemoluminescence&quot; target=&quot;_blank&quot;&gt;quimiluminescência&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Chemoluminescence&quot; target=&quot;_blank&quot;&gt; &lt;/a&gt;e, apesar de não ser o caso, se fosse produzido por um organismo vivo ele seria chamado de &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bioluminescence&quot; target=&quot;_blank&quot;&gt;bioluminescência&lt;/a&gt; &lt;span&gt;sendo-se que há vários outros tipos de &lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot; target=&quot;_blank&quot;&gt;luminescência&lt;/a&gt;.&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Voltando ao bastão.&lt;/p&gt;
&lt;p&gt;No caso deste, normalmente há um solução de cyalume com uma ampola de vidro contendo uma solução de peróxido de hidrogênio (água oxigenada  35%) e quando o bastão é dobrado a ampola é quebrada, as soluções são misturadas o luminol começa a ser oxigenado e a &lt;em&gt;quimiluminescência&lt;/em&gt; começa a ocorrer e fazer a alegria da galera. A duração do efeito depende da  temperatura do local, sendo-se que temperaturas baixas são mais propícias  para sua durabilidade, portanto colocar a pulseira na geladeira tende a prologar o efeito mas ele não se eternizará ou fará a efeito ocorrer novamente.&lt;/p&gt;
&lt;p&gt;Vale lembrar que apesar de ser um efeito estudado a centenas de anos, com grandes evoluções no último século, este é um fenômeno não totalmente compreendido plenamente ainda sendo alvo de estudos e pesquisas.&lt;/p&gt;
&lt;p&gt;No caso da &lt;a href=&quot;http://en.wikipedia.org/wiki/Bioluminescence&quot; target=&quot;_blank&quot;&gt;bioluminescência&lt;/a&gt;, normalmente o substrato de uma proteína&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/bathocyroe_fosteri1.jpg&quot;&gt;&lt;img class=&quot;alignright size-thumbnail wp-image-193&quot; title=&quot;Bathocyroe_fosteri&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/bathocyroe_fosteri1.jpg?w=150&amp;h=138&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;138&quot; /&gt;&lt;/a&gt; denominada &lt;a href=&quot;http://pt.wikipedia.org/wiki/Luciferina&quot; target=&quot;_blank&quot;&gt;luciferina&lt;/a&gt; (nome com origem no latim &amp;#8220;lucifer&amp;#8221; que significa &amp;#8220;que ilumina&amp;#8221;) é oxidada por uma enzima, denominada &lt;a href=&quot;http://en.wikipedia.org/wiki/Luciferase&quot; target=&quot;_blank&quot;&gt;luciferase&lt;/a&gt;. Nesta reação há o consumo de uma molécula de &lt;a href=&quot;http://en.wikipedia.org/wiki/Luciferase&quot; target=&quot;_blank&quot;&gt;trifosfato de adenosina&lt;/a&gt; (ATP) que excita energéticamente a luciferina e proporciona a geração de energia luminosa através da liberação da energia química.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;A luminescência tem atraído o interesse do homem desde o princípio de sua existência, visto que do Pernambuco à China, os primeiros registros e pirilampos, fenômeno que Aristóteles (384 &amp;#8211; 322 A.C)  descreveu como &amp;#8220;luz&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/panellusstipticusaug12_2009_animated.gif&quot;&gt;&lt;img class=&quot;alignright size-thumbnail wp-image-195&quot; title=&quot;PanellusStipticusAug12_2009_Animated&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/panellusstipticusaug12_2009_animated.gif?w=150&amp;h=102&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;102&quot; /&gt;&lt;/a&gt; fria&amp;#8221;. Em 1669, o médico H. Brandt criou a “phosphorus mirabilis”, que era uma reação que utiliza uma propriedade do fósforo quando exposto ao oxigênio do ar em certas circunstâncias e por esta reação ele obtia a &amp;#8220;quimiluminescência&amp;#8221; (termo que fui criado 200 anos depois),  mas  Brandt que era um alquimista na época não compreendia exatamente o que ele estava fazendo, apenas o que ele estava conseguindo; o fascínio das pessoas para quem ele apresentava seu experimento alquimista.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Talvez seja este fascínio (o a intenção de fascinar) que fez James Cameron&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignright&quot; title=&quot;Jack Sullivan rodeado de Woodsprites&quot; src=&quot;http://4.bp.blogspot.com/_h3jgTAdJYWQ/S0JVAtX5gTI/AAAAAAAAAOM/Azt1gV8yi4o/s400/avatar-001.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;240&quot; /&gt;inserir na história de Avatar,  a luminescência e a bioluminescência em Pandora como uma propriedade de todo organismo deste planeta, dos animais aos pequenes Woodsprites, as sementes de Utraya &amp;#8220;Mokri&amp;#8221;, e a Árvore das Almas, com propriedades místicas.&lt;/p&gt;
&lt;p&gt;Quando meu tio Zé perguntou-me sobre o bastão de luz, a pouco eu estava lembrando da carinha de alegria de minhas sobrinhas ao brincar com os bastões de luz, sobre o fascínio da luminescência na humanidade e sobre o belo efeito que James Cameron conseguiu com Avatar, portanto nem preciso dizer o quanto achei oportuno a pergunta dele; porém confesso que na hora puxei um pouco o freio de mão e não externei toda minha viagem.&lt;/p&gt;
&lt;p&gt;E por falar em viagem e para finalizar, vejam só o que este maluco fez com um bocado destes bastões:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://techberto.wordpress.com/2010/01/25/luminescencia-meu-tio-jose-e-avatar/&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/l69Vi5IDc0g/2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Alerta, Cyalume é tóxico e além disto como comentei acima, há vidro nos bastões, portanto não façam isto em casa!&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Namastê!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=190&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-09-03T21:20:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">F# talk for .NET Architects Group</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!266.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!266</id>
		<updated>2010-01-25T17:51:46+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Last week, &lt;a href=&quot;http://en.wikipedia.org/wiki/January_16&quot;&gt;16th January&lt;/a&gt; to be precise, I gave another talk about my &lt;u&gt;second&lt;/u&gt; favorite programming language: &lt;strong&gt;&lt;font size=&quot;4&quot;&gt;F#&lt;/font&gt;&lt;/strong&gt;.&lt;/div&gt;
&lt;div&gt;This event was managed by &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;.NET Architects Group&lt;/a&gt;, a .NET brazilian discussion group. The organization was excellent and impeccable!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://auulma.bay.livefilestore.com/y1mvqqPMifPUVX4cgnX_MpPhXDh3KkIZU0pciyaWC4wPVmwQvepVg8EH0_hNABSPEjVThCs4Xt_nbdD3_-yrKbsebZ7T5h5rc0siwnE4ze4WCOn5STaEowpB8P6p3-s77LIeCcxDY6DqkUR_PioV2P81w/FsharpTalk.png&quot; rel=&quot;wlpp;url=https://auulma.bay.livefilestore.com/y1mvqqpmifpuvx4cgnx_mpphxdh3kkizu0pciyawc4wpvmwqvepvg8eh0_hnabspejvthcs4xt_nbdd3_-yrkbsebz7t5h5rc0siwne4ze4wcon5staeowpb8p6p3-s77lieccxdy6dqkur_piov2p81w/fsharptalk.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://auulma.bay.livefilestore.com/y1mvqqPMifPUVX4cgnX_MpPhXDh3KkIZU0pciyaWC4wPVmwQvepVg8EH0_hNABSPEjVThCs4Xt_nbdD3_-yrKbsebZ7T5h5rc0siwnE4ze4WCOn5STaEowpB8P6p3-s77LIeCcxDY6DqkUR_PioV2P81w/FsharpTalk.png&quot; width=&quot;650&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;As you know, every post of this blog has a piece of code. Below, we have a sample to host a REST WCF Service with F# without using a configuration file to define bindings.&lt;/div&gt;
&lt;div&gt; &lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#r&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;System.ServiceModel.dll&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#r&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;System.ServiceModel.Web.dll&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#r&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot; size=&quot;1&quot;&gt;&amp;quot;System.Runtime.Serialization&amp;quot;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.ServiceModel&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.ServiceModel.Web&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.Runtime.Serialization&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; System.ServiceModel.Description&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;[&amp;lt;ServiceContract&amp;gt;]&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;type&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; IMyService = &lt;/font&gt;&lt;br /&gt;    [&amp;lt;OperationContract&amp;gt;]&lt;br /&gt;    [&amp;lt;WebGet(ResponseFormat=WebMessageFormat.Xml)&amp;gt;]&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    abstract&lt;/font&gt;&lt;/font&gt; Ping : value:int &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt; string&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;//http://localhost:8081/svc/Ping?value=42&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;type&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; MyService =&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    interface&lt;/font&gt;&lt;/font&gt; IMyService &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;with&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        member&lt;/font&gt;&lt;/font&gt; this.Ping ( value ) = printfn &lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;%d&amp;quot;&lt;/font&gt;&lt;/font&gt; value; string value&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; svc = &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ServiceHost( typeof&amp;lt;MyService&amp;gt;, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; Uri( &lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;http://localhost:8081/svc&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ) )&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; metadata = &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; ServiceMetadataBehavior( HttpGetEnabled = &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;true&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; )&lt;/font&gt;&lt;br /&gt;svc.Description.Behaviors.Add( metadata )&lt;br /&gt;svc.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), &lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;mex&amp;quot;&lt;/font&gt;&lt;/font&gt; )&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; binding = &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; WebHttpBinding()&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; endpoint = svc.AddServiceEndpoint( typeof&amp;lt;IMyService&amp;gt;, binding, String.Empty )&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; behavior = &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; WebHttpBehavior()&lt;/font&gt;&lt;br /&gt;endpoint.Behaviors.Add( behavior )&lt;br /&gt;&lt;br /&gt;svc.Open()&lt;br /&gt;&lt;br /&gt;printfn &lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;Host is running...&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;Console.ReadLine()&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;br /&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;The slide-deck, scripts and program samples (not) showed there are available from here: &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/FSharp [www^_dotnetarchitects^_net] Talk/FSharp Talk.zip&quot;&gt;FSharp Talk Samples&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;em&gt;&lt;strong&gt;Editpat - the transparent notepad and post-it tool will be released in another occasion.&lt;/strong&gt;&lt;/em&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I'd like to express my gratitude to all  the attendees, both on-site or online. You were all great!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;</content>
		<author>
			<name>Fábio Galuppo</name>
			<uri>http://fabiogaluppo.spaces.live.com/</uri>
		</author>
		<source>
			<title type="html">The House of Software Engineer</title>
			<link rel="self" href="http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/Main?$format=rss20"/>
			<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/-5300274535508806924</id>
			<updated>2010-09-03T21:20:11+00:00</updated>
		</source>
	</entry>

</feed>
