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

	<title>Planet C e C++ Brasil</title>
	<link rel="self" href="http://www.ccppbrasil.org/planet/atom.xml"/>
	<link href="http://www.ccppbrasil.org/planet/"/>
	<id>http://www.ccppbrasil.org/planet/atom.xml</id>
	<updated>2008-09-08T14:30:06+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="pt-br">
		<title type="html">Meus bugs fazem as pessoas perderem bastante dinheiro. Ainda bem.</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/oops"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/oops</id>
		<updated>2008-07-22T01:14:00+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Therac-25&quot;&gt;http://en.wikipedia.org/wiki/Therac-25&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/oops#comments&quot;&gt;0 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>2008-09-08T14:30:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Todos os fontes do meu site pelo Google Code</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/google_code_rocks"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/google_code_rocks</id>
		<updated>2008-07-15T01:38:36+00:00</updated>
		<content type="html">&lt;p&gt;Simplesmente muito legal mesmo: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;q=show:a5-9huShNYk:56JYvZ5QuX4&amp;sa=N&amp;ct=rdl&amp;cs_p=http://www.1bit.com.br&amp;cs_f=content.1bit/weblog&quot;&gt;Todos (quase todos) os fontes usados no blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;q=show:XBW9g4Qfcio:a5-9huShNYk:R4Qh7usNW5U&amp;sa=N&amp;ct=rd&amp;cs_p=http://www.1bit.com.br&amp;cs_f=content.1bit/weblog/sopa_de_letrinhas_wtl-001&amp;start=1&quot;&gt;Outline do exemplo de WTL.&lt;/a&gt; Clique nos links dos includes e veja&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=omni_ptr&quot;&gt;omni_ptr, meu smart pointer COM mais esperto que o os outros&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Putz!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/google_code_rocks#comments&quot;&gt;0 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>2008-09-08T14:30:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Win32: sincronização</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/win32_sync_1"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/win32_sync_1</id>
		<updated>2008-07-13T04:49:11+00:00</updated>
		<content type="html">&lt;p&gt;Em um post do passado eu falei sobre o maravilhoso mundo das threads e de todos problemas que as threads resolvem. Agora é a hora de começarmos a ver os inúmeros problemas que as threads criam. Pensou que ia ser fácil? Pois é, já começou errado...&lt;/p&gt;

&lt;p&gt;Como um trecho de código vale mais que &lt;a href=&quot;http://en.wikipedia.org/wiki/Mass-energy_equivalence&quot;&gt;e = m * pow(c, 2);&lt;/a&gt;, vamos começar com um exemplo clássico de problema que acontece quando temos várias threads compartilhando um recurso:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&lt;pre&gt; 
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &lt;span class=&quot;literal&quot;&gt;&quot;stdafx.h&quot;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;comment&quot;&gt;/*
conteúdo do stdafx:
&amp;nbsp;
#ifndef _WIN32_WINNT		
#define _WIN32_WINNT 0x0501
#endif						
&amp;nbsp;
#include &amp;lt;Windows.h&gt;
&amp;nbsp;
#include &amp;lt;stdio.h&gt;
#include &amp;lt;tchar.h&gt;
&amp;nbsp;
#include &amp;lt;iostream&gt;
#include &amp;lt;vector&gt;
&amp;nbsp;
#include &amp;lt;assert.h&gt;
#define ASSERT assert
*/&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; std::cout;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; std::endl;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; std::vector;
&amp;nbsp;
&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// classe simples (e incompleta) que implementa uma lista
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// duplamente ligada. Se você disse &quot;hã?&quot;, leia o artigo
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// sobre &quot;Linked list&quot; da wikipedia.
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&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&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_;
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt;:
&amp;nbsp;
  LinkedList()
  {
    count_ = 0;
    rootNode_.previous = rootNode_.next = NULL;
  }
&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; AddAfter(NODE* node, T data)
  {
    NODE* newNode = &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; NODE();
&amp;nbsp;
    &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;// primeiro item?
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(node-&gt;next == NULL)
    {
      ASSERT(node-&gt;previous == NULL &amp;amp;&amp;amp; node == &amp;amp;rootNode_);
      node-&gt;next = node-&gt;previous = node;
      node-&gt;data = data;
      &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;;
    }
    &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
    {
      &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;      &lt;span class=&quot;comment&quot;&gt;// refaz todos os links, para que o nó inserido
&lt;/span&gt;      &lt;span class=&quot;comment&quot;&gt;// fique entre o nó passado como parâmetro
&lt;/span&gt;      &lt;span class=&quot;comment&quot;&gt;// e o próximo
&lt;/span&gt;      &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;      newNode-&gt;next = node-&gt;next;
      node-&gt;next = newNode;
      newNode-&gt;previous = node;
      newNode-&gt;next-&gt;previous = newNode;
&amp;nbsp;
      newNode-&gt;data = data;
    }
&amp;nbsp;
    count_++;
  }
&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; Dump()
  {
    cout &amp;lt;&amp;lt; &lt;span class=&quot;literal&quot;&gt;&quot;== DUMP START ==&quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
&amp;nbsp;
    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(rootNode_.next == NULL)
    {
      ASSERT(rootNode_.previous == NULL);
      cout &amp;lt;&amp;lt; &lt;span class=&quot;literal&quot;&gt;&quot;== DUMP END ==&quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
      &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;;
    }
&amp;nbsp;
    cout &amp;lt;&amp;lt; rootNode_.data &amp;lt;&amp;lt; endl;

&amp;nbsp;
    &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(NODE* node = rootNode_.next ; node != &amp;amp;rootNode_ ; node = node-&gt;next)
      cout &amp;lt;&amp;lt; node-&gt;data &amp;lt;&amp;lt; endl;
&amp;nbsp;
    cout &amp;lt;&amp;lt; &lt;span class=&quot;literal&quot;&gt;&quot;== DUMP END ==&quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
  }

&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; Add(T data)
  {
    AddAfter(&amp;amp;rootNode_, data);
  }
&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; Count()
  {
    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(rootNode_.next == NULL)
    {
      ASSERT(rootNode_.previous == NULL);
      &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; 0;
    }

&amp;nbsp;
    &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; count = 1;
&amp;nbsp;
    &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(NODE* node = rootNode_.next ; node != &amp;amp;rootNode_ ; node = node-&gt;next)
      count++;
&amp;nbsp;
    &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; count;
  }

&amp;nbsp;
};
&amp;nbsp;
&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// estrutura para informar a nossa worker thread o que ela
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// deve fazer
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt; WORKER_THREAD_INFO 
{
  LinkedList&amp;lt;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt;&gt;* list;
  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; addCount;
};

