<?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>2009-07-04T04:00:15+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">- FISL10</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/GuKwSMvaQp4/"/>
		<id>http://blog.jorgepereira.com.br/?p=829</id>
		<updated>2009-07-02T02:49:28+00:00</updated>
		<content type="html">&lt;p&gt;Depois de tantos anos tentando me programar para ir ao FISL e sempre surgindo imprevistos, consegui graças a minha &lt;a href=&quot;http://www.krix.com.br&quot; target=&quot;_blank&quot;&gt;namorada&lt;/a&gt; que deu a idéia e incentivou bastante para que fossemos ao FISL10 e consequentemente conhecer a cidade de Porto Alegre! Compramos passagens e reservamos hotel desde de Janeiro, sendo um dos fatores que fez nos economizarmos um trocado!  Abaixo segue um resumo de como foi está experiência!! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;div id=&quot;attachment_830&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-830&quot; title=&quot;FISL 10&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/fisl10banner1.png&quot; alt=&quot;FISL 10&quot; width=&quot;357&quot; height=&quot;256&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;.:: FISL 10 ::.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&amp;lt;aviso&amp;gt;&lt;/strong&gt;Este POST com certeza foi o mais pesado que escrevi até o dia de hoje! talvez demore para carregar&amp;#8230; &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;strong&gt;&amp;lt;/aviso&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# Day0&lt;/strong&gt;: Depois de sair de Recife ás 03:15am fazendo escala em são paulo, chegando em POA ás 09:30am!&lt;/p&gt;
