<?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/"
	>

<channel>
	<title>Felipe Tonello &#187; Artigos</title>
	<atom:link href="http://felipetonello.com/blog/category/artigos/feed/" rel="self" type="application/rss+xml" />
	<link>http://felipetonello.com/blog</link>
	<description>Compartilhe, ajude e cresça</description>
	<lastBuildDate>Thu, 29 Jul 2010 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Problema 3n + 1 no UVa</title>
		<link>http://felipetonello.com/blog/2010/06/09/problema-3n-1-no-uva/</link>
		<comments>http://felipetonello.com/blog/2010/06/09/problema-3n-1-no-uva/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 04:28:44 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[desafios]]></category>
		<category><![CDATA[Matemática]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=262</guid>
		<description><![CDATA[Esse é um dos problemas mais simples que tem no UVa mas ao mesmo tempo é muito interessante. O problema 3n + 1, também chamado de Conjectura de Collatz, é um problema da matemática que nunca foi resolvido. Basicamente é o seguinte: Se o número é par, então divida por dois. Se o número é ímpar, [...]]]></description>
			<content:encoded><![CDATA[<p>Esse é um dos problemas mais simples que tem no UVa mas ao mesmo tempo é muito interessante. O <a title="The 3n + 1 problem no UVa" href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=29&amp;page=show_problem&amp;problem=36">problema 3n + 1</a>, também chamado de <a title="Collatz conjecture" href="http://en.wikipedia.org/wiki/Collatz_conjecture">Conjectura de Collatz</a>, é um problema da matemática que nunca foi resolvido.</p>
<p>Basicamente é o seguinte:</p>
<ul>
<li>Se o número é par, então divida por dois.</li>
<li>Se o número é ímpar, então multiplique por três e some por um.</li>
<li><img src="http://felipetonello.com/blog/wp-content/cache/tex_e8b68fc7245bcafe5083d2a67633c0aa.png" align="absmiddle" class="tex" alt="f(n) = \begin{cases} n/2 &amp;\mbox{se } n \equiv 0 \pmod{2}\\ 3n+1 &amp; \mbox{se } n\equiv 1 \pmod{2} \end{cases}" /></li>
</ul>
<p>Agora que temos a função definida, vamos realizar essa operação repetidamente, começando com um inteiro positivo e depois usando o resultado em cada passo:</p>
<p><img src="http://felipetonello.com/blog/wp-content/cache/tex_9c0ffc5ad934a56cc5901a45b4563abc.png" align="absmiddle" class="tex" alt="a_i = \begin{cases}n &amp; \mbox{para } i = 0 \\ f(a_{i-1}) &amp; \mbox{para } i &gt; 0. \end{cases}" /></p>
<p>O interessante é que essa seqüência parece sempre resultar em <img src="http://felipetonello.com/blog/wp-content/cache/tex_f07b42bd953c13cc8a80408ac049d7d2.png" align="absmiddle" class="tex" alt="a_i = 1" />.</p>
<h2>Programando</h2>
<p>O <a href="http://uva.onlinejudge.org/external/1/100.html">desafio enunciado no UVa Online Judge</a> pede para se contar o maior número de <a href="http://en.wikipedia.org/wiki/Collatz_conjecture#m-cycles">m-cíclos</a> em um determinado intervalo de inteiros <em>n, m</em>.</p>
<p>Como eu gosto de coisas simples, fiz um algoritmo em C bem simples. Não recomendo <a title="3n + 1 em C++" href="http://www.lukejduncan.com/2009/08/uva---100---3n1-problem.php">algoritmo complexos</a>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> collatz<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">%</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
			n <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #339933;">*</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">else</span>
			n <span style="color: #339933;">=</span> n<span style="color: #339933;">/</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">++</span>i<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> i<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #993333;">const</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d %d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>i<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>j<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #993333;">int</span> i2<span style="color: #339933;">,</span> j2<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
		<span style="color: #993333;">int</span> max <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&lt;</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			i2 <span style="color: #339933;">=</span> j<span style="color: #339933;">;</span>
			j2 <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			i2 <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
			j2 <span style="color: #339933;">=</span> j<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> i2<span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> j2<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>k<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #993333;">int</span> atual <span style="color: #339933;">=</span> collatz<span style="color: #009900;">&#40;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>max <span style="color: #339933;">&lt;</span> atual<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				max <span style="color: #339933;">=</span> atual<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d %d %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> max<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>ou pelo <a href="http://pastebin.com/F4kSgPvz">pastebin</a></p>
<p>Testando as seguintes entradas<br />
<code>1 10<br />
100 200<br />
201 210<br />
900 1000<br />
1 999999<br />
1000 900</code></p>
<p>temos<br />
<code>1 10 20<br />
100 200 125<br />
201 210 89<br />
900 1000 174<br />
1 999999 476<br />
1000 900 174</code></p>
<p>Parece tudo certo! <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Agora fica de exercício descobrir a complexidade desse algoritmo. <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2010/06/09/problema-3n-1-no-uva/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Analisando Número de Fibonacci e Recursividade</title>
		<link>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/</link>
		<comments>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 04:54:47 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Metemática]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=191</guid>
		<description><![CDATA[O número de Fibonacci é bem conhecido no mundo da computação. Ele é representado por uma função recursiva: Calculando Tendo isso em mente é bem fácil criar um algoritmo que calcule o número de Fibonacci, certo? Na internet normalmente encontramos um algoritmo usando um método de recursão simples. Algo parecido com: Felipe: Esse artigo usa [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://pt.wikipedia.org/wiki/Seq%C3%BC%C3%AAncia_de_Fibonacci">número de Fibonacci</a> é bem conhecido no mundo da computação. Ele é representado por uma função recursiva:<br />
<img class="alignnone size-medium wp-image-193" title="Representação da Função de Fibonacci" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fib-rec-300x55.png" alt="Fibonacci e Proporção áurea" width="300" height="55" /></p>
<h3>Calculando</h3>
<p>Tendo isso em mente é bem fácil criar um algoritmo que calcule o número de Fibonacci, certo?<br />
Na internet normalmente encontramos um algoritmo usando um método de recursão simples. Algo parecido com:</p>
<p><em>Felipe: Esse artigo usa apenas exemplos em C++</em></p>
<p><strong>fibo1.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> F<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> F<span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> F<span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> F<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><a href="http://pastebin.com/f2d429927">código no pastebin</a></p>
<p>Compilando:</p>
<blockquote><p>g++ -o fibo1 fibo1.cpp</p></blockquote>
<p>Rodando:</p>
<blockquote><p>./fibo1 8</p></blockquote>
<p>Deu 21, certo? Isso mesmo.</p>
<h3>Analisando a Função</h3>
<p>Mas digo para você: <strong>Não use esse programa!</strong> É totalmente ineficiente. O número de chamadas para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" /> é exatamente <img src="http://felipetonello.com/blog/wp-content/cache/tex_d355c47a1af9a7a9c8db72fe21a904b1.png" align="absmiddle" class="tex" alt="F_{N+1}" />. A função calcula recursivamente o mesmo número quantas vezes a chamar. Como podemos ver, a taxa de crescimento do número de Fibonacci tende a <a href="http://pt.wikipedia.org/wiki/Propor%C3%A7%C3%A3o_%C3%A1urea">Proporção áurea</a>:<br />
<img class="alignnone size-full wp-image-192" title="Fibonacci e Proporção áurea" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibfunc.png" alt="Fibonacci e Proporção áurea" width="350" height="75" /></p>
<p>Lembrando que a razão áurea é definida por:<br />
<img class="alignnone size-full wp-image-197" title="Razão áurea" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/phi.png" alt="Razão áurea" width="471" height="67" /></p>
<p>Sim, fibo1.cpp é uma função exponencial com <a title="Big Oh Notation" href="http://en.wikipedia.org/wiki/Big_O_notation">Big Theta Notation</a>, em função do tempo, de:<br />
<img class="alignnone size-full wp-image-195" title="Big Theta Notation 1" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibtheta2.png" alt="Big Theta Notation 1" width="129" height="54" /></p>
<p>O tempo de execução para computar <img src="http://felipetonello.com/blog/wp-content/cache/tex_d355c47a1af9a7a9c8db72fe21a904b1.png" align="absmiddle" class="tex" alt="F_{N+1}" /> é <img src="http://felipetonello.com/blog/wp-content/cache/tex_1904b0447484e5dc02146f97393f7c7d.png" align="absmiddle" class="tex" alt="\phi \approx 1,6" /> vezes mais demorado que para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" />. Por exemplo, já que <img src="http://felipetonello.com/blog/wp-content/cache/tex_347a548b9bfa501d8dfab29169fecd7a.png" align="absmiddle" class="tex" alt="\phi^{9} &gt; 60" /> e percebemos que nosso computador leva um segundo para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" />, então levará mais de um minuto para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_7b3288cde05e266c7d61a5619cb0a6a1.png" align="absmiddle" class="tex" alt="F_{N+9}" /> e mais de uma hora para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_2b345505aa2c1af734e633dd36a31af3.png" align="absmiddle" class="tex" alt="F_{N+18}" />.</p>
<p>Podemos verificar isso calculando <img src="http://felipetonello.com/blog/wp-content/cache/tex_f3e5a57b2417abcd21aae1d52825fdc3.png" align="absmiddle" class="tex" alt="F_{36}" /> e <img src="http://felipetonello.com/blog/wp-content/cache/tex_7d434a0da3291d6176b65638e4fb7b44.png" align="absmiddle" class="tex" alt="F_{45}" /></p>
<blockquote><p>pet@felipe-opensuse:~/Projetos/C++/algoritmos> time ./fibo1 36<br />
14930352                                                           </p>
<p>real    0m1.077s<br />
user    0m1.040s<br />
sys     0m0.008s<br />
pet@felipe-opensuse:~/Projetos/C++/algoritmos> time ./fibo1 45<br />
1134903170                                                         </p>
<p>real    0m54.927s<br />
user    0m54.547s<br />
sys     0m0.092s </p></blockquote>
<p>Em contraste, usando o método de <a href="http://en.wikipedia.org/wiki/Dynamic_programming">programação dinâmica</a> temos um tempo proporcional a N.</p>
<h3>Programação dinâmica</h3>
<p>Esse método consiste em guardar os valores dos números já calculados em um array. Fazendo isso, apenas checamos se o array já foi memorizado, e então retornamos o número, caso contrário calculamos recursivamente e assim por diante.<br />
Lembrando que para um int de 32 bits, <img src="http://felipetonello.com/blog/wp-content/cache/tex_24597c0d5e316e6f858b30f758a6b563.png" align="absmiddle" class="tex" alt="F_{46} = 1836311903" /> será o maior numero a ser calculado.</p>
<p><strong>fibo2.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;cstdlib&gt;</span>
&nbsp;
namespace Fibonacci <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>memory<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> F<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// int inicializa como 0</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> aux <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> aux <span style="color: #339933;">=</span> F<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> F<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> aux<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">memory</span> <span style="color: #339933;">=</span> new <span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    std<span style="color: #339933;">::</span><span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">F</span><span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    delete <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">memory</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><a href="http://pastebin.com/f12eb1fa0">código no pastebin</a></p>
<p>Compilando:</p>
<blockquote><p>g++ -o fibo2 fibo2.cpp</p></blockquote>
<p>Rodando:</p>
<blockquote><p>./fibo2 8</p></blockquote>
<p>Deu 21, de novo? =)</p>
<p>Aplicamos aqui uma técnica chamada <em>bottom-up dynamic programming</em>. Se aplica em uma função recursiva que podemos salvar tempo por armazenar valores anteriores que serão usados depois. Essa técnica tem sido usada para uma gama grande de algoritmos e aplicações. E essa simples mudança fez com que nosso algoritmo passasse de exponencial para linear.</p>
<p>Agora temos uma função, em relação ao tempo, proporcional ao N.<br />
<img src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibtheta21.png" alt="Big Theta Notation 2" title="Big Theta Notation 2" width="113" height="50" class="alignnone size-full wp-image-198" /></p>
<h3>Comparando</h3>
<p>Fazendo vários testes, podemos chegar em uma tabela de resultados, em função do <strong>tempo</strong>:</p>
<table>
<tr>
<th>arquivo</th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_cb09d855eefea0dc3acd2127f86fa324.png" align="absmiddle" class="tex" alt="F_{8}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_f3e5a57b2417abcd21aae1d52825fdc3.png" align="absmiddle" class="tex" alt="F_{36}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_7d434a0da3291d6176b65638e4fb7b44.png" align="absmiddle" class="tex" alt="F_{45}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_58915190e9ff27470c85b6ddaaad35fe.png" align="absmiddle" class="tex" alt="F_{46}" /></th>
</tr>
<tr>
<td>fibo1.cpp</td>
<td>0m0.009s</td>
<td>0m1.156s</td>
<td>0m54.927s</td>
<td>1m29.403s</td>
</tr>
<tr>
<td>fibo2.cpp</td>
<td>0m0.007s</td>
<td>0m0.007s</td>
<td>0m0.006s</td>
<td>0m0.007s</td>
</tr>
</table>
<p>fibo2.cpp é constante? Sim! Para N relativamente pequeno <strong>fibo2.cpp</strong> calcula em tempo constante.</p>
<p>Será interessante ver até quanto esse algoritmo agüenta(ta errado né? hehe ¬¬) fazer em tempo constante. Alguém se habilita?</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Josephus Problem, resolvendo-o de maneira simples</title>
		<link>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/</link>
		<comments>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 18:40:28 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Metemática]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=156</guid>
		<description><![CDATA[Josephus Problem é um problema bem legal que estudei no livro Concrete Mathematics. Josephus foi um historiador judeu do primeiro século. A lenda conta que ele e 40 de seus homens estavam presos em uma caverna pelos Romanos. Eles decidiram suicidar-se à ser capturados. Formaram um circulo e começaram a se matar, da 3ª à [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Josephus_problem">Josephus Problem</a> é um problema bem legal que estudei no livro <a href="http://www.amazon.com/Concrete-Mathematics-Foundation-Computer-Science/dp/0201558025">Concrete Mathematics</a>.</p>
<p><a href="http://en.wikipedia.org/wiki/Flavius_Josephus">Josephus</a> foi um historiador judeu do primeiro século. A lenda conta que ele e 40 de seus homens estavam presos em uma caverna pelos Romanos. Eles decidiram suicidar-se à ser capturados. Formaram um circulo e começaram a se matar, da 3ª à 3ªa pessoa em ordem da fila. Como Josephus não queria morrer, ele foi capaz de escolher o melhor lugar, afim de sobreviver, e juntar-se os Romanos que o capturaram.</p>
<h3>O Problema</h3>
<p>Na prática o problema teria <em>N</em> pessoas em um círculo, iria ser percorrido <em>M &#8211; 1</em> pessoas e o <em>M</em> iria ser morto, assim por diante, até sobrar uma única pessoa.</p>
<h3>A Solução</h3>
<p>Podemos representar a solução por uma função recursiva, para <em>N par e M = 2</em>:</p>
<p><img class="alignnone size-full wp-image-157" title="Josephus Problem" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/josephus1.png" alt="" width="160" height="21" /></p>
<p>e para N ímpar e <em>M = 2</em>, temos:</p>
<p><img class="alignnone size-full wp-image-158" title="Josephus Problem" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/josephus2.png" alt="" width="194" height="21" /></p>
<p>Não vou postar a solução genérica aqui pois exige uma grande explicação e esse não é o objetivo do post. Você pode ver na <a href="http://en.wikipedia.org/wiki/Josephus_problem">wikipedia</a> ou então comprar o <a href="http://www.amazon.com/Concrete-Mathematics-Foundation-Computer-Science/dp/0201558025">livro</a>, caso queria saber mais.</p>
<p>O interessante é que o algoritmo para solução genérica é bem simples em C++. Usando <a href="http://en.wikipedia.org/wiki/Linked_list">listas ligadas(linked lists)</a> é simples, fácil de entender e super rápido a execução do programa.</p>
<p><strong>Josephus.cpp</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> Pessoa <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> num<span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>prox<span style="color: #008080;">;</span>
	Pessoa<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, Pessoa <span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		num <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
		prox <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #666666;">//'a' recebe primeira pessoa criada</span>
	<span style="color: #666666;">//e 'a' é linkado para si mesmo</span>
	<span style="color: #666666;">//depois 'b' é criado apontado para 'a'</span>
	<span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>, M <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>a <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Pessoa<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	a<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>b <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">// Aloca na memória todas as pessoas</span>
	<span style="color: #666666;">// e 'b' recebe a última(enésima pessoa)</span>
	<span style="color: #666666;">// pois a contagem começa pela primeira('a')</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> N<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
		b <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Pessoa<span style="color: #008000;">&#40;</span>i, a<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">// Loop enquanto 'b' não estiver apontado</span>
	<span style="color: #666666;">// o próximo para ele mesmo</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>b <span style="color: #000040;">!</span><span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #666666;">// 'b' recebe a emésima pessoa</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> M<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
			b <span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		a <span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> a<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">delete</span> a<span style="color: #008080;">;</span> <span style="color: #666666;">// 'a' é morto =/</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">// O sobrevivente _o/</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>num <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Ou então se preferir um link para o <a href="http://pastebin.com/f45d06530">pastebin</a>.</p>
<h3>Analisando o Resultado</h3>
<p>após compilar</p>
<blockquote><p>g++ -o Josephus Josephus.cpp</p></blockquote>
<p>rode o programa com N = 10 e M = 2</p>
<blockquote><p>./Josephus 10 2</p></blockquote>
<p>O valor deu 5? Verifique com a função. Bateu os valores?<br />
Agora vá testando para 1 &lt;= N &lt;= 16 e M = 2.</p>
<blockquote><p>for n in `seq 16`; do echo -n &#8220;$n: &#8220;; ./Josephus $n 2; done</p></blockquote>
<p>Saída do loop:</p>
<blockquote><p>1: 1<br />
2: 1<br />
3: 3<br />
4: 1<br />
5: 3<br />
6: 5<br />
7: 7<br />
8: 1<br />
9: 3<br />
10: 5<br />
11: 7<br />
12: 9<br />
13: 11<br />
14: 13<br />
15: 15<br />
16: 1</p></blockquote>
<p>Perceberam um certo padrão entre as respostas? A função genérica usa justamente esse padrão binário para solução.</p>
<p>Ultimamente eu estou mais dedicado ao estudo de algoritmos, C++, C e Python(é claro). Depois pretendo postar uma analise desse algoritmo passo a passo.</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nóis é muito burro!</title>
		<link>http://felipetonello.com/blog/2008/07/17/nois-e-muito-burro/</link>
		<comments>http://felipetonello.com/blog/2008/07/17/nois-e-muito-burro/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:59:26 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/2008/07/17/nois-e-muito-burro/</guid>
		<description><![CDATA[Esse é meio que um desabafo e engraçado ao mesmo tempo A história começa quando vim para o Canadá para trabalhar com Java e no fim das contas comecei a trabalhar com ASP.NET. Eu não tenho nada contra ASP.NET, pelo contrário, é uma ótima tecnologia. Mas o problema é que aqui na empresa onde trabalho, [...]]]></description>
			<content:encoded><![CDATA[<p>Esse é meio que um desabafo e engraçado ao mesmo tempo <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>A história começa quando vim para o Canadá para trabalhar com Java e no fim das contas comecei a trabalhar com ASP.NET. Eu não tenho nada contra ASP.NET, pelo contrário, é uma ótima tecnologia.<br />
Mas o problema é que aqui na empresa onde trabalho, eles não utilizam meu potencial(não que eu tenha muito). Aqui eu fico arrumando layout e controller ASP.NET, tabulando, fazendo relatórios e assim por diante. <strong>PELO AMOR NÉ?</strong><br />
E eu percebi que estava <em>enferrujando</em> em programação, prática e inclusive meu conhecimento.</p>
<p>Mas tudo bem. 5 Meses passaram&#8230;</p>
<p>Quando eu e o <a href="http://www.rubz.org/">Luiz Vitor</a> estavamos resolvendo o exercício do Alien Numbers (Google Code Jam 2007). E depois de 5 horas conseguimos hehe aquela alegria!!!</p>
<blockquote><p><strong>from __future__ import alien_number</strong></p></blockquote>
<p>Aí começamos a fazer do <a href="http://en.wikipedia.org/wiki/Maze">Maze</a>(Labirinto). Tentamos, tentamos, tentamos e aí não deu mais tempo porque comecou o <a href="http://code.google.com/codejam">Google Code Jam 2008</a>.</p>
<p>Os 2 primeiros exercícios da primeira fase eram fáceis. Um era sobre serach engine e outro era de esquema de trens. Não era necessários algoritmos complexos para resolver, apenas lógica.<br />
Aí tudo bem, comecei a fazer o primeiro. Depois de uns 15 minutos entendi o que era para fazer e fui jantar. Jantando fui pensando o que iria fazer para resolver o problema. E tinha chegado numa conclusão simples.<br />
Cheguei no meu computador e fui começar meu código. Em 30 min +- mandei minha versão e <strong>bééééééé</strong>: ERRADO. Aí fui repensar e vi o que estava errado e mandei de novo: <strong>bééééééé</strong>.<br />
Aí comecei a ficar <em>encucado</em>. E em quanto isso o Bruno Gola e Lameiro já tinham resolvido. E eu e o Luiz nos elogiando: <strong><em>&#8220;Cara, nós somos muito burros!!!! hahahah&#8221;</em> <em>&#8220;Eu sou uma porta, pelo amor!!!&#8221;</em></strong></p>
<p>Hoje comecei o exercício dos <strong>treins</strong>. Mais fácil do que o primeiro. Entendi a lógica, comecei a <em>codar</em>. E <strong>NADA</strong> hehehe Fiz um monte de coisa, vários davam certo mas uns davam errado e percebi de novo que era erro de código. Aí agora desisti já, <strong>nóis é muito burro</strong> e ano que vêm estamos aí. Só agora vou estudar muito! <a title="Lista de 10 Livros por Ricardo" href="http://www.ricbit.com/2008/06/como-aprender-computao.html">Comprei uns livros feras d+ de algoritmos</a>, que por sinal recomendo a todos que querem ser bons programadores!</p>
<p>Mas falando a verdade, o <a href="http://blog.brunogola.com.br/">Bruno Gola</a> e o <a href="http://lameiro.wordpress.com/">Lameiro</a> e inclusive o Luiz são muito bons, muito melhor que eu. Mas eu fiquei injuriado pelo fato de eu não ter conseguido <em>CODAR</em> esses problemas, que estavam resolvidos na minha cabeça.</p>
<p>E agora a moral da história, voltando ao começo do post.</p>
<blockquote><p>Nunca, mas NUNCA, vá trabalhar em um lugar(ou o que seja) onde não te estimulem e exija seu potencial! NUNCA</p></blockquote>
<div class="wp-caption alignleft" style="width: 109px"><img title="Poison" src="http://felipetonello.com/blog/wp-content/uploads/2008/07/poison.jpg" alt="" width="99" height="82" /><p class="wp-caption-text">Poison</p></div>
<p>Sinceramente, se eu não tivesse para mudar de empresa agora no final do mês, eu largava tudo aqui, tudo mesmo. E voltava para o Brasil.<br />
Prefiro ser pobre, morar num lugar onde a política é sinônimo de palhaçada, ao que desaprender tudo e ser um inútil.</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2008/07/17/nois-e-muito-burro/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8220;Eu vou virar freelancer&#8221; &#8211; Já pensaram isso?</title>
		<link>http://felipetonello.com/blog/2008/06/24/eu-vou-virar-freelancer-ja-pensaram-isso/</link>
		<comments>http://felipetonello.com/blog/2008/06/24/eu-vou-virar-freelancer-ja-pensaram-isso/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 15:40:30 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=134</guid>
		<description><![CDATA[Conversando com o Jader fui inspirado a escrever esse post. Muitos, assim como eu, tiveram essa grande idéia de virar freelancer. Ser seu próprio chefe, escolher seus trabalhos, trabalhar com o que gosta, são idéias atrativas né? Mas tudo o que é bom pode ficar ruim, ou péssimo! Por que estou falando isso? Não é [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-135" style="float:left" title="Freelancer" src="http://felipetonello.com/blog/wp-content/uploads/2008/06/freelancedvdweb-222x300.jpg" alt="Freelancer" width="222" height="300" /></p>
<p>Conversando com o <a href="http://www.plurk.com/user/jader">Jader</a> fui inspirado a escrever esse post.</p>
<p>Muitos, assim como eu, tiveram essa grande idéia de virar freelancer. Ser seu próprio chefe, escolher seus trabalhos, trabalhar com o que gosta, são idéias atrativas né?<br />
Mas tudo o que é bom pode ficar ruim, ou péssimo!<br />
Por que estou falando isso? Não é para assustar não, mas para você refletir sobre sua situação.</p>
<p>Perguntas para reflexão:<br />
- Você já possui um trabalho? Você não gosta dele? Você têm benefícios(refeição, seguro, saúde &#8230;)?<br />
<em>Lembrete: como freelancer você não terá mais nada disso</em></p>
<p>- O que te faz pensar que como freelancer será melhor?<br />
- Contato é a coisa mais importante para um freelancer, você têm bons contatos?<br />
- Você é responsável? Cumpre horário? É disciplinado?<br />
<em>Lembrete: Você terá que acordar cedo, se policiar em msn/plurk/twitter</em></p>
<p>- Têm responsabilidades para com família? O que eles esperam de você?</p>
<p>- Está disposto a correr os riscos?<br />
Se você responder que sim. Espero que seja o melhor!<br />
É um desafio e não é dos fáceis. Mas pode trazer ótimos frutos e realizações.</p>
<p><img class="alignright size-medium wp-image-136" title="Freelancer" src="http://felipetonello.com/blog/wp-content/uploads/2008/06/image-freelance.jpg" alt="Freelancer" width="273" height="285" /></p>
<p>Freelancer é uma boa, eu fui por 6 meses. Aprendi bastante, ralei bastante. Fiz palestras, projetos opensource, ajudei em projetos e etc. Foi muito proveitoso para mim. Mas no meu caso o que me atrapalhou foi a questão da disciplina.</p>
<p>Então, antes de tomar uma decisão pense! pense muito! E sejamos todos felizes! <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>E você? É freelancer? Relate sua experiência e dicas!</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2008/06/24/eu-vou-virar-freelancer-ja-pensaram-isso/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Você gosta do seu emprego? Em busca do emprego perfeito?</title>
		<link>http://felipetonello.com/blog/2008/05/29/voce-gosta-do-seu-emprego-em-busca-do-emprego-perfeito/</link>
		<comments>http://felipetonello.com/blog/2008/05/29/voce-gosta-do-seu-emprego-em-busca-do-emprego-perfeito/#comments</comments>
		<pubDate>Thu, 29 May 2008 16:18:05 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Diversos]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/2008/05/29/voce-gosta-do-seu-emprego-em-busca-do-emprego-perfeito/</guid>
		<description><![CDATA[É impressionante como todo mundo que se forma em uma faculdade sai com aquela esperança de revolucionar o mundo, criar uma empresa como o Google ou até mesmo ir para lá como desenvolvedor super power em Python. É, dizem que nada é impossível mesmo. Mas até quando temos que ficar sonhando? Bom, apesar de ter [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://www.cheeplinux.com/images/images_big/lovelinux.jpg" alt="I Love Linux" width="114" height="108" />É impressionante como todo mundo que se forma em uma faculdade sai com aquela esperança de revolucionar o mundo, criar uma empresa como o Google ou até mesmo ir para lá como desenvolvedor super power em Python.</p>
<p>É, dizem que nada é impossível mesmo. Mas até quando temos que ficar sonhando?</p>
<p>Bom, apesar de ter menos de 2 anos de experiência eu já trabalhei em 4 empresas, desde pequenas até gigantes. Sempre tentando achar um emprego perfeito.</p>
<p>Como você define algo bom? Salário? Benefícios? Projetos? Tecnologia usada? Aprendizado?</p>
<p>Para nós que somos geeks(linuxeros) isso é mais difícil ainda! Gostamos de Python, PHP, Linux, Vim etc etc. Mas muitas vezes temos que engulir seco por trabalhar com ASP.NET (meu caso).<br />
É, estou me cansando de novo. Não gosto da environment de trabalho, do projeto e principalmente da tecnologia usada. Meu direito, certo?</p>
<p>Mas até onde compensa ficar pulando de trabalho em trabalho, tentando achar algo que você se adapte? Ou então trabalhar por conta?<br />
Muitas vezes você não pode fazer isso. Por falta de oportunidade ou &#8220;simplesmente&#8221; responsabilidades a cumprir.</p>
<p><img class="alignleft" style="float: left;" src="http://farm1.static.flickr.com/162/424322458_3fdf529875_m.jpg" alt="Python Powered" align="left" />Bom, eu já estava deixando essa coisa de ter emprego perfeito de lado. Até que me apareceu uma <a href="http://www.savoirfairelinux.com/">oportunidade para trabalhar</a> com Linux, Python, PHP, C++/Qt GTK. Tudo opensource. Parece até um sonho. Aceitei na hora!</p>
<p>Mas e você? Acha que um dia vai para ser um <a href="http://www.python.org/%7Eguido/">Guido van Rossum</a> do Google? O que faz para que isso um dia possa ser realizado? Vale a pena lutar por isso? Ou, talvez, não esquenta cabeça mais com isso?</p>
<p><em>Aqui eu dei um exemplo pessoal, mas não necessariamente você gosta de Linux.</em></p>
<p>Conte sua história <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2008/05/29/voce-gosta-do-seu-emprego-em-busca-do-emprego-perfeito/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>RobotQt &#8211; Simulador de robôs autônomos</title>
		<link>http://felipetonello.com/blog/2008/04/23/robotqt-simulador-de-robos-autonomos/</link>
		<comments>http://felipetonello.com/blog/2008/04/23/robotqt-simulador-de-robos-autonomos/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 18:24:17 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Diversos]]></category>
		<category><![CDATA[Projetos]]></category>
		<category><![CDATA[RobotQt]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=130</guid>
		<description><![CDATA[É com grande euforia que anuncio o novo projeto que eu, Leandro Lameiro, Leandro Guilherme e Luiz Cardoso estamos planejando: RobotQt. Mas o que será esse projeto? RobotQt será um projeto com foco educativo e acadêmico. Com esse software, o usuário poderá simular sua programação autônoma de seu robô. Por exemplo em projeto como o [...]]]></description>
			<content:encoded><![CDATA[<p>É com grande euforia que anuncio o novo projeto que eu, <a href="http://lameiro.wordpress.com/">Leandro Lameiro</a>, Leandro Guilherme e <a href="http://rubz.org/">Luiz Cardoso</a> estamos planejando: <a href="http://code.google.com/p/robotqt/">RobotQt</a>.</p>
<h3>Mas o que será esse projeto?</h3>
<p>RobotQt será um projeto com foco educativo e acadêmico. Com esse software, o usuário poderá simular sua programação autônoma de seu robô. Por exemplo em projeto como o <a href="http://www.brfirst.org/">FIRST</a>.</p>
<h3>Objetivo do projeto</h3>
<p>Temos como o objetivo principal(por enquanto) motivar e incentivar o uso da robótica em escolas e universidades. Com o nosso software não será preciso ter um hardware físico para fazer testes. Outro fator positivo é que iremos portar nosso software para Windows, Mac e Linux.</p>
<h3>Como funciona?</h3>
<p>A idéia inicial(depois explico o porquê inicial) do projeto é fazer com que um usuário configure seu robôzinho com motores e sensores. Fazendo assim testes de uso dos sensores e motores.<br />
O legal disso é que a engine pode ser estendida, fazendo com que você possa crias suas próprias classes. Exemplo: Você vai usar um tipo de sensor que não tem por padrão no software, então é só extender a classe abstrata <em>Sensor</em> e criar o seu próprio.<br />
A parte mais legal do projeto é a programação da parte autônoma. Isso será feito com <a href="http://www.lua.org/">Lua</a>(incentivo ao software livre brasileiro <img src='http://felipetonello.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Todos os sensores e motores será acessado pelo seu programinha feito em Lua. Podendo fazer testes, loops e tudo que um autônomo têm direito.</p>
<p>Para o futuro do projeto, pretendemos suportar um maior numero de padrões de robótica e também hardware. Além da dar suporte para Python.<br />
E pelo fato de ser software livre, acreditamos ter um suporte muito bom da comunidade e principalmente com código para dar uma maior extensão ao nosso suporte à sensores, etc.</p>
<h3>Desenvolvimento</h3>
<p>Projeto será desenvolvido com <a href="http://pt.wikipedia.org/wiki/C%2B%2B">C++</a> e <a href="http://trolltech.com/products/qt">Qt4</a>. Terá suporte a scripting em Lua.<br />
E estamos também participando no <a href="http://www.qtcentre.org/contest-">Qt-Contest</a>.</p>
<h3>Quer ajudar no projeto?</h3>
<p>Ainda não temos nenhum release, estamos em fase de planejamento. Mas todo tipo de ajuda será bem vinda!<br />
<a href="http://code.google.com/p/robotqt/" alt="RobotQt - Robot Simularion">Acesse o site do projeto!</a></p>
<p>Fiquem atentos, vou sempre estar postando mais sobre o projetinho.</p>
<p>Technorati Tags: <a class="performancingtags" rel="tag" href="http://technorati.com/tag/RobotQt">RobotQt</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/C++">C++</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Qt">Qt</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Robot">Robot</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Simulation">Simulation</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Opensource">Opensource</a></p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2008/04/23/robotqt-simulador-de-robos-autonomos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Slackware 12 e roteadores, como conectar via fio?</title>
		<link>http://felipetonello.com/blog/2008/01/31/slackware-12-e-roteadores-como-conectar-via-fio/</link>
		<comments>http://felipetonello.com/blog/2008/01/31/slackware-12-e-roteadores-como-conectar-via-fio/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 04:02:24 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Slackware]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/2008/01/31/slackware-12-e-roteadores-como-conectar-via-fio/</guid>
		<description><![CDATA[Galera, vamos ver que é bem fácil conectar à um roteador usando o slackware 12. No caso aqui em casa usamos 2 computadores conectados por fio e 1 sem fio. Se você já conectou tudo certinho no roteador, só falta o nosso slack reconhecer basta fazer assim: # ifconfig eth1 192.168.0.4 netmask 255.255.255.0 up # [...]]]></description>
			<content:encoded><![CDATA[<p>Galera, vamos ver que é bem fácil conectar à um roteador usando o slackware 12.</p>
<p>No caso aqui em casa usamos 2 computadores conectados por fio e 1 sem fio.</p>
<p>Se você já conectou tudo certinho no roteador, só falta o nosso slack reconhecer basta fazer assim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ifconfig eth1 192.168.0.4 netmask 255.255.255.0 up</span>
<span style="color: #666666; font-style: italic;"># route add default gw 192.168.0.1</span>
<span style="color: #666666; font-style: italic;"># dhcpcd eth1</span></pre></div></div>

<p>Só unica coisa aí, é que você precisa saber qual porta eth vai ser necessária &#8220;upar&#8221; e qual o final do seu ip dentro da rede(no meu caso é o 4), mas tanto faz isso.</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2008/01/31/slackware-12-e-roteadores-como-conectar-via-fio/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Resposta do desafio criptografia Blowfish</title>
		<link>http://felipetonello.com/blog/2007/11/21/resposta-do-desafio-criptografia-blowfish/</link>
		<comments>http://felipetonello.com/blog/2007/11/21/resposta-do-desafio-criptografia-blowfish/#comments</comments>
		<pubDate>Wed, 21 Nov 2007 03:00:54 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[desafios]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/2007/11/21/resposta-do-desafio-criptografia-blowfish/</guid>
		<description><![CDATA[Já faz um tempinho que coloquei o &#8216;Desafio criptografia Blowfish&#8217; no meu blog. Só que ninguem conseguiu, ou tentou, resolver o problema. Vamos ver que é bem simples esse desafio. Primeiro coisa a fazer é ler o desafio e perceber que temos 2 coisas importantes alí: Mensagem criptografada Senha da mensagem. Feito isso já podemos [...]]]></description>
			<content:encoded><![CDATA[<p>Já faz um tempinho que coloquei o <a href="/blog/2007/08/23/desafio-criptografia-blowfish/" title="Desafio criptografia Blowfish">&#8216;Desafio criptografia Blowfish&#8217;</a> no meu blog. Só que ninguem conseguiu, ou tentou, resolver o problema.</p>
<p>Vamos ver que é bem simples esse desafio.</p>
<p>Primeiro coisa a fazer é ler o desafio e perceber que temos 2 coisas importantes alí:</p>
<ol>
<li>Mensagem criptografada</li>
<li>Senha da mensagem.</li>
</ol>
<p>Feito isso já podemos matar o problema. Como?<br />
Primeiro escolha a linguagem de programação que você quer resolver. No caso vamos utilizar <a href="http://python.org">Python</a>.<br />
Você pode baixar o <a href="/scripts/python/blowfish.txt">blowfish.py</a> aqui.</p>
<p>Se você abrir o código, pode perceber que no final do arquivo têm uns exemplos de uso. Ou simplesmente faça:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">tail</span> blowfish.py <span style="color: #660033;">-n</span> <span style="color: #000000;">20</span></pre></div></div>

<p>A saída será essa:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    key = <span style="color: #483d8b;">'This is a test key'</span>
    cipher = Blowfish <span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Testing encryption:&quot;</span>
    xl = <span style="color: #ff4500;">123456</span>
    xr = <span style="color: #ff4500;">654321</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Plain text: (%s, %s)&quot;</span> <span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span>xl, xr<span style="color: black;">&#41;</span>
    cl, cr = cipher.<span style="color: black;">cipher</span> <span style="color: black;">&#40;</span>xl, xr, cipher.<span style="color: black;">ENCRYPT</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Crypted is: (%s, %s)&quot;</span> <span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span>cl, cr<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">dl</span>, dr = cipher.<span style="color: black;">cipher</span> <span style="color: black;">&#40;</span>cl, cr, cipher.<span style="color: black;">DECRYPT</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Unencrypted is: (%s, %s)&quot;</span> <span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">dl</span>, dr<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Testing buffer encrypt:&quot;</span>
    text = <span style="color: #483d8b;">'testtest'</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Text: %s&quot;</span> <span style="color: #66cc66;">%</span>text
    crypted = cipher.<span style="color: black;">encrypt</span> <span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Encrypted: %s&quot;</span> <span style="color: #66cc66;">%</span>crypted
    decrypted = cipher.<span style="color: black;">decrypt</span> <span style="color: black;">&#40;</span>crypted<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>Decrypted: %s&quot;</span> <span style="color: #66cc66;">%</span>decrypted</pre></div></div>

<p>Agora já sabemos como faz para chamar o método de criptografar e descriptografar.</p>
<p>Mas peraí, no exemplo acima o mensagem era uns números e não vários caracteres como na do nosso desafio.<br />
Aí vem a primeira pegadinha..<br />
nossa string foi convertida para codificação <a href="http://en.wikipedia.org/wiki/Base64">base 64</a>.<br />
Então teremos de converter toda a string para uma string conhecida pelo blowfish(ou não, temos que ver).</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
<span style="color: #dc143c;">base64</span>.<span style="color: black;">b64decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'string_do_desafio'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Beleza, agora sabemos que está tudo ok. Temos que conhecer o Blowfish.</p>
<p>Para isso vamos dar uma pesquisada na internet.</p>
<p><strong>&#8230;10 minutos depois&#8230;</strong></p>
<p>Bom, pelo que eu <a href="http://pt.wikipedia.org/wiki/Blowfish">vi aqui na wikipedia</a> e vejo isso: <strong>A entrada para essa parte do algoritmo são 64 bits&#8230;</strong><br />
Com complexas contas chegamos que 64 bits = 8 Bytes = 8 caracteres. Para quem não entendeu ainda, fizemos 64 bits / 8 bits = 8 Bytes</p>
<p>Então quer dizer que o blowfish só recebe em blocos de 8 caracteres as entradas.. hmmmm interessante..<br />
Sabendo isso, vamos ter que separar nossa string com muitos caracteres em várias de 8 caracteres apenas.</p>
<p>Faremos isso com um for normal e vamos cortar a string em vários blocos de 8 caracteres. Mas e se o último bloco conter apenas 6 caracteres? Para termos certeza de que a string contem 8 caracteres podemos forcar com o método <strong>string.ljust(variavel, 8 )</strong></p>
<p>Não se esqueça que a senha também não deve ter menos de 8 caracteres, então está a outra dica: Usar o ljust() na senha também.</p>
<p>Depois disso é só você criar seu código. Eu criei uma classe bem simples que criptograda e descriptografa.</p>
<p>Na verdade é bem simples sim. Vou postar meu código aqui e quem quiser baixar ele fique a vontade..</p>
<p><a href="/blog/2007/08/23/desafio-criptografia-blowfish/" title="Desafio criptografia Blowfish">Tente desvendar o mistério e resolva o desafio!!!</a></p>
<p>Agora só falta postarem o resultado, ficou fácil né? hehe</p>
<p><a href="/Sistemas/Upload/arquivo.php?i=20" title="Download do cript.py">Faça download do cript.py</a></p>
<p><strong>cript.py</strong></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;"># Feito em 22/08/2007</span>
<span style="color: #808080; font-style: italic;">#</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
<span style="color: #ff7700;font-weight:bold;">import</span> blowfish
&nbsp;
__author__ = <span style="color: #483d8b;">&quot;Felipe Ferreri Tonello &lt;felipe.tonello@gmail.com&gt;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BFCript:
    <span style="color: #483d8b;">&quot;&quot;&quot;
Classe que usa criptografia Blowfish juntamente com encodificacao Base64
&nbsp;
uso: cript.py cript|descript 'senha' 'texto'
&nbsp;
PS: Quando for descriptografar, o texto deve estar codificado em Base64
    &quot;&quot;&quot;</span>
    CRIPTOGRAFAR = <span style="color: #ff4500;">0</span>
    DESCRIPTOGRAFAR = <span style="color: #ff4500;">1</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> cript<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>,  sKey,  sTxt,  iAction<span style="color: black;">&#41;</span>:
        bf = blowfish.<span style="color: black;">Blowfish</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>sKey<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">8</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#91;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">ljust</span><span style="color: black;">&#40;</span>sKey, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: black;">&#91;</span>sKey<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> iAction == <span style="color: #008000;">self</span>.<span style="color: black;">DESCRIPTOGRAFAR</span>:
            sTxt = <span style="color: #dc143c;">base64</span>.<span style="color: black;">b64decode</span><span style="color: black;">&#40;</span>sTxt<span style="color: black;">&#41;</span>
&nbsp;
        sCript = <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>x<span style="color: #66cc66;">*</span><span style="color: #ff4500;">8</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,  <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>sTxt<span style="color: black;">&#41;</span>/<span style="color: #ff4500;">8</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> :
            sSBox = sTxt<span style="color: black;">&#91;</span>i:i+<span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>sSBox<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> :
                <span style="color: #ff7700;font-weight:bold;">if</span> iAction == <span style="color: #008000;">self</span>.<span style="color: black;">CRIPTOGRAFAR</span>:
                    sCript += bf.<span style="color: black;">encrypt</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">ljust</span><span style="color: black;">&#40;</span>sSBox,  <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">elif</span> iAction == <span style="color: #008000;">self</span>.<span style="color: black;">DESCRIPTOGRAFAR</span>:
                    sCript += bf.<span style="color: black;">decrypt</span><span style="color: black;">&#40;</span>sSBox<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> iAction == <span style="color: #008000;">self</span>.<span style="color: black;">CRIPTOGRAFAR</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">base64</span>.<span style="color: black;">b64encode</span><span style="color: black;">&#40;</span>sCript<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> iAction == <span style="color: #008000;">self</span>.<span style="color: black;">DESCRIPTOGRAFAR</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> sCript
&nbsp;
<span style="color: #808080; font-style: italic;">##################################################</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span> :
    bfc = BFCript<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">4</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;cript&quot;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;descript&quot;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> BFCript.__doc__
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;cript&quot;</span> :
        <span style="color: #ff7700;font-weight:bold;">print</span> bfc.<span style="color: black;">cript</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>, <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>,  bfc.<span style="color: black;">CRIPTOGRAFAR</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;descript&quot;</span> :
        <span style="color: #ff7700;font-weight:bold;">print</span> bfc.<span style="color: black;">cript</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>,  <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>,  bfc.<span style="color: black;">DESCRIPTOGRAFAR</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2007/11/21/resposta-do-desafio-criptografia-blowfish/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Detalhes, compensam?</title>
		<link>http://felipetonello.com/blog/2007/09/13/detalhes-compensam/</link>
		<comments>http://felipetonello.com/blog/2007/09/13/detalhes-compensam/#comments</comments>
		<pubDate>Thu, 13 Sep 2007 12:47:01 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/2007/09/13/detalhes-compensam/</guid>
		<description><![CDATA[Eu gosto muito de ler blogs de web em geral, pois falam muito sobre acessibilidade, projetos e assim por diante. Bem legal. Estava lendo esse post no tableless legal falando sobre detalhes. Para quem não ta afim de ler tudo lá: Resumidamente nos mostra, por um raciocínio, que os detalhes fazem a diferença. E realmente [...]]]></description>
			<content:encoded><![CDATA[<p>Eu gosto muito de ler blogs de web em geral, pois falam muito sobre acessibilidade, projetos e assim por diante. Bem legal.<br />
Estava lendo esse <a href="http://www.tableless.com.br/fiat-uno-e-peugeot-206">post no tableless</a> legal falando sobre detalhes.</p>
<p>Para quem não ta afim de ler tudo lá: Resumidamente nos mostra, por um raciocínio, que os detalhes fazem a diferença. E realmente faz. Em tudo em nossa vida.</p>
<p>Quando você vai comprar um tênis, e olha aquele da adidas lindo cheio de 3 listrinhas da marca, bonitão. Você decide comprar ele.<br />
Mas quando olha pra plaquinha do preço dele, você cai de cara no chão! <em>&#8220;R$400,00. O cara acha que sou o que?!&#8221;</em>. Exatamente, os detalhes custam mais caro né. Se você tiver o dinheiro, ótimo, mas se não o tiver, já era! Vai ter que comprar aquele olimpikus de 100 conto.</p>
<p>Agora vamos analisar em nossos projetos. Colocar detalhes a mais com certeza deixaria o cliente mais satisfeito ainda. Não importa onde, no layout do sistema, no código do sistema, na acessibilidade, e assim por diante. Mas e aí, você cobraria por esses detalhes?</p>
<p>Será que fazendo isso não perderia o cliente?!</p>
<p>Mas agora, será que fazer detalhes no seu desenvolvimento que não tomaria tanto tempo, ou não seria algo muito complexo de se fazer, não compensaria? O seu cliente ficaria muito mais satisfeito, pois você fez além e pelo mesmo valor, e com certeza em um outro trabalho ele lembrará de você: <em>&#8220;Aquele cara me fez um ótimo trabalho, em um valor acessível e  com detalhes que fizeram a diferença!&#8221;</em> (tá bom, eu sei que exagerei um pouco agora hehe)</p>
<p>Lembre-se sempre disso. Pode fazer a diferença!</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2007/09/13/detalhes-compensam/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