&amp;nbsp;
&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// nossa &quot;linha trabalhadora&quot; (aposto que algum livro traduzido
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// deve usar esse termo, aposto). Ela adicionará itens na 
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;// nossa lista ligada
&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;DWORD WINAPI WorkerThread(&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;* lpv)
{
  WORKER_THREAD_INFO* info = (WORKER_THREAD_INFO*)lpv;
&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(DWORD a = 0 ; a &amp;lt; info-&gt;addCount; a++)
  {
    info-&gt;list-&gt;Add(a);
&amp;nbsp;
    &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;// dormir é uma boa forma de gastar um tempo
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;// e simular trabalho. Pena que a Win32 API
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;// não tem um função SleepInTheBathroom();
&lt;/span&gt;    &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;    Sleep(10);
  }
&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; 0;
}
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; main()
{
  LinkedList&amp;lt;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt;&gt; list;

&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; DWORD threadCount = 100;
  DWORD dwThreadID;
  vector&amp;lt;HANDLE&gt; threads;
&amp;nbsp;
  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// todas as threads vão adicionar a mesma quantidade,
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// para fins de teste e demonstração está mais que bom.
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  WORKER_THREAD_INFO info;
  info.list = &amp;amp;list;
  info.addCount = 100;
&amp;nbsp;
  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// criando todas as threads
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(DWORD a = 0 ; a &amp;lt; threadCount ; a++)
    threads.push_back(CreateThread(NULL, NULL, &amp;amp;WorkerThread, &amp;amp;info, NULL, &amp;amp;dwThreadID));
&amp;nbsp;
  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// esperando TODAS as threads retornarem
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//             |___________________________________
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//                                                 |
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//                                                 v
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  WaitForMultipleObjects(threadCount, &amp;amp;threads[0], TRUE, INFINITE);
&amp;nbsp;

  list.Dump();
&amp;nbsp;
  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// isso deve mostrar 10.000.
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  cout &amp;lt;&amp;lt; &lt;span class=&quot;literal&quot;&gt;&quot;count: &quot;&lt;/span&gt; &amp;lt;&amp;lt; list.Count();
&amp;nbsp;

  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// vou deixar os handles abertos, como o programa vai 
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// morrer agora o Windows se vira com isso...
&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;&amp;nbsp;
  &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bom, 100 threads criando 100 registros na nossa lista ligada devem criar 10.000 registros, certo? Faça alguns testes: rode primeiro em Debug. Depois rode em Release. Depois brinque com o número do Sleep. Depois repita os testes em diferentes máquinas, com diferentes clocks e quantidades de cores. Olhe algumas saídas que eu obtive durante os testes, usando um Core 2 Duo (2 cores):

&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
== Versão Debug ==
count: 92
count: 99
count: 98
count: 99
== Versão Release ==
count: 40
count: 99
count: 97
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ué, não deveria ser 10.000? Mudando o tempo do Sleep e a quantidades de threads eu consegui outros números, completamente diferentes. Isso é o chamado &lt;a href=&quot;http://en.wikipedia.org/wiki/Race_condition&quot;&gt;race condition&lt;/a&gt;, um problema ou bug que depende de timming e coisas fora do seu controle, um problema típico de programação multithread. Como a manifestação do bug depende de diversos fatores fora do seu controle - velocidade do processador, carga de processamento da máquina, etc - esse tipo de problema é sempre muito difícil de reproduzir e debugar.&lt;/p&gt;

&lt;p&gt;O principal problema desse código está no trecho de código que adiciona um item na lista:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
      newNode-&gt;next = node-&gt;next;
      node-&gt;next = newNode;
      newNode-&gt;previous = node;
      newNode-&gt;next-&gt;previous = newNode;
      newNode-&gt;data = data;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Esse trecho de código deve ser executado de forma atômica para que a lista ligada continue válida, com todos os ponteiros apontando para seus próximos e anteriores de forma correta. Depois da execução da segunda linha, o estado da lista permanece inválido até que a última linha desse trecho seja executada. Como uma thread pode ser interropida a qualquer hora (inclusive entre essas linhas), a manipulação dos ponteiros é feitas de forma incorreta e desordenada. É grande a probabilidade (isso depende do scheduler) de que a última thread que estava &quot;mexendo&quot; na lista a tenha deixado em um estado inválido. Isso pode gerar um erro de lógica (nosso caso) ou um GPF difícil de achar, que cada hora acontece em um lugar do código.&lt;/p&gt;

&lt;p&gt;No próximo post começaremos a ver os recursos da API do Windows para resolver esse problema e permitir que várias threads manipulem um mesmo recurso ao mesmo tempo.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_sync_1#comments&quot;&gt;0 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>2008-09-08T14:30:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Modelagem UML Genérica</title>
		<link href="http://www.angusyoung.org/2008/06/28/modelagem-uml-generica/"/>
		<id>http://www.angusyoung.org/?p=171</id>
		<updated>2008-06-28T20:49:33+00:00</updated>
		<content type="html">&lt;p&gt;Recebi do meu amigo Bruno, lá de Chapecó, essa excelente modelagem UML genérica que se aplica a &lt;strong&gt;qualquer &lt;/strong&gt;aplicação. Agora você não precisa mais perder tempo fazendo a análise e design. É só seguir os diagramas abaixo e tudo ficará bem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagrama de Classes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/class-diagram.png&quot;&gt;&lt;img class=&quot;alignnone size-thumbnail wp-image-172&quot; title=&quot;Diagrama de Classes&quot; src=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/class-diagram-150x45.png&quot; alt=&quot;Diagrama de Classes&quot; width=&quot;150&quot; height=&quot;45&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagrama de Sequência&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/sequence-diagram.png&quot;&gt;&lt;img class=&quot;alignnone size-thumbnail wp-image-173&quot; title=&quot;Diagrama de Sequência&quot; src=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/sequence-diagram-150x125.png&quot; alt=&quot;Diagrama de Sequência&quot; width=&quot;150&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagrama de Casos de Uso&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/use-case-diagram.png&quot;&gt;&lt;img class=&quot;alignnone size-thumbnail wp-image-174&quot; title=&quot;Diagrama de Casos de Uso&quot; src=&quot;http://www.angusyoung.org/wp-content/uploads/2008/06/use-case-diagram-150x112.png&quot; alt=&quot;Diagrama de Casos de Uso&quot; width=&quot;150&quot; height=&quot;112&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Otavio Rodolfo Piske</name>
			<uri>http://www.angusyoung.org</uri>
		</author>
		<source>
			<title type="html">For Fun and Profit » Desenvolvimento</title>
			<subtitle type="html">Um blog sobre ciência e tecnologia</subtitle>
			<link rel="self" href="http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed"/>
			<id>http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed</id>
			<updated>2008-09-07T07:00:23+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://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!178.entry</id>
		<updated>2008-06-24T11:09:06+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;img src=&quot;http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Two+versions+for+Lock-Free+Stack&amp;referrer=&quot; width=&quot;1px&quot; height=&quot;1px&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;img alt=&quot;&quot; width=&quot;0px&quot; height=&quot;0px&quot; src=&quot;http://c.live.com/c.gif?NC=31263&amp;NA=1149&amp;PI=73329&amp;RF=&amp;DI=3919&amp;PS=85545&amp;TP=fabiogaluppo.spaces.live.com&amp;GT1=fabiogaluppo&quot; /&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>
			<subtitle type="html">The new house is here. The old is there: http://fabiogaluppo.blogspot.com/</subtitle>
			<link rel="self" href="http://fabiogaluppo.spaces.live.com/feed.rss"/>
			<id>http://fabiogaluppo.spaces.live.com/feed.rss</id>
			<updated>2008-09-08T13:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">A volta dos que foram mas voltaram logo</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/de_volta"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/de_volta</id>
		<updated>2008-06-21T19:42:44+00:00</updated>
		<content type="html">&lt;p&gt;Algumas notícias importantes para movimentar meu quase abandonado site enquanto eu fico pensando em uma boa desculpa para essa situação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voltei para São Paulo, e conseqüentemente, estou quase toda terça degustando um chopp no Bar Barão. Sim, isso é um convite. Para todos.
&lt;li&gt;O seminário da Tempo Real sobre Portabilidade e Performance foi muito bom, muito bom mesmo. Parabéns a todos nós do &quot;C/C++ Brasil&quot; por fazermos eventos com qualidade técnica tão alta, coisa que eu nunca vi nessas bandas. Fico feliz por poder compartilhar o que eu aprendi em incontáveis horas programando, dezenas de livros e outras dezenas de sites e artigos lidos. E fico muito mais feliz em poder aprender com pessoas que percorreram esse mesmo caminho, muitos que estudaram e leram muito mais do que eu. Eu sei que sou bom nesse negócio de programação (modéstia é um defeito que eu não tenho), mas minha vontade de aprender ainda é bem maior que meu ego. É **muito** bom conhecer e compartilhar conhecimento com gente que é melhor do que eu. Parabéns e obrigado a todos.
&lt;li&gt;Depois de mais de um mês offline (sim, essa é a desculpa), segue aqui a apresentação usada na minha palestra &quot;Portabilidade via STL e Boost&quot;, onde eu fiz pelo STL e Boost o que os palestrantes da Microsoft/Sun/IBM/etc costumam fazer pelas empresas que pagam seus salários:
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;

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

&lt;p&gt;Como um trecho de código vale mais do que uma apresentação cheia de piadinhas não-tão-engraçadas, segue o dito cujo que usei durante a demo da palestra:

&lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;keyword&quot;&gt;
#define&lt;/span&gt; _CRT_SECURE_NO_WARNINGS&lt;span class=&quot;keyword&quot;&gt;
#define&lt;/span&gt; _SCL_SECURE_NO_WARNINGS
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;vector&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;string&gt;&lt;span class=&quot;keyword&quot;&gt;

#include&lt;/span&gt; &amp;lt;sstream&gt;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;iostream&gt;
&amp;nbsp;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/thread.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/bind.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/asio.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/function.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/array.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/lexical_cast.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/shared_array.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/enable_shared_from_this.hpp&amp;gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/ptr_container/ptr_map.hpp&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/ptr_container/ptr_set.hpp&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/algorithm/string.hpp&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/algorithm/string/join.hpp&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/format.hpp&gt;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/date_time/gregorian/gregorian.hpp&gt;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/program_options.hpp&gt;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/tuple/tuple.hpp&gt;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &amp;lt;boost/foreach.hpp&gt;
&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;
#include&lt;/span&gt; &lt;span class=&quot;literal&quot;&gt;&quot;boost/filesystem.hpp&quot;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt; 
#include&lt;/span&gt; &amp;lt;iostream&gt;          
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;namespace&lt;/span&gt; std;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; boost::lexical_cast;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; boost::format;
&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; boost::shared_ptr;
&amp;nbsp;
boost::mutex log_mutex;
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; Log(&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; level, &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; string&amp;amp; str)
{
	boost::mutex::scoped_lock l(log_mutex);
&amp;nbsp;
	cout &amp;lt;&amp;lt; 
		boost::format(&lt;span class=&quot;literal&quot;&gt;&quot;%d - %s&quot;&lt;/span&gt;) % level % str
		&amp;lt;&amp;lt; endl;
}
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; f(&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; level, string s1, string s2)
{
	Log(level, s1 + string(&lt;span class=&quot;literal&quot;&gt;&quot; &quot;&lt;/span&gt;) + s2);
}
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;typedef&lt;/span&gt; vector&amp;lt;shared_ptr&amp;lt;boost::thread&gt; &gt; UmVectorDeThreads;
&amp;nbsp;
UmVectorDeThreads Test_Threads()
{&lt;span class=&quot;keyword&quot;&gt;
#&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;/span&gt; 0
	boost::array&amp;lt;boost::thread, 32&gt; threads;
	threads.at(2) = boost::thread(boost::bind(&amp;amp;f, &lt;span class=&quot;literal&quot;&gt;&quot;Eu programa aos sábados.&quot;&lt;/span&gt;, &lt;span class=&quot;literal&quot;&gt;&quot;E daí&quot;&lt;/span&gt;));&lt;span class=&quot;keyword&quot;&gt;

#endif&lt;/span&gt;
&amp;nbsp;
	boost::array&amp;lt; shared_ptr&amp;lt;boost::thread&gt;, 32&gt; threads;
&amp;nbsp;
	&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(&lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; i = 0 ; i &amp;lt; threads.size() ; i++)
	{
		threads[i] = shared_ptr&amp;lt;boost::thread&gt;(
			&lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; boost::thread(
			boost::bind(&amp;amp;f, 2, &lt;span class=&quot;literal&quot;&gt;&quot;Eu programo aos sabados.&quot;&lt;/span&gt;, 
			lexical_cast&amp;lt;string&gt;(i))));
	}
&amp;nbsp;
	&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;	&lt;span class=&quot;comment&quot;&gt;// ai...
&lt;/span&gt;	&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;	&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(boost::array&amp;lt; shared_ptr&amp;lt;boost::thread&gt;, 32&gt;::iterator i 
		= threads.begin() ; i != threads.end() ; ++i)
	{
&amp;nbsp;
	}
&amp;nbsp;
	BOOST_FOREACH(shared_ptr&amp;lt;boost::thread&gt; t, threads)
	{
&amp;nbsp;
	}
&amp;nbsp;
	boost::thread t;
&amp;nbsp;
&amp;nbsp;
	UmVectorDeThreads threads2(threads.size());
&amp;nbsp;
	std::copy(threads.begin(), threads.end(), threads2.begin());
&amp;nbsp;
	&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; threads2;
}
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; VamosEsperarAsThreads(UmVectorDeThreads&amp;amp; threads)
{
	BOOST_FOREACH(shared_ptr&amp;lt;boost::thread&gt; t, threads)
	{
		t-&gt;join();
	}
}
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; Test_FileSystem()
{
	&lt;span class=&quot;keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;namespace&lt;/span&gt; boost::filesystem;          
	path p(&lt;span class=&quot;literal&quot;&gt;&quot;c:\\temp\\abobrinha&quot;&lt;/span&gt;);
&amp;nbsp;
	&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(path::iterator i = p.begin() ; i != p.end() ; ++i)
		cout &amp;lt;&amp;lt; *i &amp;lt;&amp;lt; endl;
}
&amp;nbsp;
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; Test_STL()
{
	vector&amp;lt;string&gt; v;
	list&amp;lt;string&gt; l;
	map&amp;lt;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt;, string&gt; m;
&amp;nbsp;
	&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; a = 0 ; a &amp;lt; 20 ; a++)
	{
		string nome = &lt;span class=&quot;literal&quot;&gt;&quot;Nome &quot;&lt;/span&gt; + lexical_cast&amp;lt;string&gt;(a);
		v.push_back(nome);
		m[a] = nome;
	}
&amp;nbsp;
	copy(v.begin(), v.end(), back_inserter(l));
&amp;nbsp;

	BOOST_FOREACH(&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; string&amp;amp; nome, v)
		cout &amp;lt;&amp;lt; nome &amp;lt;&amp;lt; endl;
&amp;nbsp;
	for_each(l.begin(), l.end(), boost::bind(&amp;amp;Log, 1, _1));
}
&amp;nbsp;
&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; main()
{
	UmVectorDeThreads threads = Test_Threads();
&amp;nbsp;
	Test_STL();
	Test_FileSystem();
&amp;nbsp;
	for_each(threads.begin(), threads.end(), 
		boost::bind(&amp;amp;boost::thread::join, _1));
&amp;nbsp;
	&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;	&lt;span class=&quot;comment&quot;&gt;// olha mamãe, sem desalocar memória
&lt;/span&gt;	&lt;span class=&quot;comment&quot;&gt;//
&lt;/span&gt;	&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/de_volta#comments&quot;&gt;7 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>2008-09-08T14:30:05+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://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!176.entry</id>
		<updated>2008-06-13T13:11:13+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;&lt;img src=&quot;http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5300274535508806924&amp;page=RSS%3a+Samples+from+my+Concurrency+Talk+at+Semin%c3%a1rio+TempoReal+C%2b%2b+Portabilidade+e+Performance&amp;referrer=&quot; width=&quot;1px&quot; height=&quot;1px&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;img alt=&quot;&quot; width=&quot;0px&quot; height=&quot;0px&quot; src=&quot;http://c.live.com/c.gif?NC=31263&amp;NA=1149&amp;PI=73329&amp;RF=&amp;DI=3919&amp;PS=85545&amp;TP=fabiogaluppo.spaces.live.com&amp;GT1=fabiogaluppo&quot; /&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>
			<subtitle type="html">The new house is here. The old is there: http://fabiogaluppo.blogspot.com/</subtitle>
			<link rel="self" href="http://fabiogaluppo.spaces.live.com/feed.rss"/>
			<id>http://fabiogaluppo.spaces.live.com/feed.rss</id>
			<updated>2008-09-08T13:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Instalador da boost</title>
		<link href="http://www.skhaz.com/blog/instalador-da-boost/"/>
		<id>http://www.skhaz.com/blog/?p=117</id>
		<updated>2008-06-08T19:55:48+00:00</updated>
		<content type="html">&lt;p&gt;Para quem ainda tem dificuldades para compilar a biblioteca &lt;a href=&quot;http://www.boost.org/&quot;&gt;boost&lt;/a&gt;, eu encontrei um instalador que baixa os pacotes dependendo de suas escolhas (multithreaded, static, debug, etc) sem contar que nos polpa de ter que esperar pela compilação, pena que é só para o Visual C++.&lt;br /&gt;
&lt;a href=&quot;http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostconfig1.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-118&quot; title=&quot;boostconfig1&quot; src=&quot;http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostconfig1-300x234.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;234&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostinstaller2.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-120&quot; title=&quot;boostinstaller2&quot; src=&quot;http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostinstaller2-300x234.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;234&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O instalador pode ser baixado &lt;a href=&quot;http://www.boost-consulting.com/boost_1_35_0_setup.exe&quot;&gt;aqui&lt;/a&gt;, mais informações em &lt;a href=&quot;http://www.boost-consulting.com/products/free&quot;&gt;http://www.boost-consulting.com/products/free&lt;/a&gt;&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>2008-08-07T12:20: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">&lt;h1 id=&quot;logo&quot;&gt;&lt;img alt=&quot;WordPress&quot; src=&quot;http://www.caloni.com.br/blog/archives/category/c/wp-admin/images/wordpress-logo.png&quot; /&gt;&lt;/h1&gt;
	&lt;p&gt;
&lt;h1&gt;Error establishing a database connection&lt;/h1&gt;
&lt;p&gt;This either means that the username and password information in your &lt;code&gt;wp-config.php&lt;/code&gt; file is incorrect or we can't contact the database server at &lt;code&gt;localhost&lt;/code&gt;. This could mean your host's database server is down.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Are you sure you have the correct username and password?&lt;/li&gt;
	&lt;li&gt;Are you sure that you have typed the correct hostname?&lt;/li&gt;
	&lt;li&gt;Are you sure that the database server is running?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the &lt;a href=&quot;http://wordpress.org/support/&quot;&gt;WordPress Support Forums&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;</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>2008-06-13T19:20:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Agendamento de Tarefas</title>
		<link href="http://www.skhaz.com/blog/agendamento-de-tarefas/"/>
		<id>http://www.skhaz.com/blog/?p=112</id>
		<updated>2008-06-05T20:18:50+00:00</updated>
		<content type="html">&lt;p&gt;Essa é minha implementação de um pequeno sistema de agendamento de tarefas, que futuramente usarei em um outro projeto, achei que ficou legal então resolvi postar. Vamos à implementação&lt;/p&gt;
&lt;p&gt;task.hpp&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
#ifndef _task_hpp
#define _task_hpp

#include &amp;lt;ctime&amp;gt;
#include &amp;lt;boost /function.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /bind.hpp&amp;gt;

class task
{
	public:
		explicit task(const boost::function&amp;lt;void ()&amp;gt;&amp;amp; callback)
		: _call_back(callback)
		, _call_count(0)
		, _total_time_used(0)
		{
		}

		virtual ~task() { }

		virtual void before_task() { }

		void do_task()
		{
			before_task();
			_call_back();
			after_task();
		}

		virtual void after_task() { }

		void set_callback(const boost::function&amp;lt;/void&amp;gt;&amp;lt;void ()&amp;gt;&amp;amp; callback)
		{
			_call_back = callback;
		}

		const boost::function&amp;lt;/void&amp;gt;&amp;lt;void ()&amp;gt;&amp;amp; get_callback() const
		{
			return _call_back;
		}

		bool is_valid() const
		{
			return true;
		}

	private:
		boost::function&amp;lt;/void&amp;gt;&amp;lt;void ()&amp;gt; _call_back;
		std::size_t _call_count;
		std::clock_t _total_time_used;
};

#endif
&lt;/pre&gt;
&lt;p&gt;schedule.hpp&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
#ifndef _schedule_hpp
#define _schedule_hpp

#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;deque&amp;gt;
#include &amp;lt;boost /pool/pool_alloc.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /shared_ptr.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /noncopyable.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /thread/thread.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /thread/xtime.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /thread/mutex.hpp&amp;gt;

#include &amp;quot;task.hpp&amp;quot;

using std::for_each;
using std::deque;
using boost::shared_ptr;

class task;
typedef shared_ptr&amp;lt;task&amp;gt; task_ptr;
typedef deque&amp;lt;task_ptr , boost::pool_allocator&amp;lt;task_ptr&amp;gt; &amp;gt; deque_task;

class schedule : public boost::noncopyable
{
	public:
		schedule() : job(boost::bind(&amp;amp;schedule::thread_dispatcher, this))
		{
			_thread_sleep.sec = 10;

			try
			{
				job.join();
			}

			catch (boost::thread_interrupted&amp;amp;) { /* don't care... */ }
		}

		virtual ~schedule() { }

		void add_task(const shared_ptr&amp;lt;task&amp;gt;&amp;amp; _task)
		{
			boost::mutex::scoped_lock lock(monitor);

			deque_task::const_iterator it = std::find(_task_pool.begin(),
					_task_pool.end(), _task);

			if (it == _task_pool.end())
			{
				_task_pool.push_back(_task);
			}

			else {
				// duplicate item
			}
		}

		void remove_task(const shared_ptr&amp;lt;/task&amp;gt;&amp;lt;task&amp;gt;&amp;amp; _task)
		{
			boost::mutex::scoped_lock lock(monitor);

			deque_task::iterator it = std::find(_task_pool.begin(),
					_task_pool.end(), _task);

			if (it != _task_pool.end())
			{
				_task_pool.erase(it);
			}

			else {
				// does't exist
			}
		}

	protected:
		void thread_dispatcher()
		{
			for (;;)
			{
				for_each(_task_pool.begin(), _task_pool.end(),
					boost::mem_fn(&amp;amp;task::do_task));

				boost::thread::sleep(_thread_sleep);
			}
		}

	private:
		deque_task _task_pool;
		boost::thread job;
		boost::mutex monitor;
		boost::xtime _thread_sleep;
};

#endif
&lt;/pre&gt;
&lt;p&gt;Unidade para testes, main.cpp&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;boost /scoped_ptr.hpp&amp;gt;
#include &amp;lt;/boost&amp;gt;&amp;lt;boost /bind.hpp&amp;gt;

#include &amp;quot;schedule.hpp&amp;quot;

void f1()
{
	std::cout &amp;lt; &amp;lt; &amp;quot;f1()&amp;quot; &amp;lt;&amp;lt; std::endl;
}

void f2()
{
	std::cout &amp;lt;&amp;lt; &amp;quot;f2()&amp;quot; &amp;lt;&amp;lt; std::endl;
}

int main()
{
	boost::scoped_ptr&amp;lt;schedule&amp;gt; _schedule(new schedule());

	shared_ptr&amp;lt;task&amp;gt; _task1 (new task(f1));
	shared_ptr&amp;lt;/task&amp;gt;&amp;lt;task&amp;gt; _task2 (new task(f2));

	_schedule-&amp;gt;add_task(_task1);
	_schedule-&amp;gt;add_task(_task1); // repetido, nao insere...
	_schedule-&amp;gt;add_task(_task2);

	_schedule-&amp;gt;start();

	return 0;
}
&lt;/pre&gt;
&lt;p&gt;Agradecimentos&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://vertexbuffer.wordpress.com/&quot;&gt;Daniel&lt;/a&gt; pela sugestão de usar fila e apenas uma thread ao invés de uma para cada tarefa e assim evitando busy-waiting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.projetoarret.com.br/&quot;&gt;Alex&lt;/a&gt; pelos testes de compatibilidade com mingw e msvc (vide &lt;a href=&quot;http://www.skhaz.com/blog/deque-shared_ptr-for_each-mem_fun-cabummm/&quot;&gt;mem_fun e shared_ptr&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class=&quot;download&quot; href=&quot;http://www.skhaz.com/blog/wp-content/uploads/2008/06/scheduler.zip&quot;&gt;schedule.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&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>2008-08-07T12:20:04+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.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">&lt;h1 id=&quot;logo&quot;&gt;&lt;img alt=&quot;WordPress&quot; src=&quot;http://www.caloni.com.br/blog/archives/category/c/wp-admin/images/wordpress-logo.png&quot; /&gt;&lt;/h1&gt;
	&lt;p&gt;
&lt;h1&gt;Error establishing a database connection&lt;/h1&gt;
&lt;p&gt;This either means that the username and password information in your &lt;code&gt;wp-config.php&lt;/code&gt; file is incorrect or we can't contact the database server at &lt;code&gt;localhost&lt;/code&gt;. This could mean your host's database server is down.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Are you sure you have the correct username and password?&lt;/li&gt;
	&lt;li&gt;Are you sure that you have typed the correct hostname?&lt;/li&gt;
	&lt;li&gt;Are you sure that the database server is running?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the &lt;a href=&quot;http://wordpress.org/support/&quot;&gt;WordPress Support Forums&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;</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>2008-06-13T19:20:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Dica: Corrigindo erro da user32.lib no CMake com NMake Makefiles</title>
		<link href="http://www.angusyoung.org/2008/05/31/dica-corrigindo-erro-da-user32lib-no-cmake-com-nmake-makefiles/"/>
		<id>http://www.angusyoung.org/?p=160</id>
		<updated>2008-05-31T17:59:21+00:00</updated>
		<content type="html">&lt;p&gt;No CMake, quando se usa o gerador NMake Makefiles ele costuma dar o erro:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;LINK : fatal error LNK1104: cannot open file 'user32.lib'&lt;br /&gt;
LINK Pass 1 failed.  with 2&lt;br /&gt;
NMAKE : fatal error U1077: &amp;#8216;&amp;#8221;C:\Arquivos de programas\CMake&lt;br /&gt;
2.6\bin\cmake.exe&amp;#8221;&amp;#8216; : return code &amp;#8216;0xffffffff&amp;#8217;&lt;br /&gt;
Stop.&lt;br /&gt;
NMAKE : fatal error U1077: &amp;#8216;&amp;#8221;C:\Arquivos de programas\Microsoft Visual&lt;br /&gt;
Studio 8\VC\BIN\nmake.exe&amp;#8221;&amp;#8216; : return code &amp;#8216;0&amp;#215;2&amp;#8242;&lt;br /&gt;
Stop.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mesmo que você tenha o Microsoft Platform SDK, isso ocorre porque o linker não consegue encontrar a user32.lib. Para projetos que usam o gerador do Visual Studio você pode configurar isso seguindo as recomendações da configuração do SDK, mas para resolver este problema em projetos que usam a NMake, você precisa adicionar o path da user32.lib na variável de ambiente LIB. Você pode fazer isso na mão, após iniciar o prompt de comando do Visual Studio: &lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;set LIB=%LIB%;&quot;C:\Arquivos de programas\Microsoft Platform SDK\Lib&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ou então adicionar o path nas variáveis de ambiente do sistema através da aba &amp;#8220;Avançado&amp;#8221; nas propriedades do sistema.&lt;/p&gt;</content>
		<author>
			<name>Otavio Rodolfo Piske</name>
			<uri>http://www.angusyoung.org</uri>
		</author>
		<source>
			<title type="html">For Fun and Profit » Desenvolvimento</title>
			<subtitle type="html">Um blog sobre ciência e tecnologia</subtitle>
			<link rel="self" href="http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed"/>
			<id>http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed</id>
			<updated>2008-09-07T07:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">deque + shared_ptr + for_each + mem_fun = cabumm</title>
		<link href="http://www.skhaz.com/blog/deque-shared_ptr-for_each-mem_fun-cabummm/"/>
		<id>http://www.skhaz.com/blog/?p=110</id>
		<updated>2008-05-28T16:03:04+00:00</updated>
		<content type="html">&lt;p&gt;Recentemente tive problemas com mem_fun e shared_ptr em um loop for_each&lt;/p&gt;
&lt;p&gt;Os elementos&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
typedef shared_ptr&amp;lt;task&amp;gt; task_ptr;
typedef deque&amp;lt;task_ptr , pool_allocator&amp;lt;task_ptr&amp;gt; &amp;gt; deque_task_ptr;
&lt;/pre&gt;
&lt;p&gt;Agora a combinação explosiva&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
for_each(_task_pool.begin(), _task_pool.end(),
       std::mem_fun(&amp;amp;task::do_task));
&lt;/pre&gt;
&lt;p&gt;O problema está em usar std::mem_fun, ela não suporta chamar métodos de uma classe que estão em um shared_ptr, eu poderia ter usado bind, mais preferi manter o código, como a boost tem sua própria implementação de &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/libs/bind/mem_fn.html&quot;&gt;mem_fn&lt;/a&gt; ficando assim:&lt;/p&gt;
&lt;pre class=&quot;syntax-highlight:cpp&quot;&gt;
for_each(_task_pool.begin(), _task_pool.end(),
       boost::mem_fn(&amp;amp;task::do_task));
&lt;/pre&gt;
&lt;p&gt;Resolvido, obrigado &lt;a href=&quot;http://www.projetoarret.com.br/&quot;&gt;Alex&lt;/a&gt; por reportar o problema.&lt;br /&gt;
&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>2008-08-07T12:20:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">IDE online</title>
		<link href="http://www.angusyoung.org/2008/05/21/ide-online/"/>
		<id>http://www.angusyoung.org/?p=150</id>
		<updated>2008-05-21T10:56:44+00:00</updated>
		<content type="html">&lt;p&gt;Meu amigo &lt;a title=&quot;Diego&quot; href=&quot;http://wodanaz.blogspot.com/&quot;&gt;Diego&lt;/a&gt; me passou a dica sobre o &lt;a title=&quot;Code IDE&quot; href=&quot;http://www.codeide.com/&quot;&gt;CodeIDE&lt;/a&gt;. Segundo ele, &lt;em&gt;é um site onde pode executar códigos, suporta várias linguagens como Pascal, C++, Perl, JavaScript, HTML, e outras. Você digita o código, e mandar executar, já ve o resultado na página mesmo.&lt;/em&gt;&lt;em&gt; O site também oferece suporte a chat e grupos, o que possibilita vc explicar o código para alguém, discutir sobre um código, etc, etc. Aqui tem um artigo sobre o site&lt;br /&gt;
&lt;a href=&quot;http://blog.cidandrade.pro.br/technology/interface-online-para-ensino-de-programacao-codeide/&quot; target=&quot;_blank&quot;&gt;http://blog.cidandrade.pro.br/technology/interface-online-para-ensino-de-programacao-codeide/&lt;/a&gt; &amp;#8230;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Eu achei o site uma grande mão na roda pra quando você quer mostrar alguma técnica ou explicar algo para alguém. Além disso, ele tem um recurso de realce de sintaxe (syntax highlight) que melhora a percepção do código.&lt;/p&gt;</content>
		<author>
			<name>Otavio Rodolfo Piske</name>
			<uri>http://www.angusyoung.org</uri>
		</author>
		<source>
			<title type="html">For Fun and Profit » Desenvolvimento</title>
			<subtitle type="html">Um blog sobre ciência e tecnologia</subtitle>
			<link rel="self" href="http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed"/>
			<id>http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed</id>
			<updated>2008-09-07T07:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Membros privados em estruturas C</title>
		<link href="http://blog.blabos.org/?p=38"/>
		<id>http://blog.blabos.org/?p=38</id>
		<updated>2008-05-19T00:08:31+00:00</updated>
		<content type="html">&lt;p align=&quot;justify&quot;&gt;Esta semana, lá no trabalho tive mais uma prova que paradigma de programação é algo completamente independente de linguagem, ou seja, não é pelo fato de você estar programando em C++, compilando com o g++ que o seu código vai ser orientado a objetos, tão pouco, se você programa em ANSI C o seu código obrigatoriamente vai ser estruturado ou você estará impedido de programar orientado a objetos.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Estou lendo certo, Orientação a Objetos em ANSI C?&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Sim e não!&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Coisas como herança, polimorfismo e sobrecarga são complicadas de fazer/emular em C, mas você pode programar utilizando um estilo que se comporte de forma semelhante à orientação a objetos. A &lt;a href=&quot;http://www.directfb.org&quot; class=&quot;snap_shots&quot;&gt;libdfb&lt;/a&gt; é escrita em C mas &amp;#8220;orientada a objetos&amp;#8221;, de forma que você cria, manipula de destrói elementos que se comportam de forma bem semelhante a objetos.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Aqui no trabalho, temos um sistema de abstração de hardware em C que se conecta com uma GUI em C++. A camada mais baixa, em C também foi escrita (e muito bem escrita, diga-se de passagem - não por mim ) com essas técnicas, simulando uma orientação a objetos. Uma dessas técnicas, me chamou atenção por usar uma daquelas notas de rodapé dos livros de C.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Ao compilar código em C, cada símbolo só tem visibilidade dentro da unidade de compilação na qual ele foi declarado, a menos que seja declarado novamente nas outras unidades como &lt;strong&gt;extern&lt;/strong&gt;. Dessa forma, é possível &amp;#8220;esconder&amp;#8221; certos símbolos dentro de sua unidade de compilação, tornando-os inacessíveis ao mundo exterior. Temos com isso encapsulamento.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;A unidade de compilação é o conjunto de arquivos que depois de pre-processados e compilados geram um único código objeto. Basicamente (mas não exatamente), podemos tomar como unidade de compilação cada arquivo de implementação de fonte (*.c, *.cpp. etc). Maiores detalhes sobre as &lt;a href=&quot;http://www.caloni.com.br/blog/archives/os-diferentes-erros-na-linguagem-c&quot; class=&quot;snap_shots&quot;&gt;etapas de compilação em C e C++&lt;/a&gt; podem ser encontrados no &lt;a href=&quot;http://www.caloni.com.br&quot; class=&quot;snap_shots&quot;&gt;blog do Caloni&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Utilizando essas informações, podemos criar uma struc em ANSI C na qual os seus membros internos são &amp;#8220;privados&amp;#8221;. A mágica está em aprisionar a definição dos membros dentro da unidade de compilação e criar métodos de acesso para esses membros. Para isso usamos as notas de rodapé que nos mostram a diferença entre declaração e definição de elementos em C:&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Declaração ou manifesto: Apresenta ao compilador um identificador sem dizer muito sobre seu significado, ou seja, diz ao compilador que o identificador XXX existe, mas pouco se sabe sobre o que ele representa.&lt;br /&gt;
Ex.:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;extern&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; a;
&lt;span&gt;void&lt;/span&gt; bla&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;struct&lt;/span&gt; st_data;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;p align=&quot;justify&quot;&gt;Definição ou implementação: Diz ao compilador o que determinado identificador representa, como por exemplo quanto de memória deve ser alocada para ele e qual o endereço de memória onde podemos encontra-lo.&lt;br /&gt;
Ex.:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;int&lt;/span&gt; a;
&lt;span&gt;void&lt;/span&gt; bla&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;/* Do anything.  */&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;struct&lt;/span&gt; st_data &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;/* Some members. */&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;p align=&quot;justify&quot;&gt;Quando falamos de estruturas e tipos, sem a definição o compilador não tem como alocar memória para ele pois ele nada sabe a respeito de qual o espaço que uma variável daquele tipo precisa. Por outro lado, algumas vezes, sem a declaração, o linker não tem como saber que aquele símbolo existe.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Quando declaramos uma estrutura num cabeçalho, normalmente nós também definimos seus membros ali mesmo e toda vez que adicionamos esse cabeçalho a um fonte nosso, nós incluimos na unidade de compilação desse fonte tanto a declaração quanto a definição dessa estrutura, tornando os membros da estutura públicos à essa unidade de compilação. Isso nos permite acessar seus membros diretamente.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Se separarmos a declaração da definição, somente símbolo que representa a estrutura estará disponível, mas não os seus membros. Assim, qualquer tentativa de acesso direto a um membro, gerará um erro de compilação. Um efeito colateral interessante é que como o compilador nada sabe sobre o tamanho da estrutura, não será possível definir diretamente uma variável do tipo da estrutura, somente um ponteiro para ela, pois ponteiros têm todos o mesmo tamanho e o compilador precisa apenas do nome símbolo do tipo para criar o ponteiro.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Temos então o header mytype.h mais ou menos assim:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;#ifndef MY_TYPE_H&lt;/span&gt;
&lt;span&gt;#define MY_TYPE_H&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;/* O typedef é apenas pra não ficar repetindo a palavra struct. */&lt;/span&gt;
&lt;span&gt;/* A declaração é somente o trecho:                             */&lt;/span&gt;
&lt;span&gt;/* struct _mytype                                               */&lt;/span&gt;
&lt;span&gt;typedef&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; _mytype my_type;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; create_my_type&lt;span&gt;&amp;#40;&lt;/span&gt; my_type** &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;void&lt;/span&gt; destroy_my_type&lt;span&gt;&amp;#40;&lt;/span&gt; my_type** &lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; set_data&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* , &lt;span&gt;int&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;int&lt;/span&gt; get_data&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;void&lt;/span&gt; set_text&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* , &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;* &lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;char&lt;/span&gt;* get_text&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* &lt;span&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
&lt;span&gt;#endif&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;p align=&quot;justify&quot;&gt;A implementação mytype.c:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;#include &amp;quot;mytype.h&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;struct&lt;/span&gt; _mytype &lt;span&gt;&amp;#123;&lt;/span&gt;        &lt;span&gt;/* Aqui fica a definição da estrtura. */&lt;/span&gt;
    &lt;span&gt;int&lt;/span&gt; data;           &lt;span&gt;/* Somente depois disso é que o com-  */&lt;/span&gt;
    &lt;span&gt;int&lt;/span&gt; text&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;21&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;       &lt;span&gt;/* pilador vai saber como alocá-la.   */&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;                      &lt;span&gt;/* Tente um sizeof(my_type) no main.  */&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;void&lt;/span&gt; create_my_type&lt;span&gt;&amp;#40;&lt;/span&gt; my_type** my_ptr &lt;span&gt;&amp;#41;&lt;/span&gt;             &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;void&lt;/span&gt; destroy_my_type&lt;span&gt;&amp;#40;&lt;/span&gt; my_type** my_ptr &lt;span&gt;&amp;#41;&lt;/span&gt;            &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;void&lt;/span&gt; set_data&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* my_ptr , &lt;span&gt;int&lt;/span&gt; d &lt;span&gt;&amp;#41;&lt;/span&gt;            &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;int&lt;/span&gt; get_data&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* my_ptr &lt;span&gt;&amp;#41;&lt;/span&gt;                     &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;void&lt;/span&gt; set_text&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* my_ptr , &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;* text &lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;char&lt;/span&gt;* get_text&lt;span&gt;&amp;#40;&lt;/span&gt; my_type* my_ptr &lt;span&gt;&amp;#41;&lt;/span&gt;                   &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* some code... */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;p align=&quot;justify&quot;&gt;O código fonte completo do exemplo pode ser encontrado &lt;a href=&quot;http://src.blabos.org/blog/posts/38/private-struct-members.zip&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Como não é possível criar diretamente variáveis desse tipo, precisamos definir um &amp;#8220;construtor&amp;#8221; e um &amp;#8220;destrutor&amp;#8221;.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;Tentativas de acesso direto a membros geram erro de compilação:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;user@host:~/private-struct-members$ &lt;span&gt;gcc&lt;/span&gt; -o teste mytype.h mytype.c main.c
main.c: Na função ‘main’:
main.c:&lt;span&gt;22&lt;/span&gt;: erro: dereferencing pointer to incomplete &lt;span&gt;type&lt;/span&gt;
user@host:~/private-struct-members$&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;p align=&quot;justify&quot;&gt;Dessa forma, com um pouco de criatividade e tendo os conceitos tanto da linguagem quanto dos paradigmas, é possível implementar códigos realmente interessantes. Neste exemplo bobo talvez não tenha ficado clara a utilidade de forçar uma emulação de encapsulamento ou o uso de construtor/destrutor em C, mas em sistemas onde as circunstâncias não permitem um C++, ou que a complexidade tenda a atingir níveis críticos, essas técnicas se mostram de grande valia. No nosso caso, essa técnica especificamente, permitiu que um programador experiente, que não participou do projeto todo, descobrisse que sua tentativa de acesso direto a um membro de uma estrutura, estava contextualmente inadequada. Sem isso, um bug cabuloso de lógica iria aparecer somente em tempo de execução, provavelmente fazendo o software explodir na cara do cliente.&lt;/p&gt;
&lt;p align=&quot;justify&quot;&gt;
Links úteis (ou não&amp;#8230;):&lt;br /&gt;
&lt;a href=&quot;http://www.directfb.org&quot; class=&quot;snap_shots&quot;&gt;http://www.directfb.org&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.caloni.com.br&quot; class=&quot;snap_shots&quot;&gt;http://www.caloni.com.br&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.numaboa.com.br/informatica/c/&quot; class=&quot;snap_shots&quot;&gt;http://www.numaboa.com.br/informatica/c/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.lcm.com.br/index.php?Escolha=20&amp;Livro=L00581&quot; class=&quot;snap_shots&quot;&gt;Livro Desenvolvimento do Kernel do Linux&lt;/a&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 (beta) » C/C++</title>
			<subtitle type="html">Tecnologia sem blá blá blá</subtitle>
			<link rel="self" href="http://blog.blabos.org/wp-rss2.php?cat=4"/>
			<id>http://blog.blabos.org/wp-rss2.php?cat=4</id>
			<updated>2008-06-11T03:00:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Dica: XPath</title>
		<link href="http://www.angusyoung.org/2008/05/15/dica-xpath/"/>
		<id>http://www.angusyoung.org/?p=135</id>
		<updated>2008-05-16T05:15:40+00:00</updated>
		<content type="html">&lt;p&gt;O &lt;a title=&quot;XPath&quot; href=&quot;http://en.wikipedia.org/wiki/Xpath&quot;&gt;XPath &lt;/a&gt;é uma linguagem para seleção de nós em um documento XML. Entre outas coisas, é bastante utilizada quando se trabalha com &lt;a title=&quot;XLST&quot; href=&quot;http://en.wikipedia.org/wiki/XLST&quot;&gt;XSLT&lt;/a&gt;. Como ela também é suportada em diversas bibliotecas ela é comumente utilizada com C (libxml2), C++ (xalan, xerces, etc), Java (jaxp, etc), Python, e muitas outras linguagens&lt;br /&gt;
Hoje, precisei fazer uma expressão para obter um nó somente quando o nó pai fosse igual a um determinado valor e tivesse algum atributo específico.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;paises continente=&quot;Europa&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;pais nome=&quot;Portugal&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;pais nome=&quot;França&quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/paises&amp;gt;&lt;br /&gt;
&amp;lt;paises continente=&quot;Africa&quot; /&amp;gt;&lt;br /&gt;
&amp;lt;pais nome=&quot;Angola&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/paises&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Vamos supor que você quisesse obter o nó referente a Angola. Você poderia faze-lo através da seguinte expressão:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;span id=&quot;lcode-2&quot;&gt;&lt;a href=&quot;http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span class=&quot;langName&quot;&gt;CODE:&lt;/span&gt;
&lt;div id=&quot;code-2&quot;&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;//paises[@continente='Africa']/pais[@nome='Angola'] &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;No caso a expressão // representa os nós descendentes ou o próprio e a expressão @ representa um atributo. A expressão completa representa um caminho para o nó (de modo análogo &lt;em&gt;/usr/share&lt;/em&gt; ou &lt;em&gt;C:/windows&lt;/em&gt; representam um caminho no disco rígido).&lt;br /&gt;
Mais sobre XPath &lt;a title=&quot;XPath tutorial&quot; href=&quot;http://www.w3schools.com/Xpath/default.asp&quot;&gt;neste&lt;/a&gt; excelente tutorial.&lt;/p&gt;</content>
		<author>
			<name>Otavio Rodolfo Piske</name>
			<uri>http://www.angusyoung.org</uri>
		</author>
		<source>
			<title type="html">For Fun and Profit » Desenvolvimento</title>
			<subtitle type="html">Um blog sobre ciência e tecnologia</subtitle>
			<link rel="self" href="http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed"/>
			<id>http://www.angusyoung.org/tags/tecnologia/desenvolvimento/feed</id>
			<updated>2008-09-07T07:00:23+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">&lt;h1 id=&quot;logo&quot;&gt;&lt;img alt=&quot;WordPress&quot; src=&quot;http://www.caloni.com.br/blog/archives/category/c/wp-admin/images/wordpress-logo.png&quot; /&gt;&lt;/h1&gt;
	&lt;p&gt;
&lt;h1&gt;Error establishing a database connection&lt;/h1&gt;
&lt;p&gt;This either means that the username and password information in your &lt;code&gt;wp-config.php&lt;/code&gt; file is incorrect or we can't contact the database server at &lt;code&gt;localhost&lt;/code&gt;. This could mean your host's database server is down.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Are you sure you have the correct username and password?&lt;/li&gt;
	&lt;li&gt;Are you sure that you have typed the correct hostname?&lt;/li&gt;
	&lt;li&gt;Are you sure that the database server is running?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the &lt;a href=&quot;http://wordpress.org/support/&quot;&gt;WordPress Support Forums&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;</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>2008-06-13T19:20:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2008/05/12/dobradinha-encontro-de-maio-do-grupy-sp-seminario-c-portabilidade-perfomance/"/>
		<id>http://techberto.wordpress.com/?p=105</id>
		<updated>2008-05-12T02:27:54+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Concordo com o DQ que o gênio (ou genioso se preferir) &lt;a href=&quot;http://dqsoft.blogspot.com/2008/04/padre-adelir-de-carli-candidato-um.html&quot; target=&quot;_blank&quot;&gt;Adelir de Carli é um  Candidato a um Darwin Award&lt;/a&gt;, assim como concordo com o &lt;a href=&quot;http://christiano.blog.br/2008/03/25/palestra-grupy-sp-no-escritorio-do-google/&quot; target=&quot;_blank&quot;&gt;Christiano Anderson que o encontro do GruPy-SP no escritório do Google-SP &lt;/a&gt;fo