&lt;div id=&quot;attachment_801&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-801&quot; title=&quot;Day0: Nosso amigo Moisés beniGNU tirando um cochilo e roncando feito um URSO no voo para POA...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00744.JPG&quot; alt=&quot;Day0: Nosso amigo Moisés beniGNU tirando um cochilo e roncando feito um URSO no voo para POA...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day0: Logo no aeroporto em Recife encontrei o parceiro &amp;quot;Moisés beniGNU&amp;quot;, perceba na foto acima que ele estava meditando na cadeira ao lado durante todo trajeto...&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_803&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-803&quot; title=&quot;Day0: Eita que chato, eu e minha gata recem chegados em POA...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00808.JPG&quot; alt=&quot;Day0: Eita que chato, eu e minha gata recem chegados em POA...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day0: Assim que chegamos na cidade fomos direto para a PUC, antes no caminho uma parada para foto!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_804&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-804&quot; title=&quot;Day0: Direto para a PUC reservar o estande para o GNOME Brasil...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00833.JPG&quot; alt=&quot;Day0: Direto para a PUC reservar o estande para o GNOME Brasil...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day0: Direto para a PUC pegar as credenciais e escolher um estande para o GNOME-BR.&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_805&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-805&quot; title=&quot;Day0: Marcando o estande que consegui no melhor angulo para o GNOME Brasil..&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00842.JPG&quot; alt=&quot;Day0: Marcando o estande que consegui no melhor angulo para o GNOME Brasil..&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day0: Marcando o estande que consegui no melhor ponto possível!&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt; Day1:&lt;/strong&gt; (24/06) Acordamos cedo no primeiro dia de evento, e fomos direto para a PUC! Muita adrenalina e animação para rever e trocar idéia com os amigos e ainda fui conferir a palestra do &lt;a href=&quot;http://rsalveti.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Ricardo Salveti&lt;/a&gt; sobre &lt;em&gt;&amp;#8220;Desenvolvimento embarcado com Open Embedded e Mamona&amp;#8221;&lt;/em&gt;.&lt;a href=&quot;http://fisl.softwarelivre.org/10/papers/pub/programacao/468&quot;&gt; &lt;/a&gt;&lt;/p&gt;
&lt;div id=&quot;attachment_808&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-808&quot; title=&quot;Day1: Eu e wendell logo cedo no estande...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00891.JPG&quot; alt=&quot;Day1: Eu e wendell logo cedo no estande...&quot; width=&quot;400&quot; height=&quot;533&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day1: Eu e Wendell logo cedo no estande... qualquer semelhança da foto do Wendell com o personagem &amp;quot;Bender&amp;quot; do seriado &amp;quot;Futurama&amp;quot; e pura Coincidência! &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;/div&gt;
&lt;div id=&quot;attachment_807&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-807&quot; title=&quot;Day1: Foto clichê com Jon &quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day1: Foto clichê com Jon &amp;quot;MadDog&amp;quot; Hall...&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_810&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-810&quot; title=&quot;Day1: Grande figura, Lucas Brasilino! Este e mito quando o assunto e Linux...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00906.JPG&quot; alt=&quot;Day1: Grande figura, Lucas Brasilino! Este e mito quando o assunto e Linux...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day1: Grande figura, Lucas Brasilino!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_852&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-852&quot; title=&quot;Day1: Os amigos de Recife marcando presença no FISL (Pedro + Wesley &quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day1: Os amigos de Recife marcando presença no FISL (Pedro + Wesley &amp;quot;Tarado do VOIP&amp;quot; + Dailson &amp;quot;Fofão&amp;quot; + Moisés beniGNU + Eu), Jantar com um Bom vinho para fechar a noite! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_811&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-811&quot; title=&quot;Day1: Final do dia, uma taça de vinho com os amigos para relaxar...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00921.JPG&quot; alt=&quot;Day1: Final do dia, uma taça de vinho com os amigos para relaxar...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day1: Fechando a noite em um jantar com os amigos e um bom vinho!&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Day2:&lt;/strong&gt; (25/06) Começamos o dia com agitação logo cedo!&lt;/p&gt;
&lt;div id=&quot;attachment_813&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-813&quot; title=&quot;Day2: Na ida para o FISL nos deparamos com uma manifestação na frente da prefeitura de POA, e então fomos lá da uma força ao pessoal...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00960.JPG&quot; alt=&quot;Day2: Na ida para o FISL nos deparamos com uma manifestação na frente da prefeitura de POA, e então fomos lá da uma força ao pessoal...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day2: Na ida para o FISL nos deparamos com uma manifestação na frente da prefeitura de POA, e então fomos lá da uma força ao pessoal...&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_814&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-814&quot; title=&quot;Day2: Comprando alguns vinhos para esquentar... já que o frio estava demais!!&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00963.JPG&quot; alt=&quot;Day2: Comprando alguns vinhos para esquentar... já que o frio estava demais!!&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day2: Comprando alguns vinhos para esquentar... já que o frio estava demais!!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_815&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-815&quot; title=&quot;Day2: Eu e minha gata na frente da PUC diante banner gigante do evento...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00979.JPG&quot; alt=&quot;Day2: Eu e minha gata na frente da PUC diante banner gigante do evento...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day2: Eu e minha gata na frente da PUC diante banner gigante do evento...&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt; Day3:&lt;/strong&gt; (26/06) Um dos dias mais corridos, muito Hacking relacionado ao GNOME, inclusive apresentação falando sobre a evolução e participação relacionadas ao GNOME! Foi apresentada por &lt;a href=&quot;http://www.bani.com.br/&quot; target=&quot;_blank&quot;&gt;Jonh Wendell&lt;/a&gt;, &lt;a href=&quot;http://kov.eti.br/&quot; target=&quot;_blank&quot;&gt;Gustavo Noronha (kov)&lt;/a&gt; e o Júlio Cesar! Foi bem divertida inclusive em relação as discussões que rolaram durante apresentação! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;div id=&quot;attachment_816&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-816&quot; title=&quot;Day3: Eu e Wendell discutindo sobre melhor forma para implementação do esquema de plugins para o VINAGRE...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC00994.JPG&quot; alt=&quot;Day3: Eu e Wendell discutindo sobre melhor forma para implementação do esquema de plugins para o VINAGRE...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day3: Eu e Wendell discutindo sobre melhor forma para implementação do esquema de plugins para o VINAGRE... Breve um post sobre o assunto! Como diria o Stallman, Happy Hacking&amp;quot;  &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_817&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-817&quot; title=&quot;Day3: Que maravilha, esquentando a alma diante a lareira lá na churrascaria CTG...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01060.JPG&quot; alt=&quot;Day3: Que maravilha, esquentando a alma diante a lareira lá na churrascaria CTG...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day3: Que maravilha, esquentando a alma diante a lareira lá na churrascaria CTG...&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_819&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-819&quot; title=&quot;Day3: Eu e minha Gatona... Um choppzinho né? ninguem e de ferro...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01066.JPG&quot; alt=&quot;Day3: Eu e minha Gatona... Um choppzinho né? ninguem e de ferro...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day3: Eu e minha Gatona... Um choppzinho para refrescar o calor de +6 graus! Ninguém e de ferro...&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Day4: &lt;/strong&gt;(27/06) Muito frio como sempre, muito discussão, e fui conferir duas palestras. A primeira foi do &lt;a href=&quot;http://franciscoalecrim.com/&quot; target=&quot;_blank&quot;&gt;Francisco Alecrim&lt;/a&gt; que falou sobre desenvolvimento para as placas &lt;a href=&quot;http://en.wikipedia.org/wiki/Beagle_Board&quot; target=&quot;_blank&quot;&gt;Beagle Board&lt;/a&gt;, sem sombra de dúvidas a palestra foi excelente, Mais informações no &lt;a href=&quot;http://franciscoalecrim.com/blog/2009/07/02/fisl10-material-fotos-comentarios-e-agradecimentos/&quot; target=&quot;_blank&quot;&gt;blog dele&lt;/a&gt; e a segunda foi do &lt;a href=&quot;http://kov.eti.br/&quot; target=&quot;_blank&quot;&gt;Gustavo Noronha (kov)&lt;/a&gt; falando sobre &lt;em&gt;&amp;#8220;WebKitGTK+ &amp;#8211; O Que é e como usar&amp;#8221;&lt;/em&gt;, foi com certeza uma das palestras mais técnicas que teve no FISL!&lt;/p&gt;
&lt;div id=&quot;attachment_820&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-820&quot; title=&quot;Day4: Eu e o Vinicius diante uma reliquia... um belissimo K82-C...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01235.JPG&quot; alt=&quot;Day4: Eu e o Vinicius diante uma reliquia... um belissimo K82-C...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day4: Eu e o Vinícius diante uma relíquia... um belíssimo K82-C contendo 2k de espaço!!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_822&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-822&quot; title=&quot;Day4: Vinicius + Eu + Krix + Wendell + Thiago (T-Rex) + Luciana + Pequeno Gustavo&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01255.JPG&quot; alt=&quot;Day4: Vinicius + Eu + Krix + Wendell + Thiago (T-Rex) + Luciana + Pequeno Gustavo&quot; width=&quot;400&quot; height=&quot;533&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day4: Vinícius + Eu + Krix + Wendell + Tiago (T-Rex) + Luciana + Pequeno Gustavo&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_821&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://www.clicrbs.com.br/blog/jsp/default.jsp?source=DYNAMIC,blog.BlogDataServer,getBlog&amp;pg=1&amp;template=3948.dwt&amp;section=Blogs&amp;tipo=1&amp;coldir=1&amp;uf=1&amp;local=1&amp;blog=222&amp;post=196705&amp;siteId=552&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;size-full wp-image-821&quot; title=&quot;Day4: Eita, eu na midia... haha!&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01241.JPG&quot; alt=&quot;Day4: Eita, eu na midia... haha!&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day4: Eita, eu na mídia... haha! no quarto dia do evento a &amp;quot;Vanessa Nunes&amp;quot; passou lá e me chamou para participar de uma matéria que ela estava escrevendo sobre a cara dos laptops de alguns participantes! Clique na foto para ver a matéria!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_823&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-823&quot; title=&quot;Day5: Último dia de FISL... nós na saida do prédio diante &quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01281.JPG&quot; alt=&quot;Day5: Último dia de FISL... nós na saida do prédio diante &quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day4: Último dia de FISL... nós na saída do prédio diante o banner principal de entrada!&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt; Day5:&lt;/strong&gt; (28/06) Este foi o dia que eu e &lt;a href=&quot;http://www.krix.com.br/&quot; target=&quot;_blank&quot;&gt;Krix&lt;/a&gt; tiramos para passear e conhecer um pouco mais da cidade, Com certeza e a melhor forma de conhecer o Guaíba e o Delta do Jacuí são os passeios com os barcos Cisne Branco, com saída no Portão Central do Cais do Porto! Vale realmente a pena! &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;div id=&quot;attachment_826&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-826&quot; title=&quot;Day6: Eu e minha gata fechando com chave de ouro o passeio em POA com um jantazinho e caneca de vinho!!&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01453.JPG&quot; alt=&quot;Day6: Eu e minha gata fechando com chave de ouro o passeio em POA com um jantazinho e caneca de vinho!!&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day5: Eu e minha gata fechando com chave de ouro o passeio em POA com um jantarzinho acompanhado de uma boa caneca de vinho!!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_827&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-827&quot; title=&quot;Day6: Eu e minha gata passeiozinho de barca...  A melhor forma de conhecer o Guaíba e o Delta do Jacuí são os passeios com os barcos Cisne Branco, com saída no Portão Central do Cais do Porto&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01552.JPG&quot; alt=&quot;Day6: Eu e minha gata passeiozinho de barca...  A melhor forma de conhecer o Guaíba e o Delta do Jacuí são os passeios com os barcos Cisne Branco, com saída no Portão Central do Cais do Porto&quot; width=&quot;300&quot; height=&quot;400&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day5: Eu e ela! &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;/div&gt;
&lt;div id=&quot;attachment_828&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-828&quot; title=&quot;Day6: Eu e minha gata passeiozinho de barca...  A melhor forma de conhecer o Guaíba e o Delta do Jacuí são os passeios com os barcos Cisne Branco, com saída no Portão Central do Cais do Porto&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/07/DSC01653.JPG&quot; alt=&quot;Day6: Eu e minha gata passeiozinho de barca...  A melhor forma de conhecer o Guaíba e o Delta do Jacuí são os passeios com os barcos Cisne Branco, com saída no Portão Central do Cais do Porto&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Day5: Foto tipo cartão postal! &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;/div&gt;
&lt;p&gt;&lt;strong&gt;Considerações sobre o FISL!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O FISL e um evento que você encontra de tudo! Hackers por todos os lados, GNOMER&amp;#8217;s, Ubuntusers, Slackwazeros, Debianzeros, PHPZeros, CZeros entre a mais vasta especie que você possa imaginar!&lt;/li&gt;
&lt;li&gt;A estrutura da PUC sem sombra de dúvidas e muito boa, porém para o nível que o FISL é deixou a desejar em muitas coisas dentre elas a má sinalização no campus, péssima qualidade da internet e sinal wi-fi!&lt;/li&gt;
&lt;li&gt;Grande oportunidade para rever e conhecer os amigos que  você só conhece por Email/IRC além de reforçar em MUITO o Networking!&lt;/li&gt;
&lt;li&gt;Conforme o &lt;a href=&quot;http://ubuntuser.com.br/blog/?p=216&quot; target=&quot;_blank&quot;&gt;Fábio citou neste post&lt;/a&gt;, e incrível o quanto o Ubuntu impera nos Desktops!&lt;/li&gt;
&lt;li&gt;Sobre a visita de Lula no evento? Eu prefiro não comentar NADA sobre o assunto!&lt;/li&gt;
&lt;li&gt;Mais fotos que tiramos podem ser visto no &lt;a href=&quot;http://www.flickr.com/photos/krixapolinario/tags/fisl10/&quot; target=&quot;_blank&quot;&gt;Flickr de Krix aqui!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Richard_Stallman&quot; target=&quot;_blank&quot;&gt;Richard Stallman&lt;/a&gt; dançando &lt;em&gt;breaking&lt;/em&gt;, tem noção da cena? &lt;a href=&quot;http://www.youtube.com/watch?v=0_oFTqliqfk&quot; target=&quot;_blank&quot;&gt;veja o video aqui&lt;/a&gt; e &lt;a href=&quot;http://www.youtube.com/watch?v=zxhSrUuQy0o&quot; target=&quot;_blank&quot;&gt;aqui também&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;No vôo de volta na escala entre São Paulo e Recife veio no mesmo vôo eu, &lt;a href=&quot;http://www.krix.com.br/&quot; target=&quot;_blank&quot;&gt;Krix&lt;/a&gt; e &lt;a href=&quot;http://ursinha.net/&quot; target=&quot;_blank&quot;&gt;Ursula&lt;/a&gt; que podemos ter a companhia de uma &amp;#8220;Crente&amp;#8221; orando e agonizando durante quase todo o trajeto&amp;#8230; ou seja, ela veio &amp;#8220;enchendo o saco&amp;#8221;!&lt;/li&gt;
&lt;li&gt;Foi muito ruim ter que ficar o dia inteiro dentro de avião para chegar ao Rio de Janeiro, pois fiz os trajetos &amp;#8220;POA&amp;#8221; -&amp;gt; &amp;#8220;São Paulo&amp;#8221; -&amp;gt; &amp;#8220;Recife&amp;#8221; -&amp;gt; &amp;#8220;Rio de Janeiro&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Considerações sobre a Cidade!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Porto alegre e uma das cidades mais belas que conheci aqui no Brasil, sem sombra de dúvidas possui muitos outros cartões postais na cidade e no estado do Rio Grande do Sul!&lt;/li&gt;
&lt;li&gt;A Cidade e praticamente um &amp;#8220;Frigorifico&amp;#8221;, meu grande companheiro &lt;a href=&quot;http://www.dailson.com.br/&quot; target=&quot;_blank&quot;&gt;Dailson&lt;/a&gt; que estava hospedado no mesmo hotel gritou várias vezes durante os dias &lt;em&gt;&amp;#8220;Por favor, alguém diminuir o nível deste ar-condicionado central&amp;#8221;&lt;/em&gt;, haha! &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;/li&gt;
&lt;li&gt;O Custo de vida lá em relação a alimentação e SUPER barato em comparação a outros cantos como por exemplo Rio de Janeiro, Recife e São Paulo!&lt;/li&gt;
&lt;li&gt;Com certeza uma das melhores gastronomias do Brasil, fiquei impressionado com a qualidade das comidas que comi durante os dias de evento! Lá o povo sabe realmente temperar uma comida de verdade!&lt;/li&gt;
&lt;li&gt;Pretende visitar a cidade em época de frio? &lt;strong&gt;PREPARE-SE! VÁ BEM AGASALHADO!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nos vemos no FISL11, ate lá!&lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;http://franciscoalecrim.com/blog/2009/07/02/fisl10-material-fotos-comentarios-e-agradecimentos/CF&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/yk_PdpoOAaqOy-6nra_dKZvD5xw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/yk_PdpoOAaqOy-6nra_dKZvD5xw/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/yk_PdpoOAaqOy-6nra_dKZvD5xw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/yk_PdpoOAaqOy-6nra_dKZvD5xw/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://blog.jorgepereira.com.br/feed/"/>
			<id>http://blog.jorgepereira.com.br/feed/</id>
			<updated>2009-07-03T16:42:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">0xc0de</title>
		<link href="http://0xc0de.wordpress.com/2009/06/27/construtor-de-copia-e-operador-de-atribuicao/"/>
		<id>http://0xc0de.wordpress.com/?p=274</id>
		<updated>2009-06-27T18:30:21+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Sugestão de implementação do construtor de cópia e operador de atribuição em C++:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crie um construtor de cópia com passagem de parâmetro por referência para uma constante.&lt;/li&gt;
&lt;li&gt;Crie um operador de atribuição com passagem de parâmetro por valor e retorno por referência.&lt;/li&gt;
&lt;li&gt;Crie uma função membro de &lt;em&gt;swap&lt;/em&gt;. Idealmente, que não lance exceções.&lt;/li&gt;
&lt;li&gt;Dentro do operador de atribuição, faça a troca (&lt;em&gt;swap&lt;/em&gt;) entre o argumento construído por cópia e o objeto apontado por &lt;code&gt;this&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essa é uma solução elegante e sem redundâncias (considerando que todos os &lt;em&gt;swaps&lt;/em&gt; estejam corretamente implementados). Além disso, não depende da verificação de auto-atribuição no &lt;code&gt;operator=&lt;/code&gt;. Para detalhes relacionados a &lt;em&gt;exception-safety&lt;/em&gt;, clique &lt;a href=&quot;http://www.gotw.ca/gotw/059.htm&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;

class person
{
public:
    person(std::string name);
    person(person const&amp;amp; other); //Construtor cópia.
    person &amp;amp; operator=(person other); //Operador atribuição.

    void swap(person &amp;amp; other) throw();

private:
    std::string name_;
    unsigned short age_;
    /* ... */
};

person::person(std::string name):
  name_(name), age_(0) /* ... */
{}

person::person(person const&amp;amp; other):
  name_(other.name_), age_(other.age_) /* ... */
{}

person &amp;amp; person::operator=(person other)
{
    other.swap(*this); //Troca com a cópia recebida.
    return *this;
}

void person::swap(person &amp;amp; other) throw()
{
    name_.swap(other.name_);
    std::swap(age_, other.age_);
    /* ... */
}
&lt;/pre&gt;
&lt;p&gt;Lembre que nem sempre é necessário declarar/definir esses membros para todas as classes. O código acima visa apenas ilustrar uma forma de implementação.&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;Leandro T. C. Melo&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/274/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/274/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/274/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/274/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/274/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/274/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/274/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/274/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/274/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/274/&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=274&amp;subd=0xc0de&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&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>2009-07-03T16:42:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">bcsanches</title>
		<link href="http://bcsanches.wordpress.com/2009/06/15/mapa-do-c/"/>
		<id>http://bcsanches.wordpress.com/?p=250</id>
		<updated>2009-06-15T13:54:22+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Este semana rolou um email bem legal na lista de emails &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Comunidade&quot; target=&quot;_blank&quot;&gt;cppbrasil,&lt;/a&gt; o email continha o link para um mapa do C++ no estilo usado em mapas antigos:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_VUQ3DQEhjsM/SifYnabcQrI/AAAAAAAAAXI/ClWB5VrJNuQ/s400/cpplands1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;O post original do mapa pode ser encontrado clicando-se &lt;a href=&quot;http://alenacpp.blogspot.com/2009/06/c.html#cpplandsenglish&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;, inclusive contem opções de tamanho.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/bcsanches.wordpress.com/250/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bcsanches.wordpress.com/250/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/bcsanches.wordpress.com/250/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/bcsanches.wordpress.com/250/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/bcsanches.wordpress.com/250/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/bcsanches.wordpress.com/250/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/bcsanches.wordpress.com/250/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/bcsanches.wordpress.com/250/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/bcsanches.wordpress.com/250/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/bcsanches.wordpress.com/250/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=bcsanches.wordpress.com&amp;blog=3563426&amp;post=250&amp;subd=bcsanches&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Bruno Sanches</name>
			<uri>http://bcsanches.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Bcsanches's Weblog</title>
			<subtitle type="html">C++ e Programação de Jogos</subtitle>
			<link rel="self" href="http://bcsanches.wordpress.com/feed/"/>
			<id>http://bcsanches.wordpress.com/feed/</id>
			<updated>2009-07-03T16:38:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">- Resumo: Casa nova, Brinquedo Novo, Tatoo, …</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/w3oLJJfXuik/"/>
		<id>http://blog.jorgepereira.com.br/?p=772</id>
		<updated>2009-06-14T20:49:36+00:00</updated>
		<content type="html">&lt;p&gt;Mais de um més sem nenhum POST novo aqui no meu blog. Mais isto e justificável, pois muita coisa aconteceu e vem acontecendo nesses dois últimos meses! Irei escrever um único post envolvendo tais novidades!! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Casa Nova&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Devido a alguns imprevistos e afins surgiu a necessidade de me mudar e estou morando e trabalhando atualmente na famosa &amp;#8220;Cidade Maravilhosa&amp;#8221;, isto mesmo! Estou desde o último dia 09 de Maio morando no Rio de Janeiro!!&lt;/p&gt;
&lt;div id=&quot;attachment_775&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-775&quot; title=&quot;Copacabana, ao fundo o Pão de Açucar!&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/06/DSC00646.JPG&quot; alt=&quot;Copacabana, ao fundo o Pão de Açucar!&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Copacabana, ao fundo o Pão de Açúcar!&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_774&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-774&quot; title=&quot;Entardecer em Copacabana...&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/06/DSC00622.JPG&quot; alt=&quot;Entardecer em Copacabana...&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Entardecer em Copacabana...&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Porém não vim para cá como turista e sim para trabalhar, que por sinal trabalho não tem sido outra coisa que tenho me dedicado tanto! O Desafio de trabalhar com novas tecnologias envolvendo &lt;em&gt;&lt;strong&gt;TV Digital &amp;amp; Linux embarcado&lt;/strong&gt;&lt;/em&gt;, foi um dos maiores motivos que me fez aceitar o desafio de mudar de cidade, deixar para trás familiares, amigos, minha filhota e minha &lt;a href=&quot;http://www.krix.com.br/&quot; target=&quot;_blank&quot;&gt;girl&lt;/a&gt; linda!!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Brinquedo Novo, Guitarra &lt;em&gt;Fender Squier&lt;/em&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quando mais novo havia tido interesse para aprender a tocar violão e aprendi alguma coisa, só que depois de muito tempo com a vontade retraída em aprender a tocar Guitarra resolvi a algum tempo investir um pouco do tempo livre (tempo livre? O_o)! Consequentemente um amigo comprou uma guitarra e amplificador novo e conversando ele ficou sabendo sobre esta minha vontade desde de guri em aprender a tocar e me vendeu por um valor MUITO legal! Valeu Gustavo!  &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;div id=&quot;attachment_780&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-780&quot; title=&quot;Brinquedo Novo: Guitarra Fender Squier&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/06/DSC00685.JPG&quot; alt=&quot;No pacote veio: Guitarra Fender Squier + Alça + Palhetas + Mochila + Suporte + Amplificador Shelter (Tudo extremamente novo, a guitarra não tem nenhum arranhão e inclusive o Amplificador ainda veio com na caixa original)&quot; width=&quot;400&quot; height=&quot;533&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;No pacote veio: Guitarra Fender Squier + Alça + Palhetas + Mochila + Suporte + Amplificador Shelter (Tudo extremamente novo, a guitarra não tem nenhum arranhão e inclusive o Amplificador ainda veio na caixa original)&lt;/p&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tatoo&lt;em&gt; &lt;/em&gt;: Finalizado Braço esquerdo!&lt;br /&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Desde de novo que sempre tive atração por tatuagem, muitas pessoas recriminam e falam muito! Porém tenho apenas uma concepção que num vai ser um desenho que vai dizer algo sobre a dignidade da pessoa, pois em Brasília tem muita gente de terno-gravata roubando e sujando a imagem do país então sobre isto prefiro nem comentar! Enfim, está foi a última &lt;em&gt;sprint&lt;/em&gt; da minha tatuagem do braço esquerdo, a próxima será o meu maior projeto sobre o assunto! Será o sonho de ter desenhado nas costas a arte da capa do álbum &lt;em&gt;Powerslave&lt;/em&gt; do Iron Maiden, abaixo tem um exemplo da arte! Pretendo fazer em breve! &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;div id=&quot;attachment_782&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-782&quot; title=&quot;Tatoo: Última Sprint&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/06/DSC00609.JPG&quot; alt=&quot;Maori estilizado feito pelo mestre &quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Maori estilizado feito pelo mestre &amp;quot;Andarilho&amp;quot;&lt;/p&gt;&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Um dos principais motivos do meu real interesse pelo Iron Maiden começou primeiro pelas capas dos discos, segundo por influência de meu primo que juntamente com um amigo escutavam muitas bandas do genero entre elas era o Iron. E este com certeza e um dos melhores álbuns na minha opinião, foi o quinto álbum de estúdio da banda lançado em 3 de setembro de 1984, nesta época eu estava apenas com dois anos de idade! O álbum tem sua abertura com &amp;#8220;Aces High&amp;#8221;, uma canção sobre as lutas aéreas na Segunda Guerra Mundial. Logo depois tem &amp;#8220;Two Minutes to Midnight&amp;#8221;, composta por Adrian Smith com letras de Bruce, tratando da constante ameaça de uma guerra nuclear que pairava na época. Logo após, uma canção instrumental ao estilo egípcio do álbum, chamado &amp;#8220;Losfer Words (Big&amp;#8217; Orra)&amp;#8221;. Depois as canções &amp;#8220;Flash of the Blade&amp;#8221;, &amp;#8220;The Duellists&amp;#8221; e &amp;#8220;Back in the Village&amp;#8221;. Segue &amp;#8220;Powerslave&amp;#8221;, composta apenas por Bruce Dickinson e que trata de temas egípcios e como as pessoas podem ficar &amp;#8220;escravas do poder&amp;#8221;. Por fim, a &amp;#8220;saga&amp;#8221; &amp;#8220;Rime of the Ancient Mariner&amp;#8221;, uma longa canção de treze minutos sobre um homem amaldiçoado por uma sereia da morte. Foi escrita a partir do poema homônimo do poeta romântico inglês do século XVIII, &lt;a href=&quot;http://pt.wikipedia.org/wiki/Samuel_Taylor_Coleridge&quot; target=&quot;_blank&quot;&gt;Samuel Taylor Coleridge&lt;/a&gt;! Enfim, este será o tema de minha próxima tatoo que espero poder fazer em breve! &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;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;div id=&quot;attachment_783&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-783&quot; title=&quot;PowerSlave&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/06/ironn.jpg&quot; alt=&quot;Este e um exemplo do próxima tema de minha nova Tatoo! Up the Irons! o/&quot; width=&quot;405&quot; height=&quot;400&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Este e um exemplo do próxima tema de minha nova Tatoo! Up the Irons! o/&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Lugo0tIiyGEtkNMMmGs5byZaGQQ/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Lugo0tIiyGEtkNMMmGs5byZaGQQ/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/Lugo0tIiyGEtkNMMmGs5byZaGQQ/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Lugo0tIiyGEtkNMMmGs5byZaGQQ/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://blog.jorgepereira.com.br/feed/"/>
			<id>http://blog.jorgepereira.com.br/feed/</id>
			<updated>2009-07-03T16:42:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Combination Tree</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!206.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!206</id>
		<updated>2009-06-10T20:49:51+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This sample generates a set of combined numbers. These numbers are grouped inside a tree structure, which I called combination tree. &lt;/div&gt;
&lt;div&gt;It was built with Visual C++ 2010, using C++0x features (TR1 and lambdas).&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;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;array&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;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; std::&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;array&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;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; std::get;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;memory&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;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; std::shared_ptr;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font&gt;&lt;font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;#include &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;algorithm&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;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&gt;&lt;font color=&quot;#000000&quot;&gt; std::for_each;&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;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; std::transform;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;string&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;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; std::string;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;list&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;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; std::list;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&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;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&gt;&lt;font color=&quot;#000000&quot;&gt; std::cout;&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;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; std::endl;&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;template&lt;/font&gt;&lt;/font&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;typename T, size_t N&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;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; Leaf&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;typedef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; shared_ptr&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;Leaf&amp;lt;T, N&amp;gt;&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; LeafType;&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;typedef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; shared_ptr&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;array&amp;lt;LeafType, N&amp;gt;&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; LeavesType;&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;&lt;/font&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 color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;explicit&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Leaf(&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; T&amp;amp; value) : Value(value){}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;LeavesType Leaves;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;T Value;&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;template&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;typename T, size_t N&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;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; CombinationTree&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;typedef&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;typename&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Leaf&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;T, N&amp;gt;&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;::LeavesType LeavesType;&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;typedef&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;typename&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; Leaf&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;T, N&amp;gt;&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;::LeafType LeafType;&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;explicit&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; CombinationTree() : Root_(make_Leaves()){}&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; add( &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;array&lt;/font&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;T, N&amp;gt;&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;amp; value )&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;    &lt;/font&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;( get&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;0&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;(*Root_) ) assign_Leaves( Root_, value ); &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;else&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; assign_Values( Root_, value );&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; LeavesType&amp;amp; get_Root() &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;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; Root_; }&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;LeafType make_Leaf( &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; T&amp;amp; v ) &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;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; LeafType( &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; Leaf&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;T, N&amp;gt;&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;(v) ); }&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;LeavesType make_Leaves() &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;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; LeavesType( &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;array&lt;/font&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;LeafType, N&amp;gt;&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;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; add_Leaf(LeafType&amp;amp; leaf, &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;array&lt;/font&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;T, N&amp;gt;&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;amp; value)&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;    &lt;/font&gt;auto&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;amp; leaves = leaf-&amp;gt;Leaves;&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 color=&quot;#008000&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; ( leaves.get() )&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;assign_Leaves( leaves, value );&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 color=&quot;#008000&quot;&gt;      &lt;/font&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;;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;leaves = LeavesType( &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;array&lt;/font&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;LeafType, N&amp;gt;&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;#008000&quot;&gt;    &lt;/font&gt;assign_Values( leaves, value );&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; assign_Leaves(LeavesType&amp;amp; leaves, &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;array&lt;/font&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;T, N&amp;gt;&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;amp; value)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;for_each( leaves-&amp;gt;begin(), leaves-&amp;gt;end(), [&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;this&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;amp;value](LeafType&amp;amp; l){ add_Leaf(l, value); } );&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; assign_Values(LeavesType&amp;amp; leaves, &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;array&lt;/font&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;T, N&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;amp; value) &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;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;#008000&quot;&gt;  &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;transform( value.begin(), value.end(), leaves-&amp;gt;begin(), [&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;this&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;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; T&amp;amp; v){ &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; make_Leaf(v); } );&lt;br /&gt;&lt;font color=&quot;#008000&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&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;: &lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;LeavesType Root_;&lt;br /&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;template&lt;/font&gt;&lt;/font&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;size_t N&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;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; NaiveDumpCombination&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; list&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;string&amp;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;operator&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;const&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; CombinationTree&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;string, N&amp;gt;&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;amp; tree )&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;    &lt;/font&gt;auto&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; leaves = tree.get_Root();&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;list&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;string&amp;gt;&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; combinations;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;for_each&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;( &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;leaves-&amp;gt;begin(), leaves-&amp;gt;end(), &lt;br /&gt;&lt;font color=&quot;#008000&quot;&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;this&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;, &amp;amp;combinations](shared_ptr&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;Leaf&amp;lt;string, N&amp;gt;&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; l){ GetCombinations( l, l-&amp;gt;Value, combinations ); } &lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;    &lt;/font&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; combinations;&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; GetCombinations( &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; shared_ptr&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;Leaf&amp;lt;string, N&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&amp;gt;&amp;amp; leaf, string s, list&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;string&amp;gt;&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;amp; combinations )&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#008000&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;( !leaf )&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 color=&quot;#008000&quot;&gt;      &lt;/font&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;;&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 color=&quot;#008000&quot;&gt;    &lt;/font&gt;auto&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;amp; leaves = leaf-&amp;gt;Leaves;&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 color=&quot;#008000&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; (!leaves)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;combinations.push_back( s );&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 color=&quot;#008000&quot;&gt;      &lt;/font&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;;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;for_each&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;( &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;leaves-&amp;gt;begin(), leaves-&amp;gt;end(), &lt;br /&gt;&lt;font color=&quot;#008000&quot;&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;this&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;, s, &amp;amp;combinations](shared_ptr&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;Leaf&amp;lt;string, N&amp;gt;&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; l)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;{ &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;        &lt;/font&gt;GetCombinations( l, s + &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&gt;&lt;font size=&quot;1&quot;&gt; + l-&amp;gt;Value, combinations );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&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 color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;int&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; main()&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;  //combinations with repetition&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;  &lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;NaiveDumpCombination&amp;lt;5&amp;gt; dump;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;CombinationTree&amp;lt;string, 5&amp;gt; tree;&lt;/font&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;array&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;lt;string, 5&amp;gt; a = {&lt;/font&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;quot;1&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;,&lt;/font&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;quot;2&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;,&lt;/font&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;quot;3&amp;quot;&lt;/font&gt;&lt;/font&gt;&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;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;4&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;,&lt;/font&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;quot;5&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;font color=&quot;#002060&quot;&gt;}; &lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;tree.add(a);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;tree.add(a);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;tree.add(a);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;tree.add(a);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;tree.add(a);&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 color=&quot;#008000&quot;&gt;  &lt;/font&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;auto&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#002060&quot;&gt;&lt;font size=&quot;1&quot;&gt;&amp;amp; &lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt;combination = dump( tree );&lt;br /&gt;  for_each( combination.begin(), combination.end(), [](string s){ cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl; } );&lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot; size=&quot;2&quot;&gt;&lt;font color=&quot;#008000&quot; size=&quot;2&quot;&gt;&lt;font color=&quot;#008000&quot; size=&quot;2&quot;&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">visual_boost_02</title>
		<link href="http://bcsanches.wordpress.com/2009/06/03/compilando-a-boost-no-visual-2009/"/>
		<id>http://bcsanches.wordpress.com/?p=232</id>
		<updated>2009-06-03T15:31:02+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;O primeiro post do blog foi exatamente este, e não querendo já parecer sessão da tarde e começar a repetir tudo de novo estou re-fazendo o post.&lt;/p&gt;
&lt;p&gt;O post original é bem incompleto em vários aspectos, e ao invés de atualizar ele decidi fazer um completamente novo aproveitando que estou configurando uma maquina de build.&lt;/p&gt;
&lt;p&gt;Outra vantagem deste artigo é que indo direto a seção “Configurando o Visual”, as informações ali contidas servem para a maioria das bibliotecas de C/C++.&lt;/p&gt;
&lt;h3&gt;Baixando a Boost&lt;/h3&gt;
&lt;p&gt;Esta é a etapa mais simples de todas, basta acessar o site &lt;a href=&quot;http://www.boost.org&quot; target=&quot;_blank&quot;&gt;oficial,&lt;/a&gt; e clicar no link “Download” do lado direito da tela. A versão 1.39.0 (a ultima lançada até o dia que esse artigo foi publicado) pode ser baixada clicando &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=8041&amp;release_id=679861&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No meu caso utilizo a versão zip do pacote, mas todos os outros pacotes acredito que possuam o mesmo conteúdo.&lt;/p&gt;
&lt;p&gt;Após o download extraia o conteúdo dos arquivos para o diretório de bibliotecas que você costuma utilizar, no meu caso c:\develop\libs.&lt;/p&gt;
&lt;p&gt;Depois de extrair os arquivos é necessário baixar o &lt;a href=&quot;http://www.boost.org/doc/tools/jam/index.html&quot; target=&quot;_blank&quot;&gt;bjam&lt;/a&gt;, que é a ferramenta de compilação da Boost, a ultima versão pode ser encontrada clicando &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=7586&amp;package_id=72941&amp;release_id=643622&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Após concluído o download do bjam extraia o arquivo exe para o mesmo diretório em que a Boost foi colocada  (no meu caso C:\develop\libs\boost_1_39_0).&lt;/p&gt;
&lt;h3&gt;Compilando&lt;/h3&gt;
&lt;p&gt;Agora com as ferramentas prontas é necessário rodar o bjam, para tal acesse o console do Visual Studio (não o console padrão do Windows) clicando em “Iniciar” –&amp;gt; Todos os programas –&amp;gt; Microsoft Visual Studio –&amp;gt; Visual Studio Tools –&amp;gt; Visual Studio 2008 Command Prompt.&lt;/p&gt;
&lt;p&gt;Com o console aberto abra o diretório da Boost (no meu caso digito: cd \develop\libs\boost_1_39_0). Dentro do diretório da boost digite “bjam” e ENTER.&lt;/p&gt;
&lt;p&gt;Agora como já diz o programa, paciência…&lt;/p&gt;
&lt;p&gt;Se tudo correu bem, muitos minutos depois a compilação deve estar completa, as vezes aparecem alguns warnings, que eu simplesmente ignoro.&lt;/p&gt;
&lt;h3&gt;Configurando o Visual&lt;/h3&gt;
&lt;p&gt;O jeito mais pratico de configurar o visual na minha opinião é criando uma variável de ambiente que contenha o diretório da Boost, fica mais pratico na hora de atualizar as versões (se não quiser criar a variável, basta ir para o próximo paragrafo), então primeiramente clique em “Iniciar” –&amp;gt; Botão direito em “Meu Computador” –&amp;gt; Propriedades.  Na janela que se abrir, clique em “Avançado”, depois no botão “Variáveis de Ambiente”. Na caixa “Variáveis do Sistema”, clique em “Novo”. Agora entre com o nome (ex: BOOST_HOME), e o valor, que é o diretório onde a boost foi instalada (c:\develop\libs\boost_1_39_0 no meu caso), agora é ir clicando em Ok até fechar tudo.&lt;/p&gt;
&lt;p&gt;O próximo passo é abrir o visual (se o seu visual já estava aberto e você criou a variável, feche ele e abra novamente). Dentro do visual acesse “Tools” –&amp;gt; “Options”, expanda a linha “Projects and Solutions” –&amp;gt; “VC++ Directories”.&lt;/p&gt;
&lt;p&gt;Com a janela de configuração de diretórios podemos configurar os diretórios utilizados pelo visual durante builds, o primeiro a ser configurado é o de include (a ordem não importa aqui), então do lado direito, na caixa de seleção “Show directories for”, selecione “Include Files”. Basta clicar na primeira linha vazia após o ultimo item e entrar com o diretório, que no meu caso foi: $(BOOST_HOME). Caso eu não tivesse criado a variável, o valor teria sido: c:\develop\libs\boost_1_39_0.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://bcsanches.files.wordpress.com/2009/06/visual_boost_01.jpg&quot;&gt;&lt;img title=&quot;Configurando diretórios de include&quot; src=&quot;http://bcsanches.files.wordpress.com/2009/06/visual_boost_01_thumb.jpg?w=425&amp;h=250&quot; border=&quot;0&quot; alt=&quot;Configurando diretórios de include&quot; width=&quot;425&quot; height=&quot;250&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Por fim é necessário configurar o diretório de bibliotecas selecionando “Libraries Files” na caixa “Show Directories for” e entrando com o diretório das libs, que no meu caso foi: $(BOOST_HOME)\stage\lib, se não estiver usando a variável, basta então: c:\develop\libs\boost_1_39_0\stage\lib, note que o diretório varia de acordo com o diretório que foi usado na instalação, mas o principal é o sub-diretório “stage\lib”.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://bcsanches.files.wordpress.com/2009/06/visual_boost_02.jpg&quot;&gt;&lt;img title=&quot;visual_boost_02&quot; src=&quot;http://bcsanches.files.wordpress.com/2009/06/visual_boost_02_thumb.jpg?w=440&amp;h=258&quot; border=&quot;0&quot; alt=&quot;visual_boost_02&quot; width=&quot;440&quot; height=&quot;258&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tendo inserido os diretórios, clique em Ok para salvar.&lt;/p&gt;
&lt;h3&gt;Testando a Instalação&lt;/h3&gt;
&lt;p&gt;Para testar a instalação crie um novo projeto no Visual (se não sabe como fazer, clique &lt;a href=&quot;http://bcsanches.wordpress.com/2009/03/06/como-utilizar-o-visual-studio-c-parte-1/&quot;&gt;aqui&lt;/a&gt;) e use um código exemplo da Boost, eu utilizei o código abaixo:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;

#include&amp;lt;boost/filesystem/operations.hpp&amp;gt;
#include&amp;lt;iostream&amp;gt;

namespace bf = boost::filesystem;
int main(int, char **)
{
    bf::path p(&amp;quot;first.cpp&amp;quot;);
    if(bf::exists(p))
        std::cout&amp;lt;&amp;lt;p.leaf()&amp;lt;&amp;lt;&amp;quot;exists.\n&amp;quot;;
    else
        std::cout&amp;lt;&amp;lt;p.leaf()&amp;lt;&amp;lt; &amp;quot;does not exist.\n&amp;quot;;

    return 0;
}
&lt;/pre&gt;
&lt;p&gt;O código compilou sem problemas aqui e executou perfeitamente, sendo assim, instalação concluída.&lt;/p&gt;
&lt;p&gt;Note que a Boost automaticamente já linka o código com as bibliotecas necessárias, com algumas bibliotecas é necessário configurar o arquivo lib a ser usado, mas isso fica para outro post.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/bcsanches.wordpress.com/232/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bcsanches.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/bcsanches.wordpress.com/232/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/bcsanches.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/bcsanches.wordpress.com/232/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/bcsanches.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/bcsanches.wordpress.com/232/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/bcsanches.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/bcsanches.wordpress.com/232/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/bcsanches.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=bcsanches.wordpress.com&amp;blog=3563426&amp;post=232&amp;subd=bcsanches&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Bruno Sanches</name>
			<uri>http://bcsanches.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Bcsanches's Weblog</title>
			<subtitle type="html">C++ e Programação de Jogos</subtitle>
			<link rel="self" href="http://bcsanches.wordpress.com/feed/"/>
			<id>http://bcsanches.wordpress.com/feed/</id>
			<updated>2009-07-03T16:38:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">0xc0de</title>
		<link href="http://0xc0de.wordpress.com/2009/05/24/cppmemory/"/>
		<id>http://0xc0de.wordpress.com/?p=245</id>
		<updated>2009-05-24T16:17:20+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Alocação de memória é assunto importante em C++. No entanto, nem todo mundo sabe exatamente como as coisas acontecem. Quantos de vocês já não viram códigos carregados de &lt;code&gt;new/delete&lt;/code&gt; em situações nas quais objetos de pilha seriam suficientes ou mais indicados?&lt;/p&gt;
&lt;p&gt;O livro &lt;a href=&quot;http://www.gotw.ca/publications/xc++.htm&quot;&gt;Exceptional C++ (Herb Sutter)&lt;/a&gt; tem vários tópicos sobre gerenciamento de memória. Inclusive, com uma tabelinha bem bacana que descreve as áreas de memória de um programa C++. O detalhe, talvez um pouco polêmico, é que é feita uma distinção entre o &lt;em&gt;heap&lt;/em&gt; e o &lt;em&gt;free store&lt;/em&gt; (espaço livre para armazenamento). Tentarei explicar.&lt;/p&gt;
&lt;p&gt;Creio que todos sabem que a alocação dinâmica é mais cara que na pilha. Ou seja, o uso do &lt;em&gt;new&lt;/em&gt; e &lt;em&gt;delete&lt;/em&gt; implica em solicitação e devolução de memória ao sistema operacional durante execução do programa. A consequência disso é um preço, em termos de eficiência, maior do que aquele de um objeto criado por valor na pilha. Obviamente, o &lt;em&gt;new&lt;/em&gt; é necessário em inúmeros casos. Mas de onde vem essa memória?&lt;/p&gt;
&lt;p&gt;Provavelmente, alguns respoderam &lt;em&gt;heap&lt;/em&gt;. Outros responderam &lt;em&gt;free store&lt;/em&gt;. Há ainda os que dizem que ambos são exatamente a mesma coisa. Então, existe um veredito?&lt;/p&gt;
&lt;p&gt;O padrão C++ não utiliza a palavra &lt;em&gt;heap&lt;/em&gt; em nenhum momento com relação à memória. Esse termo só aparece no contexto da STL com a conotação da conhecida &lt;a href=&quot;http://en.wikipedia.org/wiki/Heap_(data_structure)&quot;&gt;estrutura de dados&lt;/a&gt;. No que diz respeito a alocação dinâmica, está presente apenas o conceito de &lt;em&gt;free store&lt;/em&gt;. É de lá que vem a memória dinâmica de um &lt;code&gt;new&lt;/code&gt;. Do ponto de vista prático, porém, o &lt;em&gt;free store&lt;/em&gt; normalmente corresponde justamente ao que é chamado de &lt;em&gt;heap&lt;/em&gt; nos sistemas. Portanto, apesar de certa confusão (ou mal entendido), considero que a forma &lt;strong&gt;oficial&lt;/strong&gt; de se refereir a origem da memória obtida por &lt;code&gt;new&lt;/code&gt; seja através de &lt;em&gt;free store&lt;/em&gt;. Mas também considero totalmente aceitável que o &lt;em&gt;heap&lt;/em&gt; e o &lt;em&gt;free store&lt;/em&gt; sejam, de fato, o mesmo lugar.&lt;/p&gt;
&lt;p&gt;Uma das origens dessa confusão é que Herb Sutter menciona no livro que o &lt;em&gt;free store&lt;/em&gt; é a área de memória dinâmica utilizada por &lt;code&gt;new/delete&lt;/code&gt;. Enquanto que o &lt;em&gt;heap&lt;/em&gt; é área de memória utilizado pelas funções &lt;code&gt;malloc/free&lt;/code&gt;. Não tenho o padrão de C em minhas mãos, mas realmente gostaria de saber se ele utiliza a palavra &lt;em&gt;heap&lt;/em&gt; com o significado de área de memória. Por acaso, alguém sabe?&lt;/p&gt;
&lt;p&gt;De qualquer maneira, há uma &lt;a href=&quot;http://zamanbakshifirst.blogspot.com/2007/02/c-free-store-versus-heap.html&quot;&gt;mensagem bem esclarecedora&lt;/a&gt; na Intenet em que Bjarne Stroustrup tenta explicar por que foi feita a distinção entre &lt;em&gt;heap&lt;/em&gt; e &lt;em&gt;free store&lt;/em&gt; por Herb Sutter. De acordo com ele, a idéia era simplesmente deixar claro que uma alocação feita por &lt;code&gt;malloc&lt;/code&gt; é diferente de uma alocação feita por &lt;code&gt;new&lt;/code&gt;, o que faz sentido total.&lt;/p&gt;
&lt;p&gt;Uau&amp;#8230; Depois de toda essa discussão deixo um breve resumo da tabela de &lt;em&gt;Exceptional C++&lt;/em&gt; que descreve as 5 áreas de memória de um programa C++. A tabela detalhada também pode ser encontrada em &lt;a href=&quot;http://www.gotw.ca/gotw/009.htm&quot;&gt;GotW&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;const data&lt;/b&gt; &amp;#8211; Armazena literais de strings e outros valores &lt;em&gt;read-only&lt;/em&gt; conhecidos em tempo de compilação, os quais duram durante toda a execução do programa.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;pilha&lt;/b&gt; &amp;#8211; Área de variáveis automáticas.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;free store&lt;/b&gt; &amp;#8211; Memória dinâmica alocada/liberada por &lt;code&gt;new/delete&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;heap&lt;/b&gt; &amp;#8211; Memória dinâmica alocada/liberada por &lt;code&gt;malloc/free&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;global/static&lt;/b&gt; &amp;#8211; Armazena dados globais e estáticos, os quais são inicializados quando o programa começa a executar.&lt;/p&gt;
&lt;p&gt;Bom, espero ter sido útil.&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;Leandro T. C. Melo&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/245/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/245/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/245/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/245/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/245/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/245/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/245/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/245/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/245/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/245/&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=245&amp;subd=0xc0de&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&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>2009-07-03T16:42:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ponteiros e Arrays</title>
		<link href="http://blog.blabos.org/2009/05/ponteiros-e-arrays/"/>
		<id>http://blog.blabos.org/?p=624</id>
		<updated>2009-05-18T09:08:06+00:00</updated>
		<content type="html">&lt;p&gt;No primeiro post desta série, falamos um pouco sobre &lt;a href=&quot;http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1&quot;&gt;Ponteiros&lt;/a&gt;. No segundo, falamos de &lt;a href=&quot;http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-2&quot;&gt;Referências&lt;/a&gt;. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-624&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Relembrando Arrays&lt;/h2&gt;
&lt;p&gt;Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). Essa abstração é organizada em formato de tabela, com linhas e colunas. Cada elemento na matriz possui coordenadas únicas (linha e coluna), de forma que um dado elemento E(i,j) representa o único elemento na posição &amp;#8220;linha i&amp;#8221;, &amp;#8220;coluna j&amp;#8221;.&lt;/p&gt;
&lt;p&gt;A sintaxe de declaração de matrizes segue abaixo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;// Matrizes unidimensionais ou vetores&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;     ivet&lt;span&gt;&amp;#91;&lt;/span&gt;10&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;               &lt;span&gt;// 10 elementos, do 0 ao 9&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt;    cvet&lt;span&gt;&amp;#91;&lt;/span&gt;23&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;               &lt;span&gt;// 23 elementos, do 0 ao 22&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Matrizes bidimensionais&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;     imat&lt;span&gt;&amp;#91;&lt;/span&gt;2&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;3&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;             &lt;span&gt;// 2 linhas (0 a 1) e 3 colunas (0 a 2)&lt;/span&gt;
&lt;span&gt;double&lt;/span&gt;  dmat&lt;span&gt;&amp;#91;&lt;/span&gt;10&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;2&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;            &lt;span&gt;// 10 linhas (0 a 9) e 2 colunas (0 a 1)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cada elemento da matriz é independente dos demais e pode ser acessado conforme a sintaxe abaixo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt; ivet&lt;span&gt;&amp;#91;&lt;/span&gt;10&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; imat&lt;span&gt;&amp;#91;&lt;/span&gt;3&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;4&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Alterando o quarto elemento do vetor ivet.&lt;/span&gt;
&lt;span&gt;// Lembre-se que começa-se a contar a partir do elemento zero&lt;/span&gt;
ivet&lt;span&gt;&amp;#91;&lt;/span&gt;3&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;13&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Lendo o segundo elemento do vetor ivet&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; num &lt;span&gt;=&lt;/span&gt; ivet&lt;span&gt;&amp;#91;&lt;/span&gt;1&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Alterando o elemento da primeira linha, segunda coluna de imat&lt;/span&gt;
imat&lt;span&gt;&amp;#91;&lt;/span&gt;0&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;1&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Lendo o elemento na terceira linha, quarta coluna de imat&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; foo &lt;span&gt;=&lt;/span&gt; imat&lt;span&gt;&amp;#91;&lt;/span&gt;2&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;3&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Neste post não vamos discutir a fundo matrizes, vamos apenas investigar a relação entre matrizes e ponteiros de uma forma bastante intuitiva.&lt;/p&gt;
&lt;h2&gt;Tamanhos de matrizes&lt;/h2&gt;
&lt;p&gt;Dado que uma matriz é uma abstração que comporta vários valores de um mesmo tipo, qual o tamanho dela? Quanto espaço ele ocupa na memória?&lt;/p&gt;
&lt;p&gt;Considere o código abaixo:&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;17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt;     ivet&lt;span&gt;&amp;#91;&lt;/span&gt;10&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt;    cvet&lt;span&gt;&amp;#91;&lt;/span&gt;13&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;double&lt;/span&gt;  dvet&lt;span&gt;&amp;#91;&lt;/span&gt;20&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;char&lt;/span&gt;    cmat&lt;span&gt;&amp;#91;&lt;/span&gt;3&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;4&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;     imat&lt;span&gt;&amp;#91;&lt;/span&gt;5&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;4&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(int)     = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(char)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(double)  = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;double&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(ivet)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ivet&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(cvet)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;cvet&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(dvet)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;dvet&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(cmat)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;cmat&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;sizeof(imat)    = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;imat&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O resultado é bastante razoável. O Espaço ocupado por uma matriz é igual ao número de elementos multiplicado pelo tamanho do tipo do elemento (linhas x colunas x sizeof(tipo)). Ora, se cada elemento é independente, supõe-se que cada um ocupe um lugar separado na memória, caso contrário um elemento sobrescreveria outro. Sendo assim, será que cada elemento possui seu próprio endereço de memória?&lt;/p&gt;
&lt;h2&gt;Matrizes e endereços de memória&lt;/h2&gt;
&lt;p&gt;Para facilitar, vamos então analisar os possíveis endereços de uma matriz de caracteres, cujo tamanho de um dado único é 1 byte:&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;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;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; max &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt; cvet&lt;span&gt;&amp;#91;&lt;/span&gt;max&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;'A'&lt;/span&gt;, &lt;span&gt;'B'&lt;/span&gt;, &lt;span&gt;'C'&lt;/span&gt;, &lt;span&gt;'D'&lt;/span&gt;, &lt;span&gt;'E'&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Mostrando o índices, valores e endereços dos dados.&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Índice&lt;span&gt;\t&lt;/span&gt;Valor&lt;span&gt;\t&lt;/span&gt;Endereço do elemento&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;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; max&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&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;%d&lt;span&gt;\t&lt;/span&gt;%c&lt;span&gt;\t&lt;/span&gt;%p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, i, cvet&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;, &lt;span&gt;&amp;amp;&lt;/span&gt;cvet&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&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;
&amp;nbsp;
&lt;span&gt;// Mostrando o endereço da própria matriz&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Endereço da matriz: %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;amp;&lt;/span&gt;cvet&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Mostrando o endereço da própria matriz denovo&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Endereço da matriz: %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, cvet&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;Os endereços dos elementos são sequenciais, ou seja, cada elemento é armazenado ao lado do anterior. Adicionalmente existem dois fatos ainda mais interessantes:&lt;/p&gt;
&lt;p&gt;
&lt;ol&gt;
&lt;li&gt;O endereço do array (&amp;#038;cvet), mostrado na linha 25, é o mesmo do primeiro elemento do array;&lt;/li&gt;
&lt;li&gt;A própria variável cvet pode ser interpretada como um ponteiro, como é mostrado na linha 28;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Em C++, um array comum é um bloco contíguo de memória cujo nome pode ser interpretado (cast) como um ponteiro que aponta para o seu primeiro elemento. Adicionalmente é válido fazer um ponteiro apontar para um array desde que o ponteiro destino seja para o mesmo tipo que o tipo dos elementos do array. Durante a atrubuição de um array a um ponteiro, o compilador faz uma conversão implícita de tipos. O ponteiro destino passa a ser interpretado como um ponteiro para a área de memória ocupada pelo array.&lt;/p&gt;
&lt;p&gt;Uma das consequências não tão óbvias é que durante o cast implícito, é perdida a informação de que aquela área de memória era um array. Portanto é perdida a informação do tamanho do array. Do ponto de vista do ponteiro, ele está apontando para o começo de um bloco arbitrário de memória, de um tamanho também arbitrário. Sair de um array e ir para um ponteiro significa ir de uma abstração mais restritiva e mais alto nível, para um abstração menos restritiva e mais baixo nível.&lt;/p&gt;
&lt;p&gt;Por outro lado tentar atribuir um ponteiro a um array gera um erro de compilação por tipos incompatíveis. Um array é um bloco de memória de n dados (bytes), já um ponteiro possui apenas um dado, um endereço. O compilador não tem como saber de antemão se um ponteiro aponta para uma área de 1, 2 ou 200 bytes.&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;15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; max &lt;span&gt;=&lt;/span&gt; &lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt; cvet&lt;span&gt;&amp;#91;&lt;/span&gt;max&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; pc &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;span&gt;\n&lt;/span&gt;Antes da atribuição&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;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;cvet = %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, cvet&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;pc   = %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, pc&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;sizeof(cvet) = %lu&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;cvet&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;sizeof(pc)   = %lu&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;pc&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
pc &lt;span&gt;=&lt;/span&gt; cvet&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;span&gt;\n&lt;/span&gt;Depois da atribuição&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;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;cvet = %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, cvet&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;pc   = %p&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, pc&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;sizeof(cvet) = %lu&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;cvet&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;sizeof(pc)   = %lu&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;pc&lt;span&gt;&amp;#41;&lt;/span&gt;&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;Note que antes da atribuição (linha 25) o ponteiro &lt;strong&gt;pc&lt;/strong&gt;. está nulo, pois foi inicializado assim. Já os tamanhos indicam que o array possui 300 bytes e o ponteiro apenas 8 (minha máquina é um amd 64). Após a atribuição ambos passam a &amp;#8220;apontar&amp;#8221; para a mesma área de memória, porém os tamanhos não mudam. Houve um cast implicito de char[300] para char*, e nessa brincadeira o ponteiro &lt;strong&gt;pc&lt;/strong&gt; não tem como saber o tamanho da área de memória para o qual ele aponta. Já o array &lt;strong&gt;cvet&lt;/strong&gt; continua sabendo direitinho o que ele é, sem nenhuma crise existencial.&lt;/p&gt;
&lt;h2&gt;Aritmética de ponteiros &amp;#8211; Vulgo, e daí?&lt;/h2&gt;
&lt;p&gt;Ora, mas se eu sei que os dados numa matriz estão dispostos lado a lado, eu posso utilizar um ponteiro que vai pulando para o endereço ao lado e acessando o elemento seguinte. O nome disso é aritimética de ponteiros.&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;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;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; max &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; 
&lt;span&gt;char&lt;/span&gt; cvet&lt;span&gt;&amp;#91;&lt;/span&gt;max&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'L'&lt;/span&gt;,&lt;span&gt;'A'&lt;/span&gt;,&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'O'&lt;/span&gt;,&lt;span&gt;'S'&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; pc &lt;span&gt;=&lt;/span&gt; cvet&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; max&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&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;%c&amp;quot;&lt;/span&gt;, &lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;pc &lt;span&gt;+&lt;/span&gt; i&lt;span&gt;&amp;#41;&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; max&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&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;%c&amp;quot;&lt;/span&gt;, &lt;span&gt;*&lt;/span&gt;pc&lt;span&gt;++&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;// Agora com inteiros&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; ivet&lt;span&gt;&amp;#91;&lt;/span&gt;max&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;1, 2, 3, 4, 5, 6&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; pi &lt;span&gt;=&lt;/span&gt; ivet&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; max&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&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;%p = %d&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, pi, &lt;span&gt;*&lt;/span&gt;pi&lt;span&gt;++&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;
&amp;nbsp;
&lt;span&gt;// Em duas dimensões&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt; cmat&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'L'&lt;/span&gt;,&lt;span&gt;'A'&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'O'&lt;/span&gt;,&lt;span&gt;'S'&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; ppc&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
ppc &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;cmat&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; j &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; j &lt;span&gt;&amp;lt;&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; j&lt;span&gt;++&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;%c&amp;quot;&lt;/span&gt;, &lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ppc &lt;span&gt;+&lt;/span&gt; 3&lt;span&gt;*&lt;/span&gt;i&lt;span&gt;+&lt;/span&gt;j&lt;span&gt;&amp;#41;&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Na linha 18 o ponteiro &lt;strong&gt;pc&lt;/strong&gt; passa a pontar para o array &lt;strong&gt;cvet&lt;/strong&gt;, e consequentemente para o seu primeiro elemento, o caracter &amp;#8216;B&amp;#8217;. Na linha 21 o conteúdo de pc, que é o endereço onde foi armazenado o caracter &amp;#8216;B&amp;#8217;, é incrementado de i e em seguida de-referenciado. Na primeira passada o valor de i é zero, portanto é dereferenciado para o valor &amp;#8216;B&amp;#8217;. Nos passos seguintes, o endereço seguinte vai sendo de-referenciado para os outros caracteres armazenados no array original. É mais ou menos isso que internamente o compilador faz quando você utiliza a sintaxe cvet[i]. A abstração de array te dá uma forma mais amigável de tratar áreas contíguas de memória do que &lt;strong&gt;*(pc + i)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mas se a abstração de array é mais simples, pra que utilizar aritmética de ponteiros?&lt;/p&gt;
&lt;p&gt;Uma das respostas está a linha 26. Ela faz a mesma coisa que a linha 21, porém um pouco mais rápido. Na sintaxe da linha 21, ou de forma semelhante, na sintaxe de array, o acesso a um dado qualquer pode ser resumido de forma bem grosseira nos comandos:&lt;/p&gt;
&lt;p&gt;
&lt;ol&gt;
&lt;li&gt;Tome o endereço base do array;&lt;/li&gt;
&lt;li&gt;Adicione ao endereço o valor do índice;&lt;/li&gt;
&lt;li&gt;De-referencie este novo endereço;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Já com aritmética de ponteiro ficaria assim:&lt;/p&gt;
&lt;p&gt;
&lt;ol&gt;
&lt;li&gt;De-referencie este endereço;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O comando incremento (ou a conta feita com endereços) não vou contar porque é parte do loop, embora &lt;strong&gt;i++;&lt;/strong&gt; seja mais rápido que &lt;strong&gt;a = b + c;&lt;/strong&gt;. Agora imagine esse pequeno ganho de 66% aplicado em uma área de dados de 1 MB. Serão mais de 2 milhões de comandos a menos!&lt;/p&gt;
&lt;p&gt;A técnica de utilizar um ponteiro para manipular uma área arbitrária de memória é utilizada geralmente em programação de baixo nível (mais próximo da máquina), manipulação de &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_buffer&quot;&gt;buffers&lt;/a&gt; e strings, entre outros truques sujos. Nas entranhas dos computadores, operações que varrem extensas áreas de memória, frequentemente são realizadas com aritimética de ponteiros. Nesse nível, &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_selection&quot;&gt;Darwin&lt;/a&gt; reina supremo e só os mais preparados sobrevivem. A partir daqui a linguagem começa a dar um poder que só os puros de coração conseguem compreender.&lt;/p&gt;
&lt;p&gt;Uma observação importante é que entre as linhas 31 e 38 a experiência é repetida com inteiros. Note que como os inteiros possuem 4 bytes, os incrementos são automaticamente feitos de 4 em 4 bytes, e não de 1 em 1, ou seja o incremento é automaticamente calculado para sizeof(tipo). Incrementar um ponteiro significa acessar a próxima área de memória semelhante ao dado atual, e não apenas o próximo endereço. Como o tamanho de um char é um byte, quando incremetamos um ponteiro para char, avançamos apenas 1 byte. Se incrementarmos um ponteiro para double, avançaremos 8 bytes, e assim por diante.&lt;/p&gt;
&lt;p&gt;Outra observação é que uma matriz bidimensional pode ser &amp;#8220;linearizada&amp;#8221; conforme é mostrado nas linhas 40 a 52. Isso é útil, quando aplicável, para aproveitar melhor o cache do processador, por exemplo.&lt;/p&gt;
&lt;h2&gt;void*, o &lt;a href=&quot;http://en.wikipedia.org/wiki/Pansexuality&quot;&gt;Pansexual&lt;/a&gt; dos ponteiros&lt;/h2&gt;
&lt;p&gt;Anteriormente eu disse que só era possível atribuir um array a um ponteiro que fosse para o mesmo tipo que os dados do array. Eu menti descaramente! O motivo, é que para alguém que desistiu do post antes deste tópico, é mais seguro acreditar que não pode &lt;img src=&quot;http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  !&lt;/p&gt;
&lt;p&gt;Existem duas exceções à regra. A primeira é quando há uma conversão explícita de tipos e o ponteiro destino &amp;#8220;acha&amp;#8221; que está apontando para o tipo certo. Um exemplo está na linha 44 do código anterior.&lt;/p&gt;
&lt;p&gt;A segunda é o caso dos ponteiros para void. Um ponteiro para void é um ponteiro que não faz exigências quanto ao tipo de dados que está na área de memória para o qual ele aponta. Ele é um ponteiro pra uma área genérica de memória, algo bem baixo nível.&lt;/p&gt;
&lt;p&gt;Para utilizar um dado apontado por um ponteiro para void, antes de de-referenciá-lo, é preciso fazer um cast explícito para algum tipo válido, pois se um int* é de-referenciado para int e um char* é de-referenciado para char, adivinhe para que é de-referenciado um void*?&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;15
16
17
18
19
20
21
22
23
24
25
26
27
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; max &lt;span&gt;=&lt;/span&gt; &lt;span&gt;6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; 
&lt;span&gt;char&lt;/span&gt; cvet&lt;span&gt;&amp;#91;&lt;/span&gt;max&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'L'&lt;/span&gt;,&lt;span&gt;'A'&lt;/span&gt;,&lt;span&gt;'B'&lt;/span&gt;,&lt;span&gt;'O'&lt;/span&gt;,&lt;span&gt;'S'&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; pv &lt;span&gt;=&lt;/span&gt; cvet&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Erro de compilação.&lt;/span&gt;
&lt;span&gt;//*pv&lt;/span&gt;
&lt;span&gt;// Quanto vale sizeof(void)?&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; max&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&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;%c&amp;quot;&lt;/span&gt;, &lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;pv&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; i&lt;span&gt;&amp;#41;&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;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;&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;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ponteiro para void são utilizados quando precisa-se apontar para uma área genérica de memória sem ter controle/conhecimento do tipo de dados que essa área contém, ou em funções que não podem fazer suposições sobre os tipos de seus parâmetros, como é o caso da API da lib &lt;a href=&quot;https://computing.llnl.gov/tutorials/pthreads/&quot;&gt;pthreads&lt;/a&gt; (link arbitrário).&lt;/p&gt;
&lt;h2&gt;Encerrando&lt;/h2&gt;
&lt;p&gt;Quanto mais nos aprofundamos nos tópicos sobre ponteiros, mais próximos da máquina ficamos. Boa parte do poder das linguagens C e C++ provém daí, e boa parte dos problemas também. A complexidade vai aumentando e os riscos também. Para muitos é aí que mora a diversão!&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/18/arrays.zip&quot;&gt;arrays.zip&lt;/a&gt; (todos os fontes do post);&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cplusplus.com/doc/tutorial/pointers/&quot;&gt;Ponteiros no cplusplus.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/&quot;&gt;Ponteiros no blabos.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/&quot;&gt;Referências no blabos.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.research.att.com/~bs/&quot;&gt;O Culpado&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;buymebeer&quot;&gt;&lt;form action=&quot;https://www.paypal.com/cgi-bin/webscr&quot; target=&quot;paypal&quot; method=&quot;post&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;cmd&quot; value=&quot;_xclick&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;business&quot; value=&quot;blabos@blabos.org&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;return&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;item_name&quot; value=&quot;Buy Me a Beer for Ponteiros e Arrays&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;currency_code&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;image&quot; src=&quot;http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif&quot; align=&quot;left&quot; alt=&quot;&quot; title=&quot;&quot; hspace=&quot;3&quot; /&gt;&lt;/form&gt;&lt;a href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Ponteiros+e+Arrays&quot; target=&quot;paypal&quot;&gt;If you liked this post, buy me a beer&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&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>2009-07-03T16:38:30+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Comma Quibbling Puzzle</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!205.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!205</id>
		<updated>2009-05-08T13:12:15+00:00</updated>
		<content type="html">&lt;div&gt;Some days ago (almost one month ago), &lt;a href=&quot;http://blogs.msdn.com/ericlippert/&quot;&gt;Eric Lippert&lt;/a&gt; post a &lt;a href=&quot;http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx&quot;&gt;cool puzzle&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;I did some solutions, to be exact, one in C++ and 2 in C#. So, today I had time to compile them here...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;C++ Solution:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;#include&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;algorithm&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;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;string&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;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;sstream&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;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iostream&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;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;vector&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;#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;iterator&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std;&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;namespace&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; Solution&lt;/font&gt;&lt;br /&gt;{&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;template&lt;/font&gt;&lt;/font&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;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; Elem, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; TString = basic_string&amp;lt;Elem&amp;gt;, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; TSequenceContainter = vector&amp;lt;TString&amp;gt; &amp;gt;&lt;/font&gt;&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;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; GetSequence&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;TString Open_, Close_, Separator_, Separator_End_; &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; min( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; lVal, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; rVal ){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; lVal &amp;lt; rVal ? lVal : rVal; }&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;public&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;GetSequence(TString open, TString close, TString separator, TString separator_end) :&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;Open_(open), Close_(close), Separator_(separator), Separator_End_(separator_end){}&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;TString get(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; TSequenceContainter&amp;amp; items)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;TSequenceContainter::size_type itemsCount = items.size();&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;typedef&lt;/font&gt;&lt;/font&gt; ostream_iterator&amp;lt;TString, Elem&amp;gt; iter;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;basic_stringstream&amp;lt;Elem&amp;gt; ss;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;ss &amp;lt;&amp;lt; Open_;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;copy( items.begin(), items.end() - min(2, itemsCount), iter( ss, Separator_.c_str() ) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;copy( items.end() - min(2, itemsCount), items.end() - min(1, itemsCount), iter( ss, Separator_End_.c_str() ) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;copy( items.end() - min(1, itemsCount), items.end(), iter( ss ) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;ss &amp;lt;&amp;lt; Close_;&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;return&lt;/font&gt;&lt;/font&gt; ss.str();&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;GetSequence&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;char&lt;/font&gt;&lt;/font&gt;&amp;gt; seq_ASCII(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; GetSequence&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;char&lt;/font&gt;&lt;/font&gt;&amp;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 color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;}&amp;quot;&lt;/font&gt;&lt;/font&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 color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; and &amp;quot;&lt;/font&gt;&lt;/font&gt;); }&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;GetSequence&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&amp;gt; seq_Unicode(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; GetSequence&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;wchar_t&lt;/font&gt;&lt;/font&gt;&amp;gt;(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;{&amp;quot;&lt;/font&gt;&lt;/font&gt;, L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;}&amp;quot;&lt;/font&gt;&lt;/font&gt;, L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;, &amp;quot;&lt;/font&gt;&lt;/font&gt;, L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; and &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;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;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;string&amp;gt; x;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;x.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;x.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;x.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;x.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;D&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( x ) &amp;lt;&amp;lt; &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;/font&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;string&amp;gt; y;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;y.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;y.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( y ) &amp;lt;&amp;lt; &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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;string&amp;gt; z;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;z.push_back(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( z ) &amp;lt;&amp;lt; &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;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;string&amp;gt; w;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( w ) &amp;lt;&amp;lt; &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;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;wstring&amp;gt; ux;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;ux.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;ux.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;ux.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;ux.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;D&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( ux ) &amp;lt;&amp;lt; L&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;wstring&amp;gt; uy;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;uy.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;uy.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uy ) &amp;lt;&amp;lt; L&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;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;wstring&amp;gt; uz;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;uz.push_back(L&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uz ) &amp;lt;&amp;lt; L&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;#008000&quot;&gt;  &lt;/font&gt;vector&amp;lt;wstring&amp;gt; uw;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uw ) &amp;lt;&amp;lt; L&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&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;C# Solutions:&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;using&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;using&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 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 color=&quot;#000000&quot; size=&quot;1&quot;&gt; System.Linq;&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;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; System.Text;&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;static&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&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;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;StringBuilder&lt;/font&gt;&lt;/font&gt; Append(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;StringBuilder&lt;/font&gt;&lt;/font&gt; sb, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt; one, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt; two) { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; sb.Append(one).Append(two); }&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;string&lt;/font&gt;&lt;/font&gt; Next(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerator&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt; enumerator) { enumerator.MoveNext(); &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; enumerator.Current; }&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  public&lt;/font&gt;&lt;/font&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;string&lt;/font&gt;&lt;/font&gt; GetSequence(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt; items)&lt;br /&gt;  {&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;string&lt;/font&gt;&lt;/font&gt; OPEN = &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;{&amp;quot;&lt;/font&gt;&lt;/font&gt;, CLOSE = &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;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;    //(1) If the sequence is empty then the resulting string is &amp;quot;{}&amp;quot;&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&gt;if&lt;/font&gt;&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;null&lt;/font&gt;&lt;/font&gt; == items) &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;return&lt;/font&gt;&lt;/font&gt; OPEN + CLOSE;&lt;br /&gt;&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; itemsCount = items.Count();&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;switch&lt;/font&gt;&lt;/font&gt; (itemsCount)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;      //(1) If the sequence is empty then the resulting string is &amp;quot;{}&amp;quot;&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&gt;case&lt;/font&gt;&lt;/font&gt; 0:&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;return&lt;/font&gt;&lt;/font&gt; OPEN + CLOSE;&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;      //(2) If the sequence is a single item &amp;quot;ABC&amp;quot; then the resulting string is &amp;quot;{ABC}&amp;quot;&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&gt;case&lt;/font&gt;&lt;/font&gt; 1:&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;return&lt;/font&gt;&lt;/font&gt; OPEN + items.First() + CLOSE;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;      //(3) If the sequence is the two item sequence &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; then the resulting string is &amp;quot;{ABC and DEF}&amp;quot;.&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;      //(4) If the sequence has more than two items, say, &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; then the resulting string is &amp;quot;{ABC, DEF, G and H}&amp;quot;. (Note: no Oxford comma!)&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&gt;default&lt;/font&gt;&lt;/font&gt;:&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;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; COUNTDOWN = 2, ESTIMATED_STRING_LENGTH = 4;&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;const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt; SEPARATOR = &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;,&amp;quot;&lt;/font&gt;&lt;/font&gt;, SEPARATOR_END = &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;and&amp;quot;&lt;/font&gt;&lt;/font&gt;;&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;var&lt;/font&gt;&lt;/font&gt; sb = &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;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;StringBuilder&lt;/font&gt;&lt;/font&gt;(OPEN, ESTIMATED_STRING_LENGTH * itemsCount);&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;var&lt;/font&gt;&lt;/font&gt; enumerator = items.GetEnumerator();&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;while&lt;/font&gt;&lt;/font&gt; (COUNTDOWN &amp;lt; itemsCount--) &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;          &lt;/font&gt;sb.Append(enumerator.Next(), SEPARATOR).Append(&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;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;return&lt;/font&gt;&lt;/font&gt; sb.Append(enumerator.Next(), &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/font&gt;).Append(SEPARATOR_END, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/font&gt;).Append(enumerator.Next(), CLOSE).ToString();&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#008000&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;static&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution2&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;{&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;static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt; Match(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt; items, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;params&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Func&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt;[] funcs)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;{&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;return&lt;/font&gt;&lt;/font&gt; funcs[&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;null&lt;/font&gt;&lt;/font&gt; == items ? 0 : &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Math&lt;/font&gt;&lt;/font&gt;.Min(items.Count(), funcs.Length - 1)]();&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;}&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;&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 color=&quot;#008000&quot;&gt;  &lt;/font&gt;public&lt;/font&gt;&lt;/font&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;string&lt;/font&gt;&lt;/font&gt; GetSequence(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt; items)&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;{&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;return&lt;/font&gt;&lt;/font&gt; items.Match&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;(&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;() =&amp;gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&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;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;() =&amp;gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&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; + items.First() + &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;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;() =&amp;gt; &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;{&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; count = items.Count() - 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;var&lt;/font&gt;&lt;/font&gt; sb = &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;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;StringBuilder&lt;/font&gt;&lt;/font&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;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;foreach&lt;/font&gt;&lt;/font&gt; (&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;var&lt;/font&gt;&lt;/font&gt; item &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;in&lt;/font&gt;&lt;/font&gt; items.Take(count))&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;          &lt;/font&gt;sb.Append(item).Append(&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;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;var&lt;/font&gt;&lt;/font&gt; last = items.Skip(count).ToArray();&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;        &lt;/font&gt;sb.Append(last[0]).Append(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; and &amp;quot;&lt;/font&gt;&lt;/font&gt;).Append(last[1]);&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;return&lt;/font&gt;&lt;/font&gt; sb.Append(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;}&amp;quot;&lt;/font&gt;&lt;/font&gt;).ToString(); &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#008000&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;class&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;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;TestProgram&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;{&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;static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt; Main()&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;Action&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;&amp;gt; print = &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Console&lt;/font&gt;&lt;/font&gt;.WriteLine;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print( &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;D&amp;quot;&lt;/font&gt;&lt;/font&gt; }) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print( &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt; }) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print( &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt; }) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print( &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] {}) );&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print( &lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;null&lt;/font&gt;&lt;/font&gt;) );&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;'-'&lt;/font&gt;&lt;/font&gt;,20));&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution2&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;D&amp;quot;&lt;/font&gt;&lt;/font&gt; }));&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution2&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt; }));&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution2&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt; }));&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution2&lt;/font&gt;&lt;/font&gt;.GetSequence(&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;string&lt;/font&gt;&lt;/font&gt;[] { }));&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;    &lt;/font&gt;print(&lt;font color=&quot;#2b91af&quot;&gt;&lt;font color=&quot;#2b91af&quot;&gt;Solution&lt;/font&gt;&lt;/font&gt;.GetSequence(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;null&lt;/font&gt;&lt;/font&gt;));&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;  &lt;/font&gt;}&lt;br /&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Últimas pesquisas na blogosfera nacional</title>
		<link href="http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional"/>
		<id>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional</id>
		<updated>2009-05-08T10:50:40+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/brasil-matrix.png&quot; title=&quot;Mapa do Brasil com o código do filme Matrix&quot; alt=&quot;Mapa do Brasil com o código do filme Matrix&quot; align=&quot;left&quot; /&gt; É um imenso prazer constatar que hoje, mais de dez anos depois de eu ter iniciado minha caminhada pelo mundo da programação C/C++, temos uma reação de blogues e saites prontos para elucidar questões simples e avançadas dessas duas linguagens que ainda não morreram e, se depender de como as coisas andam, ainda vão durar pelo menos mais uns dez anos (sim, não sou tão otimista assim).&lt;/p&gt;
&lt;p&gt;Esse artigo é só para constar em minha lista de referência para o aprendizado de C, C++ e todas as outras coisas que vem depois. Se eu tivesse que escrever isso lá no início, provavelmente recomendaria mais linques de livros e saites em inglês. Hoje, felizmente, temos um conteúdo em pleno desenvolvimento em nossa blogosfera tupiniquim. E espero que continue assim!&lt;/p&gt;
&lt;h4&gt;C/C++&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2008/12/11/strings-em-c/&quot;&gt;Strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2009/01/23/strings-e-numeros/&quot;&gt;Strings e Números&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Os &lt;a href=&quot;http://bcsanches.wordpress.com/2008/08/27/c-type-casting-1%c2%aa-parte/&quot;&gt;diversos&lt;/a&gt; &lt;a href=&quot;http://bcsanches.wordpress.com/2008/09/18/c-type-casting-2%c2%aa-parte/&quot;&gt;tipos&lt;/a&gt; de &lt;a href=&quot;http://bcsanches.wordpress.com/2008/11/05/c-type-casting-3%c2%aa-e-ultima-parte/&quot;&gt;casting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/&quot;&gt;Pointeiros&lt;/a&gt; e &lt;a href=&quot;http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/&quot;&gt;Referências&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thradams.com/codeblog/templates.pdf&quot;&gt;Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2008/05/29/smart-pointers-introducao/&quot;&gt;Smart Pointer - Introdução&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2008/06/10/auto-pointers/&quot;&gt;Auto Pointer (auto_ptr)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Boost &lt;a href=&quot;http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/&quot;&gt;Shared Pointer&lt;/a&gt;, &lt;a href=&quot;http://bcsanches.wordpress.com/2008/07/17/boost-weak-pointer-weak_ptr/&quot;&gt;Weak Pointer&lt;/a&gt; e &lt;a href=&quot;http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/&quot;&gt;Scoped Pointer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Boost &lt;a href=&quot;http://bcsanches.wordpress.com/2008/07/30/boost-shared-array-e-scoped-array-shared_array-e-scoped_array/&quot;&gt;Shared Array e Scoped Array &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devhints.blogspot.com/2008/12/c-quando-usar-cada-smart-pointer.html&quot;&gt;Quando usar cada um dos smart pointers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/ccppbrasil/topics&quot;&gt;As infinitas e riquíssimas discussões na lista C/C++&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2009/03/06/como-utilizar-o-visual-studio-c-parte-1/&quot;&gt;Como usar&lt;/a&gt; o &lt;a href=&quot;http://bcsanches.wordpress.com/2009/04/01/como-utilizar-o-visual-studio-c-parte-2/&quot;&gt;Visual&lt;/a&gt; &lt;a href=&quot;http://bcsanches.wordpress.com/2009/04/22/como-utilizar-o-visual-studio-parte-3/&quot;&gt;Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bcsanches.wordpress.com/2008/05/14/compilando-a-boost-no-windows-usando-visual-studio/&quot;&gt;Compilando o Boost no Windows (usando Visual Studio)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Mais assuntos?&lt;/h4&gt;
&lt;p&gt;A internet brasileira cresceu como um todo. Mesmo que você deseje saber mais sobre &lt;a href=&quot;http://dqsoft.blogspot.com/search/label/Processadores&quot;&gt;microprocessadores&lt;/a&gt; ou &lt;a href=&quot;http://www.driverentry.com.br&quot;&gt;drivers para Windows&lt;/a&gt;, em português, hoje isso é possível. É claro que o que não é possível é você se dedicar profissionalmente a essas áreas &lt;a href=&quot;http://www.caloni.com.br/blog/archives/developer-you-need-to-know-english&quot; title=&quot;Developer you need to know English&quot;&gt;sem saber inglês&lt;/a&gt;. Mas é uma muito bem-vinda manifestação das pessoas que fazem acontecer todas essas coisas em nosso país.&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ponteiros e referências em C++ parte 2</title>
		<link href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/"/>
		<id>http://blog.blabos.org/?p=578</id>
		<updated>2009-05-02T06:32:51+00:00</updated>
		<content type="html">&lt;p&gt;Continuando com essa tentativa de série de posts sobre ponteiros e referências, que começou falando sobre &lt;a href=&quot;http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/&quot;&gt;Ponteiros&lt;/a&gt;, hoje abordaremos Referências.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-578&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Uma referência é um nome alternativo para um objeto, um alias. Aliás, quem diz isso não sou eu, mas o próprio &lt;a href=&quot;http://www.research.att.com/~bs/&quot;&gt;Bjarne Stroustrup&lt;/a&gt;, lá pelo tópico 5.5 do seu &lt;a href=&quot;http://www.research.att.com/~bs/3rd.html&quot;&gt;livro&lt;/a&gt;, cujo conteúdo é tão bom que só fui reparar hoje que na capa tem uma onda quebrando em forma de C. Gostei dessa capa!&lt;/p&gt;
&lt;h2&gt;Declarando Referências&lt;/h2&gt;
&lt;p&gt;Uma referência para um determinado tipo é declarada acrescentando-se o &lt;strong&gt;caracter&lt;/strong&gt; &amp;amp; (ê comercial ou &lt;a href=&quot;http://en.wikipedia.org/wiki/&amp;&quot;&gt;ampersand&lt;/a&gt;) após o nome do tipo da referência. Note que da mesma forma que na declaração de ponteiros, estamos tratando o &lt;strong&gt;&amp;amp;&lt;/strong&gt; como um caracter de notação e não um operador. Não há um &lt;strong&gt;operador&lt;/strong&gt; de declaração de ponteiros ou referências. É apenas uma notação da linguagem. Dado um tipo T, a expressão &lt;strong&gt;T&amp;amp;&lt;/strong&gt; significa &lt;strong&gt;Referência para T&lt;/strong&gt;. Por exemplo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;// Declara uma variável inteira original.&lt;/span&gt;
&lt;span&gt;// Também poderia ser char, float, etc.&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; i&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Declaram referências para a variável i.&lt;/span&gt;
&lt;span&gt;// Todas as formas são equivalentes, mas preferimos a primeira.&lt;/span&gt;
&lt;span&gt;// Note que os tipos das referências tem que ser os mesmos&lt;/span&gt;
&lt;span&gt;// que os das variáveis referenciadas.&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; ra     &lt;span&gt;=&lt;/span&gt; i&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;rb     &lt;span&gt;=&lt;/span&gt; i&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt; rc    &lt;span&gt;=&lt;/span&gt; i&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// Diferentemente de ponteiros, a linha abaixo gera um&lt;/span&gt;
&lt;span&gt;// erro de compilação. Você saberia dizer por quê?&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;r1, &lt;span&gt;&amp;amp;&lt;/span&gt;r2&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Embora em C++ as referências lembrem um pouco os ponteiros, eles são bem diferentes. Ao contrário do que acontece com ponteiros, uma referência precisa ser inicializada durante sua declaração. Tentar declarar uma referência sem inicializá-la gera um erro em tempo de compilação, ou seja, o compilador vai cuspir na sua cara &amp;#8220;Perdeu playboy, perdeu!&amp;#8221;. A única exceção a essa regra é para referências declaradas como &lt;a href=&quot;http://en.wikipedia.org/wiki/External_variable&quot;&gt;extern&lt;/a&gt;, pois elas serão inicializadas em algum outro ponto do programa, mas isso é outro papo.&lt;/p&gt;
&lt;p&gt;Se você tentar trapacear declarando uma referência extern sem inicializá-la o compilador não vai reclamar. Se ela nunca for utilizada, ok. Se o compilador for esperto e notar que ela não será utilizada, pode até removê-la da lista de símbolos. Mas se ela for utilizada em qualquer parte do programa, o linker vai rir da sua cara gargalhando &amp;#8220;undefined reference to &amp;#8216;nome_da_variavel&amp;#8217;&amp;#8221;. Portanto faça as coisas direitinho. Declarou uma referência? Então iniclalize-a. extern? Tem certeza que sabe o que está fazendo?&lt;/p&gt;
&lt;p&gt;A lógica por trás disso é que uma referência foi planejada para ser um nome para alguma coisa. Se você não a inicializar, ela não será nome para nada, então não faz sentido. Um detalhe muito importante é que inicializar uma referência &lt;strong&gt;não&lt;/strong&gt; é atribuir um valor a ela. Como o prório Bjarne diz, nenhum operador opera sobre referências, ou seja, não há como atribuir, somar, subtrair, etc com uma referência. Como uma referência é um apelido para um objeto, cada operador atua nese objeto, e não na referência. Uma vez inicializada, uma referência sempre referenciará o mesmo objeto.&lt;/p&gt;
&lt;p&gt;A primeira armadilha com referências, assim como ponteiros está na questão do tamanho. Enquanto o tamanho de um ponteiro (e de outras estruturas de dados) pode ser obtido com o operador sizeof, o tamanho de uma referência não pode ser obtido por técnicas convencionais, já que ao aplicar o operador sizeof em uma referência, estamos na verdade, aplicando o operador no objeto ao qual ela se referencia, conforme vimos no parágrafo anterior.&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;17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;char&lt;/span&gt;    c&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;     i&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;double&lt;/span&gt;  d&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;char&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;   rc &lt;span&gt;=&lt;/span&gt; c&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;    ri &lt;span&gt;=&lt;/span&gt; i&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;double&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; rd &lt;span&gt;=&lt;/span&gt; d&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;// O operador sizeof diz o tamanho do tipo do seu argumento.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of char:    &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;c&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of int:     &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of double:  &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;d&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of char&amp;amp;:   &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;rc&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of int&amp;amp;:    &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ri&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Size of double&amp;amp;: &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;rd&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As técnicas para obter os tamanhos das referências fogem ao escopo deste texto, mas pretendo falar sobre elas futuramente. Por hora, vou apenas dizer sem demonstrar que, quando aplicável, o tamanho de uma referência é idêntico ao tamanho de um ponteiro.&lt;/p&gt;
&lt;p&gt;A parte boa da história é que frequentemente os tamanhos de ponteiros e referências são bem menos relevantes que os tamanhos dos objetos apontados ou referenciados. Eu particularmente, nunca precisei utilizar essa informação, mas para o desenvolvimento em arquiteturas diferentes ou para sistemas embarcados, isso já se torna mais interessante.&lt;/p&gt;
&lt;h2&gt;Utilizando Referências&lt;/h2&gt;
&lt;p&gt;O uso de referências já é bem mais simples que o de ponteiros, pois não são necessários operadores de extração de endereços ou de de-referenciação. Variáveis referências são utilizadas como variáveis comuns, lembrando que uma operação feita numa referência sempre afeta o objeto referenciado.&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;17
18
19
20
21
22
23
24
25
26
27
28
29
30
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt; x, y&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; rx &lt;span&gt;=&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; ry &lt;span&gt;=&lt;/span&gt; y&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
x &lt;span&gt;=&lt;/span&gt; &lt;span&gt;13&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
y &lt;span&gt;=&lt;/span&gt; &lt;span&gt;10&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
rx &lt;span&gt;=&lt;/span&gt; &lt;span&gt;42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;    &lt;span&gt;// A atribuição é automaticamente aplicada em x.&lt;/span&gt;
ry&lt;span&gt;++&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;       &lt;span&gt;// O incremento é automaticamente aplicado em y.&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;x:  &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; x &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;    &lt;span&gt;// Valor de x.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;y:  &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; y &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;    &lt;span&gt;// Valor de y.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;rx: &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; rx &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;   &lt;span&gt;// Valor de rx == x.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;ry: &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; ry &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;   &lt;span&gt;// Valor de ry == y.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Utilizar uma referência é tão transparente para o programador, que ele nem precisa saber que é uma referência. Simplesmente usa como se fosse uma variável ordinária. Com minha imaginação limitada não vejo como alguém consiga ser &lt;a href=&quot;http://en.wikipedia.org/wiki/Excommunication&quot;&gt;excomungado&lt;/a&gt; por utilizar referências inadequadamente. Embora sempre tenha algum &lt;a href=&quot;http://pt.wiktionary.org/wiki/esp%C3%ADrito_de_porco&quot;&gt;espírito de porco&lt;/a&gt; que consiga fazer merda com referências, é muito mais fácil levar rasteira de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Saci&quot;&gt;Saci&lt;/a&gt; ao manusear ponteiros.&lt;/p&gt;
&lt;h2&gt;Endereços e Referências&lt;/h2&gt;
&lt;p&gt;Do ponto de vista de &lt;a href=&quot;http://en.wikipedia.org/wiki/Murphy%27s_law&quot;&gt;Murphy&lt;/a&gt;, as referências são feias, chatas e bobas, pois existe pouca coisa potencialmente perigosa a se fazer com elas. Nem mesmo quanto a endereçamento há muitas surpresas (será?). Considere o código abaixo:&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;17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt; a &lt;span&gt;=&lt;/span&gt; &lt;span&gt;10&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; b &lt;span&gt;=&lt;/span&gt; &lt;span&gt;13&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; ra &lt;span&gt;=&lt;/span&gt; a&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt; rb &lt;span&gt;=&lt;/span&gt; b&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
ra &lt;span&gt;=&lt;/span&gt; &lt;span&gt;42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
rb &lt;span&gt;=&lt;/span&gt; &lt;span&gt;7&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;ra  = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; ra &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;span&gt;// O valor de ra == 42.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;rb  = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; rb &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;span&gt;// O valor de rb == 7.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;a   = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; a &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// O valor de a == ra == 42.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;b   = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; b &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// O valor de b == rb == 7.&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;amp;a  = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;a &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// O endereço de a.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;amp;b  = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;b &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// O endereço de b.&lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;amp;ra = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;ra &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;span&gt;// O endereço de ra == &amp;amp;a. &lt;/span&gt;
&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;amp;rb = &amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;rb &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span&gt;;&lt;/span&gt;&lt;span&gt;// O endereço de rb == &amp;amp;b.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nas linhas 17 e 18 eu declaro duas variáveis inteiras (poderia ter feito esse exemplo com uma só&amp;#8230;). Nas linhas 20 e 21 eu declaro duas referências, referenciando as duas variáveis anteriores. A partir desse momento as variáveis ra e rb são apenas &lt;strong&gt;apelidos&lt;/strong&gt; para as variáveis a e b. Como vimos anteriormente, qualquer operador aplicado às referências, na verdade atua nos objetos referenciados, portanto cada par variável-referência possui sempre o mesmo valor.&lt;/p&gt;
&lt;p&gt;A parte interessante a se notar é que os endereços das referências são exatamente os mesmo endereços das variáveis que elas referenciam, ao contrário dos ponteiros que tinham seus próprios endereços. Por quê? Porque você caiu na &lt;a href=&quot;http://desciclo.pedia.ws/wiki/S%C3%A9rgio_Malandro&quot;&gt;Pegadinha do Malandro&lt;/a&gt;. Lembra daquele papo de nenhum operador ser aplicável a uma referência? Pois bem, o &lt;strong&gt;&amp;amp;&lt;/strong&gt; utilizado aqui é o &lt;strong&gt;operador&lt;/strong&gt; &amp;#8220;endereço de&amp;#8221;, que também é aplicado diretamente nas variáveis originais e não nas referências. As mesmas técnicas ninja utilizadas para obter os tamanhos das referências são necessárias para se obter os endereços delas.&lt;/p&gt;
&lt;p&gt;Novamente a parte divertida disso é que o mecanismo de referências foi planejado para ser o mais transparente possível para o programador. Tamanhos e endereços físicos de referências são informações irrelevantes do ponto de vista da programação &amp;#8220;normal&amp;#8221; em C++.&lt;/p&gt;
&lt;h2&gt;Diferenças e semelhanças entre Ponteiros e Referências&lt;/h2&gt;
&lt;p&gt;Tanto ponteiros como referências são mecanismos de indireção em C++, ou seja, são mecanismos utilizados para que a partir de um dado símbolo (variável) eu seja capaz de manipular outro objeto.&lt;/p&gt;
&lt;p&gt;Os principais usos para ponteiros são geralmente relacionados com gerenciamento e manipulação dinâmica de memória, criação e destruição de objetos de formas e em momentos especiais, bem como &amp;#8220;passagem de parâmetros por referência&amp;#8221; (assim entre aspas mesmo). Já as referências são mais utilizadas em passagem por referência (por que será?) e sobrecarga de operadores.&lt;/p&gt;
&lt;p&gt;Basicamente, tudo que podemos fazer com referências pode ser emulado com ponteiros. Já a recíprocra não é sempre verdadeira. A grande vantagem delas no entanto, é o fato de tornarem a indireção completamente transparente ao programador.&lt;/p&gt;
&lt;p&gt;Uma alegoria interesante para ajudar a entender melhor as diferenças entre ponteiros e referências é o apelido. Por exemplo: Imagine que um pessoa, digamos, &lt;a href=&quot;http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri&quot;&gt;Carlos Caetano Bledorn Verri&lt;/a&gt;, seja a nossa variável original, o objeto. &lt;a href=&quot;http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri&quot;&gt;Dunga&lt;/a&gt; já é uma referência a Carlos Caetano Bledorn Verri, pois é um apelido para o mesmo objeto, são a mesma pessoa. Já a Mãe do Dunga (ou do Carlos Caetano Bledorn Verri, tanto faz), que é contantemente citada pela torcida, pode ser considerada um ponteiro para ele, pois dados determinados operadores de vocabulário, um elogio feito a ela, na verdade é &lt;strong&gt;indiretamente direcionado&lt;/strong&gt; a ele.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/02/referencias.zip&quot;&gt;referencias.zip&lt;/a&gt; (todos os fontes do post);&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/02/01-declaracao.cpp&quot;&gt;01-declaracao.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/02/02-tamanhos.cpp&quot;&gt;02-tamanhos.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/02/03-utilizando.cpp&quot;&gt;03-utilizando.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://src.blabos.org/blog/posts/2009/05/02/04-enderecos.cpp&quot;&gt;04-enderecos.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.research.att.com/~bs/&quot;&gt;O Culpado&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;buymebeer&quot;&gt;&lt;form action=&quot;https://www.paypal.com/cgi-bin/webscr&quot; target=&quot;paypal&quot; method=&quot;post&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;cmd&quot; value=&quot;_xclick&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;business&quot; value=&quot;blabos@blabos.org&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;return&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;item_name&quot; value=&quot;Buy Me a Beer for Ponteiros e referências em C++ parte 2&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;currency_code&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;amount&quot; value=&quot;&quot; /&gt;&lt;input type=&quot;image&quot; src=&quot;http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif&quot; align=&quot;left&quot; alt=&quot;&quot; title=&quot;&quot; hspace=&quot;3&quot; /&gt;&lt;/form&gt;&lt;a href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Ponteiros+e+referências+em+C+++parte+2&quot; target=&quot;paypal&quot;&gt;If you liked this post, buy me a beer&lt;/a&gt;&lt;/p&gt;&lt;/p&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>2009-07-03T16:38:30+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">O Java e o MySQL passam a ser da Oracle</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/nc5WbmQQHM8/o-java-e-o-mysql-passam-ser-da-oracle.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-5874647094021828547</id>
		<updated>2009-04-30T02:51:31+00:00</updated>
		<content type="html">A compra da Sun pela Oracle concluída no domingo (19/04) e anunciada na semana passada (20/04) pegou de surpresa os desenvolvedores de todo o mundo. Negociada em US$ 7,4 bilhões, em meio a “crise” (que, cá entre nós, não assustou o setor de T.I.), a Sun finalmente cedeu à oferta.  Fora a negociação, o que mais tem deixado a comunidade de cabelo em pé é a questão: como fica o suporte ao MySQL,</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">TDD na Prática – Parte V: Testabilidade e a UML</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/lUs-GYgiMQs/tdd-na-pratica-parte-v-testabilidade-e.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-7047761796514934446</id>
		<updated>2009-04-11T07:43:02+00:00</updated>
		<content type="html">Seguindo nossa pequena série sobre TDD, vamos ver sobre como a testabilidade influencia no design, sobre a diferença de escrevermos os testes antes ou depois e como a UML pode se relacionar com TDD.    (Lembrando que nas próximas partes da série será dado início à implementação de um pequeno e simples Jogo da Velha, nos moldes do TDD)   Como podemos testar um Jogo da Velha ? O que deve ser</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Qt com licença LGPL</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/ZsHCP0Whrbw/qt-com-licenca-lgpl.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-834946422485512681</id>
		<updated>2009-04-11T05:07:26+00:00</updated>
		<content type="html">A Nokia decidiu permitir a adoção da Lesser General Public License (LGPL) versão 2.1 opcionalmente à GPL 3 para seu framework de construção de interfaces gráficas para desktop e dispositivos portáveis, o Qt. A Qt 4.5, liberada ontem, já saiu com esta licença.  Na prática, significa que a versão do framework poderá ser usada para fins comerciais e assim mais pessoas e empresas se interessarão a</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Revistas: ESM edições 1 e 2</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/1ztDtR0n0ck/revistas-esm-edicoes-1-e-2.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-8674830233529975105</id>
		<updated>2009-04-11T04:59:36+00:00</updated>
		<content type="html">Para quem gosta de ler artigos relacionados à Engenharia de Software, aí vão duas edições gratuitas da Engenharia de Software Magazine, da editora DevMedia, disponíveis para download.  Edição 1                                                  Download em baixa resolução                           Download em alta resolução          Edição 2                                                  Download</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">The Anagram problem (and a sequential solution)</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!203.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!203</id>
		<updated>2009-03-09T13:52:15+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This is a sequential solution using C++ of anagram problem pointed out by &lt;a href=&quot;http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx&quot;&gt;Eric Lippert's Fabulous Adventures In Coding&lt;/a&gt; &lt;/div&gt;
&lt;div&gt;The solution itself is multi-paradigm and platform independent (except in the case of StopWatch which is Windows specific, but could be easily ported).&lt;/div&gt;
&lt;div&gt;The file used as dictionary to test is an adapted version of &lt;font&gt;twl06.txt&lt;/font&gt; (is the same file only with the words, without the numbers and space). This file could be searched by your preferred search engine.&lt;/div&gt;
&lt;div&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 size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iostream&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;fstream&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;vector&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;set&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iterator&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;functional&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;cstring&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;string&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std;&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;#define&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; WIN32_LEAN_AND_MEAN&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;#include&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 size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;string Canonicalize( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; string&amp;amp; str_value )&lt;br /&gt;{&lt;br /&gt;  string canonicalizedValue( str_value );&lt;br /&gt;  sort( canonicalizedValue.begin(), canonicalizedValue.end() );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; canonicalizedValue;&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;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; RecursiveReplace( &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; string&amp;amp; value, set&amp;lt;string&amp;gt;&amp;amp; canonicalizedValues )&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  string::size_type idx( value.find_first_of( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;'?'&lt;/font&gt;&lt;/font&gt; ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( idx == string::npos )&lt;br /&gt;  {&lt;br /&gt;    canonicalizedValues.insert( Canonicalize( value ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;  string value_( value );&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;char&lt;/font&gt;&lt;/font&gt; ch = 0x41; ch &amp;lt;= 0x5A; ++ch)&lt;br /&gt;  { &lt;br /&gt;    value_[ idx ] = ch;&lt;br /&gt;    RecursiveReplace( value_, canonicalizedValues );&lt;br /&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;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; CanonicalizedValues&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  CanonicalizedValues( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; string&amp;amp; value ) : OriginalValue_( value )&lt;br /&gt;  {&lt;br /&gt;    RecursiveReplace( value, CanonicalizedValues_ );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; set&amp;lt;string&amp;gt;&amp;amp; GetValues() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; CanonicalizedValues_;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; string&amp;amp; GetOriginalValue() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; OriginalValue_;&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;private&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;br /&gt;  set&amp;lt;string&amp;gt; CanonicalizedValues_;&lt;br /&gt;  string OriginalValue_;&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;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; FindMatches&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  FindMatches( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; CanonicalizedValues&amp;amp; canonicalizedValues, vector&amp;lt;string&amp;gt;&amp;amp; result ) &lt;br /&gt;    : CanonicalizedValues_( canonicalizedValues ), &lt;br /&gt;      Result_( result ), &lt;br /&gt;      WordLength_( canonicalizedValues.GetOriginalValue().length() )&lt;br /&gt;  {&lt;br /&gt;  }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&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 color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;operator&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;char&lt;/font&gt;&lt;/font&gt;* line )&lt;br /&gt;  {&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( WordLength_ == strlen(line) )&lt;br /&gt;    { &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      const&lt;/font&gt;&lt;/font&gt; set&amp;lt;string&amp;gt;&amp;amp; values( CanonicalizedValues_.GetValues() );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      const&lt;/font&gt;&lt;/font&gt; string canonicalizedValue( Canonicalize( line ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( values.end() != find( values.begin(), values.end(), canonicalizedValue ) )&lt;br /&gt;      {&lt;br /&gt;        Result_.push_back( line );&lt;br /&gt;      }&lt;br /&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;private&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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  const&lt;/font&gt;&lt;/font&gt; CanonicalizedValues&amp;amp; CanonicalizedValues_;&lt;br /&gt;  vector&amp;lt;string&amp;gt;&amp;amp; Result_;&lt;br /&gt;  size_t WordLength_;&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;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; Function&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; ReadLines( &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; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;char&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;* filename, Function _Func )&lt;/font&gt;&lt;br /&gt;{&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; MAX_LINE_SIZE = 30;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  char&lt;/font&gt;&lt;/font&gt; line[MAX_LINE_SIZE];&lt;br /&gt;&lt;br /&gt;  ifstream file( filename );&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  while&lt;/font&gt;&lt;/font&gt;( file.getline( line, MAX_LINE_SIZE, &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;'\n'&lt;/font&gt;&lt;/font&gt; ) ) &lt;br /&gt;    _Func( line );&lt;br /&gt;&lt;br /&gt;  file.close();&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;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; StopWatch&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  StopWatch()&lt;br /&gt;  {&lt;br /&gt;    ::QueryPerformanceFrequency( &amp;amp;Freq_ );&lt;br /&gt;  }&lt;br /&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; Start()&lt;br /&gt;  {&lt;br /&gt;    ::QueryPerformanceCounter( &amp;amp;Start_ );&lt;br /&gt;  }&lt;br /&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; End()&lt;br /&gt;  {&lt;br /&gt;    ::QueryPerformanceCounter( &amp;amp;End_ );&lt;br /&gt;    End_.QuadPart -= Start_.QuadPart;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  __int64&lt;/font&gt;&lt;/font&gt; ElapsedTicks()&lt;br /&gt;  {&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; End_.QuadPart;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  double&lt;/font&gt;&lt;/font&gt; ElapsedTime()&lt;br /&gt;  {&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;static_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;double&lt;/font&gt;&lt;/font&gt;&amp;gt;(ElapsedTicks()) / Freq_.QuadPart;&lt;br /&gt;  }&lt;/font&gt;&lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;private&lt;/font&gt;&lt;/div&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;br /&gt;LARGE_INTEGER Freq_, Start_, End_;&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;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;  vector&amp;lt;string&amp;gt; result;&lt;br /&gt;  StopWatch sw;&lt;br /&gt;&lt;br /&gt;  sw.Start();&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  //CanonicalizedValues values( &amp;quot;AALNSTI?&amp;quot; );&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;  CanonicalizedValues values( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;A????&amp;quot;&lt;/font&gt;&lt;/font&gt; );&lt;br /&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;  //CanonicalizedValues values( &amp;quot;AALNST?&amp;quot; );&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;  ReadLines&lt;br /&gt;  ( &lt;br /&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;    &amp;quot;C:\\Users\\Fabio Galuppo\\Documents\\twl06_adapted.txt&amp;quot;&lt;/font&gt;&lt;/font&gt;, &lt;br /&gt;    FindMatches&lt;br /&gt;    ( &lt;br /&gt;      values,&lt;br /&gt;      result&lt;br /&gt;    ) &lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;  sw.End();&lt;br /&gt;&lt;br /&gt;  copy( result.begin(), result.end(), ostream_iterator&amp;lt;string&amp;gt;( cout, &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;  cout &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Count = &amp;quot;&lt;/font&gt;&lt;/font&gt; &amp;lt;&amp;lt; result.size() &amp;lt;&amp;lt; &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; &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Elapsed Time (s) = &amp;quot;&lt;/font&gt;&lt;/font&gt; &amp;lt;&amp;lt; sw.ElapsedTime() &amp;lt;&amp;lt; &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; &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Elapsed Ticks = &amp;quot;&lt;/font&gt;&lt;/font&gt; &amp;lt;&amp;lt; sw.ElapsedTicks() &amp;lt;&amp;lt; &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&gt; 
&lt;div&gt;&lt;font size=&quot;2&quot;&gt;&lt;br /&gt; &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;Next time, I'll (hope to) improve the sample to reading (applying lambdas and others C++0x features) and performance (using concurrency features - probably a boost threads approach and PPL approach).&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">TDD na Prática - Parte IV: Quem, Onde, Quando, O Que e Como</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/e-Mwhl7RFLY/tdd-na-prtica-parte-iv-quem-onde-quando.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-8746307867365186096</id>
		<updated>2009-03-08T21:13:15+00:00</updated>
		<content type="html">Após um breve exercício de análise, você faz um levantamento das tarefas que precisará fazer para concluir a criação de uma determinada funcionalidade no software. Desta funcionalidade,  tanto você como o usuário para o qual o software se destina, pode estabelecer as condições mínimas necessárias para que o software seja considerado &quot;satisfatório&quot;.    Estas condições poderão fazer parte do</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Funcionamento dos frameworks xUnit - Parte 2/2</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/_eNWX_cwrzs/funcionamento-dos-frameworks-xunit.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-4486865804284360871</id>
		<updated>2009-03-06T22:24:20+00:00</updated>
		<content type="html">Para complementar o descrito na Parte 1, vamos ver o uso de test fixtures e dos métodos setUp e tearDown.   Em muitos casos quando estamos construindo uma classe de testes para verificar determinada funcionalidade, diversos métodos de teste irão operar sobre um mesmo objeto ou conjunto de objetos. Ao escrevermos código para configurar o estado destes objetos repetidamente, em cada método de</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Google Mock</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/HNqS49ZE0aQ/google-mock.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-7964931040208202170</id>
		<updated>2009-03-06T22:08:12+00:00</updated>
		<content type="html">A Google liberou seu C++ Mock Framework sob a nova licensa BSD, complementando seu Google C++ Testing Framework (ou somente Google Test). Ao que me parece, eles fizeram um trabalho bem completo, deixando o framework flexível e fácil de usar.O Google Mock é baseado no EasyMock, no jMock e no Hamcrest, sendo construído para C++ sob o Google Test. Para utilizá-lo você precisará, além do Google Test</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Funcionamento dos frameworks xUnit - Parte 1/2</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/7-PBbY3bkuY/funcionamento-dos-frameworks-xunit.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-6431888848234701979</id>
		<updated>2009-03-06T22:06:39+00:00</updated>
		<content type="html">Durante a série de artigos sobre TDD, tenho citado o uso de frameworks de testes unitários baseados na JUnit. Os exemplos que serão exibidos durante a série partem do princípio que o leitor conhece o funcionamento de um framework xUnit.Sendo assim, coloco aqui uma explicação breve sobre a estrutura da maioria destes frameworks, de forma a facilitar o entendimento dos próximos artigos.Os chamados</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">POSIX/C++</title>
		<link href="http://pedrolamarao.blogspot.com/2009/02/posixc.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-1082279253215522105</id>
		<updated>2009-02-28T17:04:06+00:00</updated>
		<content type="html">No final de 2007, o IEEE aprovou a criação do projeto &quot;POSIX-C++ Binding&quot;, com o propósito de aumentar a portabilidade de programas C++ que façam uso das interfaces de sistema especificadas em POSIX.&lt;br /&gt;&lt;br /&gt;Este grupo de trabalho foi &quot;fretado&quot; inicialmente para entregar seu produto em Dezembro de 2011.&lt;br /&gt;&lt;br /&gt;Discussões ocorrem em uma &lt;a href=&quot;https://www.redhat.com/mailman/listinfo/posix-c++-wg&quot;&gt;lista de discussão&lt;/a&gt; pública.&lt;br /&gt;&lt;br /&gt;Os trabalhos iniciais envolveram a adequação da nova biblioteca de &lt;span&gt;threads&lt;/span&gt;, componente da biblioteca padrão do C++0x, e especificar sua implementação sobre as interfaces de sistema especificadas em POSIX.&lt;br /&gt;&lt;br /&gt;Dois outros projetos estão atualmente em discussão: &lt;span&gt;bindings&lt;/span&gt; C++ para as interfaces de sockets, e &lt;span&gt;bindings&lt;/span&gt; C++ para as interfaces do ligador dinâmico.&lt;br /&gt;&lt;br /&gt;Eu estou trabalhando no projeto de bindings C++ para as interfaces de sockets; mais informações podem ser obtidas &lt;a href=&quot;http://code.google.com/p/ccppbrasil/wiki/POSIX_CXX&quot;&gt;aqui&lt;/a&gt;. Meu trabalho está acontecendo sob a bandeira do &lt;a href=&quot;http://www.ccppbrasil.org/&quot;&gt;Grupo de Usuários de C e C++ do Brasil&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na próxima reunião do grupo de trabalho, dia 07 de Março, esses dois projetos serão tema da pauta de discussão. Infelizmente eu ainda não obtive um visto para participar dessa reunião; com sorte isso será possível.&lt;br /&gt;&lt;br /&gt;O objetivo da &lt;span&gt;binding&lt;/span&gt; para as interfaces de socket é basicamente produzir uma classe que aplique as técnicas de gerência de recurso em C++ no projeto de uma classe que represente um socket. Outros objetivos são melhorar a utilização das estruturas de dados representativas de endereços de socket, o uso de atributos de socket e das interfaces de tradução de nomes.&lt;br /&gt;&lt;br /&gt;Ao longo deste processo se tornou claro que seria útil acrescentar às estruturas de dados simples especificadas em POSIX elementos como construtores e sobrecargas de operadores, para tornar mais simples e mais eficiente a inicialização de objetos destes tipos e sua operação.&lt;br /&gt;&lt;br /&gt;Estou prestes a publicar agora meus primeiros trabalhos nesse sentido, na forma de uma modificação da GNU libc, usável com o GCC 4.4. Informações estão na &lt;a href=&quot;http://code.google.com/p/ccppbrasil/wiki/POSIX_CXX&quot;&gt;mesma página&lt;/a&gt; mencionada acima.&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/3006142001944566780-1082279253215522105?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Glossário Rápido</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/_y6WJ6E-Fc4/glossrio-rpido.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-729514966509104151</id>
		<updated>2009-02-27T23:42:07+00:00</updated>
		<content type="html">Eu não espero reinventar a roda e ter que explicar todos os conceitos, metodologias, processos, siglas, etc. que surgirem neste blog. Diversos outros autores já reservaram seu tempo fazendo isso. Meu intuito aqui é prover uma definição suscinta para quem não quer ler todo o conteúdo encontrado no Wikipedia ou no site mais próximo, encontrado talvez numa pesquisa no Google.   Metologias Ágeis</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Win32: sincronização parte 2</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/win32_sync_2"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/win32_sync_2</id>
		<updated>2009-01-30T13:17:58+00:00</updated>
		<content type="html">&lt;p&gt;Preparando esse post eu percebi que o post de &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_sync_1&quot;&gt;sincronização parte 1&lt;/a&gt; não explica nada sobre sincronização, só apresenta o problema que a sincronização resolve. Estou parecendo aqueles vendedores de empresas de software que gastam mais tempo tentando provar que você tem um problema do que realmente mostrando a solução. Agora chegou a hora de mostrar a solução. :-)&lt;/p&gt;

&lt;p&gt;Como vimos na primeira parte, o maior problema em programação multithread é o compartilhamento de dados entre as threads. Existem duas solução para isso. A primeira e mais usada é sincronizar o acesso aos dados, de forma que somente uma thread por vez manipule os dados em questão. Ou seja, a solução envolve &quot;eliminar&quot; (notou as aspas?) o multithread da parte que ele atrapalha. A segunda e pouco usada opção é eliminar o compartilhamento dos dados, usando filas, controle restrito de ownership e trabalhando com cópias do dados. Esse é o enfoque usado pelo &lt;a href=&quot;http://www.erlang.org/&quot;&gt;
Erlang&lt;/a&gt;, uma nova linguagem de programação.&lt;/p&gt;

&lt;p&gt;A forma mais básica para sincronização em vários SOs é o &lt;i&gt;critical section&lt;/i&gt;. Esse recurso permite definir um trecho de código que é executado por várias threads, mas que precisa ser sincronizado entre elas. Sincronizado == somente uma thread pode executar esse trecho de código por vez.&lt;/p&gt;

&lt;p&gt;Revisando a nossa classe de lista ligada, vamos ver quais são os dados da classe:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;span class=&quot;keyword&quot;&gt;template&lt;/span&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;typename&lt;/span&gt; T&amp;gt;

&lt;span class=&quot;keyword&quot;&gt;class &lt;/span&gt;LinkedList
{
  &lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt; NODE
  {
    NODE* previous;
    NODE* next;
    T data;
  };
&amp;nbsp;
  NODE rootNode_;
  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; count_;

 ...
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A princípio parece que precisamos sincronizar o &lt;i&gt;rootNode_&lt;/i&gt; e o &lt;i&gt;count_&lt;/i&gt;. Apesar disso estar correto, não é simples assim, não esqueça que todos os nós apontados pelo &lt;i&gt;rootNode_&lt;/i&gt; são dados controlados pela classe, que também precisam ser sincronizados.&lt;/p&gt;

&lt;p&gt;Olhando o fonte dessa classe, todos os métodos manipulam ou lêem essas duas variáveis. A forma mais fácil e óbvia seria cercar com um &lt;i&gt;critical section&lt;/i&gt; o corpo de todas as funções da classe.&lt;/p&gt;

&lt;p&gt;Em Win32, um critical section é definido pelo objeto (surpresa!) CRITICAL_SECTION. Esse objeto deve ser inicializado e terminado, dessa forma:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
CRITICAL_SECTION cs;
&lt;span class=&quot;comment&quot;&gt;
//
// adivinha?
//&lt;/span&gt;
InitializeCriticalSection(&amp;amp;cs);
&lt;span class=&quot;comment&quot;&gt;
//
// aqui entramos no critical section. Quando uma thread está &quot;dentro&quot; de
// um critical section, se alguma outra thread tentar entrar ficará
// travada dentro da funcão EnterCriticalSection até que a primeira
// thread chame LeaveCriticalSection. Isso garante que somente uma thread
// executará esse trecho de código em um dado momento.
//&lt;/span&gt;
EnterCriticalSection(&amp;amp;cs);
&lt;span class=&quot;comment&quot;&gt;
//
// Saímos do critical section. Isso faz com que a próxima thread que estiver
// esperando no ponto do EnterCriticalSection seja liberada. Note que somente
// uma thread é liberada por vez. Caso mais de uma thread esteja esperando, elas
// são liberadas na ordem que chegaram &quot;na portinha&quot; do critical section
//&lt;/span&gt;
LeaveCriticalSection(&amp;amp;cs);
&lt;span class=&quot;comment&quot;&gt;
//
// análogo ao CloseHandle
//&lt;/span&gt;
DeleteCriticalSection(&amp;amp;cs);

&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Resumindo: o Critical Section cria um &quot;gargalo&quot;, onde só passa uma thread de cada vez. Ah, existe uma coisa interessante a ser acrescentada à explicação do &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_threads&quot;&gt;post sobre threads&lt;/a&gt;: as threads permitem que um processo execute várias linhas de execução ao mesmo tempo, mas essas linhas de execução podem rodar o mesmo código, que está no mesmo lugar na memória. Ou seja, elas compartilham dados e código executável.&lt;/p&gt;

&lt;p&gt;No próximo post iremos para o exemplo prático.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_sync_2#comments&quot;&gt;8 comentário(s)&lt;/a&gt;&lt;/b&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/weblog_rss.1bit</id>
			<updated>2009-07-04T04:00:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">jumpi</title>
		<link href="http://jumpi.wordpress.com/2009/01/14/visualizing-floats/"/>
		<id>http://jumpi.wordpress.com/?p=63</id>
		<updated>2009-01-14T15:50:50+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Continuing the posts about data types and your characteristics, I read a nice article about Floating point numbers published by gamasutra:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gamasutra.com/view/feature/1965/visualizing_floats.php?print=1&quot;&gt;http://www.gamasutra.com/view/feature/1965/visualizing_floats&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See ya!!!&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jumpi.wordpress.com/63/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jumpi.wordpress.com/63/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jumpi.wordpress.com/63/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jumpi.wordpress.com/63/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jumpi.wordpress.com/63/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jumpi.wordpress.com/63/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jumpi.wordpress.com/63/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jumpi.wordpress.com/63/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jumpi.wordpress.com/63/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jumpi.wordpress.com/63/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jumpi.wordpress.com&amp;blog=658253&amp;post=63&amp;subd=jumpi&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alan Silva</name>
			<uri>http://jumpi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Jumpi's Notepad » Programming</title>
			<subtitle type="html">My annotations about the life, universe and everything!!! ;)</subtitle>
			<link rel="self" href="http://jumpi.wordpress.com/category/programming/feed/"/>
			<id>http://jumpi.wordpress.com/category/programming/feed/</id>
			<updated>2009-07-03T16:38:26+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">jumpi</title>
		<link href="http://jumpi.wordpress.com/2009/01/06/numeros-complexos-vs-nan-not-a-number/"/>
		<id>http://jumpi.wordpress.com/?p=55</id>
		<updated>2009-01-06T03:45:04+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Lendo uma &lt;a href=&quot;http://groups.google.com/group/ccppbrasil/browse_thread/thread/e5363e2c6db650f&quot;&gt;thread&lt;/a&gt; em uma &lt;a href=&quot;http://groups.google.com/group/ccppbrasil&quot;&gt;lista de discussão&lt;/a&gt; que acompanho, surgiu uma duvida bem interessante sobre NaN e em uma das mensagens me deparei com a seguinte afirmação.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;Números imaginários são um exemplo, sqrt (-1) retorna NaN. Outro é dividir zero ou +/- infinito por zero.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vamos analisar essa frase começando pelo fim.&lt;/p&gt;
&lt;p&gt;De acordo com a IEEE 754, se eu tenho uma variável a = 0 e divido a mesma por 0, vai dar um NaN, porem se eu tenho em a um valor positivo que tende ao infinito, o valor vai ser positivo e se o valor de a for negativo, logo essa divisão vai resultar em um valor negativo. &lt;/p&gt;
&lt;p&gt;Ok, até aqui nenhuma objeção, tudo nos conformes. Porém, porém&amp;#8230; agora vamos a primeira afirmação.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;Números imaginários são um exemplo, sqrt (-1) retorna NaN.&amp;#8221;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ooopss&amp;#8230;. Sinto que houve um equivoco ai, pois não foi definido pelo autor da frase em qual conjunto numérico ele está trabalhando, penso que ele se limitou a qualquer conjunto no qual sqrt(-1) realmente não tem solução (Q, R, Z&amp;#8230;), porém, existe também o conjunto dos complexos e nesse conjunto, existe solução para sqrt(-1). E vamos provar isso utilizando o nosso velho amigo C++, pois ele possui uma classe/template por padrão que trabalha com números complexos usando tipos de ponto flutuante, ou seja, utilizando o nosso amigo, podemos provar que existe sim solução para sqrt(-1) no campo dos complexos&lt;/p&gt;
&lt;p&gt;Listarei logo abaixo um código simples que demonstra a nossa teoria em C++, ou seja, provar que existe sim resposta para sqrt(-1) e que ela é diferente de NaN&lt;/p&gt;
&lt;p&gt;(jumpi@Painkiller:~)$ vi complex.cpp &lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;complex&amp;gt;

using namespace std;

int main(int argc, char **argv)
{
    complex&amp;lt;float&amp;gt; res = sqrt(complex&amp;lt;float&amp;gt;(-1));
    cout &amp;lt;&amp;lt; res &amp;lt;&amp;lt; endl;
    return(0);
}
&lt;/pre&gt;
&lt;p&gt;(jumpi@Painkiller:~)$ ./complex&lt;br /&gt;
(0,1)&lt;br /&gt;
(jumpi@Painkiller:~)$ &lt;/p&gt;
&lt;p&gt;Antes recapitulando, a forma geral de um numero complexo no seu plano obedece a forma a + b*i, onde a representa o numero real e b um numero imaginário, ou seja, o retorno do tipo complex em C++ retorna as coordenadas de um numero complexo no plano. &lt;/p&gt;
&lt;p&gt;No nosso caso, substituindo na fórmula, teremos a + b*i == 0 + 1*i que equivale a i.&lt;/p&gt;
&lt;p&gt;Vamos fazer o teste para confirmar?? Utilizando o google, sim&amp;#8230; o google, pois a busca serve como uma excelente calculadora e vai nos ajudar com a prova, digite sqrt(-1), qual a resposta??? Sim&amp;#8230; sim&amp;#8230; sqrt(-1) equivale a i, mesmo resultado apresentado pelo nosso simples programinha em C++. &lt;/p&gt;
&lt;p&gt;Q.E.D.&lt;/p&gt;
&lt;p&gt;Logo, sqrt(-1) = i e não um NaN conforme foi dito na thread.&lt;/p&gt;
&lt;p&gt;Essa foi apenas uma demonstração de que não podemos esquecer da base matemática para formular uma resposta, principalmente no que envolve recursos que podem ser representados pela linguagem. &lt;/p&gt;
&lt;p&gt;Maiores informações podem ser encontradas nos seguintes sites: &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mathworld.wolfram.com/ComplexNumber.html&quot;&gt;Wolfram Complex Number&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://mathworld.wolfram.com/ComplexPlane.html&quot;&gt;Wolfram Complex Plane&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cplusplus.com/reference/std/complex/complex/&quot;&gt;C plus plus complex reference&lt;/a&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jumpi.wordpress.com/55/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jumpi.wordpress.com/55/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jumpi.wordpress.com/55/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jumpi.wordpress.com/55/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jumpi.wordpress.com/55/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jumpi.wordpress.com/55/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jumpi.wordpress.com/55/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jumpi.wordpress.com/55/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jumpi.wordpress.com/55/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jumpi.wordpress.com/55/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jumpi.wordpress.com&amp;blog=658253&amp;post=55&amp;subd=jumpi&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alan Silva</name>
			<uri>http://jumpi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Jumpi's Notepad » Programming</title>
			<subtitle type="html">My annotations about the life, universe and everything!!! ;)</subtitle>
			<link rel="self" href="http://jumpi.wordpress.com/category/programming/feed/"/>
			<id>http://jumpi.wordpress.com/category/programming/feed/</id>
			<updated>2009-07-03T16:38:26+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">C++: Quando usar cada Smart Pointer</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/M0AVFm5nysE/c-quando-usar-cada-smart-pointer.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-3389306347981669030</id>
		<updated>2008-12-24T18:42:48+00:00</updated>
		<content type="html">auto_ptr, shared_ptr, scoped_ptr, … Qual utilizar ? E, principalmente, por quê ?   Primeiramente, vamos recordar o que é um Smart Pointer e quais são os recursos que geralmente utilizamos dele. Após isto, ficará mais fácil identificar qual deles usar.  Um Smart Pointer (SP) é uma classe template que guarda um ponteiro para um objeto que é dinamicamente alocado ou, sendo mais explícito, alocado</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Básico do básico: tipos</title>
		<link href="http://www.caloni.com.br/blog/archives/basico-do-basico-tipos"/>
		<id>http://www.caloni.com.br/blog/archives/basico-do-basico-tipos</id>
		<updated>2008-12-12T17:26:01+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/forma-de-bolo.jpg&quot; title=&quot;Forma de bolo.&quot; alt=&quot;Forma de bolo.&quot; /&gt;Um tipo nada mais é que do que uma forma (ô) de bolo, que &lt;strong&gt;molda a memória&lt;/strong&gt; como acharmos melhor moldá-la. Bom, para isso fazer sentido é necessário explicar memória, que é um conceito &lt;strong&gt;mais básico ainda&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A memória é &lt;strong&gt;qualquer lugar&lt;/strong&gt; onde eu possa &lt;strong&gt;guardar alguma coisa&lt;/strong&gt;. No &lt;a href=&quot;http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros&quot; title=&quot;Básico do básico: ponteiros&quot;&gt;artigo anterior&lt;/a&gt; era um punhado de &lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif&quot; title=&quot;Imagem explicando que gavetas podem ser pedaços de memória&quot;&gt;gavetas&lt;/a&gt;. Mas poderiam muito bem ser caixas de presente. Ou um caderno. Ou até uma placa de memória RAM. O que sua criatividade quiser.&lt;/p&gt;
&lt;p&gt;O importante no conceito de memória, computacionalmente falando, é saber que ela pode guardar qualquer tipo de informação, mas ela &lt;strong&gt;não sabe o que você está guardando&lt;/strong&gt;. E eis que surge o segredo do &lt;strong&gt;tipo&lt;/strong&gt;: ele conta para você, e seu programa, o que de fato está guardado na memória.&lt;/p&gt;
&lt;p&gt;Vamos exemplificar.&lt;/p&gt;
&lt;h4&gt;Este artigo é um punhado de números na memória&lt;/h4&gt;
&lt;p&gt;Computadores trabalham muito bem com números. A própria memória só guarda valores numéricos. Porém, se é dessa forma, como conseguimos abrir o Bloco de Notas e digitar algum texto?&lt;/p&gt;
&lt;p&gt;Para entender essa &quot;mágica&quot; é necessário vir à tona o conceito de &lt;strong&gt;representação&lt;/strong&gt;, um tema que ainda pode dar muito pano pra manga quando estudarmos base numérica. Por enquanto, basta saber que uma representação é um &lt;strong&gt;faz-de-conta&lt;/strong&gt; em que todos concordam com o que for dito. Por exemplo: Faz de conta que a letra 'A' é o número 65. Dessa forma, sempre que for visto o número 65, de agora em diante, será vista a letra 'A' no lugar.&lt;/p&gt;
&lt;p&gt;Existem alguns faz-de-conta que são muito difundidos entre e humanidade informática. Um deles é chamado &lt;strong&gt;tabela ASCII&lt;/strong&gt; (se pronuncia &quot;ásqui&quot;). É uma forma de todos conseguirem entender os textos de todo mundo. Abaixo podemos ver a representação de todas as letras maiúsculas na codificação ASCII:&lt;/p&gt;
&lt;pre&gt;Número  Letra
======  =====
65      A
66      B
67      C
68      D
69      E
70      F
71      G
72      H
73      I
74      J
75      K
76      L
77      M
78      N
79      O
80      P
81      Q
82      R
83      S
84      T
85      U
86      V
87      W
88      X
89      Y
90      Z&lt;/pre&gt;
&lt;p&gt;Agora, imagine que você digitou o seguinte texto no bloco de notas:&lt;/p&gt;
&lt;pre&gt;CASA&lt;/pre&gt;
&lt;p&gt;Como esse texto é guardado na memória de um computador, se ele só entende números?&lt;/p&gt;
&lt;p&gt;Através da nossa já conhecida tabela ASCII! Na verdade, números são armazenados na memória, mas por representarem as letras 'C', 'A', 'S' e 'A', são traduzidos de volta para o formato texto pelo Bloco de Notas, que conhece o que guardou na memória.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/bloco-de-notas-acesando-memoria-ram.gif&quot; alt=&quot;Bloco de Notas acessando memória RAM.&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;A memória pode guardar qualquer coisa com números&lt;/h4&gt;
&lt;p&gt;A técnica de representação pode guardar qualquer coisa na memória como números que serão traduzidos por algum programa que consiga abrir aqueles dados. Dessa forma podemos não só armazenar texto, como imagens, vídeos, páginas web e até mesmo os próprios programas que os abrem!&lt;/p&gt;
&lt;p&gt;Na programação do dia-a-dia, as coisas funcionam da mesma forma. As tão faladas variáveis reservam um espaço de memória para guardar alguma coisa, mas só sabemos o que essa alguma coisa é através do tipo da variável:&lt;/p&gt;
&lt;pre&gt;&lt;font color=&quot;#339966&quot;&gt;// a variável idade (espaço de memória)
// pode guardar um número (tipo)&lt;/font&gt;
int idade; 

&lt;font color=&quot;#339966&quot;&gt;// a variável nome (espaço de memória) pode
// guardar o nome de alguém de até 99 letras (tipo)
&lt;/font&gt;char nome[100]; 

&lt;font color=&quot;#339966&quot;&gt;// a variável cad (espaço de memória) pode
// guardar o cadastro de uma pessoa (tipo)
&lt;/font&gt;Cadastro cad;&lt;/pre&gt;
&lt;p&gt;Esses elementos, na memória, são um bando de número que, sem os tipos, não possuem significado algum, como podemos ver na depuração do programa abaixo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/interpretacao-de-memoria-texto-e-numeros.png&quot; title=&quot;Interpretação de memória de texto e números em um programa C.&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/interpretacao-de-memoria-texto-e-numeros.png&quot; alt=&quot;Interpretação de memória de texto e números em um programa C.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Note que os números não estão aqui representados em decimal, onde se esperaria 35 e 42, pois a representação formal da memória geralmente está no formato hexadecimal, transformando esses números em 0x23 e 0x2a, respectivamente. Para entender essa diferença cabe estudar um pouco sobre base numérica, outro tema básico do programador sólido.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Practice makes perfect&lt;/h4&gt;
&lt;p&gt;Nada é bem aprendido se não for apreendido. Algumas tarefas programáticas que podem fixar o conceito de tipo estão listadas abaixo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usar &lt;strong&gt;printf &lt;/strong&gt;especificando tipos diversos (%d, %s, %f, %p, ...) para a mesma variável, inclusive correndo o risco de gerar algumas exceções.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;scanf&lt;/strong&gt; especificando diversas variáveis para o mesmo tipo (%d, %s, %f, %p, ...), vendo o resultado da leitura da entrada do usuário na memória.&lt;/li&gt;
&lt;li&gt;Tentar copiar o conteúdo de uma variável para outra variável de &lt;strong&gt;tipo diferente&lt;/strong&gt;. Sempre analise a memória para ver o resultado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Outros faz-de-conta bem famosos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)&quot; title=&quot;Extremidades na Wikipédia.&quot;&gt;Ordenação de extremidades&lt;/a&gt;: O problema Little Endian e Big Endian.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/UNICODE&quot; title=&quot;UNICODE na Wikipédia.&quot;&gt;UNICODE&lt;/a&gt;: Por um conjunto de letras universal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Convers%C3%A3o_de_base_num%C3%A9rica&quot; title=&quot;Base numérica na Wikipédia.&quot;&gt;Base numérica&lt;/a&gt;: O que são binário e hexadecimal e como eles afetam nossa vida.&lt;/li&gt;
&lt;/ul&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Por onde andas skhaz?</title>
		<link href="http://www.skhaz.com/blog/por-onde-andas-skhaz/"/>
		<id>http://www.skhaz.com/blog/?p=20</id>
		<updated>2008-12-10T14:45:19+00:00</updated>
		<content type="html">&lt;p&gt;Depois de um bom tempo sem postar, devido há inumeras coisas, como mudança de emprego, escolher um toolkit para criação de &amp;#8216;GUI&amp;#8217;s e aprende-lo, o fim de um namoro de 3 anos, e muita correria&amp;#8230; enfim o bom filho a casa retorna.&lt;/p&gt;
