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

	<title>Planet ccppbrasil.org</title>
	<link rel="self" href="http://ccppbrasil.org/planet/atom.xml"/>
	<link href="http://ccppbrasil.org/planet/"/>
	<id>http://ccppbrasil.org/planet/atom.xml</id>
	<updated>2010-04-24T13:00:54+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

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

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

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

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

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

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

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

private:
  int id_;
};

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

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

  //...

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

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

  //...

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

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

	<entry>
		<title type="html">O estilo funcional em C++</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/03/o-estilo-funcional-em-c.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-7503640128285063032</id>
		<updated>2010-03-31T02:19:50+00:00</updated>
		<content type="html">Estava de mau humor e resolvi ironizar a vida estudando numa aula de Java o artigo &quot;&lt;a href=&quot;http://www.md.chalmers.se/%7Erjmh/Papers/whyfp.html&quot;&gt;Why Functional Programming Matters&lt;/a&gt;&quot;, que eu copiei do site do Haskell.&lt;br /&gt;&lt;br /&gt;Acabei finalmente entendendo (eu acho!) as primeiras implicações importantes de &lt;i&gt;lazy evaluation&lt;/i&gt;. O exemplo mais simples dessas implicações no artigo, na minha opinião, está no programa que computa aproximações da raiz quadrada pelo método de Newton-Raphson.&lt;br /&gt;&lt;br /&gt;Esse método é basicamente uma expressão matemática que começa com um resultado anterior e usa esse resultado para computar um próximo, garantindo que o próximo é melhor que o anterior.&lt;br /&gt;&lt;br /&gt;Seja N o número cuja raiz quadrada você deseja aproximar, e uma aproximação anterior x. O procedimento começa chutando x, por exemplo 1. O método afirma que o próximo x deve ser &lt;span&gt;( x + ( N / x ) / 2&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;O artigo descreve um programa para resolver o método. O programa segue abaixo; para entendê-lo completamente, estude o artigo.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;repeat f a = cons a ( repeat f ( f a ) )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;within e ( cons a ( cons b rest ) ) =&lt;/div&gt;&lt;div&gt;&amp;nbsp; = b , if abs(a - b) &amp;lt;= eps&lt;/div&gt;&lt;div&gt;&amp;nbsp; = within e ( cons b rest), otherwise&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;next N x = ( x + N / x ) / 2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span&gt;sqrt a0 e N = within e ( repeat ( next N ) a0 )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O espírito geral do programa é assim:&lt;br /&gt;&lt;br /&gt;repeat é uma função que gera uma lista contendo um elemento inicial seguido do resultado da função f com argumento elemento-anterior. Observe que repeat gera uma lista infinita, assumindo que f está definida para todo a.&lt;br /&gt;&lt;br /&gt;within é uma função que percorre uma lista procurando um par de elementos cuja diferença seja menor que um &lt;span&gt;epsilon&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A notação de parâmetros em within faz o que eu chamo de &quot;desempacotar a lista&quot;. O segundo argumento é uma lista; a definição de within desempacota os dois primeiros, chamando-os de a e b. &lt;br /&gt;&lt;br /&gt;next computa a próxima aproximação da raiz quadrada de N com aproximação anterior x segundo o método de Newton-Raphson.&lt;br /&gt;&lt;br /&gt;sqrt computa a raiz quadrada de um número conforme uma tolerância e e um chute inicial a0; sua definição aplica within a repeat, e repeat a next.&lt;br /&gt;&lt;br /&gt;sqrt basicamente avalia within à lista gerada por repeat , e repeat gera a lista de resultados de next.&lt;br /&gt;&lt;br /&gt;Este programa, segundo a intuição de um programador acostumado a linguagens imperativas, nunca termina, porque repeat nunca termina de gerar a lista infinita.&lt;br /&gt;&lt;br /&gt;Porém, &lt;i&gt;lazy evaluation&lt;/i&gt; garante que esse programa termina -- garante que repeat será avaliado apenas o número de vezes necessária para que within se satisfaça. Eu entendo que o segredo disso está no momento em que o interpretador avalia o &quot;desempacotamento&quot; de uma lista, porque este é o momento em que o processamento exige a geração de mais um elemento.&lt;br /&gt;&lt;br /&gt;Isso é mesmo sensacional. Como seriam esses pequenos componentes em C++0x?&lt;br /&gt;&lt;br /&gt;Vamos começar brincando com uma versão muito eficiente de abs, o que não tem nada a ver com o problema em questão.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto abs (Number x) -&amp;gt; typename std::enable_if&amp;lt; std::is_signed::value, Number&amp;gt;::type&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; return x &amp;lt; 0 ? -x : x ;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto abs (Number x) -&amp;gt; typename std::enable_if&amp;lt; ! std::is_signed::value, Number&amp;gt;::type&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; return x;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A notação acima é a nova notação para funções em C++0x, onde a especificação do retorno fica depois da lista de argumentos.&lt;br /&gt;&lt;br /&gt;A definição de abs faz uso de SFINAE para sobrecarregar dois templates, de outro modo indistinguíveis, usando std::enable_if.&lt;br /&gt;&lt;br /&gt;Assim, abs pode se reduzir a nada quando nem mesmo faz sentido que o número possua um sinal.&lt;br /&gt;&lt;br /&gt;Em seguida, vamos chamar as listas de Range e declarar a forma geral de uma função unpack.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto unpack (Range&amp;amp; r) -&amp;gt; Value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto unpack (Sequence&amp;amp; s) -&amp;gt; decltype(s.front())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; typename Sequence::value_type v = s.front();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; s.pop_front();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; return v;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Definimos o significado de unpack providenciando uma sobrecarga, exclusiva para Containers da STL, que faz o que deve fazer. Em português, unpack resulta o elemento à esquerda e modifica a lista para conter o resto.&lt;br /&gt;&lt;br /&gt;Assim, definimos within:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;namespace detail&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp; template &lt;br /&gt;&amp;nbsp; auto within (Number eps, Number a, Number b, Range rest) -&amp;gt; Number&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (abs(a - b) &amp;lt;= eps) return b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; const Number c = unpack(rest);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return within(eps, b, c, rest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &lt;br /&gt;// requires(ValueType(Range) == Number)&lt;br /&gt;auto within (Number eps, Range list) -&amp;gt; Number&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; const Number a = unpack(list);&lt;br /&gt;&amp;nbsp; const Number b = unpack(list);&lt;br /&gt;&amp;nbsp; return detail::within(eps, a, b, list);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;within desempacota a e b e delega para uma subrotina; a subrotina faz o que se espera. Observe que a lista a processar é um desses tais Ranges.&lt;br /&gt;&lt;br /&gt;O componente equivalente a repeat deve gerar esse Range.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;namespace detail&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; struct repeat_range&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function f;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value x;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; auto operator() () -&amp;gt; decltype(f(x))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x = f(x);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; auto unpack (repeat_range&amp;amp; r) -&amp;gt; decltype(r())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return r();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;// requires(UnaryFunction(Function) &amp;amp;&amp;amp; Domain(Function) == Value)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto repeat (Function f, Value a) -&amp;gt; detail::repeat_range&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; return detail::repeat_range  { f, a };&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um Range é um objeto especial, que representa a lista; definimos um repeat_range que continuamente aplica uma função, e definimos unpack para este Range. (Observe como repeat_range usa o último valor gerado na geração do próximo.) &lt;br /&gt;A função repeat é utilitária e constrói o Range com os argumentos certos.&lt;br /&gt;&lt;br /&gt;A notação de construção usada na definição de repeat também é nova, e generaliza a inicialização entre structs C e objetos C++.&lt;br /&gt;&lt;br /&gt;Por último, implementamos a função importante para a aplicação, sqrt. Escolhi ocultar o equivalente a next porque a mim não interessa muito.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;namespace detail&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; auto sqrt (Number N, Number x) -&amp;gt; Number&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (x + (N / x)) / 2;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;template &lt;/span&gt;&lt;br /&gt;&lt;span&gt;auto sqrt (Number N, Number x, Number eps) -&amp;gt; Number&lt;/span&gt;&lt;br /&gt;&lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; return&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; within(eps,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; repeat(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [=] (Number x) { return detail::sqrt(N, x); },&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, isso é &lt;i&gt;punk&lt;/i&gt;. A função no detail computa a próxima aproximação é trivial. O driver principal, por outro lado, é complexo.&lt;br /&gt;&lt;br /&gt;Em primeiro lugar, aquela notação esquisita ali é uma expressão lambda. Para todos os efeitos, a avaliação desta expressão produz uma função, que vira argumento para repeat.&lt;br /&gt;&lt;br /&gt;repeat, portanto, aplicará uma função lambda -- que por sua vez computa a próxima aproximação da raiz de N com chute x -- ao valor inicial x. O símbolo [=] significa que os nomes dentro do lambda se tornam cópias por valor dos objetos de mesmo nome no escopo maior.&lt;br /&gt;&lt;br /&gt;repeat, como vimos antes, produz um Range, sobre o qual within opera. E within procura um par de valores neste Range -- aplicando unpack quando necessário -- em busca de um par cuja diferença seja menor que eps.&lt;br /&gt;&lt;br /&gt;Assim, nesmo programa C++, simulamos com significativo esforço a &lt;i&gt;lazy evaluation&lt;/i&gt; funcional, para computar a raiz quadrada. Usando __attribute__((const)) esse programa deve otimizar até o Nirvana, mas eu não verifiquei.&lt;br /&gt;&lt;br /&gt;O programa esparramado no texto acima funciona de verdade com o GCC 4.5 e provavelmente funciona também com o ICC 11.1.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-7503640128285063032?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Interface Programador-Máquina</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/03/interface-programador-maquina.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-251435543626130236</id>
		<updated>2010-03-18T22:21:52+00:00</updated>
		<content type="html">Ouvi algo interessante em uma aula do curso 6.00 do MIT, vendo o vídeo no celular, sobre a sobrecarga de operadores; o professor argumentava que essa era uma carecterística boa da linguagem de programação porque permitia uma interface consistente de programação.&lt;br /&gt;&lt;br /&gt;Esse é um uso interessante das palavras; em geral, dizemos &lt;i&gt;interface&lt;/i&gt; para nos referir a um contrato de comunicação entre dois pedaços de código executável.&lt;br /&gt;&lt;br /&gt;Realmente, da mesma forma como essa representação é um contrato ou protocolo entre dois pedaços de código executável que se comunicam, também há contrato ou protocolo entre quaisquer duas coisas que se comunicam, como por exemplo o programador e a máquina.&lt;br /&gt;&lt;br /&gt;Isso nos leva a pensar na linguagem de programação, como regra de sintaxe e semântica, como uma interface; e em pensar na qualidade de uma linguagem de programação como a qualidade dessa interface.&lt;br /&gt;&lt;br /&gt;O meta-caso-de-uso que essa interface pretende realizar é &quot;expressar o programa que eu tenho em mente&quot;; o componente que implementa essa interface é o compilador. Realmente é o compilador, e não a máquina física; o compilador, sob essa ótica, é a máquina abstrata, que interpreta a expressão do programa e faz algo de útil. De fato, normas como C e C++ descrevem o efeito do programa sobre uma máquina abstrata.&lt;br /&gt;&lt;br /&gt;Então, o que há com &lt;i&gt;y + x&lt;/i&gt; ?&lt;br /&gt;&lt;br /&gt;Há interface de alta qualidade na medida em que + significa o que você aprendeu ao longo de uma década de ensino de aritmética. Este julgamento fundamenta ambos os lados da divergência sobre se este símbolo deve ou deve não ser sobrecarregado para significar &quot;concatenar duas strings&quot;. O lado &lt;i&gt;deve&lt;/i&gt; entende que qualquer indivíduo compreende + como &quot;juntar&quot;, &quot;unir&quot;, &quot;somar&quot;. O lado &lt;i&gt;deve não&lt;/i&gt; entende que concatenar é &quot;pôr um na frente do outro&quot;, que não possui a propriedade de associatividade.&lt;br /&gt;&lt;br /&gt;O tema da aula no vídeo que eu estava assistindo era classes em Python e uma introdução aos &lt;i&gt;abstract data types&lt;/i&gt;. Acho essa discussão pertinente porque ADTs são um conceito de meta-linguagem, e um ADT existe apenas na mente do programador. Faço essa distinção como a distinção entre o conjunto dos inteiros de que trata a álgebra e o tipo int da linguagem de programação.&lt;br /&gt;&lt;br /&gt;Quando o programador representa um ADT na linguagem de programação como uma classe, ele por sua vez oferece a outro programador uma interface de programação. O usuário do ADT, por assim dizer, escreverá programas que dissertam sobre esse ou aquele valor. Assim, eu concordo com o professor: se eu estou descrevendo um ADT numérico, é muito conveniente poder sobrecarregar o símbolo + e permitir aos meus usuários falar sobre coisas na forma de &lt;i&gt;y + x&lt;/i&gt; .&lt;br /&gt;&lt;br /&gt;Agora, há algo de estético nessa história toda. Suponha que por qualquer motivo você não pode usar o símbolo + . Que nome você escolheria, &lt;i&gt;add&lt;/i&gt; ou &lt;i&gt;sum&lt;/i&gt;? Ou &lt;i&gt;plus&lt;/i&gt;? &lt;i&gt;add&lt;/i&gt; tem algo de imperativo, enquanto &lt;i&gt;sum&lt;/i&gt; é um substantivo; ambos sugerem uma leitura diferente da expressão; e &lt;i&gt;plus&lt;/i&gt; é apenas o nome de um símbolo!&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;i&gt;add(y, x)&lt;/i&gt; // add y to x&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; sum(y, x)&lt;/i&gt; // the sum of y and x&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; plus(y, x)&lt;/i&gt; // y plus x&lt;br /&gt;&lt;br /&gt;O &lt;i&gt;Elements of Programming&lt;/i&gt; argumenta que o projetista de um ADT deve se esforçar para determinar uma &quot;base computacional&quot; para o ADT, um conjunto mínimo de operações básicas e eficientes que permitem ao programador expressar todos os programas úteis possíveis que discursam sobre seus valores.&lt;br /&gt;&lt;br /&gt;Este é o aspecto aritmético de uma interface programador-máquina, por assim dizer; uma boa escolha de nomes é seu aspecto estético, talvez. Parte do processo de decifragem ou aprendizagem de um sistema -- rotina de um arqueólogo de sistemas legados -- é justamente aprender os símbolos na caótica cultura desse sistema, que podem ou não fazer sentido como se espera de um sistema &quot;fresquinho&quot;.&lt;br /&gt;&lt;br /&gt;Parte do esforço hercúleo em se convencer de um teorema de matemática avançada é justamente ler a notação simbólica usada -- que, sendo altamente abstrata, é frequentemente irreprodutível em linguagem natural. (E às vezes a diferença entre um signo e outro é meia dúzia de três ou quatro &lt;i&gt;pixel&lt;/i&gt;.)&lt;br /&gt;&lt;br /&gt;Produzir uma interface programador-máquina eficiente é sempre bom, mas programadores em execesso usam a eficiência como desculpa para produzir interfaces incompreensíveis. E no fim das contas todos nós sabemos que o custo de um projeto de sistema convencional é dominado por seu custo de manutenção.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-251435543626130236?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

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

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

	<entry>
		<title type="html">Problema os ícones especiais do Nautilus</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/03/problema-os-icones-especiais-do.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8017344001175039152</id>
		<updated>2010-03-09T00:02:06+00:00</updated>
		<content type="html">Não sei por que cargas d'água o ícone especial da pasta &quot;Vídeos&quot; na minha pasta de usuário no Nautilus perdeu a graça.&lt;br /&gt;&lt;br /&gt;O Nautilus, para pastas especiais como &quot;Imagens&quot;, &quot;Música&quot; etc. usa ícones especiais com umas figuras bem legais, como um trecho de rolo de filme pro &quot;Vídeos&quot;.&lt;br /&gt;&lt;br /&gt;Depois de muito procurar, percebi que o responsável pelo tema dos ícones usava alguma fonte de informação pra decidir quais pastas são especiais e aplicar ícones especiais -- ou não aplicar, de acordo com o tema.&lt;br /&gt;&lt;br /&gt;Depois de procurar ainda mais, descobri esta fonte de informação no Fedora 12:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;$HOME/.config/user-dirs.dirs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Realmente a linha de configuração para a pasta de vídeos estava com o nome errado.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-8017344001175039152?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

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

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

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

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

	<entry>
		<title type="html">Instalando o J2EE da Sun no Fedora 11</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/02/instalando-o-j2ee-da-sun-no-fedora-11.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-3924940320046791391</id>
		<updated>2010-02-25T23:22:46+00:00</updated>
		<content type="html">Dois pequenos probleminhas.&lt;br /&gt;&lt;br /&gt;Em primeiro lugar, o instalador reclama dizendo &quot;Expression NOME_DO_PRODUTO is undefined on line 86, column 289 in /templates/components.ftl.&quot;&lt;br /&gt;&lt;br /&gt;O problema é o código de localização; execute o instalador com LANG=C e pronto.&lt;br /&gt;&lt;br /&gt;Em segundo lugar, eu uso um hostname personalizado meus sistemas -- este aqui se chama elisa. Nunca me dei ao trabalho de colocar o nome no /etc/hosts porque o mDNS funciona muito bem sem isso.&lt;br /&gt;&lt;br /&gt;O instalador não gosta dessa situação e reclama em uma caixa de diálogo sobre &quot;host name invalid&quot;.&lt;br /&gt;&lt;br /&gt;Já estou usando esse esquema em outro lugar -- GlassFish J2EE 6 com Eclipse Galileo no Fedora 11 -- e funciona muito bem.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-3924940320046791391?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

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

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

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

	<entry>
		<title type="html">Funções/Objetos</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/funcoesobjetos.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-2335876123911953979</id>
		<updated>2010-01-26T14:14:25+00:00</updated>
		<content type="html">Hoje vi em uma base de código-fonte uma função cujo nome é &quot;signalCatcher&quot; -- um substantivo. A regra geral de estilo é: dados são chamados por substantivos, funções por verbos no infinitivo.&lt;br /&gt;&lt;br /&gt;Mas faz sentido que &quot;signalCatcher&quot; seja o nome daquilo que você vai entregar ao mecanismo de sinais para tratar os sinais da aplicação, certo?&lt;br /&gt;&lt;br /&gt;Eu acredito que a linguagem de programação do futuro não deve fazer distinção entre objetos-dados e objetos-função, mesmo sintaticamente; ambos ocupam espaço na memória e portanto exigem alocação, e são mencionados através de referências.&lt;br /&gt;&lt;br /&gt;Em C, todas as funções são efetivamente objetos imutáveis, mas houve o tempo em que funções não eram imutáveis; esse tempo poderia voltar. E apesar de a maioria dos objetos ser mutável, alguns objetos são propositalmente imutáveis, e seus projetistas procuram maneiras de armazená-los em ROM.&lt;br /&gt;&lt;br /&gt;Uma função deve ser um objeto cujo tipo é &lt;b&gt;função&lt;/b&gt;, um tipo genérico variando na &lt;b&gt;lista de parâmetros&lt;/b&gt; e na &lt;b&gt;lista de resultados&lt;/b&gt;. O valor de um objeto do tipo função deve ser interpretado como uma sequência de instruções para o processador alvo, organizada de acordo com uma convenção de chamada apropriada. Esta convenção apóia a operação fundamental que o programa realiza sobre o objeto, &lt;b&gt;chamar&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;É claro que, ainda assim, uma função é um objeto bem especial. Em particular porque não é um objeto cujo tamanho é regular -- não se pode saber qual é o tamanho de um objeto função apenas conhecendo seu tipo.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-2335876123911953979?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

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

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

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

	<entry xml:lang="pt-br">
		<title type="html">Sexto Encontro de Programadores C++</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/ccppbr_sexto"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/ccppbr_sexto</id>
		<updated>2010-01-24T14:25:29+00:00</updated>
		<content type="html">&lt;p&gt;O grupo C&amp;amp;C++ Brasil (ccppbrasil) tem o imenso orgulhar em anunciar (agora oficialmente) o nosso sexto encontro. Detalhes:

&lt;ul&gt;
&lt;li&gt;Sexto Encontro de Programadores C &amp;amp; C++
&lt;li&gt;dia 6 de março de 2010, sábado
&lt;li&gt;em São Paulo, SP, na Avenida Paulista núemro 1439, 6º andar
&lt;li&gt;5 palestras. Já temos propostas suficientes, falta a confirmação dos palestrantes e a ordem das palestras
&lt;li&gt;&lt;a href=&quot;http://www.temporealeventos.com.br/inscricoes/inscricoes.php?area=95&amp;form=367&quot;&gt;As inscrição já estão abertas&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;A página oficial está em &lt;a href=&quot;http://ccppbrasil.org/wiki/Grupo:Encontro_VI&quot;&gt;http://ccppbrasil.org/wiki/Grupo:Encontro_VI&lt;/a&gt;.&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/ccppbr_sexto#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Vou fazer uma palestra sobre Python na Campus Party</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/python_campus_party"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/python_campus_party</id>
		<updated>2010-01-22T18:59:20+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Título: Seja dinâmico com Python
&lt;li&gt;Descrição: Vou falar sobre quase todas as gambiarras e coisas maravilhosas que um programador pode fazer com os recursos &quot;dinâmicos&quot; do Python. Criar membros e métodos em runtime, usar o reflection mais simples do planeta, responder por métodos que não existem na hora em que são chamados. Métodos __MAGICOS__ e seus correlatos. Como transformar um registro de um banco de dados em um objeto (quase um ORM) com duas linhas de código (ou três). E as piadas quase-engraçadas de sempre
&lt;li&gt;Data e hora: 26 de janeiro (terça-feira), 09:00hs da matina. Para quem vai acampar lá é uma boa maneira de começar a semana :-)
&lt;li&gt;Links: &lt;a href=&quot;http://www.campus-party.com.br/&quot;&gt;Campus Party&lt;/a&gt;, &lt;a href=&quot;http://www.campus-party.com.br/agenda.html&quot;&gt;agenda do evento&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/rodrigostrauss&quot;&gt;meu twitter&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Além disso, devo ficar lá o dia inteiro. Essa palestra está sendo organizada pelo &lt;a href=&quot;http://www.python.org.br/wiki/GrupySP&quot;&gt;GruPy-SP&lt;/a&gt;, o Grupo de Usuários Python do Estado de São Paulo.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/python_campus_party#comments&quot;&gt;1 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/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2010/01/18/vi-encontro-de-programadores-c-c/"/>
		<id>http://techberto.wordpress.com/?p=177</id>
		<updated>2010-01-18T07:07:08+00:00</updated>
		<content type="html">&lt;p&gt;O core de organização de eventos do grupo C &amp;amp; C++ Brasil, com colaboração da  &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/programadores_independentes&quot; target=&quot;_blank&quot;&gt;Liga dos Programadores Indepentes&lt;/a&gt; mais alguns colaboradores e com apoio da galera do hashtag &lt;a href=&quot;http://twitter.com/#search?q=%23ccppbrasil_meetings&quot; target=&quot;_blank&quot;&gt;#ccppbrasil_meetings&lt;/a&gt; estão trabalhando na remotada dos eventos do grupo C &amp;amp; C++ Brasil para 2010, sendo-se que o primeiro evento será o encontro de programadores que está programado para o dia 06 de fevereiro de 2010 em São Paulo.&lt;/p&gt;
&lt;p&gt;A programação ainda não está fechada mas há propostas de palestras sobre concorrência para C++, robótica, programação segura entre outras.&lt;/p&gt;
&lt;p&gt;Maiores detalhes em &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&quot; target=&quot;_blank&quot;&gt;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Está em planejamento também um encontro do pessoal de Porto Alegre.&lt;/p&gt;
&lt;p&gt;Em breve será divulgado uma previsão de  agenda para 2010.&lt;/p&gt;
&lt;p&gt;Bons códigos e nos vemos lá!&lt;/p&gt;
&lt;p&gt;Namastê!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=177&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2010/01/18/batata-stigler-newton-ressaca-de-pan-galactic-gargle-blaster/"/>
		<id>http://techberto.wordpress.com/?p=173</id>
		<updated>2010-01-18T06:38:14+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;Epónymos &lt;/em&gt;&lt;/strong&gt;era a figura que atribuía o nome a uma cidade na grécia clássica.  Eponímia é o nome que dela deriva.  Este conceito generalizou-se ao batismo de  técnicas, objetos, atributos, invenções seja por vias diretas ou indiretas, sendo considerada a forma suprema de reconhecimento da atividade de um pesquisador.&lt;/p&gt;
