<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Murilo :P</title>
	<atom:link href="http://murilo.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://murilo.wordpress.com</link>
	<description>C++, Computação, Programação, Web e afins :)</description>
	<lastBuildDate>Sun, 29 Jan 2012 07:58:09 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='murilo.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Murilo :P</title>
		<link>http://murilo.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://murilo.wordpress.com/osd.xml" title="Murilo :P" />
	<atom:link rel='hub' href='http://murilo.wordpress.com/?pushpress=hub'/>
		<item>
		<title>PHP&#8217;s sort functions are bad designed</title>
		<link>http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/</link>
		<comments>http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 17:24:31 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Estruturas de Dados]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[php internal]]></category>
		<category><![CDATA[quicksort]]></category>
		<category><![CDATA[sort]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=402</guid>
		<description><![CDATA[Everyone knows that is possible to sort an array in O(N log N) where N is the array&#8217;s length. We know also, that Quicksort has expected complexity of O(N log N) but in worst case its complextity is O(N^2), and Quicksort is used more than Mergesort (worst case O(N log N)) because constants are smaller [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=402&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Everyone knows that is possible to sort an array in <code>O(N log N)</code> where <code>N</code> is the array&#8217;s length.</p>
<p>We know also, that <a href="http://en.wikipedia.org/wiki/Quicksort">Quicksort</a> has expected complexity of <code>O(N log N)</code> but in worst case its complextity is <code>O(N^2)</code>, and Quicksort is used more than <a href="http://en.wikipedia.org/wiki/Mergesort">Mergesort</a> (worst case <code>O(N log N)</code>) because constants are smaller and it requires no extra memory and is easy to avoid Quicksort running on the worst case.</p>
<p>The easiest way to avoid bad inputs for Quicksort is choosing the pivot randomly, which means that a malicious user cannot guess a permutation for cracking it.</p>
<p>What I found at the PHP source is that the pivot choosing is done by picking the element at middle of array.</p>
<p>Here is the code (<a href="http://lxr.php.net/opengrok/xref/PHP_TRUNK/Zend/zend_qsort.c">link</a> line 76):</p>
<p><pre class="brush: cpp;">
ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC)
{
	void           *begin_stack[QSORT_STACK_SIZE];
	void           *end_stack[QSORT_STACK_SIZE];
	register char  *begin;
	register char  *end;
	register char  *seg1;
	register char  *seg2;
	register char  *seg2p;
	register int    loop;
	uint            offset;

	begin_stack[0] = (char *) base;
	end_stack[0]   = (char *) base + ((nmemb - 1) * siz);

	for (loop = 0; loop &gt;= 0; --loop) {
		begin = begin_stack[loop];
		end   = end_stack[loop];

		while (begin &lt; end) {
			offset = (end - begin) &gt;&gt; 1; // HERE: choosing the current subarray's middle element 
			_zend_qsort_swap(begin, begin + (offset - (offset % siz)), siz);

			seg1 = begin + siz;
			seg2 = end;

			while (1) {
				for (; seg1 &lt; seg2 &amp;&amp; compare(begin, seg1 TSRMLS_CC) &gt; 0;
				     seg1 += siz);

				for (; seg2 &gt;= seg1 &amp;&amp; compare(seg2, begin TSRMLS_CC) &gt; 0;
				     seg2 -= siz);

				if (seg1 &gt;= seg2)
					break;

				_zend_qsort_swap(seg1, seg2, siz);

				seg1 += siz;
				seg2 -= siz;
			}

			_zend_qsort_swap(begin, seg2, siz);

			seg2p = seg2;

			if ((seg2p - begin) &lt;= (end - seg2p)) {
				if ((seg2p + siz) &lt; end) {
					begin_stack[loop] = seg2p + siz;
					end_stack[loop++] = end;
				}
				end = seg2p - siz;
			}
			else {
				if ((seg2p - siz) &gt; begin) {
					begin_stack[loop] = begin;
					end_stack[loop++] = seg2p - siz;
				}
				begin = seg2p + siz;
			}
		}
	}
}
</pre></p>
<p>The pivot is named <code>offset</code> here.</p>
<h3>Tests</h3>
<p>I used the <code>usort()</code> function for counting how many comparisons was needed to sort the array in my <code>cmp()</code> function.<br />
So, lets see the tests:<br />
<pre class="brush: php;">
&lt;?php

$counter = 0; // counts how many comparisons
function cmp($a, $b)
{
	global $counter;
	++$counter;
	return $a - $b;
}

$normal = array();
for ($i = 0; $i &lt; 15; ++$i) {
	$normal[] = $i;
}
shuffle($normal);

$counter = 0;
print &quot;&lt;pre&gt;Normal array:\n&quot;;
usort($normal, 'cmp');
print $counter . &quot; comparisons\n\n&quot;;

$malicious = array(2, 9, 4, 12, 6, 11, 8, 1, 3, 5, 7, 9, 10, 14, 12);

$counter = 0;
print &quot;Malicious array:\n&quot;;
usort($malicious, 'cmp');
print $counter . &quot; comparisons\n&lt;/pre&gt;&quot;;

?&gt;
</pre></p>
<p>And the results:<br />
<code>Normal array:<br />
64 comparisons    // variable because of the shuffle </p>
<p>Malicious array:<br />
208 comparisons // constant<br />
</code></p>
<p>It means that the PHP&#8217;s <code>sort()</code> family depends on the input array&#8217;s length and content while a <a href="http://en.wikipedia.org/wiki/Quicksort#Randomized_quicksort_expected_complexity">Randomized Quicksort</a> depends only on the input array&#8217;s length.</p>
<p>As we can see, <code>usort()</code> sorted the randomly generated array of length 20 very fast with a few number of comparisons, but in the case of a manipulated array of length 20, the number of comparisons are much more. </p>
<p>In the same way, taking an array of length 10.000, these functions do around 50.000.000 comparisons when the expected is around 132.000. This can be a problem if some &#8220;bad&#8221; guy inserts manipulated data which your script will sort.</p>
<h3>Solution</h3>
<p>The naive solution is <code>shuffle()</code>&#8216;n the array before sorting.</p>
<p><pre class="brush: php;">
&lt;?php

$malicious = array(11, 3, 20, 5, 13, 7, 17, 9, 15, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 19);
shuffle($malicious);

$counter = 0;
print &quot;No longer malicious:\n&quot;;
usort($malicious, 'cmp');
print $counter . &quot; coparisons\n&lt;/pre&gt;&quot;;

?&gt;
</pre></p>
<p>Output:<br />
<code>No longer malicious:<br />
76 comparisons<br />
</code></p>
<h3>References</h3>
<p><a href="http://lxr.php.net/opengrok/xref/PHP_TRUNK/Zend/zend_qsort.c">zend_qsort source</a><br />
<a href="http://php.net/sort">PHP: sort() function</a><br />
<a href="http://php.net/usort">PHP: usort() function</a><br />
<a href="http://php.net/shuffle">PHP: shuffle() function</a><br />
<a href="http://en.wikipedia.org/wiki/Quicksort">Quicksort &#8211; Wikipedia</a><br />
<a href="http://en.wikipedia.org/wiki/Mergesort">Mergesort &#8211; Wikipedia</a></p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/estruturas-de-dados/'>Estruturas de Dados</a>, <a href='http://murilo.wordpress.com/category/programacao/php/'>Php</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://murilo.wordpress.com/tag/algorithm/'>algorithm</a>, <a href='http://murilo.wordpress.com/tag/php/'>Php</a>, <a href='http://murilo.wordpress.com/tag/php-internal/'>php internal</a>, <a href='http://murilo.wordpress.com/tag/quicksort/'>quicksort</a>, <a href='http://murilo.wordpress.com/tag/sort/'>sort</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/402/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=402&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>Fast and Easy Levenshtein distance using a Trie (in C++)</title>
		<link>http://murilo.wordpress.com/2011/02/01/fast-and-easy-levenshtein-distance-using-a-trie-in-c/</link>
		<comments>http://murilo.wordpress.com/2011/02/01/fast-and-easy-levenshtein-distance-using-a-trie-in-c/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 00:46:45 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Estruturas de Dados]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[data structure]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[trie]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=395</guid>
		<description><![CDATA[I implemented this clever algorithm described on Steven Hanov&#8217;s blog in C++. Actually this algorithm is a bit different from the original because I wanted to know what is the least Levenshtein distance given a word. The modification for match all words within a given Leveshtein distance and returning that set is trivial. Just modify the line [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=395&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I implemented this clever algorithm described on Steven Hanov&#8217;s blog in C++. Actually this algorithm is a bit different from the original because I wanted to know what is the least Levenshtein distance given a word.</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cctype&gt;

/*
 * Algorithm: Edit distance using a trie-tree (Dynamic Programming)
 * Author: Murilo Adriano Vasconcelos &lt;muriloufg@gmail.com&gt;
 */

using namespace std;

// Trie's node
struct trie
{
	typedef map&lt;char, trie*&gt; next_t;

	// The set with all the letters which this node is prefix
	next_t next;

	// If word is equal to &quot;&quot; is because there is no word in the
	//	dictionary which ends here.
	string word;

	trie() : next(map&lt;char, trie*&gt;()) {}

	void insert(string w)
	{
		w = string(&quot;$&quot;) + w;
		
		int sz = w.size();
		
		trie* n = this;
		for (int i = 0; i &lt; sz; ++i) {
			if (n-&gt;next.find(w[i]) == n-&gt;next.end()) {
				n-&gt;next[w[i]] = new trie();
			}

			n = n-&gt;next[w[i]];
		}

		n-&gt;word = w;
	}
};

// The tree
trie tree;

// The minimum cost of a given word to be changed to a word of the dictionary
int min_cost;

//
void search_impl(trie* tree, char ch, vector&lt;int&gt; last_row, const string&amp; word)
{
	int sz = last_row.size();

	vector&lt;int&gt; current_row(sz);
	current_row[0] = last_row[0] + 1;

	// Calculate the min cost of insertion, deletion, match or substution
	int insert_or_del, replace;
	for (int i = 1; i &lt; sz; ++i) {
		insert_or_del = min(current_row[i-1] + 1, last_row[i] + 1);
		replace = (word[i-1] == ch) ? last_row[i-1] : (last_row[i-1] + 1);

		current_row[i] = min(insert_or_del, replace);
	}

	// When we find a cost that is less than the min_cost, is because
	// it is the minimum until the current row, so we update
	if ((current_row[sz-1] &lt; min_cost) &amp;&amp; (tree-&gt;word != &quot;&quot;)) {
		min_cost = current_row[sz-1];
	}

	// If there is an element wich is smaller than the current minimum cost,
	// 	we can have another cost smaller than the current minimum cost
	if (*min_element(current_row.begin(), current_row.end()) &lt; min_cost) {
		for (trie::next_t::iterator it = tree-&gt;next.begin(); it != tree-&gt;next.end(); ++it) {
			search_impl(it-&gt;second, it-&gt;first, current_row, word);
		}
	}
}

int search(string word)
{
	word = string(&quot;$&quot;) + word;
	
	int sz = word.size();
	min_cost = 0x3f3f3f3f;

	vector&lt;int&gt; current_row(sz + 1);

	// Naive DP initialization
	for (int i = 0; i &lt; sz; ++i) current_row[i] = i;
	current_row[sz] = sz;
	
	
	
	// For each letter in the root map wich matches with a
	// 	letter in word, we must call the search
	for (int i = 0 ; i &lt; sz; ++i) {
		if (tree.next.find(word[i]) != tree.next.end()) {
			search_impl(tree.next[word[i]], word[i], current_row, word);
		}
	}

	return min_cost;
}
</pre></p>
<p>The modification for match all words within a given Leveshtein distance and returning that set is trivial. Just modify the line 72 for storing that word if its Leveshtein distance is less than or equal to a given distance.</p>
<p>For more details, read this: <a title="Fast and Easy Levenshtein distance using a Trie (Steven Hanov)" href="http://stevehanov.ca/blog/index.php?id=114" target="_blank"></a><a id="blogTitle" href="http://stevehanov.ca/blog/index.php?id=114">Fast and Easy Levenshtein distance using a Trie</a><br />
See ya!</p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/estruturas-de-dados/'>Estruturas de Dados</a> Tagged: <a href='http://murilo.wordpress.com/tag/algorithm/'>algorithm</a>, <a href='http://murilo.wordpress.com/tag/c/'>c</a>, <a href='http://murilo.wordpress.com/tag/data-structure/'>data structure</a>, <a href='http://murilo.wordpress.com/tag/string/'>string</a>, <a href='http://murilo.wordpress.com/tag/trie/'>trie</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/395/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=395&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2011/02/01/fast-and-easy-levenshtein-distance-using-a-trie-in-c/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>Nunca retorne ponteiros para atributos de uma classe nem deixem atributos com acesso &#8216;public&#8217;</title>
		<link>http://murilo.wordpress.com/2010/09/09/nunca-retorne-ponteiros-para-atributos-de-uma-classe/</link>
		<comments>http://murilo.wordpress.com/2010/09/09/nunca-retorne-ponteiros-para-atributos-de-uma-classe/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 20:29:20 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[ponteiros]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=378</guid>
		<description><![CDATA[Esse post surgiu de uma dúvida que tive: Como será que é feita a &#8220;proteção&#8221; dos atributos e funções-membro de classes em C++? Com isso resolvi fazer  alguns testes e eis a classe de teste: A pergunta é: aonde pode estar o perigo nesse código (obviamente além de ter uma função-membro que imprime a senha [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=378&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Esse post surgiu de uma dúvida que tive:<img class="alignright size-full" style="border:0;" title="C++" src="http://murilo.files.wordpress.com/2008/10/cpp.png?w=700" alt=""   /></p>
<blockquote><p>Como será que é feita a &#8220;proteção&#8221; dos atributos e funções-membro de classes em C++?</p></blockquote>
<p>Com isso resolvi fazer  alguns testes e eis a classe de teste:</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;string&gt;

class security
{
private:
	std::string name;
	std::string password;
	int id;
	/* more stuff */
public:
	security() : name(&quot;John&quot;), password(&quot;s3cr3t&quot;), id(10) {}

	std::string* name_ptr() { return &amp;name; }

	void print_pass()
	{
		std::cout &lt;&lt; &quot;The current password is: &quot; &lt;&lt; password &lt;&lt; std::endl;
	}
};
</pre></p>
<p>A pergunta é: aonde pode estar o perigo nesse código (obviamente além de ter uma função-membro que imprime a senha na tela)?</p>
<h4>Onde mora o perigo</h4>
<p>O perigo maior reside na função-membro <code>name_ptr()</code>. Essa função por algum motivo (talvez o desenvolvedor queria fazer de <code>name_ptr()</code> um getter/setter por exemplo) delega um ponteiro para o atributo <code>name</code>.<br />
Por ela retornar um ponteiro para um atributo da classe, acabamos com o sistema de proteção de acesso a atributos/funções-membro do C++:</p>
<p><pre class="brush: cpp;">
int main()
{
	security obj;

	std::string* name = obj.name_ptr();
	std::cout &lt;&lt; &quot;Name: &quot; &lt;&lt; *name &lt;&lt; std::endl;

	std::string* password = (std::string*)(name + 1);
	std::cout &lt;&lt; &quot;Password was: &quot; &lt;&lt; *password &lt;&lt; std::endl;

	// Changing password
	*password = &quot;l33t&quot;;

	obj.print_pass(); // whoa!!

	// For other data types
	int* id = (int*)(password + 1);
	std::cout &lt;&lt; &quot;ID: &quot; &lt;&lt; *id &lt;&lt; std::endl;

	return 0;
}
</pre></p>
<p>Ou seja, a partir do ponteiro retornado por <code>obj.name_ptr()</code>, através de aritmética de ponteiros[<a href="http://pt.wikipedia.org/wiki/Ponteiro_(programa%C3%A7%C3%A3o)#Aritm.C3.A9tica_de_ponteiros_em_C_e_C.2B.2B" target="_blank">0</a>], podemos acessar qualquer outro atributo de um objeto da classe <code>security</code>, mesmo que estes não sejam <code>public</code>. Como podemos ver no exemplo acima, a partir do atributo <code>name</code>, podemos facilmente obter acesso aos outros atributos.</p>
<p>Outra falha é quando deixamos algum atributo como <code>public</code>:</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;string&gt;

class security
{
public:
	std::string name;
private:
	std::string password;
	int id;

	/* more stuff */

public:

	security() : name(&quot;John&quot;), password(&quot;s3cr3t&quot;), id(10) {}

	void print_pass()
	{
		std::cout &lt;&lt; &quot;The current password is: &quot; &lt;&lt; password &lt;&lt; std::endl;
	}
};
</pre></p>
<p>Dessa maneira podemos também obter o endereço de <code>name</code>, agora apenas usando o operador &amp; unário:</p>
<p><pre class="brush: cpp;">
int main()
{
	security obj;

	std::string* name = &amp;(obj.name);
	std::cout &lt;&lt; &quot;Name: &quot; &lt;&lt; *name &lt;&lt; std::endl;

	std::string* password = (std::string*)(name + 1);
	std::cout &lt;&lt; &quot;Password was: &quot; &lt;&lt; *password &lt;&lt; std::endl;

	// Changing password
	*password = &quot;l33t&quot;;

	obj.print_pass(); // whoa!!

	// For other data types
	int* id = (int*)(password + 1);
	std::cout &lt;&lt; &quot;ID: &quot; &lt;&lt; *id &lt;&lt; std::endl;

	return 0;
}
</pre></p>
<p>Observem que na linha 5, peguei o endereço do atributo <code>name</code> e fiz a mesma coisa do exemplo anterior.</p>
<p>Para os dois exemplos a saída é a mesma:</p>
<pre style="background-color:#000000;color:#ffffff;border:white 1px dashed;margin:15px 0;padding:4px;">Name: John
Password was: s3cr3t
The current password is: l33t
ID: 10</pre>
<h4>Voltando à minha dúvida inicial&#8230;</h4>
<p>Conclusão: pelo menos no compilador g++, a proteção é feita apenas pelo compilador (compile-time) e nenhum outro tipo de impedimento é usado. Ou seja, se você &#8220;adivinhar&#8221; o endereço de memória de um atributo de um objeto, você poderá ter acesso total à ele e aos outros atributos desse objeto.</p>
<p>Então, na hora de desenvolvermos nossas classes em C++, nada de retornar ponteiros para atributos de um objeto, nem de deixar atributos <code>public</code> quando se tem outros atributos não-<code>public</code>.</p>
<h4><strong>Update</strong></h4>
<p>Logo depois de eu fazer esse post, o WP automaticamente postou em meu Twitter e Facebook o link para este post. No Facebook recebi um comentário de um excelente programador o Maurício Collares (ou MauricioC no TopCoder[1]). Acho pertinente colar o comentário e também minha reposta aqui uma vez que estou vendo que esse post está tendo uma grande quantidade de leituras.</p>
<blockquote><p><strong>Maurício Collares Neto:</strong> Não sei se entendi qual o problema de alguém que já tem acesso de leitura à posicao &#8220;secreta&#8221; de memória (no sentido de não tomar um SIGSEGV) acessar tal posicao. Private e public são anotacoes existentes por motivos de Engenharia de Software, para evitar quebra de abstracoes; a grande maioria das linguagens oferece um jeito &#8220;fácil&#8221; de quebrar tal abstracao caso você precise fazê-lo (vide instrospeccao em Java).</p>
<p>Além disso, se você tem o endereco da da instäncia da classe (que pode ser obtido mesmo que vocë náo tenha nenhum membro público), você já tem acesso ao endereco de memória de todas as outras variáveis, do mesmo jeito; membros de classes são só syntactic sugar pra aritmética de ponteiros.</p></blockquote>
<blockquote><p><strong>Murilo Adriano Vasconcelos:</strong> Interessante, eu não tinha pensado no fato de através do endereço do objeto podemos facilmente acessar qualquer atributo do objeto. E pensando melhor, mesmo que não houvesse esse tipo de facilidade no ponto de vista de objetos, teríamos acesso de alguma forma no no ponto de vista de processos, já que os processos tem total acesso às àreas de memória alocadas por ele.</p>
<p>Assim, e com o que você disse, fica totalmente anula o sentido do título do post (já que, por exemplo, seria o mesmo que dizer &#8220;Nunca instancie objetos&#8221;, um absurdo), porém poderei fazer uma atualização no post no sentido de apenas expor essa &#8220;feature&#8221; adicionando essa idéia de através de uma instância da classe acessar os outros atributos.</p>
<p>De qualquer forma, valeu pelo comentário, pena que foi só aqui no FB e não no blog, onde mais pessoas poderiam ter acesso à essa conversa.</p></blockquote>
<p><strong>Referências</strong></p>
<p>[0] - <a href="http://pt.wikipedia.org/wiki/Ponteiro_(programa%C3%A7%C3%A3o)#Aritm.C3.A9tica_de_ponteiros_em_C_e_C.2B.2B" target="_blank">Aritmética de ponteiros em C e C++ (Wikipedia)</a></p>
<p>[1] &#8211; <a title="TopCoder.com" href="http://www.topcoder.com/tc" target="_self">TopCoder</a></p>
<p><ins datetime="2010-10-04T00:11:58+00:00"></ins></p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a> Tagged: <a href='http://murilo.wordpress.com/tag/cpp/'>cpp</a>, <a href='http://murilo.wordpress.com/tag/ponteiros/'>ponteiros</a>, <a href='http://murilo.wordpress.com/tag/seguranca/'>Segurança</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/378/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=378&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/09/09/nunca-retorne-ponteiros-para-atributos-de-uma-classe/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2008/10/cpp.png" medium="image">
			<media:title type="html">C++</media:title>
		</media:content>
	</item>
		<item>
		<title>Políticas de Controle de Comportamento em C++</title>
		<link>http://murilo.wordpress.com/2010/07/29/politicas-de-controle-de-comportamento-em-cpp/</link>
		<comments>http://murilo.wordpress.com/2010/07/29/politicas-de-controle-de-comportamento-em-cpp/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 01:02:33 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[Boost]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[cpp idioms]]></category>
		<category><![CDATA[ideias]]></category>
		<category><![CDATA[políticas]]></category>
		<category><![CDATA[policy]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=363</guid>
		<description><![CDATA[Trabalhando no meu projeto na Boost, fui requisitado a implementar uma função para calcular o logaritmo na base 2 de números inteiros. De prontidão pesquisei qual a melhor forma e implementei-a da maneira mais otimizada possível. Fiz um Request For Comments (RFC) na mail list da Boost para saber opiniões sobre qual deveria ser o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=363&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Trabalhando no <a href="http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010/">meu projeto na Boost</a>, fui requisitado a implementar uma função para calcular o logaritmo na base 2 de números inteiros. De prontidão pesquisei qual a melhor forma e implementei-a da maneira mais otimizada possível. Fiz um <a href="http://en.wikipedia.org/wiki/Request_for_Comments">Request For Comments (RFC)</a> na mail list da Boost para saber opiniões sobre qual deveria ser o nome de tal função. Bom, depois de alguma conversa ficou (ao menos por enquanto) decidido que o melhor nome é <a href="http://svn.boost.org/svn/boost/sandbox/SOC/2010/bits_and_ints/boost/integer/ilog2.hpp"><code>ilog2</code></a>.</p>
<p>Bom mas havia um problema logaritmo de 0 é indefinido. E na documentação eu coloquei:</p>
<blockquote><p>If `value` is equal to 0, the value returned is undefined</p></blockquote>
<p>Foi aí que um contribuidor da Boost chamado Paul Bristow recomendou a mim que fizesse com que esse comportamento (<code>ilog2(0)</code>) pudesse ser controlável através de políticas, mais especificamente usando <code><a href="http://www.boost.org/doc/libs/1_43_0/libs/math/doc/sf_and_dist/html/math_toolkit/policy.html">boost::math::policies</a></code>. Resisti um pouco no começo mas cedi e achei bastante interessante.</p>
<h3>O que são políticas de tratamento de comportamento?</h3>
<p>Basicamente são meios de controlar o comportamento de um algoritmo em certas situações (como o <code>ilog2(0)</code> por exemplo). </p>
<p>Um exemplo de política muito utilizada na biblioteca padrão são as classes que usam <code><a href="http://en.wikipedia.org/wiki/Allocator_(C%2B%2B)">std::allocator</a></code>.</p>
<p>Em C++ podemos implementar políticas facilmente em tempo de compilação.</p>
<h3>Implementando Políticas</h3>
<p>Vamos então implementar um modelo de política bem simples. Tomei por base as Policies da biblioteca Math da Boost, porém muito mais simplificada por questão de didática.</p>
<p><pre class="brush: cpp;">
#ifndef POLICIES_HPP_INCLUDED
#define POLICIES_HPP_INCLUDED

#include &lt;cerrno&gt;      // errno
#include &lt;stdexcept&gt; // std::domain_error

namespace policies
{

// Nossa política
enum error_policy_type
{
	ignore_error = 0,
	errno_on_error,
	throw_on_error,
	user_error
};

// continua
</pre></p>
<p>Esse enum define a regra que queremos utilizar em nossa política.</p>
<ul>
<li><code>ignore_error</code>: ignora o erro e retorna um valor padrão.</li>
<li><code>errno_on_error</code>: seta errno e retorna um valor padrão.</li>
<li><code>throw_on_error</code>: dispara uma exceção.</li>
<li><code>user_error</code>: executa uma função customizada definida pelo usuário, note que a <strong>declaração dessa função já existe</strong>, tendo apenas que ser feita a <strong>definição</strong> dessa função.</li>
</ul>
<p>No caso defini 4 tipos de erros mas pode-se ter mais coisas como &#8220;dialog_on_error&#8221; se seu projeto utiliza GUI e você quer que apareça uma dialog box informando algo, de qualquer maneira pode-se também usar o <code>user_error</code> se for aplicável.</p>
<p><pre class="brush: cpp;">
// continuação

template &lt;int P&gt;
struct domain_error
{
	const static int policy = P;
};

template &lt;int P&gt;
struct overflow_error
{
	const static int policy = P;
};
</pre></p>
<p>Aqui declaramos nossos tipos de erro. É basicamente um <em>wrapper</em> para nossas constantes declaradas no enum anterior. <code>P</code> é a política que queremos aplicar.  Por exemplo <code>typedef overflow_error&lt;errno_on_error&gt; my_pol;</code>, <code>my_pol</code> é uma política que para tratar <code>overflow_error</code> seguindo a regra <code>errno_on_error</code>.  Novamente podemos ter vários tipos de erros que queiramos tratar, coloquei esses dois como exemplo. Notemos também que para simplicidade não tratei os possíveis valores que <code>P</code> pode assumir.</p>
<p>
typedef domain_error&lt;ignore_error&gt; default_domain_policy;
typedef overflow_error&lt;errno_on_error&gt; default_overflow_policy;
</p>
<p>Aqui definimos quais as políticas padrões para cada tipo de erro. No caso definimos que a política padrão que deve ser seguida quando um <code>domain_error</code> for lançado é a <code>ignore_error</code>. Veremos mais para frente sugestões de como tratar cada política.</p>
<p><pre class="brush: cpp;">
// Only the declaration, must be defined somewhere
template &lt;typename T&gt;
T user_domain_error(const char* function, const char* message, const T&amp; val);

template &lt;typename T&gt;
T user_overflow_error(const char* function, const char* message, const T&amp; val);
</pre></p>
<p>Aqui nós <strong>apenas declaramos</strong> os protótipos das funções que serão chamadas quando um <code>user_error</code> for lançado. Se alguém usar a política <code>user_error</code>, este deverá <strong>codificar</strong> essas funções em algum outro lugar. </p>
<p><pre class="brush: cpp;">
template &lt;typename T&gt;
T raise_domain_error(const char* function, const char* message, const T&amp; val, const policies::domain_error&lt;ignore_error&gt;&amp;)
{
	// Simply ignoring the error
	return val;
}

template &lt;typename T&gt;
T raise_domain_error(const char* function, const char* message, const T&amp; val, const policies::domain_error&lt;errno_on_error&gt;&amp;)
{
	// Sets errno to Error DOMain
	errno = EDOM;
	return val;
}

template &lt;typename T&gt;
T raise_domain_error(const char* function, const char* message, const T&amp; val, const policies::domain_error&lt;throw_on_error&gt;&amp;)
{
	throw std::domain_error(message);
	
	// This will never be returned
	return val;
}

template &lt;typename T&gt;
T raise_domain_error(const char* function, const char* message, const T&amp; val, const policies::domain_error&lt;user_error&gt;&amp;)
{
	return user_domain_error(function, message, val);
}

}
</pre></p>
<p>Essas são as funções chamadas para lançar um <code>domain_error</code>. Note que para cada política definimos uma função para tratá-la. Por questão de simplicidade, defini apenas as funções que tratam as políticas de <code>domain_error</code>, para <code>overflow_error</code> por exemplo, precisaríamos definir <code>raise_overflow_error()</code> com sobrecargas para cada política diferente. </p>
<p>O protótipo das funções pode ser modificado de acordo com o que você necessitar. Aqui defini quatro parâmetros:</p>
<ul>
<li>function &#8211; o nome da função que causou o comportamento (erro)</li>
<li>message &#8211; a descrição do que causou o comportamento.</li>
<li>val &#8211; o valor que essa função deve retornar (quando aplicável)</li>
<li>const policies::domain_error&amp; &#8211; utilizado para fazer a sobrecarga de função, onde X é a política a ser tratada.</li>
</ul>
<p>Pode paracer meio desgastante porém depois de pronto, seu sistema complexo pode se beneficiar com transparência das políticas que não devem ser tantas.</p>
<p>A Boost Math por exemplo define apenas 6 tipos de erros e as mesmas 4 políticas que estou usando como exemplo.</p>
<h3>Exemplo de uso</h3>
<p>Agora suponhamos que tenhamos que implementar uma função que faz a divisão de dois elementos <code>a</code> e <code>b</code> (ohhh divisão!). Essa função, chamada <code>divide</code>, está sendo representada abaixo.</p>
<p>Como sabemos, divisão por zero não existe, então para uma solução elegante para nossa função super complexa, iremos utilizar as nossas políticas.</p>
<p><pre class="brush: cpp;">
#include &quot;policies.hpp&quot;

template &lt;typename T, typename Policy&gt;
T divide(T a, T b, const Policy&amp; pol)
{
	if (b == 0) {
		return policies::raise_domain_error(&quot;divide(a, b)&quot;, 
			&quot;Cannot divide by zero&quot;, 
			T(0),   // Value to be returned  
			pol  // Our policy
		);
	}
	
	return a / b;
}

template &lt;typename T&gt;
inline T divide(T a, T b)
{
	return divide(a, b, policies::default_policy());
}
</pre></p>
<p>Como pudemos notar, declarei duas funções <code>divide</code>, uma aceitando dois parâmetros que serão computados e a outra aceitando um parâmetro a mais que é a política a ser utilizada. A versão de dois parâmetros na verdade é somente um forwarder para a outra passando a política padrão para ser utilizada. O valor padrão a ser retornado é 0, como podemos notar em <code>T(0)</code>.</p>
<p>O &#8220;mau&#8221; comportamento ocorre quando <code>b == 0</code>, então, se essa condição for satisfeita, simplesmente lançamos um <code>domain_error</code> utilizando a função <code>raise_domain_error</code>.</p>
<p>Para o usuário da função isso é transparente se ele não quiser trabalhar com as políticas, já que uma política padrão é adotada e um valor padrão é retornado.</p>
<p><pre class="brush: cpp;">
int main()
{	
	using namespace policies;
	
        // Default policy, zero is returned
	assert((divide(1, 0) == 0));

	typedef domain_error&lt;errno_on_error&gt; errno_pol;
	typedef domain_error&lt;ignore_error&gt;   ignore_pol;
	typedef domain_error&lt;throw_on_error&gt; throw_pol;
	
	// Testing errno_on_error policy, errno is set equal EDOM
	errno = 0;
	divide(1, 0, errno_pol());
	assert((errno == EDOM));
	
	// Testing ignore_error policy, zero is returned
	assert((divide(1, 0, ignore_pol()) == 0));
	
	// Testing throw_on_error policy, a std::domain_error is threw
	try {
		divide(1, 0, throw_pol());
		
		// Never is threw
		throw &quot;error 0&quot;;
	}
	catch (std::domain_error&amp;) {
		// FINE!!!
        // Sucessfully caught!
	}
	catch (...) {
                // Bad!
		throw &quot;error 1&quot;;
	}
	
	return 0;
}
</pre> </p>
<p>Se estiver tudo certo, programa acima deve (após ser compilado) ser executado sem nenhuma saída e com nenhuma exceção.</p>
<p>Ficou agora faltando demonstrar apenas como usar as políticas com <code>user_error</code>.</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &quot;policies.hpp&quot;
#include &quot;divide.hpp&quot;

namespace policies {
template &lt;typename T&gt;
T user_domain_error(const char* function, const char* message, const T&amp; val)
{
	std::cout &lt;&lt; &quot;Problem on calling function &quot;&lt;&lt; function &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;Value &quot; &lt;&lt; val &lt;&lt; &quot; will be returned &quot; &lt;&lt; std::endl;
	
	// DialogBox db(message); or anything you want
	
	return val;
}
}

int main()
{
	policies::domain_error&lt;policies::user_error&gt; usr_err;
	divide(1, 0, usr_err);
        /*  Saída:
  	     Problem on calling function divide(a, b)
             Value 0 will be returned 
         */

	return 0;
}
</pre></p>
<p>Como pudemos ver, basta apenas definirmos a função <code>user_domain_error</code> do modo que quisermos para que possamos usar essa política. No caso acima apenas imprimimos uma mensagem com duas linhas e retornamos <code>val</code>.</p>
<h3>Arquivos</h3>
<p><a href="http://murilo.codepad.org/cPQ482Qs">policies.hpp</a><br />
<a href="http://codepad.org/2f63mxfZ">divide.hpp </a><br />
<a href="http://codepad.org/sPFLKHC1">policies_example.cpp</a><br />
<a href="http://codepad.org/uK7K8o9y">user_error.cpp</a></p>
<h3>Referências</h3>
<p><a href="http://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/math_toolkit/policy.html">Boost Math Policies</a><br />
<a href="http://svn.boost.org/svn/boost/sandbox/SOC/2010/bits_and_ints/boost/integer/ilog2.hpp">ilog2 implementation</a><br />
<a href="http://www.boost.org/community/generic_programming.html#policy">Policy Classes On Generic Programming Techniques from Boost</a></p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/boost-2/'>Boost</a>, <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://murilo.wordpress.com/tag/boost/'>boost</a>, <a href='http://murilo.wordpress.com/tag/cpp/'>cpp</a>, <a href='http://murilo.wordpress.com/tag/cpp-idioms/'>cpp idioms</a>, <a href='http://murilo.wordpress.com/tag/ideias/'>ideias</a>, <a href='http://murilo.wordpress.com/tag/politicas/'>políticas</a>, <a href='http://murilo.wordpress.com/tag/policy/'>policy</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/363/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/363/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/363/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=363&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/07/29/politicas-de-controle-de-comportamento-em-cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>C++ Idioms: SFINAE</title>
		<link>http://murilo.wordpress.com/2010/06/19/c-idioms-sfinae/</link>
		<comments>http://murilo.wordpress.com/2010/06/19/c-idioms-sfinae/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 20:02:22 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[Boost]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[cpp idioms]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[SFINAE]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=353</guid>
		<description><![CDATA[Introdução Nesse post falarei sobre uma técnica (ou recurso) utilizada em  C++ que estou utilizando muito no meu projeto[0][1] na Boost Libraries[2] no GSoC, essa técnica é o SFINAE. SFINAE[3] é uma sigla para &#8220;Substitution failure is not an error&#8221; que em uma tradução livre quer dizer &#8220;Falha na substituição não é um erro&#8221;. Segundo[3]: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=353&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Introdução</h2>
<p>Nesse post falarei sobre uma técnica (ou recurso) utilizada em  C++ que estou utilizando muito no meu <a href="http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010/">projeto</a>[0][1] na <a href="http://www.boost.org">Boost Libraries</a>[2] no <a href="http://socghop.appspot.com/">GSoC</a>, essa técnica é o SFINAE.</p>
<p><a href="http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error">SFINAE</a>[3] é uma sigla para &#8220;<strong>Substitution failure is not an error&#8221; </strong>que em uma tradução livre quer dizer &#8220;Falha na substituição não é um erro&#8221;. Segundo[3]:</p>
<blockquote><p>SFINAE se refere a uma situação em C++ que uma substituição inválida de templates não é um erro.</p>
<p>Especificamente, na criação de um conjunto candidato para a resolução de sobrecarga, alguns (talvez todos) os candidatos deste conjunto pode ser resultante da substituição de argumentos templates deduzidos para os parâmetros de template. Se um erro ocorre durante a substituição, o compilador remove essa potencial sobrecarga do conjunto candidato ao invés de parar com um erro de compilação. Se restam um ou mais candidatos (i.é: pelo menos uma sobrecarga é válida), a resolução é feita e a invocação é bem formada.</p></blockquote>
<h2>Como funciona</h2>
<p>Para entender melhor vejamos esse trecho de código:</p>
<p><pre class="brush: cpp;">
template &lt;typename T&gt;
struct A
{
	typedef T type;
	T value;
};

template &lt;&gt;
struct A&lt;bool&gt;
{
};

template&lt;typename T&gt;
typename A&lt;T&gt;::type func(const A&lt;T&gt;&amp; param)
{
	std::cout &lt;&lt; param.value &lt;&lt; std::endl;
}
</pre></p>
<p>Esse código compila sem warnings. A função template <code>func()</code> é sobrecarregada e retorna o tipo <code>T</code>. Mas você deve estar se perguntando, o que acontece quando <code>T = bool</code>? Esse é justo o ponto do SFINAE!<br />
Para <code>T = bool</code>,  <code>typename A::type</code> seria uma declaração inválida já que <code>A</code> não contém o tipo <code>type</code> declarado, porém, com SFINAE, essa sobrecarga é simplesmente descartada e para qualquer outro <code>T</code> que não <code>bool</code>, <code>func(A)</code> é uma chamada legal porque sua sobrecarga é gerada.</p>
<h2>Aplicações</h2>
<p>Como eu disse no começo deste post eu estou utilizando bastante SFINAE no meu projeto do Google Summer of Code com uma utilidade chamada <a href="http://www.boost.org/doc/libs/1_43_0/libs/utility/enable_if.html">enable_if</a>[4] encontrado na Boost.</p>
<p>Enable_if é uma classe (ou struct) que &#8220;ativa&#8221; a declaração de algo (classe, função, etc) se uma condição for satisfeita por meio do SFINAE. Vou mostrar aqui uma maneira de fazer um enable_if like, e quem quiser saber mais sobre o enable_if da Boost é encorajado a ler[4][5].</p>
<p>Vamos ao código:</p>
<p><pre class="brush: cpp;">
/* Cond é a condição de ativação
 * Type é o tipo que será declarado pelo membro type.
 */
template &lt;bool Cond, typename Type = void&gt;
struct enable_if_c
{
	typedef Type type;
};

/*
 * Especialização, quando Cond for false,
 * 	esse template vazio é invocado.
 */
template &lt;typename Type&gt;
struct enable_if_c&lt;false, Type&gt;
{
	// empty
};
</pre></p>
<p>Ou seja, sempre quando <code>Cond</code> for <code>true</code>, existirá um membro <code>type</code> declarado em <code>enable_if_c</code>, quando <code>Cond</code> for <code>false</code> o membro <code>type</code> não existirá.</p>
<p>Um exemplo de uso:</p>
<p><pre class="brush: cpp;">
/*
 * Nossa função pega o bit mais significativo de value e retorna um bool.
 * 	***Note que nesse exemplo estamos assumindo que T é um tipo inteiro.***
 */

/*
 * Para retornar o bit mais significativo de um T com 4bytes (32 bits),
 * 	deslocamos 31 bits para a direita e fazemos um &amp; com 1.
 */
template &lt;typename T&gt;
typename enable_if_c&lt;sizeof(T) == 4, bool&gt;::type msb(T value)
{
	std::cout &lt;&lt; &quot;Value have 4 bytes.\n&quot;;
	return (value &gt;&gt; 31) &amp; T(1);
}

/*
 * Porém se T é um tipo de 1byte (8 bits) o deslocamento deve ser de
 * 	7 bits para pegarmos o bit mais significativo.
 */
template &lt;typename T&gt;
typename enable_if_c&lt;sizeof(T) == 1, bool&gt;::type msb(T value)
{
	std::cout &lt;&lt; &quot;Value have 1 byte.\n&quot;;
	return (value &gt;&gt; 7) &amp; T(1);
}
</pre></p>
<p>Ou seja, a função de cima, é sobrecarregada para todos os tipos que tenham 32 bits (<code>sizeof(T) == 4</code>) e a de baixo é sobrecarregada para todos os tipos que tenham 8 bits (s<code>izeof(T) == 1</code>). Assim, no processo de resolução de sobrecarga, os outros tipos que não tem nem 8 nem 32 bits, são descartadas pois cairá na especialização <code>enable_if_c</code> que não possui um membro <code>type</code> (usado como retorno da função <code>msb</code>), comportamento citado anteriormente.</p>
<p>Para testar:</p>
<p><pre class="brush: cpp;">
int main()
{
	int a = -3;
	unsigned b = 190000;
	char c = 129;
	uint16_t d = 10;
	uint64_t e = 10000000;
	
	std::cout &lt;&lt; &quot;Retorno int: &quot; &lt;&lt; msb(a) &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;Retorno unsigned: &quot; &lt;&lt; msb(b) &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;Retorno char: &quot; &lt;&lt; msb(c) &lt;&lt; std::endl;
}
</pre></p>
<p>Se tentarmos executar com uma condição que não é true, teremos um erro em tempo de compilação, como podemos ver abaixo:</p>
<p><pre class="brush: cpp;">
...
uint16_t d = 10;
uint64_t e = 10000000;

std::cout &lt;&lt; &quot;Ret: uint16_t: &quot; &lt;&lt; msb(d) &lt;&lt; std::endl
std::cout &lt;&lt; &quot;Ret: uint64_t: &quot; &lt;&lt; msb(e) &lt;&lt; std::endl;
...

/*
/Users/murilo/Documents/programming/blog/sfinae.cpp: In function ‘int main()’: /Users/murilo/Documents/programming/blog/sfinae.cpp:61: error: no matching function for call to ‘msb(uint16_t&amp;)’ 
/Users/murilo/Documents/programming/blog/sfinae.cpp:62: error: no matching function for call to ‘msb(uint64_t&amp;)’
*/
</pre></p>
<p>Alguns outros exemplos usando o enable_if da Boost você pode encontrar no meu <a href="https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer">projeto</a>[1] na Boost onde utilizo enable_if aos montes.</p>
<p>Nesse post exemplifiquei SFINAE com funções, mas também é aplicável para classes. Um exemplo você pode ver <a href="https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer/static_sign_extend.hpp">aqui</a> [6].</p>
<p>Até a próxima!</p>
<h3>Referências</h3>
<p>[0] &#8211; <a href="http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010">Estou no Google Summer of Code 2010</a> &#8211; http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010<br />
[1] &#8211; <a href="https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer">Source of Bits and Ints project</a> &#8211; https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer<br />
[2] &#8211; <a href="http://www.boost.org/">Boost C++ Libraries</a> &#8211; http://www.boost.org/<br />
[3] &#8211; <a href="http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error">Artigo &#8220;Substitution failure is not an error&#8221; na Wikipedia</a> &#8211; http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error<br />
[4] &#8211; <a href="http://www.boost.org/doc/libs/1_43_0/libs/utility/enable_if.html">Boost enable_if</a> &#8211; http://www.boost.org/doc/libs/1_43_0/libs/utility/enable_if.html<br />
[5] &#8211; <a href="http://www.boost.org/doc/libs/1_35_0/boost/utility/enable_if.hpp">enable_if.hpp</a> &#8211; http://www.boost.org/doc/libs/1_35_0/boost/utility/enable_if.hpp<br />
[6] &#8211; <a href="https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer/static_sign_extend.hpp">static_sign_extend.hpp at Boost Tra</a>c &#8211; https://svn.boost.org/trac/boost/browser/sandbox/SOC/2010/bits_and_ints/boost/integer/static_sign_extend.hpp</p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/boost-cc/'>Boost</a>, <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://murilo.wordpress.com/tag/boost/'>boost</a>, <a href='http://murilo.wordpress.com/tag/cpp-idioms/'>cpp idioms</a>, <a href='http://murilo.wordpress.com/tag/gsoc/'>gsoc</a>, <a href='http://murilo.wordpress.com/tag/sfinae/'>SFINAE</a>, <a href='http://murilo.wordpress.com/tag/tips/'>tips</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/353/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=353&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/06/19/c-idioms-sfinae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>Estou no Google Summer of Code 2010</title>
		<link>http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010/</link>
		<comments>http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010/#comments</comments>
		<pubDate>Mon, 03 May 2010 21:29:26 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[Boost]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=349</guid>
		<description><![CDATA[Olá pessoal. Esse ano fui um dos (2^10 + 4) selecionados para passar alguns meses programando nesse evento. O que é o Google Summer of Code? O Google Summer of Code (GS0C) é um programa realizado pela Google que consiste em incentivar o e divulgar o software livre entre os estudantes. A filosofia do GSoC é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=349&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal.<img class="alignright" title="GSoC2010" src="http://code.google.com/images/2010soclogo.jpg" alt="" width="300" height="267" /></p>
<p>Esse ano fui um dos <a href="http://socghop.appspot.com/gsoc/program/list_projects/google/gsoc2010" target="_blank">(2^10 + 4) selecionados</a> para passar alguns meses programando nesse evento.</p>
<h2>O que é o Google Summer of Code?</h2>
<p>O <a href="http://socghop.appspot.com/site/home/site" target="_blank">Google Summer of Code</a> (GS0C) é um programa realizado pela Google que consiste em incentivar o e divulgar o software livre entre os estudantes. A filosofia do GSoC é &#8220;flip bits not burgers&#8221; que é a de incentivar os estudantes em seu período de férias de verão (as nossas férias são no inverno) a programarem, não trabalhar por exemplo em fast-foods como é comum principalmente nos Estados Unidos.</p>
<p>Neste programa, a Google <strong>paga aproximadamente 5000 dólares </strong>para cada estudante que ao final do programa tenha completado seu projeto.<strong> </strong></p>
<p>Funciona assim: os estudantes escolhem uma ou mais organizações de software livre que foram aceitas pelo programa para trabalhar com elas. Aí o <strong>estudante</strong> tem que propor um projeto para essa organização que pode ser algo do tipo:</p>
<ul>
<li>Implementar uma nova ferramenta</li>
<li>Corrigir bugs</li>
<li>Documentar código</li>
<li>Melhorar o desempenho de alguma ferramenta</li>
<li>Portabilizar para alguma(s) plataforma(s)</li>
<li>Adicionar features à alguma ferramenta</li>
<li>etc.</li>
</ul>
<p>Feito isso, há uma seleção interna e logo é divulgado no site do GSoC a lista de aceitos.</p>
<p>Em seguida você tem uma pessoa alocada pela organização para te ajudar que chamamos de mentor.</p>
<p>Ao final do programa, além dos dólares a mais, o participante ganhará uma camiseta do programa e, no meu ver o mais importante, o certificado emitido pela Google atestando a sua participação.</p>
<h2>Eu no GSoC 2010</h2>
<p>Eu escolhi a <a href="http://www.boost.org/" target="_blank">Boost</a> que é um conjunto de bibliotecas para C++ (com bindings para Python) amplamente utilizada no mundo inteiro. Algumas bibliotecas Boost já foram inseridas no padrão C++ através do <a href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1" target="_blank">TR1</a> (e algumas outras serão inseridas no <a href="http://en.wikipedia.org/wiki/C%2B%2B0x" target="_blank">próximo padrão</a>) e por isso as bibliotecas Boost sejam talvez as mais respeitadas, digamos assim, bibliotecas para C++.</p>
<p>Minha proposta é implementar algoritmos rápidos para manipulação de dados binários em inteiros. Se você quiser saber como é a &#8220;cara&#8221; das coisas que terei que fazer, <a href="http://graphics.stanford.edu/~seander/bithacks.html" target="_blank">aqui</a> você encontra alguns dos algoritmos que implementarei.</p>
<p>Meu mentor chama-se Vicente J. Botet Escribá que parece ser uma bastante pró-ativa e que saca bastante e que tem um <a href="http://viboes.blogspot.com/" target="_blank">blog</a> com conteúdo bem interessante.</p>
<p>Ah, e parabéns ao Marcos Roriz meu colega de universidade que também teve seu projeto aprovado.</p>
<p>O abstract do meu projeto e do Marcos podem ser acessados <a href="http://www.inf.ufg.br/?noticia=1272632320&amp;site_id=1" target="_blank">aqui</a>.</p>
<p>Até mais!</p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/boost-2/'>Boost</a>, <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/cotidiano/'>Cotidiano</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/349/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/349/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/349/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=349&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/05/03/estou-no-google-summer-of-code-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>

		<media:content url="http://code.google.com/images/2010soclogo.jpg" medium="image">
			<media:title type="html">GSoC2010</media:title>
		</media:content>
	</item>
		<item>
		<title>Meta-Programação por Templates</title>
		<link>http://murilo.wordpress.com/2010/04/19/meta-programacao-por-templates/</link>
		<comments>http://murilo.wordpress.com/2010/04/19/meta-programacao-por-templates/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 14:41:23 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[meta-programação]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=341</guid>
		<description><![CDATA[Ultimamente estou me aventurando por essas terras misteriosas e estou fascinado. Segundo o Wikipedia[1] Meta-programação por templates (TMP ou Template metaprogramming) é: Template metaprogramming is a metaprogramming technique in which templates are used by a compiler to generate temporary source code, which is merged by the compiler with the rest of the source code and then compiled. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=341&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estou me aventurando por essas terras misteriosas e estou fascinado.</p>
<p>Segundo o Wikipedia[1] Meta-programação por templates (TMP ou Template metaprogramming) é:</p>
<blockquote><p><strong>Template metaprogramming</strong> is a metaprogramming technique in which templates are used by a compiler to generate temporary source code, which is merged by the compiler with the rest of the source code and then compiled. The output of these templates include compile-time constants, data structures, and complete function</p></blockquote>
<p>Ou seja TMP é uma técnica usada para<strong> gerar código-fonte </strong>em tempo de <strong>compilação</strong>. Isso quer dizer que, no momento da compilação, as chamadas à esse tipo de código são avaliadas, o código correspondente é gerado e o resultado já é conhecido, antes mesmo do programa ser executado!</p>
<h3>Uau!! Isso é perfeito! Resolverá todos meus problemas&#8230;</h3>
<p>Não é bem assim, como tudo é feito em tempo de compilação, os valores de entrada para esses algoritmos também devem ser conhecidos em tempo de compilação. Isso quer dizer que os valores de entrada <strong>devem ser constantes</strong>.</p>
<p>Eis um exemplo de código C++ usando essa abordagem:</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;

template&lt;int V&gt;
struct Int { enum { value = V }; }; // representa um valor inteiro

template&lt;int V&gt;
struct bin : Int&lt;(V % 10) + 2 * (bin&lt;V / 10&gt;::value)&gt; {}; // algoritmo recursivo

template&lt;&gt; struct bin&lt;0&gt; : Int&lt;0&gt; {}; // base da recursão

int main()
{
	std::cout &lt;&lt; &quot;1000b == &quot; &lt;&lt; bin&lt;1000&gt;::value &lt;&lt; &quot;d\n&quot;;
	std::cout &lt;&lt; &quot;10001b == &quot; &lt;&lt; bin&lt;10001&gt;::value &lt;&lt; &quot;d\n&quot;;
	std::cout &lt;&lt; &quot;111b == &quot; &lt;&lt; bin&lt;111&gt;::value &lt;&lt; &quot;d\n&quot;;
	std::cout &lt;&lt; &quot;10b == &quot; &lt;&lt; bin&lt;10&gt;::value &lt;&lt; &quot;d\n&quot;;
	
	return 0;
}
</pre></p>
<p>Como ainda estou aprendendo a respeito, vou finalizar esse post nesse código. Caso queiram discutir o tema em questão, sintam-se a vontade!</p>
<h5>Links:</h5>
<p>[1] <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Template_metaprogramming" target="_blank">Template Metaprogramming no Wikipedi</a><a title="Wikipedia" href="http://en.wikipedia.org/wiki/Template_metaprogramming" target="_blank">a<br />
</a><a href="http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s04.html" target="_blank">Outro material sobre TMP<br />
</a><a title="Boost MPL" href="http://www.boost.org/doc/libs/1_42_0/libs/mpl/doc/index.html" target="_blank">Boost MPL &#8211; biblioteca Boost que provê frameworks para meta-programação</a></p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://murilo.wordpress.com/tag/cpp/'>cpp</a>, <a href='http://murilo.wordpress.com/tag/meta-programacao/'>meta-programação</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/341/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=341&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/04/19/meta-programacao-por-templates/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>A importância de declarar os destrutores como virtual em C++</title>
		<link>http://murilo.wordpress.com/2010/02/12/a-importancia-de-declarar-os-destrutores-como-virtual-em-c/</link>
		<comments>http://murilo.wordpress.com/2010/02/12/a-importancia-de-declarar-os-destrutores-como-virtual-em-c/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 17:50:00 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=334</guid>
		<description><![CDATA[Funções Virtuais Depois de muito tempo sem postar algo aqui vou falar sobre um especificador do C++ que muitas vezes é esquecido: a keyword virtual. Essa keyword é utilizada para dizer que queremos que faça a avaliação da chamada dessa função em run-time, não em compile-time como é feito por padrão. Mas no que isso [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=334&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Funções Virtuais</h3>
<p>Depois de muito tempo sem postar algo aqui vou falar sobre um especificador do C++ que muitas vezes é esquecido: a keyword <code>virtual</code>.</p>
<p>Essa keyword é utilizada para dizer que queremos que faça a avaliação da chamada dessa função em run-time, não em compile-time como é feito por padrão.</p>
<h3>Mas no que isso pode ajudar?</h3>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;

struct base
{
	void funcao()
	{
		std::cout &lt;&lt; &quot;chamada da base\n&quot;;
	} 
	
	virtual void vfuncao()
	{
		std::cout &lt;&lt; &quot;chamada da base\n&quot;;
	}
};

struct derivada: public base
{
	void funcao()
	{
		std::cout &lt;&lt; &quot;chamada da derivada\n&quot;;
	} 
	
	void vfuncao()
	{
		std::cout &lt;&lt; &quot;chamada da derivada\n&quot;;
	}
};

int main()
{
	base* pt = new derivada;
	
	//nao virtual
	pt-&gt;funcao();
	
	//virtual
	pt-&gt;vfuncao();
	
	delete pt;
	
	return 0;
}
</pre></p>
<p>Saída:</p>
<pre style="background:#000;color:#FFF;padding:5px;">
chamada da base
chamada da derivada
</pre>
<p></p>
<p>Ou seja, quando uma função-membro (aka. método) é declarada como <code>virtual</code> na classe <code>base</code>, a checagem em run-time é feita e é possível encontrar a <code>vfuncao()</code> na classe
<pre>derivada</pre>
<p>, assim chamando a função correta, o que não acontece com <code>funcao()</code>: apesar de ter uma função-membro com mesmo nome na classe <code>derivada</code>, é chamada a <code>funcao()</code> da classe <code>base</code> porque o ponteiro que a referencia é do tipo da classe <code>base</code>. Pra isso serve a keyword <code>virtual</code> (êba, vamos usá-la daqui pra frente!).</p>
<h3>Mas e os destrutores virtuais?</h3>
<p>Segue a mesma idéia e com um agrave de risco eminente de memory leaks!<br />
Se na classe base não temos o destrutor declarado como <code>virtual</code>, temos um grande problema. Vejamos o exemplo:</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;

class base 
{
	int* ptr;
public:
	base()
	{
		ptr = new int;
	}
	
	~base() 
	{
		delete ptr;
		std::cout &lt;&lt; &quot;'destruindo' base\n&quot;;	
	}
};

class derivada: public base
{
	int* dptr;
public:
	derivada() {
		dptr = new int;
	}
	~derivada()
	{
		delete dptr;
		std::cout &lt;&lt; &quot;'destruindo' derivada\n&quot;;
	}
};

int main()
{
	base* pt = new derivada;
	delete pt;
}
</pre></p>
<p>Saída:</p>
<pre style="background:#000;color:#FFF;padding:5px;">
'destruindo' base
</pre>
<p></p>
<p>Como podemos ver, apenas o destrutor da classe <code>base</code> é chamado, deletando o ponteiro <code>ptr</code>. Mas e o <code>dptr</code> declarado em <code>derivada</code> e alocado em seu construtor? Leaked! Se perdeu!</p>
<p>A solução é declarar o destrutor da classe <code>base</code> como <code>virtual</code> e a mágica acontece.</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;

class base 
{
	int* ptr;
public:
	base()
	{
		ptr = new int;
	}
	
	virtual ~base() 
	{
		delete ptr;
		std::cout &lt;&lt; &quot;'destruindo' base\n&quot;;	
	}
};

class derivada: public base
{
	int* dptr;
public:
	derivada() {
		dptr = new int;
	}
	~derivada()
	{
		delete dptr;
		std::cout &lt;&lt; &quot;'destruindo' derivada\n&quot;;
	}
};

int main()
{
	base* pt = new derivada;
	delete pt;
}
</pre></p>
<p>Saída:</p>
<pre style="background:#000;color:#FFF;padding:5px;">
'destruindo' derivada
'destruindo' base
</pre>
<p></p>
<h3>Conclusão</h3>
<p>É aconselhável que seus destrutores sejam virtuais e que pondere nas outras funções, pois tudo que deixa de ser feito em compile-time e passa a ser feito em run-time, gera overhead na sua aplicação (é&#8230; nem tudo é maravilha). Até a próxima!</p>
<br />Filed under: <a href='http://murilo.wordpress.com/category/programacao/cc/'>C/C++</a>, <a href='http://murilo.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://murilo.wordpress.com/tag/cpp/'>cpp</a>, <a href='http://murilo.wordpress.com/tag/poo/'>poo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/334/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=334&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2010/02/12/a-importancia-de-declarar-os-destrutores-como-virtual-em-c/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>
	</item>
		<item>
		<title>Static Template Matrix &#8211; uma abordagem diferente</title>
		<link>http://murilo.wordpress.com/2009/10/12/static-template-matrix-uma-abordagem-diferente/</link>
		<comments>http://murilo.wordpress.com/2009/10/12/static-template-matrix-uma-abordagem-diferente/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 00:08:50 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Estruturas de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[matriz]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=296</guid>
		<description><![CDATA[Static Template Matrix? De fato eu nunca vi esse nome em outro lugar, mas foi o nome que eu pensei que se aproxima mais da implementação que veremos nesse post. Trata-se template de uma matriz (matrix) de duas dimensões de tamanho constante (static). Uma das diferenças dessa matriz é que ao invés de se usar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=296&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Static Template Matrix?</h3>
<p><a rel="attachment wp-att-40" href="http://murilo.wordpress.com/2008/10/01/converter-std-string-para-numero-e-vice-versa/cpp/"><img class="size-full wp-image-40 alignright" style="border:0;" title="C++" src="http://murilo.files.wordpress.com/2008/10/cpp.png?w=700" alt="C++"   /></a><br />
De fato eu nunca vi esse nome em outro lugar, mas foi o nome que eu pensei que se aproxima mais da implementação que veremos nesse post.</p>
<p>Trata-se template de uma matriz (matrix) de duas dimensões de tamanho constante (static). Uma das diferenças dessa matriz é que ao invés de se usar o convencional operator[] para acessar os elementos, nessa abordagem iremos utilizar o operator().</p>
<h3>Motivações</h3>
<p>Na realidade, não tem muito mais utilidades práticas do que matrizes normais. Pode ser que pode servir em algo para você. Então minha motivação é puramente de aprendizagem, principalmente da linguagem.</p>
<h3>matrix.h</h3>
<p><pre class="brush: cpp;">
#ifndef _CLASS_MATRIX_H__
#define _CLASS_MATRIX_H__

/**
 * matrix.h
 * Defines a template type 'matrix' wich is a constant-sized 2-dimensioned
 * 	matrix and generic typed elements.
 *
 * author: Murilo Adriano Vasconcelos
 * website: http://murilo.wordpress.com
 */

/**
 * T = value type
 * R = number of rows
 * C = number of columns
 */
template &lt;typename T, unsigned R, unsigned C&gt;
class matrix
{
    //data matrix
    T data[R][C];

public:
    //type of the current matrix
    typedef matrix&lt;T, R, C&gt; type;
    typedef T            value_type;

    //quantity of rows
    const unsigned rows;
    //quantity of columns
    const unsigned columns;

    //default ctor
    matrix(): rows(R), columns(C) {};

    /*ctor wich initializes the matrix filled
      with 'value' elements */
    matrix(const T&amp; value);

    //copy ctor: copies the matrix 'tocopy'
    matrix(const type&amp; tocopy);

    /*gets and/or set the value of the element
      in the row 'i', column 'j' */
    T&amp; operator()(unsigned i, unsigned j);

    /*gets the value of the element in the
      row 'i', column 'j' */
    const T&amp; operator()(unsigned i, unsigned j) const;

    //copy operator
    type&amp; operator=(const type&amp; tocopy);
};

/* class functions definition */

template &lt;typename T, unsigned R, unsigned C&gt;
matrix&lt;T, R, C&gt;::matrix(const matrix&amp; tocopy): rows(R), columns(C)
{
    for (unsigned i = 0; i &lt; R; i++)
        for (unsigned j = 0; j &lt; C; j++)
            data[i][j] = tocopy(i, j);
}

template &lt;typename T, unsigned R, unsigned C&gt;
matrix&lt;T, R, C&gt;::matrix(const T&amp; value): rows(R), columns(C)
{
    for (unsigned i = 0; i &lt; R; i++)
        for (unsigned j = 0; j &lt; C; j++)
            data[i][j] = value;
}

template &lt;typename T, unsigned R, unsigned C&gt;
matrix&lt;T, R, C&gt;&amp; matrix&lt;T, R, C&gt;::operator=(const matrix&amp; tocopy)
{
    for (unsigned i = 0; i &lt; R; i++)
        for (unsigned j = 0; j &lt; C; j++)
            data[i][j] = tocopy(i, j);

    return *this;
}

template &lt;typename T, unsigned R, unsigned C&gt;
T&amp; matrix&lt;T, R, C&gt;::operator()(unsigned i, unsigned j)
{
    return data[i][j];
}

template &lt;typename T, unsigned R, unsigned C&gt;
const T&amp; matrix&lt;T, R, C&gt;::operator()(unsigned i, unsigned j) const
{
    return data[i][j];
}

#endif
</pre></p>
<h3>main.cpp</h3>
<p><pre class="brush: cpp;">
#include &quot;matrix.h&quot; //our matrix
#include &lt;iostream&gt;  //cout'ing
#include &lt;string&gt;   //for strings

int main()
{
        //declares a 3x3 matrix filled with &quot;nil&quot;
        matrix&lt;std::string, 5, 5&gt; mat(&quot;nil&quot;);

        //modifies the value in the position (1, 1) to C++
        mat(1, 1) = &quot;C++&quot;;

        //we can use the const atribbutes rows and columns
        //to check our limits
        for (unsigned i = 0; i &lt; mat.rows; i++) {
                for (unsigned j = 0; j &lt; mat.columns; j++) {
                        //getting, setting the value of matrix elements
                        //is the same way
                        std::cout &lt;&lt; mat(i, j) &lt;&lt; ' ';
                }

                std::cout &lt;&lt; '\n';
        }

        std::cout &lt;&lt; '\n';

        matrix&lt;int, 3, 3&gt; ones(1), identity;
        //copy
        identity = ones;

        //so silly
        for (unsigned i = 0; i &lt; identity.rows; i++) {
                for (unsigned j = i; j &lt; identity.columns; j++) {
                        if (i != j) {
                                identity(i, j) = identity(j, i) = 0;
                        }
                }
        }

        for (unsigned i = 0; i &lt; identity.rows; i++) {
                for (unsigned j = 0; j &lt; identity.columns; j++) {
                        std::cout &lt;&lt; identity(i, j) &lt;&lt; ' ';
                }

                std::cout &lt;&lt; '\n';
        }

        return 0;
}
</pre></p>
<p>Como vocês puderam notar, a forma de acesso e modificação (get, set) dos elementos da matriz é da mesma forma. Outra coisa que podemos notar é que passamos o tipo e a quantidade de linhas e colunas direto no template. A quantidade de linha e colunas passada <span style="text-decoration:underline;">deve</span> ser uma constante.</p>
<p>Bom, até mais.</p>
<p><del datetime="2010-09-01T20:39:34+00:00"><strong><span style="color:#ff0000;">obs.:</span> Eu odeio profundamente o source highlight bugado do WordPress que converte todos os meus &lt; e &gt; e etc. para &amp;lt; &amp;gt;. Por isso os fontes acima não estão com hl.</strong></del></p>
<p>Fixed!</p>
<p>Agora sim, até mais.</p>
<br />Publicado em C/C++, Estruturas de Dados, Programação Tagged: cpp, matriz, template <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/296/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=296&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2009/10/12/static-template-matrix-uma-abordagem-diferente/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2008/10/cpp.png" medium="image">
			<media:title type="html">C++</media:title>
		</media:content>
	</item>
		<item>
		<title>Regional da Maratona de Programação 2009</title>
		<link>http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/</link>
		<comments>http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 01:31:00 +0000</pubDate>
		<dc:creator>Murilo Adriano</dc:creator>
				<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://murilo.wordpress.com/?p=238</guid>
		<description><![CDATA[Considerações Bem, eu ainda não tinha escrito nada sobre a fase regional da XIV Maratona de Programação que ocorreu dia 19 de setembro por falta de tempo e porque não havia recebido as fotos do evento. O primeiro ponto que quero destacar é a estrutura da regional aqui de Goiânia. Não deixou nada a desejar! [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=238&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Considerações</h2>
<p>Bem, eu ainda não tinha escrito nada sobre a fase regional da XIV Maratona de Programação que ocorreu dia 19 de setembro por falta de tempo e porque não havia recebido as fotos do evento.</p>
<p>O primeiro ponto que quero destacar é a estrutura da regional aqui de Goiânia. Não deixou nada a desejar! Ambiente ótimo, infra-estrutura boa, máquinas, espaço, equipamento, organização. Tenho que parabenizar os professores que organizaram o evento, principalmente os professores Humberto Longo e Cláudio Nogueira do INF-UFG.</p>
<p>Esse ano (2º da regional de Goiânia) participaram 11 equipes de 5 instituições: ALFA (1), IFG-Morrinhos (2), UEG (2), PUC-GO (3) e INF-UFG (3).</p>
<div id="attachment_242" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-242" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08272/"><img class="size-full wp-image-242" title="Local da competição" src="http://murilo.files.wordpress.com/2009/10/dsc08272.jpg?w=700" alt="Local da competição"   /></a><p class="wp-caption-text">Local da competição</p></div>
<h2>Antes&#8230;</h2>
<p>Na chegada das equipes, pude reencontrar vários amigos, principalmente da PUC-GO e aí os assuntos ficaram em dia (conversamos sobre computação, lógico). O clima estava típico de uma decisão mesmo: em um segunto estávamos conversando e rindo, no outro estávamos tensos e pensativos.</p>
<div id="attachment_244" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-244" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08250/"><img class="size-full wp-image-244" title="Galera no corredor" src="http://murilo.files.wordpress.com/2009/10/dsc08250.jpg?w=700" alt="Galera no corredor"   /></a><p class="wp-caption-text">Galera no corredor</p></div>
<p>Antes de começar o warm-up, tivemos uma &#8220;mini-palestra&#8221; sobre as regras da maratona e de como usar o sistema BOCA e entregas de credenciais, logins/senhas e das plaquinhas que identificam as equipes.</p>
<div id="attachment_243" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-243" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08191/"><img class="size-full wp-image-243" title="Antes do warm-up" src="http://murilo.files.wordpress.com/2009/10/dsc08191.jpg?w=700" alt="Antes do warm-up"   /></a><p class="wp-caption-text">Pré-warm-up</p></div>
<p style="text-align:left;">O warm-up foi tranquilo, só pra testes mesmo. Parece que houve um problema no julgamento do problema &#8220;Bolhas e Baldes&#8221; que posteriormente foi solucionado.</p>
<p style="text-align:left;">Fim de warm-up, fomos almoçar. Como o campus é uma cidade a parte, quase todo mundo almoçou no mesmo lugar, tendo calculado o menor caminho ou não <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h2 style="text-align:left;">Começa a maratona e aí vira tensão&#8230;</h2>
<p style="text-align:left;">Começa a competição e com 6 minutos, minha equipe (UFG &#8211; Monkeys) recebe o primeiro AC da competição: problema B &#8211; &#8220;Alarme&#8221;, Carlitos na implementação. Não sei dizer mas acho que esse foi um dos balões mais rápidos do Brasil.</p>
<p style="text-align:left;">Não demorou e nossa principal rival, a PUC-GO &#8211; Mother Focas, e a UFG &#8211; Sobrevientes do RU conseguiram também seus balões amarelos.</p>
<p style="text-align:left;">
<div id="attachment_255" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-255" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08331/"><img class="size-full wp-image-255" title="Focas" src="http://murilo.files.wordpress.com/2009/10/dsc08331.jpg?w=700" alt="Os Focas"   /></a><p class="wp-caption-text">Os Focas: Jackie, Divinera e Marciano</p></div>
<p style="text-align:left;">Até os 3 primeiros balões nós lideramos com uma certa vantagem no tempo. O problema foi quando os Focas conseguiram o quarto balão e nós não. Aí bateu aquele &#8220;caramba, agora fodeo!&#8221;. Aí focamos no problema (que por sinal era muito simples) e mandamos&#8230; Recebemos um NO bem grande e aí bateu o desespero. Consegui achar a lógica, conferi com meus colegas a corretude e, finalmente YES! Na hora olhamos para o Score que estava num telão na nossa frente e vimos que tinhamos passado os Focas (na verdade olhei o score mesmo assim deu um branco não saquei nada e tive que perguntar a nossa posição pra minha equipe [sic]).</p>
<div id="attachment_248" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-248" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08283/"><img class="size-full wp-image-248" title="Alguns balões" src="http://murilo.files.wordpress.com/2009/10/dsc08283.jpg?w=700" alt="Alguns balões"   /></a><p class="wp-caption-text">Alguns balões</p></div>
<p style="text-align:center;">
<p style="text-align:left;">Ficamos focados no problema G &#8211; &#8220;Registrador&#8221; e perdemos tempo, muito tempo [sic²]. Quando vimos, tinham 6 equipes com 4 balões, aí de novo bateu o pensamento &#8220;fodeo&#8221;&#8230;</p>
<p style="text-align:left;">No freeze, conseguimos formular um algoritmo pro E &#8211; &#8220;Dragster&#8221; mas aí já era tarde&#8230; Estávamos exaustos e não conseguimos codificá-lo. Enquanto isso, eu estava tentando ter a sacada do F &#8211; &#8220;Torres de Celular&#8221; (pô, tava na cara e eu não enxerguei). E o freeze-time foi isso: Diego e Carlos no Dragster (esse dava hein) e eu tentando algo no Torres de Celular.</p>
<p style="text-align:left;">
<div id="attachment_250" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-250" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08335/"><img class="size-full wp-image-250" title="Nosso quarto balão" src="http://murilo.files.wordpress.com/2009/10/dsc08335.jpg?w=700" alt="Nosso quarto balão"   /></a><p class="wp-caption-text">Nosso quarto balão. Monkeys: Murilo, Carlos e Diego</p></div>
<p style="text-align:left;">A cada vez que nós víamos alguem teclando algo no freeze, dava um frio na barriga. Tentamos fazer uns &#8220;cortes&#8221; no registrador e mandamos várias outras vezes.</p>
<h2 style="text-align:left;">Score Final</h2>
<p>Por um problema na rede (ou de juízes engraçadinhos), o score final demorou uma eternidade após a competição a ser apresentado a nós (aproximadamente 4min e 30seg). Anunciado o vencedor, só alegria.</p>
<div id="attachment_256" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-256" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08358/"><img class="size-full wp-image-256" title="Comemoração" src="http://murilo.files.wordpress.com/2009/10/dsc08358.jpg?w=700" alt="Comemoração"   /></a><p class="wp-caption-text">Comemoração</p></div>
<h2>Mais algumas fotos</h2>
<div id="attachment_254" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-254" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08326/"><img class="size-full wp-image-254" title="PUC-GO Bit a bit" src="http://murilo.files.wordpress.com/2009/10/dsc08326.jpg?w=700" alt="PUC-GO Bit a bit"   /></a><p class="wp-caption-text">PUC-GO Bit a bit: Douttor, Mauricinho e Loos</p></div>
<div id="attachment_253" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-253" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08325/"><img class="size-full wp-image-253" title="UFG - Sons of a Bit" src="http://murilo.files.wordpress.com/2009/10/dsc08325.jpg?w=700" alt="UFG - Sons of a Bit"   /></a><p class="wp-caption-text">UFG - Sons of a Bit: Nemo, Will e PC</p></div>
<div id="attachment_251" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-251" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08339/"><img class="size-full wp-image-251" title="UFG - Sobreviventes do RU" src="http://murilo.files.wordpress.com/2009/10/dsc08339.jpg?w=700" alt="UFG - Sobreviventes do RU"   /></a><p class="wp-caption-text">UFG - Sobreviventes do RU: Everton, Will e Lup</p></div>
<p><a rel="attachment wp-att-252" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08344/"><img class="aligncenter size-full wp-image-252" title="dsc08344" src="http://murilo.files.wordpress.com/2009/10/dsc08344.jpg?w=700" alt="dsc08344"   /></a></p>
<div id="attachment_258" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-258" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08342/"><img class="size-full wp-image-258" title="A única competidora" src="http://murilo.files.wordpress.com/2009/10/dsc08342.jpg?w=700" alt="A única competidora"   /></a><p class="wp-caption-text">A única competidora, o japa e o barba</p></div>
<div id="attachment_259" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-259" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08374/"><img class="size-full wp-image-259" title="Os melança" src="http://murilo.files.wordpress.com/2009/10/dsc08374.jpg?w=700" alt="Os melança"   /></a><p class="wp-caption-text">Os melança</p></div>
<h2>Premiação</h2>
<p>É&#8230; teve premiação com direito a reitor e tudo mais. Auditório cheio e prêmios para os vencedores <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As três primeiras equipes ganharam camisetas geeks, medalhas e trófeus além de um livro (alguns dos prêmios concedidos pela SistemasAbertos).</p>
<p>Nós da Monkeys ganhamos uma camiseta personalizada da Maratona de Programação, como essa abaixo do Longo branca.</p>
<div id="attachment_263" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-263" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc04099/"><img class="size-full wp-image-263" title="3º Lugar - UFG - Sons of a Bit" src="http://murilo.files.wordpress.com/2009/10/dsc04099.jpg?w=700" alt="3º Lugar - UFG - Sons of a Bit"   /></a><p class="wp-caption-text">3º Lugar - UFG - Sons of a Bit e o coach Humberto Longo</p></div>
<div id="attachment_264" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-264" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc04101/"><img class="size-full wp-image-264" title="2º Lugar - PUC-GO - MotherFocas" src="http://murilo.files.wordpress.com/2009/10/dsc04101.jpg?w=700" alt="2º Lugar - PUC-GO - MotherFocas"   /></a><p class="wp-caption-text">2º Lugar - PUC-GO - MotherFocas, pró-reitora de graduação e o coach Alexandre</p></div>
<div id="attachment_266" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-266" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc04103/"><img class="size-full wp-image-266" title="1º Lugar - UFG - Monkeys" src="http://murilo.files.wordpress.com/2009/10/dsc04103.jpg?w=700" alt="1º Lugar - UFG - Monkeys"   /></a><p class="wp-caption-text">1º Lugar - UFG - Monkeys, coach: Humberto Longo e o reitor</p></div>
<div id="attachment_262" class="wp-caption aligncenter" style="width: 650px"><a rel="attachment wp-att-262" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/pict0088/"><img class="size-full wp-image-262" title="MONKEYS" src="http://murilo.files.wordpress.com/2009/10/pict0088.jpg?w=700" alt="MONKEYS"   /></a><p class="wp-caption-text">MONKEYS</p></div>
<h2>E agora&#8230;</h2>
<div id="attachment_268" class="wp-caption aligncenter" style="width: 387px"><a rel="attachment wp-att-268" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/cartaz/"><img class="size-full wp-image-268" title="Final Nacional em Campinas" src="http://murilo.files.wordpress.com/2009/10/cartaz.jpg?w=700" alt="Final Nacional em Campinas"   /></a><p class="wp-caption-text">Final Nacional em Campinas</p></div>
<p>Rumo a Tóquio, ops, Harbin na China!! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a rel="attachment wp-att-269" href="http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/dsc08299/"><img class="size-full wp-image-269" title="Ballon Face" src="http://murilo.files.wordpress.com/2009/10/dsc08299.jpg?w=700" alt="Ballon Face"   /></a> </dt>
</dl>
</div>
<p>O <a title="Maratona" href="http://www.inf.ufg.br/maratona/" target="_blank">scoreboard, clarifications e etc podem ser visualizados aqui</a>.</p>
<br />Publicado em Cotidiano, Programação  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/murilo.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/murilo.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/murilo.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=murilo.wordpress.com&amp;blog=1790278&amp;post=238&amp;subd=murilo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://murilo.wordpress.com/2009/10/09/regional-da-maratona-de-programacao-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a8ec5d4d3fcc861186c1fe10bee806e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Murilo Adriano</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08272.jpg" medium="image">
			<media:title type="html">Local da competição</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08250.jpg" medium="image">
			<media:title type="html">Galera no corredor</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08191.jpg" medium="image">
			<media:title type="html">Antes do warm-up</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08331.jpg" medium="image">
			<media:title type="html">Focas</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08283.jpg" medium="image">
			<media:title type="html">Alguns balões</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08335.jpg" medium="image">
			<media:title type="html">Nosso quarto balão</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08358.jpg" medium="image">
			<media:title type="html">Comemoração</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08326.jpg" medium="image">
			<media:title type="html">PUC-GO Bit a bit</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08325.jpg" medium="image">
			<media:title type="html">UFG - Sons of a Bit</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08339.jpg" medium="image">
			<media:title type="html">UFG - Sobreviventes do RU</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08344.jpg" medium="image">
			<media:title type="html">dsc08344</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08342.jpg" medium="image">
			<media:title type="html">A única competidora</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08374.jpg" medium="image">
			<media:title type="html">Os melança</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc04099.jpg" medium="image">
			<media:title type="html">3º Lugar - UFG - Sons of a Bit</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc04101.jpg" medium="image">
			<media:title type="html">2º Lugar - PUC-GO - MotherFocas</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc04103.jpg" medium="image">
			<media:title type="html">1º Lugar - UFG - Monkeys</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/pict0088.jpg" medium="image">
			<media:title type="html">MONKEYS</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/cartaz.jpg" medium="image">
			<media:title type="html">Final Nacional em Campinas</media:title>
		</media:content>

		<media:content url="http://murilo.files.wordpress.com/2009/10/dsc08299.jpg" medium="image">
			<media:title type="html">Ballon Face</media:title>
		</media:content>
	</item>
	</channel>
</rss>