&lt;p&gt;A boa noticia é que aprendi muitas coisas novas (sem maldade xD) como as bibliotecas &lt;a href=&quot;http://trolltech.com/&quot;&gt;Qt&lt;/a&gt;, &lt;a href=&quot;http://www.skhaz.com/blog/category/cpp/feed/phonon.kde.org/&quot;&gt;phonon&lt;/a&gt;, &lt;a href=&quot;http://webkit.org/&quot;&gt;Webkit&lt;/a&gt;, e aprendi mais sobre as que eu já sabia (&lt;a href=&quot;http://www.boost.org/&quot;&gt;boost&lt;/a&gt; e stl), expressões regulares e até uma linguagem nova chamada &lt;a href=&quot;http://www.ruby-lang.org/pt/&quot;&gt;Ruby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eu sempre achei a idea de usar combobox, checkbox, etc como filtro uma idea complicada, ter que ficar marcando e depois clicar em filtrar, entao pensei em algo assim, basta voce digitar qualquer atributo do material que já vinha tudo que for relevante, por exemplo &amp;#8220;AL TR&amp;#8221;, já retorna todos os alumunios que são trifilados. No video da para se ter uma idea do que eu escrevi (claro que não é nenhum google, é bem simples)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;E aqui o codigo responsável pela busca&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;18
19
20
21
22
23
24
25
26
27
28
29
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;void&lt;/span&gt; ItemView&lt;span&gt;::&lt;/span&gt;&lt;span&gt;filterChanged&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; QString&lt;span&gt;&amp;amp;&lt;/span&gt; text&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;
	QString filter, query&lt;span&gt;;&lt;/span&gt;
	QStringList list &lt;span&gt;=&lt;/span&gt; text.&lt;span&gt;split&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot; &amp;quot;&lt;/span&gt;, QString&lt;span&gt;::&lt;/span&gt;&lt;span&gt;SkipEmptyParts&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; list.&lt;span&gt;size&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;++&lt;/span&gt;i&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
		filter.&lt;span&gt;append&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;QString&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot; %1 nome ILIKE '\%%2\%'&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;
			list.&lt;span&gt;size&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; i &lt;span&gt;!&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;&amp;quot; AND &amp;quot;&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;list.&lt;span&gt;at&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;&amp;#41;&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;
	&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	model&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;setFilter&lt;span&gt;&amp;#40;&lt;/span&gt;filter&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;Onde model é um ponteiro do tipo &lt;a href=&quot;http://doc.trolltech.com/4.4/qsqltablemodel.html&quot;&gt;QSqlTableModel&lt;/a&gt;, e o metodo setFilter nada mais é do que a inserção da clausa &lt;a href=&quot;http://www.w3schools.com/Sql/sql_where.asp&quot;&gt;WHERE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se voce quer aprender mais como a Qt implementa o padrão de projeto &lt;a href=&quot;http://en.wikipedia.org/wiki/Model-view-controller&quot;&gt;Model-View-Controller&lt;/a&gt; leia &lt;a href=&quot;http://doc.trolltech.com/4.4/model-view-programming.html&quot;&gt;aqui&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;É isso ae, espero que gostem, qualquer duvida, critica e/ou sujestões já sabem&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Delduca</name>
			<uri>http://www.skhaz.com/blog</uri>
		</author>
		<source>
			<title type="html">skhaz's blog » C++</title>
			<subtitle type="html">code::blog</subtitle>
			<link rel="self" href="http://www.skhaz.com/blog/category/cpp/feed/"/>
			<id>http://www.skhaz.com/blog/category/cpp/feed/</id>
			<updated>2009-07-03T16:42:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2008/12/06/elua-embedded-systems-no-mundo-de-lua/"/>
		<id>http://techberto.wordpress.com/?p=143</id>
		<updated>2008-12-06T13:19:23+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;    Em 1996 eu fiquei extremamente feliz quando recebi minha edição da Dr.Dobbs e vi um artigo escrito por brasileiros chamado &amp;#8220;Lua: an extensible embedded language&amp;#8221;, confesso que fiquei tão surpreso que acabei comentando com vários colegas sobre o artigo e sobre esta linguagem que eu já tinha ouvido falar mas não conhecia ainda e acabei ficando com o estigma de ser o &amp;#8220;cara do Lua&amp;#8221; por alguns meses. Oito anos depois, ao encontrar um colega de faculdade ele veio me perguntar se eu &amp;#8220;ainda&amp;#8221; programava em Lua.&lt;/p&gt;