&lt;p&gt;Quando eu era adolescente e morava lá em &lt;a title=&quot;Santa Fé do Sul&quot; href=&quot;http://pt.wikipedia.org/wiki/Santa_F%C3%A9_do_Sul&quot; target=&quot;_blank&quot;&gt;Santa Fé do Sul&lt;/a&gt; (proporcionalmente 105.18 Km mais distante de São Paulo e &lt;em&gt;3.7840092199092412 vezes &lt;/em&gt;menor que &lt;a title=&quot;Barbacena&quot; href=&quot;http://pt.wikipedia.org/wiki/Barbacena_(Minas_Gerais)&quot; target=&quot;_blank&quot;&gt;Barbarcena&lt;/a&gt;)  numa época em  que eu realizava um curso técnico em eletrônica,  com grande  freqüência eu conversava com o (bom amigo) &lt;em&gt;&lt;strong&gt;Batata&lt;/strong&gt;&lt;/em&gt; sobre física, eletricidade, válvulas raras, RF, &lt;a title=&quot;A Vida, o Universo e Tudo Mais&quot; href=&quot;http://pt.wikipedia.org/wiki/A_Vida,_o_Universo_e_Tudo_Mais&quot; target=&quot;_blank&quot;&gt;a vida, o universo e tudo mais&lt;/a&gt;; num destes bate-papo logo após uma desopilação hepática  ele me comentou que quem deveria ser creditado pelo invento do rádio deveria ter sido o &lt;a title=&quot;Padre Landell&quot; href=&quot;http://pt.wikipedia.org/wiki/Roberto_Landell_de_Moura&quot; target=&quot;_blank&quot;&gt;Padre Landell&lt;/a&gt;, um gaúcho que foi  padre católico e um notável inventor e não &lt;a title=&quot;Marconi&quot; href=&quot;http://pt.wikipedia.org/wiki/Guglielmo_Marconi&quot; target=&quot;_blank&quot;&gt;Marconi &lt;/a&gt;; físico italiano que plagiando estudos apresentandos pelo &lt;a title=&quot;Nikola Tesla&quot; href=&quot;http://pt.wikipedia.org/wiki/Nikola_Tesla&quot;&gt;Nikola Tesla&lt;/a&gt; em 1899 apresentou ao mundo que Pe.Landell já havia apresentado em 1893 para um pequeno público em Campinas.  Também foi o Batata que me revelou que o verdadeiro inventor do telefone teria sido &lt;a title=&quot;Elisha Gray&quot; href=&quot;http://en.wikipedia.org/wiki/Elisha_Gray&quot; target=&quot;_blank&quot;&gt;Elisha Gray &lt;/a&gt;e não &lt;a title=&quot;Alexander Graham Bell&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Graham_Bell&quot;&gt;Alexander Graham Bell&lt;/a&gt;, quando eu solicitei suas &amp;#8220;fontes&amp;#8221; ele sacou de seu arquivo duas revistas  &lt;em&gt;&lt;a href=&quot;http://www.editorasaber.com.br/&quot;&gt;Saber Eletrônica&lt;/a&gt; que relatavam estes fatos.  Quando terminei de ler os artigos comentei: &amp;#8220;Isto sim é pilantragem&amp;#8221;&lt;/em&gt; e o Batata soltou uma que (na época)  eu  não entendi&lt;em&gt;: &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- &lt;/em&gt;&lt;em&gt;&amp;#8220;Isto sim é a apoteose da irresponsabilidade consciente&amp;#8221;  e tomei nota desta frase  na hora,  pois achei um &amp;#8220;insight&amp;#8221; muito inspirado&amp;#8230;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-173&quot;&gt;&lt;/span&gt;Fiquei bastante curioso sobre estes fatos, infelizmente naquela época (década de 80) minhas fontes de pesquisas mais confiáveis diziam que os inventores da primeira aeronave havia sido os  irmãos Orville e Wilbur Wright.  Estas informações não mudaram minha vida, mas me tornaram um assíduo leitor na revista Saber Eletrônica por alguns anos como também me  estimularam a pesquisar (eventualmente)  sobre a história das invenções e das ciências.&lt;/p&gt;
&lt;p&gt;Nestas primeiras pesquisas,  percebi que muitas invenções passaram por disputas de paternidade, mas nem sempre a disputa tinha motivações financeira, como por exemplo foi o caso de Bob Kearn retratado no filme &lt;a href=&quot;http://www.horadopovo.com.br/2009/Outubro/2810-21-10-09/P8/pag8a.htm&quot; target=&quot;_blank&quot;&gt;Flash of Genius&lt;/a&gt;. Um caso mais popular  foi o exemplo da &lt;a title=&quot;Incandescent light bulb&quot; href=&quot;http://en.wikipedia.org/wiki/Incandescent_light_bulb&quot;&gt;lâmpada&lt;/a&gt; que teve como primeiro inventor &lt;a title=&quot;Joseph Swan&quot; href=&quot;http://en.wikipedia.org/wiki/Joseph_Swan&quot;&gt;Joseph Swan&lt;/a&gt; mas  &lt;a title=&quot;Thomas Edison&quot; href=&quot;http://en.wikipedia.org/wiki/Thomas_Edison&quot;&gt;Thomas Edison&lt;/a&gt; levou os créditos, porém foi quem melhor explorou a invenção, tendo inventado o sistema elétrico com rede de distribuição de energia, geradores de energia e todo um universo que viabilizou a comercialização da eletricidade,  conseguindo explorar melhor a invenção. Caso similar ao  &lt;a title=&quot;Telephone&quot; href=&quot;http://en.wikipedia.org/wiki/Telephone&quot;&gt;telefone&lt;/a&gt; visto que &lt;a title=&quot;Alexander Graham Bell&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Graham_Bell&quot;&gt;Bell&lt;/a&gt; explorou muito bem &amp;#8220;sua&amp;#8221; invenção e as redes telefônicas. Porém, no caso dele vamos dizer que se aplica a &lt;strong&gt;máxima do batata&lt;/strong&gt; visto que Bell se inspirou no trabalho de &lt;a title=&quot;Johann Philipp Reis&quot; href=&quot;http://en.wikipedia.org/wiki/Johann_Philipp_Reis&quot;&gt;Johann Philipp Reis&lt;/a&gt;,  descobriu o trabalho de &lt;a title=&quot;Stephen Gray&quot; href=&quot;http://pt.wikipedia.org/wiki/Stephen_Gray&quot; target=&quot;_blank&quot;&gt;Stephen Gray &lt;/a&gt; (que em 1729 teorizou um telefone funcional) comprou (a preço de banana) protótipos de &lt;a title=&quot;Antonio Meucci&quot; href=&quot;http://en.wikipedia.org/wiki/Antonio_Meucci&quot;&gt;Antonio Meucci&lt;/a&gt;, ouviu boatos do aparelho de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Hans_Christian_%C3%98rsted&quot;&gt;&lt;em&gt;Christian&lt;/em&gt; Ørsted&lt;/a&gt; e quando ficou sabendo que   &lt;a title=&quot;Elisha Gray&quot; href=&quot;http://en.wikipedia.org/wiki/Elisha_Gray&quot;&gt;Elisha Gray&lt;/a&gt; (que era alguém com quem ele sabia que devia-se preocupar) iria registrar a patente de um telefone funcional, Bell subornou um funcionário do escritório de patentes e &amp;#8220;conseguiu&amp;#8221; registrar a patente do telefone primeiro, mas em 2002 a suprema corte americana reconheceu o trabalho de &lt;em&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.house.gov/hensarling/rsc/doc/Lb61102.pdf&quot;&gt;Antonio Meucci&lt;/a&gt; &lt;/em&gt;&lt;em&gt;por ter sido o verdadeiro inventor do telefone;  decisão  justa mas tardia, afinal Meucci &lt;/em&gt;faleceu no século 19. No caso do rádio, entre aqueles que se proclamaram pais da invenção havia &lt;a title=&quot;Nikola Tesla&quot; href=&quot;http://en.wikipedia.org/wiki/Nikola_Tesla&quot;&gt;Nikola Tesla&lt;/a&gt;, &lt;a title=&quot;Alexander Stepanovich Popov&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Stepanovich_Popov&quot;&gt;Alexander Popov&lt;/a&gt;,  &lt;a title=&quot;Reginald Fessenden&quot; href=&quot;http://en.wikipedia.org/wiki/Reginald_Fessenden&quot;&gt;Reginald Fessenden&lt;/a&gt;, &lt;a title=&quot;Landell de Moura&quot; href=&quot;http://en.wikipedia.org/wiki/Landell_de_Moura&quot;&gt;Pe.Landell de Moura&lt;/a&gt;;  em 1943 a Suprema Corte dos Estados Unidos concedeu a Tesla a &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.google.com/patents?vid=763772&quot;&gt;Patente 763,772&lt;/a&gt; creditando a ele a invenção do rádio, talvez porque era o único que ainda havia algum representante ativo nesta luta, pois analisando historicamente o Pe.Landell Moura foi quem conseguiu primeiro. Felizmente hoje Landell é mais conhecido no Brasil, sendo patrono dos radiamadores brasileiros sendo conhecido como um dos pioneiros na invenção da TV, ele foi o inventor do telefone sem fio,  da comunicação via portadora ótica e entre outros campos ele é conhecido mundialmente por seu pioneirismo na &lt;a title=&quot;Bioeletrografia&quot; href=&quot;http://pt.wikipedia.org/wiki/Fotografia_Kirlian&quot; target=&quot;_blank&quot;&gt;bioeletrografia&lt;/a&gt; porém quanto ao rádio&amp;#8230;&lt;/p&gt;
&lt;p&gt;Numa destas pesquisas encontrei a palavra  &lt;strong&gt;eponímia&lt;/strong&gt; (acho que)  pela primeira vez.  Um exemplo de eponímia é a  &lt;a title=&quot;Salmonella&quot; href=&quot;http://en.wikipedia.org/wiki/Salmonella&quot;&gt;Salmonella&lt;/a&gt;, que tem origem do sobrenome do  &lt;a title=&quot;Daniel Elmer Salmon&quot; href=&quot;http://en.wikipedia.org/wiki/Daniel_Elmer_Salmon&quot;&gt;Dr.Daniel Elmer Salmon&lt;/a&gt;, mas que na realidade ela foi descoberta por  &lt;a title=&quot;Theobald Smith&quot; href=&quot;http://en.wikipedia.org/wiki/Theobald_Smith&quot;&gt;Theobald Smith&lt;/a&gt;. Ué, como assim? De forma simplista, olha a &lt;strong&gt;máxima do batata&lt;/strong&gt; aí novamente.&lt;/p&gt;
&lt;p&gt;Num acaso, em 1992  li uma nota que Joel Cohen havia escrito um artigo no qual ele revelava que a &amp;#8220;&lt;em&gt;&lt;strong&gt;lei da eponímia de Stigler&lt;/strong&gt;&lt;/em&gt;&amp;#8221; foi muitas vezes formulada antes de Stigler a ter sequer nomeado. Mas o que era esta tal lei? Infelizmente era 1992,  não consegui encontrar nada nas bibliotecas que eu tinha acesso e eu estava procurando nos lugares errados.&lt;/p&gt;
&lt;p&gt;Poucos anos depois, ao acaso, descobri que a chamada &lt;a href=&quot;http://en.wikipedia.org/wiki/Stigler%27s_law_of_eponymy&quot; target=&quot;_blank&quot;&gt;Lei &amp;#8211; da  mesonímia ou eponímia &amp;#8211; de Stigler &lt;/a&gt;afirmava que &lt;strong&gt;&amp;#8220;no scientific discovery is named after its original discoverer&amp;#8221; &lt;/strong&gt;(nenhuma descoberta científica é designada com o nome do seu descobridor original)   bem, neste momento comecei a pensar, &lt;strong&gt;nenhuma&lt;/strong&gt;?  Stigler chegou a esta conclusão observando várias descobertas, na área de economia e ciências, sendo-se que este trabalho proporcionou a ele o Nobel de Economia em 1982. Porém, se Cohen estava correto, até a lei de Stigler era vítima dela própria; ao menos ela era coerente. E ali senti que eu estava començando a aprender os nomes dos bois.&lt;/p&gt;
&lt;p&gt;E eu ainda tinha aquela dúvida: &lt;strong&gt;todas&lt;/strong&gt;? Obviamente que não podia ser todas, mas o quanto ela se aplicava? Qual ciência era mais suscetível? Porque esta tipo de situação era tolerada? Não há uma única resposta, cada caso é um história.&lt;/p&gt;
&lt;p&gt;Alguns anos depois, felizmente já com a internet, resolvi pesquisar a origem de algo que a muito tempo eu tinha curiosidade e o que descobri foi interessante:&lt;/p&gt;
&lt;p&gt;Em 1949, &lt;a href=&quot;http://pt.wikipedia.org/wiki/John_Paul_Stapp&quot; target=&quot;_blank&quot;&gt;John Paul Stapp&lt;/a&gt;,  um  Ph.D, médico e coronel da  &lt;a title=&quot;USAF&quot; href=&quot;http://pt.wikipedia.org/wiki/USAF&quot;&gt;USAF&lt;/a&gt; (nascido na Bahia em 1910)  pioneiro nos estudos dos efeitos das forças de aceleração e desaceleração no organismo humano, que havia sido selecionado dois anos antes como &lt;em&gt;&amp;#8220;cobaia&amp;#8221;&lt;/em&gt; de testes para medir a resistência humana a grandes acelerações,  consegui bateu o recorde mundial de aceleração mas não pôde  festejar o feito. Isto porquê os acelerômetros do trenó-foguete simplesmente não funcionaram. P. da vida, Stapp  solicitou ao engenheiro responsável pelas medições -  o então capitão &lt;a title=&quot;Edward A. Murphy&quot; href=&quot;http://pt.wikipedia.org/wiki/Edward_A._Murphy&quot;&gt;Edward Murphy Jr.&lt;/a&gt; -  uma análise para identificar a falha. Logo eles descobriram que  um técnico ligara os circuitos do veículo ao contrário. No relatório de análise do problema,  Murphy anotou: &lt;em&gt;&amp;#8220;Se há mais de uma forma de fazer um trabalho e uma dessas formas redundará em desastre, então alguém fará o trabalho dessa forma&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dr. Stapp popularizou a expressão ao comentar em uma entrevista a jornalistas, o diagnóstico de Murphy, atribuindo ao fato de que ninguém saiu ferido dos testes por levarem em conta a Lei de Murphy e explicou as variáveis que integravam a assertiva, ante ao risco de erro e consequente catástrofe.&lt;/p&gt;
&lt;p&gt;Enfim, quem a popularizou  foi Stapp e o seu autor (mesmo que atormentado por isto) sempre recebeu os méritos. Assim quando tive contato com as origens da folclórica e emblemática a &lt;a href=&quot;http://en.wikipedia.org/wiki/Murphy%27s_law&quot; target=&quot;_blank&quot;&gt;Lei de Murphy&lt;/a&gt; minha primeira observação  foi que a Lei de Stigler não se aplica a ela. Imagino que esta seja uma daquelas citações desgastadas que ninguém mais aguenta,  mas como já dizia Nelson Rodrigues &amp;#8220;toda unaminidade é burra&amp;#8221;. Mas o que mostrou-se mais evidente é que a Lei de Murphy é mais poderosa que a Lei de Stigler! rs&lt;/p&gt;
&lt;p&gt;Outro dia, já em 2010, lendo o post &lt;a href=&quot;http://www.ricbit.com/2010/01/newton-e-os-universos-paralelos_02.html&quot; target=&quot;_blank&quot;&gt;Newton e os Universos Paralelos&lt;/a&gt; vi uma referência ao clássico embate &lt;a href=&quot;http://www.ifi.unicamp.br/~ghtc/Biografias/Newton/Newtonnxh.htm&quot; target=&quot;_blank&quot;&gt;Newton vs Hooke&lt;/a&gt;, que sempre me faz lembrar do embate &lt;a href=&quot;http://www.angelfire.com/md/byme/mathsample.html&quot;&gt;&lt;em&gt;Newton&lt;/em&gt; vs  &lt;em&gt;Leibniz&lt;/em&gt;&lt;/a&gt; . Muitas vezes a fama indevida ou a prova da Lei de Stigler ocorre de forma involuntária, no caso do Cálculo, não há eponímia, mas houve literalmente &lt;em&gt;&amp;#8220;a apoteose da irresponsabilidade consciente&amp;#8221;&lt;/em&gt;, enfim, houve a pilantragem de Newton. Com o tempo descobri que o Batata não havia sido original, que a frase que me deslumbrou era do &lt;a href=&quot;http://pt.wikipedia.org/wiki/A_Turma_da_Pilantragem&quot; target=&quot;_blank&quot;&gt;Carlos Imperial&lt;/a&gt; e ele omitiu, mas comparado ao que Newton fez isto não foi nada!&lt;/p&gt;
&lt;p&gt;Apenas para contextualizar:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Isaac_Newton&quot; target=&quot;_blank&quot;&gt;Isaac Newton &lt;/a&gt;fez descobertas elementares em gravitação, óptica, mecânica, dinâmica celeste e matemática!  Era um cientista. Já &lt;a href=&quot;http://pt.wikipedia.org/wiki/Gottfried_Leibniz&quot; target=&quot;_blank&quot;&gt;Leibniz,&lt;/a&gt; pai do termo função, era um filósofo e se interessava  por lingüística, história, direito, diplomacia, política, economia, teologia,  biologia, geologia,  matemática, filosofia e metafísica, sendo considerado  como o último gênio universal e inclusive um virtuoso atleta.&lt;/p&gt;
&lt;p&gt;Leibniz publicou o seu trabalho sobre Cálculo antes de Newton.  Quando Newton teve acesso, ele ficou bastante irritado e temendo críticas, principalmente advindas de Robert Hooke, com quem não tinha muita afinidade desde quando ele publicou seu trabalho sobre ótica e que na ocasião era o presidente da Royal Society, Newton preferiu adotar uma estratégia vitriólica para &amp;#8220;defender&amp;#8221; seus interesses.&lt;/p&gt;
&lt;p&gt;Quando  Hooke faleceu, Newton tornou-se uma espécie de presidente vitalício da Royal Society, da qual Leibniz também era membro. Desta forma, ainda inconformado por ter perdido o bonde do Cálculo, com um aliado escocês, John Kell,  começou a provocar Leibniz como plagiador.  Muito irritado com esta história, ele enviou ofícios violentos à Royal Society para provar que ele, sim, inventara o Cálculo Diferencial e Integral (até hoje são usadas as notações de Leibniz – por exemplo, o famoso dy/dx). Diante daquela querela entre titãs e como sói acontecer, criou-se um comitê para investigar a questão. Esse comitê foi formado em quase sua totalidade por membros pró Newton. Em tempo recorde ficou pronto um relatório conferindo a Newton a prioridade da invenção. Mais tarde foi descoberto um rascunho desse relatório manuscrito por Newton! Na realidade, com o tempo descobriu-se que quase todos os artigos que foram escritos &amp;#8221; atacando&amp;#8221; Leibniz foram apenas publicados em nomes de outros cientistas da época, mas foram escritos por Newton (tsc).  Newton recebeu o título de Sir, faleceu em 31 de março de 1727 e foi sepultado na Abadia de Westminster, em Londres, entre os reis do Império Britânico.  Apesar de suas mentiras e desvios de caráter, ele foi  evidentemente um gênio, preguiçoso e ardiloso, porém sagaz e extremamente inteligente.&lt;/p&gt;
&lt;p&gt;Todavia, a filosofia de Leibniz contribuiu para o que hoje chamamos de física moderna. Ele trabalhou com lógica simbólica, aperfeiçoou uma primitiva máquina de calcular e foi precursor da aritmética binária, base dos atuais computadores. Leibniz morreu em Hanover no dia 14 de novembro de 1716.&lt;/p&gt;
&lt;p&gt;A melhor síntese desta história que eu já encontrei, do qual me apropriei de parte do texto está no trabalho&lt;a href=&quot;http://www4.fct.unesp.br/docentes/dmec/vanessa/index_arquivos/Newton%2520versus%2520Leibniz.pdf&quot; target=&quot;_blank&quot;&gt; Newton vs Leibinniz de Adalberto Nascimento&lt;/a&gt;, porém esta história é contada em vários livros.&lt;/p&gt;
&lt;p&gt;Comentando sobre alguns destes assuntos  no twitter com o &lt;a title=&quot;@AlanJumpi&quot; href=&quot;http://twitter.com/AlanJumpi&quot; target=&quot;_blank&quot;&gt;@AlanJump&lt;/a&gt;i e o &lt;a href=&quot;http://twitter.com/feuteston&quot; target=&quot;_blank&quot;&gt;@Feutestoun&lt;/a&gt;, surgiu um insight de escrever este post (ou algo parecido) foi quando comentei da Lei de Stigler e logo alguém me comentou que a &lt;a href=&quot;http://twitter.com/cyberdecker&quot; target=&quot;_blank&quot;&gt;@cyberdecker&lt;/a&gt; havia escrito a pouco tempo o post &lt;a href=&quot;http://www.giseliramos.com.br/blog/2009/12/breve-panorama-da-estatistica-e-lei-de-stigler/&quot; target=&quot;_blank&quot;&gt;breve panorama da estatística e lei de Stigler&lt;/a&gt; que li gostei muito, sinceramente recomendo.  Na sequência surgiu a idéia de debatermos tudo isto com mais algum tempero de nerdices num bar, numa divagação imaginei que o local ideal seria o&lt;a href=&quot;http://pt.wikipedia.org/wiki/The_Restaurant_at_the_End_of_the_Universe&quot; target=&quot;_blank&quot;&gt; bar &amp;amp; restaurante no fim do universo&lt;/a&gt;, logo pensei:  como será uma ressaca  de &lt;a title=&quot;Zaphod Beeblebrox&quot; href=&quot;http://en.wikipedia.org/wiki/Zaphod_Beeblebrox#Pan-Galactic_Gargle_Blaster&quot; target=&quot;_blank&quot;&gt;Pan-Galactic Gargle Blaster&lt;/a&gt;? &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saideira:&lt;/strong&gt; por falar em aritmética binária, grandes gênios, inventores, absurdos e polêmicas sobre patentes, lembrei de uma clássica história onde em 1948 quando tentaram patentear as portas lógicas digitais, a U.S.Patents a negaram  pois &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_Tesla_patents&quot; target=&quot;_blank&quot;&gt;Nicola Tesla&lt;/a&gt; já a detinha  desde a virada do século.  Esta foi uma contribuição indireta de Tesla extremamente valiosa, visto que  este  monopólio certamente iria gerar um absurdo atraso tecnológico.&lt;/p&gt;
&lt;p&gt;Ps: Ainda pensando nestes sci-fi drinks,  como será uma ressaca de &amp;#8220;&lt;a href=&quot;http://memory-alpha.org/en/wiki/Romulan_ale&quot; target=&quot;_blank&quot;&gt;Romulan Ale&lt;/a&gt;&amp;#8220;?  Bom, esta divagação incidental e um pouco (ou muito mais) sobre curiosidades sobre Tesla,  Landell e história da ciência  ficam para outro(s) post(s) que após quebrar o jejum, nas próximas aplicarei as técnicas de jack.&lt;/p&gt;
&lt;p&gt;Namastê!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=173&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Programação e Semiótica 7</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/programacao-e-semiotica-7.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-6399571980090391732</id>
		<updated>2010-01-13T14:17:07+00:00</updated>
		<content type="html">Um novo exemplo para diminuir o tédio dos leitores e usar esses conceitos para entender o processamento de texto nos computadores.&lt;br /&gt;&lt;br /&gt;Falemos sobre um programa que, por sua vez, deseja falar sobre textos em linguagem natural. Este programa fará referência a objetos cujo interpretante é &quot;texto em linguagem de gente&quot;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O que é texto em linguagem de gente? É uma sequência de símbolos que os seres humanos são capazes de entender como &lt;b&gt;caracteres&lt;/b&gt; do seu idioma, que por sua vez se agrupam para formar palavras, frases etc. Nos idiomas latinos dizemos que as letras se agrupam para formar palavras; em idiomas como o japonês muitas vezes apenas um caracteres já é uma palavra inteira.&lt;br /&gt;&lt;br /&gt;Mas o computador não sabe nada sobre caracteres, apenas sobre números. Com certeza o computador é capaz de representar na memória números uns na frente dos outros.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A intuição fundamental é a possibilidade de estabelecer um &lt;b&gt;mapa de caracteres&lt;/b&gt; onde cada caractere está mapeado para um número e vice-versa. Formalmente, o mapa é uma função bijetora entre os conjuntos &quot;números inteiros&quot; e &quot;caracteres&quot;.&lt;br /&gt;&lt;br /&gt;Assim, um programa processador de texto faz referência a objetos cujo primeiro tipo é &quot;número inteiro&quot; e cujo segundo tipo é &quot;caractere do mapa tal&quot;.&lt;br /&gt;&lt;br /&gt;Suponha o seguinte mapa: a = 1, b = 2, c = 3 etc. O texto &quot;abc&quot; seria um objeto composto por três objetos numéricos contíguos 123.&lt;br /&gt;&lt;br /&gt;Como poderia um programa colocar palavras em ordem alfabética? Toma dois objetos &quot;palavra&quot; e compara os dois caracteres iniciais como números; se forem diferentes, a ordem é numérica; se forem iguais fazemos a mesma coisa com o segundo caractere e assim por diante. Essa é a &lt;b&gt;ordenação lexicográfica&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Esse esquema é interessante quando podemos usar um objeto de tamanho fixo e tipo &quot;número&quot; para todos os caracteres desejados. Mas com o advento da Internet e a interligação entre sistemas de todo o mundo se tornou inviável usar mapas de caracteres pequenos.&lt;br /&gt;&lt;br /&gt;O que acontece quando um sistema do Japão envia 123 para um sistema do Brasil? Que mapa de caracteres o sistema do Brasil deve tomar como interpretante desses números? Essa dificuldade é a causa de muitos fenômenos bizarros na Internet, onde páginas mostram um monte de lixo onde deveriam estar caracteres latinos acentuados ou coisa parecida.&lt;br /&gt;&lt;br /&gt;A primeira lição da interligação de sistemas processadores de texto é que não existe objeto &quot;texto&quot; compreensível sem um interpretante &quot;mapa de caracteres&quot; associado. Essa associação é um problema que sempre deve ser resolvido, mesmo que a solução seja um contrato entre todas as partes definindo um e apenas um mapa válido. Esse tipo de contrato não se mostrou viável a longo prazo.&lt;br /&gt;&lt;br /&gt;Alguns sistemas de programação experimentaram construir tipos mais complexos para objetos; não apenas &quot;texto&quot; mas &quot;texto ASCII&quot; ou &quot;texto ISO-8859-1&quot; -- embutindo no tipo do objeto também o tipo do mapa de caracteres. Isso é interessante para apoiar contratos como o anterior, mas um pouco estranho quando o sistema deve aceitar diversos tipos de texto de diversas partes do mundo.&lt;br /&gt;&lt;br /&gt;Estas parecem as coisas básicas que sempre queremos fazer com texto: contar o número de caracteres, decidir se dois textos são iguais, decidir qual de dois textos deve aparecer antes na ordem do dicionário, e inspecionar o texto letra por letra (para imprimir na tela, por exemplo). Com os mapas numéricos simples, podemos fazer todas essas coisas simplesmente trabalhando com pares de números: os primeiros de cada texto, depois os segundos de cada texto, etc.&lt;br /&gt;&lt;br /&gt;Nesses mapas, existe uma referência sensata que atravessa a representação dos objetos da mais pura -- os números -- para a mais abstrata -- o caractere do texto.&lt;br /&gt;&lt;br /&gt;Essa facilidade eventualmente terminou, o que ainda parece muito traumático para programadores acostumados com essa situação tão segura.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eventualmente a comunidade internacional decidiu dar um basta na multiplicidade dos mapas e resolveu produzir o super-mapa Unicode. Este mapa é um catálogo de praticamente todos os caracteres usados na galáxia, associados cada um deles a um número inteiro positivo. Infelizmente, são muitos caracteres, que não podem ser representados com números pequenos.&lt;br /&gt;&lt;br /&gt;A princípio, os indivíduos decidiram usar números grandes e manter o esquema de mapa com objetos de tamanho fixo. Assim, o processamento par-a-par continuaria possível. Mas os objetos texto explodiram de tamanho e essa esquema se mostrou inviável.&lt;br /&gt;&lt;br /&gt;Então um compromisso foi firmado: um novo mapa foi produzido para o Unicode onde quase 90% dos textos continuaria com o mesmo tamanho, e apenas 10% seria maior. Este mapa às vezes usa um número por caracteres, às vezes dois, às vezes três e às vezes quatro. Este simples fato é o pesadelo dos programadores novatos de processamento de texto.&lt;br /&gt;&lt;br /&gt;Por que este mapa &lt;b&gt;UTF-8&lt;/b&gt; possui uma representação tão estranha com objetos caractere de tamanho variável, deixou de ser sensata a referência direta número-a-caractere. Um sistema que recebe 1234 3456 5678 e deve interpretar esses números como texto deve não mais assumir que o primeiro número é um caractere, e o segundo um caractere etc. É possível que na realidade os dois primeros números sejam um caractere juntos.&lt;br /&gt;&lt;br /&gt;Uma sequência de números que deve ser interpretada como UTF-8 não pode mais ser percorrida ingenuamente número a número, e os algoritmos de processamento baseados em comparações par-a-par estão quebrados. Isso, novamente, se deve ao fato de que UTF-8 viola propositalmente premissas simples de significação dos números que compõe um texto.&lt;br /&gt;&lt;br /&gt;Isso foi um problema grave porque programas antigos despreocupadamente tratavam seu texto de forma crua, diretamente com os números, confortados pelas premissas do processamento de texto -- ao invés de fazer isso com funções especiais em módulos de processamento de texto.&lt;br /&gt;&lt;br /&gt;Quando o significado dos números foi alterado nos processos de substituição de mapa por mapa, consertar esses programas foi tarefa infernal. Os programas com funções especiais de tratamento de texto modificaram apenas estas funções e foram livrados deste mal.&lt;br /&gt;&lt;br /&gt;Esta vitória do encapsulamento pode ser compreendida pelo encapsulamento de uma função sígnica -- a compreensão dos signos-número como signos-letra encapsulada em certos entes responsáveis, e uma transformação cultural pôde ser efetivada apenas instruindo estes entes responsáveis, e não todos os entes.&lt;br /&gt;&lt;br /&gt;No final das contas o problema se tornou tão bem resolvido que surgiu um componente tão reusável que surge por toda parte, a &lt;a href=&quot;http://www.gnu.org/software/libiconv/&quot;&gt;libiconv&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-6399571980090391732?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Programação e Semiótica 6</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/programacao-e-semiotica-6.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-1364536187229267009</id>
		<updated>2010-01-12T13:37:30+00:00</updated>
		<content type="html">Entender o texto de um programa sob a ótica da semiótica é um pouco mais fácil do que entender outros tipos de texto porque o limiar de realidade do programa está bem delineado e bem próximo: a máquina.&lt;br /&gt;&lt;br /&gt;Por essa razão, não é preciso uma poderosa metafísica para entender o que é um &lt;b&gt;objeto&lt;/b&gt;, mesmo que este esteja, para o programa escrito, totalmente oculto.&lt;br /&gt;&lt;br /&gt;Bolei o seguinte diagrama para descrever as três propriedades fundamentais de um objeto segundo as regras da máquina.&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_O7vJ6agDv_c/S0x6XkjobsI/AAAAAAAAAGM/SrzqX-nZOWI/s1600-h/object_01.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/_O7vJ6agDv_c/S0x6XkjobsI/AAAAAAAAAGM/SrzqX-nZOWI/s320/object_01.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Estas três propriedades são a &quot;base&quot; de um objeto e o determinam completamente; seu estado ou padrão de bits, seu local ou endereço, seu tamanho ou comprimento em bytes.&lt;br /&gt;&lt;br /&gt;Local e tamanho são propriedades espaciais, sendo a memória um universo unidimensional. Falamos sobre onde um objeto está, e ao longo de que comprimento. Estado é uma propriedade temporal, e (potencialmente) muda a cada instante.&amp;nbsp; Falamos sobre qual é o estado de um objeto (agora).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mas eu venho insistindo que o programa escrito em linguagem de alto nível nada sabe sobre objetos, exceto aquilo que pode falar sobre eles através de referências, e tentando aplicar a nomenclatura da semiótica para dizer isso.&lt;br /&gt;&lt;br /&gt;Bolei o seguinte diagrama para relacionar os três conceitos que eu estou tentando usar, que envolvem toda expressão no programa escrito sobre objetos.&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_O7vJ6agDv_c/S0x7fwGAAaI/AAAAAAAAAGU/A0GPUN3wC6s/s1600-h/object_02.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_O7vJ6agDv_c/S0x7fwGAAaI/AAAAAAAAAGU/A0GPUN3wC6s/s320/object_02.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Uma expressão em um programa escrito como &quot;y = x + x&quot; possui, além dos elementos sintáticos &lt;i&gt;=&lt;/i&gt; e &lt;i&gt;+&lt;/i&gt; os nomes &lt;i&gt;y&lt;/i&gt; e &lt;i&gt;x&lt;/i&gt;; estes nomes são tradicionalmente chamados &lt;b&gt;variáveis&lt;/b&gt; e eu os estou chamando aqui de &lt;b&gt;referências&lt;/b&gt;. Esses nomes significam objetos por intermédio de um &lt;b&gt;tipo&lt;/b&gt; (que eu acredito ser equivalente ao &lt;b&gt;interpretante&lt;/b&gt;.)&lt;br /&gt;&lt;br /&gt;Linguagens como C++ prendem referência e tipo através da sintaxe; a ferramenta que interpreta o programa sempre sabe qual é o tipo associado a um nome como &lt;i&gt;x&lt;/i&gt;. Linguagens como Javascript não prendem referência e tipo dessa forma, de modo que a ferramenta deve sempre considerar o contexto de uma expressão para inferir um tipo para &lt;i&gt;x&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A vantagem do C++ (e similares) é a possibilidade de se apoiar em uma ferramenta para evitar que uma referência absurda seja formada e usada; linguagens como essa permitem a dedução da validade semântica a partir da validade sintática. Este é o sonho da &lt;b&gt;análise estática&lt;/b&gt; de programas: descobrir erros no significado a partir do (uso da) sintaxe.&lt;br /&gt;&lt;br /&gt;No seguinte exemplo em C++:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;complex c1 = { 1.0, 1.0 };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;c1&lt;/i&gt; é uma referência cujo interpretante estático é &quot;número complexo&quot;. Conhecendo os segredos deste interpretante, poderíamos compreender o resto do texto, o próprio objeto, como o número complexo 1 + i.&lt;br /&gt;&lt;br /&gt;A vantagem do Javascript (e similares) é a possibilidade de se expressar&lt;br /&gt;sobre objetos através de múltiplos tipos viáveis de acordo com a conveniência; linguagens como essa simplificam a validade sintática para aumentar as opções de validade semântica.&lt;br /&gt;&lt;br /&gt;No seguinte exemplo em Javascript:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;nome = &quot;Pedro Lamarão&quot;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;nome&lt;/i&gt; é uma referência sem interpretante estático. Conhecendo os segredos da sintaxe da linguagem, saberíamos que aspas duplas implicam o interpretante &quot;texto&quot;, e portanto nome significa o meu nome.&lt;br /&gt;&lt;br /&gt;Independentemente de onde o leitor obtém um tipo-interpretante para uma variável-referência, é através deste que o objeto-estado possuirá uma conotação -- um significado imediato. Os três tipos fundamentais em máquinas contemporâneas são o inteiro-sem-sinal, o inteiro-com-sinal e o ponto-flutuante.&lt;br /&gt;&lt;br /&gt;Programas do mundo real, porém, estão muito interessados em coisas como letras, textos, nomes de pessoas e lugares, valores em moeda local, fotos etc. Diversos programas precisam impor significados adicionais a objetos fundamentalmente aritméticos para serem úteis.&lt;br /&gt;&lt;br /&gt;Essa necessidade nos leva naturalmente a pensar em &lt;b&gt;objetos compostos&lt;/b&gt; por &lt;b&gt;objetos simples&lt;/b&gt; e sobre a diferença conceitual entre um objeto na máquina concreta e um &lt;b&gt;valor&lt;/b&gt; em um &lt;b&gt;conjunto abstrato&lt;/b&gt;. Certos programas dirão que um certo objeto possui o valor &quot;Pedro Lamarão&quot; -- mesmo sabendo que a máquina fundamentalmente só compreende números.&lt;br /&gt;&lt;br /&gt;O relacionamento entre as idéias objeto e valor, e a idéia de composição de objetos, torna o processo semiótico de um programa muito mais rico, interessante e passível de absurdos -- onde nem sempre se consegue responder com facilidade a perguntas simples como &quot;&lt;i&gt;x&lt;/i&gt; é igual a &lt;i&gt;y&lt;/i&gt;?&quot;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-1364536187229267009?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Semiótica e Programação 5</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/semiotica-e-programacao-5.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-7131115908644246508</id>
		<updated>2010-01-07T10:57:46+00:00</updated>
		<content type="html">Agora, para um pensamento menos entediante.&lt;br /&gt;&lt;br /&gt;Considere que autenticação é o processo pelo qual um sujeito se convence que um certo signo de fato significa um certo objeto -- uma certa credencial de fato significa um certo indivíduo, por exemplo.&lt;br /&gt;&lt;br /&gt;Quando você ouve a campainha e alguém dizer &quot;Olá&quot; e pensa &quot;Deve ser fulano&quot; você autentica o signo vocal para se convencer ainda mais usando o olho mágico.&lt;br /&gt;&lt;br /&gt;O método de autenticação em sistemas de informação com a interação mais simples é a checagem de um segredo compartilhado. O sistema conhece um segredo para um username e assume que se alguém apresentar o username e o segredo, então deve ser o significado daquele username.&lt;br /&gt;&lt;br /&gt;O programa em execução, após executar essa interação com sucesso, construirá um objeto na memória, e manterá uma referência para ele cujo significado ulterior é username-do-usuário. Já que a autenticação foi bem sucedida, o programa confiará até terminar que esta referência é adequada, e poderá usá-la para julgar se deve ou deve não permitir o usuário a abrir certos arquivos etc.&lt;br /&gt;&lt;br /&gt;Esta confiança no significado daquela referência é perfeitamente adequada para programas convencionais: a memória de um programa convencional em um sistema convencional é exclusiva, de modo que ele pode facilmente se convencer de que o objeto referenciado é íntegro.&lt;br /&gt;&lt;br /&gt;Às vezes programadores movem para sistemas diferentes onde as regras são diferentes, e esse tipo de expectativa implícita é violada com consequências drásticas.&lt;br /&gt;&lt;br /&gt;O jovem programador que move sua atividade para a web pode escrever um site em script que autentica o usuário e guarda o username em um objeto da sessão. O programa subjacente então continuamente fará certa referência a este objeto para tomar decisões de segurança, afinal, esta referência está para o objeto certo, não é?&lt;br /&gt;&lt;br /&gt;Porém, neste ambiente, o programador não pode assumir a integridade do objeto -- não ingenuamente, como eu assumi acima. Como a web é um sistema bem distribuído e como o browser acessa o site um arquivo por vez, sem qualquer continuidade, este objeto ao qual o script faz referência não está sob seu controle. Ele existe em uma memória distante, fora do seu controle.&lt;br /&gt;&lt;br /&gt;Fora do seu controle significa sob controle de um outro agente: o cliente. Suponha então que eu faça um acesso a uma página restrita e posicione arbitrariamente um objeto com o &lt;i&gt;username&lt;/i&gt; de outra pessoa justamente no local onde a referência do programa assume que ele esteja. Assim, eu posso &lt;b&gt;mentir&lt;/b&gt; ao programa sobre quem eu sou, me valendo de uma ingenuidade no significado do programa.&lt;br /&gt;&lt;br /&gt;Perceber esse furo de segurança no site pode ser difícil porque o texto do programa do site pode adequadamente obter o &lt;i&gt;username&lt;/i&gt; e compará-lo com regras de autorização em todos os lugares. O problema aqui é semanticamente anterior a esta comparação: o problema está na premissa de que uma certa referência está de fato para um objeto com o significado esperado.&lt;br /&gt;&lt;br /&gt;Assim, os defeitos nos processos de autenticação em sistemas de informação são compreensíveis sob a ótica de uma função sígnica com &quot;defeito&quot; -- uma oportunidade através da qual o par em uma conversação tem condições de mentir. Concretamente, esse defeito existe no programa na forma de uma confiança indevida sobre o objeto de uma referência.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-7131115908644246508?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Semiótica e Programação 4</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/semiotica-e-programacao-4.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-4611088759351494385</id>
		<updated>2010-01-06T11:29:04+00:00</updated>
		<content type="html">O padrão Proxy ocorre sempre que um objeto no sistema existe como substituto de outro objeto, por alguma razão. Em um sistema distribuído entre muitos computadores físicos, um objeto local pode ser substituto de um objeto que está em outro computador, ocultando o mecanismo de comunicação entre computadores.&lt;br /&gt;&lt;br /&gt;O objeto proxy, de um modo ou de outro, possuirá uma referência ao objeto proxied; e o programa que possui uma referência ao objeto proxy possuirá uma referência ao objeto proxied.&lt;br /&gt;&lt;br /&gt;Esses múltiplos níveis de indireção trazem problema para a expressão e compreensão do programa devido a frequente ausência de interpretantes para humanos -- também conhecidos como &lt;b&gt;documentação&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Considere um objeto whatever que é um proxy para um objeto em um computador central, e uma rotina com essa aparência:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; get_name (whatever) -&amp;gt; (s1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; ; s1 is the name of whatever&lt;br /&gt;&lt;br /&gt;Um programa chama get_name e obtém uma referência ao objeto &quot;nome&quot; de um outro objeto qualquer.&lt;br /&gt;&lt;br /&gt;Agora, resta a pergunta: se o programa que eu estou rodando modificar o valor de s1, o que acontece com whatever? Se Fulana rodar o mesmo programa depois que eu, que valor de s1 ela vai obter? s1 é uma referência para uma cópia ou é uma referência para o original?&lt;br /&gt;&lt;br /&gt;Essa diferença é importante por razões que não apenas as consequências de modificar o objeto. A memória do computador é finita e portanto os programas devem cuidar de destruir os objetos que já acabaram de usar. Mas o que o programa que usa get_name deve fazer com o objeto referenciado por s1? Ele deve destruí-lo? Ele pode destruí-lo? Com certeza ele não pode destruir um objeto que está referenciado por diversos outros programas.&lt;br /&gt;&lt;br /&gt;Por que (alguns) programas devem cuidar da presença dos objetos na memória, e dar manutenção nessa memória, existe sempre o problema de dispor de espaço para objetos ocuparem e por quanto tempo. Quando um programa faz algo como:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; string s4 = &quot;Marcelinho&quot;&lt;br /&gt;&lt;br /&gt;a expressão de que &quot;existe um s4 que é um texto&quot; é interpretada implicitamente como &quot;precisamos arranjar espaço para um texto pelo tempo necessário&quot;.&lt;br /&gt;&lt;br /&gt;Quando o programa lida com objetos que foram criados por ele mesmo e são locais, o uso do espaço e do tempo é óbvio porque explícito; referências a objetos ocultos demandam maiores explicações.&lt;br /&gt;&lt;br /&gt;As referências indiretas como os objetos proxies levam o problema além quando tornam possível que uma referência seja absurda -- uma referência a nenhum-objeto. Há programas onde faz sentido uma referência a nenhum-objeto e há programas onde isso não faz sentido. O programador deve deixar isso sempre claro sob pena de não ser compreendido.&lt;br /&gt;&lt;br /&gt;Documentação é a única solução geral na medida em que linguagens de programação em geral não oferecem mecanismos sintáticos para se especificar esses atributos de uma referência.&lt;br /&gt;&lt;br /&gt;Nem mesmo C++, que possui duas notações para referências com diversos graus de rigor sintático, consegue expressar tudo o que se deseja expressar, e a confusão sobre a especificação de &quot;rvalue references&quot; indica que ainda não está firmada a sintaxe do futuro.&lt;br /&gt;&lt;br /&gt;Linguagens como Java, onde a quase totalidade dos objetos são criados por um gestor central em memória desconhecida, permitem ao programa ignorar a manutenção da memória mas ainda sofrem do problema de compreensão das referências.&lt;br /&gt;&lt;br /&gt;Quando começamos a considerar as referências polimórficas a situação fica ainda mais punk.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-4611088759351494385?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">URIs e a semiose da web</title>
		<link href="http://blog.pedro.lamarao.nom.br/2010/01/uris-e-semiose-da-web.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-3516084182757798238</id>
		<updated>2010-01-04T17:15:58+00:00</updated>
		<content type="html">(TODO: Será que estou usando os termos certos? Suponho que &quot;significante&quot; seja o mesmo que &quot;interpretante&quot; mas a nomenclatura da Semiótica não está bem firme na minha memória.)&lt;br /&gt;&lt;br /&gt;Existe bastante semiose na comunicação entre programas de computador, mesmo que seja uma semiose extremamente simples, com um universo de possibilidades bastante limitado.&lt;br /&gt;&lt;br /&gt;O serumano ao acessar uma página na Web digita no browser: http://www.twitter.com/pedrolamarao -- uma URI.&lt;br /&gt;&lt;br /&gt;Existe algo de muito interessante acontecendo entre o serumano, o browser e um servidor perdido na rede; algo descrito em grande pompa teórica na especificação das URIs.&lt;br /&gt;&lt;br /&gt;Em primeiro lugar, esse texto é bastante opaco para a maioria das pessoas; muitas delas compreendem que &quot;twitter&quot; é o nome de um &quot;site&quot; e que estão querendo ver as paradas de &quot;pedrolamarao&quot;.&lt;br /&gt;&lt;br /&gt;Alguns mais acostumados com a Web sabem que &quot;http&quot; é o nome das coisas que são da Web, e que existem outros nomes próprios de outros programas, como &quot;ftp&quot;.&lt;br /&gt;&lt;br /&gt;Realmente esse texto, ou esse símbolo, se divide em duas partes, e deve ser interpretado em dois estágios, ou como composto de dois símbolos distintos.&lt;br /&gt;&lt;br /&gt;O primeiro símbolo é &quot;http&quot; que deve ser interpretado de acordo com um esquema bem simples -- a pura comparação textual. &quot;http&quot; vai para cá, &quot;ftp&quot; vai para lá e assim por diante. O nome desse símbolo é &lt;b&gt;schema&lt;/b&gt; e esse símbolo será o interpretante do símbolo seguinte: deve-se interpretar o resto do texto de acordo com este princípio do texto.&lt;br /&gt;&lt;br /&gt;Existe uma infinitude de possíveis schemas, já que um schema é apenas e tão somente um monte de letras em sequência. Além disso, o acordo entre todos nós sobre o que um schema significa pode ou pode não ser bem definido; é claro que a Internet inteira concorda sobre o que é &quot;http&quot;, mas duvido que algum de vocês saiba como interpretar &quot;astrotv&quot; da mesma forma que eu.&lt;br /&gt;&lt;br /&gt;Quando o schema é &quot;http&quot; o sistema sabe que deve usar o browser Web. Ao menos, assim esperamos que seja, quando clicamos em &quot;http://www.twitter.com/pedrolamarao&quot; sublinhado em azul naquele email que recebemos. O browser Web, por sua vez, sabe que&amp;nbsp; o segundo símbolo -- &quot;www.twitter.com/pedrolamarao&quot; -- é composto também por diversos símbolos, quando a URI é &quot;http&quot;.&lt;br /&gt;&lt;br /&gt;O primeiro deste último conjunto é chamado &lt;b&gt;authority&lt;/b&gt; e possui um entre poucos interpretantes aceitáveis. Neste caso, o&lt;b&gt; domain name system&lt;/b&gt; ou &lt;b&gt;DNS&lt;/b&gt; é o nome do sistema responsável. Este sistema dirá ao browser Web onde está o servidor responsável. Mais detalhes são irrelevantes. Restam poucos outros interpretantes aceitáveis, e seus sistemas são cheios de números.&lt;br /&gt;&lt;br /&gt;O segundo deste último conjunto é chamado &lt;b&gt;path&lt;/b&gt;. Este path possui um interpretante básico: o sistema de arquivos do servidor significado pelo authority. É o mesmo que os arquivos na máquina de qualquer pessoa. É claro que, como é da natureza do mundo, existem diversos outros interpretantes possíveis, como por exemplo algum outro programa dentro do servidor Web que mapeia &quot;pedrolamarao&quot; para um negócio em um banco de dados.&lt;br /&gt;&lt;br /&gt;Porém, tudo o que o browser Web precisa saber, parte do seu acordo com o servidor Web, é que para qualquer path o servidor Web enviará uma porção de dados. Na maioria das vezes, esses dados estão de acordo com a norma&amp;nbsp; HTML ou CSS e devem ser interpretados através destas -- seus interpretantes. É claro que nem sempre é assim, já que vêm também scripts Javascript, fotos JPEG, música MP3 etc. etc.&lt;br /&gt;&lt;br /&gt;Como o browser sabe qual será o interpretante mais adequado para cada um desses símbolos bizarros de 0s e 1s que vêm pela rede? A semiose durante um simples abrir de página é complexa e cheia de elementos, e será finita apenas até o ponto em que o engenheiro perder o interesse nos detalhes do sistema.&lt;br /&gt;&lt;br /&gt;A cada passagem de símbolo a símbolo por um interpretante escolhido por qualquer agente nessa confusão toda há chance para algum problema. Administradores de servidor Web vivem às voltas com &quot;página não encontrada&quot; e arrancam os cabelos para entender porque um determinado path não foi encontrado. Volta e meia um browser Web resolve imprimir um monte de lixo na tela quando o usuário tem certeza que está baixando um filme. Às vezes um sujeito digita o nome de um site e o browser Web diz &quot;nome não encontrado&quot;. O que acontece quando a configuração do DNS está com defeito!? E alguns infelizes usam sistemas que não tem muita certeza sobre o que fazer com nomes começando com &quot;http&quot;.&lt;br /&gt;&lt;br /&gt;Toda vez que surge um novo sistema de componentes na indústria há bravatas sobre o desenvolvimento de um novo tipo de &quot;nome globalmente único&quot;. É o grande sonho da humanidade, ser capaz de nomear os entes sem ambiguidade. Todo um conjunto de sociedades esotéricas existe em desespero para aprender o Idioma de Adão, que soube nomear todas as coisas sem hesitação. Os humanos com senso prático compreendem que nomes são acordos entre as partes e estabelecem tais acordos entre si. O schema &quot;http&quot; por exemplo possui um significado em acordo estabelecido sob a autoridade do &lt;b&gt;IANA&lt;/b&gt;. Mas você sabe o que IANA significa?..&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-3516084182757798238?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Semiótica e Programação 3</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/12/semiotica-e-programacao-3.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8799538485271959819</id>
		<updated>2009-12-30T15:50:06+00:00</updated>
		<content type="html">Do ponto de vista do Java e do C#, C++ é uma linguagem fracamente tipada. Apesar de dizer isso abusar dos termos, existe um fundo de verdade ali.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C++, ao contrário de Java e C#, permite a formação de referências arbitrárias a qualquer objeto -- mesmo objetos hipotéticos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Programas como este são aceitáveis, para o compilador:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;list&amp;lt;string&amp;gt;* l = (list&amp;lt;string&amp;gt;*)0x12345;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;l-&amp;gt;sort();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta propriedade é inútil para a maioria dos programas, o que torna C++ excessivamente complicada aos olhos da maioria dos programadores. Se o programa está dizendo que naquele lugar ocorre um &lt;span&gt;list&amp;lt;string&amp;gt;&lt;/span&gt; então isso deve ser verdade, certo? Boa sorte!&lt;br /&gt;&lt;br /&gt;Existem programas que fazem uso dessa possibilidade, como programas para máquinas onde certos endereços são especiais e têm significado pré-definido.&lt;br /&gt;&lt;br /&gt;Programas como este também são aceitáveis:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;dog* marley = new dog();&lt;br /&gt;&lt;/div&gt;&lt;div&gt;spaceship* one = (spaceship*)marley;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;one-&amp;gt;launch();&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Essa possibilidade é inerente à máquina, na medida em que o significante de uma referência existe apenas no mundo do discurso; a máquina conhece apenas bits. A reinterpretação de um padrão de bits é uma operação de pura semiótica: não é necessário computar nada, apenas compreender os bits de uma forma diferente. Assim sendo, C++ se limita a dizer que não fará esforço para garantir que esse programa faz sentido -- o problema é todo seu.&lt;br /&gt;&lt;br /&gt;A estrutura que o tipo de uma referência impõe ao programa pode ser tal que nem todos os padrões de bits possíveis para aquele segmento de memória tenham um significado. Assim, apesar de o programa afirmar que ali está um objeto &lt;span&gt;spaceship&lt;/span&gt;, o padrão de bits que ocorre ali pode não representar um objeto &lt;span&gt;spaceship&lt;/span&gt; -- e o programa é literalmente um absurdo.&lt;br /&gt;&lt;br /&gt;Em outras palavras, esse programa potencialmente viola invariantes do tipo &lt;span&gt;spaceship&lt;/span&gt;, que são pré-condições automáticas para a chamada da função &lt;span&gt;launch&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A reinterpretação irrestrita de objetos é uma das características mais estranhas dessa linguagem, e mais difícil de pôr em prática de forma útil.&lt;br /&gt;&lt;br /&gt;Um desses usos é a transferência de objetos entre programas através de um dispositivo, técnica em que o programa receptor obtém uma pura sequência de bytes e assume que ali está o objeto transferido. Isso é chamado &lt;b&gt;serialização&lt;/b&gt; porque torna o objeto, que possui significado e estrutura, em um série de bits.&lt;br /&gt;&lt;br /&gt;Outro desses usos é a técnica de &lt;i&gt;&lt;b&gt;move construction&lt;/b&gt;&lt;/i&gt; do Elements of Programming, onde o objeto é reinterpretado de acordo com sua &lt;i&gt;&lt;b&gt;underlying class&lt;/b&gt;&lt;/i&gt; e copiado como tal -- e esta cópia é justamente a movimentação desejada.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-8799538485271959819?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Semiótica e Programação 2</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/12/semiotia-e-programacao-2.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-4823731260482466946</id>
		<updated>2009-12-30T12:55:38+00:00</updated>
		<content type="html">Linguagens cuja proposta é &lt;b&gt;tipagem forte&lt;/b&gt; permitem através de sua sintaxe a expressão de constrições sobre a manipulação do estado de um objeto denotado por uma referência. Linguagens cuja proposta é &lt;b&gt;tipagem fraca&lt;/b&gt; permitem manipulações de objetos com pouca constrição.&lt;br /&gt;&lt;br /&gt;Entendendo uma referência nesse contexto como o mesmo que um &lt;b&gt;signo&lt;/b&gt;, o &lt;b&gt;tipo&lt;/b&gt; é o &lt;b&gt;significante&lt;/b&gt; de uma referência, impondo significado ao objeto denotado.&lt;br /&gt;&lt;br /&gt;Para o programa, o tipo impõe constrições sobre as manipulações possíveis ou válidas desse objeto. Em linguagens como C++, a diferenciação dos tipos permite a seleção de uma entre diversas operações possíveis de modo particularmente significativo para o objeto referenciado.&lt;br /&gt;&lt;br /&gt;Naturalmente, programas podem formar diversas referências ao mesmo objeto, o que causa diversas dificuldades à especificação do significado de um programa como um todo e atrapalha ferramentas de transformação de código -- o &quot;problema de &lt;i&gt;&lt;b&gt;aliasing&lt;/b&gt;&lt;/i&gt;&quot;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A especificação da máquina abstrata que determina o significado de um programa deve responder de algum modo a questão: suponha uma referência &lt;i&gt;a&lt;/i&gt; cujo tipo é &lt;i&gt;A&lt;/i&gt; e uma referência&lt;i&gt; b&lt;/i&gt; cujo tipo é &lt;i&gt;B&lt;/i&gt; onde ambas denotam o mesmo objeto; suponha que um programa escreva um valor válido através de &lt;i&gt;a&lt;/i&gt; e então leia um valor através de &lt;i&gt;b&lt;/i&gt;; qual é o significado desse programa para &lt;i&gt;A&lt;/i&gt; e &lt;i&gt;B&lt;/i&gt; arbitrários?&lt;br /&gt;&lt;br /&gt;Linguagens de tipagem fraca frequentemente realizam conversões auto-mágicas internamente de modo que o programa acima sempre possui um significado compreensível. C++ dirá que o programa acima possui em geral um significado &lt;b&gt;indefinido&lt;/b&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-4823731260482466946?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Semiótica e Programação</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/12/semiotica-e-programacao.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-7784965457060396589</id>
		<updated>2009-12-28T11:11:47+00:00</updated>
		<content type="html">É interessante observar que podemos sem erro considerar todo nome de variável e função em um programa C++ como uma &lt;b&gt;referência&lt;/b&gt;. Esta referência, assim como possivelmente muitas outras, &lt;b&gt;denotam&lt;/b&gt; um certo objeto que, em si, não passa de uma combinação de três informações: um local, uma quantidade de armazenagem, e um estado atual. Referências cujo tipo é ponteiro-para-Foo &lt;b&gt;conotam&lt;/b&gt; um objeto do tipo Foo.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-7784965457060396589?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Drivers de Boot no Windows</title>
		<link href="http://www.driverentry.com.br/blog/2009/12/drivers-de-boot-no-windows.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-583517946433005279</id>
		<updated>2009-12-17T15:05:39+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.driverentry.com.br/images/StartingWidows.png&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Tenho acompanhado o trabalho do meu amigo Lesma, que em &lt;a href=&quot;http://www.caloni.com.br&quot;&gt;seu blog&lt;/a&gt; tem descrito como o processo de boot transforma um apanhado de bytes no disco rígido em um sistema operacional vivo. Pegando carona nesse tema, vou aproveitar para comentar sobre a ordem de carga dos drivers durante este processo. Com isso posso tentar responder uma pergunta frequente dos leitores: &lt;span&gt;&lt;span&gt;&quot;Como fazer para que meu driver seja o primeiro a ser carregado?&quot;&lt;/span&gt;&lt;/span&gt;. Talvez este post possa clarear um pouco as coisas neste sentido, ou não.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;Eu primeiro! Eu primeiro!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Um ponto importante a ser considerado no modelo &lt;span&gt;Legacy&lt;/span&gt; quando escrevemos um driver é o referente ao momento no qual seu driver é carregado. Isso é configurado no valor &lt;span&gt;&quot;Start&quot;&lt;/span&gt; na chave do driver no registro. Quatro valores configuram o momento da carga do seu driver, sendo eles:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Boot (0) - Drivers são carregados durante o boot, antes mesmo sistema operacional estar completamente pronto para execução.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;System (1) - Drivers são carregados depois dos drivers de boot, quando o Kernel já está completamente funcional.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Automatic (2) - Neste grupo os drivers são carregados quando os subsistemas forem carregados. Basicamente junto com os serviços de &lt;span&gt;User Mode&lt;/span&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Manual (3) - Nenhuma carga automática é realizada aqui, o driver é carregado somente quando alguém, ou algum componente, solicita sua carga.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Disabled (4)- Mesmo que o driver seja solicitado, sua carga é negada.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&quot;Bom, então para meu driver ser o primeiro a ser carregado ele precisa ser iniciado como boot e pronto?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Na verdade seu driver vai disputar um lugar na fila de drivers que querem ser iniciados no boot. Vários drivers estão configurados para ser iniciados nesse momento e o seu será apenas mais um. Mesmo entre os drivers de boot, uma ordem de carga precisa ser seguida para que certos drivers possam contar com os serviços de outros drivers. Por esse motivo, drivers se separam em grupos. Um grupo de cada vez vai sendo iniciado até que todos os drivers de boot passem por esse processo.&lt;/p&gt;&lt;p&gt;Drivers identificam seu grupo pelo valor &lt;span&gt;&quot;Group&quot;&lt;/span&gt; encontrado em sua chave de registro. Esta chave deve conter o nome do grupo ao qual o driver pertence. Os nomes de todos os grupos podem ser encontrados na chave &lt;span&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder&lt;/span&gt;. Nela existe um valor do tipo &lt;span&gt;REG_MULTI_SZ&lt;/span&gt; chamado &lt;span&gt;&quot;List&quot;&lt;/span&gt; que contém a lista de todos os grupos existentes dispostos em sua ordem de carga.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/ServiceGroupOrder.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&quot;Tudo bem, meu driver está configurado para ser iniciado em Boot e está configurado para iniciar com o primeiro grupo de drivers. Pronto agora?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Quase. Quando falamos em iniciar grupos de drivers, já fica sub-entendido que mais de um driver será carregado. A ordem que tais drivers são carregados dentro de cada grupo também pode ser determinada.&lt;/p&gt;&lt;p&gt;A chave &lt;span&gt;KHEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList&lt;/span&gt; mantém uma série de valores, cada um com o nome de um grupo. O valor é do tipo &lt;span&gt;REG_BINARY&lt;/span&gt; e sua interpretação é um array de conjuntos de quatro bytes. O primeiro conjunto indica quantas tags estão contidas naquele buffer binário. Os demais conjuntos são as representações numéricas de cada tag. Dessa forma, a interpretação do buffer exibido na figura abaixo nos dá a informação de que temos seis tags, sendo elas: 1, 2, 3, 4, 5 e 6.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/GroupOrderList.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&quot;Mas o que é uma tag?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Uma tag é a identificação numérica de um driver dentro de um determinado grupo. Um driver se identifica pelo valor &lt;span&gt;&quot;Tag&quot;&lt;/span&gt; que podemos encontrar na chave do driver no registro.&lt;/p&gt;&lt;p&gt;Apesar de o exemplo nos mostrar uma ordem crescente de tags, o valor da tag não determina a ordem de carga dos drivers. A ordem é determinada por sua posição dentro do buffer binário.&lt;/p&gt;&lt;p&gt;Ficou com nojinho de mexer em buffers binários? Você pode utilizar o &lt;a href=&quot;http://www.osronline.com/article.cfm?article=157&quot;&gt;OSR Driver Loader&lt;/a&gt; que configura tudo isso pra você quando utilizado para instalar um driver.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/DrvReinitLdr.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Colocar sua tag como primeiro na lista de tags classifica sua ordem de carga dentro de um determinado grupo, mas ainda não é fator determinante para ter seu driver carregado antes de todos os drivers do universo. Um novo grupo sempre pode ser criado e ter sua ordem de carga configurada para antes do seu grupo.&lt;/p&gt;&lt;p&gt;Todas essas regras sobre grupos, tags e afins não fazem sentido nos drivers gerenciados pelo &lt;span&gt;Plug-And-Play (Pnp) Manager&lt;/span&gt;, já que a carga de tais drivers é solicitada quando o dispositivo ao qual seu driver está relacionado é detectado pelo driver de barramento.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&quot;Aff! Fernando, pega leve e tenta explicar isso de novo.&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tudo bem, vamos lá. Quando você instala um driver Pnp, você o associa a um determinado dispositivo. Apenas como exemplo, digamos que esse dispositivo seja um conversor USB/Serial. Seu driver será carregado automagicamente quando seu dispositivo for detectado e será descarregado quando o dispositivo for removido.&lt;/p&gt;&lt;p&gt;Para que ele seja detectado, outros dispositivos precisam ser detectados antes, tais como controladora PCI, controladora USB e hub USB. Essa lista de dependência cria a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms794302.aspx&quot;&gt;pilha de dispositivos USB&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A controladora PCI, ao ser detectada, tem seu driver carregado e este enumera seus dispositivos filhos, já que PCI é um barramento. Para cada disposivito detectado, esse driver utiliza o barramento para detectar a identidade de cada dispositivo e cria um &lt;span&gt;Phisical Device Object&lt;/span&gt; (PDO) para cada um deles. O Pnp Manager carrega o driver de cada dispositivo atachado a esse barramento. Esse driver criará o &lt;span&gt;Functional Device Object&lt;/span&gt; (FDO) do dispositivo, dando funcionalidade a ele.&lt;/p&gt;&lt;p&gt;Um desses dispositivos é a controladora do barramento USB. Seguindo o ritual, o driver de barramento USB enumera seus dispositivos filhos, criando novos PDOs. Assim, os hubs USB são detectados e seu driver será carregado. Este driver criará um novo FDO para cada hub. O driver de hub USB vai enumerar seus dispositivos filhos e é nesse momento que seu dispositivo é detectado. O driver que você escreveu será carregado e o Pnp Manager irá chamar sua rotina &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms795509.aspx&quot;&gt;AddDevice&lt;/a&gt;, que receberá o PDO que o driver de hub criou referente ao seu dispositivo.&lt;/p&gt;&lt;p&gt;Ufa! Tudo bem, tenham calma. O assunto Plug-And-Play não é o foco deste post e já está na minha lista de posts futuros.&lt;/p&gt;&lt;p&gt;Toda essa atividade que age recursivamente serve para montar a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa489660.aspx&quot;&gt;árvore de dispositivos do sistema&lt;/a&gt;. Sabendo que esta árvore é formada pelos nossos drivers e seus devices, fica explícito aqui que no fundo &lt;a href=&quot;http://www.youtube.com/watch?v=JqIeVYIUKxk&quot;&gt;&quot;As árveres somos nozes&quot;&lt;/a&gt;. A figura abaixo dá uma idéia de como a árvore de dispositivos é organizada.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/DeviceTree.png&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Ainda falando sobre ordem de carga de drivers, não faria sentido ter seu driver carregado antes de todos os outros drivers, já que os componentes básicos para a comunicação com seu dispositivo ainda não foram carregados, e por isso, não possuem funcionalidade nenhuma. Além do mais, ter seu driver carregado muito cedo lhe trará problemas em lidar com outros componentes do sistema que ainda não estarão prontos para atender seu pedido. Mais detalhes &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/06/comear-de-novo.html&quot;&gt;neste post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;strong&gt;Depurando no Boot&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Outro assunto curioso e que pode gerar alguma confusão é o referente ao debug de drivers que são carregados no boot. Apesar de a conexão de Debug usar o meio &lt;a href=&quot;http://www.driverentry.com.br/blog/2006/12/step-into-kernel-serial.html&quot;&gt;serial&lt;/a&gt;, &lt;a href=&quot;http://www.driverentry.com.br/blog/2008/07/step-into-kernel-firewire.html&quot;&gt;firewire&lt;/a&gt; ou mesmo &lt;a href=&quot;http://www.driverentry.com.br/blog/2008/03/step-into-kernel-vista-usb2.html&quot;&gt;USB&lt;/a&gt;, os drivers referentes a estes meios não precisam estar carregados para que você possa realizar o debug do sistema. Em outras palavras, o driver de porta serial não é utilizado para fazer debug do sistema quando se usa o meio serial. Isso seria um problema se pensarmos que alguns drivers são carregados e inciados antes do driver de porta serial. Como estes drivers seriam depurados?&lt;/p&gt;&lt;p&gt;O fato é que o algoritmo que lida com os meios de depuração do sistema são definidos no próprio Kernel (mais precisamente no módulo ntoskrnl.exe e seus irmãos). Este módulo lida diretamente com o hardware responsável pelo meio utilizado. Essa é também a explicação para outra pergunta frequente: &lt;span&gt;&lt;span&gt;&quot;Meu computador não tem porta serial. Posso usar um conversor USB/Serial do lado Target para fazer debug do sistema?&quot;&lt;/span&gt;&lt;/span&gt;. Como acabamos de ver, um conversor USB/Serial depende de toda uma pilha de dispositivos para que a porta serial esteja disponível. Tal funcionalidade não está implementada no algoritmo de debug do sistema, e como comentei &lt;a href=&quot;http://www.driverentry.com.br/blog/2006/10/serial-killers.html&quot;&gt;neste outro post&lt;/a&gt;, sistemas mais novos implementam novas funcionalidades de debug no Kernel.&lt;/p&gt;&lt;p&gt;Mesmo que seu driver seja de boot, ele ainda pode ser depurado. &lt;a href=&quot;http://www.driverentry.com.br/blog/2007/07/bug-em-meu-driver-de-boot-j-posso.html&quot;&gt;Este outro post&lt;/a&gt; mostra ainda como fazer mapeamento de um driver de boot pelo WinDbg. Não sabe do que estou falando? É sobre ter seu driver substituído por uma nova versão automaticamente no lado target quando este for carregado. Vale a pena dar uma olhada.&lt;/p&gt;&lt;p&gt;Have fun!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-583517946433005279?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-04-21T15:00:26+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Lendo e medindo o tempo em C e C++: função time()</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo_time"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo_time</id>
		<updated>2009-12-16T19:09:33+00:00</updated>
		<content type="html">&lt;p&gt;Bom, chega de teoria e encheção de lingüiça e vamos para o código de uma vez por todas. A função mais conhecida para pegar a data e hora é a função time() da C runtime, que retorna quantidade de segundos desde o &lt;a href=&quot;http://en.wikipedia.org/wiki/Unix_time&quot;&gt;&quot;Unix Epoch&quot;&lt;/a&gt;, que é meia noite (00:00:00) de 1 de Janeiro de 1970. 

&lt;p&gt;Características da função time():

&lt;ul&gt;
&lt;li&gt;Retorna a quantidade de segundos desde 1 de Janeiro de 1970. Ou seja, a sua precisão máxima é de um segundo. Ou seja, não serve para medir performance. (ou seja, vou explicar mais sobre isso depois)
&lt;li&gt;O horário retornado é &lt;a href=&quot;http://en.wikipedia.org/wiki/Gmt&quot;&gt;GMT&lt;/a&gt;, para pegar o horário local é necessário fazer manualmente o cálculo para ajuste de fuso horário. Para usar o horário local é necessário usar a função get_timezone (ou _tzset no Visual C++) para ler a diferença do fuso que você usará para fazer o cálculo depois
&lt;li&gt;Como o retorno da função é um número inteiro, é muito fácil fazer contas com ele. Para avançar a data em dois dias, por exemplo, é só somar [60 * 60 * 24 * 2]. 
&lt;li&gt;Durante o inicio dos tempos do unix o retorno era do tipo int de 32 bits. Fazendo uma conta simples com os limites de um inteiro, vemos que o limite de medição é algum dia no ano de 2038, criando uma nova e repaginada versão do bug do milênio. Nas versões mais atuais dessa função o retorno é um int64, o que empurra o limite para uma data bem longínqua, quando provavelmente não haverá mais programadores vivos no universo.
&lt;li&gt;Por ser uma função da C runtime, está disponível em qualquer compilador C e C++ (qualquer == qualquer compilador não-exótico para plataformas não-exóticas). É provavelmente a função mais multiplataforma de todas que eu vou mostrar
&lt;/li&gt;&lt;/li&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 0xFFFFFFFFFFFFFFFF palavras, here we go:

&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;stdio.h&amp;gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;tchar.h&amp;gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;time.h&amp;gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;iostream&amp;gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;iomanip&amp;gt;
&lt;span class=&quot;keyword&quot;&gt;#include&lt;/span&gt; &amp;lt;string&amp;gt;

&lt;span class=&quot;keyword&quot;&gt;using namespace&lt;/span&gt; std;

&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; print_time(time_t t)
{
  tm* formatted_time;

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// essa função &quot;quebra&quot; essa quantidade de segundos e dia, mês, ano, etc&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  formatted_time = gmtime(&amp;amp;t);

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// isso vai mostrar algo como &quot;2009/12/07 14:42:57&quot;&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// note que é necessário somar 1900 na data para pegar o ano corrente&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  cout  setfill('0')  
    setw(4)  formatted_time-&gt;tm_year+1900  &quot;/&quot; 
    setw(2)  formatted_time-&gt;tm_mon+1  &quot;/&quot; 
    setw(2)  formatted_time-&gt;tm_mday  &quot; &quot; 
    setw(2)  formatted_time-&gt;tm_hour  &quot;:&quot;  
    setw(2)  formatted_time-&gt;tm_min  &quot;:&quot;  
    setw(2)  formatted_time-&gt;tm_sec  endl;
}


&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; main()
{
  time_t t;

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// pega o número de segundos desde 1970&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  t = time(NULL);

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// mostra na tela, formatado&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  print_time(t);

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// pega o fuso horário da máquina para pegar o horário local&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// ao invés de GMT. &lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  long timezone;

  _tzset(); &lt;span class=&quot;comment&quot;&gt;// carrega as configurações de fuso&lt;/span&gt;

  _get_timezone(&amp;amp;timezone); &lt;span class=&quot;comment&quot;&gt;// lê a diferença do fuso&lt;/span&gt;

  cout  timezone  endl;

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// ajusta o horário pelo fuso&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  t -= timezone;

  print_time(t);

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// avança da data em 2 dias&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  t += 48 * 60 * 60;

  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;// mostra novamente&lt;/span&gt;
  &lt;span class=&quot;comment&quot;&gt;//&lt;/span&gt;
  print_time(t);

  &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; 0;
}



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

&lt;p&gt;Esse código foi feito no Visual C++ (Windows). Existem pequenas diferenças nos nomes das funções no Linux, mas o conceito é o mesmo. Consulte sua documentação preferida para detalhes específicos.&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo_time#comments&quot;&gt;1 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">O mistério do sizeof – parte 3</title>
		<link href="http://www.zimbrao.com/cpp/?p=383"/>
		<id>http://www.zimbrao.com/cpp/?p=383</id>
		<updated>2009-12-16T14:43:01+00:00</updated>
		<content type="html">Código Fonte:

#include &amp;#60;cstdlib&amp;#62;
#include &amp;#60;iostream&amp;#62;

using namespace std;

struct A {
  void funcaoA() {}
};

struct B {
  void funcaoB() {}
};

struct C {
  void funcaoC() {}
};

struct ABC1 {
  A a;
  B b;
  C c;
};

struct ABC2: public A, public B, public C {
};

int main(int argc, char *argv[])
{
  cout &amp;#60;&amp;#60; &quot;sizeof( A ): &quot; &amp;#60;&amp;#60; [...]</content>
		<author>
			<name>Geraldo Zimbrão</name>
			<uri>http://www.zimbrao.com/cpp</uri>
		</author>
		<source>
			<title type="html">BLOG C++</title>
			<subtitle type="html">O BLOG do Zimbrão sobre a linguagem de programação C++!</subtitle>
			<link rel="self" href="http://www.zimbrao.com/cpp/?feed=rss2"/>
			<id>http://www.zimbrao.com/cpp/?feed=rss2</id>
			<updated>2010-03-24T02:00:06+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">bytes e suas interpretações</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/12/bytes-e-suas-interpretacoes.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8180731313504964483</id>
		<updated>2009-12-01T21:36:54+00:00</updated>
		<content type="html">Houve época em que, ao programar C#, sempre me irritava ver a notação byte -- me parecia estúpido ter um tipo na linguagem de programação chamado byte.&lt;br /&gt;&lt;br /&gt;Li hoje em um manual da Intel:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&quot;Although bytes, words, and doublewords are fundamental data types, some instructions support additional interpretations of these data types to allow operations to beperformed on numeric data types (signed and unsigned integers, and floating-point numbers).&quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Hoje, programando em C++, me irrita que não exista uma distinção entre char-que-é-sequência-opaca-de-bits, char-que-é-número-inteiro e char-que-é-elemento-alfabético.&lt;br /&gt;&lt;br /&gt;O texto do manual é interessante; para a máquina, realmente existe apenas o byte e suas variantes como padrões de bits; o que quer que você faça de interessante com esse byte implica uma interpretação desse byte.&lt;br /&gt;&lt;br /&gt;A máquina é &lt;i&gt;untyped&lt;/i&gt;; não existe mecanismo formal pelo qual se possa deduzir que uma interpretação para este byte é correta ou incorreta. Dependendo de quem você é, isso pode parecer ótimo ou absurdo.&lt;br /&gt;&lt;br /&gt;As razões porque isso é ótimo são boas, mas diminuiriam muito com algumas poucas extensões do C++. Programadores de aritmética com poucos recursos computacionais aprendem rapidamente, por exemplo, que a máquina pode computar muito rapidamente produto e divisão por 2 sem usar as instruções de produto e divisão de inteiros -- usando as instruções de shift de sequências de bytes. Esses programadores podem argumentar que essa é a vantagem da programação &lt;i&gt;untyped&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Felizmente, podemos pensar de trás pra frente; aceitando como axioma que a memória representa sempre &lt;i&gt;bits&lt;/i&gt;, então devem haver implementações ótimas para produto_por_2 e quociente_por_2 -- assim como é_par e é_negativo. Isso sugere que uma linguagem de programação com esses operadores nativos para números inteiros satisfaz as necessidades do programador acima -- diminuindo drasticamente a necessidade de permitir &lt;i&gt;shifts&lt;/i&gt; em objetos do tipo inteiro.&lt;br /&gt;&lt;br /&gt;Essa idéia me vem do &quot;Elements of Programming&quot;, de Stepanov e McJones; no livro eles discutem a idéia de &quot;base computacional&quot; de uma estrutura de dados. Quando aritmética inteira é implementada em uma máquina binária, produto_por_2, quociente_por_2, é_par e é_negativo devem fazer parte da base computacional dos tipos inteiros -- simplesmente por serem especialmente rápidas.&lt;br /&gt;&lt;br /&gt;(No livro, eles não estudam representações de números reais; alguém se habilita a compor uma base computacional para números reais representados como em IEEE 754?)&lt;br /&gt;&lt;br /&gt;[Editado!] &lt;br /&gt;&lt;br /&gt;Acho, além disso, interessante a definição de certos tipos de dados inúteis no manual da Intel, como &lt;i&gt;bit field&lt;/i&gt; e &lt;i&gt;string&lt;/i&gt;. Essas definições parecem mais sugestões de uso que definições, já que nem um &lt;i&gt;bit field&lt;/i&gt; nem um &lt;i&gt;string&lt;/i&gt; é mais que um ou mais bytes contíguos.&lt;br /&gt;&lt;br /&gt;Me parece que essas definições apóiam a definição posterior de operações extendidas ou especializadas sobre bytes, como referências a bits individuais ou cópia otimizada de bytes contíguos. É claro que essas são, ainda, operações simples sobre sequências de bits, e não demandam interpretação especial.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-8180731313504964483?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Droplet</title>
		<link href="http://techberto.wordpress.com/2009/11/30/droplet-um-twitter-google-reader-em-c-para-arduino/"/>
		<id>http://techberto.wordpress.com/?p=170</id>
		<updated>2009-12-01T00:34:01+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://farm4.static.flickr.com/3461/3791394747_8903a57aae.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;174&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Esbarrei com este projeto que achei bastante interessante, como um link às vezes é mais verboso do que mil palavras:&lt;/p&gt;
&lt;p&gt;-&lt;a href=&quot;http://rapplogic.blogspot.com/2009/08/droplet.html&quot; target=&quot;_blank&quot;&gt; Droplet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;Droplet&quot; src=&quot;http://farm3.static.flickr.com/2535/3791394561_74cc3f06f2.jpg&quot; alt=&quot;&quot; width=&quot;402&quot; height=&quot;500&quot; /&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=170&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Liga dos Programadores Independentes: primeira reunião</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/liga_encontro_1"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/liga_encontro_1</id>
		<updated>2009-11-30T19:32:12+00:00</updated>
		<content type="html">&lt;p&gt;Como temos quorum suficiente, está confirmada a primeira reunião para dia 2 de dezembro, quarta-feira, no &lt;a href=&quot;http://www.omalleysbar.net/&quot;&gt;O'Malleys&lt;/a&gt;, a partir das 19 horas. Com não sei exatamente quantas pessoas irão aparecer, vou reservar mesas para 10 pessoas. Como eu já tinha dito, lá as comandas são individuais e cada um paga sua própria conta. Chegando pergunte onde ficam as mesas e tenha certeza que um monte de programadores reunidos é algo bem fácil de achar.

&lt;p&gt;Só para esclarecer o debate do post anterior: você faz parte do público alvo do encontro se você é programador e tem uma idéia (implementada ou não) para fazer um software (produto ou serviço) para vender e ganhar dinheiro, não importa o motivo. Você pode estar puto com seu chefe e odiar trabalhar das 9 às 6 ou simplesmente ter vontade de abrir sua própria empresa. O encontro é para que programadores solitários e independentes tenham pessoas para discutir a viabilidade das suas idéias, e para discutir também métodos para colocá-las em prática. Para discutir métodos de desenvolvimento para transformar suas idéias em produtos e serviços e viver disso.

&lt;p&gt;Você não faz parte do público alvo se você tem a idéia para um software mas não consegue escrever o software sozinho. Esse encontro especificamente não é um bom lugar para encontrar um programador para implementar a sua idéia. Para isso tente a &lt;a href=&quot;http://www.apinfo.com&quot;&gt;apinfo&lt;/a&gt;. Talvez isso mude se o grupo crescer e se organizar, seria ótimo um encontro para juntar pessoas com boas idéias com pessoas com conhecimento técnico para executá-las. Não é (preconceito|elitismo|frescura|complexo de superioridade), é só questão de foco e redução de pauta para tentar fazer desse encontro o primeiro de muitos. &lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/liga_encontro_1#comments&quot;&gt;8 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Mais um Engenheiro à solta</title>
		<link href="http://www.driverentry.com.br/blog/2009/11/final-de-curso-mais-um-engenheiro-solta.html"/>
		<id>tag:blogger.com,1999:blog-32803974.post-5003926784526586187</id>
		<updated>2009-11-30T17:10:42+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.driverentry.com.br/images/GraduationHat.jpg&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Ufa! Quarta-feira passada foi minha última prova da universidade. Parece mentira mas finalmente o curso de Engenharia da Computação chegou ao fim. Ainda temos que entregar uma papelada do projeto de conclusão de curso, mas são apenas papéis. Acabaram as provas, os trabalhos, os relatórios e agora um baita peso começa a sair das minhas costas à medida que as notas vão sendo liberadas no site da universidade. Quem me segue no &lt;a href=&quot;http://twitter.com/driverentry&quot;&gt;Twitter&lt;/a&gt; teve uma idéia da correria que tem sido. Esse ano foi especialmente apertado por conta das dependêcias que tive que cursar, do estágio que tive que fazer, e por fim, do projeto de formatura que tivemos que apresentar.&lt;/p&gt;&lt;p&gt;O projeto foi o maior responsável pela minha ausência no blog, foram muitos testes, sustos, sensores queimados, apresentações e feiras.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;Pera aí! Você disse sensores queimados?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Isso mesmo. Murphy pode ser considerado um integrante do nosso grupo já que esteve sempre presente no desenvolvimento do projeto. Nas vésperas da apresentação para a banca avaliadora, um mal contato nos reguladores de tensão, originado pela trepidação do motor do helimodelo, fez com que quase tudo se queimasse. Foi um desespero geral, já que os sensores eram importados. Sem falar da grana que teríamos que desembolsar, ainda teríamos que aguardar a entrega que ocorre em média em duas semanas. Nesse momento Murphy nos deu uma trégua. Particularmente acho que ele ficou com pena de nós. Digo isso porque no dia seguinte encontramos uma &lt;a href=&quot;http://www.multilogica-shop.com/&quot;&gt;revenda&lt;/a&gt; de sensores similares aos que estávamos usando no projeto aqui em Santo André (cidade onde moro). Quando entramos em contato com a revenda, descobrimos que eles tinham os sensores em estoque. Inacreditável não?&lt;/p&gt;&lt;p&gt;Depois da apresentação que fizemos para a banca avaliadora, ainda fomos convidados a participar da apresentação de gala da universidade, onde os melhores projetos do ano foram exibidos.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/HeliISA2009.JPG&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Também ficamos em segundo lugar no concurso &quot;Melhor Aplicação Acadêmica Baseada em PC&quot; promovido pela &lt;a href=&quot;http://www.ni.com/&quot;&gt;National Instruments&lt;/a&gt;, e com isso fomos convidados a expor nosso trabalho no stand da National no &lt;a href=&quot;http://www.isashow.com.br/&quot;&gt;ISA Show 2009&lt;/a&gt;. O mais legal é que o primeiro lugar deste concurso foi conquistado por um grupo também da minha sala na &lt;a href=&quot;http://www.usjt.br/&quot;&gt;Universidade São Judas Tadeu&lt;/a&gt;. Isso evidenciou que além de ficarmos na frente de várias outras universidades, mostrou que nossa sala né brinquedo não.&lt;/p&gt;&lt;p&gt;A National Instruments produziu este vídeo explicativo onde eu falo sobre a idéia básica do projeto. O vídeo foi feito na chácara de um dos componentes do grupo, onde ficamos internados nas últimas semanas antes das apresentações finais.&lt;/p&gt;&lt;div align=&quot;center&quot; width=&quot;100%&quot;&gt;&lt;/div&gt;&lt;p&gt;Este é apenas um post de &lt;span&gt;&quot;Ei, estou voltando do coma!&quot;&lt;/span&gt;. Agora vou parar de falar sobre o projeto e voltar a falar sobre o que realmente interessa: &lt;a href=&quot;http://pt.wikipedia.org/wiki/BSOD&quot;&gt;&quot;Telas Azuis da Morte&quot;&lt;/a&gt;. O meu grande dilema agora é se devo também comentar algo sobre firmware e hardware. Desenvolvi muitas atividades com software embarcado não só durante a produção do projeto.&lt;/p&gt;&lt;p&gt;Durante o projeto, sobretudo desenvolvendo protocolo USB em um &lt;a href=&quot;http://pt.wikipedia.org/wiki/Intel_8051&quot;&gt;8051&lt;/a&gt; utilizando o &lt;a href=&quot;http://www.keil.com/&quot;&gt;Keil&lt;/a&gt;, além de ler sensores e trabalhar com barramentos em um &lt;a href=&quot;http://pt.wikipedia.org/wiki/Microcontrolador_PIC&quot;&gt;PIC&lt;/a&gt; utilizando o compilador &lt;a href=&quot;http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;nodeId=1406&amp;dDocName=en010014&quot;&gt;C18&lt;/a&gt; no &lt;a href=&quot;http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;nodeId=1406&amp;dDocName=en019469&amp;part=SW007002&quot;&gt;MPLAB&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Além disso, tive a oportunidade de contribuir no desenvolvimento de um projeto do &lt;a href=&quot;http://www.ipei.com.br/&quot;&gt;IPEI&lt;/a&gt;. O hardware deste projeto mede os resultados de uma máquina de tração e os envia a um computador via USB. Contribui no desenvolvimento do firmware PIC implementando o protocolo &lt;a href=&quot;http://en.wikipedia.org/wiki/Human_interface_device&quot;&gt;HID&lt;/a&gt; mais uma vez utilizando o MPLAB.&lt;/p&gt;&lt;p&gt;Por último e não menos importante, também contribui no desenvolvimento de firmware &lt;a href=&quot;http://www.freescale.com/&quot;&gt;FreeScale&lt;/a&gt; durante meu estágio na &lt;a href=&quot;http://www.commodity.com.br/&quot;&gt;Commodity&lt;/a&gt;. Este firmware também lida com protocolo USB, e conta com o auxílio de um chip que dispoê desta interface, já que o DSP que compunha a solução não o fazia. Desta vez tive que utilizar o &lt;a href=&quot;http://www.freescale.com/codewarrior&quot;&gt;Code Warrior&lt;/a&gt; no desenvolvimento, e revivi o tempo em que trabalhei na &lt;a href=&quot;http://www.provectus.com.br/&quot;&gt;Provectus&lt;/a&gt; desenvolvendo um Bootloader para a atualização do próprio firmware via rede 485, só que dessa vez foi através da USB.&lt;/p&gt;&lt;img src=&quot;http://www.driverentry.com.br/images/USBComplete.jpg&quot; border=&quot;0&quot; /&gt;&lt;p&gt;Tanta interação com a USB de ambos os lados do cabo é principalmente fruto dos conhecimentos adquiridos com o livro &lt;a href=&quot;http://www.amazon.com/USB-Complete-Everything-Develop-Peripherals/dp/B001TJQQ0O/ref=sr_1_6?ie=UTF8&amp;s=books&amp;qid=1259596967&amp;sr=1-6&quot;&gt;&quot;USB Complete&quot;&lt;/a&gt; de Jan Alexlson. Não me lembro se já comentei sobre esse livro aqui antes, mas vale a pena falar dele principalmente sobre do ponto de vista eletrônico/firmware. O livro é simplesmente ótimo, mas diz não cobrir o desenvolvimento de drivers para USB pois tal assunto daria um livro à parte. Com isso ele indica um velho conhecido nosso, o &lt;a href=&quot;http://www.amazon.com/Programming-Microsoft%C2%AE-Windows%C2%AE-Driver-Second/dp/0735618038/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1259596816&amp;sr=8-1&quot;&gt;&quot;Programming the Windows Driver Model&quot;&lt;/a&gt; de Walter Oney.&lt;/p&gt;&lt;p&gt;De qualquer forma, aguardem por reformas neste blog. Durante muito tempo tenho trabalhado no limite para conseguir postar e ainda dar conta de todo o resto. Agora meu tempo extra me permitirá fazer posts com mais frequência e finalmente montar turmas abertas do Curso de Drivers para Windows.&lt;/p&gt;&lt;p&gt;Como alguns de vocês já sabem, mantenho uma lista de interessados no curso e que serão notificados por e-mail quando as turmas forem abertas. Independente disso, gostaria de receber e-mails sobre preferências de horários e especialidades, tais como WDM/KMFD/UMDF/File Systems ou ainda sobre ênfase em USB/PCI.&lt;/p&gt;&lt;p&gt;É isso aí. Para um post que não tinha nada a dizer, até que esse disse muito.&lt;br /&gt;Até breve!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32803974-5003926784526586187?l=www.driverentry.com.br%2Fblog&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Fernando Roberto da Silva</name>
			<email>fernando@driverentry.com.br</email>
			<uri>http://www.driverentry.com.br/blog/</uri>
		</author>
		<source>
			<title type="html">DriverEntry - Did you think it'd be easy?</title>
			<subtitle type="html">Blog destinado aos desenvolvedores de drivers e softwares de baixo nível para Windows.</subtitle>
			<link rel="self" href="http://www.driverentry.com.br/blog/atom.xml"/>
			<id>tag:blogger.com,1999:blog-32803974</id>
			<updated>2010-04-21T15:00:26+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">C++ em múltiplas configurações</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/11/c-em-multiplas-configuracoes.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-6746931133681239097</id>
		<updated>2009-11-29T12:12:39+00:00</updated>
		<content type="html">Parte dos meus esforços em entender o ambiente de programação C++ é buscar os padrões de uso do pré-processador, algo que eu nunca encontrei catalogado sistematicamente.&lt;br /&gt;&lt;br /&gt;Ao meu ver, existem dois grandes grupos de usuários do pré-processador: programadores que usam macros como formas de reusar código totalmente &lt;i&gt;inline&lt;/i&gt;, e programadores que usam macros para variar a definição de um programa C++ de acordo com variáveis de configuração.&lt;br /&gt;&lt;br /&gt;A comunidade do C++ acredita que a necessidade de usar macros hoje praticamente não existe; essas pessoas deveriam ser mais específicas e dizer que a necessidade de usar macros para reusar código totalmente &lt;i&gt;inline&lt;/i&gt; já não existe, porque compiladores otimizadores e templates de função são capazes de fazer isso.&lt;br /&gt;&lt;br /&gt;(Eu chamo reusar código totalmente &lt;i&gt;inline&lt;/i&gt; a uma forma de reuso que insere código diretamente no chamador, sem utilizar o mecanismo de chamada de subrotina, que envolve empilhamento, desempilhamento e saltos.)&lt;br /&gt;&lt;br /&gt;Porém, não há solução sintática para o problema das configurações -- ao menos, não há solução bem conhecida. É interessante ler sobre &lt;a href=&quot;http://www.gnu.org/software/autoconf/manual/html_node/Genesis.html&quot;&gt;a história do autoconf&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-6746931133681239097?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Otimização nas Sombras do C++</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/11/otimizacao-nas-sombras-do-c.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8762140873733601876</id>
		<updated>2009-11-26T15:50:09+00:00</updated>
		<content type="html">Eu não encontro pessoalmente esse tipo de coisa com muita frequência atualmente, mas foi tempo em que volta e meia me aparecia código-fonte muito esperto, ou críticas muito espertas sobre o meu código-fonte, com relação a quão &quot;ótimo&quot; ele é.&lt;br /&gt;&lt;br /&gt;Em C, essas espertezas eram invariavelmente transformações de uma notação legível e imediatamente representativa do algoritmo lógico por uma notação ilegível, equivalente mas que executava mais rápido.&lt;br /&gt;&lt;br /&gt;Truques de aritmética de ponteiros para escrever mais rápido na memória, truques horrendos com while e switch sem break pra desenrolar loops -- vários truques cujo objetivo é escrever o mesmo código gerando um programa melhor.&lt;br /&gt;&lt;br /&gt;De certa forma, os truques dessa época eram motivados pelos compiladores dessa época, máquinas de transformação burra de C para assembler. Com o objetivo de gerar o melhor assembler, programadores produziam pior C -- mais rápido, sim, mas menos legível e de mais difícil manutenção.&lt;br /&gt;&lt;br /&gt;Com o passar do tempo, os compiladores se tornaram otimizadores, capazes de &lt;i&gt;inlining&lt;/i&gt;, remoção de código morto, desenrolamento de &lt;i&gt;loops&lt;/i&gt;, progragação de valores constantes etc.&lt;br /&gt;&lt;br /&gt;As máquinas, por sua vez, introduziram &lt;i&gt;pipelines&lt;/i&gt; para otimizar o trabalho de processador mais e mais rápido que a memória, capazes de execução computações intermediárias simultaneamente a recuperação de dados da memória, especulação sobre valores futuros para adiantar computações etc.&lt;br /&gt;&lt;br /&gt;Compiladores cientes do &lt;i&gt;pipeline&lt;/i&gt; passaram a otimizar ainda mais, ordenando e reordenando instruções de modo a obter o melhor desempenho do otimizador alvo.&lt;br /&gt;&lt;br /&gt;Quem tem à mão um excelente compilador otimizador não precisa mais se preocupar em produzir código esperto. O compilador quase invariavelmente é melhor do que o programador humano. Ele também é a ferramenta adequada para a esperteza -- porque projetos críticos frequentemente transformam um código-fonte em programas para diversas máquinas, onde as peculiaridades variam muito.&lt;br /&gt;&lt;br /&gt;Mas então, um dia, surgiram as máquinas multi-processadas. A seguinte &lt;a href=&quot;http://ridiculousfish.com/blog/archives/2007/02/17/barrier/&quot;&gt;citação&lt;/a&gt; resume a tragédia da programação para tais máquinas:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Yeah, I know. &quot;Multithreading is hard&quot; is a cliché, and it bugs me, because it is not some truism describing a fundamental property of nature, but it’s something &lt;/i&gt;&lt;i&gt;we did.  We made multithreading hard because we optimized so heavily for the single threaded case.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;O problema fundamental de um programa &lt;i&gt;multithreaded&lt;/i&gt; em uma máquina onde os processadores compartilham a memória é o de garantir que um certo objeto lógico -- uma sequência de bytes na memória -- não será escrito e lido de forma incosistente por múltiplos processadores -- porque um está escrevendo pela metade quando outro está lendo, etc.&lt;br /&gt;&lt;br /&gt;Por mais que um programador faça esforço para ordenar adequadamente as instruções em um programa -- de modo que qualquer ordem de leitura possível faça algum sentido -- o fato é que o otimizador do compilador, e o otimizador do &lt;i&gt;pipeline&lt;/i&gt;, fará mágicas com a presença e a ordem das instruções, violando a expectativa do programador.&lt;br /&gt;&lt;br /&gt;Desse modo, os truques espertos da atualidade não são truques para otimizar o &lt;i&gt;assembler&lt;/i&gt; e sim truques para evitar inconsistência no acesso concorrente à memória.&lt;br /&gt;&lt;br /&gt;As pessoas legais agora falam sobre &lt;i&gt;atomics&lt;/i&gt; e &lt;i&gt;memory barriers&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;O que há de curioso aqui é que esse problema espirra em certas direções mesmo onde não há múltiplos &lt;i&gt;threads&lt;/i&gt;. Ao programar uma máquina com suporte a &lt;i&gt;memory mapped I/O&lt;/i&gt; o mesmo problema de consistência ocorre sobre um endereço &lt;i&gt;memory mapped&lt;/i&gt; -- reordenar leituras e escritas ali resulta no caos.&lt;br /&gt;&lt;br /&gt;Tendo chegado até aqui, releia seu livro favorito sobre C++ sobre o significado da palavra-chave &lt;span&gt;volatile&lt;/span&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-8762140873733601876?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">A Liga dos Programadores Independentes</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/programadores_independentes"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/programadores_independentes</id>
		<updated>2009-11-25T10:22:20+00:00</updated>
		<content type="html">&lt;p&gt;Eu tenho certeza que não sou o único programador com ideias mirabolantes para dominar o mundo. Seja um projeto de software para ficar bilionário ou um simples serviço online para ajudar o ego (com Google Adwords para ajudar mais ainda o ego), já ouvi várias boas ideias de várias pessoas com quem trabalhei e convivi. O grande problema é que ninguém tem a organização e foco necessários para tocar um projeto desses. Eu também não, mas estou tentando chegar lá. E depois de aproximadamente 17 candidatos a sócio (sócio-programador, não o financeiro), eu desisti de tentar apoio nas minhas empreitadas. Sou agora um programador independente.

&lt;p&gt;Lendo o Twitter do Rafael Beckel vi que ele também estava com ideias para dominar o mundo, então liguei pra ele para marcarmos um chopp e conversar. Nenhum chopp depois (acabamos indo para o McDonalds) pensamos em montar um grupo de programadores malucos com ideias malucas, para termos com quem discutir nossas maluquices. Não é algo para discutir como montar um plano de negócio ou como conseguir dinheiro para financiar uma empresa. É para conversar sobre software. E sobre como manter o foco em um projeto quando você trabalha nele sozinho. E, claro, para ter pessoas para discutir suas ideias. &lt;a href=&quot;http://dozeroaomestre.blogspot.com/2009/11/ressurgindo-das-cinzas.html&quot;&gt;O Rafael também escreveu sobre a conversa que tivemos&lt;/a&gt;.

&lt;p&gt;Como eu já disse, o foco é software. Pode ser indelicadeza da minha parte (sendo &quot;indelicadeza&quot; um puta de um eufemismo), mas pessoas que não sabem programar e não são da área de software não seriam bem vindas nesse suposto grupo (não queremos montar um sebrae). O foco é software, o publico alvo são pessoas que sabem fazer software. Com as próprias mãos. Pessoas que querem discutir organização e método para terminar seu software, já que não adianta ter um plano de negócio ou zilhares de pesquisas de sei-lá-o-que se você não tem software para o usuário interagir.

&lt;p&gt;Minha idéia é um primeiro encontro de buteco para discutirmos o formato do grupo. Dia 2 de dezembro, quarta-feira, no &lt;a href=&quot;http://www.omalleysbar.net/&quot;&gt;O'Malleys&lt;/a&gt; que fica perto da Paulista. Além de ser um lugar onde é possível conversar, a comanda é individual e não tem 10%. Quem não quiser me acompanhar me acompanhar no pint de Guinness pode tomar um refrigerante e não dividir a conta com os &lt;a href=&quot;http://malditoprogramadorbebado.blogspot.com&quot;&gt;malditos programadores bêbados&lt;/a&gt;. Comentem sobre a data e hora e farei um outro post semana que vem confirmando o horário e local.



&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/programadores_independentes#comments&quot;&gt;23 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Mais sombras no Ambiente de Programação C++</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/11/mais-sombras-no-ambiente-de-programacao.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-2614224564250838221</id>
		<updated>2009-11-23T17:55:04+00:00</updated>
		<content type="html">Estou lendo a ementa do curso de pós-graduação em Análise e Projeto de Sistemas da PUC-Rio, onde ocorre o seguinte:&lt;br /&gt;&lt;br /&gt;&quot;Laboratório de Linguagens de Programação&lt;br /&gt;&lt;br /&gt;Objetivo – Capacitar o aluno a distinguir os principais componentes de linguagens de programação não convencionais tais como: programação orientada a objetos, programação orientada a eventos e programação para Internet/intranet.&quot;&lt;br /&gt;&lt;br /&gt;A presença de &quot;programação orientada a eventos&quot; ali é interessante; a ementa prossegue em explicar que neste módulo o aluno aprenderá a programar Applets Java, que são orientados a eventos.&lt;br /&gt;&lt;br /&gt;O que se chama &quot;orientação a eventos&quot; ali é uma técnica de projeto de aplicativos úteis plugados em algum tipo de &lt;i&gt;framework&lt;/i&gt; de apoio, que cuida de enviar os tais eventos para o aplicativo.&lt;br /&gt;&lt;br /&gt;Há um sub-grupo dos programadores de C++ que dirá a você que &quot;não programa interfaces de usuário&quot;. Essa é uma afirmação interessante porque, compreendido com rigor máximo, significa que os programas produzidos por essa pessoa produzem resultados totalmente invisíveis.&lt;br /&gt;&lt;br /&gt;Todo programa de computador possui uma interface de usuário -- senão, o usuário nunca veria seu resultado. Programadores C++ são criados desde o berço para produzir programas cuja interface com o usuário é o terminal -- um dispositivo capaz de apresentar um mapa de 80x24 caracteres.&lt;br /&gt;&lt;br /&gt;O que há de interessante nisso é que existe um mecanismo subjacente a esse terminal que suporta a parafernália usada para pôr ali os tais caracteres -- std::cout, printf etc. Esse mecanismo é inicializado, mantido e finalizado pela implementação do C++ de forma oculta ao usuário.&lt;br /&gt;&lt;br /&gt;Existem ambientes peculiares onde o C++ não inicializa nada disso -- ou inicializa essas coisas de forma inesperada. Os compiladores da Microsoft oferecem um parâmetro de chamada ao compilador para selecionar o &quot;subsistema&quot; -- CONSOLE ou WINDOWS. Aplicativos compilados para o subsistema WINDOWS não fazem coisas úteis quando o programa chama printf.&lt;br /&gt;&lt;br /&gt;No projeto onde estou alocado agora, o sistema implantado no dispositivo-alvo é altamente customizado, e a biblioteca padrão C++ apresenta esquisitices parecidas. Não existe um &quot;terminal&quot; e chamar printf às vezes não faz nada, às vezes bloquea o sistema eternamente em um signal handler.&lt;br /&gt;&lt;br /&gt;Bibliotecas como a Qt e a Glib oferecem uma terceira via, que talvez pudesse ser compreendida como um terceiro subsistema, o EVENT_LOOP. Esse subsistema possui sua própria API e faz tudo pela aplicação, que apenas inicia operações no sistema e senta esperando por notificações sobre o resultado. Assim são os Applets Java.&lt;br /&gt;&lt;br /&gt;Tudo isso sugere que o ambiente de execução do C++ executa mais que apenas o código da aplicação, e de fato existem atividades que ocorrem antes de &lt;span&gt;main&lt;/span&gt; iniciar e depois de &lt;span&gt;main&lt;/span&gt; finalizar. O programador atento procurará pelo código-fonte ou executável do CRT no seu sistema -- o C Run-Time.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-2614224564250838221?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">WebCast sobre DLR no .NET Framework 4.0</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/webcast_dlr"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/webcast_dlr</id>
		<updated>2009-11-18T20:04:24+00:00</updated>
		<content type="html">&lt;p&gt;Amanhã 12:00hs estarei apresentando o &lt;a href=&quot;http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032431902&amp;EventCategory=4&amp;culture=pt-BR&amp;CountryCode=BR&quot;&gt;&quot;MSDN Webcast: Trabalhando com o DLR no .NET Framework 4&lt;/a&gt;. Falarei da versão nova da DLR (Dynamic Language Runtime) que fará parte do .NET 4.0, de IronPython e sobre como integrar scripts Python no C#.

&lt;p&gt;Parece que ainda consta o nome do Alfred Myers como apresentador, mas eles devem arrumar isso logo&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/webcast_dlr#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Meu Twitter</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/twitter"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/twitter</id>
		<updated>2009-11-18T12:55:53+00:00</updated>
		<content type="html">&lt;p&gt;Também é sobre programação e afins (com poucos avisos úteis tipo &quot;acabou a luz aqui, catso, perdi meus fontes #apagão&quot;). Não espere saber se eu acordei de bom humor ou se o filme xpto é bom ou não.

&lt;p&gt;&lt;a href=&quot;http://www.twitter.com/rodrigostrauss&quot;&gt;http://www.twitter.com/rodrigostrauss&lt;/a&gt;

  &lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/twitter#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Lendo e medindo o tempo em C e C++</title>
		<link href="http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo"/>
		<id>http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo</id>
		<updated>2009-11-17T20:32:18+00:00</updated>
		<content type="html">&lt;p&gt;Existem vários motivos para um programa consultar o &quot;horário da máquina&quot;. Os mais comuns são registrar a data e hora de um acontecimento ou ação do usuário (data de acesso à um arquivo, por exemplo) ou medir o intervalo entre dois momentos para saber o tempo que algo levou.

&lt;p&gt;Em C e C++ existem diversas maneiras de ler uma representação numérica de um determinado instante no tempo, e cada uma tem seu uso e característica. Essa salada de funções e APIs existem porque usando C e/ou C++ você tem acesso à todas as camadas de abstração (ou não-abstração), desde o relógio da placa mãe, passando pela BIOS, pelas APIs do sistema operacional até as funções da runtime do C ou do boost::datetime. Nessa série de posts vamos ver as características de cada forma de ler o &quot;horário da máquina&quot;.

&lt;p&gt;Toda representação numérica de um instante no tempo é dada pela diferença entre o instante da medição e um instante tido como referência. Quando usamos uma data e hora no nosso calendário gregoriano, tomamos como referência a &quot;data tradicional da encarnação de Jesus Cristo&quot;. Isso é uma referência. 26 de maio de 1980 é tradução de (instance referência) + (1980 anos) + (5 meses) + (26 dias). Passando essa data para qualquer pessoa/programa que use a mesma refererência, ela consigirá saber de que instante no tempo você está falando. É importante saber esse conceito porque em programação a referência muitas vezes é diferente da referência do calendário gregoriano (por motivos técnicos e não religiosos. Sem teorias da conspiracão, pelamordedeus).

&lt;p&gt;Quando usamos uma data e hora &quot;normal&quot; (ou seja, do calendário), ainda temos outra variável na verificação do horário: o fuso e o horário de verão. O horário de Brasília (fuso de São Paulo, onde eu moro) é de -3 horas em relação ao horário GMT, que é tido como a referência mundial para os fusos (GMT é Greenwich Mean Time, horário de Greenwich na Inglaterra). O horário de verão não muda o fuso do país, mas adianta o horário em uma hora. Na prática, é como se São Paulo virasse GMT-2. O fuso é uma informação controlada pelo SO, e mudar o fuso pode causar mais problemas ainda. Os SOs tratam o horário de verão explicitamente. Quem cuida de sistemas de produção onde a data e hora é algo importante sabe o inferno que é quando começa ou quando termina o horário de verão.

&lt;p&gt;Saindo da história e voltando para a programação, existem alguns fatores importantes para escolher qual sistema de medição usar. Um fator importante é se o instante referência é fixo ou não (calendário gregoriano x quantidade de segundos desde que a máquina foi ligada). O outro é a precisão da medição, geralmente em segundos ou menos. Se você precisa medir o tempo que leva para concatenar uma string, medir em segundos não vai adiantar nada (isso geralmente leva nanosegundos).

&lt;p&gt;Resumindo o que precisamos saber para escolher que função ou API de tempo usar:

&lt;ul&gt;
&lt;li&gt;Referência: se é uma referência fixa (início do calendário gregoriano) ou uma referência relativa (hora de início da máquina ou de inicialização do sistema operacional)
&lt;li&gt;Precisão do retorno. Não adiantar usar uma função que retorna a hora com precisão de segundos se vou fazer um cálculo de período que leva microsegundos.
&lt;li&gt;Precisão de leitura. Existem funções que retornam em milisegundos, mas a precisão é menor que isso. A função GetTickCount da API Win32 retorna a quantidade de millisegundos desde o início do sistema, mas sempre em intervalos maiores do que 15ms. Ou seja, ele não consegue medir algo que leva menos do que 15ms
&lt;li&gt;Performance. Algumas funções de leitura de hora são mais rápidas que outras. Se vocês faz isso dentro de um loop, isso faz diferença
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Por exemplo, uma função com precisão baixa pode ser usada para medir o tempo de abandono do meu blog, já que faz muuuito tempo que eu não atualizo isso aqui :-)

&lt;p&gt;O próximo post terá código. Não se preocupem, estou mais ansioso por isso do que vocês.&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/ccpp_medindo_tempo#comments&quot;&gt;4 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Rodrigo Strauss</name>
			<uri>http://www.1bit.com.br/content.1bit/weblog</uri>
		</author>
		<source>
			<title type="html">RodrigoStrauss::WebLog();</title>
			<subtitle type="html">Rodrigo Strauss - WebLog</subtitle>
			<link rel="self" href="http://www.1bit.com.br/weblog_rss.1bit"/>
			<id>http://www.1bit.com.br/&quot; . $link . &quot;</id>
			<updated>2010-04-24T13:00:53+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2009/11/16/debriefing-do-seminario-c-c-para-sistemas-embarcados-2009/"/>
		<id>http://techberto.wordpress.com/?p=166</id>
		<updated>2009-11-17T01:47:55+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Neste 14/11/2009, o portal &lt;a href=&quot;http://www.embarcados.com.br/&quot;&gt;Embarcados&lt;/a&gt; e o grupo &lt;a href=&quot;http://ccppbrasil.org/wiki/Grupo:Capa&quot;&gt;C &amp;amp; C++ Brasil&lt;/a&gt; com a produção da &lt;a href=&quot;http://www.temporealeventos.com.br/&quot;&gt;Tempo Real Eventos&lt;/a&gt; realizou, no Hotel Century Paulista em São Paulo, a edição 2009 do &lt;a href=&quot;http://techberto.wordpress.com/2009/10/18/ii-seminario-c-c-para-sistemas-embarcados/&quot;&gt;Seminário C &amp;amp; C++ para Sistemas Embarcados&lt;/a&gt;. Mais uma vez esta foi uma experiência extremamente gratificante,  principalmente pela satisfação que alguns colegas, amigos e o público em geral demonstraram durante o desenvolvimento do seminário e pós sua realização.&lt;/p&gt;
&lt;p&gt;O DQ, da &lt;a href=&quot;http://www.tamid.com.br/&quot;&gt;Tamid&lt;/a&gt;, realizou &lt;a href=&quot;http://dqsoft.blogspot.com/2009/11/seminario-c-para-sistemas-embarcados.html&quot;&gt;em seu blog&lt;/a&gt; algumas notas e abaixo segue alguns comentário que não representa nem 1% do que foi o seminário:&lt;/p&gt;
&lt;p&gt;- O evento iniciou com uma palestra sobre Interfaces de Periféricos com Microcontroladores em C do DQ, que mostrou-se um excelente conteúdo para um Hands On com o subtítulo de &amp;#8220;21 formas de piscar um led com linguagem C em vários microcontroladores&amp;#8221;! &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:-P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;- Na sequência foi a palestra do Luiz Barros, sobre Otimização de C++ para Sistemas Embarcados, que foi bem interessante e acabei em vários momentos dando meus pitacos, curiosamente mais uma vez confirmei que em aplicações com a plataforma SH4, C++ tem sido amplamente utilizado, durante o evento desenvolvedores de cinco empresas deram este feedback para mim.&lt;/p&gt;
&lt;p&gt;- Durante o almoço, entre bits e bytes, conversamos de flamewares (e lembrei da &lt;a href=&quot;http://www.ricbit.com/2009/11/lei-de-ricbit.html&quot; target=&quot;_blank&quot;&gt;lei do ricbit&lt;/a&gt;), assembly vs C++, surgiu a conversa de um projeto que me relataram muito inusitado de um sistema, onde&amp;#8230; bom, deixa eu voltar para os relatos do seminário! :^p&lt;/p&gt;
&lt;p&gt;- Após o almoço, o Alessandro Cunha, da &lt;a href=&quot;http://www.techtraining.eng.br/&quot; target=&quot;_blank&quot;&gt;TechTrainning&lt;/a&gt;, apresentou uma palestra que foi muito pontual tanto no assunto quanto no tempo consumido. Nos primeiros contatos com ele, fiz uma sugestão besta de tema e ele conseguiu extrair algo de bom da besteira que apresentei e formatou uma obra prima: Projetando Sistemas Embarcados com Baixo Consumo de Energia, com dicas preciosas que cativaram o público.&lt;/p&gt;
&lt;p&gt;E encerrando o conteúdo técnico do seminário,  o Luiz Barros desmistificou o &amp;#8220;Desenvolvimento de Device Driver para GNU/Linux&amp;#8221;, derepente surgiram algumas pessoas no evento e quando fui conferir descobri que elas vieram apenas para ver esta palestra, alguns até começaram a dizer que perderam o medo do device drivers development. Particularmente nunca tive medo, porém device driver &amp;amp; kernel development é uma arte negra&amp;#8230;&lt;/p&gt;
&lt;p&gt;Anteriormente ajudei a enumerar 17 formas de acender um led e derepente, não mais que derepente, fez-se a teatralização da piada:&lt;/p&gt;
&lt;p&gt;- &amp;#8220;quantos engenheiros são necessários para acender um led&amp;#8221;&lt;/p&gt;
&lt;p&gt;do qual eu participei desta teatralização como coadjuvante, no qual entrei mudo e sai calado e depois me disseram que a resposta seria:&lt;/p&gt;
&lt;p&gt;-  &amp;#8221;um de hardware, um de firmware e um de software&amp;#8221; (tsc)&amp;#8230;&lt;/p&gt;
&lt;p&gt;Mas o Alessandro Cunha foi além e pensou em escrever o livro 2001 formas de acender um led, mas nem só de led foi o seminário! Houve CAN, RS232, SPI, microcontroladores, C, C++ e felizmente tive a oportunidade rever alguns amigos e realizar alguns contatos preciosos. Particularmente fiquei feliz que uma sugestão que eu dei a Microgênios foi levada a sério e hoje eles também estão produzindo e comercializando a &lt;a href=&quot;http://www.microgenios.com.br/news/index.php?option=com_content&amp;task=view&amp;id=177&amp;Itemid=195&quot;&gt;plataforma Arduino&lt;/a&gt; no Brasil, assim como troquei figurinhas  sobre os bugs da &lt;a href=&quot;http://beagleboard.org/&quot;&gt;BeagleBoard &lt;/a&gt; com o Luis Barros, conheci um pouco mais sobre a plataforma &lt;a href=&quot;http://www.towergeeks.org/&quot;&gt;Tower&lt;/a&gt; com vários colegas, vi uma apresentação de uns alunos do Dado, numa EVDK &lt;a href=&quot;http://www.luminarymicro.com/&quot;&gt;Luminary&lt;/a&gt;,  de uns jogos desenvolvidos em &lt;a href=&quot;http://elua.berlios.de/&quot;&gt;eLua&lt;/a&gt; que poderiam seduzir muitos aficcionados em jogos; entre muitas outras conversas.&lt;/p&gt;
&lt;p&gt;Finalizando oficialmente evento, realizamos um sorte de brindes oferecidos por Texas Instruments, Freescale, Atmel/Kobama, Editora Erica, Tempo Real Eventos, Agit Informática e Microgênios, onde as fotos dos ganhadores podem ser vistas &lt;a title=&quot;Fotos &quot; href=&quot;http://www.temporealeventos.com.br/?area=1&amp;tipo=1&amp;id=2893&quot; target=&quot;_self&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais uma vez, fui um dos primeiros a chegar no local e um dos últimos a sair do happy hour, que aliás, como sempre, foi uma extensão do evento e o início da organização dos próximos eventos.&lt;/p&gt;
&lt;p&gt;Namastê!!!&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/166/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/166/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/166/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/166/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/166/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/166/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/166/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/166/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/166/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/166/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=166&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">As sombras do Ambiente de Programação C++</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/11/as-sombras-do-ambiente-de-programacao-c.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-5162515058807634604</id>
		<updated>2009-11-16T22:17:32+00:00</updated>
		<content type="html">Estou realmente escrevendo sobre este assunto! É claro que, até reunir material suficiente para um livro maneiro, vai demorar muito tempo. Até lá espero encontrar alguma publicação legal que aceite artigos.&lt;br /&gt;&lt;br /&gt;Minha motivação inicial para entender os mistérios do ambiente de programação C++ foi estudar a ABI do C++, que seria necessário implementar no sistema operacional C++.&lt;br /&gt;&lt;br /&gt;Existem outros aspectos interessantes desse ambiente, porém, que são pouco focalizados pelas obras educativas sobre a linguagem.&lt;br /&gt;&lt;br /&gt;Um deles é o relacionamento entre o mundo restrito da norma ISO C e o mundo maior do sistema. C fala a você sobre unidades de tradução e estabelece regras mínimas sobre como múltiplas unidades de tradução podem compor um programa válido. Ao redor da linguagem, porém, existe o problema de processar cada uma dessas unidades e produzir de fato um negócio único equivalente a este programa. Existirão então diversos blocos intermediários, os &quot;objetos compilados&quot;, e existirá um componente ligador. A norma C não descreve este ligador, apenas impõe seus requisitos.&lt;br /&gt;&lt;br /&gt;Outro é o modo como os mecanismo de linguagem e do sistema são usados na prática como mecanismos de abstração, e como os projetos de engenharia fazem uso desses mecanismos para lidar com problemas reais de configuração. O ambiente como um todo provê diversas maneiras de abstrair certos trechos de código; desde a seleção de arquivos a compilar, onde um arquivo pode conter a listagem para o sistema A enquanto outro contém a listagem para o sistema B; até a composição de bibliotecas dinâmicas no momento da carga na memória, onde o programa usa a versão A da biblioteca no sistema A, e a versão B da biblioteca no sistema B.&lt;br /&gt;&lt;br /&gt;Para lidar com toda essa parafernália sistêmica ao redor do C são imprescindíveis ferramentas que operam fora da linguagem, dirigindo todas as ferramentas de forma conveniente. O projeto de middleware de televisão digital da TQTVD tem, por exemplo, aproximadamente mil unidades de tradução individuais a processar. Certamente o programador não deve chamar as ferramentas uma vez para cada um desses arquivos, sob pena de tornar o dia de trabalho um desperdício de horas absurdo. Existem portanto ferramentas para apoiar essa tarefa que, apesar de não fazer parte da definição da linguagem ou do compilador, são absolutamente imprescindíveis para se trabalhar com ela.&lt;br /&gt;&lt;br /&gt;Tudo isso implica que a expertise no desenvolvimento de sistemas em C++ envolve diversas outras habilidades e técnicas individuais, fora aquelas envolvendo a expressão de programas em C++. Essas outras habilidades e técnicas se tornam tão mais importantes quanto o projeto pressione o programador para fora da abstração de um sistema para o mundo concreto das diversas máquinas.&lt;br /&gt;&lt;br /&gt;Sob outro ângulo, posso comparar as listas de componentes teórica e prática que compõe o pipeline de transformação de código-fonte. Teoricamente, o pipeline C é: pré-processador, compilador, ligador ou arquivador. Na prática do projeto onde estou envolvido é: configurador de build, ferramenta de build, compilador.&lt;br /&gt;&lt;br /&gt;Uma lição que estou tirando de tudo isso é que os melhores pensamentos sobre a linguagem de programação ideal nunca resultariam em um excelente sistema construído se essa linguagem não for implementada em ferramentas adequadas, que suportem um ciclo de desenvolvimento extremamente conveniente. O esquema de compilação separada do C oferece bons mecanismos de abstração, sem dúvida, mas torna o tempo de compilação uma infinitude de &quot;começa e termina&quot; processos.&lt;br /&gt;&lt;br /&gt;Em contra-partida, opiniões sobre características de linguagem de programação do tipo &quot;viagem na maionese&quot; ou &quot;impossível&quot; parecem refletir o fato de que, até então, ninguém soube produzir uma ferramenta que a implementasse. O mecanismo de &quot;export&quot; do C++ por exemplo foi considerado um fracasso; agora que as técnicas de LTO e serialização de ASTs de programas estão se tornando mais difundidas, talvez com mais cinco ou dez anos &quot;export&quot; seja trivial.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-5162515058807634604?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Go Lang</title>
		<link href="http://techberto.wordpress.com/2009/11/12/go-c-python-com-tempero-de-erlang-oberon-limpo-para-concorrer-com-c-by-google/"/>
		<id>http://techberto.wordpress.com/?p=153</id>
		<updated>2009-11-12T22:45:11+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;img class=&quot;alignright&quot; title=&quot;Go Lang&quot; src=&quot;http://static.arstechnica.com/go_google_go_ars.png&quot; alt=&quot;Go Mascote &quot; width=&quot;300&quot; height=&quot;169&quot; /&gt;Uma linguagem com as facilidades sintáticas de Python, porém estática e que gere executáveis com opcodes com pouca dependência e desempenho similar aos de C e que desfrute dos recursos computacionais de concorrência que os atuais processadores e computadores oferecem com facilidade é algo que muitos, a muito tempo desejavam.  Conheço engenheiros que só tem C e Assembly como opção e que sempre costuma afirmar que &amp;#8220;odeiam C&amp;#8221;, pelos clássicos problemas da linguagem e compiladores.&lt;/p&gt;
&lt;p&gt;Para minha surpresa li este artigo ontem no Slashdot:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a title=&quot;Go Lang by Slashdot&quot; href=&quot;http://developers.slashdot.org/story/09/11/11/0210212/Go-Googles-New-Open-Source-Programming-Language&quot; target=&quot;_blank&quot;&gt;Go, Google&amp;#8217;s New Open Source Programming Language&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span id=&quot;more-153&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;E como ele fazia referência a um artigo na ARS Technica, fui conferir a notícia:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a title=&quot;Go Lang by ARS&quot; href=&quot;http://arstechnica.com/open-source/news/2009/11/go-new-open-source-programming-language-from-google.ars&quot; target=&quot;_blank&quot;&gt;Go: new open source programming language from Google&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Go, como toda linguagem,  nasceu de necessidades, frustrações e certamente surpreenderá,  logo criará uma legião de fãs assim como frustrará muitos outros, mas sendo Open Source e com uma licença &lt;a href=&quot;http://golang.org/LICENSE&quot; target=&quot;_blank&quot;&gt;BSD-Style&lt;/a&gt; ela tem potencial de agregar muitos  desenvolvedores ao seu core-development. Particularmente eu já instalei, comecei a brincar já me frustrei mas amei as goroutines.&lt;/p&gt;
&lt;p&gt;O dilema que está em sua motivação é muito parecido com o que alguns já passaram em certos desenvolvimentos, escolher entre uma linguagem com compilação eficiente, execução performática e facilidade de programação; para oferecer tudo isto nativamente numa única linguagem de programação os autores resolveram partir para seu desenvolvimento.&lt;/p&gt;
&lt;p&gt;Para quem dizia que eu era meio maluco por gostar de Haskell, Erlang, C++ e Python e uma linguagem ideal seria a que fosse uma composição de características de todas elas, tive uma fantástica surpresa, além de uma (quase) decepção!&lt;/p&gt;
&lt;p&gt;A surpresa fantástica, veio pelo fato que o Google busca com este empreendimento:&lt;/p&gt;
&lt;p&gt;- &amp;#8220;Uma nova linguagem de programação que busca a performance com concorrência embutida, que é quase comparável a C, mas com a sintaxe mais expressiva e compilação rápida&amp;#8221; e além de tudo ela tem pedigree! Pois entre seus projetistas estão Robert Griesemer, &lt;a href=&quot;http://www.usenix.org/publications/login/1997-12/interview.html&quot; target=&quot;_blank&quot;&gt;Russ Cox&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Limbo_(programming_language)&quot; target=&quot;_blank&quot;&gt;Rob Pike&lt;/a&gt; (um dos pais da linguagem Limbo e do Plan9) e &lt;a title=&quot;O K de K &amp;R - Um dos pais da linguagem C&quot; href=&quot;http://en.wikipedia.org/wiki/Ken_Thompson&quot; target=&quot;_blank&quot;&gt;Ken Thompson&lt;/a&gt;;  K, apesar de dispensar apresentações  apenas para recordar ele  é um dos pais da linguagem B,  do UNIX e também trabalhou no projeto do Plan9.&lt;/p&gt;
&lt;div&gt;Além da inspiração sintática básica de C ela  &amp;#8221;tenta&amp;#8221; combinar as facilidades das linguagens dinâmicas (Python e JavaScript), com contribuições de Pascal/Modula/Oberon (quanto a declarações e packages), além de algumas idéias de Erlang, CSP, Newsqueak e Limbo (na concorrência). Porém, é uma nova linguagem!&lt;/div&gt;
&lt;p&gt;Da ARS Technica eu fui direto para o site do projeto: &lt;a title=&quot;GO Lang&quot; href=&quot;http://golang.org/&quot; target=&quot;_blank&quot;&gt;golang.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;E encontrei mais algumas definições curiosas:&lt;/p&gt;
&lt;p&gt;- &amp;#8220;Go&amp;#8221; buscou inspirações em todas estas linguagens para criar uma de propósito geral, projetada com &amp;#8220;systems programming&amp;#8221; em mente, &amp;#8220;fortemente tipada&amp;#8221; (aqui eles não beberam na fonte de Python) e com uso de garbage-collect (tsc) com suporte nativo a programação concorrente  e com gramática compacta e regular, isto tudo soa muito interessante.&lt;/p&gt;
&lt;p&gt;Porém, no site do projeto um dos links me chamou muito a atenção:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://golang.org/doc/go_for_cpp_programmers.html&quot;&gt;Go for C++ Programmers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como o foco dela é &amp;#8220;system programming&amp;#8221; e por  suas características performáticas, de cara já forçar um replace de C++ era esperado. Será este um grande golpe em C++ ou um golpe mortal na linguagem D? Por outro lado lembro-me da afirmação do &lt;a href=&quot;http://herbsutter.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Herb Sutter&lt;/a&gt; que os programadores C++ são os mais abertos a aprenderem novas linguagens, esta afirmação nem sempre me parece verdadeira, mas para os casos onde ela se aplica (que são muitos) o foco do Google parece estar correto.&lt;/p&gt;
&lt;p&gt;Agora, veja esta simples comparação sintática:&lt;/p&gt;
&lt;pre&gt;&lt;strong&gt;Go                           C++&lt;/strong&gt;
var v1 int;               // int v1;
var v2 string;            // const std::string v2;  (approximately)
var v3 [10]int;           // int v3[10];
var v4 []int;             // int* v4;  (approximately)
var v5 struct { f int };  // struct { int f; } v5;
var v6 *int;              // int* v6;  (but no pointer arithmetic)
var v7 map[string]int;    // unordered_map&amp;lt;string, int&amp;gt;* v7;  (approximately)
var v8 func(a int) int;   // int (*v8)(int a);&lt;/pre&gt;
&lt;p&gt;De cara ela me irrita  pois &lt;em&gt;&lt;strong&gt;var &lt;span&gt;me lembra Pascal, mas a declaração de struct me pareceu mais elegante e prefiro declarações explícitas de funções, classes e métodos, ponto para Go.&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;span&gt;Outro detalhe que me chamou a atenção é que por enquanto há compiladores disponíveis para Linux e Mac OS X que geram opcodes para AMD64 (x86 e 64 bits), x86 de 32 bits e está no forno um compilador ARM! Será que ele permitirá compilação bare-metal para produção de firmware? Tenho suspeita que sim.&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vejam algumas diferenças conceituais entre C++ e Go:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go não tem classes com  construtores ou destrutores. Mas sim  métodos de classe, uma hierarquia de herança de classes e funções virtuais, ela  fornece interfaces que são utilizadas como os templates de C++; portanto ela oferece programação genérica.&lt;/li&gt;
&lt;li&gt;Go  usa garbage collection.  Não é possível  liberar memória explícitamente.  Este gerenciamento de memória &amp;#8220;pretende&amp;#8221; ser incremental e  altamente eficiente em processadores modernos.&lt;/li&gt;
&lt;li&gt;Go tem ponteiros, mas não a aritmética de ponteiro. Não é possível empregar um ponteiro para percorrer os bytes de uma string.&lt;/li&gt;
&lt;li&gt;Arrays são valores de primeira classe. Quando um array é usado como um parâmetro de função, a função recebe uma cópia da matriz, não um ponteiro para ele. No entanto, na prática, muitas funções usam &amp;#8220;slices&amp;#8221; de parâmetros; &amp;#8220;slices&amp;#8221; suportam os ponteiros para arrays subjacentes. &amp;#8220;Slice&amp;#8221; é um recurso importante da linguagem.&lt;/li&gt;
&lt;li&gt;Strings são fornecidas pela linguagem. Mas elas não podem ser alteradas depois de sua criação.&lt;/li&gt;
&lt;li&gt;Tabelas hash são fornecidas pela linguagem. Eles são chamados de maps.  Velhos conhecidos de outra linguagens.&lt;/li&gt;
&lt;li&gt;Threads são separadas da execução, e os canais (channels) de comunicação entre eles, são fornecidos pela linguagem.&lt;/li&gt;
&lt;li&gt;Certos tipos (maps e channels)  são passados por referência, não pelo valor. Ou seja, passar um map para uma função não é copiar o map, e  as alterações da função do map são vistas pelo invocador.  Como referências de tipos de C++, porém mais similar como é em Python.&lt;/li&gt;
&lt;li&gt;Go não usa &amp;#8220;header files&amp;#8221;. Em vez disso, cada arquivo fonte é parte de um &lt;em&gt;package&lt;/em&gt; definido, similar a Python, Oberon e Pascal. Quando um &lt;em&gt;package &lt;/em&gt;define um objeto (tipo, constante, variável, função) com um nome começando com uma letra maiúscula, esse objeto é visível a qualquer outro arquivo que importe esse &lt;em&gt;package&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Ela não oferece suporte a conversão implícita de tipo. Operações que misture tipos diferentes requerem casts (que em Go são chamadas de conversions).&lt;/li&gt;
&lt;li&gt;Go não suporta sobrecarga de funções e não suporta os operadores definidos pelo usuário.&lt;/li&gt;
&lt;li&gt;Go não suporta os qualificadores &lt;strong&gt;const&lt;/strong&gt; ou &lt;strong&gt;volatile&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ela  usa &lt;strong&gt;nil&lt;/strong&gt; para ponteiros inválidos e  C++ usa NULL ou simplesmente 0.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sobre as diferenças sintáticas recomendo realmente a leitura da página &lt;a href=&quot;http://golang.org/doc/go_for_cpp_programmers.html&quot;&gt;Go for C++ Programmers&lt;/a&gt;, mas antes a leitura dos documentos &lt;a href=&quot;http://golang.org/doc/go_tutorial.html&quot;&gt;Tutorial&lt;/a&gt;, &lt;a href=&quot;http://golang.org/doc/effective_go.html&quot;&gt;Effective Go&lt;/a&gt;,  &lt;a href=&quot;http://golang.org/doc/go_lang_faq.html&quot;&gt;Language Design FAQ&lt;/a&gt;, &lt;a href=&quot;http://golang.org/doc/go_spec.html&quot;&gt;Language Specification&lt;/a&gt; entre outros documentos para o  entendimento de alguns conceitos como as fantásticas goroutines. Porém se o tempo permitir, assista a apresentação do Rob Pike  no Tech Talk, chamada &lt;a title=&quot;YouTube: What is Go?&quot; href=&quot;http://www.youtube.com/watch?v=rKnDgT73v8s&quot; target=&quot;_blank&quot;&gt;What is Go?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Confesso que algumas características não me agradaram muito, já outras me pareceram muito interessantes (leia-se channels e goroutines), porém ainda é cedo para apresentar uma avaliação. Entrei na &lt;a href=&quot;http://groups.google.com/group/golang-nuts&quot;&gt;Go Nuts!&lt;/a&gt; que é a lista oficial da  linguagem e com 2 dias de existência ela já tinha mais de 800 mensagens e 1.200 membros. Será que esta linguagem irá revolucionar? Um ponto positivo é que ela é Open Source porém patrocinada pelo Google, well&amp;#8230; tenho minhas suspeitas que sim e em pouco tempo ela irá causar uma reviravolta.&lt;/p&gt;
&lt;p&gt;Maiores detalhes acessem o site oficial do projeto: &lt;a href=&quot;http://www.golang.org/&quot;&gt;golang.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PS: Já estou vendo os anúncios de emprego solicitando programadores com 2 a 5 aos de experiência em G0, antes mesmo do lançamento da linguagem completar 1 ano! &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/153/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/153/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/153/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/153/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/153/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/153/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/153/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/153/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/153/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/153/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=153&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">bcsanches</title>
		<link href="http://bcsanches.wordpress.com/2009/11/06/pontov-e-o-blog/"/>
		<id>http://bcsanches.wordpress.com/2009/11/06/pontov-e-o-blog/</id>
		<updated>2009-11-06T11:48:46+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Hoje foi inaugurado o PontoV, que é o mais novo portal brasileiro sobre desenvolvimento de jogos. O portal surgiu de uma parceria minha com o Vinícius do PontoV (&lt;a href=&quot;http://vinigodoy.wordpress.com&quot;&gt;http://vinigodoy.wordpress.com&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;O nosso objetivo no portal é compartilhar nossas experiências em gamedev e reunir os desenvolvedores brasileiros.&lt;/p&gt;
&lt;p&gt;O nosso foco principal é trazer conteúdo de qualidade sobre GameDesign, Java e C++, além de artigos de profissionais da área.&lt;/p&gt;
&lt;p&gt;A principio não sei ao certo qual será o futuro do blog, pois tópicos sobre programação vão acabar sendo destinados ao PontoV, então estou aberto a sugestões &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;De qualquer forma nos vemos no PontoV: &lt;a href=&quot;http://www.pontov.com.br&quot;&gt;http://www.pontov.com.br&lt;/a&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/bcsanches.wordpress.com/276/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bcsanches.wordpress.com/276/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/bcsanches.wordpress.com/276/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/bcsanches.wordpress.com/276/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/bcsanches.wordpress.com/276/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/bcsanches.wordpress.com/276/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/bcsanches.wordpress.com/276/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/bcsanches.wordpress.com/276/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/bcsanches.wordpress.com/276/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/bcsanches.wordpress.com/276/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=bcsanches.wordpress.com&amp;blog=3563426&amp;post=276&amp;subd=bcsanches&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Bruno Sanches</name>
			<uri>http://bcsanches.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Bcsanches's Weblog</title>
			<subtitle type="html">C++ e Programação de Jogos</subtitle>
			<link rel="self" href="http://bcsanches.wordpress.com/feed/"/>
			<id>http://bcsanches.wordpress.com/feed/</id>
			<updated>2010-01-14T05:00:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Java vs. C#, uma perspectiva estranha</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/11/java-vs-c-uma-perspectiva-estranha.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-8150608308716521903</id>
		<updated>2009-11-03T19:55:44+00:00</updated>
		<content type="html">Você pode achar o que quiser na disputa entre Java e C#, mas onde na documentação da Microsoft você vai encontrar uma afirmação tão direta, sincera e esclarecedora?&lt;br /&gt;&lt;br /&gt;&quot;Prior to Java 2 Standard Edition, JDK 1.4, the AWT focus subsystem was inadequate.&quot;&lt;br /&gt;&lt;br /&gt;http://java.sun.com/javase/6/docs/api/java/awt/doc-files/FocusSpec.html&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-8150608308716521903?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">bug bizarro no RVCT 2.2</title>
		<link href="http://blog.pedro.lamarao.nom.br/2009/10/bug-bizarro-no-rvct-22.html"/>
		<id>tag:blogger.com,1999:blog-3006142001944566780.post-4943739368251659661</id>
		<updated>2009-10-29T16:13:27+00:00</updated>
		<content type="html">Descobrimos um bug bizarro no RVCT 2.2 onde a compilação de uma chamada a um operador de conversão do std::auto_ptr gera as seguintes instruções:&lt;br /&gt;&lt;br /&gt;1. push into stack from register&lt;br /&gt;2. unconditionally jump to (1)&lt;br /&gt;&lt;br /&gt;Alguém já viu isso?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3006142001944566780-4943739368251659661?l=blog.pedro.lamarao.nom.br&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>P.</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.pedro.lamarao.nom.br/search/label/software</uri>
		</author>
		<source>
			<title type="html">Tumulto</title>
			<subtitle type="html">...do cansaço dessa vida, e do peso de ter que ser alguém...</subtitle>
			<link rel="self" href="http://blog.pedro.lamarao.nom.br/feeds/posts/default/-/software"/>
			<id>tag:blogger.com,1999:blog-3006142001944566780</id>
			<updated>2010-04-23T14:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Linus Torvalds apoia o Lançamento do Windows 7</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/yZpBP0qE8RQ/"/>
		<id>http://blog.jorgepereira.com.br/?p=897</id>
		<updated>2009-10-23T15:06:42+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-898&quot; title=&quot;Linus Torvalds apoia o Lançamento do Windows 7&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/10/linus.jpg&quot; alt=&quot;Linus Torvalds apoia o Lançamento do Windows 7&quot; width=&quot;636&quot; height=&quot;423&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Em um conferência de Linux no Japão, a Microsoft coloca (de propósito ou não) um ponto de venda do Windows7 em frente ao local. Nosso amigo Linus Torvalds tira uma onda e vai lá &amp;#8220;prestigiar&amp;#8221; o lançamento.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/cschlaeger/JapanLinuxSymposium#5395358413061926434&quot; target=&quot;_blank&quot;&gt;Fonte da foto.&lt;/a&gt;&lt;/p&gt;

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

	<entry xml:lang="pt-br">
		<title type="html">techberto</title>
		<link href="http://techberto.wordpress.com/2009/10/18/ii-seminario-c-c-para-sistemas-embarcados/"/>
		<id>http://techberto.wordpress.com/?p=148</id>
		<updated>2009-10-18T19:29:24+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;É com grande prazer que depois de alguns meses sem postar nada por aqui, venho quebrar o silêncio com uma notícia super interessante.&lt;/p&gt;
&lt;p&gt;Depois do sucesso do &lt;a title=&quot;I Seminário C &amp; C++ para Sistemas Embarcados&quot; href=&quot;http://techberto.wordpress.com/2008/11/18/notas-sobre-o-seminario-c-c-para-sistemas-embarcados-2/&quot; target=&quot;_blank&quot;&gt;evento &lt;/a&gt;do ano passado, este ano o Portal Embarcados, a Tempo Real Eventos e o grupo C &amp;amp; C++ Brasil realizará a segunda edição do Seminário C &amp;amp; C++ para Sistemas Embarcados.&lt;/p&gt;
&lt;p&gt;Com palestrantes  de alto-nível e conteúdo super-interessante,  como o do ano passado, ele está imperdível!&lt;/p&gt;
&lt;p&gt;Ele  acontecerá no dia 14 de novembro de 2009, em São Paulo, no Century Hotel, maiores detalhes vejam &lt;a title=&quot;II Seminário C &amp; C++ para Sistemas Embarcados&quot; href=&quot;http://tr.im/semccppemb&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nos vemos lá.&lt;/p&gt;
&lt;p&gt;Nasmastê!&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/148/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/148/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=148&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alberto Fabiano</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ciência, tecnologia, programação, música e insights geeks do meu hermético box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/"/>
			<id>http://techberto.wordpress.com/feed/</id>
			<updated>2010-03-08T03:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">0xc0de</title>
		<link href="http://0xc0de.wordpress.com/2009/10/17/opcoes-para-leitura-de-um-arquivo-inteiro/"/>
		<id>http://0xc0de.wordpress.com/?p=323</id>
		<updated>2009-10-17T13:51:25+00:00</updated>
		<content type="html">&lt;p&gt;Então, quais são as opções para lermos um arquivo inteiro para memória (armazenando-o em uma &lt;code&gt;std::string&lt;/code&gt;, por exemplo) em C++? O programa abaixo ilustra algumas alternativas simples.&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;iterator&amp;gt;
#include &amp;lt;string&amp;gt;

void stringstream_read_file();
void istream_iterator_read_file();
void istreambuf_iterator_read_file();

int main()
{
  //Lê copiando o buffer file stream para o string stream.
  stringstream_read_file();

  //Lê iterando pelo stream e fazendo extração com operator&amp;gt;&amp;gt;.
  istream_iterator_read_file();

  //Lê iterando diretamente pelo buffer e copiando caracteres.
  istreambuf_iterator_read_file();

  return 0;
}

void stringstream_read_file()
{
  std::ifstream fs(&amp;quot;file.txt&amp;quot;);
  if (!fs.good())
    std::cout &amp;lt;&amp;lt; &amp;quot;Error.&amp;quot; &amp;lt;&amp;lt; std::endl;
  else
  {
    std::ostringstream ss;
    ss &amp;lt;&amp;lt; fs.rdbuf();
    std::cout &amp;lt;&amp;lt; ss.str() &amp;lt;&amp;lt; std::endl;
  }
}

void istream_iterator_read_file()
{
  std::ifstream fs(&amp;quot;file.txt&amp;quot;);
  if (!fs.good())
    std::cout &amp;lt;&amp;lt; &amp;quot;Error.&amp;quot; &amp;lt;&amp;lt; std::endl;
  else
  {
    fs.unsetf(std::ios_base::skipws); //Para manter os espaços.
    std::string s((std::istream_iterator&amp;lt;char&amp;gt;(fs)), std::istream_iterator&amp;lt;char&amp;gt;());
    std::cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; std::endl;
  }
}

void istreambuf_iterator_read_file()
{
  std::ifstream fs(&amp;quot;file.txt&amp;quot;);
  if (!fs.good())
    std::cout &amp;lt;&amp;lt; &amp;quot;Error.&amp;quot; &amp;lt;&amp;lt; std::endl;
  else
  {
    std::string s((std::istreambuf_iterator&amp;lt;char&amp;gt;(fs)), std::istreambuf_iterator&amp;lt;char&amp;gt;());
    std::cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; std::endl;
  }
}
&lt;/pre&gt;
&lt;p&gt;Outras idéias? &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/323/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/323/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/323/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/323/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/323/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/323/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/323/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/323/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/323/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/323/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=323&amp;subd=0xc0de&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Leandro Melo</name>
			<uri>http://0xc0de.wordpress.com</uri>
		</author>
		<source>
			<title type="html">0xc0de</title>
			<subtitle type="html">Computadores, Programação e TI. Divagações...</subtitle>
			<link rel="self" href="http://0xc0de.wordpress.com/feed/"/>
			<id>http://0xc0de.wordpress.com/feed/</id>
			<updated>2010-04-05T19:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Jawbreaker &quot;old school&quot; code (aka Bubble Breaker)</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!246.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!246</id>
		<updated>2009-10-10T21:31:28+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I was organizing and archiving the files from my machines, and I found an old sample written as sample to my presentation at Microsoft TechEd Brazil 2005. It was a console (not video game console) version of a popular Pocket PC game, Jawbreaker. Today I'd recompiled the old C++ code on my Vista and OS X machines, let's check the results:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Running on Windows Vista: &lt;/div&gt;
&lt;div&gt; &lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1mcp5cndhXvj6cze_fYEK3tSXIcLyQoJl86P_LTMdzA5HfI-IZwdIUyBRLAzs8nSqLK0j70Mb_CF55j5lhwrfDO8NUUoZaf6PKZ2j2X0tOhCEv0E6ZzKVvMVVEI7G6jqpz73z7tAAd3kp4Acq2HMRmRQ/Jawbreaker1.png&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1mcp5cndhxvj6cze_fyek3tsxiclyqojl86p_ltmdza5hfi-izwdiuybrlazs8nsqlk0j70mb_cf55j5lhwrfdo8nuuozaf6pkz2j2x0tohcev0e6zzkvvmvvei7g6jqpz73z7taad3kp4acq2hmrmrq/jawbreaker1.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1mcp5cndhXvj6cze_fYEK3tSXIcLyQoJl86P_LTMdzA5HfI-IZwdIUyBRLAzs8nSqLK0j70Mb_CF55j5lhwrfDO8NUUoZaf6PKZ2j2X0tOhCEv0E6ZzKVvMVVEI7G6jqpz73z7tAAd3kp4Acq2HMRmRQ/Jawbreaker1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1mOV7ZWt5so15Q_8aZfaXYDpLgXQI7d-IOTruqkFeEIJN6W1EodwyHw_ECRMKFljC2qbZElyrifozIiZ64bmL4YgcIZq3ugzyjsObk8ownfPyZGa_mepdhEgFcRwAwNFWpxdZlTjosi_EAs3SlPyQzRA/Jawbreaker2.png&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1mov7zwt5so15q_8azfaxydplgxqi7d-iotruqkfeeijn6w1eodwyhw_ecrmkfljc2qbzelyrifoziiz64bml4ygcizq3ugzyjsobk8ownfpyzga_mepdhegfcrwawnfwpxdzltjosi_eas3slpyqzra/jawbreaker2.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1mOV7ZWt5so15Q_8aZfaXYDpLgXQI7d-IOTruqkFeEIJN6W1EodwyHw_ECRMKFljC2qbZElyrifozIiZ64bmL4YgcIZq3ugzyjsObk8ownfPyZGa_mepdhEgFcRwAwNFWpxdZlTjosi_EAs3SlPyQzRA/Jawbreaker2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1m778KcQUwiSaBJceYKYQe-oNodzmp5KTKOekfzHWQx6ftnqYl7folgFdnoWgA_iFFyEcxD_Y_K_X4H0G4pOWNeGeigHuqbtXfGHVmniIf6f5v_it_JZpG9LOmKm3awFUZe8RXli9_AiDEHPIewU7kLQ/Jawbreaker3.png&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1m778kcquwisabjceykyqe-onodzmp5ktkoekfzhwqx6ftnqyl7folgfdnowga_iffyecxd_y_k_x4h0g4pownegeighuqbtxfghvmniif6f5v_it_jzpg9lomkm3awfuze8rxli9_aidehpiewu7klq/jawbreaker3.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1m778KcQUwiSaBJceYKYQe-oNodzmp5KTKOekfzHWQx6ftnqYl7folgFdnoWgA_iFFyEcxD_Y_K_X4H0G4pOWNeGeigHuqbtXfGHVmniIf6f5v_it_JZpG9LOmKm3awFUZe8RXli9_AiDEHPIewU7kLQ/Jawbreaker3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Running on Mac OS X: &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1mm6ukG0P5M927J7vfwx9JA4SEhlD7L-cTpGutrBA3Y3Ib6T38r0N55ycxnMbFzttvtfFYY5LLKPgD9SkUdIub81DpUZJHcHl89vvcHrkPhbBFSWQ3gOxizvgFtxMvqPcmqfXMuMTwHpvqgoia6tFs0Q/JawbreakerOnMac1.png&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1mm6ukg0p5m927j7vfwx9ja4sehld7l-ctpgutrba3y3ib6t38r0n55ycxnmbfzttvtffyy5llkpgd9skudiub81dpuzjhchl89vvchrkphbbfswq3goxizvgftxmvqpcmqfxmumtwhpvqgoia6tfs0q/jawbreakeronmac1.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1mm6ukG0P5M927J7vfwx9JA4SEhlD7L-cTpGutrBA3Y3Ib6T38r0N55ycxnMbFzttvtfFYY5LLKPgD9SkUdIub81DpUZJHcHl89vvcHrkPhbBFSWQ3gOxizvgFtxMvqPcmqfXMuMTwHpvqgoia6tFs0Q/JawbreakerOnMac1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;  &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1mWah4SQWuq5X0atQDdm4W91nxi54HKNsogdfTFE0gs4_WZcUXdlPgwQUAThMNXGJ5dstipgUrPh6hWjT1gG0dZMErxQP1BGJYjEgR_GR0vA6L6wO4zug55v6VJ7y4ObXZ6Dgr1Fu158hHWnDkFThhqA/JawbreakerOnMac2.png&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1mwah4sqwuq5x0atqddm4w91nxi54hknsogdftfe0gs4_wzcuxdlpgwquathmnxgj5dstipgurph6hwjt1gg0dzmerxqp1bgjyjegr_gr0va6l6wo4zug55v6vj7y4obxz6dgr1fu158hhwndkfthhqa/jawbreakeronmac2.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1mWah4SQWuq5X0atQDdm4W91nxi54HKNsogdfTFE0gs4_WZcUXdlPgwQUAThMNXGJ5dstipgUrPh6hWjT1gG0dZMErxQP1BGJYjEgR_GR0vA6L6wO4zug55v6VJ7y4ObXZ6Dgr1Fu158hHWnDkFThhqA/JawbreakerOnMac2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Jawbreaker ^52005^6/Jawbreaker^_2005.zip&quot; target=&quot;_blank&quot;&gt;This Jawbreaker code&lt;/a&gt; has a nice recursive code logic, I guess that has a lot of &amp;quot;breakers&amp;quot; source code in the Internet, so I encourage you to compare with &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/Jawbreaker ^52005^6/Jawbreaker^_2005.zip&quot; target=&quot;_blank&quot;&gt;my version&lt;/a&gt; ;-) &lt;/div&gt;
&lt;div&gt; (Normally, when we look back to old code we blame ourselves - specially a 4-5 years old code, obviously I think I can do this code better today. But in average I'm very proud of this old version :-))&lt;/div&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;
&lt;div&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;#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;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;iomanip&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;vector&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;memory&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;utility&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;map&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;lt;cstdlib&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;#include&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot; size=&quot;1&quot;&gt;&amp;lt;algorithm&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;using&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; std;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;//http://support.microsoft.com/default.aspx?scid=kb;en-us;231847&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;float&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; rnd() &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//Visual Basic as-is&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;unsigned&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;long&lt;/font&gt;&lt;/font&gt; rndVal = 0x50000L;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  float&lt;/font&gt;&lt;/font&gt; rndFloat;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;rndVal = (rndVal * 0x43fd43fdL + 0xc39ec3L) &amp;amp; 0xffffffL;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;rndFloat = (&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;float&lt;/font&gt;&lt;/font&gt;)rndVal / (&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;float&lt;/font&gt;&lt;/font&gt;)16777216.0;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; rndFloat;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; absolute( &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;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; value &amp;lt; 1 ? -value : value;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; CBoard;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; CCell&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;pair&amp;lt; &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; Coordinate_; &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//first == row, second == column&lt;br /&gt;&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; Value_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;div&gt;&lt;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; Initialize( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; value ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;{ &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;Coordinate_.first = row; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;Coordinate_.second = col; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;Value_ = value;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&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;  friend&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt; CBoard;&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;  void&lt;/font&gt;&lt;/font&gt; set_Value( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; value ){ Value_ = value; }&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;CCell( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; value ) : Coordinate_( row, col ), Value_( value ){}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;CCell( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; CCell&amp;amp; ref ) : Coordinate_( ref.Coordinate_ ) , Value_( ref.Value_ ){}&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; get_Row() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Coordinate_.first; }&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; get_Column() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Coordinate_.second; }&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; get_Value() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; { &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Value_; }&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; Finder;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; CBoard&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;pair&amp;lt; &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; Boundaries_; &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//first == rows, second == cols &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;auto_ptr&amp;lt; vector&amp;lt;CCell&amp;gt; &amp;gt; Cells_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;pair&amp;lt; &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; LeftTopMost_; &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//first == top most, second == left most &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;auto_ptr&amp;lt; vector&amp;lt;CCell&amp;gt; &amp;gt; SavedCells_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;pair&amp;lt; &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; SavedLeftTopMost_; &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//first == top most, second == left most &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  friend&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt; Finder;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_Value( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( row &amp;gt; get_Rows() || col &amp;gt; get_Columns() )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt; NULL;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      return&lt;/font&gt;&lt;/font&gt; (*Cells_)[ translate_Coordinate( row, col ) ].get_Value();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_Left(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; LeftTopMost_.second; }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_Top(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; LeftTopMost_.first; }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_Columns(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Boundaries_.second; }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_Rows(){ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Boundaries_.first; }&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; display()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;cout &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\n&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;cout &amp;lt;&amp;lt; setw(4) &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;;&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; col = 1; col &amp;lt;= get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;cout &amp;lt;&amp;lt; setw(3) &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; col &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;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;cout &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row = 1; row &amp;lt;= get_Rows(); ++ row )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;cout &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; row &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; (row &amp;lt; 10 ? &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/font&gt; : &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;/font&gt;);&lt;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; col = 1; col &amp;lt;= get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;          int&lt;/font&gt;&lt;/font&gt; v = (*Cells_)[ translate_Coordinate( row, col ) ].get_Value();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;          if&lt;/font&gt;&lt;/font&gt;( v &amp;gt; 0 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;cout &amp;lt;&amp;lt; setw(4) &amp;lt;&amp;lt; v &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;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;          else&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;cout &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;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;cout &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\n&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;cout &amp;lt;&amp;lt; &lt;font color=&quot;#a31515&quot;&gt;&lt;font color=&quot;#a31515&quot;&gt;&amp;quot;\n&amp;quot;&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; moveColumnsToRight( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; r = get_Top(); r &amp;lt;= get_Rows(); ++r )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;set_Value( r, col, col &amp;gt; 1 ? get_Value( r, col - 1 ) : NULL ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( col &amp;gt; 1 ) moveColumnsToRight( col - 1 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; remove_Item( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( row == 1 ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;set_Value( 1, col, NULL );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( get_Value( row - 1, col ) != NULL )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;set_Value( row, col, get_Value( row - 1, col ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;remove_Item( row - 1, col );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      else&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;set_Value( row, col, NULL );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        if&lt;/font&gt;&lt;/font&gt;( row == get_Rows() ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;moveColumnsToRight( col ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; save()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row = get_Top(); row &amp;lt;= get_Rows(); ++row )&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; col = get_Left(); col &amp;lt;= get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;CCell&amp;amp; cell_ref = (*Cells_)[ translate_Coordinate( row, col ) ];&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;(*SavedCells_)[ translate_Coordinate( row, col ) ].Initialize( cell_ref.get_Row(), cell_ref.get_Column(), absolute( cell_ref.get_Value() ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;SavedLeftTopMost_.first = LeftTopMost_.first;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;SavedLeftTopMost_.second = LeftTopMost_.second;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; recover()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; top = SavedLeftTopMost_.first,&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;left = SavedLeftTopMost_.second;&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; row = top; row &amp;lt;= get_Rows(); ++row )&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; col = left; col &amp;lt;= get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;CCell&amp;amp; savedcell_ref = (*SavedCells_)[ translate_Coordinate( row, col ) ];&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;(*Cells_)[ translate_Coordinate( row, col ) ].Initialize( savedcell_ref.get_Row(), savedcell_ref.get_Column(), savedcell_ref.get_Value() );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;LeftTopMost_.first = top;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;LeftTopMost_.second = left;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; set_Value( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;(*Cells_)[ translate_Coordinate( row, col ) ].set_Value( value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; check_ChangeLeftTopMost()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; r = get_Top(); r &amp;lt;= get_Rows(); ++r )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        bool&lt;/font&gt;&lt;/font&gt; is_row_filled = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;false&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; c = get_Left(); c &amp;lt;= get_Columns(); ++c )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;          if&lt;/font&gt;&lt;/font&gt;( get_Value( r, c ) != NULL )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;is_row_filled = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;true&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;            break&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&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;        if&lt;/font&gt;&lt;/font&gt;( !is_row_filled ) set_Top( get_Top() + 1 ); &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;else &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;break&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&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;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; c = get_Left(); c &amp;lt;= get_Columns(); ++c )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        bool&lt;/font&gt;&lt;/font&gt; is_col_filled = get_Value( get_Rows(), c ) != NULL;&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_col_filled ) set_Left( get_Left() + 1 ); &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;else &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;break&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;} &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;} &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; set_Left( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; left ){ LeftTopMost_.second = left; }&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; set_Top( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; top ){ LeftTopMost_.first = top; }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; get_RandomValue( &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;min&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; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;max&lt;/font&gt;&lt;/font&gt; )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      return&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;static_cast&lt;/font&gt;&lt;/font&gt;&amp;lt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;( (&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;max&lt;/font&gt;&lt;/font&gt; - &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;min&lt;/font&gt;&lt;/font&gt; + 1) * rnd() + &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;min&lt;/font&gt;&lt;/font&gt; ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    int&lt;/font&gt;&lt;/font&gt; translate_Coordinate( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      return&lt;/font&gt;&lt;/font&gt; (row - 1) * get_Columns() + (col - 1);&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; DEFAULT_NUMBEROF_ROWS = 16;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; DEFAULT_NUMBEROF_COLS = 8;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    static&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; DEFAULT_NUMBEROF_PIECES = 3;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;CBoard( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; rows = DEFAULT_NUMBEROF_ROWS, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; cols = DEFAULT_NUMBEROF_COLS, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; max_number_of_pieces = DEFAULT_NUMBEROF_PIECES ) : &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Boundaries_( rows &amp;gt; 0 ? rows : DEFAULT_NUMBEROF_ROWS , cols &amp;gt; 0 ? cols : DEFAULT_NUMBEROF_COLS ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;LeftTopMost_( 1, 1 ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Cells_( auto_ptr&amp;lt; vector&amp;lt;CCell&amp;gt; &amp;gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt; vector&amp;lt; CCell &amp;gt;( Boundaries_.first * Boundaries_.second, CCell( 0, 0, 0 ) ) ) ),&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;SavedLeftTopMost_( 1, 1 ),&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;SavedCells_( auto_ptr&amp;lt; vector&amp;lt;CCell&amp;gt; &amp;gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt; vector&amp;lt; CCell &amp;gt;( Boundaries_.first * Boundaries_.second, CCell( 0, 0, 0 ) ) ) )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; max_number_of_pieces_ = max_number_of_pieces &amp;gt; 0 ? max_number_of_pieces : DEFAULT_NUMBEROF_PIECES;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&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; row = get_Top(); row &amp;lt;= get_Rows(); ++row )&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; col = get_Left(); col &amp;lt;= get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;(*Cells_)[ translate_Coordinate( row, col ) ].Initialize( row, col, get_RandomValue( 1, max_number_of_pieces_ ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; FinderResult&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  friend&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt; Finder;&lt;br /&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&gt;Finder&amp;amp; Finder_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  int&lt;/font&gt;&lt;/font&gt; Count_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  int&lt;/font&gt;&lt;/font&gt; Current_Row_, Current_Col_;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;FinderResult( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt; FinderResult&amp;amp; fr ) : &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Finder_( fr.Finder_ ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Count_( fr.Count_ ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Row_( fr.Current_Row_ ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Col_( fr.Current_Col_ )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;FinderResult( Finder&amp;amp; finder ) : &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Finder_( finder ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Count_( 0 ), &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Row_( 0 ),&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Col_( 0 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; set_data( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; count )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Count_ = count; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Row_ = row;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Current_Col_ = col;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; confirm(); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; cancel();&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; get_Count() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    bool&lt;/font&gt;&lt;/font&gt; can_Continue() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;; &lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;class&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; Finder&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;CBoard&amp;amp; Board_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;FinderResult* FinderResult_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  bool&lt;/font&gt;&lt;/font&gt; CanUndo_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;vector&amp;lt; pair&amp;lt;&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; &amp;gt; Path_; &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;//first = row, second = col;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  friend&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;class&lt;/font&gt;&lt;/font&gt; FinderResult;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  public&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;Finder( CBoard&amp;amp; board ) : Board_( board ), CanUndo_( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;false&lt;/font&gt;&lt;/font&gt; )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;FinderResult_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;new&lt;/font&gt;&lt;/font&gt; FinderResult( *&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;this&lt;/font&gt;&lt;/font&gt; );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;~Finder()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      delete&lt;/font&gt;&lt;/font&gt; FinderResult_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;FinderResult&amp;amp; find( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Path_.clear();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_value = Board_.get_Value( row, col );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;InternalFind( row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;CanUndo_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;false&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;FinderResult_-&amp;gt;set_data( row, col, &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;( Path_.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;( Path_.size() &amp;gt; 1 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Board_.save();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      return&lt;/font&gt;&lt;/font&gt; *FinderResult_;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    bool&lt;/font&gt;&lt;/font&gt; undo()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( CanUndo_ )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Board_.recover();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;CanUndo_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;false&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        return&lt;/font&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;true&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&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;false&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    const&lt;/font&gt;&lt;/font&gt; vector&amp;lt; pair&amp;lt; &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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; &amp;gt; &amp;gt;&amp;amp; get_Path() &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;/font&gt;&lt;/font&gt;{ &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt; Path_; }&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;    bool&lt;/font&gt;&lt;/font&gt; has_PossibleCombinations()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row = Board_.get_Top(); row &amp;lt;= Board_.get_Rows(); ++row )&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; col = Board_.get_Left(); col &amp;lt;= Board_.get_Columns(); ++col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;Path_.clear();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;InternalFind( row, col, Board_.get_Value( row, col ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;          if&lt;/font&gt;&lt;/font&gt;( Path_.size() &amp;gt; 0 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;            &lt;/font&gt;InternalCancel();&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;true&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;} &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;false&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; InternalCancel()&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      for&lt;/font&gt;&lt;/font&gt;( vector&amp;lt; pair&amp;lt;&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt; &amp;gt;::const_iterator iter = Path_.begin(); iter != Path_.end(); ++iter )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        int&lt;/font&gt;&lt;/font&gt; row = iter-&amp;gt;first, col = iter-&amp;gt;second, value = Board_.get_Value( row, col );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Board_.set_Value( row, col, value * -1 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    bool&lt;/font&gt;&lt;/font&gt; is_match( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      return&lt;/font&gt;&lt;/font&gt; Board_.get_Value( row, col ) == ref_value;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; save( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Path_.push_back( pair&amp;lt;&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;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt;&amp;gt;( row, col ) );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Board_.set_Value( row, col, ref_value * -1 );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; refresh_board( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_value = Board_.get_Value( row, col );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_value &amp;lt; 0 )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{ &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;        for&lt;/font&gt;&lt;/font&gt;( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; r = Board_.get_Top(); r &amp;lt;= Board_.get_Rows(); ++r )&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; c = Board_.get_Left(); c &amp;lt;= Board_.get_Columns(); ++c ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;            if&lt;/font&gt;&lt;/font&gt;( Board_.get_Value( r, c ) == ref_value )&lt;font color=&quot;#0000ff&quot;&gt;   &lt;/font&gt;Board_.remove_Item( r, c ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;          &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;Board_.check_ChangeLeftTopMost();&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;  private&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; InternalFind( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_value == NULL || Board_.get_Value( row, col ) == NULL ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;; &lt;br /&gt;&lt;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&gt;Up( row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Down( row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Left( row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;Right( row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; Right( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_col = col + 1; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_col &amp;gt; Board_.get_Columns() ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( is_match( row, ref_col, ref_value ) ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;save( row, ref_col, ref_value ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;InternalFind( row, ref_col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; Left( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_col = col - 1; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_col &amp;lt; 1 ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( is_match( row, ref_col, ref_value ) ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;save( row, ref_col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;InternalFind( row, ref_col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; Down( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_row = row + 1; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_row &amp;gt; Board_.get_Rows() ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( is_match( ref_row, col, ref_value ) ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;save( ref_row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;InternalFind( ref_row, col, ref_value ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    void&lt;/font&gt;&lt;/font&gt; Up( &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; row, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; col, &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;int&lt;/font&gt;&lt;/font&gt; ref_value )&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      int&lt;/font&gt;&lt;/font&gt; ref_row = row - 1; &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( ref_row &amp;lt; 1 ) &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;return&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;      if&lt;/font&gt;&lt;/font&gt;( is_match( ref_row, col, ref_value ) ) &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;save( ref_row, col, ref_value );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;        &lt;/font&gt;InternalFind( ref_row, col, ref_value ); &lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;      &lt;/font&gt;}&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;    &lt;/font&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;font 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; FinderResult::confirm()&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;  Finder_.refresh_board( Current_Row_, Current_Col_ );&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;Finder_.CanUndo_ = &lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;true&lt;/font&gt;&lt;/font&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;void&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; FinderResult::cancel()&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;  &lt;/font&gt;Finder_.InternalCancel();&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;const&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;int&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; FinderResult::get_Count() &lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; Count_;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;bool&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; FinderResult::can_Continue() &lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;const&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;{&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  return&lt;/font&gt;&lt;/font&gt; Finder_.has_PossibleCombinations();&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;div&gt;Below, to reference, the original PocketPC interface of Jawbreaker by Microsoft:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://eqcdvg.bay.livefilestore.com/y1myU8PrV_PG-iKjX9k9EYdZzqp9yO5FmJUJAY8RBtSLbNVilsM3L7BAvjYqqr-mi9wjbX2nfXWdvGTH2DUQxpDQthpMJfO7CJmHRqq_RDNoWjD4Gtm3brkjLOoFoKKhOhAtvO9TrCQ5hLnBRymLJjfJg/jawbreaker_pocketpc.jpg&quot; rel=&quot;wlpp;url=https://eqcdvg.bay.livefilestore.com/y1myu8prv_pg-ikjx9k9eydzzqp9yo5fmjujay8rbtslbnvilsm3l7bavjyqqr-mi9wjbx2nfxwdvgth2duqxpdqthpmjfo7cjmhrqq_rdnowjd4gtm3brkjloofokkhohatvo9trcq5hlnbrymljjfjg/jawbreaker_pocketpc.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://eqcdvg.bay.livefilestore.com/y1myU8PrV_PG-iKjX9k9EYdZzqp9yO5FmJUJAY8RBtSLbNVilsM3L7BAvjYqqr-mi9wjbX2nfXWdvGTH2DUQxpDQthpMJfO7CJmHRqq_RDNoWjD4Gtm3brkjLOoFoKKhOhAtvO9TrCQ5hLnBRymLJjfJg/jawbreaker_pocketpc.jpg&quot; /&gt;&lt;/a&gt; &lt;/div&gt;</content>
		<author>
			<name>Fábio Galuppo</name>
			<uri>http://fabiogaluppo.spaces.live.com/</uri>
		</author>
		<source>
			<title type="html">The House of Software Engineer</title>
			<link rel="self" href="http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/Main?$format=rss20"/>
			<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/Main?$format=rss20</id>
			<updated>2010-04-24T13:00:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The windows source code has been released!</title>
		<link href="http://feedproxy.google.com/~r/JorgePereira/~3/lkYcaKi3YyU/"/>
		<id>http://blog.jorgepereira.com.br/?p=890</id>
		<updated>2009-10-06T12:35:46+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-891&quot; title=&quot;The windows source code has been released!&quot; src=&quot;http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/10/vistasourcecode.gif&quot; alt=&quot;The windows source code has been released!&quot; width=&quot;458&quot; height=&quot;830&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ops! praticamente três meses sem postar nenhuma novidade. Porém não tinha como deixar passar em branco este post&amp;#8230; está semana estarei de volta as atividades e compartilhando as novidades!&lt;/p&gt;
&lt;p&gt;Perceba que o código e bem tosco, porém divertido! o uso do &lt;em&gt;return&lt;/em&gt; com o método &lt;em&gt;void main()&lt;/em&gt; foi forçar a barra! &lt;img src=&quot;http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_cool.gif&quot; alt=&quot;:cool:&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;

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

	<entry xml:lang="en-us">
		<title type="html">&quot;F# for Developers&quot; (MSDN Brazil Webcast)</title>
		<link href="http://fabiogaluppo.spaces.live.com/Blog/cns!B671A4645AF2F2F4!236.entry"/>
		<id>http://cid-b671a4645af2f2f4.users.api.live.net/Users(-5300274535508806924)/B671A4645AF2F2F4!236</id>
		<updated>2009-09-21T01:27:04+00:00</updated>
		<content type="html">&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Last week, I gave a small webcast at Microsoft Brasil, São Paulo, SP. The theme was an (gosh, the time passed so fast in that talk) Introduction to F#, or in my native language, translated to &amp;quot;F# para Desenvolvedores&amp;quot;. With &lt;a href=&quot;https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&amp;EventID=1032423365&amp;CountryCode=BR&quot; target=&quot;_blank&quot;&gt;this pointer&lt;/a&gt; you can reach to MSDN page.  &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;To the attendees I'd like to be grateful for the time, patient, collaboration and participation with good questions. Specially, to my fellows brothers and sisters of the current software project which I'm involved: &lt;strong&gt;&lt;em&gt;Thank you all Beavers!!!&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;As I promised, these are the samples in the form of F# scripts: &lt;a href=&quot;http://cid-b671a4645af2f2f4.skydrive.live.com/self.aspx/P%c3%bablico/FSharp WebCast Samples/fsharp^_webcast^_samples.zip&quot;&gt;FSharp Samples&lt;/a&gt;. You can run them with Visual Studio 2010, or with the &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=7bb32f32-9fac-4f34-ad56-b0bda130cf00&amp;displaylang=en&quot;&gt;F# May 2009 CTP&lt;/a&gt; (VS 2008 compatible, too) &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Following the tradition of the previous posts, here some F# code:&lt;/div&gt;
&lt;div&gt; &lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;//Pattern Matching - CAR (Contents of the Address Register) &amp;amp; CDR (Contents of the Decrement Register)&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot; size=&quot;1&quot;&gt;exception&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt; Invalid;;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; car a =&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  match&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; a &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;with&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;  | head :: tail &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; head&lt;br /&gt;  | _ &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; raise Invalid;;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; cdr a =&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  match&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; a &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;with&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;  | head :: tail &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; tail&lt;br /&gt;  | _ &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt; [];;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot; size=&quot;1&quot;&gt; l = [1; 2; 3];;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; s = [&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;2&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;3&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;];;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;car l;;&lt;br /&gt;cdr l;;&lt;br /&gt;car s;;&lt;br /&gt;cdr s;;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;font color=&quot;#008000&quot;&gt;&lt;br /&gt;&lt;font size=&quot;1&quot;&gt;//Recursion - The Tower of Hanoi&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;rec&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; hanoi_solver N from to_ aux =&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;  match&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt; N &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;with&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;  | 1 &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; printfn &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;Move from %s to %s&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; from to_&lt;br /&gt;  | _ &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;    let&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt; n = N - 1&lt;br /&gt;    hanoi_solver n from aux to_&lt;br /&gt;    hanoi_solver 1 from to_ aux&lt;br /&gt;    hanoi_solver n aux to_ from;;&lt;br /&gt;&lt;br /&gt;hanoi_solver 3 &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;;;&lt;br /&gt;hanoi_solver 3 &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;B&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;C&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;&lt;font&gt;&lt;font&gt;;;&lt;br /&gt;hanoi_solver 5 &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&amp;quot;A&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot;#800000&quot;&gt;&lt;font color=&quot