&lt;p&gt;    Após 11 anos, tive outra boa surpresa quando conheci o projeto eLua, que é mantido pelo romeno &lt;strong&gt;&lt;a href=&quot;http://www.giga.puc-rio.br/cgi-bin/elua.cgi?p=Contact&quot;&gt;Bogdan Marinescu&lt;/a&gt;&lt;/strong&gt; em conjunto com o brasileiro &lt;strong&gt;&lt;a href=&quot;http://www.giga.puc-rio.br/cgi-bin/elua.cgi?p=Contact&quot;&gt;Dado Sutter &lt;/a&gt;&lt;/strong&gt; do laboratório LED da &lt;a href=&quot;http://www.puc-rio.br/&quot;&gt;PUC-Rio&lt;/a&gt;, que basicamente é um projeto que insere Lua no contexto de programação de microcontroladores, oferecendo melhor reusabilidade de código e redução de complexidade e custo de desenvolvimento. &lt;/p&gt;
&lt;p&gt;    Hoje ele tem suporte para as plataformas LM3S, AT91SAM, STR9, STR7, LPC2888, i386 e segundo o Dado Sutter logo o eLua estará suportando novas MCUs, assim como mais exemplos tem sido escritos com boa frequencia e novos módulos estão em desenvolvimento.  Eu o testei no meu &lt;a href=&quot;http://techberto.wordpress.com/2008/10/26/open-hardware-meus-insetos/&quot; target=&quot;_blank&quot;&gt;AT91SAM7&amp;#215;256 &lt;/a&gt;e  fiquei muito entusiasmado com o projeto.   &lt;/p&gt;
&lt;p&gt;    Para quem ficou interessado em saber um pouco mais sobre o e-Lua,  o projeto está com um novo site &amp;#8211; baseado no &lt;a href=&quot;http://sputnik.freewisdom.org/&quot; target=&quot;_blank&quot;&gt;Sputnik&lt;/a&gt;  que é um Wiki engine 100% escrito em Lua &amp;#8211;  e a URL oficial do projeto é   &lt;a href=&quot;http://www.eluaproject.net/&quot; target=&quot;_blank&quot;&gt;www.eluaproject.net&lt;/a&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/143/&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=143&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Inno::Blog /* by Alberto Fabiano */</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>2009-07-03T16:38:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Básico do básico: ponteiros</title>
		<link href="http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros"/>
		<id>http://www.caloni.com.br/blog/archives/basico-do-basico-ponteiros</id>
		<updated>2008-12-06T04:42:22+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/alicerces.png&quot; title=&quot;Alicerces de uma casa.&quot; alt=&quot;Alicerces de uma casa.&quot; align=&quot;left&quot; /&gt;Nessas últimas semanas tenho gastado meu tempo junto da mais nova pupila da &lt;a href=&quot;http://www.scua.com.br&quot; title=&quot;SCUA Segurança da Informação S/A&quot;&gt;SCUA&lt;/a&gt;, aspirante a programadora em C e Install Shield Script. Minha tarefa? Explicar tudo, desde o mais simples, como &lt;strong&gt;variáveis&lt;/strong&gt;, até as coisas não tão triviais, como &lt;strong&gt;símbolos de depuração&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Posso afirmar que tem sido muito compensador ativar algumas partes do meu cérebro que acreditava nem mais existirem. Rever velhos conceitos, apesar de manjados, nos dá a oportunidade de lembrar que as coisas mais complexas que construímos no dia-a-dia se baseiam em um punhado de preceitos básicos que é essencial ter na cabeça. E nunca esquecê-los.&lt;/p&gt;
&lt;p&gt;Meu amigo costuma chamar esses preceitos básicos de &lt;strong&gt;fundamentais&lt;/strong&gt;. Isso por um bom motivo lógico e semântico: tudo que aprendemos de básico sobre qualquer área de conhecimento serve-nos de &lt;strong&gt;base&lt;/strong&gt; para suportar as outras coisas que virão a ser entendidas na mesma área de conhecimento. Ou seja: é &lt;strong&gt;a parte mais importante a ser aprendida&lt;/strong&gt;. Sem ela, a base, não nos é possível construir nada &lt;strong&gt;sólido&lt;/strong&gt; e &lt;strong&gt;duradouro&lt;/strong&gt;. Sem ela, toda a estrutura construída &lt;em&gt;a posteriori&lt;/em&gt; se rompe e vai abaixo.&lt;/p&gt;
&lt;p&gt;Foi partindo desse princípio que me preocupei com esmero para explicar as peças mais fundamentais do conhecimento em jogo, formadoras da cabeça de um programador para sempre, seja em C como em qualquer outra linguagem. E como nada é bem explicado sem formar imagens na cabeça, aproveitei para desenhar alguns esboços no papel. Aqui vão algumas explicações que estive artisticamente &quot;documentando&quot; para minha nova colega.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose01.jpg&quot; title=&quot;Primeira tentativa de explicar ponteiros por desenhos da memória.&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose01.thumbnail.jpg&quot; alt=&quot;Primeira tentativa de explicar ponteiros por desenhos da memória.&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose02.jpg&quot; title=&quot;Segunda tentativa de explicar ponteiros por desenhos da memória.&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose02.thumbnail.jpg&quot; alt=&quot;Segunda tentativa de explicar ponteiros por desenhos da memória.&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.jpg&quot; title=&quot;Terceira tentativa de explicar ponteiros por desenhos da memória.&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.thumbnail.jpg&quot; alt=&quot;Terceira tentativa de explicar ponteiros por desenhos da memória.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Ponteiro: o eterno vilão da história&lt;/h4&gt;
&lt;p&gt;Não tenho a presunção de conseguir explicar 100% para alguém iniciante o que são ponteiros em C, como usá-los e como se proteger deles. Definitivamente ponteiro não é um conceito simples, apesar de básico, e posso dizer sem vergonha que demorei cerca de seis meses no meu aprendizado em C pra entender completamente tudo relacionado com ponteiros. Demorou, quebrei a cabeça, mas depois nunca mais esqueci.&lt;/p&gt;
&lt;p&gt;De acordo com o meu amigo &lt;a href=&quot;http://www.sk5.com.br&quot; title=&quot;Saite do meu amigo Rafael.&quot;&gt;Rafael&lt;/a&gt;, a melhor definição que usei até hoje para explicar esse conceito envolvia um armário repleto de gavetas, todas numeradas em ordem de posição (1, 2, 3...). Cada gaveta podia guardar qualquer coisa, inclusive o número de outra gaveta em um pedaço de papel. Com isso, eu poderia guardar em uma gaveta aleatória o que eu precisava guardar e escrever o &quot;endereço&quot; dessa gaveta em um pedaço de papel e guardá-lo na gaveta número 1, por exemplo. Com isso poderia até esquecer a posição onde está o que eu guardei, pois bastava abrir a gaveta número 1 e ler a posição em que estava essa gaveta.&lt;/p&gt;
&lt;p&gt;Deve ter ficado óbvio, mas se não ficou: o armário é a memória RAM, as gavetas são váriáveis e as gavetas onde guardamos pedaços de papel são ponteiros, que não deixam de ser variáveis, e apontam para outras gavetas que são... adivinha? Outras variáveis!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif&quot; title=&quot;Gavetas representando posições na memória.&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-drawer.gif&quot; alt=&quot;Gavetas representando posições na memória.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/pointers-rose03.jpg&quot; title=&quot;Terceira tentativa de explicar ponteiros por desenhos da memória.&quot;&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Outros conceitos que costumo utilizar é relacionar a memória RAM com a memória do programa e contar a memória como se contam carneirinhos. Dessa forma fica fácil pelo menos entender dois conceitos fundamentais na arte dos ponteiros: memória e endereço.&lt;/p&gt;
&lt;h4&gt;Practice makes perfect&lt;/h4&gt;
&lt;p&gt;O segundo passo, acredito eu, é entender como a memória é dimensionada através do programa, e como o tipo molda a representação dos bits e bytes através das ligações de silício, mas isso fica pra mais tarde. Temos que programar, e é isso que vai de fato fazer a diferença no aprendizado de uma linguagem como C. Nada como uma boa mistura de teoria e prática para gerar um concreto armado que irá suportar um &lt;a href=&quot;http://pt.wikipedia.org/wiki/Empire_State_Building&quot; title=&quot;Edifício Empire State&quot;&gt;Empire State&lt;/a&gt; de conhecimento.&lt;/p&gt;
&lt;p&gt;Por isso, segue uma lista de tarefas interessantes para exercitar o conceito de ponteiros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Criar funções que modificam números passados como parâmetro.&lt;/li&gt;
&lt;li&gt;Criar funções que modificam texto passado como parâmetro.&lt;/li&gt;
&lt;li&gt;Alocar e desalocar memória dinamicamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tarefas mais específicas da minha área e que uso o tempo todo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escrever e ler texto em arquivos.&lt;/li&gt;
&lt;li&gt;Escrever e ler no registro do Windows.&lt;/li&gt;
&lt;li&gt;Obter o endereço de uma função do Windows dinamicamente. E chamá-la.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Nota: Não use as classes superiores de C++ nem referências. Estou falando de estudar ponteiros nua e cruamente. Não seja preguiçoso. Algumas coisas devem ser feitas da maneira mais &quot;primitiva&quot; até se entender com o que se está lidando. Lembre-se que os melhores programadores possuem os alicerces mais fortes.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2008/12/04/prospeccoes/"/>
		<id>http://techberto.wordpress.com/?p=139</id>
		<updated>2008-12-04T16:29:06+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Talvez um teco influenciado pelo documento &amp;#8220;&lt;a href=&quot;http://www.sagres.org.br/biblioteca/metodologia.pdf&quot;&gt;Prospectiva Estratégica, Metodologia de Descrição de Cenários&lt;/a&gt;&amp;#8221; temperada a puro palpite visionário, outro dia quando na piclistbr o Mak lançou esta:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1996 &amp;#8211; um supercomputador usava 10 mil processadores Pentium Pro clocados a&lt;br /&gt;
200 MHz pra atingir 1 teraflops (um trilhão de operações matemáticas por&lt;br /&gt;
segundo). ocupava um andar inteiro de um laboratório no Novo México. Ele&lt;br /&gt;
consumia absurdos 500 kW e, pasme, mais 500 kW só de cooler, ar-condicionado&lt;br /&gt;
e tudo o mais para manter a sala geladinha e não pifar a bagaça.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2008 &amp;#8211; uma Radeon HD 4870, placa de video das mais rápidas atualmente,&lt;br /&gt;
atinge esse mesmo número de flops com apenas um chip. A placa de vídeo da&lt;br /&gt;
AMD, assim como as outras dessa categoria, cabe num slotzinho PCI Express e&lt;br /&gt;
gasta 110 watts, o que já é uma cavalice.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2015 &amp;#8211; tentem fazer uma projeção&amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fonte: PAPO DE MICREIRO: &lt;/em&gt;&lt;em&gt;&lt;a href=&quot;http://info.abril.com.br/blog/papodemicreiro/20081104_listar.shtml?125707&quot; target=&quot;_blank&quot;&gt;O lado hardcore da tecnologia, &lt;/a&gt;&lt;span&gt;&lt;a href=&quot;http://info.abril.com.br/blog/papodemicreiro/20081104_listar.shtml?125707&quot; target=&quot;_blank&quot;&gt;   Placa de vídeo ou arma de detonação em massa&lt;/a&gt;? por Marco Aurélio Zanni&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;E lancei o seguinte cenário:&lt;/p&gt;
&lt;p&gt;2050: Life, the Universe and Everything:  q-bits e processamento de&lt;br /&gt;
chuckflops por segundo serão triviais. Seth Lloyd e Miguel Nicolelis&lt;br /&gt;
serão mais populares que Von Newman e Alan Turing. Haverá dispositivos&lt;br /&gt;
computacionais com processamento de chuckflops do tamanho de um&lt;br /&gt;
alfinente  usados como implantes com baterias recarregáveis via&lt;br /&gt;
wireless. Todo boteco terá um recarregador wireless. Estes implantes&lt;br /&gt;
computacionais usarão o protocolo 802.11xyz para se conectar com a&lt;br /&gt;
spacenet, seja da Terra ou de Marte e a segunda língua mundial será o&lt;br /&gt;
chinês. Via 802.11xyz q-telepatia será algo muito comum; porém isto&lt;br /&gt;
será coisas para os jovens, a galerinha de 80 e 90 anos ainda usará&lt;br /&gt;
menssegers baseado nos protocolos XMPP em seus handhelds.&lt;/p&gt;
&lt;p&gt;A plebe ainda usará estes dispositivos de 2015, com PCs digitais com&lt;br /&gt;
placas de vídeo com meros 100 teraflops consumindo os exagerados 70&lt;br /&gt;
Watts, utilizando toda a arcaica tecnologia digital binária. Ainda&lt;br /&gt;
existirão analfabetos digitais e ONGs lutando contra a fome mundial,&lt;br /&gt;
isto em 2050.&lt;/p&gt;
&lt;p&gt;2100: Em 2100 os Estados Unidos elegerá o primeiro presidente&lt;br /&gt;
marciano, descendente de terráqueos chineses e brasileiros, que foram&lt;br /&gt;
para a colônia marciana em 2060, que se promoveu a base de q-telepatia.&lt;/p&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;p&gt;OK: Para justificar este minha prospecção eu teria que escrever um relatório de mais de 100 páginas, mas está aí um cenário factível, não exatamente nestas datas e com esta terminologia, mas num futuro não muito distante.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/139/&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=139&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Inno::Blog /* by Alberto Fabiano */</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>2009-07-03T16:38:27+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Vídeo-Palestra: Unit Testing</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/aYSpTac2K70/vdeo-palestra-escrevendo-cdigo-limpo-e.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-4564202410144442725</id>
		<updated>2008-11-25T23:04:55+00:00</updated>
		<content type="html">Ótimo vídeo sobre escrita de código limpo e testável, do Google Tech Talks. Se você ainda não percebeu ou não está convencido de que o uso de TDD vale à pena, não deixe de assistí-lo.    FICHA DO VÍDEOPalestra	: Unit TestingPalestrante	: Misko Hevery, Agile Coach do GoogleEvento	: The Clean Code Talks, do Google Tech TalksData	: 30 de outubro de 2008Idioma	: Inglês</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Watching directory AND Application Restart/Recovery</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!193.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!193</id>
		<updated>2008-11-18T15:23:10+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This is a sample using Visual C++ and Windows API that works with Windows Vista or later.&lt;/div&gt;
&lt;div&gt;The main purpose is to show how to use &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb982198.aspx&quot;&gt;Standard C++ Library TR1 Extensions Reference&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa364417.aspx&quot; target=&quot;_blank&quot;&gt;directory change notification&lt;/a&gt; and &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc948909(VS.85).aspx&quot;&gt;application restart/recovery (ARR)&lt;/a&gt; in native code.&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;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;process.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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iostream&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;functional&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std; &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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std::tr1; &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;#ifdef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; _UNICODE&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;#define&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; _tcout wcout&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;#define&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; _tstring wstring&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;#else&lt;br /&gt;#define&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; _tcout cout&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;#define&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; _tstring string&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;#endif&lt;br /&gt;&lt;br /&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; DirectoryWatcher&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;public&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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;typedef&lt;/font&gt;&lt;/font&gt; std::tr1::function&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt; (LPCTSTR)&amp;gt; NotifyChangeHandler;&lt;br /&gt;&lt;br /&gt;DirectoryWatcher( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; wstring&amp;amp; dir, NotifyChangeHandler changeCallback ) : &lt;br /&gt;&lt;br /&gt;Dir_(dir), Started_(&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;false&lt;/font&gt;&lt;/font&gt;), ChangeCallback_(changeCallback)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&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; Start()&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( !Started_ )&lt;br /&gt;  {&lt;br /&gt;    Started_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;true&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#444444&quot;&gt;    &lt;/font&gt;unsigned&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; threadId;&lt;br /&gt;    HANDLE threadHandle = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;HANDLE&amp;gt;(_beginthreadex( NULL, 0, WatchDirectory, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt;&lt;/font&gt;, NULL, &amp;amp;threadId )); &lt;br /&gt;    CloseHandle(threadHandle);&lt;br /&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;private&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;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;unsigned&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; WINAPI WatchDirectory( LPVOID pArguments )&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;DirectoryWatcher* w = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;DirectoryWatcher*&amp;gt;(pArguments);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;w-&amp;gt;_WatchDirectory();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; 0;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;}&lt;br /&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; _WatchDirectory()&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;LPCTSTR dir = Dir_.c_str();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;HANDLE handleToWatch = FindFirstChangeNotification( dir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt; ( INVALID_HANDLE_VALUE == handleToWatch ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;         &lt;/font&gt;ExitProcess(GetLastError()); &lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    while&lt;/font&gt;&lt;/font&gt; (TRUE) &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;        if&lt;/font&gt;&lt;/font&gt;( WAIT_OBJECT_0 == WaitForSingleObject( handleToWatch, INFINITE ) ) &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;ChangeCallback_( dir );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;            if&lt;/font&gt;&lt;/font&gt; ( !FindNextChangeNotification( handleToWatch ) ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;                &lt;/font&gt;ExitProcess(GetLastError()); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        else&lt;br /&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;ExitProcess(GetLastError()); &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 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;br /&gt;&lt;font size=&quot;1&quot;&gt;private&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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;DirectoryWatcher(){}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;DirectoryWatcher( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; DirectoryWatcher&amp;amp; ){}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;DirectoryWatcher&amp;amp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;operator&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; DirectoryWatcher&amp;amp; ){}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  const&lt;/font&gt;&lt;/font&gt; wstring Dir_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  bool&lt;/font&gt;&lt;/font&gt; Started_;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;NotifyChangeHandler ChangeCallback_;&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;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; OnDirectoryChange( LPCTSTR lpDir )&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Refresh the directory &amp;quot;&lt;/font&gt;&lt;/font&gt;) &amp;lt;&amp;lt; lpDir &amp;lt;&amp;lt; endl;&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;typedef&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; std::tr1::function&amp;lt;&lt;/font&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; (&lt;/font&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;)&amp;gt; DoRecoveryHandler;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;DWORD WINAPI PrepareToRecover( PVOID pArgument )&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;BOOL bCanceled = FALSE;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Preparing recovery...\n&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;ApplicationRecoveryInProgress( &amp;amp;bCanceled );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt; (!bCanceled) &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;    if&lt;/font&gt;&lt;/font&gt;( pArgument )&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;DoRecoveryHandler* recoveryFun = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;DoRecoveryHandler*&amp;gt;(pArgument);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;(*recoveryFun)();&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 size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  else&lt;br /&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;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Recovery was canceled by the user.\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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Recovery completed...\n&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;ApplicationRecoveryFinished((bCanceled) ? FALSE: TRUE);&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; 0;&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;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; RecoverFromRestart()&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Perform recovery from restart...\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;bool&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; IsApplicationRestarting( &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; _tstring&amp;amp; cmdLine, LPCWSTR restartFlag )&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; _tstring::npos != cmdLine.find( restartFlag ); &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;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; OnDoCustomRecover()&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Custom recovery procedure...\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;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;_tstring cmdLine( GetCommandLine() );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;LPCWSTR restartFlag = TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;/restart&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  bool&lt;/font&gt;&lt;/font&gt; isAppRestarting = IsApplicationRestarting( cmdLine, restartFlag );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Command Line = &amp;quot;&lt;/font&gt;&lt;/font&gt;) &amp;lt;&amp;lt; cmdLine.c_str() &amp;lt;&amp;lt; TEXT(&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 color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( isAppRestarting ) RecoverFromRestart();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;HRESULT hr = RegisterApplicationRestart( restartFlag, 0 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( FAILED( hr ) )&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;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Restart registration failed\n&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; 1;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;DoRecoveryHandler customRecovery( OnDoCustomRecover );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;hr = RegisterApplicationRecoveryCallback( PrepareToRecover, &amp;amp;customRecovery, RECOVERY_DEFAULT_PING_INTERVAL, 0 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( FAILED( hr ) )&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;_tcout &amp;lt;&amp;lt; TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;Recovery registration failed\n&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; 2;&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 color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;DirectoryWatcher dw( TEXT(&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;D:\\Test\\&amp;quot;&lt;/font&gt;&lt;/font&gt;), OnDirectoryChange );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;dw.Start();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( !isAppRestarting )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;{&lt;br /&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;#0000ff&quot;&gt;    &lt;/font&gt;//force restarting...&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;Sleep(60 * 1000 + 1 * 1000);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;RaiseException( EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_NONCONTINUABLE_EXCEPTION, NULL, NULL );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  else&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;{&lt;br /&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;#0000ff&quot;&gt;  &lt;/font&gt;//continue...&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;Sleep( 60 * 60 * 1000 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;}&lt;br /&gt;}&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;According to &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa373347(VS.85).aspx&quot;&gt;ARR documentation&lt;/a&gt;: &amp;quot;To prevent cyclical restarts, the system will only restart the application if it has been running for a minimum of 60 seconds.&amp;quot;&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Evento: CodeRage 2008 (online)</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/jBhAlVAxOFw/evento-coderage-2008-online.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-7594970321174384991</id>
		<updated>2008-11-15T08:20:00+00:00</updated>
		<content type="html">De 1 à 5 de dezembro rola o 3º CodeRage, evento online promovido pela Embarcadero, que apresenta diversas palestras em sessões onde é possível trocar informações com outros desenvolvedores, analisar ferramentas de desenvolvimento e muitas outras coisas. São mais de 80 sessões, com algumas palestras em Português do Brasil.  Dentro alguns assuntos abordados estão (vou listar em inglês, que é como</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Ferramentas de apoio Win32: pskill</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/tools_pskill"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/tools_pskill</id>
		<updated>2008-10-31T16:55:51+00:00</updated>
		<content type="html">&lt;p&gt;O &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx&quot;&gt;pskill&lt;/a&gt; é mais um ferramenta Sysinternals sem a qual a vida fica muito difícil. A única coisa que ele faz - e bem feito - é matar um processo. Parece simples, mas quando você precisa matar 7 processos toda vez que seu servidor dá pau, uma bat cheia de chamadas ao pskill pode salvar a sua vida.&lt;/p&gt;

&lt;p&gt;Alguns usos:

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Ela aceita tanto o nome do processo quanto o PID&lt;/b&gt;: você pode chamar &lt;i&gt;pskill notepad.exe&lt;/i&gt; ou &lt;i&gt;pskill 4576&lt;/i&gt;.

&lt;li&gt;&lt;b&gt;Quando você usa o nome, ele mata TODOS os processos com o mesmo nome&lt;/b&gt;: Ou seja, um &lt;i&gt;pskill notepad.exe&lt;/i&gt; vai matar TODAS as instância do notepad. Se você quer matar uma instância específica, use o PID. Se precisar saber o PID do processo em command line, use o pslist, ferramenta que veremos em mais detalhes depois.

&lt;li&gt;&lt;b&gt;Matar um processo e todos criados por ele&lt;/b&gt;: &lt;i&gt;pskill -t meu-servico.exe&lt;/i&gt;. Mata o processo pai e toda sua família.

&lt;li&gt;&lt;b&gt;Funciona remotamente&lt;/b&gt;: você pode chamar &lt;i&gt;pskill \\outra-maquina notepad.exe&lt;/i&gt; ou &lt;i&gt;pskill \\outra-maquina 4576&lt;/i&gt;. Como sempre, você precisa ter permissão para isso na máquina remota

&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Informação muito importante: &lt;i&gt;pskill \\maquina-remota winlogon.exe&lt;/i&gt; causa um BugCheck (tela azul) instantâneamente na máquina remota. Use com moderação.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/tools_pskill#comments&quot;&gt;4 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/weblog_rss.1bit</id>
			<updated>2009-07-04T04:00:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Delphi Generics: Diferenças entre compiladores</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/i8Tyje5z7qw/delphi-generics-diferenas-entre.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-6986433167865401043</id>
		<updated>2008-10-30T04:57:05+00:00</updated>
		<content type="html">Tanto o Free Pascal Compiler (FPC) quanto o CodeGear Delphi possuem suporte a generics, as extensões que permitem definir quais tipos de dados serão usados por classes ou funções (por exemplo) no momento de sua declaração. Hoje há uma tendência da adoção de generics em praticamente todas as linguagens OO. C++ tem seus templates desde o ISO C++94, Java adotou generics a partir de sua versão J2SE</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">C++: Multi-dimensional analog literals</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/egyv6cyLSRg/c-multi-dimensional-analog-literals.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-7754580946631710184</id>
		<updated>2008-10-30T02:48:19+00:00</updated>
		<content type="html">Interessante as coisas que podemos fazer com C++ padrão.Veja um exemplo de uma biblioteca construída com templates para simular a construção de objetos multi-dimensionais através de seu formato. Criar linhas, retângulos e cubos assim fica até mais divertido. ;)Multi-Dimensional Analog Literals</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Evento: C e C++ para Sistemas Embarcados</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/HEu40JvT8AI/evento-c-e-c-para-sistemas-embarcados.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-8690136032380813641</id>
		<updated>2008-10-28T13:42:15+00:00</updated>
		<content type="html">Acontece em São Paulo no dia 8 de novembro, sábado, um evento sobre Sistemas Embarcados, onde serão abordados algumas temas interessantes, como: Técnicas de Programação em C para Sistemas EmbarcadosUtilização de C++ em MicrocontroladoresExplorando os 16 bits da Microchip e as ferramentas de trabalhoOtimização de código C para sistemas embarcadosDesenvolvimento Embedded no Mundo da eLuaAs</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">TDD na Prática - Parte II: Verificação e Confiabilidade</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/EroHKMAKDhY/tdd-na-prtica-parte-ii-verificao-e.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-3453067586183500128</id>
		<updated>2008-09-27T16:28:20+00:00</updated>
		<content type="html">Como visto na Parte I, para criar código (que seja facilmente) &quot;testável&quot; é preferível escrever código que o testa primeiro.   Exercitar o código verificando seus limites e estados auxilia na descoberta de como o mesmo deve se comportar e traz um maior controle sobre seu funcionamento. Conseqüentemente, culmina em um maior nível de confiabilidade.  Tornar freqüente a verificação do código, de</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">V</title>
		<link href="http://www.caloni.com.br/blog/archives/v"/>
		<id>http://www.caloni.com.br/blog/archives/v</id>
		<updated>2008-09-23T03:12:21+00:00</updated>
		<content type="html">&lt;p&gt;Parabéns a todos que participaram e ajudaram para que todos nós chegássemos ao quinto encontro de programadores/aficionados C/C++. Parece mentira, mas hoje temos capacidade para lotar um auditório razoável, e temos a ousadia de sempre poder contar com uma grade de palestras pra lá de avançadas. Vejamos o que foi visto até hoje nesses últimos três encontros (&lt;a href=&quot;http://www.caloni.com.br/blog/archives/cppcon-iii&quot;&gt;III&lt;/a&gt;, &lt;a href=&quot;http://www.caloni.com.br/blog/archives/quarto-encontro-c&quot;&gt;IV&lt;/a&gt; e o &lt;a href=&quot;http://www.caloni.com.br/blog/archives/seminario-ccpp-portabilidade-e-performance&quot;&gt;seminário&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C++ com WxWidgets&lt;/li&gt;
&lt;li&gt;O novo padrão C++0x&lt;/li&gt;
&lt;li&gt;Threads no C++ ISO&lt;/li&gt;
&lt;li&gt;C e microcontroladores&lt;/li&gt;
&lt;li&gt;Drivers para Windows&lt;/li&gt;
&lt;li&gt;TCP/IP via Boost.Asio&lt;/li&gt;
&lt;li&gt;C++ com Qt&lt;/li&gt;
&lt;li&gt;Dicas de portabilidade&lt;/li&gt;
&lt;li&gt;Programação concorrente&lt;/li&gt;
&lt;li&gt;C++ com STL/Boost&lt;/li&gt;
&lt;li&gt;Otimização de código&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E esse é só o começo.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_V&quot; title=&quot;C++ Brasil&quot;&gt;Grade para o Quinto Encontro CCPP&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;04 de outubro de 2008, São Paulo, Brasil&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ferramentas para programação C++ para Windows por Rodrigo Strauss&lt;/li&gt;
&lt;li&gt;Programando com Conceitos no novo C++ por Leandro Melo&lt;/li&gt;
&lt;li&gt;Arquivos de memória mapeada no Windows com C++ por Basílio Miranda&lt;/li&gt;
&lt;li&gt;Explorando o Windows (Vista &amp;amp; Server 2008) com C++ por Fábio Galuppo&lt;/li&gt;
&lt;li&gt;Criando Linguagens Embutidas para Otimização por Felipe Almeida&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;a href=&quot;http://www.temporealeventos.com.br/?area=118&amp;tipo=1&amp;id=2295&quot; title=&quot;Tempo Real&quot;&gt;Grade para o Evento C &amp;amp; C++ Para Sistemas Embarcados&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;08 de novembro de 2008, São Paulo, Brasil&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Técnicas de Programação em C para Sistemas Embarcados por Daniel Quadros&lt;/li&gt;
&lt;li&gt;Utilização de C++ em Microcontroladores por Luiz Barros&lt;/li&gt;
&lt;li&gt;Explorando os 16 bits da Microchip e as ferramentas de trabalho por Daniel Rodrigues&lt;/li&gt;
&lt;li&gt;Otimização de código C para sistemas embarcados por Fábio Pereira&lt;/li&gt;
&lt;li&gt;Desenvolvimento Embedded no Mundo da eLua por Dado Sutter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se repararam, o número de palestras foi acrescido de um (palestras++) e o tempo para cada uma delas foi ligeiramente encolhido. Espero que esse não seja um empecilho para o desenvolver dos assuntos, pois existem alguns bem delicados acima (como a linguagem embutida e memória mapeada) para serem explicados em cerca de uma hora.&lt;/p&gt;
&lt;p&gt;É isso aí. Vida longa ao C++! (e ao C! e ao COBOL! e ao FORTRAN!)&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Vídeo-Palestra: Modelagem Ágil</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/07XGrCPCynI/vdeo-palestra-modelagem-gil.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-4435911416528767069</id>
		<updated>2008-09-16T23:22:13+00:00</updated>
		<content type="html">Palestra sobre Modelagem Ágil em português.                 Palestrante:         Manoel Pimentel                   Evento:         TDC 2008</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">TDD na Prática - Parte III: Abstração, Simplificação e o Ciclo do TDD</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/DpVSy1tb6bg/tdd-na-prtica-parte-iii-abstrao.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-3525926213081491393</id>
		<updated>2008-09-06T19:36:54+00:00</updated>
		<content type="html">Conhecer como verificar as partes do software e estabelecer o nível de abstração para obter os dados a serem verificados é um ponto vital quando se escreve código de teste.  Expor uma interface simples em uma classe e esconder seus detalhes de implementação é imprescindível para alcançar um modelo de fácil reutilização, substituição e que possa ser facilmente testado. Dependências entre</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">TDD na Prática - Parte 1: Influência no Design</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/9l-7B3qTYRw/tdd-na-prtica-parte-1-influncia-no.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-1139314563801014955</id>
		<updated>2008-09-06T17:27:03+00:00</updated>
		<content type="html">Para se ter uma idéia rápida de como é TDD na prática, criarei um joguinho bem simples, e de conhecimento geral, que deve servir como exemplo: o Jogo da Velha. (Se você não teve infância ou sofre de perda grave de memória, consulte as regras aqui. :)  Para verificar se a implementação do jogo estará correta, escreverei código que a teste. Mas daí vem algumas questões:      Como terei certeza de</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Vídeo-Palestra: Extreme Programming</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/nUTf_Fixk9w/vdeo-palestra-desenvolvimento-gil.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-3675322929207689960</id>
		<updated>2008-08-24T19:08:07+00:00</updated>
		<content type="html">Palestra recomendada para quem quer conhecer melhor como é o desenvolvimento ágil utilizando Extreme Programming. Em português (!).                    Palestrante:        Vinícius Manhães Teles, da ImproveIt                  Evento:        TDC 2008</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Interação e Substituição de Objetos</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/X-2qulGnfos/interao-e-substituio-de-objetos.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-5281997151661565087</id>
		<updated>2008-08-21T10:24:24+00:00</updated>
		<content type="html">Ter uma visão clara de como os objetos interagem é um fator fundamental no desenvolvimento de software orientado a objetos. É até mais importante do que saber como cada objeto funciona isoladamente.  Pensando que um software O. O. é uma espécie de teia de objetos que se interconectam, fazendo de sua interação o fator gerador do comportamento do software, mudar seu comportamento será como plugar</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">O que virá</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/fp8mgn1E398/o-que-vir.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-8689128932183327278</id>
		<updated>2008-08-19T22:27:24+00:00</updated>
		<content type="html">Uma idéia do que deve ser visto por aqui:  Metodologias e Processos  Muita gente ainda desconhece ou tem uma visão um tanto turva sobre Metodologias Ágeis, Scrum, XP, TDD, etc. e de diversos outros assuntos relacionados a metodologias de desenvolvimento de software.  Espero deixar aqui minha contribuição para esclarecer alguns pontos, com enfoque prático, fazendo um balanço sempre pragmático.</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Blog::Start()</title>
		<link href="http://feedproxy.google.com/~r/devhints/~3/DwN48mVQl0M/bloginstancestart.html"/>
		<id>tag:blogger.com,1999:blog-41480276002288545.post-988228201017003022</id>
		<updated>2008-08-13T01:04:01+00:00</updated>
		<content type="html">{      if ( YouLikeSoftwareDevelopment() )          ThatsTheRightPlace();     else         GoToMyAnotherSite(); // www.thiagodp.blogspot.com  }</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>2009-07-03T16:42:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Reflexão em C++</title>
		<link href="http://www.caloni.com.br/blog/archives/reflexao-em-c"/>
		<id>http://www.caloni.com.br/blog/archives/reflexao-em-c</id>
		<updated>2008-06-30T04:02:38+00:00</updated>
		<content type="html">&lt;p&gt;O termo e conceito de &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Reflection_(computer_science)&quot;&gt;&lt;em&gt;reflection&lt;/em&gt;&lt;/a&gt;&quot; (&lt;a href=&quot;http://pt.wikipedia.org/wiki/Reflex%C3%A3o_%28programa%C3%A7%C3%A3o%29&quot;&gt;reflexão&lt;/a&gt;), muito usado em linguagens modernas, é a capacidade de um programa de observar e até de alterar sua própria estrutura. Bom, isso você pode ler na Wikipédia. O interessante é o que podemos usar desse conceito na linguagem C++.&lt;/p&gt;
&lt;p&gt;Infelizmente não muito.&lt;/p&gt;
&lt;p&gt;O sistema de &lt;strong&gt;RTTI&lt;/strong&gt; (&lt;em&gt;Run Time Type Identification&lt;/em&gt;), a identificação de tipos em tempo de execução, seria o começo do &lt;em&gt;reflection &lt;/em&gt;em C++. Foi um começo que não teve meio nem fim, mas existe na linguagem. Dessa forma podemos tirar algum proveito disso.&lt;/p&gt;
&lt;p&gt;Um leitor pediu para que eu falasse um pouco sobre essas coisas, especificamente como se faz para obter o nome da classe de onde estamos executando um determinado método. Para esse tipo de construção podemos usar o operado &lt;strong&gt;typeid&lt;/strong&gt;, que retorna informações básicas sobre um tipo de acordo com um tipo, instância ou expressão:&lt;/p&gt;
&lt;p&gt;&lt;pre&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;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;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span&gt;typeid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; &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;
&amp;nbsp;
	&lt;span&gt;int&lt;/span&gt; x;
	&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; x &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;
&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; &lt;span&gt;2&lt;/span&gt; + &lt;span&gt;2&lt;/span&gt; &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;
&amp;nbsp;&lt;/pre&gt;&lt;/p&gt;
&lt;pre&gt;C:\Tests&amp;gt;cl typeid.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid.exe
typeid.obj

C:\Tests&amp;gt;typeid.exe
int
int
int&lt;/pre&gt;
&lt;p&gt;Dessa forma, podemos nos aproveitar do fato que todo método não-estático possui a variável implícita &lt;strong&gt;this&lt;/strong&gt;, do tipo &quot;ponteiro constante para T&quot;, onde T é o tipo da classe que contém o método sendo chamado.&lt;/p&gt;
&lt;p&gt;&lt;pre&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;
class MyClass
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;public&lt;/span&gt;:
		&lt;span&gt;void&lt;/span&gt; MyMethod&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;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span&gt;typeid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;*&lt;span&gt;this&lt;/span&gt;&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; &lt;span&gt;&quot;::MyMethod&quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
		&lt;span&gt;&amp;#125;&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;
	MyClass myc;
&amp;nbsp;
	myc.&lt;span&gt;MyMethod&lt;/span&gt;&lt;span&gt;&amp;#40;&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;pre&gt;C:\Tests&amp;gt;cl typeid-class.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid-class.exe
typeid-class.obj

C:\Tests&amp;gt;typeid-class.exe
&lt;font color=&quot;#ff0000&quot;&gt;class MyClass::MyMethod&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;Com classes não-polimórficas a coisa parece não ter muita utilidade. No entanto, essa mesma técnica pode ser aplicada em classes derivadas, uma vez que o operador typeid pode trabalhar em tempo de execução:&lt;/p&gt;
&lt;p&gt;&lt;pre&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;
class MyClass
&lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;public&lt;/span&gt;:
		&lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; MyMethod&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;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span&gt;typeid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;*&lt;span&gt;this&lt;/span&gt;&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; &lt;span&gt;&quot;::MyMethod&quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
		&lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
class MyDerivatedClass1 : &lt;span&gt;public&lt;/span&gt; MyClass &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
class MyDerivatedClass2 : &lt;span&gt;public&lt;/span&gt; MyClass &lt;span&gt;&amp;#123;&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;
	MyClass* myc1 = &lt;span&gt;new&lt;/span&gt; MyDerivatedClass1;
	MyClass* myc2 = &lt;span&gt;new&lt;/span&gt; MyDerivatedClass2;
&amp;nbsp;
	myc1-&amp;gt;MyMethod&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
	myc2-&amp;gt;MyMethod&lt;span&gt;&amp;#40;&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;pre&gt;C:\Tests&amp;gt;cl typeid-class2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:typeid-class2.exe
typeid-class2.obj

C:\Tests&amp;gt;typeid-class2.exe
&lt;font color=&quot;#ff0000&quot;&gt;class MyDerivatedClass1::MyMethod
class MyDerivatedClass2::MyMethod&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;Apenas se lembre de ter de fato uma classe polimórfica (eu consegui isso tornando MyMethod uma função virtual). Do contrário você pode &lt;a href=&quot;http://www.caloni.com.br/blog/archives/typeid-e-os-perigos-do-nao-polimorfismo&quot;&gt;ter problemas&lt;/a&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Two versions for Lock-Free Stack</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!178</id>
		<updated>2008-06-24T11:01:30+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The two codes below are implementations of lock-free stack structure. &lt;/div&gt;
&lt;div&gt;The purpose is the same, but the first version can be ported easily to other OSes.&lt;/div&gt;
&lt;div&gt;Performance benchmark is a lesson to the reader.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The raw C++ implementation. In C++0x we'll change &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx&quot;&gt;Interlocked APIs&lt;/a&gt; to &lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2047.html&quot;&gt;atomic operations&lt;/a&gt;:&lt;/div&gt;
&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;1&quot;&gt;
&lt;div&gt;template &lt;/div&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;typename&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; T&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;struct&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; LockFreeStack&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  LockFreeStack() : Head_( NULL ){}&lt;br /&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; Push( T&amp;amp; value )&lt;br /&gt;  {&lt;br /&gt;    PNODE node = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt; NODE( value );&lt;br /&gt;    PNODE oldHead;&lt;br /&gt;&lt;br /&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;    do&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;    {&lt;br /&gt;      node-&amp;gt;Next = oldHead = Head_; &lt;br /&gt;    }&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;while&lt;/font&gt;&lt;/font&gt;( oldHead != &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PNODE&amp;gt;( InterlockedCompareExchangePointer( &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;                                      reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;volatile&lt;/font&gt;&lt;/font&gt; PVOID*&amp;gt;(&amp;amp;Head_), node, oldHead ))); &lt;br /&gt;  } &lt;/font&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  T Pop()&lt;br /&gt;  {&lt;br /&gt;    PNODE node;&lt;br /&gt;    PNODE oldHead;&lt;br /&gt;&lt;br /&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;    do&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;    {&lt;br /&gt;      oldHead = Head_; &lt;br /&gt;    }&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;while&lt;/font&gt;&lt;/font&gt;( oldHead != (node = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PNODE&amp;gt;( InterlockedCompareExchangePointer( &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;                                            reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;volatile&lt;/font&gt;&lt;/font&gt; PVOID*&amp;gt;(&amp;amp;Head_), Head_-&amp;gt;Next, oldHead ))));&lt;br /&gt;&lt;br /&gt;    T temp = node-&amp;gt;Data;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    delete&lt;/font&gt;&lt;/font&gt; node;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; temp;&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;private&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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  typedef&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;struct&lt;/font&gt;&lt;/font&gt; NODE_TAG&lt;br /&gt;  {&lt;br /&gt;    NODE_TAG( T value ) : Next(NULL), Data(value){} &lt;br /&gt;    NODE_TAG* Next; &lt;br /&gt;    T Data;&lt;br /&gt;  } NODE, *PNODE;&lt;br /&gt;&lt;br /&gt;  PNODE Head_;&lt;br /&gt;&lt;br /&gt;  LockFreeStack( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br /&gt;  LockFreeStack&amp;amp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;operator&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; LockFreeStack&amp;amp; ){}&lt;br /&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;&lt;font size=&quot;1&quot;&gt;&lt;br /&gt;&lt;/font&gt;Using a Windows API facility called &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms684121(VS.85).aspx&quot;&gt;Singly Linked Lists&lt;/a&gt;:  
&lt;p&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;template&lt;/font&gt;&lt;/font&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;typename&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; T&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;struct&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; LockFreeStack&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  LockFreeStack()&lt;br /&gt;  {&lt;br /&gt;    Head_ = new_aligned&amp;lt;SLIST_HEADER&amp;gt;(); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == Head_ )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;memory allocation failed&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;    InitializeSListHead( Head_ );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  ~LockFreeStack()&lt;br /&gt;  {&lt;br /&gt;    InterlockedFlushSList( Head_ );&lt;br /&gt;  }&lt;br /&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; Push( T value )&lt;br /&gt;  {&lt;br /&gt;    Item_ = new_aligned&amp;lt;ITEM&amp;gt;();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == Item_ )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;stack is full&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;/font&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;    Item_-&amp;gt;Value = value;&lt;br /&gt;    Entry_ = InterlockedPushEntrySList( Head_, &amp;amp;Item_-&amp;gt;Entry );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  T Pop()&lt;br /&gt;  {&lt;br /&gt;    PSLIST_ENTRY tempEntry = InterlockedPopEntrySList( Head_ );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( NULL == tempEntry )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      throw&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;stack is empty&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;    Item_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;PITEM&amp;gt;( tempEntry );&lt;br /&gt;    T temp = Item_-&amp;gt;Value;&lt;br /&gt;    _aligned_free( tempEntry );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; temp;&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;private&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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  typedef&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;struct&lt;/font&gt;&lt;/font&gt; ITEM_TAG&lt;br /&gt;  {&lt;br /&gt;    SLIST_ENTRY Entry;&lt;br /&gt;    T Value;&lt;br /&gt;  } ITEM, *PITEM;&lt;br /&gt;&lt;br /&gt;  PSLIST_ENTRY Entry_;&lt;br /&gt;  PSLIST_HEADER Head_;&lt;br /&gt;  PITEM Item_;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  template&lt;/font&gt;&lt;/font&gt; &amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt; M&amp;gt; M* new_aligned()&lt;br /&gt;  {&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    return&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;reinterpret_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;M*&amp;gt;(_aligned_malloc( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;sizeof&lt;/font&gt;&lt;/font&gt;(M), MEMORY_ALLOCATION_ALIGNMENT ));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  LockFreeStack( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; LockFreeStack&amp;amp; ){}&lt;br /&gt;  LockFreeStack&amp;amp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;operator&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; LockFreeStack&amp;amp; ){}&lt;br /&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;br /&gt;&lt;/font&gt; &lt;/div&gt;&lt;/p&gt;&lt;/p&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Samples from my Concurrency Talk at Seminário TempoReal C++ Portabilidade e Performance</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!176</id>
		<updated>2008-06-13T13:11:03+00:00</updated>
		<content type="html">&lt;div&gt;  &lt;/div&gt;
&lt;div&gt;Samples from my Concurrency Talk at &lt;a href=&quot;http://www.temporealeventos.com.br/?area=101&quot;&gt;Seminário TempoReal C++ Portabilidade e Performance&lt;/a&gt;:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Samples - Semin%c3%a1rio Tempo Real - C++ Portabilidade e Performance/Samples - Seminario TempoReal C++ Performance e Portabilidade.zip&quot;&gt;Concurrency C++ Samples&lt;/a&gt;
&lt;li&gt;&lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Samples - Semin%c3%a1rio Tempo Real - C++ Portabilidade e Performance/Programa%c3%a7%c3%a3o Concorrente com C++.pdf.zip&quot;&gt;Concurrency C++ Slides&lt;/a&gt; (in brazilian portuguese)&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;The following code is a C++ port to one of my previous samples: &lt;a href=&quot;http://fabiogaluppo.spaces.live.com/blog/cns!B671A4645AF2F2F4!150.entry&quot;&gt;MapReduce with Parallelspace&lt;/a&gt;&lt;/div&gt;
&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;div&gt;&lt;font size=&quot;1&quot;&gt;#include &lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iostream&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;fstream&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;vector&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;map&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;boost/thread/thread.hpp&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;boost/thread/mutex.hpp&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;boost/filesystem.hpp&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;boost/function.hpp&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;br /&gt;&lt;font size=&quot;1&quot;&gt;#include&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;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;boost/algorithm/string.hpp&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; 
&lt;div&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std;&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; boost;&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;using&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; boost::filesystem;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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; get_files( &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; path&amp;amp; directory, vector&amp;lt;path&amp;gt;&amp;amp; files )&lt;/font&gt; &lt;br /&gt;{ &lt;br /&gt;  directory_iterator end_iter; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  for&lt;/font&gt;&lt;/font&gt;( directory_iterator iter( directory ); iter != end_iter; ++iter ) &lt;br /&gt;  { &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    if&lt;/font&gt;&lt;/font&gt;( is_directory( iter-&amp;gt;status() ) ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;continue&lt;/font&gt;&lt;/font&gt;; &lt;br /&gt;    files.push_back( iter-&amp;gt;path() ); &lt;br /&gt;  } &lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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; get_ProcessorCount(){ &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; 2; }&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&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;class&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; TaskExecutor&lt;/font&gt; &lt;br /&gt;{ &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;typedef&lt;/font&gt;&lt;/font&gt; function2&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;void&lt;/font&gt;&lt;/font&gt;, map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp;, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp;&amp;gt; ConsolidationFunctionType; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;typedef&lt;/font&gt;&lt;/font&gt; function1&amp;lt;map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; path&amp;amp;&amp;gt; CountWordsFunctionType; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&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;public&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt; &lt;br /&gt;  TaskExecutor( vector&amp;lt;path&amp;gt;::const_iterator begin, vector&amp;lt;path&amp;gt;::const_iterator end, &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;                      const&lt;/font&gt;&lt;/font&gt; CountWordsFunctionType countWords, &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;                      const&lt;/font&gt;&lt;/font&gt; ConsolidationFunctionType consolidation, &lt;br /&gt;                      map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp; result ) : Begin_( begin ), &lt;br /&gt;                      End_( end ), &lt;br /&gt;                      CountWordsFunction_( countWords ), &lt;br /&gt;                      ConsolidationFunction_( consolidation ), &lt;br /&gt;                      Result_( result ){} &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&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 color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;operator&lt;/font&gt;&lt;/font&gt;()() &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;( vector&amp;lt;path&amp;gt;::const_iterator iter = Begin_; iter != End_; ++iter ) &lt;br /&gt;      ConsolidationFunction_( Result_, CountWordsFunction_( *iter ) ); &lt;br /&gt;  }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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;private&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;br /&gt;  vector&amp;lt;path&amp;gt;::const_iterator Begin_, End_; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  const&lt;/font&gt;&lt;/font&gt; ConsolidationFunctionType ConsolidationFunction_; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  const&lt;/font&gt;&lt;/font&gt; CountWordsFunctionType CountWordsFunction_; &lt;br /&gt;  map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;&amp;amp; Result_; &lt;br /&gt;};&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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; key_count( map&amp;lt;string, &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;&amp;gt;&amp;amp; dictionary, &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; string&amp;amp; word, &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; value )&lt;/font&gt; &lt;br /&gt;{ &lt;br /&gt;  dictionary[ word ] = dictionary.end() != dictionary.find( word ) ? dictionary[ word ] + value : value; &lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt; &lt;br /&gt;map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; map_function( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; path&amp;amp; filename ) &lt;br /&gt;{ &lt;br /&gt;  map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; wordCount; &lt;br /&gt;&lt;br /&gt;  ifstream file; &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; MAXLEN = 1024; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  char&lt;/font&gt;&lt;/font&gt; line[ MAXLEN ]; &lt;br /&gt;&lt;br /&gt;  file.open( filename.directory_string().c_str() ); &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;  while&lt;/font&gt;&lt;/font&gt;( file.getline( line, MAXLEN ) ) &lt;br /&gt;  { &lt;br /&gt;    vector&amp;lt;string&amp;gt; split_v; &lt;br /&gt;    split( split_v, string( line ), is_any_of( &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;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt;string&amp;gt;::const_iterator iter = split_v.begin(); iter != split_v.end(); ++iter ) &lt;br /&gt;      key_count( wordCount, *iter, 1 ); &lt;br /&gt;  } &lt;br /&gt;  &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;  file.close(); &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;  return&lt;/font&gt;&lt;/font&gt; wordCount; &lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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; reduce_function( map&amp;lt;string, &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;&amp;gt;&amp;amp; destination, &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; map&amp;lt;string, &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;&amp;gt;&amp;amp; source )&lt;/font&gt; &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;( map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;::const_iterator iter = source.begin(); iter != source.end(); ++iter ) &lt;br /&gt;  key_count( destination, iter-&amp;gt;first, iter-&amp;gt;second ); &lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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; wordcount_mapreduced( &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; vector&amp;lt;path&amp;gt;&amp;amp; files, map&amp;lt;string, &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;&amp;gt;&amp;amp; wordCount )&lt;/font&gt; &lt;br /&gt;{ &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  //data partition &lt;/font&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; numberOfPartitions = get_ProcessorCount() * 2; &lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//2 threads per core &lt;/font&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; numberOfFiles = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;static_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;( files.size() ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  if&lt;/font&gt;&lt;/font&gt;( numberOfFiles &amp;lt; numberOfPartitions ) numberOfPartitions = numberOfFiles; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  int&lt;/font&gt;&lt;/font&gt; delta = numberOfFiles / numberOfPartitions; &lt;br /&gt;  vector&amp;lt; map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; &amp;gt; result( numberOfPartitions ); &lt;br /&gt;  thread_group tg; &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&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;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  //for parallel &lt;/font&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; step = 0; step &amp;lt; numberOfPartitions; ++step ) &lt;br /&gt;  { &lt;br /&gt;    vector&amp;lt;path&amp;gt;::const_iterator begin = files.begin() + delta * step, &lt;br /&gt;    end = numberOfPartitions - 1 == step ? files.end() : files.begin() + delta * step + delta; &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;    //fork &lt;/font&gt;&lt;/font&gt;&lt;br /&gt;    tg.create_thread( TaskExecutor( begin, end, map_function, reduce_function, result[step] ) ); &lt;br /&gt;  }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt; &lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;  //join &lt;/font&gt;&lt;/font&gt;&lt;br /&gt;  tg.join_all(); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt; map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; &amp;gt;::const_iterator iter = result.begin(); iter != result.end(); ++iter ) &lt;br /&gt;    reduce_function( wordCount, *iter ); &lt;br /&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&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;  vector&amp;lt;path&amp;gt; files; &lt;br /&gt;  get_files( &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;c:\\txttest\\&amp;quot;&lt;/font&gt;&lt;/font&gt;, files ); &lt;br /&gt;  map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; wordCount; &lt;br /&gt;&lt;br /&gt;  wordcount_mapreduced( files, wordCount ); &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;( map&amp;lt;string, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;::const_iterator iter = wordCount.begin(); iter != wordCount.end(); ++iter ) &lt;br /&gt;    cout &amp;lt;&amp;lt; iter-&amp;gt;first &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; = &amp;quot;&lt;/font&gt;&lt;/font&gt; &amp;lt;&amp;lt; iter-&amp;gt;second &amp;lt;&amp;lt; endl; &lt;br /&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)/Main?$format=rss20</id>
			<updated>2009-07-04T04:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Declaração x definição</title>
		<link href="http://www.caloni.com.br/blog/archives/declaracao-x-definicao"/>
		<id>http://www.caloni.com.br/blog/archives/declaracao-x-definicao</id>
		<updated>2008-06-06T12:27:33+00:00</updated>
		<content type="html">&lt;p&gt;Uma diferença que eu considero crucial na linguagem C/C++ é a questão da declaração/definição (em inglês, &lt;em&gt;declaration/definition&lt;/em&gt;). É a diferença entre esses dois conceitos que permite, por exemplo, que sejam criadas estruturas prontas para serem conectadas a listas ligadas:&lt;/p&gt;
&lt;pre&gt;struct Element
{
   int x;
   int y;
   &lt;font color=&quot;#ff0000&quot;&gt;Element* next;&lt;/font&gt; /* olha eu mesmo aqui! */
};&lt;/pre&gt;
&lt;p&gt;Por outro lado, e mais importante ainda, é ela que permite que as funções sejam organizadas em &lt;strong&gt;unidades de tradução&lt;/strong&gt; (cpps) distintas para depois se unirem durante o &lt;em&gt;link&lt;/em&gt;, mesmo que entre elas exista uma relação de dependência indissociável:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/cdepends.gif&quot; title=&quot;cdepends.gif&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/cdepends.gif&quot; alt=&quot;cdepends.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Existem diversas formas de entender esses dois conceitos. Eu prefiro explicar pela mesma experiência que temos quando descobrimos a divisão &lt;em&gt;hardware/software&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Hardware&lt;/em&gt; é o que você chuta&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Software&lt;/em&gt; é o que você xinga&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exatamente. &lt;em&gt;Hardware &lt;/em&gt;é algo paupável, que você pode até chutar se quiser. Por exemplo, a sua memória RAM! No entanto, &lt;em&gt;software &lt;/em&gt;é algo mais abstrato, que nós, seres humanos, não temos a capacidade de dar umas boas pauladas. Portanto, nos abstemos a somente xingar o maldito que fez o programa &quot;&lt;em&gt;buggento&lt;/em&gt;&quot;.&lt;/p&gt;
&lt;p&gt;Da mesma forma, uma declaração em C/C++ nos permite moldar como será alguma coisa na memória, sem no entanto ocupar nem um mísero &lt;em&gt;byte&lt;/em&gt; no seu programa:&lt;/p&gt;
&lt;pre&gt;int func(int x, int y, int z); /* tamanho em memória: zero bytes */&lt;/pre&gt;
&lt;pre&gt;struct Teste
{
	char bufao[0x100000]; /* tamanho em memória: zero bytes */
	int intao[0xffffff];  /* tamanho em memória: zero bytes */
};&lt;/pre&gt;
&lt;pre&gt;extern int x; /* tamanho em memória: adivinha! */&lt;/pre&gt;
&lt;p&gt;Por outro lado, a definição, o &lt;em&gt;hardware &lt;/em&gt;da história, sempre ocupará alguma coisa na memória RAM, o que, de certa forma, permite que você chute uma variável (embora muitas outras também irão para o saco).&lt;/p&gt;
&lt;pre&gt;int func(int x, int y, int z) /* tamanho em memória:
{
	int ret = x + y + z; /* alguns _asm add + */
	return ret;          /* um _asm ret */
}&lt;/pre&gt;
&lt;pre&gt;Teste tst; /* tamanho em memória: 0x100000 + 0xffffff * 4 = 1048576 bytes */&lt;/pre&gt;
&lt;pre&gt;int x; /* tamanho em memória: sizeof(int) bytes */&lt;/pre&gt;
&lt;p&gt;Dessa comparação só existe uma pegadinha: uma definição também é uma declaração. Por exemplo, nos exemplos acima, além de definir func, tst e x, o código também informa ao compilador que existe uma função chamada func, que existe uma variável tst do tipo Teste e uma variável x do tipo int.&lt;/p&gt;
&lt;p&gt;Informa ao compilador? Essa é uma outra ótima maneira de pensar a respeito de declarações: elas sempre estão conversando diretamente com o compilador. Por outro lado, nunca conversam diretamente com o &lt;em&gt;hardware, &lt;/em&gt;pois ao executar seu código compilado, as declarações não mais existem. Foi apenas um interlúdio para que o compilador conseguisse alocar memória da maneira correta.&lt;/p&gt;
&lt;p&gt;Complicado? Talvez seja, mesmo. Mas é algo que vale a pena fixar na mente. Isso, é claro, se você quiser ser um programador C/C++ mais esperto que os outros e resolver pequenos problemas de compilação que muitos perdem horas se perdendo.&lt;/p&gt;
&lt;h4&gt;Corolário&lt;/h4&gt;
&lt;p&gt;Então por que diabos a separação declaração/definição consegue definir coisas como listas ligadas, como no código acima? A resposta é um pouco ambígua, mas representa regra essencial na sintaxe da linguagem: após a definição do nome e do tipo de declaração envolvida podemos referenciá-la como declaração, ou seja, não ferindo a limitação de que não sabemos o tamanho de uma variável do tipo declarado. Dessa forma, é perfeitamente legal definirmos um ponteiro para uma estrutura que ainda não se sabe muita coisa, além de que é uma estrutura:&lt;/p&gt;
&lt;pre&gt;struct Estrutura; /* atenção: declaração apenas! */&lt;/pre&gt;
&lt;pre&gt;Estrutura* st; /* ponteiro para declaração: não sabemos o tamanho ainda */&lt;/pre&gt;
&lt;p&gt;Dessa forma, o começo de uma definição de estrutura já declara o nome da estrutura antes de terminar a declaração do tipo inteiro. Bizarro, não? De qualquer forma, isso permite a construção clássica de lista ligada:&lt;/p&gt;
&lt;pre&gt;&lt;font color=&quot;#ff0000&quot;&gt;struct Estrutura&lt;/font&gt; /* a partir daqui Estrutura já está visível */
{
	&lt;font color=&quot;#ff0000&quot;&gt;Estrutura* st;&lt;/font&gt; /* recursividade? é apenas um ponteiro! */
};&lt;/pre&gt;
&lt;p&gt;Se vermos pelo lado prático, de qualquer forma seria impossível definir uma variável dentro dela mesma, pois isso geraria uma recursão infinita de definições, e, como sabemos, os recurso da máquina são finitos.&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Resultado do Seminário CCPP</title>
		<link href="http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp"/>
		<id>http://www.caloni.com.br/blog/archives/resultado-do-seminario-ccpp</id>
		<updated>2008-06-03T00:17:05+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario.jpg&quot; title=&quot;seminario.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario.thumbnail.jpg&quot; title=&quot;seminario.jpg&quot; alt=&quot;seminario.jpg&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;Aconteceu nesse fim-de-semana, como era previsto, o nosso primeiro &lt;a href=&quot;http://www.temporealeventos.com.br/?area=101&quot;&gt;Seminário CCPP Brasil&lt;/a&gt;, com direito a pessoas de todas as idades e origens, mas todas com algo em comum: a paixão e o interesse pelas linguagens-mestre do mundo da programação.&lt;/p&gt;
&lt;p&gt;Começo esse artigo agradecendo a todos os que direta e indiretamente participaram para o sucesso do evento, entre eles &lt;a href=&quot;http://www.temporealeventos.com.br/&quot;&gt;os organizadores&lt;/a&gt;, o &lt;a href=&quot;http://techberto.wordpress.com/&quot;&gt;carro-chefe&lt;/a&gt; responsável por acordar o espírito C++ da galera no início do ano, os palestrantes e, claro, &lt;strong&gt;óbvio&lt;/strong&gt;, toda a &lt;a href=&quot;http://www.ccppbrasil.org&quot;&gt;comunidade C++&lt;/a&gt; que participou em corpo (vulgo &lt;em&gt;hardware&lt;/em&gt;) e alma (vulgo &lt;em&gt;software&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Termino a introdução fazendo uma minicrítica ao preço pago pelos participantes. Não que eu ache que seja muito, pelo contrário: dado o alto nível técnico das palestras, parece até mentira termos acesso a um evento com essa estrutura por tão pouco. Porém, o muito e o pouco são relativos, e ainda acredito que existam pessoas que não vão aos encontros por falta de recursos. Por isso mesmo vai um apelo para que nos futuros encontros tenhamos alguma forma de permitir às pessoas menos favorecidas de participar democraticamente dessa que é a expressão viva das linguagens C e C++ em nosso país.&lt;/p&gt;
&lt;p&gt;Vamos às palestras!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dicas e Truques de Portabilidade&lt;/strong&gt;&lt;br /&gt;
Wanderley Caloni&lt;/p&gt;
&lt;p&gt;Apresentação para baixar em &lt;a href=&quot;http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.pdf&quot;&gt;PDF&lt;/a&gt;, &lt;a href=&quot;http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.ppt&quot;&gt;PPT &lt;/a&gt;e &lt;a href=&quot;http://www.caloni.com.br/docs/Portabilidade%20-%20Wanderley%20Caloni.odp&quot;&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-caloni.jpg&quot; title=&quot;seminario-caloni.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-caloni.thumbnail.jpg&quot; title=&quot;seminario-caloni.jpg&quot; alt=&quot;seminario-caloni.jpg&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;É muito difícil analisar uma palestra feita por você mesmo. É mais difícil ainda quando essa palestra é a primeira de uma batelada de argumentações de alto nível técnico que seguiram o dia. Posso dizer, no entanto, que consegui o que queria quando fui para o evento: demonstrar as dificuldades e as facilidades de tornar um código portável, independente se entre sistemas operacionais, ambientes ou compiladores.&lt;/p&gt;
&lt;p&gt;Foi visto primeiramente o que faz da portabilidade uma coisa difícil. Detalhes como sintaxe e gramática fazem toda a diferença quando o que se almeja é um código limpo de imperfeições trazidas pelo ambiente de desenvolvimento. Também foi dada especial atenção às famigeradas extensões de compiladores, que fazem a linguagem parecer uma coisa que não é.&lt;/p&gt;
&lt;p&gt;Por fim, foram apresentadas algumas sugestões movidas pela experiência e estudo dessas mesmas dificuldades. Para ilustrar, dois exemplos bem vivos de como um código portável deve se comportar, tanto no código-fonte quanto em sua documentação.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programação Concorrente com C++&lt;/strong&gt;&lt;br /&gt;
Fábio Galuppo&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry&quot;&gt;Artigo sobre apresentação&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-galuppo.jpg&quot; title=&quot;seminario-galuppo.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-galuppo.thumbnail.jpg&quot; title=&quot;seminario-galuppo.jpg&quot; alt=&quot;seminario-galuppo.jpg&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;Para quem está acostumado com os temas geralmente &quot;gerenciados&quot; de Fábio Galuppo com certeza deve ter se surpreendido com a descrição teórica dos inúmeros problemas que cercam a vida do programador &lt;em&gt;multithreading&lt;/em&gt;. O palestrante partiu do mais simples, o conceito de &lt;em&gt;threads&lt;/em&gt;, conceito que, segundo ele mesmo, pode ser explicado em 15 minutos, para algo mais sutil e que gera muitos erros escondidos: o conceito de &lt;em&gt;locks &lt;/em&gt;(semáforos, &lt;em&gt;mutexes&lt;/em&gt;, etc).&lt;/p&gt;
&lt;p&gt;Os programadores em nível de sistema devem ter adorado o contexto histórico dos problemas (você sabia que o primeiro &lt;em&gt;lock &lt;/em&gt;inventado foi o semáforo?) tanto quanto o contexto teórico (explicação sobre modelo de memória).&lt;/p&gt;
&lt;p&gt;Um destaque especial foram os experimentos com código rodando de verdade no Visual Studio, como o exemplo que tenta criar o maior número de &lt;em&gt;threads &lt;/em&gt;possível na arquitetura 64. Simplesmente assustador!&lt;/p&gt;
&lt;p&gt;Se por um lado faltou tempo para explicar os usos e princípios das bibliotecas de programação paralela disponíveis e mais usadas do mercado, por outro a palestra preencheu uma lacuna importante na &lt;a href=&quot;http://www.caloni.com.br/blog/archives/terceiro-encontro-c&quot;&gt;minha primeira palestra&lt;/a&gt; sobre &lt;em&gt;threads &lt;/em&gt;em C++, demonstrando os erros mais comuns e o que não se deve fazer em programas que rodam mais de uma &lt;em&gt;thread&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Mais uma vez voltando à teoria, a palestra foca mais uma vez em bons princípios de &lt;em&gt;design&lt;/em&gt;, como o padrão de projeto monitor e a descrição dos modelos onde é justificado o uso de mais de uma &lt;em&gt;thread &lt;/em&gt;no programa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programação Multiplataforma Usando STL e Boost&lt;/strong&gt;&lt;br /&gt;
Rodrigo Strauss&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/de_volta&quot;&gt;Artigo sobre apresentação&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminari-strauss.jpg&quot; title=&quot;seminari-strauss.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminari-strauss.thumbnail.jpg&quot; title=&quot;seminari-strauss.jpg&quot; alt=&quot;seminari-strauss.jpg&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;Como sempre, Strauss está apaixonado pelo &lt;a href=&quot;http://www.boost.org/&quot;&gt;Boost&lt;/a&gt; (e a &lt;a href=&quot;http://www.dinkumware.com/cpp.aspx&quot;&gt;STL&lt;/a&gt;). Descrevendo as partes mais importantes que todo programador C++ moderno deve saber sobre essas bibliotecas, ambas modernas, a palestra focou principalmente no uso do dia-a-dia, e as vantagens produtivas que o C++ atual pode ter sobre o velho e tradicional programa em C com listas encadeadas artesanais.&lt;/p&gt;
&lt;p&gt;Entre as coisas mais importantes citadas, que todo programador do novo século deveria saber, estão:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A total falta da necessidade de desalocarmos objetos manualmente em nossos programas, visto que o &lt;a href=&quot;http://www.aoc.nrao.edu/~tjuerges/ALMA/STL/html/classstd_1_1auto__ptr.html&quot;&gt;auto_ptr&lt;/a&gt; (STL) e &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/shared_ptr.htm&quot;&gt;shared_ptr&lt;/a&gt; (Boost) dão conta do recado de maneira impecável.&lt;/li&gt;
&lt;li&gt;A total falta da necessidade de usarmos aqueles velhos &lt;em&gt;arrays &lt;/em&gt;em C que quase nunca sabemos o tamanho exato para guardar nossos valores (e que continuamente colocávamos com o tamanho 100, MAX_PATH, ou UM_OUTRO_DEFINE_COMUM_EM_LINUX). A classe &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/doc/html/array.html&quot;&gt;boost::array&lt;/a&gt; provê todas as funcionalidades básicas, além das avançadas, do uso de &lt;em&gt;arrays &lt;/em&gt;tradicionais, sem qualquer &lt;em&gt;overhead&lt;/em&gt; adicional de um &lt;em&gt;array &lt;/em&gt;em C.&lt;/li&gt;
&lt;li&gt;A total falta de necessidade de ficar convertendo &lt;em&gt;strings &lt;/em&gt;e inteiros. Com a ajuda da classe &lt;strong&gt;std::string&lt;/strong&gt; e de construções geniais como &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/libs/conversion/lexical_cast.htm&quot;&gt;lexical_cast&lt;/a&gt; (Boost), felizmente podemos deixar nossas velhas funções que precisavam de um &lt;em&gt;buffer&lt;/em&gt;, como _itoa (embora não-padrão).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enfim, para quem pôde ver, a palestra focou nos princípios que farão hoje em dia um programador C++ completo, profissional e que, como seus colegas de outras linguagens, se preocupa igualmente com a produtividade de seu código. Ah, sim, e não gosta nem um pouco de reinventar a roda.&lt;br /&gt;
&lt;strong&gt;Técnicas de Otimização de Código&lt;/strong&gt;&lt;br /&gt;
Rodrigo Kumpera &amp;amp; André Tupinambá&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao1.jpg&quot; title=&quot;seminario-otimizacao1.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao1.thumbnail.jpg&quot; title=&quot;seminario-otimizacao1.jpg&quot; alt=&quot;seminario-otimizacao1.jpg&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;Aparentemente o que pensei que seria, em minha sincera opinião, um desastre (dois palestrantes falando sobre a mesma coisa) se transformou em uma combinação estupenda de teoria e prática aplicadas à arte de otimização de código. Rodrigo e André conseguiram destrinchar o tema harmoniosamente, sempre dividido entre técnicas avançadas (algumas demonstradas pela experiência dos palestrantes) e teoria disciplinar, que visa alertar o &lt;em&gt;wannabe&lt;/em&gt; que otimizar pode ser uma coisa boa; porém, preste atenção aos que já fizeram isso têm a dizer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao2.jpg&quot; title=&quot;seminario-otimizacao2.jpg&quot;&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/seminario-otimizacao2.thumbnail.jpg&quot; title=&quot;seminario-otimizacao2.jpg&quot; alt=&quot;seminario-otimizacao2.jpg&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;Com uma didática impecável, o novato nesse tema (como eu) pôde ver as dificuldades de conseguir determinar o objetivo de todo otimizador de código que, segundo eles, deve estar sempre atento na máxima de que &quot;toda otimização é na verdade uma troca&quot;. Ou seja, se o programador quer melhor processamento, pagará com memória, se quiser otimizar espaço na RAM, irá gastar mais com processamento e/ou disco, e assim por diante.&lt;/p&gt;
&lt;p&gt;Foram apresentados exemplos reais de otimização, além de dicas muito importantes sobre o comportamento das compilaçõe de cada dia.  Você sabia, por exemplo, que ao declarar em escopos mais locais suas variáveis usadas apenas em pequenos trechos de código, estará dando uma poderosa dica ao compilador para que ele consiga usar os registradores no máximo de sua capacidade?&lt;/p&gt;
&lt;h4&gt;Conclusão: estamos indo de bem a melhor!&lt;/h4&gt;
&lt;p&gt;Ao final, como é de praxe, tivemos um sorteio de ótimos livros sobre programação e C++ em geral, com destaque aos livros do Herb Sutter. Rodrigo Strauss, conhecido fundador dos encontros, recebeu sua mais que merecida homenagem ao receber um de seus livros autografados. É o mais novo MVP da comunidade!&lt;/p&gt;
&lt;p&gt;E por falar em comunidade, e agora podemos ver claramente, estamos com uma força bem maior do que no início do ano. A seqüência de ótimos eventos, além de nossos mestres do &lt;a href=&quot;http://groups.google.com/group/ccppbrasil&quot;&gt;conselho Jedi&lt;/a&gt; de programadores C++, prova finalmente que, se depender da qualidade dos desenvolvedores, o Brasil pode sim ser uma poderosa fonte de programas de qualidade que façam coisas bem mais interessantes do que acessar um banco SQL. Nós já temos a matéria-prima.&lt;/p&gt;
&lt;h4&gt;Mais linques sobre o evento&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/ccppbrasil/t/ff237f0166f84115&quot;&gt;Discussão&lt;/a&gt; sobre o evento na nossa lista&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot;&gt;&lt;em&gt;Imagens do evento cedidas por &lt;a href=&quot;http://www.driverentry.com.br&quot;&gt;Fernando Roberto&lt;/a&gt; (valeu, Ferdinando!).&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Aquele do-while engraçado</title>
		<link href="http://www.caloni.com.br/blog/archives/aquele-do-while-engracado"/>
		<id>http://www.caloni.com.br/blog/archives/aquele-do-while-engracado</id>
		<updated>2008-05-15T03:35:31+00:00</updated>
		<content type="html">&lt;p&gt;Nesses últimos dias andei conversando com um amigo que está estudando sistemas operacionais na faculdade. Melhor ainda, vendo o código real de um sistema operacional em funcionamento. A conseqüência é que, além de aprender um bocado de como as coisas funcionam de verdade debaixo dos panos, acaba-se aprendendo alguns truquezinhos básicos e tradicionais da linguagem C.&lt;/p&gt;
&lt;p&gt;Por exemplo, é um hábito conhecido o uso de construções do-while quando existe a necessidade de definir uma macro que possui mais de um comando em vez de usar a igualmente conhecida { construção de múltiplos comandos entre chaves }.&lt;/p&gt;
&lt;p&gt;O que talvez não seja tão conhecido é o porquê das coisas serem assim.&lt;/p&gt;
&lt;p&gt;Vamos imaginar uma macro de logue que é habilitada em compilações &lt;em&gt;debug&lt;/em&gt;, mas é mantida em silêncio em compilações &lt;em&gt;release&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;#ifdef NDEBUG&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define MYTRACE( message ) /* nothing */&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#else&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define MYTRACE( message )        \&lt;/span&gt;
	&lt;span&gt;&amp;#123;&lt;/span&gt;                              \
		&lt;span&gt;char&lt;/span&gt; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;           \
		&lt;span&gt;sprintf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,             \
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,  \
			__FILE__,                \
			__LINE__,                \
			message&lt;span&gt;&amp;#41;&lt;/span&gt;;                \
		OutputDebugString&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt;;  \
	&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#endif /* NDEBUG */ &lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Nada de mais, e parece até funcionar. Porém, como veremos nas próximas linhas, esse é realmente um exemplo de código &quot;buguento&quot;, já que uma chamada dentro de uma construção if-else simplesmente não funciona.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; exploded&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;
	MYTRACE&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;Oh, my God&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;else&lt;/span&gt;
	MYTRACE&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;That's right&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;&lt;/p&gt;
&lt;pre&gt;error C2181: illegal else without matching if&lt;/pre&gt;
&lt;p&gt;Por que isso? Para responder a essa questão nós precisamos olhar um pouco mais de perto no resultado do preprocessador da linguagem, que apenas troca nossa macro pelo pedaço de código que ela representa:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; exploded&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&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; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;
		sprintf&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,
			__FILE__,
			__LINE__,
			&lt;span&gt;&quot;Oh, my God&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
		OutputDebugString&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt;;
	&lt;span&gt;&amp;#125;&lt;/span&gt;;
&lt;span&gt;else&lt;/span&gt;
	&lt;span&gt;&amp;#123;&lt;/span&gt;
		&lt;span&gt;char&lt;/span&gt; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;
		sprintf&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,
			__FILE__,
			__LINE__,
			&lt;span&gt;&quot;That's right&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
		OutputDebugString&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&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;Dessa forma, podemos ver o porquê. Quando chamamos a macro, geralmente usamos a sintaxe de chamada de função, colocando um sinal de ponto-e-vírgula logo após a chamada. Essa é a maneira correta de se chamar uma função, mas no caso de uma macro, dessa macro, é um desastre, porque ela cria dois comandos em vez de um só (um ponto-e-vírgula vazio, apesar de não fazer nada, é um comando válido). Então, isso é o que o compilador faz:&lt;/p&gt;
&lt;pre&gt;if( instruction )
{
	/* um monte de comandos */

} /* aqui eu esperaria um else ou uma instrução nova */

&lt;font color=&quot;#ff0000&quot;&gt;; /* uma instrução nova! ok, sem else desa vez */&lt;/font&gt;

else /* espere ae! o que esse else está fazendo aqui sem um if?!?! */
{
	/* mais comandos */
}&lt;/pre&gt;
&lt;p&gt;Pense sobre o comando vazio como se ele fosse um comando real, o que é a maneira mais fácil de entender o erro de compilação que recebemos ao compilar o código abaixo:&lt;/p&gt;
&lt;pre&gt;if( error() )
{
	printf(&quot;error&quot;);
}

&lt;font color=&quot;#ff0000&quot;&gt;printf(&quot;here we go&quot;);&lt;/font&gt;

else /* llegal else without matching if! */
{
	printf(&quot;okay&quot;);
}&lt;/pre&gt;
&lt;p&gt;Por essa razão, a maneira tradicional de escapar desse erro comum é usar uma construção válida que peça de fato um ponto-e-vírgula no final. Felizmente nós, programadores C/C++, temos essa construção, e ela é... muito bem, o &lt;strong&gt;do-while&lt;/strong&gt;!&lt;/p&gt;
&lt;pre&gt;do
{
	/* múltiplos comandos aqui */
}
while( expression ) &lt;font color=&quot;#ff0000&quot;&gt;;&lt;/font&gt; /* eu espero um ponto-e-vírgula aqui, para
                         finalizar minha instrução do-while */&lt;/pre&gt;
&lt;p&gt;Assim nós podemos reescrever nossa macro de logue da maneira certa (e todas as 549.797 macros já escritas em nossa vida de programador). E, apesar de ser uma construção um tanto bizarra, ela funciona melhor do que nossa tentativa inicial:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;#ifdef NDEBUG&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define MYTRACE( message ) /* nothing */&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#else&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#define MYTRACE( message )        \&lt;/span&gt;
	&lt;span&gt;do&lt;/span&gt;                             \
	&lt;span&gt;&amp;#123;&lt;/span&gt;                              \
		&lt;span&gt;char&lt;/span&gt; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;           \
		sprintf&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,             \
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,  \
			__FILE__,                \
			__LINE__,                \
			message&lt;span&gt;&amp;#41;&lt;/span&gt;;                \
		&lt;span&gt;printf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt;;             \
	&lt;span&gt;&amp;#125;&lt;/span&gt;                              \
	&lt;span&gt;while&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#endif /* NDEBUG */ &lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Ao usar um do-while (com uma expressão que retorna falso dentro do teste, de maneira que o código seja executado apenas uma vez) a construção if-else consegue funcionar perfeitamente:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; exploded&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;
	&lt;span&gt;do&lt;/span&gt;
	&lt;span&gt;&amp;#123;&lt;/span&gt;
		&lt;span&gt;char&lt;/span&gt; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;
		sprintf&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,
			__FILE__,
			__LINE__,
			&lt;span&gt;&quot;Oh, my God&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
		OutputDebugString&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt;;
	&lt;span&gt;&amp;#125;&lt;/span&gt;
	&lt;span&gt;while&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;else&lt;/span&gt;
	&lt;span&gt;do&lt;/span&gt;
	&lt;span&gt;&amp;#123;&lt;/span&gt;
		&lt;span&gt;char&lt;/span&gt; buffer&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;
		sprintf&lt;span&gt;&amp;#40;&lt;/span&gt;buffer,
			&lt;span&gt;&quot;MYTRACE: %s(%d) %s&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;,
			__FILE__,
			__LINE__,
			&lt;span&gt;&quot;That's right&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
		OutputDebugString&lt;span&gt;&amp;#40;&lt;/span&gt;buffer&lt;span&gt;&amp;#41;&lt;/span&gt;;
	&lt;span&gt;&amp;#125;&lt;/span&gt;
	&lt;span&gt;while&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Projeto Orientado a Componentes, parte II</title>
		<link href="http://pedrolamarao.blogspot.com/2008/04/projeto-orientado-componentes-parte-ii.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8839494803282192683</id>
		<updated>2008-05-08T16:28:23+00:00</updated>
		<content type="html">Quando dizemos que componentes são por definição intercambiáveis estamos continuando uma longa tradição de bons projetistas de bons sistemas, cujo conjunto de características sempre integrará, por mais sofisticada a metodologia e/ou a nomenclatura, a aplicação da &lt;span&gt;separação entre interface e implementação&lt;/span&gt;. [1]&lt;br /&gt;&lt;br /&gt;Se a interface continua a mesma, podemos substituir a implementação sem perturbar o comportamento do sistema. Obviamente que o comportamento do sistema deve mudar de alguma forma, senão trocar a porcaria do componente não teria propósito. Esperamos, portanto, que erros sejam corrigidos (de modo que o sistema de fato funcione como deveria), ou que o desempenho aumente (de modo que o sistema funcione antes que eu caia no sono) ou sei lá.&lt;br /&gt;&lt;br /&gt;Aplicávamos esta distinção já na era do projeto estruturado; e no projeto essencial; e no projeto orientado a objetos; e agora no projeto orientado a componentes e aplicaremos no projeto orientado a serviços quando finalmente este troço alcançar a plebe.&lt;br /&gt;&lt;br /&gt;Em um sistema orientado a objetos, nós temos tipicamente dois elementos em evidência como &lt;span&gt;detalhe de implementação&lt;/span&gt;: a estrutura de um objeto, e as instruções levadas a cabo por seus métodos. Nós queremos liberdade para alterar a estrutura de um objeto e queremos liberdade para alterar a instruções executadas por seus métodos. (Há mais por debaixo do pano, como sempre.)&lt;br /&gt;&lt;br /&gt;Em um sistema orientado a componentes, um terceiro elemento surge ofuscando, como se fosse, os outros dois; o componente propriamente dito. Entendemos que um componente possui uma interface e uma implementação; sendo a implementação de um componente composta por inúmeras classes. Além disso, um componente é um artefato componente (heh) de um sistema implantado; é parte da definição de componente que este seja intercambiável por um outro, que implemente a mesma interface, em um sistema implantado -- em contraste com um tipo de substituição que exige recompilação.&lt;br /&gt;&lt;br /&gt;Esta última restrição, quando posta no contexto dos sistemas operacionais reais, com seus &lt;span&gt;linkers&lt;/span&gt; e &lt;span&gt;loaders&lt;/span&gt; reais, nos trás à &lt;span&gt;crux&lt;/span&gt; do problema de projeto orientado a componentes: a implementação de uma classe integrante de um componente &lt;span&gt;absolutamente não pode&lt;/span&gt; depender de um detalhe de implementação de uma classe integrante de outro componente.&lt;br /&gt;&lt;br /&gt;Observe que esta restrição não é exatamente uma novidade, já que bons sistemas isolarão módulos através de interfaces para aumentar a coesão e diminuir o acoplamento; porém, quando componentes entram na jogada, a metodologia exige uma restrição mais forte.&lt;br /&gt;&lt;br /&gt;(De fato, esta restrição metodológica se torna uma impossibilidade tecnológica assim que os componentes são levados ao próximo estágio, passam a não mais morar no mesmo espaço de memória virtual, e começam a ser chamados &quot;distribuídos&quot; ou &quot;serviços&quot;.) [2]&lt;br /&gt;&lt;br /&gt;É por esta razão que os líderes do Projeto Spaghetti falharão em &quot;componentizar&quot; seu sistema; mesmo que, à primeira vista, seja possível seccionar sua estrutura de classes em artefatos binários distintos.&lt;br /&gt;&lt;br /&gt;[1] Nós, filhos da cultura européia, nem escrevendo programas nos livramos da dicotomia corpo versus espírito. Nem imagino o que seria uma metodologia de desenvolvimento de sistemas desenvolvida por monges taoístas chineses.&lt;br /&gt;&lt;br /&gt;[2] E portanto, domar a restrição metodológica significa poder conviver com a impossibilidade tecnológica e eventualmente programar os sistemas do futuro.&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/3006142001944566780-8839494803282192683?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Projeto Orientado a Componentes, parte III</title>
		<link href="http://pedrolamarao.blogspot.com/2008/04/projeto-orientado-componentes-parte-iii.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-2363661614867857949</id>
		<updated>2008-05-08T16:28:08+00:00</updated>
		<content type="html">Agora, uma pausa para reflexão. Esta dicotomia interface versus implementação é difícil de definir. Por baixo dos panos nós temos memória de onde nós lemos e para onde nós escrevemos. O que caracteriza uma interface e o que a distingue de uma implementação?&lt;br /&gt;&lt;br /&gt;Essa pergunta só pode ser respondida em um determinado contexto. Um bom sistema escrito em assembler talvez tenha interfaces mais bem definidas que um mau sistema escrito em Java. Porém, está claro para a indústria que certos mecanismos de linguagem favorecem o estabelecimento de boas interfaces no sistema implementado.&lt;br /&gt;&lt;br /&gt;Além disso, a noção de interface surge diante de um problema de substituição. É interface aquilo que, mantendo-se estável, permite a substituição daquilo que é implementação. Porém, o que é este &lt;span&gt;permite&lt;/span&gt;? Este permite, quando caracterizado, por conseguinte caracteriza o que é interface.&lt;br /&gt;&lt;br /&gt;Suponha um sistema escrito em C++ por uma equipe que considera irrisório o tempo de recompilação do código-fonte. Neste contexto, podemos seguramente aceitar que a seguinte substituição mantém estável uma interface.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;antes&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;Foo ();&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;mutate_stuff ();&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;observe_stuff () const;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;Bar* m_bar;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span&gt;depois&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;Foo ();&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;mutate_stuff ();&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;observe_stuff () const;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;int m_cache;&lt;br /&gt;shared_ptr&amp;lt;bar&amp;gt; m_bar;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Após a alteração acima e uma recompilação o sistema continua a funcionar normalmente. [1] Dizendo de forma mais extensa: neste contexto, a substituição realizada não altera propriedades observáveis externamente da classe, de modo que do ponto de vista de um observador, a classe mantém estável sua interface. (Apenas membros privados foram alterados.)&lt;br /&gt;&lt;br /&gt;Agora vamos alterar as nossas premissas. O tempo de recompilação desse sistema é enorme e o ciclo de testes não pode esperar, de modo que a estrutura de classes do sistema foi particionada e esta classe mora dentro de um objeto compartilhado, uma biblioteca dinâmica.&lt;br /&gt;&lt;br /&gt;A equipe realiza a substituição, recompila o objeto compartilhado e o entrega a uma equipe de testes.&lt;br /&gt;E os testes falham miseravelmente.&lt;br /&gt;&lt;br /&gt;Isto acontece porque, neste novo contexto, há mais propriedades observáveis a considerar, que devem se manter estáveis -- que fazem parte da interface da classe.&lt;br /&gt;Neste caso, o layout de um objeto da classe Foo é uma propriedade observável; um programa compilado criando objetos da definição &lt;span&gt;antes&lt;/span&gt; criará objetos com um layout diferente daquele esperado pelo objeto compartilhado que espera objetos dada a definição &lt;span&gt;depois&lt;/span&gt;.&lt;br /&gt;A definição &lt;span&gt;depois&lt;/span&gt; tem um int no &lt;span&gt;offset&lt;/span&gt; onde a definição &lt;span&gt;antes&lt;/span&gt; tinha um ponteiro, ela ocupa mais memória etc.&lt;br /&gt;&lt;br /&gt;Podemos dizer que o primeiro caso é o caso de um projeto orientado a objetos, onde a alteração de elementos privados da classe não altera a interface; e podemos dizer que o segundo caso é o caso de um projeto orientado a componentes, onde a alteração do layout na memória de uma classe altera sua interface.&lt;br /&gt;&lt;br /&gt;Como no segundo caso nós estamos violando a interface do componente, nós não podemos substituir o componente de antes pelo componente de depois impunemente. Dito de trás para a frente, pelo fato de não podermos substituir o componente de antes pelo componente de depois, por definição estamos violando sua interface.&lt;br /&gt;&lt;br /&gt;Imagine então o que acontece em um sistema spaghetti, onde todas as classes mantém referência a todas as outras classes; uma violação de interface em um &quot;componente&quot; perturbará implacavelmente todos os outros &quot;componentes&quot;.&lt;br /&gt;&lt;br /&gt;Quando projetamos um sistema pensando em componentes, ou quando desejamos aplicar a idéia forte de interface para melhorar o nosso projeto diminuindo o acoplamento entre as coisas que são distintas, é útil usar das ferramentas à disposição para dar &lt;span&gt;forma&lt;/span&gt; ao que é uma interface.&lt;br /&gt;&lt;br /&gt;Linguagens que se propõe a facilitar o desenvolvimento de componentes, como Java e C#, possuem como parte integrante do seu vocabulário e mecanismo nativo uma &lt;span&gt;interface&lt;/span&gt; em contraste com as classes. Normalmente algo do tipo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;interface IFoo {&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;mutate_stuff ();&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;observe_stuff () const;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Em C++ não existe uma construção análoga mas é possível emulá-la integralmente usando classes, da seguinte maneira:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class IFoo {&lt;br /&gt;&lt;br /&gt;virtual&lt;br /&gt;void&lt;br /&gt;mutate_stuff () = 0;&lt;br /&gt;&lt;br /&gt;virtual&lt;br /&gt;int&lt;br /&gt;observe_stuff () const = 0;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(O leitor astuto observará que esta construção-interface não possui atributos.)&lt;br /&gt;&lt;br /&gt;O propósito de usar construções como estas é evidenciar a natureza destes elementos como interfaces -- aquilo que se deseja manter estável -- e diminuir a chance disto que é interface ser inadvertidamente alterado -- causando o desastre. A construção-interface é a melhor amiga do projetista de componentes, permitindo a representação de um conceito de projeto diretamente na linguagem do código-fonte, restringindo as possibilidades de violação durante o processo de implementação, ou ao menos tornando a (necessidade de) violação claramente evidente.&lt;br /&gt;&lt;br /&gt;Infelizmente para nós nem tudo que existe na fronteira de um componente pode ser uma interface, já que é preciso comunicar coisas de um componente para outro. E quem pode viver comunicando apenas doubles e bools? Nós queremos comunicar objetos.&lt;br /&gt;&lt;br /&gt;Além disso, as construções-interface não são garantia de estabilidade de interfaces, já que há mais sobre o que é publicamente observável em um objeto que sua estrutura: há o seu comportamento.&lt;br /&gt;&lt;br /&gt;[1] Estamos, naturalmente, assumindo que o programador não é louco e que a alteração tem algum sentido, exatamente como aparenta ter.&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/3006142001944566780-2363661614867857949?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Projeto Orientado a Componentes, parte IV</title>
		<link href="http://pedrolamarao.blogspot.com/2008/05/projeto-orientado-componentes-parte-iv.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-1424165641738543851</id>
		<updated>2008-05-08T16:27:55+00:00</updated>
		<content type="html">Uma ligeira digressão, para aproveitar a oportunidade que se apresenta; apresentei esta semana um brevíssimo seminário sobre interoperabilidade entre C++ e Java (com ênfase na ferramenta SWIG).&lt;br /&gt;&lt;br /&gt;O problema a resolver, quando a necessidade de interoperabilidade entre C++ e a Java surge, é exatamente um problema de projeto de componente, por uma via indireta: se não é tão necessária a garantia de substituição de componentes, é inescapável a completa separação entre a implementação do &quot;componente C++&quot; e do &quot;componente Java&quot; devido ao completo isolamento entre seus espaços de memória.&lt;br /&gt;&lt;br /&gt;Esta mesma situação ocorre em um sistema convencional de componentes em que cada componente se localiza em processos distintos, ou mesmo em sistemas distintos, se comunicando através de algum mecanismo inter-processos. O próximo passo na escala evolutiva do projeto de sistemas, o projeto orientado a serviços, lida explicitamente com esta situação, já que se assume como normal que serviços se localizam em sistemas (portanto processos) distintos.&lt;br /&gt;&lt;br /&gt;Esse contexto, e as restrições que ele impõe, transforma a natureza da troca de informação; a memória de um processo não é mais um recurso compartilhado entre rotinas.&lt;br /&gt;&lt;br /&gt;Considere a seguinte função em C, parte de uma interface de componente IFoo. (O componente concreto Foo implementa a interface IFoo.)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Foo*&lt;br /&gt;  foo_retrieve_from_persistence (char* foo_name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esta função recebe uma NTBS identificando unicamente um objeto Foo na persistência e retorna o endereço do objeto Foo na memória, trazendo o objeto para a memória uma primeira vez se necessário.&lt;br /&gt;&lt;br /&gt;Suponha que seja desejável, através de um programa Java, usar objetos Foo obtidos através desta função.&lt;br /&gt;&lt;br /&gt;Do componente Bar, uma operação obtém uma referência a uma implementação de IFoo e decide chamar a operação foo_retrieve_from_persistence, passando como argumento uma NTBS. Observe que uma NTBS é uma referência a um espaço contíguo de memória; simplesmente entregar esse endereço para o componente Foo causará um desastre quando este componente resolver acessar esse endereço em seu próprio espaço de memória, cujo significado é incerto. Do mesmo problema sofre o valor de retorno da função; este é o endereço de um objeto na memória do componente Foo, cujo significado no espaço da memória de Bar é incerto.&lt;br /&gt;&lt;br /&gt;Essa situação exibe a impossibilidade de tratar a semântica de referência, na travessia do limiar entre componentes, da mesma maneira como é tratada em projetos mais simples. Como já dissemos, não é possível assumir a memória como recurso compartilhado entre operações em um projeto orientado a componentes. [1]&lt;br /&gt;&lt;br /&gt;A solução canônica é copiar esses valores. Esta tarefa deve ser realizado por aquele elemento do sistema que existe no umbral entre componentes e é responsável por transportar informação de um lado para o outro. Este elemento deverá, então, copiar todo o segmento de memória endereçado por foo_name da memória do componente Bar para a memória do componente Foo. Esta atividade se denomina &quot;data marshalling&quot; em um certo vocabulário e regras particulares de &quot;data marshalling&quot; são chamadas &quot;type maps&quot; em um certo outro vocabulário.&lt;br /&gt;&lt;br /&gt;Este é um exemplo simples de &quot;type map&quot; que transporta um objeto String do Java para um argumento de tipo const std::string&amp;amp; do C++.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  // na prática, estes objetos são argumentos de uma função JNI.&lt;br /&gt;  extern JNIEnv* jenv;&lt;br /&gt;  extern jstring jargN;&lt;br /&gt;&lt;br /&gt;  // type map&lt;br /&gt;  const char *argN_pstr = (const char *)jenv-&gt;GetStringUTFChars(jargN, 0);&lt;br /&gt;  if (!argN_pstr) return 0;&lt;br /&gt;  std::string argN_str(argN_pstr);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A função GetStringUTFChars realiza a tarefa concreta de copiar os segmentos de memória do espaço de memória Java para o espaço de memória C++. Assim, a operação da interface de componente Java/JNI terá a seguinte forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  public static native jlong foo_retrieve_from_persistence (String foo_name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Essa solução, infelizmente, não resolverá o problema do valor de retorno da função. Foo não é um tipo primitivo da linguagem; não existe uma função na JNI para copiar objetos Foo. Mesmo que existisse, Foo é um objeto; o que nós queremos fazer com ele é chamar suas operações. De certa forma, nossa vontade se divide em duas: expor ao programa Java as operações da classe Foo e expor ao programa Java objetos Foo sobre o qual operar. Essas duas necessidades serão resolvidas com mecanismos diferentes.&lt;br /&gt;&lt;br /&gt;Digamos que esta seja a classe Foo.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    Foo (char* name);&lt;br /&gt;&lt;br /&gt;    char*&lt;br /&gt;    ask_question (char* question);&lt;br /&gt;&lt;br /&gt;    char*&lt;br /&gt;    get_name () const;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A primeira vontade é realizável produzindo, para cada operação de Foo, uma operação na interface do componente IFoo.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Foo*&lt;br /&gt;    Foo_new (char* name);&lt;br /&gt;&lt;br /&gt;    void&lt;br /&gt;    Foo_delete (Foo* foo);&lt;br /&gt;&lt;br /&gt;    char*&lt;br /&gt;    Foo_ask_question (Foo* foo, char* question);&lt;br /&gt;&lt;br /&gt;    char*&lt;br /&gt;    Foo_get_name (const Foo* foo);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A segunda é entregando ao programa Java o endereço do objeto Foo necessário. Chegamos, aparentemente, a um impasse; já que nosso problema original era justamente como transportar o valor de retorno da função foo_retrieve_from_persistence, que é do tipo Foo*! Porém, tendo caminhado até aqui, o problema se torna ligeiramente diferente, e uma solução é possível. Agora que nós temos todas as operações de Foo que desejamos exportadas pela interface de componente IFoo, tudo o que resta é entregar ao componente cliente uma referência opaca a um objeto Foo. O componente cliente da interface nunca necessitará resolver (ou de-referenciar) esta referência; ele apenas mantém este valor para usá-lo como argumento de chamada a uma operação da interface IFoo. [2]&lt;br /&gt;&lt;br /&gt;Endereços de memória do C++ podem ser guardados apropriadamente na memória do Java como um valor do tipo Long. Assim, o valor de retorno da operação Foo_create é resolvido pelo seguinte &quot;type map&quot;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  // este é o objeto retornado pela chamada JNI&lt;br /&gt;  jlong jresult = 0;&lt;br /&gt;  // este é o objeto retornado pela função C++&lt;br /&gt;  Foo* result = NULL;&lt;br /&gt;&lt;br /&gt;  // type map&lt;br /&gt;  result = new Foo(arg1_str); // vide type map anterior&lt;br /&gt;  *(Foo **)&amp;amp;jresult = result;&lt;br /&gt;&lt;br /&gt;  // por fim...&lt;br /&gt;  return jresult;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e a operação na interface de componente Java/JNI terá a seguinte forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  public static native jlong Foo_create (String name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Assim, o programa Java chamador de Foo_create através desta interface receberá um valor Long que contém o endereço, na memória do C++, do objeto Foo recém-criado. A operação Foo_get_name através desta interface terá a seguinte forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  public static native String Foo_get_name (jlong foo);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;sendo que o valor de retorno da operação Foo_get_name do componente IFoo será &quot;marshalled&quot; pelo &quot;type map&quot; como já vimos anteriormente.&lt;br /&gt;&lt;br /&gt;Havendo resolvido o problema da possibilidade de referenciar, de maneira opaca, um objeto Foo da memória do C++ na memória do Java, e o problema de chamar operações da classe Foo em C++, podemos então criar uma classe Foo em Java cujo único propósito é imitar a classe Foo em C++ por conveniência.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;&lt;br /&gt;  private Long cPtr;&lt;br /&gt;&lt;br /&gt;  // @Override&lt;br /&gt;  public void finalize () {&lt;br /&gt;    delete();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void delete () {&lt;br /&gt;    IFooJNI.Foo_delete(cPtr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Foo (String name) {&lt;br /&gt;    cPtr = IFooJNI.Foo_new(name);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String ask_question (String question) {&lt;br /&gt;    return IFooJNI.Foo_ask_question(cPtr, question);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String get_name () {&lt;br /&gt;    return IFooJNI.Foo_get_name(cPtr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Desta forma concretizamos uma forma ideal de interoperabilidade entre Java e C++ onde, para cara classe C++, há uma classe Java equivalente, responsável por esconder as chamadas à interface de componente JNI que, por sua vez, é responsável por realizar o transporte de informação através do umbral dos componentes.&lt;br /&gt;&lt;br /&gt;Nestes exemplos ocultamos o fato de que, para a JNI, é necessário não somente um componente Java/JNI mas também um componente C++/JNI além do próprio componente que implementa a interface IFoo; também não lidamos com os casos em que registramos &quot;objetos callback&quot; criados no Java em sistemas C++; não lidamos com a vontade de transportar exceções disparadas em C++ de volta para o chamador Java; entre outras coisas de que não falamos.&lt;br /&gt;&lt;br /&gt;[1] É claro que um projeto pode se utilizar da noção de componentes de uma forma restrita, para obter um conjunto restrito de benefícios, abandonando esta restrição; é possível, por exemplo, obter os benefícios de recompilação veloz e carga de código por demanda abandonando a possibilidade de distribuir os componentes de modo a mantê-los sempre no mesmo espaço de memória e permitir o uso convencional de ponteiros.&lt;br /&gt;&lt;br /&gt;[2] Em projetos de sistemas com componentes é comum que esta idéia do &quot;endereço opaco&quot; seja generalizada para qualquer tipo de informação &quot;opaca&quot; que seja capaz de identificar univocamente um objeto de Foo no domínio do componente Foo; por exemplo, um &quot;nome&quot;, ou um GUID, ou outra coisa qualquer.&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/3006142001944566780-1424165641738543851?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Projeto Orientado a Componentes, parte I</title>
		<link href="http://pedrolamarao.blogspot.com/2008/04/projeto-orientado-componentes-parte-i.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-6691953570210247646</id>
		<updated>2008-04-28T22:59:19+00:00</updated>
		<content type="html">Ano passado fiz um curso de extensão em Projeto Orientado a Componentes com UML; na época, eu estava progredindo na minha capacidade de construir modelos mentais de projetos de &lt;span&gt;software&lt;/span&gt; orientados a objeto e já havia lido bastante sobre &lt;span&gt;web services&lt;/span&gt; e arquiteturas orientada a serviços.&lt;br /&gt;&lt;br /&gt;O mais interessante sobre os Componentes é a maneira como eles dão um nó na sofisticação aparente dos sistemas e obrigam o projetista a voltar aos básicos. Digo isso porque estes sistemas são &lt;span&gt;aparentemente&lt;/span&gt; sofisticados; na prática, eles apresentam &lt;span&gt;baixa coesão&lt;/span&gt; e &lt;span&gt;alto acoplamento&lt;/span&gt;, significando que elementos deste sistema se relacionam diretamente com praticamente todos os outros de maneira &lt;span&gt;ad hoc&lt;/span&gt;, fenômeno que, em sua forma mais concreta, denomina-se &lt;span&gt;código spaghetti&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;É possível construir um sistema orientado a objetos onde todos os objetos conhecem ponteiros para todos os outros, ou praticamente todos os outros, usando truques safados como embrulhar todo mundo em &lt;span&gt;shared_ptr&lt;/span&gt; e tornando todas as classes &lt;span&gt;enable_shared_from_this&lt;/span&gt; e olerê olará. Isto, é claro, se você tem um mínimo de conhecimento sobre C++ contemporâneo -- e se você está de fato escrevendo seu sistema em C++! -- e se você se importa com a memória. O sistema acima é &quot;orientado a objetos&quot;. Muitos deles, embolados entre si.&lt;br /&gt;&lt;br /&gt;Quando você se propõe a fazer sistemas orientados a componentes, porém, o buraco se alarga e se torna mais profundo. Os componentes existem com o propósito de serem intercambiáveis. Você &lt;span&gt;não tem&lt;/span&gt; componentes se você não pode tirar um deles e colocar outro no lugar &lt;span&gt;impunemente&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Frequentemente, os responsáveis por sistemas spaghetti ou aberrações similares, diante dos problemas insuportáveis causados inevitavelmente pela baixa coesão e pelo alto acoplamento, tentam &quot;componentizar&quot; seus sistemas com o intuito de obter os benefícios maravilhosos oferecidos pelos livros.&lt;br /&gt;&lt;br /&gt;Vamos, então, pegar pedaços do sistema e enfiar dentro de DLLs!&lt;br /&gt;&lt;br /&gt; Certamente isto não funciona.&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/3006142001944566780-6691953570210247646?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Seminário CCPP Portabilidade e Performance</title>
		<link href="http://www.caloni.com.br/blog/archives/seminario-ccpp-portabilidade-e-performance"/>
		<id>http://www.caloni.com.br/blog/archives/seminario-ccpp-portabilidade-e-performance</id>
		<updated>2008-04-25T13:32:32+00:00</updated>
		<content type="html">&lt;p&gt;Reserve sua cadeira. Está marcado para o último dia do mês de maio o &lt;a href=&quot;http://www.temporealeventos.com.br/?area=101&quot; title=&quot;Seminário C++ Tempo Real&quot;&gt;primeiro seminário de nosso grupo nacional de programadores e aficionados por C e C++&lt;/a&gt;. É bom ou não é?&lt;/p&gt;
&lt;p&gt;O assunto gira em torno de duas preocupações constantes na vida de todo programador de linguagens de nível médio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quanta velocidade eu preciso nesse código?&lt;/li&gt;
&lt;li&gt;Em quais plataformas eu conseguiria compilar e rodar meu projeto?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para responder estas questões teremos uma bateria de palestras com temas que, dessa vez, focam o simples, puro e independente uso das linguagens C/C++:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/wanderley.gif&quot; title=&quot;wanderley.gif&quot; alt=&quot;wanderley.gif&quot; align=&quot;left&quot; /&gt;&lt;strong&gt;Dicas e Truques de Portabilidade&lt;/strong&gt;&lt;br /&gt;
Wanderley Caloni&lt;/p&gt;
&lt;p&gt;O objetivo dessa palestra é focar nos problemas da vida real que enfrentamos no dia-a-dia para tornar um código portável ou mais maleável para um dia ser. Nesse caso existem vários assuntos a tratar, como: construções ambígüas não-padrão, isolamento de particularidades de cada sistema, identificação de problemas de portabilidade, organização do código-fonte portável, entre outros.&lt;/p&gt;
&lt;p&gt;O nível dessa palestra será o intermediário, porque eu preciso que o público tenha o conhecimento prévio de programação C e C++. Quando você está aprendendo, uma dica ou outra sobre portabilidade pode ser interessante para não ser desvirtuado desde o início. Porém, para realmente começar a programar multiplataforma, existem desafios que devem ser transpostos por aqueles que já conseguem um nível de organização e desenvolvimento em C e C++ que não deixa dúvidas sobre a qualidade do código.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/fabio.jpg&quot; title=&quot;fabio.jpg&quot; alt=&quot;fabio.jpg&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programação Concorrente com C++&lt;/strong&gt;&lt;br /&gt;
Fábio Galuppo&lt;/p&gt;
&lt;p&gt;Fábio Galuppo estréia na nossa rede de palestrantes, depois de seu inspirador e excitante relato das peripécias do SD West desse ano. Ele irá falar de um tema extremamente atual, que é o uso de programação paralela, em especial usando C++. Existe uma série de coisas para entender, como os modelos a ser seguidos, o uso consciente de &lt;em&gt;threads&lt;/em&gt;, a programação com bom desempenho nos novos &lt;em&gt;chips &lt;/em&gt;com mútiplos núcleos de processamento e por aí vai.&lt;/p&gt;
&lt;p&gt;Apenas para ter uma idéia da importância em se ir em uma palestra como essa, imagine que 99,9% dos produtos da Google se baseiam nesse tipo de programação, envolvendo uma plantação de algumas centenas (milhares?) de máquinas trabalhando um banco de dados gigantesco no modo cooperativo para entregar a resposta mais rápida possível do outro lado. Sentiu o drama?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/strauss.gif&quot; title=&quot;strauss.gif&quot; alt=&quot;strauss.gif&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programação Multiplataforma Usando STL e Boost&lt;/strong&gt;&lt;br /&gt;
Rodrigo Strauss&lt;/p&gt;
&lt;p&gt;Voltando para o tema portabilidade, Rodrigo Strauss volta a repetir sua performance sobre Boost, dessa vez abrangendo o conjunto completo de bibliotecas que compõem essa extensão mais-que-necessária da STL para programadores produtivos e multiplataforma. Todos sabem que um código que apenas usa STL e C++ puro não consegue ir muito longe na vida real, apesar de ser 100% multiplataforma. O que muitos não sabem (inclusive eu) é como é possível turbinar o desenvolvimento portável com o uso do Boost, que é uma solução portável bem interessante.&lt;/p&gt;
&lt;p&gt;Por exemplo, a manipulação de arquivos e diretórios não é lá o forte da STL, concentrada no conceito de streams. Com o uso do Boost, podemos ter o melhor da STL, só que turbinada. Além disso, o novo padrão de &lt;em&gt;threads &lt;/em&gt;ainda está longe de chegar ao mercado, e o Boost.Threads é uma solução viável atualmente.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/kumpera.jpg&quot; title=&quot;kumpera.jpg&quot; alt=&quot;kumpera.jpg&quot; align=&quot;left&quot; /&gt;&lt;img src=&quot;http://www.caloni.com.br/blog/wp-content/uploads/tupi.jpg&quot; title=&quot;tupi.jpg&quot; alt=&quot;tupi.jpg&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Técnicas de Otimização de Código&lt;/strong&gt;&lt;br /&gt;
Rodrigo Kumpera &amp;amp; André Tupinambá&lt;/p&gt;
&lt;p&gt;Essa é a estréia de dois palestrantes de uma só vez! Como um bom complemento, voltamos ao tema de otimização, dessa vez em aspectos mais genéricos. Entre questões mais ou menos banais como otimização de laços e &lt;em&gt;benchmarkers&lt;/em&gt;, mas que faze toda a diferença saber, teremos ainda tópicos bem avançados, como a relação de nosso código com o cachê do processador, e a tão-falada técnica de &lt;em&gt;branch prediction&lt;/em&gt;, presente na maioria dos processadores atuais.&lt;/p&gt;
&lt;p&gt;Além do aspecto genérico teremos uma pitada de matemática, como o uso de &lt;em&gt;lookup tables&lt;/em&gt; e a otimização de algoritmos baseada em operações vetoriais. Ainda como um aspecto básico, mas importante, temos o uso eficiente da memória, muitas vezes entregue ao controle do sistema operacional, que nem sempre sabe bem o que o programa está fazendo.&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ode ao C++</title>
		<link href="http://www.caloni.com.br/blog/archives/ode-ao-c"/>
		<id>http://www.caloni.com.br/blog/archives/ode-ao-c</id>
		<updated>2008-04-21T11:06:34+00:00</updated>
		<content type="html">&lt;blockquote&gt;&lt;em&gt;Strauss: lembra quando nós conversávamos sobre o assunto &quot;Por que C++?&quot;, há muitas décadas atrás, e seu blogue era um dos primeiros no Brasil que não ficava relatando o que o autor comia no café da manhã, além de falar sobre programação? Pois é, eu estava reorganizando meus g-mails e reencontrei nossa conversa e, pior, seu artigo &quot;derivado&quot; dela, que irei republicar aqui pois, assim como antes, acredito em tudo que escrevi naquela época.&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;(direto do &quot;Contato do Site&quot;)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Cristiano&lt;/strong&gt; -- Olá! Sou programador em basic (Vbasic/Qbasic), fico indignado, com&lt;br /&gt;
pessoas que sabem enteder a linguagem C++, assembler... Como podem? Eu&lt;br /&gt;
acho isto coisa de outro mundo! Será que eu tenho chances de aprender&lt;br /&gt;
a linguagem?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Strauss &lt;/strong&gt;-- A resposta é simples: estudando. Eu tb comecei com QBasic e VB. Arrume um livro de C++ e estude. Treine bastante. E hoje em dia é mais fácil do que quando eu comecei, pq eu não tinha acesso à Internet. É simples assim... &lt;img src=&quot;http://www.caloni.com.br/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Caloni &lt;/strong&gt;-- Você pode ir tão longe quanto queira, mas pra isso a primeira coisa que vc tem que fazer é querer  =).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Strauss &lt;/strong&gt;-- Acho que vou fazer um post sobre isso. &quot;Por que C++&quot; &lt;img src=&quot;http://www.caloni.com.br/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; Vc podia me ajudar...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Caloni &lt;/strong&gt;-- Escrevi um textículo sobre o assunto da escolha, mas não visando o mercado:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#339966&quot;&gt;/**&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#339966&quot;&gt; * @title Por que C++&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#339966&quot;&gt; * @author Wanderley Caloni Jr&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#339966&quot;&gt; * @date 31.01.2005&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#339966&quot;&gt; */&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;É natural que um programador tenha preferência por uma linguagem.&lt;br /&gt;
Geralmente por motivos pessoais que se refletem nas características da&lt;br /&gt;
linguagem. Eu, por exemplo, tenho vários motivos para amar essa&lt;br /&gt;
linguagem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linguagem C.&lt;/strong&gt; Todas as vantagens da linguagem C estão embutidas em C++.&lt;br /&gt;
E sem aquele papo erudito que deve-se programar em OO para ser C++.&lt;br /&gt;
Por ser multiparadigma, a linguagem também suporta o melhor da&lt;br /&gt;
programação procedural e estruturada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Popularidade. &lt;/strong&gt;C++ é o que há. Linguagem unânime e reconhecida no mundo&lt;br /&gt;
todo como de uso geral. Dificilmente você vai encontrar um algoritmo&lt;br /&gt;
que não tenha representação em C++.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Economia e Expressividade. &lt;/strong&gt;Pode parecer bobagem, mas coisas como&lt;br /&gt;
operador de incremento e valor em todas expressões permite que se faça&lt;br /&gt;
muita coisa com poucas linhas. Isso a torna muito expressiva. Isso, em&lt;br /&gt;
outras palavras, quer dizer que você pode juntar várias expressões&lt;br /&gt;
numa só, e esse conjunto será também uma expressão.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liberdade. &lt;/strong&gt;Em C++ você é o culpado de virtualmente qualquer coisa de&lt;br /&gt;
bom e ruim que aconteça no seu programa, pois você tem que seguir&lt;br /&gt;
poucas regras e tem que ser responsável no que faz. C++ não te ajuda a&lt;br /&gt;
seguir um bom modelo de programação com restrições embutidas. Isso a&lt;br /&gt;
torna difícil para iniciantes, mas conforme aumenta a experiência,&lt;br /&gt;
maior o prazer em programar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Portabilidade. &lt;/strong&gt;A possibilidade de compilar e rodar o seu código em&lt;br /&gt;
vários ambientes - de compilação e execução - é uma característica&lt;br /&gt;
útil e agradável. No meu caso é só agradável, pois dificilmente faço&lt;br /&gt;
código portável, apesar das boas noções que tenho sobre o assunto. E&lt;br /&gt;
são essas boas noções que me permitem afirmar que C++ suporta muito&lt;br /&gt;
bem essa possibilidade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rapidez. &lt;/strong&gt;Pode não ser importante em muitos casos, mas já é do instinto&lt;br /&gt;
do programador o desejo de eficiência no código. E nada como programar&lt;br /&gt;
numa linguagem extremamente eficiente em tempo de execução para se&lt;br /&gt;
sentir feliz de ver o código rodando.&lt;/p&gt;
&lt;p&gt;FIM&lt;/p&gt;
&lt;p&gt;[]s&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Strauss &lt;/strong&gt;-- Legal. Vou colocar minha água mercadológica no feijão e &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/ode_cpp&quot; title=&quot;Ode ao C++&quot;&gt;colocar no site.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Nos dias de hoje...&lt;/h4&gt;
&lt;p&gt;Não quis alterar o texto original, mas colocaria, além de rapidez, o título &lt;strong&gt;economia de recursos&lt;/strong&gt;. É incrível o quanto progredimos no quesito &lt;em&gt;hardware&lt;/em&gt; todos esses anos, e mesmo assim, existem linguagens e ambientes que parecem ter fome suficiente para consumir tudo e deixar um computador de última geração parecer um micro &quot;meio lerdinho&quot;. Felizmente não preciso dar nome aos bois, pois todos sabem ou conhecem pelo menos uma linguagem com essa característica.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Também não quis generalizar. C e C++ não são as duas únicas opções quando se fala em bom desempenho. Existe também assembly e &lt;a href=&quot;http://www.python.org/&quot; title=&quot;Python&quot;&gt;linguagens de script&lt;/a&gt;, que chegam inclusive a ser mais flexíveis e rápidas (além de mais produtivas).&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ainda acredito em tudo isso que C++ proporciona e irá continuar proporcionando por muto tempo. Para os que não seguiram o linque do artigo do Strauss, existe uma &lt;a href=&quot;http://www.research.att.com/~bs/applications.html&quot; title=&quot;C++ Applications&quot;&gt;modesta lista de programas escritos nessa linguagem ao redor do planeta&lt;/a&gt;. Muitos são conhecidíssimos e usados nos quatro cantos do mundo, muitas vezes em mais de um sistema operacional. C++ está morto? Longe disso... talvez pareça assim em território nacional, mas esse é o motivo de meus &lt;a href=&quot;http://groups.google.com/group/ccppbrasil/msg/64f084207c068689&quot; title=&quot;Apresentações no grupo C++&quot;&gt;votos de sucesso&lt;/a&gt; no início de nosso grupo C++.&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>2009-07-03T16:30:33+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Projeto: Eclipse + CppUnit</title>
		<link href="http://pedrolamarao.blogspot.com/2008/04/projeto-eclipse-cppunit.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-3194820270244944501</id>
		<updated>2008-04-06T20:30:52+00:00</updated>
		<content type="html">Estou prestes a apresentar para o ccppbrasil.org um projeto de integração da CppUnit com o Eclipse TPTP.&lt;br /&gt;&lt;br /&gt;Será uma oportunidade interessante de aprender a desenvolver sobre a plataforma OSGi e uma maneira de estimular a comunidade a aplicar as técnicas de testes de unidade.&lt;br /&gt;&lt;br /&gt;A arquitetura do TPTP Test é assim: para um determinado &quot;tipo de teste&quot; registra-se um adaptador de implantação, um adaptador de ambiente e um adaptador de execução, bem como um &lt;span&gt;runner&lt;/span&gt; para este &quot;tipo de teste&quot; no agente remoto.&lt;br /&gt;&lt;br /&gt;A tarefa será implementar esses adaptadores para programas executáveis nativos e bibliotecas compartilhadas, resolvendo LD_LIBRARY_PATH e assuntos relacionados, depois implementar uma biblioteca de suporte em C para que programas joguem na saída padrão o histórico de execução da forma correta e por fim implementar com um &lt;span&gt;wrapper&lt;/span&gt; Java um &lt;span&gt;runner&lt;/span&gt; para suites de teste CppUnit na forma de &lt;span&gt;plug-in&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Na verdade as tarefas ainda estão se abrindo porque não consegui dominar o problema de projeto completamente, o que me aborreceu um pouco, já que vou passar a semana ocupado com outros assuntos.&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/3006142001944566780-3194820270244944501?l=pedrolamarao.blogspot.com&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://pedrolamarao.blogspot.com/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://pedrolamarao.blogspot.com/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2009-07-03T22:00:09+00:00</updated>
		</source>
	</entry>

</feed>
