<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Peczenyj's Blog</title><link>http://pacman.blog.br/post/</link><description>Recent content in Posts on Peczenyj's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 07 Feb 2014 20:13:00 +0000</lastBuildDate><atom:link href="http://pacman.blog.br/post/atom.xml" rel="self" type="application/rss+xml"/><item><title>MooseX - a new Ruby DSL for Object Oriented Programming (and much more)</title><link>http://pacman.blog.br/blog/2014/02/07/moosex-a-new-ruby-dsl-for-object-oriented-programming-and-much-more/</link><pubDate>Fri, 07 Feb 2014 20:13:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2014/02/07/moosex-a-new-ruby-dsl-for-object-oriented-programming-and-much-more/</guid><description>&lt;p>MooseX is a postmodern object DSL for Ruby &lt;a href="https://travis-ci.org/peczenyj/MooseX">&lt;img src="https://travis-ci.org/peczenyj/MooseX.png" alt="Build Status">&lt;/a> &lt;a href="http://badge.fury.io/rb/moosex">&lt;img src="https://badge.fury.io/rb/moosex.png" alt="Gem Version">&lt;/a>&lt;/p>
&lt;p>This is a DSL for object creation, aspects, method delegation and much more. It is based on Perl Moose and Moo, two important modules who add a better way of Object Orientation development (and I enjoy A LOT). Using a declarative stype, using Moose/Moo you can create attributes, methods, the entire constructor and much more. But I can&amp;rsquo;t find something similar in Ruby world, so I decide port a small subset of Moose to create a powerfull DSL for object construction.&lt;/p></description></item><item><title>Adding a 'dry run' capability to your Moose class with MooseX::Role::DryRunnable</title><link>http://pacman.blog.br/blog/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosex-role-dryrunnable/</link><pubDate>Sun, 07 Apr 2013 09:55:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2013/04/07/adding-a-dry-run-capability-to-your-moose-class-with-moosex-role-dryrunnable/</guid><description>&lt;p>A &amp;lsquo;dry run&amp;rsquo; is a testing process where the effects of a possible failure are intentionally mitigated. For example, an aerospace company may conduct a &amp;ldquo;dry run&amp;rdquo; test of a jet&amp;rsquo;s new pilot ejection seat while the jet is parked on the ground, rather than while it is in flight. Or, in software development, we can change the behavior of some methods in order to test, like avoid change data into a database (logging the action instead).&lt;/p>
&lt;p>There are many ways to implement this capability. For example, we can add an explicity return in each method and test some condition. I will show some options in this article and we will find how to use the module &lt;a href="https://metacpan.org/module/MooseX::Role::DryRunnable">MooseX::Role::DryRunnable&lt;/a> in our Moose classes (Perl).&lt;/p>
&lt;p>One simple example in Perl, reading from an environment variable &lt;code>DRY_RUN&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-perl" data-lang="perl">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">package&lt;/span> Foo;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">sub&lt;/span> &lt;span style="color:#268bd2">bar&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	logger&lt;span style="color:#719e07">-&amp;gt;&lt;/span>debug(&lt;span style="color:#2aa198">&amp;#34;Foo::bar @_&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#268bd2">$ENV&lt;/span>{&lt;span style="color:#2aa198">&amp;#39;DRY_RUN&amp;#39;&lt;/span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#719e07">...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Lazy::Bool my first module in CPAN</title><link>http://pacman.blog.br/blog/2013/01/23/lazy-bool-my-first-module-in-cpan/</link><pubDate>Wed, 23 Jan 2013 20:15:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2013/01/23/lazy-bool-my-first-module-in-cpan/</guid><description>&lt;p>&lt;a href="https://metacpan.org/release/Lazy-Bool">Lazy::Bool&lt;/a> is my first module in &lt;a href="http://www.cpan.org/">CPAN&lt;/a> (The Comprehensive Perl Archive Network). It is a simple module (only 60 lines) and few methods/operators but can be useful in some situation. The source code can be found in my &lt;a href="https://github.com/peczenyj/Lazy-Bool">github&lt;/a>.&lt;/p>
&lt;p>##Example##&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-perl" data-lang="perl">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">use&lt;/span> Lazy::Bool;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">use&lt;/span> Test::More tests&lt;span style="color:#719e07">=&amp;gt;&lt;/span> &lt;span style="color:#2aa198">3&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">my&lt;/span> &lt;span style="color:#268bd2">$a&lt;/span> &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">6&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">my&lt;/span> &lt;span style="color:#268bd2">$b&lt;/span> &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">4&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">my&lt;/span> &lt;span style="color:#268bd2">$x&lt;/span> &lt;span style="color:#719e07">=&lt;/span> Lazy::Bool&lt;span style="color:#719e07">-&amp;gt;&lt;/span>&lt;span style="color:#719e07">new&lt;/span>(sub{ &lt;span style="color:#268bd2">$a&lt;/span> &lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">$b&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">my&lt;/span> &lt;span style="color:#268bd2">$false&lt;/span> &lt;span style="color:#719e07">=&lt;/span> Lazy::Bool::false;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">my&lt;/span> &lt;span style="color:#268bd2">$result&lt;/span> &lt;span style="color:#719e07">=&lt;/span> (&lt;span style="color:#268bd2">$x&lt;/span> &lt;span style="color:#719e07">|&lt;/span> &lt;span style="color:#268bd2">$false&lt;/span>) &lt;span style="color:#719e07">&amp;amp;&lt;/span> ( &lt;span style="color:#719e07">!&lt;/span> ( &lt;span style="color:#268bd2">$false&lt;/span> &lt;span style="color:#719e07">&amp;amp;&lt;/span> &lt;span style="color:#719e07">!&lt;/span> &lt;span style="color:#268bd2">$false&lt;/span> ) );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># now the expressions will be evaluate&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ok(&lt;span style="color:#268bd2">$result&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;complex expression should be true&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ok(&lt;span style="color:#719e07">!!&lt;/span> &lt;span style="color:#268bd2">$x&lt;/span> , &lt;span style="color:#2aa198">&amp;#34;double negation of true value should be true&amp;#34;&lt;/span>); 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ok(&lt;span style="color:#719e07">!!!&lt;/span> &lt;span style="color:#268bd2">$false&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;truple negation of false value should be true&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Schwartzian transform</title><link>http://pacman.blog.br/blog/2013/01/22/schwartzian-transform/</link><pubDate>Tue, 22 Jan 2013 16:00:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2013/01/22/schwartzian-transform/</guid><description>&lt;p>I will show in this post one of the most useful things that I learn in Perl: the famous Schwartzian transform. With examples in Ruby&lt;/p>
&lt;blockquote>
&lt;p>In computer science, the Schwartzian transform is a Perl programming idiom used to improve the efficiency of sorting a list of items. This idiom is appropriate for comparison-based sorting when the ordering is actually based on the ordering of a certain property (the key) of the elements, where computing that property is an intensive operation that should be performed a minimal number of times. The Schwartzian Transform is notable in that it does not use named temporary arrays.&lt;/p></description></item><item><title>Codility Equi Task Solution in Modern Perl</title><link>http://pacman.blog.br/blog/2013/01/10/codility-equi-task-solution-in-modern-perl/</link><pubDate>Thu, 10 Jan 2013 12:32:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2013/01/10/codility-equi-task-solution-in-modern-perl/</guid><description>&lt;p>&lt;a href="http://codility.com">Codility&lt;/a> is one of the most common services used to apply test codes (for job applications, for example). &lt;a href="http://codility.com/demo/take-sample-test/">Here&lt;/a> you can find a task sample to pratice before try the real test. The present sample is the &lt;a href="http://blog.codility.com/2011/03/solutions-for-task-equi.html">Equi Task&lt;/a>, and the propose is very simple.&lt;/p>
&lt;p>Imagine an array with N elements. There is a P value (0 &amp;lt;= P &amp;lt;= N) who solve the problem below?&lt;/p>
&lt;pre>&lt;code>A[0] + A[1] + ... + A[P−1] = A[P+1] + ... + A[N−2] + A[N−1].
&lt;/code>&lt;/pre>
&lt;p>In other words, where is the equilibrium index of this array?&lt;/p></description></item><item><title>Spell Correct in GNU AWK</title><link>http://pacman.blog.br/blog/2012/12/29/spell-correct-in-gawk/</link><pubDate>Sat, 29 Dec 2012 03:17:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2012/12/29/spell-correct-in-gawk/</guid><description>&lt;p>Based on &lt;a href="http://norvig.com/spell-correct.html">Peter Norvig Spell Correct&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-awk" data-lang="awk">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Usage: gawk -v word=some_word_to_verify -f spelling.awk [ big.txt [ big2.txt ... ]]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Gawk version with 15 lines -- 04/13/2008&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Author: tiago (dot) peczenyj (at) gmail (dot) com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># about.me/peczenyj&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Based on : http://norvig.com/spell-correct.html&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">function&lt;/span> edits(w,max,candidates,list, i,j){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span>(i&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">0&lt;/span>;i&lt;span style="color:#719e07">&amp;lt;&lt;/span> max ;&lt;span style="color:#719e07">++&lt;/span>i) &lt;span style="color:#719e07">++&lt;/span>list[&lt;span style="color:#268bd2">substr&lt;/span>(w,&lt;span style="color:#2aa198">0&lt;/span>,i) &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">2&lt;/span>)] &lt;span style="color:#586e75"># deletes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span>(i&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">0&lt;/span>;i&lt;span style="color:#719e07">&amp;lt;&lt;/span> max&lt;span style="color:#719e07">-&lt;/span>&lt;span style="color:#2aa198">1&lt;/span>;&lt;span style="color:#719e07">++&lt;/span>i) &lt;span style="color:#719e07">++&lt;/span>list[&lt;span style="color:#268bd2">substr&lt;/span>(w,&lt;span style="color:#2aa198">0&lt;/span>,i) &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">2&lt;/span>,&lt;span style="color:#2aa198">1&lt;/span>) &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">1&lt;/span>,&lt;span style="color:#2aa198">1&lt;/span>) &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">3&lt;/span>)] &lt;span style="color:#586e75"># transposes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span>(i&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">0&lt;/span>;i&lt;span style="color:#719e07">&amp;lt;&lt;/span> max ;&lt;span style="color:#719e07">++&lt;/span>i) &lt;span style="color:#719e07">for&lt;/span>(j &lt;span style="color:#719e07">in&lt;/span> alpha) &lt;span style="color:#719e07">++&lt;/span>list[&lt;span style="color:#268bd2">substr&lt;/span>(w,&lt;span style="color:#2aa198">0&lt;/span>,i) alpha[j] &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">2&lt;/span>)] &lt;span style="color:#586e75"># replaces&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span>(i&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">0&lt;/span>;i&lt;span style="color:#719e07">&amp;lt;=&lt;/span> max ;&lt;span style="color:#719e07">++&lt;/span>i) &lt;span style="color:#719e07">for&lt;/span>(j &lt;span style="color:#719e07">in&lt;/span> alpha) &lt;span style="color:#719e07">++&lt;/span>list[&lt;span style="color:#268bd2">substr&lt;/span>(w,&lt;span style="color:#2aa198">0&lt;/span>,i) alpha[j] &lt;span style="color:#268bd2">substr&lt;/span>(w,i&lt;span style="color:#719e07">+&lt;/span>&lt;span style="color:#2aa198">1&lt;/span>)] &lt;span style="color:#586e75"># inserts&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span>(i &lt;span style="color:#719e07">in&lt;/span> list) &lt;span style="color:#719e07">if&lt;/span>(i &lt;span style="color:#719e07">in&lt;/span> NWORDS) candidates[i] &lt;span style="color:#719e07">=&lt;/span> NWORDS[i] } 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">function&lt;/span> correct(word ,candidates,i,list,max,temp){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> edits(word,&lt;span style="color:#268bd2">length&lt;/span>(word),candidates,list)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">if&lt;/span> (&lt;span style="color:#719e07">!&lt;/span>&lt;span style="color:#268bd2">asort&lt;/span>(candidates,temp)) &lt;span style="color:#719e07">for&lt;/span>(i &lt;span style="color:#719e07">in&lt;/span> list) edits(i,&lt;span style="color:#268bd2">length&lt;/span>(i),candidates)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> (max &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#268bd2">asorti&lt;/span>(candidates)) ? candidates[max] : word }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">BEGIN&lt;/span>{ &lt;span style="color:#719e07">if&lt;/span> (&lt;span style="color:#b58900">ARGC&lt;/span> &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#2aa198">1&lt;/span>) &lt;span style="color:#b58900">ARGV&lt;/span>[&lt;span style="color:#b58900">ARGC&lt;/span>&lt;span style="color:#719e07">++&lt;/span>] &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;big.txt&amp;#34;&lt;/span> &lt;span style="color:#586e75"># http://norvig.com/big.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">while&lt;/span>(&lt;span style="color:#719e07">++&lt;/span>i&lt;span style="color:#719e07">&amp;lt;=&lt;/span>&lt;span style="color:#268bd2">length&lt;/span>(x&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;abcdefghijklmnopqrstuvwxyz&amp;#34;&lt;/span>)) alpha[i]&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#268bd2">substr&lt;/span>(x,i,&lt;span style="color:#2aa198">1&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#b58900">IGNORECASE&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">RS&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;[^&amp;#34;&lt;/span>x&lt;span style="color:#2aa198">&amp;#34;]+&amp;#34;&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{ &lt;span style="color:#719e07">++&lt;/span>NWORDS[&lt;span style="color:#268bd2">tolower&lt;/span>(&lt;span style="color:#719e07">$&lt;/span>&lt;span style="color:#2aa198">1&lt;/span>)] }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">END&lt;/span>{ &lt;span style="color:#268bd2">print&lt;/span> (word &lt;span style="color:#719e07">in&lt;/span> NWORDS) ? word : &lt;span style="color:#2aa198">&amp;#34;correct(&amp;#34;&lt;/span>word&lt;span style="color:#2aa198">&amp;#34;)=&amp;gt; &amp;#34;&lt;/span> correct(&lt;span style="color:#268bd2">tolower&lt;/span>(word)) }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is my version of the Norvig&amp;rsquo;s Spell Corrector in gnu awk.&lt;/p></description></item><item><title>hello</title><link>http://pacman.blog.br/blog/2012/12/29/hello/</link><pubDate>Sat, 29 Dec 2012 02:26:00 +0000</pubDate><guid>http://pacman.blog.br/blog/2012/12/29/hello/</guid><description>&lt;p>Hello World!&lt;/p></description></item><item><title>Mudando de endereço</title><link>http://pacman.blog.br/blog/2009/01/03/mudando-de-endereo/</link><pubDate>Sat, 03 Jan 2009 15:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2009/01/03/mudando-de-endereo/</guid><description>&lt;div class='post'>
Foram centenas de posts desde que comecei a usar o blogspot como valvula de escape.&lt;br />&lt;br />Agora adquiri um domínio próprio e estou usando o wordpress como engine de blog, com MediaWiki para salvar os posts mais importantes daqui.&lt;br />&lt;br />Atualizem os seus feeds: &lt;a href="http://pacman.blog.br">pacman.blog.br&lt;/a>, estou desativando este site. Obrigado a todos pela audiência :)&lt;/div></description></item><item><title>Novas Distribuições Linux</title><link>http://pacman.blog.br/blog/2008/12/22/novas-distribuies-linux/</link><pubDate>Mon, 22 Dec 2008 13:44:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/12/22/novas-distribuies-linux/</guid><description>&lt;div class='post'>
Diariamente eu leio noticias sobre novas distribuições, brasileiras ou internacionais.&lt;br />&lt;br />Até que ponto isso é &lt;span style="font-style:italic;">realmente&lt;/span> necessário? Não seria melhor tentar focar em uma das excelentes distribuições que existem hoje em dia ou então tentar ajudar a manutenção de pacotes ou mesmo traduzir documentação?&lt;br />&lt;br />Acho que produzir uma distribuição é um bom aprendizado, porém produzir algo que sera dificil de manter e atualizar pode ser bem penoso.&lt;/div>
&lt;!-- more --> 
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Vitor Pellegrino&lt;/div>
&lt;div class='content'>
@pacman&lt;BR/>&lt;BR/>Aqui em casa funcionou. Quando chegou o novo micro aqui em casa, eu instalei o ubuntu e falei para a minha mãe (ultra-leiga, diga-se por sinal) que era a versão nova do Windows. &lt;BR/>&lt;BR/>Ela está usando o Ubuntu a alguns meses e está se virando super bem :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Um experimento interessante é vc instalar o ubuntu ou outra distribuição dizendo que é uma nova versão do windows e deixar o pessoal utilizar por umas horas. Vão dizer que "agora ficou bom", "é bem rapido", etc :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>JOSIAS RAMOS&lt;/div>
&lt;div class='content'>
Concordo com você Tiago, acho que fui muito duro. Eu mesmo demorei um pouco para aderir ao linux, e olha que era na época bem mais difícil. Agora eu não deixo-o de jeito nenhum.&lt;BR/>A divulgação está muito boa, mas para o usuários leigos mesmo, que apenas usam o PC para coisas triviais, esses é que tem que serem tratados com carinho por nós da comunidade GNU/Linux, e não esculaxados em fóruns como eu mesmo já presenciei.&lt;BR/>Mas nada muda o fato de que poucas distros poderosas seriam bem melhores, tanto para a divulgação quanto para o desenvolvimento do que várias distros que quase ninguem usa.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Josias, eu acho que vai alem.&lt;BR/>&lt;BR/>Existe um grupo de interfaces gráficas que tentam copiar ou imitar o windows. Ao meu ver é interessante para ajudar na transição de usuarios de uma plataforma para a outra, da mesma forma que o cygwin me ajuda a usar o XP sem dar ls no prompt de comando.&lt;BR/>&lt;BR/>Porém outras interfaces seguem outras ideias, e essa é uma riqueza sensacional do mundo linux/bsd, open source em geral. Interfaces como o fluxbox, window maker, enlightenment, cada uma com um propósito diferente. Temos muitos problemas ainda pela frente e precisamos de alguns focos no mundo open-source. Um deles é a divulgação que, com tantos blogs, planets, listas e foruns acho que estamos no caminho certo, porém ainda existem iniciativas isoladas para transmitir conhecimento como as palestras do Tchelinux, as install fests, etc.&lt;BR/>&lt;BR/>Uma hora chegaremos lá!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>JOSIAS RAMOS&lt;/div>
&lt;div class='content'>
É verdade, deveríamos pensar em fortalecer boas distros, desenvolvendo o Linux para desktops. Um amigo me disse que não ia mais usar o Linux que eu dei para ele pois não conseguiu usar algumas ferramentas que só tem no Windows. Temos que admitir que o Windows ainda domina os desktops por causa dos aplicativos e sua interface gráfica bem mais amigável, para programadores e entendidos não é nada de mais trabalhar com o Linux, eu amo, mais para usuários finais, pessoas que querem apenas um PC para se divertir, entrar no MSN, criar textos no Word, entre outras coisas, vão ter dificuldades em interagir com o Linux.&lt;BR/>Ainda há programadores que, por ter aprendido algo, pensam que já nasceram sabendo, e não ajudam novos usuários, que às vezes são mal-tratados e decepcionam ainda mais com o Linux.&lt;BR/>Espero que posssamos nos juntar para criar e desenvolver aplicativos para desktops, ou o Linux vai ficar sendo conhecido como o sistema operacional para servidores, com usuários programadores e administradores.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Chapiewski&lt;/div>
&lt;div class='content'>
Outro dia mesmo falei no Twitter: &lt;A HREF="http://twitter.com/gchapiewski/status/1072862864" REL="nofollow">as pessoas adoram re-inventar a roda&lt;/A>.&lt;BR/>&lt;BR/>Re-inventar a roda é pura perda de tempo, a não ser que se tenha uma necessidade extremamente específica (o que normalmente não é o caso).&lt;BR/>&lt;BR/>[ ]s, gc&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rodrigo Kumpera&lt;/div>
&lt;div class='content'>
Boa parte da motivação de novas distros é dar foco em um conjunto específico de pacotes ou configurações.&lt;BR/>&lt;BR/>Agora se as pessoas soubessem como é fácil resolver esse problema.&lt;BR/>&lt;BR/>Para construir pacotes trivialmente basta usar o build service do OpenSuse, que permite empacotar para os principais formatos e distros. &lt;BR/>&lt;BR/>http://build.opensuse.org/&lt;BR/>&lt;BR/>Uma vez com os pacotes em mãos, juntar todos eles em uma distro com Suse Studio é razoavelmente simples.&lt;BR/>&lt;BR/>http://studio.suse.com/&lt;BR/>&lt;BR/>Criar distros inteiras é um esforço descomunal, custa, no mínimo, uma dúzia de engenheiros em tempo integral só para juntar os pedaços e, no final, entregar algo que não é melhor que as principais existentes.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Kroiner&lt;/div>
&lt;div class='content'>
Fiz um post uns dias atrás em meu blog tratando exatamente este assunto. Na minha opinião está meio exagerado o número de novas distros. A partir disso estou mandando um e-mail para cada nova distribuição que aparece perguntando os diferenciais entre esta distribuição e as distribuições efetivadas na comunidade. O e-mail, obviamente, é educado e mostra interesse pelos projetos, apenas questionando-os. Já mandei para 4 distros que apareceram novas versões entre esta e a semana passada e até agora nenhum projeto me deu algum retorno. Estou esperando até o final do ano e depois colocarei um parecer dessa pseudo-pesquisa se é que alguma vai me responder.&lt;BR/>&lt;BR/>Tonismar&lt;BR/>kroiner.wordpress.com&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Victor Bogado&lt;/div>
&lt;div class='content'>
A verdade é que não é necessário, pode até ser um processo "legal" pelo aprendizado e pode até ser que o criador acredite realmente que está criando algo realmente util para a humanidade. &lt;BR/>&lt;BR/>A verdade porém é que 99% destas distros, e sim eu acabei de inventar este numero, terão a sorte de não ter mais que um ou dois usuários. Pois fazer uma distribuição que sobreviva ter milhares, ou até mesmo milhões de usuários é dificil e acaba por forçar o distribuidor a fazer decisões arbritárias que provavelmente irão trazer a ira de uma boa porcentagem destes usuários dos quais quem sabe um ou dois não resolvem se juntar e criar a sua própria distro e...&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tirando o Mofo</title><link>http://pacman.blog.br/blog/2008/11/24/tirando-o-mofo/</link><pubDate>Mon, 24 Nov 2008 18:26:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/11/24/tirando-o-mofo/</guid><description>&lt;div class='post'>
Fiquei uns dias sem postar, hehe.&lt;br />&lt;br />Tive pouco tempo livre, afinal além de pegar alguns projetos novos (e ter que aprender muito no processo) ainda tem a faculdade, que agora chega ao fim do semestre com algumas provas.&lt;br />&lt;br />Nesse tempo também participei de alguns eventos legais, a começar pelo &lt;a href="http://www.temporealeventos.com.br/?area=116">workshop de design patterns&lt;/a> ministrado pelo &lt;a href="http://www.bruceeckel.com/">Bruce Eckel&lt;/a> (Thinking in Java, Thinking in C++). Foram 3 dias imerso em um mundo de orientação a objetos com exemplos em Java e Python. O Bruce é um cara muito bacana, tive a oportunidade de conversar bastante com ele e descobri que tinhamos algo em comum: uma graduação em física incompleta (chegamos a conclusão que não foi um tempo perdido pois aprendemos a resolver problemas, ou pelo menos demorar bastante tempo até desistir). Também tive a oportunidade de participar de um &lt;a href="http://www.dojosp.org/">Coding Dojo&lt;/a> onde resolvemos o problema da notação de trits (ao contrário, diga-se de passagem) usando Haskell. A ideia do Dojo é sensacional!&lt;br />&lt;br />Também participei da &lt;a href="http://pyconbrasil.com.br/">PyConBrasil 2008&lt;/a>. Foi um evento muito bom, excelente organização, sem falar que a sessão aberta com o Bruce sobre os rumos do Python foi o ponto forte, que surgiu totalmente do acaso. Python é uma linguagem muito interessante, com uma comunidade consideravel. Quem não usa python devido a indentação obrigatória do código usa um dos argumentos mais ridículos possiveis :)&lt;br />&lt;br />Outro evento sensacional foi o workshop de &lt;a href="http://blog.fragmental.com.br/2008/10/08/domain-driven-design-agile-fechando-malas/">Domain-Driven Design&lt;/a> ministrado pelo Philip Calçado na &lt;a href="http://www.caelum.com.br/">Caelum/RJ&lt;/a>. DDD é sobre comunicação, um ponto essencial no desenvolvimento de software nos dias de hoje. O Phillip foi responsavel, ainda que indiretamente, pela minha vinda a globo.com, porém só agora pudemos tomar aquele chopp e conversar sem ter 12 horas de diferença.&lt;br />&lt;br />Sabado passado começou o curso on-line e intensivo de &lt;a href="http://blog.egenial.com.br/?p=192">BDD on Rails com RSpec&lt;/a> ministrado pelo &lt;a href="http://www.dtsato.com/">Danilo Sato&lt;/a> pela eGenial. Esta valendo a pena, pois parte daquela premissa que sempre defendi que temos que testar o nosso código e, para isso, existem varias abordagens e frameworks.&lt;br />&lt;br />Estou preparando outros posts, devo atualizar este blog em breve.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Roger Leite&lt;/div>
&lt;div class='content'>
Legal Peczenyj!&lt;BR/>Também participei do workshop de DDD, aqui em Sampa.&lt;BR/>&lt;BR/>Sucesso!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Fear, uncertainty and doubt</title><link>http://pacman.blog.br/blog/2008/10/24/fear-uncertainty-and-doubt/</link><pubDate>Fri, 24 Oct 2008 10:02:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/10/24/fear-uncertainty-and-doubt/</guid><description>&lt;div class='post'>
Fear, uncertainty and doubt (ou simplesmente &lt;a href="http://en.wikipedia.org/wiki/FUD_factor">FUD&lt;/a>) não é algo novo. Volta e meia alguma instituição ou candidato a utiliza de forma a enfraquecer o(s) seu(s) adversário(s), geralmente os projetos open-source são vitimas frequentes.&lt;br />&lt;br />Hoje, no Rio de Janeiro haverá o ultimo debate entre os candidatos a prefeito. Não sou de usar blog técnico como meio de propaganda politica porém não posso ficar de braços cruzados enquanto um candidato utiliza FUD, Boatos e Mentiras. &lt;a href="http://porumbrasildecente.blogspot.com/2008/10/boataria-contra-gabeira.html">Aqui&lt;/a> e &lt;a href="http://porumbrasildecente.blogspot.com/2008/10/mais-um-boato-da-campanha-de-paes.html">aqui&lt;/a> vemos alguns exemplos extremamente baixos, que qualquer pessoa com um minimo de instrução deveria perceber. Até quando isso será permitido? E o TRE? E os panfletos apócrifos apreendidos? &lt;br />&lt;br />Felizmente o outro candidato, cujo partido possui uma cor verde interessante, não responde na mesma moeda pois seria facil usar coisas &lt;a href="http://congressoemfoco.ig.com.br/Noticia.aspx?id=25124">desse tipo&lt;/a>, mas que não acrescentam nada. &lt;br />&lt;br />Realmente a melhor forma de se proteger do FUD é informando a população, cobrando das autoridades cabíveis e destacando o quão antiético é esse tipo de abordagem. Felizmente cada cidade tem o prefeito que merece.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>ju-ju&lt;/div>
&lt;div class='content'>
Tá na hora de atualizar, né? :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Muito bom!&lt;BR/>Dia 26, vou votar 43!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Chrome: o browser da google</title><link>http://pacman.blog.br/blog/2008/09/02/chrome-o-browser-da-google/</link><pubDate>Tue, 02 Sep 2008 16:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/09/02/chrome-o-browser-da-google/</guid><description>&lt;div class='post'>
As noticias apareceram em todas os sites especializados: o google estaria lançando hoje uma novidade chamada chrome, um browser baseado em Webkit disponivel por enquanto para Windows XP e Vista.&lt;br />&lt;br />Até um &lt;a href="http://www.google.com/googlebooks/chrome/">gibi&lt;/a> foi disponibilizado, então esperando até as 4 PM consegui fazer o download em uma maquina virtual e pude testa-lo um pouco.&lt;br />&lt;br />A performance parece ser muito boa, apesar da virtualização. Não observei travamentos ou comportamentos estranhos (como os que ocorrem no Safari para Windows). O visual e as tabs são realmente práticas, com muita área para ver o site e icones intuitivos.&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697182/" title="primeira_impressao by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3226/2822697182_2d26579398.jpg" width="500" height="374" alt="primeira_impressao" />&lt;/a>&lt;br />&lt;br />Bem interessante é o gerenciador de tarefas, (Controlar Pagina Atual > Desenvolvedor) onde podemos ver o consumo de cpu, memória e rede de cada aba (que rodam como processos independentes).&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697178/" title="gerenciador_tarefas by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3040/2822697178_a150abe1fc.jpg" width="500" height="377" alt="gerenciador_tarefas" />&lt;/a>&lt;br />&lt;br />E também temos acesso a informações de memória bem detalhadas (infelizmente estáticas, gostaria que houvesse algo como o top do unix, quem sabe no futuro...).&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697176/" title="chrome_memory by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3048/2822697176_fbbb8e2688.jpg" width="500" height="374" alt="chrome_memory" />&lt;/a>]&lt;br />&lt;br />O histórico é limpo e muito bonito&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697170/" title="chrome_historico by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3099/2822697170_3f5a9469a0.jpg" width="500" height="376" alt="chrome_historico" />&lt;/a>&lt;br />&lt;br />E um recurso que eu gostei bastante do novo Opera, mas com uma nova roupagem: ao abrir uma nova aba temos uma pagina com os favoritos e snapshots das paginas.&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697164/" title="chrome_abas by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3114/2822697164_05a9ce10db.jpg" width="500" height="377" alt="chrome_abas" />&lt;/a>&lt;br />&lt;br />Por fim, basta instalar com um clique o plugin flash para navegar no Youtube ou Globo Videos&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697168/" title="chrome_globo_videos by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3036/2822697168_242b7a4e5d.jpg" width="500" height="374" alt="chrome_globo_videos" />&lt;/a>&lt;br />&lt;br />Outras coisas que percebi: a pergunta para salvar as senhas dos sites é muito mais discreta, aparecendo acima do site após o login (não é aquele alert que surge do nada). O Gmail parece ter uma boa performance e o gtalk funcionou sem maiores problemas. Com 6 abas o consumo de memória foi de 144408k - e ainda podemos comparar com outros browsers abertos!&lt;br />&lt;br />Sinto falta de usar '/' para fazer pesquisas na pagina (quem usa Vim entende disso) mas o Ctrl + F funciona bem. Para configurar o tamanho da fonte basta usar Ctrl + (mais) e Ctrl - (menos) para alterar o tamanho do texto, Ctrl 0 para voltar ao normal. E, a mais interessante, não há necessidade de um campo de texto para pesquisas rapidas ao google ou outro buscador: basta digitar os termos no lugar da url (bem intuitivo, aliás). O download de algum arquivo é simples e bonito também.&lt;br />&lt;br />Bom, até então eu gostei, só aguardo a versão para Linux e quero por as mãos no tão falado codigo fonte logo-logo :)&lt;br />&lt;br />Link para download: &lt;a href="http://gears.google.com/chrome"> http://gears.google.com/chrome &lt;/a>&lt;br />&lt;br />Edit: o Chrome tem o mesmo problema que o Firefox tinha para gerenciar senhas: ele mostra a senha sem pudor algum:&lt;br />&lt;br />&lt;a href="http://www.flickr.com/photos/25513475@N05/2822070365/" title="Senhas by grande_uosh, on Flickr">&lt;img src="http://farm4.static.flickr.com/3268/2822070365_c3594ac41b.jpg" width="500" height="390" alt="Senhas" />&lt;/a>&lt;br />&lt;br />Poderia ter um recurso mais seguro como o da &lt;a href="http://br.mozdev.org/firefox/senha-mestra">senha mestra&lt;/a> do Firefox, parece que não pensaram (tanto) na nossa privacidade. Quem sabe no futuro isso não será corrigido?&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Garnier&lt;/div>
&lt;div class='content'>
Fala Pac. Também estou achando o Chrome bem legal. Mas a maioria desses detalhes que você citou já existem no Firefox. Ex: a pergunta pra salvar senhas no topo da tela, os atalhos para pesquisar e para mudar o tamanho do texto, pesquisa no google digitando direto na URL. E tem um plugin pra mostrar as snapshots como no Opera.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Lauro Cesar&lt;/div>
&lt;div class='content'>
Aqui tá rápido e estável. Ah e gastando até menos memória que o Firefox (se bem, que essa estória de que cada tab é um processo às vezes engana a gente...) &lt;BR/>Enfim, parece muito bom mesmo!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Valeu, Wagner, estou lutando para baixar os fontes! &lt;BR/>&lt;BR/>Não lembrava que a memorização da senha tinha mudado no FF3, hehe.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>leoburla&lt;/div>
&lt;div class='content'>
Também achei 144Mb bem pesado... Mas vou dar uma olhada na parada. Parece ser muito boa! Um abraço.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
144 megas pra 6 abas é um pouco salgado heim. Que abas você foram essas?&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Wagner Mezaroba&lt;/div>
&lt;div class='content'>
Legal, estou baixando o fonte pra Linux por aqui:&lt;BR/>&lt;BR/>http://dev.chromium.org/developers/how-tos/build-instructions-linux#TOC-Getting-the-code&lt;BR/>&lt;BR/>Tá bem lento, mas passou da primeira etapa. &lt;BR/>&lt;BR/>Em relação a memorização de senha, no FF 3 não abre nenhuma janela tb. Só aparece uma barra encima (que não interrompe o fluxo de navegação).&lt;BR/>&lt;BR/>&lt;BR/>Falou!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Despedida do Antonio</title><link>http://pacman.blog.br/blog/2008/08/29/despedida-do-antonio/</link><pubDate>Fri, 29 Aug 2008 21:13:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/29/despedida-do-antonio/</guid><description>&lt;div class='post'>
Esta foi a ultima semana do &lt;a href="http://www.acarlos.com.br/blog">Antonio&lt;/a> na &lt;a href="http://videos.globo.com">globo.com&lt;/a>. A despedida foi em grande estilo, com direito a galeria gourmet. Fica o exemplo e a saudade desse grande colega.&lt;br />&lt;br />Em clima de festa com direito a montinho e tudo:&lt;br />&lt;object width="425" height="319">&lt;param name="movie" value="http://qik.com/swfs/qik_player.swf?streamname=1711b365461b4d31873bd2a7d043fff7&amp;vid=245068&amp;playback=false&amp;polling=false&amp;user=gchapiewski&amp;displayname=gchapiewski&amp;safelink=gchapiewski&amp;userlock=true&amp;islive=&amp;username=anonymous" >&lt;/param>&lt;param name="wmode" value="transparent" >&lt;/param>&lt;param name="allowScriptAccess" value="always" >&lt;embed src="http://qik.com/swfs/qik_player.swf?streamname=1711b365461b4d31873bd2a7d043fff7&amp;vid=245068&amp;playback=false&amp;polling=false&amp;user=gchapiewski&amp;displayname=gchapiewski&amp;safelink=gchapiewski&amp;userlock=true&amp;islive=&amp;username=anonymous" type="application/x-shockwave-flash" wmode="transparent" width="425" height="319" allowScriptAccess="always">&lt;/embed>&lt;/object>&lt;br />&lt;br />Fico feliz por ter surpreendido do Antonio nesses poucos meses que trabalhei com ele, agora os desafios são outros (aka Expurgo...)!&lt;br />&lt;br />Toninho, boa sorte no Yahoo!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Antonio Carlos Silveira&lt;/div>
&lt;div class='content'>
Pac, Boa sorte para vc tb e continue assim... You are in the right path!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>SQL Injection - A fina arte de criar paginas realmente inseguras</title><link>http://pacman.blog.br/blog/2008/08/25/sql-injection/</link><pubDate>Mon, 25 Aug 2008 13:11:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/25/sql-injection/</guid><description>&lt;div class='post'>
Este post diz tudo:&lt;br />&lt;img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"/>&lt;br />
&lt;!-- more --> 
&lt;br />Por mais que existam alertas sobre os perigos de &lt;a href="http://en.wikipedia.org/wiki/SQL_injection">SQL Injection&lt;/a>, muita gente resolve ignorar e criar sistemas cujas consultas ao banco de dados são feitas através de concatenações de strings com os dados oriundos do usuário.&lt;br />&lt;br />Uma das primeiras coisas que aprendi quando trabalhava como testador foi tentar este código em telas de login:&lt;br />&lt;br />&lt;code>' or '1' ='1&lt;code>&lt;br />&lt;br />Imagine que o impacto dessa belezinha em uma query como esta:&lt;br />&lt;br />&lt;code>"SELECT USUARIO FROM TABELA WHERE USUARIO = '" + usuario + "' AND SENHA = '" + senha + "'"&lt;/code>&lt;br />temos, então:&lt;br />&lt;br />&lt;code>SELECT USUARIO FROM TABELA WHERE USUARIO = 'qqCoisa' AND SENHA = '' or '1' ='1'&lt;/code>&lt;br />&lt;br />Consegui efetuar o login devido a extrema &lt;b>preguiça&lt;/b> do desenvolvedor que nunca se interessou em estudar um pouco de segurança, muito menos sabe o que é um &lt;b>prepared statement&lt;/b>. Isso no melhor dos casos, posso querer inserir um DROP TABLE da vida facilmente, pois o sistema está, literalmente, de pernas abertas.&lt;br />&lt;br />Recentemente um colega testou esse tipo de ataque contra um site de uma &lt;span style="font-style:italic;">instituição&lt;/span> por curiosidade. Ele conseguiu obter um arquivo contento a senha e o IP do banco de dados e conseguiu acessa-lo, perceberam o perigo?&lt;br />&lt;br />Sinceramente? Se eu vejo um site que cai nesse truque eu não sinto pena. Não vou zoar ou fazer algo maléfico, as vezes até tento avisar, mas não sei se vale a pena: ou o sistema custou muito barato ou custou muito caro, foi produzido por uma consultoria que lucou 1980% em cima do salario do estágiario e que, por mais documentos que tenham produzido não conseguiram fazer algo básico: um site seguro contra hackers que estudam pela Wikipedia.&lt;br />&lt;br />Se o seu site não pode receber aspas simples, duplas ou %, tenha MUITO medo, pois alguem VAI fazer algo em breve...&lt;/div>

&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Marcio&lt;/div>
&lt;div class='content'>
Muito bom o post!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcio&lt;/div>
&lt;div class='content'>
muito bom o post!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Essa tirinha do xkcd é uma das melhores.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Brincar com SQLInjection é divertido... principalmente em dias de tédio.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Closures em Java - Parte 2</title><link>http://pacman.blog.br/blog/2008/08/11/closures-em-java-parte-2/</link><pubDate>Mon, 11 Aug 2008 10:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/11/closures-em-java-parte-2/</guid><description>&lt;div class='post'>
Ainda sobre a Closures do java 7, agora será possivel fazer isso:&lt;br />&lt;br />&lt;pre>&lt;code>public class A {&lt;br /> public static void main(String args[]) {&lt;br /> @Shared int acumulador = 0;&lt;br />&lt;br /> {int => int } xxx = { int i => acumulador += i; i};&lt;br />&lt;br /> System.out.println(xxx.invoke(1));&lt;br /> System.out.println(xxx.invoke(2));&lt;br /> System.out.println(xxx.invoke(3));&lt;br /> System.out.println("o valor do acumulador eh " + acumulador );&lt;br />&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Só eu estou achando divertido?&lt;br />&lt;br />&lt;a href="http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html">http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Não dá ideia!!&lt;BR/>&lt;BR/>Logo aparece um @Global da vida... ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
Fiquei com medo que tu falasse que era uma "variavel global" &lt;BR/>&lt;BR/>hehe&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Martins, sem o @Shared o codigo compila mas gera um warning. É uma marcação que a variavel é compartilhada com outra closure ou bloco de código.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
O que que vem a ser aquele @shared?&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Fabio Nascimento&lt;/div>
&lt;div class='content'>
Pois é, a única dúvida é como ele faz o autoboxing escondido(leia-se por debaixo dos panos)?&lt;BR/>Mas no geral, tbm estou gostando, vamos ver... quando chegar a hora do SDK implementar isso de verdade mesmo.&lt;BR/>&lt;BR/>Té +&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Closures em Java</title><link>http://pacman.blog.br/blog/2008/08/08/closures-em-java/</link><pubDate>Fri, 08 Aug 2008 19:23:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/08/closures-em-java/</guid><description>&lt;div class='post'>
Olha o que vai ter no java 1.7&lt;br />&lt;br />&lt;pre>&lt;code>public class A {&lt;br /> public static void main(String args[]) {&lt;br /> exec( { int a, int b => a + b });&lt;br /> exec( { int a, int b => a * b });&lt;br /> exec( { int a, int b => &lt;br /> System.out.println("closure " + a + ":" + b); &lt;br /> (a * a) + (b * b) &lt;br /> });&lt;br /> }&lt;br /> public static void exec({ int, int => int } closure){&lt;br /> System.out.println(closure.invoke(3,2));&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;pre>$ java -Xbootclasspath/p:./closures-2008-08-04/lib/closures.jar A&lt;br />5&lt;br />6&lt;br />closure 3:2&lt;br />13&lt;/pre>&lt;br />&lt;br />Divertido :)&lt;br />&lt;br />Fonte:&lt;br />&lt;a href="http://guj.com.br/posts/list/99477.java">http://guj.com.br/posts/list/99477.java&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Hehehe... bizarro mesmo sera quando o java tiver suporte a pipes, sinais e outras coisas do mundo shell/C/*nix.&lt;BR/>&lt;BR/>Imagina uma classe fazendo um TRAP... hehehe!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>La Batalema Pitonisto&lt;/div>
&lt;div class='content'>
Tenho muito medo disso!&lt;BR/>&lt;BR/>[]'s&lt;BR/>Cacilhas, La Batalema&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Parsing de XML na linguagem ABC</title><link>http://pacman.blog.br/blog/2008/08/08/parsing-de-xml-na-linguagem-abc/</link><pubDate>Fri, 08 Aug 2008 15:01:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/08/parsing-de-xml-na-linguagem-abc/</guid><description>&lt;div class='post'>
A maior parte das linguagens de progração em uso pelo mundo tem pelo menos 1024 bibliotecas para trabalhar com arquivos XML. Me espanta saber que muitos querem "gravar e ler" arquivos nesse formato mas não fazem ideia do que é um XML!&lt;br />&lt;br />Eis um bom começo:&lt;br />&lt;a href=="http://www.w3schools.com/xml/default.asp">http://www.w3schools.com/xml/default.asp&lt;/a>&lt;br />&lt;br />Acho que nenhuma linguagem tem mais variações sobre o mesmo tema que Java: http://guj.com.br/artigos.jsp#87031&lt;/div></description></item><item><title>Testable &amp; Untestable Code</title><link>http://pacman.blog.br/blog/2008/08/08/testable-untestable-code/</link><pubDate>Fri, 08 Aug 2008 14:29:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/08/testable-untestable-code/</guid><description>&lt;div class='post'>
Leitura recomendada:&lt;br />&lt;br />&lt;a href="http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/">http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/&lt;/a>&lt;br />&lt;a href="http://www.testingreflections.com/node/view/7221">http://www.testingreflections.com/node/view/7221&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Gall&lt;/div>
&lt;div class='content'>
Estou achando bem interessante a proposta do TDD. É algo que parece ser importante e que infelizmente não é visto na faculdade. Continue postando sobre isso sempre que é bem legal. Se puder, indique algum livro sobre o assunto.&lt;BR/>&lt;BR/>Saudações&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>The Good, the Bad and the Ugly</title><link>http://pacman.blog.br/blog/2008/08/07/good-bad-and-ugly/</link><pubDate>Thu, 07 Aug 2008 18:40:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/07/good-bad-and-ugly/</guid><description>&lt;div class='post'>
Depois de ter visto algumas vezes "Era uma vez no Oeste" (com Charles Bronson tocando harmônica), finalmente pude conferir o clássico "Três Homens em Conflito" (The Good, the Bad and the Ugly) do mestre Sergio Leone. &lt;br />&lt;br />Clint Eastwood, Eli Wallach e Lee Van Cleef estão perfeitos nessa história cheia de sangue, traições e a obcessão pela riqueza. As panorâmicas de Leone sobre o desertico velho oeste e a caracterização dos homens embrutecidos daquela época, onde a vida não valia mais do alguns dólares, são majestosas, com direito à mostrar parte da guerra civil americana.&lt;br />&lt;br />&lt;object width="425" height="344">&lt;param name="movie" value="http://www.youtube.com/v/hVnoaPPpWog&amp;hl=en&amp;fs=1">&lt;/param>&lt;param name="allowFullScreen" value="true">&lt;/param>&lt;embed src="http://www.youtube.com/v/hVnoaPPpWog&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344">&lt;/embed>&lt;/object>&lt;br />&lt;br />Esqueçam aqueles filmes de indios e tiros falsos: são personagens densos, únicos, em um momento diferente da história, com momentos fantásticos (como a cena em que o "Feio" monta um revolver com as peças de outros). Sem falar no olhar mortal do "Olhos de Anjo" Lee Van Cleef, que passa uma frieza na espinha...&lt;br />&lt;br />- "When you have to shoot, shoot. Don’t talk!"&lt;br />&lt;br />Sem falar no maravilhoso tema de Ennio Morriconi, clássico absoluto. O estilo Western não é vazio como muitos pensam, basta saber apreciar.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>fpasetto&lt;/div>
&lt;div class='content'>
Vlw meu velho, finalmente algo q venho engajando meus esforços vem a ser reconhecido...&lt;BR/>&lt;BR/>Abs&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Voltas às Aulas e o Java - parte 2</title><link>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</link><pubDate>Thu, 07 Aug 2008 17:43:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</guid><description>&lt;div class='post'>
Existe o clássico problema de determinar se um aluno passou ou não de ano quando são informados as notas e o número de faltas.&lt;br />&lt;br />Vejamos: &lt;br />1) O número de faltas é acima do permitido?. Aqui entra um &lt;span style="font-weight:bold;">if&lt;/span> dos bons com uma comparação numérica, quando um número é maior ou igual a outro.&lt;br />2) A média é basicamente somar as X notas e dividir por X (se for média aritmética). Somar e dividir são operações matemáticas básicas.&lt;br />&lt;br />Uma forma de fazer é:&lt;br />&lt;code> if( numero_de_faltas &amp;gt; maximo_de_faltas_toleradas) {&lt;br /> // reprovado por faltas&lt;br />} else if ( media_do_aluno &amp;lt; media_para_passar ){&lt;br /> // reprovado por nota&lt;br />} &lt;br />// se nem um nem outro, esta aprovado&lt;br />&lt;/code>&lt;br />&lt;br />O ruim dessa abordagem é que o aluno estar aprovado é uma condição "que sobra". Se passarmos a focar a aprovação do mesmo ficaria assim:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else {&lt;br /> // reprovado!&lt;br />}&lt;/code>&lt;br />&lt;br />É claro que eu posso que eu posso querer saber o motivo pelo qual o aluno foi reprovado:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else if(numero_de_faltas &amp;gt; maximo_de_faltas_toleradas){&lt;br /> // reprovado pelo número de faltas: ignoro a média.&lt;br />} else {&lt;br /> // aqui só sobra a reprovação por nota, &lt;br /> // basta fazer a tabela-verdade dessas expressões&lt;br />}&lt;/code>&lt;br />&lt;br />Se o foco do professor for o algoritmo, isso é o que deveria ser analisado. Quem implementa corretamente um método que recebe X notas e um número de faltas e consegue responder a essas perguntas consegue descrever facilmente os casos de teste para verificar se a implementação corresponde ao que se espera.&lt;br />&lt;br />Um programa que tenha algum tipo de interação (seja Swing ou console) ajuda a fazer um macarrão de código, mesclando o algoritmo com o controle de estado dos "menuzinhos". No fim vemos laços de repetição aonde não são necessários, calculo de média errado, etc.&lt;br />&lt;br />Ok, não acho que um marinheiro de primeira viagem devesse começar por JUnit, mas uma com boa noção dos fundamentos da linguagem e evitando a interação desnecessária com o usuario (poderia ser usado até os parâmetros do main), acredito num melhor desempenho. O risco é o aluno acreditar que java é dificil ou que tudo se resume a getters/setters e gigantescos try/catch's onde as exceptions são varridas pra debaixo do tapete. &lt;br />&lt;br />Eu colocaria TDD num segundo momento, mas ai sem perdão, ensinando o caboclo a fazer do jeito certo o quanto antes. O que é dificil se eles conseguem passar sem saber fazer aritmética básica.&lt;/div></description></item><item><title>Algumas pessoas PRECISAM fazer programas interativos</title><link>http://pacman.blog.br/blog/2008/08/06/algumas-pessoas-precisam-fazer/</link><pubDate>Wed, 06 Aug 2008 15:05:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/06/algumas-pessoas-precisam-fazer/</guid><description>&lt;div class='post'>
Este código:&lt;br />&lt;pre>&lt;code>#include &amp;lt;stdio.h&amp;gt;&lt;br />#include &amp;lt;stdlib.h&amp;gt;&lt;br />&lt;br />int main(int argc, char **argv){&lt;br /> int i;&lt;br /> double total =0;&lt;br />&lt;br /> for(i=1;i &amp;lt; argc;i++){&lt;br /> total = total + atof(argv[i]);&lt;br /> }&lt;br />&lt;br /> printf("A soma dos %d parametros eh %f\n",(argc - 1),total);&lt;br />&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />É limpo, prático e scriptável. Não preciso fazer pergunta nenhuma nem tratar nada que o usuario informe: no maximo posso ver o número de parâmetros e reclamar. Basta saber como funciona o laço for e saber que argc é o número de parâmetros que eu passei para o programa e argv é um vetor de strings (que, em C puro, são vetores de chars) onde cada elemento é um parâmetro. O primeiro é sempre o nome do programa (a posição 0, que eu pulei).&lt;br />&lt;br />&lt;pre>$ gcc -Wall soma.c&lt;br />$ ./a.out 1 2 3 4 5&lt;br />A soma dos 5 parametros eh 15.000000&lt;/pre>&lt;br />&lt;br />Eu compilo e pelo para que todos os warnings possiveis sejam mostrados. Novamente não tive nenhum problema e o código funciona bem. Nem um flush de stdin foi preciso. Se eu colocar uma palavra no meio, como abóbora, será ignorado.&lt;br />&lt;br />Não é mais facil assim do que fazer milhões de menus? Nem precisa de system("pause") system("cls")!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
hmmm...&lt;BR/>in.ignore(std::numeric_limits&lt;BR/>&amp;lt;std::streamsize&amp;gt;::max(),&amp;#39;\n&amp;#39;);&lt;BR/>in.get();&lt;BR/>??&lt;BR/>heheheh :D&lt;BR/>i agree&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Que fique registrado: system("pause") é um convite a &lt;B>morte&lt;/B>.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Test Driven Development - parte 1.</title><link>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</link><pubDate>Wed, 06 Aug 2008 14:31:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</guid><description>&lt;div class='post'>
Veja este código:&lt;br />&lt;br />&lt;pre>&lt;code> public void testEhPar() throws Exception{&lt;br /> assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /> assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /> assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /> &lt;br /> assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /> assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /> assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); &lt;br /> }&lt;/code>&lt;/pre>&lt;br />&lt;br />Dentro de uma classe de teste, usando o framework &lt;a href="http://junit.sourceforge.net/#Getting">JUnit&lt;/a>, a leitura dessas linhas é a seguinte:&lt;br />&lt;br />Eu tenho um objeto chamado &lt;span style="font-style:italic;">algortimo&lt;/span>.&lt;br />A chamada algoritmo.ehPar(2) deve retornar &lt;span style="font-weight:bold;">true&lt;/span>, pois 2 é par, e este método informa se o parâmetro informado é, ou não, par.&lt;br />O método &lt;span style="font-weight:bold;">assertTrue&lt;/span> recebe dois parâmetros: uma mensagem informando o significado deste teste, e o resultado do mesmo.&lt;br />&lt;br />Se o método estivesse com algum problema e retornasse false, isso:&lt;br />&lt;br />assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br />&lt;br />seria o mesmo que&lt;br />&lt;br />assertTrue("2 deve ser par",false);&lt;br />&lt;br />Logo, o teste falha, pois &lt;span style="font-weight:bold;">2 deve ser par&lt;/span>.&lt;br />&lt;br />Esta é uma forma &lt;span style="font-style:italic;">programática&lt;/span> de garantir o comportamento do código que eu desenvolvo: testando. Se o meu método só depende dos parâmetros informados, é muito simples verificar o seu funcionamento.&lt;br />&lt;br />Desenvolvendo os testes antes de implementar o código, tendo apenas as assinaturas dos métodos (por isso recorri a uma interface &lt;a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java.html">aqui&lt;/a>, lembra?), eu posso pensar nos comportamentos esperados e, então, vou desenvolvendo até que todos os testes estejam passando.&lt;br />&lt;br />Não é nada fácil, funciona melhor quando o projeto que estás desenvolvendo está começando, porém os resultados são excelentes: veja o quanto de tempo estás economizando! Se tu pretendes determinar se um código teu está funcionando por programas que perguntam os valores, escrever &lt;br />&lt;br />&lt;pre>$ ant clean test&lt;/pre>&lt;br />&lt;br />é muito mais rápido! &lt;br />&lt;br />O problema surge quando queremos fazer algo complexo, pois a dificuldade de testar mostra problemas na arquitetura adotada, por exemplo. Quanto temos objetos que tem objetos, herança, polimorfismo, tecnicas mais avançadas podem ser usadas como usar Mocks de objetos (e prover os mecanismos para injetar estes Mocks).&lt;br />&lt;br />No caso desse exemplo, esta é uma solução:&lt;br />&lt;pre>&lt;code>public boolean ehPar(int numero){&lt;br /> return numero % 2 == 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Muitos alunos desconhecem as operações de divisão e módulo entre inteiros. O 1, inteiro, dividido por 2, inteiro, não é 0.5, (em java), e sim 0, pois este é o resultado da divisão inteira. O resto da divisão, simbolizado por %, retorna 1. Dessa forma, o resto da divisão de um numero par por 2 é 0, caso contrario é um número inteiro. São operações básicas que precisam ser dominadas. Repare que eu fiz um código que funcione, não tentei nada mais maquiavélico que dê 0.0001 milissegundos mais rápido. &lt;a href="http://gc.blog.br/2008/01/08/a-falacia-da-otimizacao-prematura/">Evite a otimização precoce&lt;/a>.&lt;br />&lt;br />Programar profissionalmente é uma tarefa de &lt;span style="font-weight:bold;">muita&lt;/span> responsabilidade. Desenvolver testes para garantir a qualidade provê excelentes resultados a longo prazo.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Sim sim, escrevi errado!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>OLP&lt;/div>
&lt;div class='content'>
"caso contrario é um número inteiro" não seria "caso contrario o numero é impar" ?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Trocar de Emprego</title><link>http://pacman.blog.br/blog/2008/08/06/trocar-de-emprego/</link><pubDate>Wed, 06 Aug 2008 14:19:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/06/trocar-de-emprego/</guid><description>&lt;div class='post'>
Completando 6 meses de globo.com, refleti sobre a opção que fiz quando resolvi trocar de emprego. Vi essa semana muitas pessoas com duvidas de como ou quando fazer uma opção parecida, por isso resolvi colaborar.&lt;br />&lt;br />A primeira coisa que devemos pensar é na nossa carreira. As vezes chegamos ao limite na empresa onde estamos, ou não há perspectivas, ou a situação está ruim, etc. São muitas as coisas que podem acontecer. Com um mercado com falta de mão-de-obra &lt;span style="font-weight:bold;">qualificada&lt;/span>, muito profissional é assediado por empresas, prometendo as vezes salário maior, ou então surge uma oportunidade fora do estado. O que fazer?&lt;br />&lt;br />Todas as oportunidades devem ser vistas de forma crítica. Analise o futuro, a distância, o ambiente de trabalho e, também, a remuneração. Eu sempre escolhi o trabalho à remuneração, mas trabalho que paguem abaixo do esperado eu simplesmente não considero. Escolher um emprego vendo apenas o salário engana: imagine ganhar 20% a mais em um emprego mais longe, onde vais perder mais tempo no trajeto, será que compensa? Ou então sair de um ambiente legal para uma confusão absoluta, onde domingo é dia útil de trabalho? Pois é.&lt;br />&lt;br />Feito isso, temos que pensar em coisas práticas: todas as exigências são atendidas? Tem empresa que só se preocupa com diploma e certificações, mesmo que a sua bagagem supere todas expectativas. Se a empresa é em outra cidade ou estado, temos que analisar o custo de vida, mudança, lugar aonde morar (em grandes centros urbanos é &lt;span style="font-weight:bold;">sempre&lt;/span> caótico, veja isso com muito cuidado).&lt;br />&lt;br />O currículo precisa estar atualizado. Ja leu isto &lt;a href="http://info.abril.com.br/aberto/infonews/082008/06082008-25.shl">aqui&lt;/a>? E &lt;a href="http://pythonologia.org/2007/06/07/desempregado-ou-despreparado/">isso&lt;/a>?&lt;br />&lt;br />Nas entrevistas seja sincero e tenha confiança: tu és um produto, tens que te vender. E, se mentir, babau, vão descobrir mais cedo ou mais tarde... Pra isso, podes estudar bastante algum assunto (eu vim lendo as apostilas da Caelum na viagem de carro que fiz de PoA ao RJ).&lt;br />&lt;br />Por fim, planeje bem a transição: vale a pena sair com as portas abertas, caso ocorra algum problema. Seguindo estes passos é relativamente fácil optar por trocar, ou não, de emprego.&lt;br />&lt;br />O importante é se sentir bem aonde estás trabalhando e colaborar para que o ambiente evolua, caso contrario podes ficar fazendo o mesmo trabalho, da mesma forma, por muito tempo: até que um estágiario possa ficar no seu lugar ;-)&lt;br />&lt;br />Ps: &lt;a href="http://usabilidoido.com.br/como_vai_seu_ingles.html">como vai o seu inglês&lt;/a>?&lt;/div></description></item><item><title>Voltas às Aulas e o Java</title><link>http://pacman.blog.br/blog/2008/08/04/voltas-s-aulas-e-o-java/</link><pubDate>Mon, 04 Aug 2008 12:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/04/voltas-s-aulas-e-o-java/</guid><description>&lt;div class='post'>
Na época de volta às aulas nas faculdades percebe-se uma grande invasão de alunos desesperados em foruns de informática para resolverem os seus execícios. É facil reconhecer um aluno em pânico com o seu primeiro &lt;span style="font-style:italic;">while&lt;/span> ou algum exercício sobre Fibonacci: eles não tentam, simplesmente colam o enunciado do problema esperando a resposta pronta.&lt;br />&lt;br />Entretanto tão bizarro quanto são os exercícios propostos: um programa que leia pergunte 2 numeros e retorne a soma, ou um programa para calcular alguma coisa que pergunte ao usuário... perai, pergunte? Um programa perguntando? Como?&lt;br />&lt;br />Este é o típico programa 'interativo' com o usuário. Quando não usa a entrada padrão (algo completamente misterioso para boa parte dos alunos), usam algum recurso SWING. Mas sera que ninguem pensa o quão PREJUDICIAL são estes exercícios?&lt;br />&lt;br />Normalmente o aluno se preocupa com a apresentação do mesmo, fazendo frescuras de menuzinhos, asteriscos pra lá e pra cá... e o algoritmo que é bom nada. Sinceramente: dane-se os menuzinhos. Sabem quantos programas com menuzinhos e que vão perguntar alguma coisa pro usuario vcs vão fazer na vida profissional de vcs? 0! Zero! Nenhum!&lt;br />&lt;br />Existem muitas formas de interação com o usuario, hoje em dia vc pode ter interfaces web, por exemplo. Eu acho que, num primeiro momento, a única interação com o usuario deveria ser escrever na tela. Nada mais que isso se o camarada não sabe o que significa um NullPointerException.&lt;br />&lt;br />&lt;br />Exemplo pratico:&lt;br />&lt;br />- Prepare um diretório para trabalhar (suponho que vc vai usar linux, senão deve ser facil portar este exemplo para outros sistemas operacionais).&lt;br />- Crie um diretorio lib e copie o junit-4.4.jar pra lá (use o google pra baixar esse arquivo, se vc não conseguir saia do curso de informática).&lt;br />- Crie a estrutura abaixo, ainda no diretório de trabalho:&lt;br />src/java&lt;br />src/test&lt;br />- Instale o aplicativo ant (de novo o google te ajuda, alias vc tem algum JDK instalado, certo??).&lt;br />- Crie um arquivo chamado build.xml no diretorio de trabalho.&lt;br />- Baixe o arquivo ant-junit.jar daqui [ http://www.java2s.com/Code/Jar/ANT/Downloadantjunitjar.htm ] e copie o .JAR para ~/.ant/lib (se não existe, crie).&lt;br />&lt;br />Agora vem a proposta: baseado nessa interface:&lt;br />&lt;br />&lt;pre>&lt;code>public interface Algoritmo{&lt;br />/* dado um numero, retorna true se for par */ &lt;br />boolean ehPar(int numero);&lt;br />/* calcula o valor absoluto ou modulo de um numero, ex: -1 vira 1, 1 vira 1 */&lt;br />int calculaModulo(int numero);&lt;br />/* calcula algum termo da série de fibonacci: se 0, mostra o primeiro, se 1 mostra o segundo...*/&lt;br />int calculaFibonacci(int elemento);&lt;br />/* calcula o fatorial do numero indicado */&lt;br />long calculaFatorial(int numero);&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Vais criar uma classe chamada, digamos, SuaClasse que implementa esta interface (percebeu que tudo deve ficar em src/java não é?). Não pense na implementação dessa classe ainda.&lt;br />&lt;br />No diretorio src/test vc vai salvar esta classe:&lt;br />&lt;br />&lt;pre>&lt;code>import junit.framework.TestCase;&lt;br />&lt;br />public class AlgoritmoTeste extends TestCase{&lt;br /> Algoritmo algoritmo;&lt;br /> public void setUp(){&lt;br /> algoritmo = new SuaClasse();&lt;br /> }&lt;br /> &lt;br /> public void tearDown(){&lt;br /> algoritmo = null; &lt;br /> }&lt;br /> &lt;br /> public void testEhPar() throws Exception{&lt;br /> assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /> assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /> assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /> &lt;br /> assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /> assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /> assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaModulo() throws Exception{&lt;br /> assertTrue("modulo de 3 deve ser 3",algoritmo.calculaModulo(3) == 3);&lt;br /> assertTrue("modulo de -3 deve ser 3",algoritmo.calculaModulo(-3) == 3);&lt;br /> assertTrue("modulo de 5 deve ser 5",algoritmo.calculaModulo(5) == 5);&lt;br /> assertTrue("modulo de -5 deve ser 5",algoritmo.calculaModulo(-5) == 5); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaFibonacci() throws Exception{&lt;br /> assertTrue("elemento 0 da serie fibonacci deve ser 0",algoritmo.calculaFibonacci(0) == 0);&lt;br /> assertTrue("elemento 1 da serie fibonacci deve ser 1",algoritmo.calculaFibonacci(1) == 1);&lt;br /> assertTrue("elemento 2 da serie fibonacci deve ser 1",algoritmo.calculaFibonacci(2) == 1);&lt;br /> assertTrue("elemento 3 da serie fibonacci deve ser 2",algoritmo.calculaFibonacci(3) == 2); &lt;br /> assertTrue("elemento 4 da serie fibonacci deve ser 3",algoritmo.calculaFibonacci(4) == 3);&lt;br /> assertTrue("elemento 5 da serie fibonacci deve ser 5",algoritmo.calculaFibonacci(5) == 5);&lt;br /> assertTrue("elemento 6 da serie fibonacci deve ser 8",algoritmo.calculaFibonacci(6) == 8);&lt;br /> assertTrue("elemento 7 da serie fibonacci deve ser 13",algoritmo.calculaFibonacci(7) == 13); &lt;br /> assertTrue("elemento 11 da serie fibonacci deve ser 89",algoritmo.calculaFibonacci(11) == 89);&lt;br /> assertTrue("elemento 13 da serie fibonacci deve ser 223",algoritmo.calculaFibonacci(13) == 233); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaFatorial() throws Exception{&lt;br /> assertTrue("Fatorial de 1 deve ser 1",algoritmo.calculaFatorial(1) == 1);&lt;br /> assertTrue("Fatorial de 2 deve ser 2",algoritmo.calculaFatorial(2) == 2);&lt;br /> assertTrue("Fatorial de 3 deve ser 6",algoritmo.calculaFatorial(3) == 6);&lt;br /> assertTrue("Fatorial de 4 deve ser 24",algoritmo.calculaFatorial(4) == 24);&lt;br /> assertTrue("Fatorial de 5 deve ser 120",algoritmo.calculaFatorial(5) == 120);&lt;br /> assertTrue("Fatorial de 6 deve ser 720",algoritmo.calculaFatorial(6) == 720);&lt;br /> assertTrue("Fatorial de 10 deve ser 3628800L",algoritmo.calculaFatorial(10) == 3628800L); &lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Uma ideia sobre o JUnit pode ser encontrada aqui: [ http://guj.com.br/java.tutorial.artigo.40.1.guj ], alias o guj, na sessão de tutoriais, explica varias coisas, é ótimo material de referência!&lt;br />&lt;br />Ok, vc tem a interface que vc deve respeitar e um arquivo de teste. Vamos falar do arquivo de build do ant.&lt;br />&lt;br />&lt;pre>&lt;code>&amp;lt;project name="Meu Projeto" basedir="." default="dist"&amp;gt;&lt;br /> &amp;lt;description&amp;gt;&lt;br /> Aprendendo a fazer um build.xml para o ant&lt;br /> &amp;lt;/description&amp;gt;&lt;br />&lt;br /> &amp;lt;property name="lib" location="lib"/&amp;gt;&lt;br /> &amp;lt;property name="src" location="src/java"/&amp;gt;&lt;br /> &amp;lt;property name="test" location="src/test"/&amp;gt;&lt;br />&lt;br /> &amp;lt;property name="build" location="build"/&amp;gt;&lt;br /> &amp;lt;property name="dist" location="dist"/&amp;gt;&lt;br />&lt;br /> &amp;lt;path id="classpath.test"&amp;gt; &lt;br /> &amp;lt;pathelement location="${test}" /&amp;gt;&lt;br /> &amp;lt;pathelement location="${build}" /&amp;gt;&lt;br /> &amp;lt;pathelement location="${lib}/junit-4.4.jar" /&amp;gt;&lt;br /> &amp;lt;/path&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="init"&amp;gt;&lt;br /> &amp;lt;!-- Create the time stamp --&amp;gt;&lt;br /> &amp;lt;tstamp/&amp;gt;&lt;br /> &amp;lt;!-- Create the build directory structure used by compile --&amp;gt;&lt;br /> &amp;lt;mkdir dir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="compile" depends="init" description="compile the source " &amp;gt;&lt;br /> &amp;lt;!-- Compile the java code from ${src} into ${build} --&amp;gt;&lt;br /> &amp;lt;javac srcdir="${src}" destdir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="dist" depends="compile" description="generate the distribution" &amp;gt;&lt;br /> &amp;lt;!-- Create the distribution directory --&amp;gt;&lt;br /> &amp;lt;mkdir dir="${dist}/lib"/&amp;gt;&lt;br />&lt;br /> &amp;lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&amp;gt;&lt;br /> &amp;lt;jar jarfile="${dist}/lib/Algortimo-${DSTAMP}.jar" basedir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="clean" description="clean up" &amp;gt;&lt;br /> &amp;lt;!-- Delete the ${build} and ${dist} directory trees --&amp;gt;&lt;br /> &amp;lt;delete dir="${build}"/&amp;gt;&lt;br /> &amp;lt;delete dir="${dist}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="test" depends="compile"&amp;gt;&lt;br /> &amp;lt;javac srcdir="${test}"&amp;gt;&lt;br /> &amp;lt;classpath refid="classpath.test"/&amp;gt;&lt;br /> &amp;lt;/javac&amp;gt;&lt;br /> &amp;lt;junit&amp;gt;&lt;br /> &amp;lt;classpath refid="classpath.test" /&amp;gt;&lt;br /> &amp;lt;formatter type="brief" usefile="false" /&amp;gt;&lt;br /> &amp;lt;test name="AlgoritmoTeste"/&amp;gt;&lt;br /> &amp;lt;/junit&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&amp;lt;/project&amp;gt;&lt;br />&lt;/code>&lt;/pre>&lt;br />&lt;br />A utilização desse arquivo é muito simples, não se amedronte pelo tamanho do arquivo, o formato xml do ant é bizarro e verboso, sou muito mais um Makefile, porém uma vez com ele feito basta ir adicionando coisas "com cuidado". Sem falar que tudo tem documentação oficial cheia de exemplos, só não aprende quem &lt;span style="font-weight:bold;">não&lt;/span> quer.&lt;br />&lt;br />$ ant &lt;br />isso deve compilar a sua classe e gerar um jar (pode ser util no futuro).&lt;br />&lt;br />$ ant clean&lt;br />limpa os diretorios que vc acabou de criar com as suas paradas compiladas.&lt;br />&lt;br />$ ant test&lt;br />compila e executa os testes unítarios.&lt;br />&lt;br />É claro que vc vai dizer, e agora??? Bom, veja isso:&lt;br />&lt;br />&lt;pre>&lt;code>public class SuaClasse implements Algoritmo{&lt;br /> public boolean ehPar(int numero){return false;}&lt;br /> public int calculaModulo(int numero){ return -1;}&lt;br /> public int calculaFibonacci(int elemento){return -1;}&lt;br /> public long calculaFatorial(int numero){return -1;}&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Olha que legal! Uma classe que tem o minimo pra compilar! Agora vamos testar...&lt;br />&lt;br />&lt;pre>$ ant test&lt;br />Buildfile: build.xml&lt;br />&lt;br />init:&lt;br /> [mkdir] Created dir: /home/GLOBO.COM/peczenyj/test/junit/build&lt;br />&lt;br />compile:&lt;br /> [javac] Compiling 2 source files to /home/GLOBO.COM/peczenyj/test/junit/build&lt;br />&lt;br />test:&lt;br /> [javac] Compiling 1 source file&lt;br /> [junit] Testsuite: AlgoritmoTeste&lt;br /> [junit] Tests run: 4, Failures: 4, Errors: 0, Time elapsed: 0.005 sec&lt;br /> [junit] &lt;br /> [junit] Testcase: testEhPar(AlgoritmoTeste): FAILED&lt;br /> [junit] 2 deve ser par&lt;br /> [junit] junit.framework.AssertionFailedError: 2 deve ser par&lt;br /> [junit] at AlgoritmoTeste.testEhPar(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaModulo(AlgoritmoTeste): FAILED&lt;br /> [junit] modulo de 3 deve ser 3&lt;br /> [junit] junit.framework.AssertionFailedError: modulo de 3 deve ser 3&lt;br /> [junit] at AlgoritmoTeste.testCalculaModulo(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaFibonacci(AlgoritmoTeste): FAILED&lt;br /> [junit] elemento 0 da serie fibonacci deve ser 0&lt;br /> [junit] junit.framework.AssertionFailedError: elemento 0 da serie fibonacci deve ser 0&lt;br /> [junit] at AlgoritmoTeste.testCalculaFibonacci(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaFatorial(AlgoritmoTeste): FAILED&lt;br /> [junit] Fatorial de 1 deve ser 1&lt;br /> [junit] junit.framework.AssertionFailedError: Fatorial de 1 deve ser 1&lt;br /> [junit] at AlgoritmoTeste.testCalculaFatorial(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Test AlgoritmoTeste FAILED&lt;br />&lt;br />BUILD SUCCESSFUL&lt;br />Total time: 1 second&lt;/pre>&lt;br />&lt;br />Agora basta escrever codigo de verdade na SuaClasse e testar, estara pronto quando TUDO estiver passando. São 4 métodos básicos, sabendo lidar com variaveis locais, if e for, vc consegue muita coisa.&lt;br />&lt;br />Se eu fosse professor eu daria exercícios assim: o projeto deveria compilar e todos os testes deveriam passar senão o aluno leva 0. A nota viria de acordo com o que eu espero, posso usar um EMMA e ver a cobertura de código, posso avaliar a presença de um Javadoc que preste, etc.&lt;br />&lt;br />Enfim, eu seria um professor muito malvado }-)&lt;br />&lt;br />Não perca a parte 2 &lt;a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java-parte-2.html">aqui&lt;/a>, e uma introdução ao TDD &lt;a href="http://pacman.blog.br/2008/08/test-driven-development-parte-1.html">aqui&lt;/a>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Marcelo&lt;/div>
&lt;div class='content'>
Muito bom o post, parabéns. Na minha opinião todo professor poderia ser "ruim" desse jeito.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rafael Ponte&lt;/div>
&lt;div class='content'>
Excelente post, parabéns!&lt;BR/>&lt;BR/>Infelizmente muitos professores se preocupam mais com telinhas e "firulas" do que o que é importante na disciplina, pior é que muitos destes professores nunca nem ouviram falar sobre TDD ou mesmo testes unitários!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Gall&lt;/div>
&lt;div class='content'>
Está aí uma coisa que sempre achei errado e vi acontecer várias vezes com mais de um professor onde estudo: o cara começa ensinando bibliotecas para desenvolvimento de aplicações gráficas e detalhes específicos de determinada linguagem para uma galera que não sabe nada (e quando digo que não sabe nada digo que não sabem nem definir o termo) de algoritmos, ou herança e polimorfismo por exemplo.&lt;BR/>&lt;BR/>Terminam as matérias que envolvem programação sabendo como fazer sobrecarga de operadores, mas implementando toda a lógica de um programa dentro de uma única classe com métodos static. Sabem fazer janelas com botões bonitinhos, mas se matam para implementar a lógica do programa.&lt;BR/>&lt;BR/>Ficaria feliz se minha primeira aula de programação fosse no esquema do seu post. Sempre gostei de brincar com os exercícios propostos em sala, mas o cara era tão inflexível que certo dia veio me pedir para trocar de editor de texto, porque o que eu estava utilizando era complicado demais (vim) e me confundiria (wtf?). Tive aulas bastante boas depois, com um cara que valorizava o que é realmente essencial, mas alguns de meus colegas não tiveram a mesma sorte e continuaram tendo aulas desse tipo durante vários semestres.&lt;BR/>&lt;BR/>Triste é ver o camarada que me pediu para trocar de editor de texto sendo citado como "excelente professor para quem está começando". :-|&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
É aquilo, ou se aprende por necessidade ou pq se gosta da parada. Eu propus algo que, se alguem gosta de programar, vai se amarrar em fazer.&lt;BR/>&lt;BR/>Mas tem quem &lt;I>cague&lt;/I> pra isso. Paciência, depois vai pegar um estágio onde vai ter que fazer algo &lt;B>muito&lt;/B> pior e sem internet pra poder postar as dúvidas!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>tiago_stos&lt;/div>
&lt;div class='content'>
Concordo como Roger, professor que faz aluno pensar e aprender algo útil é visto como professor ruim, que não sabe ensinar. Caso verídico de um professor do semestre passado.&lt;BR/>&lt;BR/>Interessante notar que alguns professores que fazem os alunos pensarem mas ensino coisas inúteis não tem fama tão ruim...&lt;BR/>&lt;BR/>Agora, Tiago, vc deveria dar aulas para alguns professores sobre como ensinar de verdade... hehe&lt;BR/>&lt;BR/>Muito bom.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Roger Leite&lt;/div>
&lt;div class='content'>
É Tiago, você seria um professor malvado e muito odiado, porque, seguindo a experiência acadêmica que tive, todo professor que ensina algo útil, e faz os alunos pensarem, geralmente caem naquela listinha (de troca de professor) que vai pra secretaria.&lt;BR/>&lt;BR/>Pelo menos foi isso que eu vi acontecer. :(&lt;BR/>&lt;BR/>De qualquer maneira, concordo com o seu post, e se um dia eu der aula, vou seguir a dica !&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>CMilfont&lt;/div>
&lt;div class='content'>
Tiago, a academia não é para você. Você seria uam vergonha para seus colegas de "d[e]ocência".&lt;BR/>Onde já se viu utilizar Junit, ant e essas bizarrices em sala de aula?&lt;BR/>Cadê o bom e velho pascal? [engraçado que tem aluno do 5º semestre ainda chamando de pascoal]&lt;BR/>Cadê os System.out.println que todo sistema de vergonha tem?&lt;BR/>:)&lt;BR/>Tirando a brincadeira, muito bom seu artigo!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Falta o convite de alguma instituição de ensino, de preferência uma que não dê bola pras tais "Certificações".&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rafael Carneiro&lt;/div>
&lt;div class='content'>
Você já está indo no caminho correto... quando será professor mesmo? :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Tenho que dar o primeiro exemplo }-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Pra mim você está sendo bonzinho, pois você escreveu os testes pros alunos. Assim fica mole.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tor: Um sistema anónimo de comunicação na Internet</title><link>http://pacman.blog.br/blog/2008/07/08/tor-um-sistema-annimo-de-comunicao-na/</link><pubDate>Tue, 08 Jul 2008 16:14:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/07/08/tor-um-sistema-annimo-de-comunicao-na/</guid><description>&lt;div class='post'>
Pelo veto ao projeto de cibercrimes - Em defesa da liberdade e do progresso do conhecimento na Internet Brasileira&lt;br />&lt;br />http://www.petitiononline.com/veto2008/&lt;br />&lt;br />Se esta lei for aprovada, podemos fazer uso do Tor para navegar tranquilamente.&lt;br />&lt;br />Tor é um conjunto de ferramentas para um amplo grupo de organizações e particulares que desejam aumentar a sua segurança na Internet. Usar Tor pode ajudar a tornar anónima a navegação e publicação na Web, instant messaging, IRC, SSH, e outras aplicações que usem o protocolo TCP. Tor também disponibiliza uma plataforma para os programadores de software, criarem novas aplicações com funções de anonimato, segurança e privacidade já incorporadas.&lt;br />&lt;br />Tor pretende defender contra a análise de tráfego, uma forma de vigilância que ameaça o anonimato pessoal e a privacidade, a confidencialidade dos negócios e relacionamentos, e a segurança de estados. As comunicações são enviadas através de uma rede distribuída de servidores chamados onion routers, protegendo-nos de sites Web que constroem perfis com os nossos interesses, pequenos espiões que lêem os nossos dados ou registam que sites visitámos.&lt;br />&lt;br />A segurança do Tor aumenta à medida que a sua base de utilizadores aumenta e mais pessoas se oferecem para alojar servidores. Por favor considere oferecer o seu tempo ou oferecer a sua largura de banda. Convém lembrar que estamos a lidar com código em desenvolvimento — Não deve usar o Tor se precisa realmente de fortes garantias de anonimato. &lt;br />&lt;br />Fonte: http://www.torproject.org/index.html.pt&lt;/div></description></item><item><title>Sudo</title><link>http://pacman.blog.br/blog/2008/07/03/sudo/</link><pubDate>Thu, 03 Jul 2008 17:35:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/07/03/sudo/</guid><description>&lt;div class='post'>
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/sandwich.png">&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://imgs.xkcd.com/comics/sandwich.png" border="0" alt="" />&lt;/a>&lt;/div></description></item><item><title>Erlang é dificil (parte 2)</title><link>http://pacman.blog.br/blog/2008/06/19/erlang-dificil-parte-2/</link><pubDate>Thu, 19 Jun 2008 15:15:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/19/erlang-dificil-parte-2/</guid><description>&lt;div class='post'>
Agora vamos usar as funções específicas para manipular listas.&lt;br />&lt;br />&lt;pre>&lt;code>-module(tut).&lt;br />-export([generate/1]).&lt;br />&lt;br />%%&lt;br />%% Funcao generate(X)&lt;br />%% Quando X for 0, retorna [0]&lt;br />%% Quando X > 0, retorna [X,X-1,...,0]&lt;br />%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br />%%&lt;br />generate(0) -> [0];&lt;br />generate(L) when integer(L), L > 0 -> &lt;br /> lists:seq(0,L); % cria uma lista de 0 até L&lt;br />generate(L) when integer(L) -> &lt;br /> % vamos reverter a lista?&lt;br /> lists:reverse(generate(-L)).&lt;/pre>&lt;/code>&lt;br />&lt;br />Muito mais simples, certo? Veja o teste:&lt;br />&lt;br />&lt;pre>$ erl&lt;br />Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br />&lt;br />Eshell V5.5.5 (abort with ^G)&lt;br />1> c(tut). &lt;br />{ok,tut}&lt;br />2> tut:generate(5) ++ tut:generate(-5).&lt;br />[0,1,2,3,4,5,5,4,3,2,1,0]&lt;br />3> &lt;/pre>&lt;br />&lt;br />O operador ++ une 2 listas :)&lt;/div></description></item><item><title>Erlang é dificil?</title><link>http://pacman.blog.br/blog/2008/06/18/erlang-dificil/</link><pubDate>Wed, 18 Jun 2008 19:10:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/18/erlang-dificil/</guid><description>&lt;div class='post'>
Erlang é realmente dificil?&lt;br />&lt;br />&lt;pre>&lt;code>-module(tut).&lt;br />-export([generate/1]).&lt;br />&lt;br />%%&lt;br />%% Funcao generate(X)&lt;br />%% Quando X for 0, retorna [0]&lt;br />%% Quando X > 0, retorna [X,X-1,...,0]&lt;br />%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br />%%&lt;br />generate(0) -> [0];&lt;br />generate(L) when integer(L) -> gera_lista(L).&lt;br />&lt;br />gera_lista(L) when L &amp;gt; 0 -> gera_lista_direita(L);&lt;br />gera_lista(L) -> gera_lista_inversa(-L).&lt;br />&lt;br />gera_lista_direita(L) -> gera_lista_direita(L,[]).&lt;br />&lt;br />gera_lista_direita(-1,Z) -> Z;&lt;br />gera_lista_direita( L,Z) -> &lt;br /> %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /> gera_lista_direita(L - 1,[L | Z]).&lt;br />&lt;br />gera_lista_inversa(L) -> gera_lista_inversa(L,[]).&lt;br />&lt;br />gera_lista_inversa(-1,Z) -> Z;&lt;br />gera_lista_inversa( L,Z) -> gera_lista_inversa(L,0,Z).&lt;br />&lt;br />gera_lista_inversa(-1,_,Z) -> gera_lista_inversa(-1,Z);&lt;br />gera_lista_inversa( L,A,Z) -> &lt;br /> %io:format("chamando: h(~p,~p,Z)~n",[L,A]), &lt;br /> h(L - 1, A + 1,[A | Z]).&lt;/pre>&lt;/code>&lt;br />&lt;br />Ok, dessa forma é dificil. Erlang é uma linguagem funcional, ou seja, suas funções seguem um raciocínio matemático e não imperativo. Vc sente o problema quando quer resolver algo iterativo ou utilizar variaveis de qualquer forma.&lt;br />&lt;br />Fiz uma pequena função chamada generate, do modulo tut (de &lt;span style="font-style:italic;">tutorial&lt;/span>, uma vez que estou seguindo um). Ela é muito simples, se vc informar 0, ela gera uma lista simples contendo 0. Se vc passar um numero positivo ela gera uma lista de 0 até o número, inclusive. Se o numero for negativo, ele assume que vc quer fazer fazer a lista de forma inversa.&lt;br />&lt;br />Veja só:&lt;br />&lt;pre>$ erlc tut.erl # compilando o modulo&lt;br />$ erl&lt;br />Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br />&lt;br />Eshell V5.5.5 (abort with ^G)&lt;br />1> c(tut). # carregando o modulo&lt;br />{ok,tut}&lt;br />2> tut:generate(0). # invocando modulo:funcao(parametros).&lt;br />[0]&lt;br />3> tut:generate(10).&lt;br />[0,1,2,3,4,5,6,7,8,9,10]&lt;br />4> tut:generate(-10).&lt;br />[10,9,8,7,6,5,4,3,2,1,0]&lt;br />5> &lt;/pre>&lt;br />&lt;br />A função &lt;span style="font-weight:bold;">generate&lt;/span> chama a função gera_lista se o parametro passado for um número inteiro.&lt;br />A função &lt;span style="font-weight:bold;">gera_lista&lt;/span> chama a função para gerar a lista direita ou inversa, de acordo com o valor do parâmetro.&lt;br />&lt;br />Veja só a simplicidade:&lt;br />&lt;br />&lt;pre>&lt;code>gera_lista_direita(L) -> gera_lista_direita(L,[]).&lt;br />&lt;br />gera_lista_direita(-1,Z) -> Z;&lt;br />gera_lista_direita( L,Z) -> &lt;br /> %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /> gera_lista_direita(L - 1,[L | Z]).&lt;/pre>&lt;/code>&lt;br />&lt;br />quando eu chamo gera_lista_direita(10) eu estou, na verdade, chamado a função gera_lista_direita(10,[]), onde eu fico usando uma lista como acumulador.&lt;br />&lt;br />A operação [L | X] pode ser lida como [ elemento | lista ] , ou seja, eu adiciono um elemento em uma lista. gera_lista_direita(10,[]) vai chamar, então, gera_lista_direita(9,[10]), e depois gera_lista_direita(8,[9, 10]), e assim recursivamente até gera_lista_direita(-1,Z), quando eu retorno a lista. Fica claro se removerem os comentários (%) da frente dos io:format, que é a forma de fazer PPADD (Passei Por Aqui Driven Development) em Erlang.&lt;br />&lt;br />Erlang precisa de MUITA pratica, principalmente de quem nunca programou em uma linguagem funcional e fica tentado a fazer coisas 'não ortodoxas' ;-)&lt;br />&lt;br />Ah sim, o google é seu amigo:&lt;br />&lt;br />http://www.dei.isep.ipp.pt/~paf/orgcdocs/Intro_Erlang.pdf&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>anselmo alves&lt;/div>
&lt;div class='content'>
Para os que quiserem mais informações sobre BDD com Erlang no Giraffas ou até desmistificar o tema, acessem: &lt;A HREF="http://vp.blog.br/" REL="nofollow">2web&lt;/A>.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Exatamente. Mas eu bloguei primeiro }-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Mas o negócio não é só fazer BDD com Erlang, é fazer BDD com Erlang no Giraffas! Aí sim o bicho pega. Só conheço uma pessoa no mundo capaz de fazer isso.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Uma coisa de cada vez.&lt;BR/>&lt;BR/>Só depois eu descobri que erlang ja tem todas essas funções no módulo lists -- e deve ser até bem mais rápido.&lt;BR/>&lt;BR/>Erlante tem um framework eunit, mas ai fazer BDD com isso são outros 500.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Garnier&lt;/div>
&lt;div class='content'>
Legal Pac. Mas vc não explicou como fazer BDD com Erlang no Giraffas...&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tabela do Brasileirão 2008 com links + sed</title><link>http://pacman.blog.br/blog/2008/06/18/tabela-do-brasileiro-2008-com-links-sed/</link><pubDate>Wed, 18 Jun 2008 15:15:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/18/tabela-do-brasileiro-2008-com-links-sed/</guid><description>&lt;div class='post'>
O sed é um processador de texto muito versátil.&lt;br />&lt;br />O links é um browser modo texto com features tão interessantes quanto do antigo lynx.&lt;br />&lt;br />Ano passado eu &lt;a href="http://peczenyj.blogspot.com/2007/06/classificao-do-brasileiro-via-shell.html">postei&lt;/a> como imprimir a tabela do brasileirão com um one liner interessante. Agora eu resolvi beber de outra fonte:&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />TIME=Internacional&lt;br />COLOR=$(echo -ne '\e[31;1m&amp;\e[m')&lt;br />URL=http://globoesporte.globo.com/Esportes/Futebol/Classificacao/0,,ESP0-9827,00.html&lt;br />links --dump ${URL} | sed -r 's/\[[0-9]*\]//;/(^[0-9]|J jogos)/!d' | sed "s/${TIME}/${COLOR}/&lt;br /> 1a-----Libertadores----------&lt;br /> 4a-----Pre-Libertadores------&lt;br /> 5a-----Sul-Americana---------&lt;br /> 13a---------------------------&lt;br /> 17a-----Rebaixado-------------"&lt;/pre>&lt;/code>&lt;br />&lt;br />O resultado não é tão bom quanto o do ano passado, é verdade, mas não deixa de ser uma alternativa&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Alan Carvalho de Assis&lt;/div>
&lt;div class='content'>
Ola Tiago,&lt;BR/>gostei do script, muito fera.&lt;BR/>&lt;BR/>Um abraço,&lt;BR/>&lt;BR/>Alan&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Dê tempo ao tempo... ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Ivan Brasil Fuzzer&lt;/div>
&lt;div class='content'>
Com poucas alterações no script até o resultado melhora.&lt;BR/>Os bugs encontrados estão na cor e no time!&lt;BR/>Mudando para azul e Gremio fica bem melhor :-P&lt;BR/>&lt;BR/>Abraços.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Gerenciando Inovações</title><link>http://pacman.blog.br/blog/2008/06/13/blog-post/</link><pubDate>Fri, 13 Jun 2008 23:24:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/06/13/blog-post/</guid><description>&lt;div class='post'>
No ramo da tecnologia da informação, vulgo &lt;em>informática&lt;/em>, saber gerenciar inovações é uma &lt;em>arte&lt;/em>. Não tenho outras palavras para descrever o fato de vc olhar para uma ideia como o gmail, youtube, icq, orkut ou geocities e dizer "isso tem futuro". Mas não é bem assim.&lt;br />&lt;br />A história de cada inovação bem sucedida é extremamente complexa: são opiniões diversas, conflitos internos, apostas, brigas e muito trabalho para transformar uma ideia em algo que marque de verdade. Com certeza nada naquilo que temos hoje é o que foi imaginado de primeira, afinal os conceitos evoluem. Com certeza aquele chefe chato que barrava todas as ideias contribuiu, mesmo que indiretamente, para o sucesso da ideia.&lt;br />&lt;br />Ai tem um ponto interessante: quem não conhece aquele chefe que barra todas as ideias inovadoras? Estes são o outro extremo da coisa! A informática muda muito, as pessoas que tem computador hoje são diferentes das que tinham no passado e assim por diante, é dificil vc inovar sem se arriscar muito: é ai que entra o &lt;em>medo&lt;/em>.&lt;br />&lt;br />Em todos os ramos existe inovação, o que diferencia é a velocidade com a qual as coisas andam. Alguns ramos seguem as mesmas ideias por décadas ou séculos, enquanto outros ramos a escala é de semanas. É dificil não ter medo, afinal ou vc inova ou vc faz coisas loucas, inconsequentes, que podem destruir todo um trabalho de uma vida.&lt;br />&lt;br />O segredo é saber o que vc quer. Empresas de tamanho médio inovam com algum pé atrás, apostando em formulas consagradas e alguma novidade para quebrar o clima. Empresas grandes não podem se dar ao luxo de inovar sob pena de perder o fio da meada portanto podem comprar as empresas pequenas que, inovando, podem gerar lucro para gigantescas corporações multinacionais. E este é apenas um cenário de muitos que acontecem por ai. Temos empresas que sabem vender o convencional como se fosse inovação, e vice-versa. &lt;br />&lt;br />A questão é: como lidar com inovações quando as mesmas podem ser o próximo &lt;a href="http://pt.wikipedia.org/wiki/Microsoft_Bob">microsoft bob&lt;/a> ou o Iphone? Acho que cada um tem a sua formula: seja inovando ou comprando inovações por chegar a um tamanho que não é possivel não ser burocrata, cada um enfrenta essas novas tendências como acha melhor, trabalhando num ramo muito recente, onde as regras estão sendo escritas por bilhões de pessoas.&lt;br />&lt;br />A resposta não é algo vago como: dilheiro dá em árvores ou todos tem potencial para ser algo mágico, etc, etc. É necessário entender as inovações que surgiram nos ultimos 10 anos (flash, ajax, orkut, celular, busca por palavras chave, etc) e reconhecer que existem milhões/bilhões de pessoas que contribuem para isso e elas são extremamente intelectualmente ativas. Uma face disso são os projetos open source como Linux, Hibernate e Ruby on Rails que competem de igual para igual com gigantescas corporações.&lt;br />&lt;br />Resumindo: eu não sei lidar com inovações, mas elas chegam até mim via centenas de privilegiados que bebem da fonte. De alguma forma eu participo delas, mas não sei gerar nenhuma, tampouco saberia gerenciar, mas sei respeitar que o assunto é complexo e, principalmente, causa medo.&lt;br />&lt;br />Medo de prejuizos. Principalmente se alguem lembrar &lt;strong>muito&lt;/strong>, ou &lt;strong>pouco&lt;/strong>.&lt;/div></description></item><item><title>Pesquisando nos Grupos do Yahoo</title><link>http://pacman.blog.br/blog/2008/05/28/pesquisando-nos-grupos-do-yahoo/</link><pubDate>Wed, 28 May 2008 18:17:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/28/pesquisando-nos-grupos-do-yahoo/</guid><description>&lt;div class='post'>
Meu amigo MrBits me deu essa grande ideia:&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />QTDE=20&lt;br />CHARSET=UTF-8&lt;br />GROUP=shell-script&lt;br />&lt;br />while getopts g:c:q: OPTION ; do&lt;br /> case $OPTION in&lt;br /> g) GROUP=$OPTARG ;;&lt;br /> c) CHARSET=$OPTARG ;;&lt;br /> q) QTDE=$OPTARG ;;&lt;br /> esac&lt;br />done&lt;br />&lt;br />shift $(($OPTIND -1))&lt;br />&lt;br />SEARCH="$@"&lt;br />&lt;br />if [ -z "$SEARCH" ]; then &lt;br /> echo "Usage: $(basename $0) [-q qtde] [-g grupo] [-c charset] search" &lt;br /> exit 1&lt;br />fi&lt;br />&lt;br />BASEURL="http://br.groups.yahoo.com/group"&lt;br />URL="${BASEURL}/${GROUP}/msearch?submit=OK&amp;charset=${CHARSET}&amp;cnt=${QTDE}&amp;query=${SEARCH// /+}" &lt;br />SEDCMD="/message/!d;/${GROUP}/!d;/.*[0-9]/!d;s#/group#${BASEURL}#g;s/&lt;[^>]*span>//g;s/$/&amp;lt;br \/&amp;gt;/"&lt;br />&lt;br />LYNXOPT="-dump -force_html -assume_charset=${CHARSET}"&lt;br />lynx $LYNXOPT &lt;( curl -b /tmp/cookie$$ -sL "${URL}" | sed "${SEDCMD}" )&lt;/code>&lt;/pre>&lt;br />&lt;br />Vejamos em uso:&lt;br />&lt;pre>$ ./find.sh &lt;br />Usage: find.sh [-q qtde] [-g grupo] [-c charset] search&lt;br />&lt;br />$ ./find.sh -q 10 getopts # procurando por getopts limitando a 10 registros&lt;br /> [1]Re: [shell-script] Script de busca de mensagens&lt;br /> [2]Re: [shell-script] Re: script iterativo / passo a passo&lt;br /> [3]Re: [shell-script] Script de Backup&lt;br /> [4]Re: [shell-script] Script de Backup&lt;br /> [5]Re: [shell-script] Script de Backup&lt;br /> [6]Re: [shell-script] Script de Backup&lt;br /> [7]Re: [shell-script] Echo e executa: superecho&lt;br /> [8]Re: [shell-script] testar se parametro $1 foi passado&lt;br /> [9]Re: [shell-script] Echo e executa: superecho&lt;br /> [10]Re: [shell-script] testar se parametro $1 foi passado&lt;br />&lt;br />References&lt;br />&lt;br /> 1. http://br.groups.yahoo.com/group/shell-script/message/26373&lt;br /> 2. http://br.groups.yahoo.com/group/shell-script/message/26204&lt;br /> 3. http://br.groups.yahoo.com/group/shell-script/message/26078&lt;br /> 4. http://br.groups.yahoo.com/group/shell-script/message/26076&lt;br /> 5. http://br.groups.yahoo.com/group/shell-script/message/26075&lt;br /> 6. http://br.groups.yahoo.com/group/shell-script/message/26072&lt;br /> 7. http://br.groups.yahoo.com/group/shell-script/message/25742&lt;br /> 8. http://br.groups.yahoo.com/group/shell-script/message/25720&lt;br /> 9. http://br.groups.yahoo.com/group/shell-script/message/25719&lt;br /> 10. http://br.groups.yahoo.com/group/shell-script/message/25718&lt;/pre>&lt;br />&lt;br />Divertido, não? o default é procurar no grupo shell-script do yahoo, mas ele pode investigar em qualquer um.&lt;br />&lt;br />Valeu Mr.Bits!!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Hahaha... te amarrou, gc?&lt;BR/>&lt;BR/>Podes usar pra pesquisar no rioguj ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Chapiewski&lt;/div>
&lt;div class='content'>
\o/&lt;BR/>&lt;BR/>É por isso que bash é a melhor coisa de todo o universo!!!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Mas é facil, Roger!&lt;BR/>&lt;BR/>/padrão/!d -> apaga *todas* as linhas que *não* casam com o padrão&lt;BR/>&lt;BR/>s/padrão/substituição/g -> substitui, globalmente, o padrão pela substituição&lt;BR/>&lt;BR/>s#xxx#yyy#g -> mesma coisa, util para não ter que escapar o caracter /&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Roger Leite&lt;/div>
&lt;div class='content'>
Putz Tiago ! Você tá ficando muito louco mesmo, deve ser o sol ai do Rio ... não é possível !&lt;BR/>&lt;BR/>Estes comandos de sed são de arrepiar, um dia ainda vou entender isso "nativo".&lt;BR/>&lt;BR/>flw e sucesso!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
VB ? NUNCA!!!&lt;BR/>&lt;BR/>Mas ja fiz coisas com VBScript... :$&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
Tiago, tu ta ficando cada vez pior cara. Já pensou em dar um tempo e programar um pouco em Visual Basic?&lt;BR/>&lt;BR/>&lt;BR/>hehe.. muito bom!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Francisco Ayala: Ciencia e Religiao</title><link>http://pacman.blog.br/blog/2008/05/27/francisco-ayala-ciencia-e-religiao/</link><pubDate>Tue, 27 May 2008 23:18:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/27/francisco-ayala-ciencia-e-religiao/</guid><description>&lt;div class='post'>
Interessante conclusão do Francisco J. Ayala:&lt;br />&lt;br />&lt;blockquote>Considere que pelo menos 20% das gravidezes notoriamente terminam em aborto espontâneo. Se isso resulta de anatomia divinamente inspirada Deus é o médico que mais realiza abortos.&lt;/blockquote>&lt;br />&lt;br />Vale a pena ler o resto &lt;a href="http://g1.globo.com/Noticias/Ciencia/0,,MUL487576-5603,00-EXPADRE+DEFENDE+QUE+DEUS+E+TEORIA+EVOLUTIVA+DE+DARWIN+SAO+COMPATIVEIS.html">aqui&lt;/a>&lt;br />&lt;br />O começo:&lt;br />&lt;blockquote>Ex-padre defende que Deus e teoria evolutiva de Darwin são compatíveis&lt;br />&lt;br />Para um professor universitário, Francisco J. Ayala passa muito tempo na estrada. &lt;br />Biólogo e geneticista evolutivo na Universidade da Califórnia em Irvine, ele freqüentemente fala em universidades, igrejas e qualquer outro lugar, geralmente em defesa da teoria da evolução e contra argumentos do criacionismo e seu primo ideológico, o design inteligente.&lt;/blockquote>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Mas ai é chutometro ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>voyeg3r&lt;/div>
&lt;div class='content'>
Já parou pra pensar que este número pode estar relacionado com a tal "vida moderna", a força do capitalismo que nos faz comer toda porcaria que há. Além do mais a indústria do aborto assim como a das armas também manipula números em seu favor. Fiquemos bem cientes que há sim um forte lobby sedento por sangue e lucros tão organizado quanto o que fez os brasileiros pensarem que armas protegem a vida!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Hello World orientado a objetos</title><link>http://pacman.blog.br/blog/2008/05/21/hello-world-orientado-objetos/</link><pubDate>Wed, 21 May 2008 13:47:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/21/hello-world-orientado-objetos/</guid><description>&lt;div class='post'>
Hoje em dia é raro um desenvolvedor conhecer bem apenas uma linguagem. Em nome da multidisciplinaridade, decidi mostrar algums exemplos do mesmo programa: uma classe HelloWord com um construtor que recebe uma mensagem ("ola mundo") e um método show() que imprime essa mensagem.&lt;br />&lt;br />Vejamos um exemplo em C++&lt;br />&lt;br />&lt;pre>&lt;code>#include &amp;lt;iostream&amp;gt;&lt;br />#include &amp;lt;string&amp;gt;&lt;br />using namespace std;&lt;br />&lt;br />class HelloWorld{&lt;br /> string mensagem;&lt;br /> public:&lt;br /> HelloWorld(string mensagem) { // construtor!&lt;br /> this-&amp;gt;mensagem = mensagem;&lt;br /> }&lt;br /> &lt;br /> void show() { // metodo show&lt;br /> cout &amp;lt;&amp;lt; "mensagem: " &amp;lt;&amp;lt; this-&amp;gt;mensagem &amp;lt;&amp;lt; endl;&lt;br /> }&lt;br />};&lt;br />int main()&lt;br />{&lt;br /> HelloWorld obj("ola mundo");&lt;br /> obj.show();&lt;br /> return(0);&lt;br />}&lt;br />&lt;/code>&lt;/pre>&lt;br />&lt;br />Agora o mesmo código em Java:&lt;br />&lt;br />&lt;pre>&lt;code>package Hello;&lt;br />&lt;br />public class HelloWorld{&lt;br /> private String mensagem;&lt;br /> public HelloWorld(String mensagem){ &lt;br /> this.mensagem = mensagem;&lt;br /> }&lt;br /> public void show() { &lt;br /> System.out.println("mensagem: " + mensagem);&lt;br /> }&lt;br /> public static void main(String [] args){&lt;br /> HelloWorld obj = new HelloWorld("ola mundo");&lt;br /> obj.show();&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Agora, percebam a simplicidade do Ruby:&lt;br />&lt;pre>&lt;code>class HelloWorld&lt;br /> def initialize(mensagem)&lt;br /> @mensagem = mensagem &lt;br /> end&lt;br /> def show &lt;br /> puts "mensagem: #{@mensagem}"&lt;br /> end&lt;br />end&lt;br />&lt;br />obj = HelloWorld.new "ola mundo"&lt;br />obj.show&lt;/code>&lt;/pre>&lt;br />&lt;br />Agora em Perl (sim, Perl!)&lt;br />&lt;pre>&lt;code>package HelloWorld;&lt;br />&lt;br />sub new&lt;br />{&lt;br /> my ($class, $mensagem) = @_;&lt;br /> my $self = { mensagem =&amp;gt; $mensagem };&lt;br /> bless $self, $class; # abençoando a variavel!&lt;br /> return $self;&lt;br />}&lt;br />&lt;br />sub show&lt;br />{&lt;br /> my $self = shift; # sim, ela vem como argumento!&lt;br /> print "mensagem: " . $self-&amp;gt;{mensagem} . "\n";&lt;br />}&lt;br />&lt;br />my $obj = new HelloWorld("ola mundo");&lt;br />$obj-&amp;gt;show(); # parece artificial, não?&lt;br />&lt;br />1;&lt;/code>&lt;/pre>&lt;br />&lt;br />PHP também é: &lt;br />&lt;pre>&lt;code>&amp;lt;?php&lt;br />&lt;br />Class HelloWorld{&lt;br /> var $mensagem = "";&lt;br /> function HelloWorld($mensagem){&lt;br /> $this-&amp;gt;mensagem = $mensagem;&lt;br /> }&lt;br /> function show(){&lt;br /> echo "mensagem : " . $this-&amp;gt;mensagem . "&amp;lt;br/&amp;gt;";&lt;br /> }&lt;br />}&lt;br />&lt;br />$obj = new HelloWorld("ola mundo");&lt;br />$obj-&amp;gt;show();&lt;br />?&amp;gt;&lt;/code>&lt;/pre>&lt;br />&lt;br />Por fim, vamos criar um tipo usando JavaScript&lt;br />&lt;pre>&lt;code>function HelloWorld(mensagem){&lt;br /> this.mensagem = mensagem;&lt;br /> this.show = function(){&lt;br /> alert("mensagem: " + this.mensagem);&lt;br /> }&lt;br />}&lt;br />&lt;br />var obj = new HelloWorld("ola mundo");&lt;br />obj.show();&lt;/code>&lt;/pre>&lt;br />&lt;br />Edit: Python, atendendo a diversos pedidos&lt;br />&lt;pre>&lt;code>class HelloWorld:&lt;br /> def __init__(self, arg):&lt;br /> self.message = arg&lt;br />&lt;br /> def show(self):&lt;br /> print "mensagem: ", self.message&lt;br />&lt;br />hello = HelloWorld("Ola Mundo")&lt;br />hello.show()&lt;/code>&lt;/pre>&lt;br />&lt;br />A diferença entre uma linguagem e outra está (entre outras coisas) na sintaxe: em Perl eu tenho que criar os mecanismos na mão (com bless e receber $self) mas em Java e Ruby é tudo muito natural. Em Javascript eu não tenho uma construtor propriamente dito (muito menos classes) mas uma função (e crio um objeto dando um new nessa função). &lt;br />&lt;br />Vou abordar o tema "herança" no proximo post, espero que seja útil :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>douttorx&lt;/div>
&lt;div class='content'>
Opa cara, que legal o post.&lt;BR/>estava procurando hello world em C++.&lt;BR/>um abraço.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Cauê&lt;/div>
&lt;div class='content'>
Oi cara!&lt;BR/>Sou do Rio grande do sul e faço faculdade de Eng.Elétrica na Unipampa de Alegrete e vi um post teu em um site sobre um programa em C++ que precisava usar a biblioteca math.&lt;BR/>Tirei uma duvida ali contigo pq não lembrava que tinha que passar o grau pra radianos antes de transformar.&lt;BR/>Eu gostaria que se quando eu tiver alguma duvida eu posso te avisar e quem sabe evoluir meus conhecimentos em C++.&lt;BR/>Abraço.&lt;BR/>Meu msn é : caue_cmm@hotmail.com&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
Bah, Perl dói o olho. hehe&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Airton Arantes&lt;/div>
&lt;div class='content'>
Só para complementar o post do amigo,Olhem esse post no meu blog:&lt;BR/>&lt;BR/>http://defopenblog.wordpress.com/2008/05/07/e-eu-que-pensei-que-ja-tinha-visto-de-tudo/&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
LG, pena que o comentario destruiu a indentação (que é fundamental no Python). Também esqueci do C#, mas é 99% igual ao Java.&lt;BR/>&lt;BR/>Só não consegui fazer um exemplo em SmallTalk :(&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>lg&lt;/div>
&lt;div class='content'>
Tiago,&lt;BR/>&lt;BR/>Muito bacana seu post. &lt;BR/>Colaborando com a proposta do seu texto, fiz um código, em Python, que ficou assim:&lt;BR/>&lt;BR/>class helloWord():&lt;BR/> def __init__(self, msg):&lt;BR/> self.hello_msg = msg&lt;BR/> def show(self):&lt;BR/> print self.hello_msg&lt;BR/> &lt;BR/>a = helloWord("Ola Mundo !")&lt;BR/>a.show()&lt;BR/>&lt;BR/>Abraços,&lt;BR/>Luiz Guilherme &lt;BR/>lg.aldabalde em gmail.com&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Gallimimus&lt;/div>
&lt;div class='content'>
Pô Thiago faltou em Shell Script ahahahah, abraços e parabéns pelo post.&lt;BR/>&lt;BR/>Carlos Ferreira&lt;BR/>http://carnivorosemdentes.blogspot.com/&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>CRDS - Conselho Regional de Desenvolvedores de Software</title><link>http://pacman.blog.br/blog/2008/05/02/crds-conselho-regional-de/</link><pubDate>Fri, 02 May 2008 16:07:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/crds-conselho-regional-de/</guid><description>&lt;div class='post'>
Num futuro não muito distante, o carlinhos está desenvolvendo um pequeno sistema de contas a pagar para a &lt;em>Padaria do Manoel&lt;/em>. Entretando o seu local de trabalho recebe uma visita de um fiscal do CRDS!&lt;br />&lt;br />- Pronto &lt;br />- Sr Carlos Silva?&lt;br />- É ele.&lt;br />- Meu nome é Teobaldo, sou fiscal do Conselho Regional de Desenvolvedores de Software. Fiquei sabendo que nesse recindo está sendo desenvolvido um "software".&lt;br />- Exato! To desenvolvendo um...&lt;br />- Antes de mais nada, qual a sua formação?&lt;br />- Sou formado em ciências da computação pela faculdade VIVA VIVER, do Acre, na modalidade EAD. Meu trabalho de conclusão foi "um sistema escrito em java para a web 2.0".&lt;br />- Puxa, ultimamente só tem dado essa faculdade. &lt;br />- Po, ela custa 49,99 por mês...&lt;br />- É claro. Continuando, onde está a ART desse sistema?&lt;br />- Bom, é um sistema pequeno, com menos de mil linhas, precisa ART?&lt;br />- Claro, e vc pode imprimir o boleto pelo site da CRDS, não tem desculpas.&lt;br />- Ok. Eu pagarei...&lt;br />- E onde está a documentação do sistema? Cadê o levantamento de requisitos, análise de impacto, análise de riscos, análise...&lt;br />- EI! O meu sistema foi feito utilizando metodologias ágeis! É uma mistura de SCRUM com XP proporcionando um contrato de escopo aberto onde eu tento atender as necessidades do cliente, evitando burocracia, trabalhando em sprints de 15 dias...&lt;br />- Ok, mas o CRDS &lt;strong>exige&lt;/strong> essa documentação no template .doc que vc pode baixar do site&lt;br />- Mas q .doc ?? Ta maluco, eu uso openoffice no meu linux.&lt;br />- Linux ?? Vc desenvolve em um sistema operacional não homologado pela CRDS? Se ainda fosse Ubuntu...&lt;br />- Mas Ubuntu é linux.&lt;br />- Chega, se não tem documentação, como vc sabe que o sistema funciona?&lt;br />- Eu uso testes unitários!&lt;br />- Humm... teste precisa de um profissional habilitado em testes.&lt;br />- Mas eu uso JUNIT, veja!&lt;br />- Ei... q java esquisito é esse com esses @ e esses "maior e menor"?&lt;br />- Isso se chama Annotations e Generics! Ta desde o Java 1.5&lt;br />- Desculpe mas o CRDS só permite o uso de Java 1.4.2 que é a versão homologada para o Windows E Ubuntu.&lt;br />- E se eu estivesse usando MacOS ?&lt;br />- MacOS não foi homologado pelo CRDS ainda.&lt;br />- Mas java é multiplataforma!&lt;br />- Certo certo... e o modelo ER?&lt;br />- Eu uso Hibernate para Abstrair o modelo ER..&lt;br />- Hibernate ? Ok, terei que embargar o seu sistema...&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>felipespsousa&lt;/div>
&lt;div class='content'>
vc dá para um bom comentarista hein petiene!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Jonas Ferreira - Thunder-Boy&lt;/div>
&lt;div class='content'>
Moro, trabalho e me formei em uma faculdade aqui de Rio Branco - Acre, ainda bem que aqui não existem faculdades a este preço, 49.99, se não o conto seria mais real! :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Sensacional hahahaha&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
Muito bom!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>tiago_stos&lt;/div>
&lt;div class='content'>
Hehe, muito bom. Pena que a piada perde um pouco a grança quando lembramos que algo assim pode acontecer aqui em nosso país em pouco tempo.&lt;BR/>&lt;BR/>Ta certo, não exatamente desse jeito, talvez até pior...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Pior q eu esqueci um dialogo: quando o fiscal pergunta sobre os Design Patterns utilizados, mas ficou legal do mesmo jeito :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Isso soa ridículo para qum é da área.&lt;BR/>&lt;BR/>Mas vai mandar um senador ler isso aí :-(&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>MagoSabeTudo!!!&lt;/div>
&lt;div class='content'>
Muito boa essa!&lt;BR/>&lt;BR/>Espero que nunca aconteça esse tipo de coisa!!!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Cássio Marques&lt;/div>
&lt;div class='content'>
Muito bom! Essa conseguiu ser mais legal que a da Tropa de Elite!&lt;BR/>É rir pra não chorar...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Elton&lt;/div>
&lt;div class='content'>
Imagine um post exagerado :-)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>TDD com Perl</title><link>http://pacman.blog.br/blog/2008/05/02/tdd-com-perl/</link><pubDate>Fri, 02 May 2008 15:00:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/tdd-com-perl/</guid><description>&lt;div class='post'>
É possivel fazer Test Driven Development com Perl? Mas claro :)&lt;br />&lt;br />Artigo interessante sobre &lt;a href="http://perldoc.perl.org/Test/More.html">Test::More&lt;/a>:&lt;br />&lt;a href="http://www.testingreflections.com/node/view/5333">http://www.testingreflections.com/node/view/5333&lt;/a>&lt;br />&lt;br />Tutorial bem sucinto:&lt;br />&lt;a href="http://www.wgz.org/chromatic/perl/IntroTestMore.pdf">http://www.wgz.org/chromatic/perl/IntroTestMore.pdf&lt;/a>&lt;br />&lt;br />Excelente apresentação:&lt;br />&lt;a href="http://wellington.pm.org/archive/200606/tdd/">http://wellington.pm.org/archive/200606/tdd/&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Trabalho que é coisa séria ninguem comenta... ;-)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Pra descontrair...</title><link>http://pacman.blog.br/blog/2008/05/02/pra-descontrair/</link><pubDate>Fri, 02 May 2008 14:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/pra-descontrair/</guid><description>&lt;div class='post'>
&lt;a href="http://4.bp.blogspot.com/_TDd0BWQ-Qes/SBtVFGpuiHI/AAAAAAAAABM/hfcTSKDN2wg/s1600-h/padre.jpg">&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_TDd0BWQ-Qes/SBtVFGpuiHI/AAAAAAAAABM/hfcTSKDN2wg/s320/padre.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5195840141275334770" />&lt;/a>&lt;br />&lt;a href="http://charges.uol.com.br/2008/04/30/ronike-e-os-trans-cantam-mulheres">&lt;iframe width="339" height="299" scrolling="no" frameborder="0" src="http://charges.uol.com.br/charge-share/2008/04/30/ronike-e-os-trans-cantam-mulheres/">&lt;/iframe>&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Gustavo&lt;/div>
&lt;div class='content'>
Lancei uma campanha também.. Comente http://www.lichti.eti.br/onde-o-padre-voador-esteve/ por onde o padre ainda vai passar. O melhor comentário vai ganhar um vôo com balões para ajudar o Padre&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Regulamentar a profissão dos outros é refresco</title><link>http://pacman.blog.br/blog/2008/05/02/regulamentar-profisso-dos-outros/</link><pubDate>Fri, 02 May 2008 14:26:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/regulamentar-profisso-dos-outros/</guid><description>&lt;div class='post'>
Na onda da campanha contra a regulamentação das profissões da área de informática&lt;br />&lt;br />Eu, que trabalho como Analista de Sistemas e tenho Bacharelado em Física incompleto, tenho uma grande inveja do Phillip Calçado, que trabalha na Austrália, e postou recentemente sobre essa “lei”.&lt;br />&lt;br />&lt;a href="http://blog.fragmental.com.br/2008/03/21/ainda-bem-que-estou-aqui/">http://blog.fragmental.com.br/2008/03/21/ainda-bem-que-estou-aqui/&lt;/a>&lt;br />&lt;br />Cito a opinião da &lt;a href="http://www.sbc.org.br/index.php?language=1&amp;subject=107">Sociedade Brasileira de Computação &lt;/a>&lt;br />&lt;br />&lt;blockquote>1. Exercício da profissão de Informática deve ser livre e independer de diploma ou comprovação de educação formal.&lt;br />2. Nenhum conselho de profissão pode criar qualquer impedimento ou restrição ao princípio acima.&lt;br />3. A área deve ser Auto-Regulada.&lt;/blockquote>&lt;br />&lt;br />Parece que os politicos querem saber mais de informática do que quem é da área (se bobear ninguem sabe o que é a ACM, devem achar que é um politico a pouco falecido). Fico com pena de algumas pessoas egoístas que pensam “tenho diploma, logo essa lei me favorece”. A nação brasileira frperde como um todo, retrocendendo décadas numa das atitudes mais lastimáveis de todos os tempos.&lt;br />&lt;br />Parafraseando o &lt;a href="http://www.kumpera.net">Rodrigo Kumpera&lt;/a>:&lt;br />&lt;br />&lt;blockquote>Para ser programador vamos precisar ter diploma, enquanto isso para fazer política basta assinar o nome. Regulamentar a profissão dos outros é refresco.&lt;/blockquote>&lt;br />&lt;br />Segue a thread: http://br-linux.org/2008/campanha-contra-o-projeto-de-lei-6072007-de-regulamentacao-das-profissoes-da-area-de-informatica/&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Pura ignorância. Sou formado, mas antes mesmo de me formar já atuava na área. Normalmente quem apóia esse tipo de medida são os que tem medo de concorrência. Ou seja, os incompetentes.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Pois é Thadeu,&lt;BR/>&lt;BR/>Acredito que existem casos e casos. Eu &lt;B>não&lt;/B> quero ser impedido de trabalhar, por exemplo, por não ter faculdade na área, coisa que não é preciso em boa parte do (senão todo o) mundo avançado.&lt;BR/>&lt;BR/>Acho que precisamos de uma legislação adequada e que atenda às necessidades brasileiras. &lt;B>SE&lt;/B> tivessemos uma carga de tributos menor sobre os trabalhadores, &lt;B>SE&lt;/B> tantas outras coisas... Um dia a coisa vai.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Thadeu Penna&lt;/div>
&lt;div class='content'>
Oi Tiago,&lt;BR/>&lt;BR/>os físicos também estão às voltas com a regulamentação. Também a visão da maioria é contra a regulamentação. O processo só está andando pois precisamos nos proteger das outras regulamentações. Exemplo: no último concurso para geofísicos na Petrobras foram aceitos geofísicos, geólogos e físicos. Os físicos formam a imensa maioria dos aprovados. Agora existe uma corrente para proibir a inscrição de físicos. Isto é possível pois como a profissão de físico não é regulamentada, outras podem pedir exclusividade nas tarefas, desde que não impeçam outros regulamentados que possam cumprir a mesma tarefa. Se fôssemos regulamentados, e na regulamentação constasse que físicos podem trabalhar como Geofísica, então a proibição seria anulada. A posição da comunidade, durante muito tempo, foi de contrária à regulamentação de profissões que não lidam com risco de vida diretamente, mas devido à proliferação de regulamentações, chega uma hora em que tem que se proteger. &lt;BR/>&lt;BR/>Por exemplo, lavador e guardador de carro é regulamentado, mas para operador de piscina, a regulamentação foi negada. Daqui a pouco, você não poderá fazer nada, nem na sua casa. &lt;BR/>&lt;BR/>[]s&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Código transparente, contas fechadas ?</title><link>http://pacman.blog.br/blog/2008/05/02/cdigo-transparente-contas-fechadas/</link><pubDate>Fri, 02 May 2008 14:24:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/cdigo-transparente-contas-fechadas/</guid><description>&lt;div class='post'>
Engraçado como &lt;a href="http://br-linux.org/2008/fisl-90-participante-do-temario-do-evento-publica-avaliacao-critica-e-convite-a-manifestacoes/">começamos&lt;/a> &lt;a href="http://br-linux.org/2008/fisl-e-a-transparencias-das-contas-em-eventos-da-comunidade/">a falar &lt;/a>em “Transparência de Contas” e aparece gente dizendo q queremos acabar com o FISL. Parece que a ideia é “&lt;b>Aceite o FISL como ele É ou tu és contra o software livre no Brasil&lt;/b> (e provavelmente usa &lt;i>Windows&lt;/i> em casa)”.&lt;br />&lt;br />Mesmo que o FISL acabasse (o que não vai acontecer, e ninguem quer) existem dezenas de eventos acontecendo pelo Brasil afora (alguns com palestrantes internacionais até). O FLISOL aconteceu em diversas cidades simultaneamente, por exemplo. Esses eventos só tendem a crescer e se profissionalizar, criando todo um ecossistema de divulgação de conhecimento técnico.&lt;br />&lt;br />“Código transparente, contas fechadas” é um lema perigoso que pode acabar com a reputação da comunidade de software livre brasileira.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Depois dos &lt;A HREF="http://marc.info/?l=openbsd-misc&amp;m=119730630513821&amp;w=2" REL="nofollow">comentários do Richard Stallman&lt;/A> na comunidade de Open BSD (dizendo: "isto aqui não tem a minha bênção") eu só posso deduzir que existe &lt;B>muito&lt;/B> fanatismo nesse meio, e de gente que teoricamente prega &lt;I>liberdade&lt;/I>.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
No mínimo estranhas as reações da comunidade ao se exigir a abertura das contas do Fisl. Parecem-me fruto de fanatismo.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Calendário do Tchelinux 2008&lt;BR/>http://tchelinux.org/blog/?p=1&lt;BR/>&lt;BR/>Um dos poucos grupos 100% autônomos, que levam o software livre a quem precisa, colocando muito suor. Para assistir às palestras basta levar alimentos não perecíveis que depois são revertidos à alguma entidade que precise, de forma &lt;I>transparente&lt;/I>.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Manipulando logs com AWK e SED</title><link>http://pacman.blog.br/blog/2008/04/26/manipulando-logs-com-awk-e-sed/</link><pubDate>Sat, 26 Apr 2008 14:41:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/26/manipulando-logs-com-awk-e-sed/</guid><description>&lt;div class='post'>
Eis que a lista de &lt;a href="http://br.groups.yahoo.com/group/shell-script/">shell script&lt;/a> traz um bom desafio.&lt;br />&lt;br />&lt;cite>Galera, tenho o seguinte log.:&lt;br />&lt;br />AAAA-------------campo_1-------------campo_2-----campo_3----campo_4---------- &lt;br />teste_1 371508787 371547453 38666 testetesteteste&lt;br />&lt;br />BBBB-------------campo_1-------------campo_2-----campo_3----campo_4---------- &lt;br />teste_2 4625081503 4651313710 26232207 testetesteteste&lt;br />&lt;br />Estou a tentar usar o awk com a seguinte função : &lt;br />awk '$1~"teste_" {print $5";"$4}' teste > teste_.csv&lt;br />&lt;br />a funcao busca realmente o que desejo:&lt;br />$5 $4&lt;br />testetesteteste 38666&lt;br />testetesteteste 6232207&lt;br />&lt;br />porem,, gostaria que seprasse da forma:&lt;br />&lt;br />AAAA------------- &lt;br />testetesteteste 38666 &lt;br />BBBB------------- &lt;br />testetesteteste 26232207 &lt;br />&lt;br />Alguém tem uma dica de como fazer?&lt;/cite>&lt;br />&lt;br />Ah... o bom e velho &lt;span style="font-weight:bold;">SED&lt;/span> pode resolver isso&lt;br />&lt;br />&lt;code>$ sed -rn '/(^[^-]+-+).*/{s//\1/;h};&lt;br />/^teste_/{s/.* ([^ ]+) +([^ ]+$)/\2 \1/;x;p;g;p}' arquivo.log&lt;br />AAAA-------------&lt;br />testetesteteste 38666&lt;br />BBBB-------------&lt;br />testetesteteste 26232207&lt;/code>&lt;br />&lt;br />Ok, ok, ta muito complicado, mas veja só:&lt;br />&lt;br />&lt;code>$ sed -rn '/^[^-]+-+/h;/^teste_/{x;p;g;p}' arquivo.log &lt;br />AAAA-------------campo_1-------------campo_2-----campo_3----campo_4----------&lt;br />teste_1 371508787 371547453 38666 testetesteteste&lt;br />BBBB-------------campo_1-------------campo_2-----campo_3----campo_4----------&lt;br />teste_2 4625081503 4651313710 26232207 testetesteteste&lt;/code>&lt;br />&lt;br />Vamos explicar&lt;br />1) a opção -n serve para informar ao sed "imprima apenas quando eu mandar"&lt;br />2) a opção -p serve para utilizar expressões regulares extendidas&lt;br />(assim não preciso escapar o quantificador + , que significa "um ou&lt;br />mais vezes", assim como os parentesis, para informar os grupos).&lt;br />&lt;br />Eu fiz uma sacanagem. o comando h quarda o padrão num espaço chamado espaço reserva, tipo uma memória do sed, sobreescrevendo. Assim no espaço reserva eu tenho a ultima ocorrencia de uma linha do tipo, ^[^-]+-+ ,que traduzindo significa: tudo o que começa com um ou varios caracteres diferentes de -, seguidos de um ou varios - (no caso&lt;br />do AAAA------------- ... ).&lt;br />&lt;br />Agora, quando eu encontro uma linha que começa com teste_ eu:&lt;br />&lt;br />x) troco essa linha com a linha que esta na memória (a atual&lt;br />'teste_...' vai, outra volta).&lt;br />p) imprimo a linha que veio (AAAA---------- ...)&lt;br />g) pego a linha da memória (teste_...)&lt;br />p) imprimo a linha cachorrona&lt;br />&lt;br />Só que não fica como vc quer. Ai vc precisa fazer a sacanagem:&lt;br />&lt;br />&lt;span style="font-style:italic;">se uma linha NÃO tem o que eu quero, então eu a manipulo habilmente&lt;br />até que ela chegue ao que eu quero&lt;/span>&lt;br />&lt;br />Eu poderia ter usado varias tecnicas mas... uma vez com sed, podemos continuar nele.&lt;br />&lt;br />&lt;code>$ sed -rn '/(^[^-]+-+).*/{s//\1/;h};&lt;br />/^teste_/{s/.* ([^ ]+) +([^ ]+$)/\2 \1/;x;p;g;p}' arquivo.log&lt;/code>&lt;br />&lt;br />eu transformei a primera ER em (minha_ER).* -- ou seja, criei um &lt;span style="font-style:italic;">grupo&lt;/span> para o que me interessa. basta fazer:&lt;br />&lt;br />&lt;code>s/(minha_ER).*/\1/&lt;/code>&lt;br />&lt;br />para que toda a linha seja reduzida ao que a minha ER casa. em outras palavras, eu apaguei o resto da linha.&lt;br />&lt;br />na outra eu fui mais sacana pois eu tenho 2 grupos e troco toda a linha pelos grupos, na ordem inversa. coisa de quem toma muito café e não tem escrupulos.&lt;br />&lt;br />Vamos ver a versão &lt;span style="font-weight:bold;">AWK&lt;/span>?&lt;br />&lt;br />&lt;code>$ awk '/^[^-]+-+/{match($0,/^[^-]+-+/); x=substr($0,1,RLENGTH)}&lt;br />/^teste_/{print x,"\n"$5,$4}' arquivo.log&lt;br />AAAA-------------&lt;br />testetesteteste 38666&lt;br />BBBB-------------&lt;br />testetesteteste 26232207&lt;/code>&lt;br />&lt;br />x, nesse caso, armazena aquele pedaço da linha anterior, que eu descobri o que é via match. match procura uma expressão regular numa string, nesse caso em $0, e seta um valor na variavel RLENGTH, que é onde a expressão acaba. basta pegar essa parte da string e guardar na variavel x, que sera lida depois.&lt;br />&lt;br />Aqui fala um pouco dessas duas funções: &lt;a href="http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html">http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html&lt;/a>&lt;br />&lt;br />Eu poderia ter resolvido dessa forma também&lt;br />&lt;code>$ awk '/^[^-]+-+/{sub(/-[^-]+.*$/,"-");x=$0} &lt;br />/^teste_/{print x,"\n"$5,$4}' arquivo.log&lt;br />AAAA-------------&lt;br />testetesteteste 38666&lt;br />BBBB-------------&lt;br />testetesteteste 26232207&lt;/code>&lt;br />&lt;br />Entretanto aqui eu faço uma substituição grosseira do resto da linha que tem o AAAA------... por -, abusando do .* (e o fato dele ser guloso). Parece mais simples, mas está sujeito à falhas, embora não consigo pensar em nenhuma situação que seja possivem demonstrar.&lt;br />&lt;br />AWK &amp; SED são ferramentas sensacionais para esse tipo de problema ;-)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>blpsilva&lt;/div>
&lt;div class='content'>
Impressive, to say the least :)&lt;BR/>&lt;BR/>Acho que chegou a hora de limpar a minha ferrugem e reler o Advanced Bash Scripting Guide.&lt;BR/>&lt;BR/>You produce some quite nice pearls inside the shell ;)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
grep + awk + sed:&lt;BR/>&lt;BR/>$ grep -B 1 teste_ arquivo.log | \&lt;BR/>awk '/teste_/{print $5,$4; next} 1' | \&lt;BR/>sed -r '/^--$/d;s/(^[^-]+-+)[^-].*/\1/'&lt;BR/>&lt;BR/>AAAA-------------&lt;BR/>testetesteteste 38666&lt;BR/>BBBB-------------&lt;BR/>testetesteteste 26232207&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sbado dia 26 de Abril tem FLISOL na PUC-Rio !!</title><link>http://pacman.blog.br/blog/2008/04/25/sbado-dia-26-de-abril-tem-flisol-na-puc/</link><pubDate>Fri, 25 Apr 2008 12:46:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/25/sbado-dia-26-de-abril-tem-flisol-na-puc/</guid><description>&lt;div class='post'>
&lt;img src="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro?action=AttachFile&amp;do=get&amp;target=banner+rio.png"/>&lt;br />&lt;br />&lt;blockquote>Em 26 de abril, será realizado o FLISOL - Festival Latinoamericano de Instalação de Software Livre - evento de divulgação de Software Livre da América Latina. No Rio de Janeiro quem está organizando este evento é o SL-RJ. Segundo o coordenador Carlos Ferreira, “É uma ótima oportunidade para levar seus amigos para passar este dia tão importante, participando das palestras ou instalando legalmente seu computador”. O Local onde será realizado, é a PUC-Rio - Pontifícia Universidade Católica do Rio de Janeiro - Auditório do RDC, localizado na Rua Marquês de São Vicente, 225, Gávea - Rio de Janeiro, RJ - Brasil - 22453-900. Das 8:30 às 17:00.&lt;/blockquote>&lt;br />&lt;br />Veja mais informações aqui:&lt;br />&lt;a href="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro">http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro&lt;/a>&lt;br />&lt;br />Software disponível&lt;br />&lt;br /> * Linux: Ubuntu&lt;br /> * Openoffice e Firefox.&lt;br /> * Para quem desejar, existe a opção de receber um cd da distribuição Linux Ubuntu versão 7.10, para isto basta levar um cd virgem. &lt;br />&lt;br />Palestras&lt;br />&lt;br />&lt;a href="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro/Clique_aqui_e_veja_a_grade_de_palestras_completa">Veja aqui a grade de palestras completa.&lt;/a>&lt;br />&lt;br />Iremos disponibilizar uma máquina e uma pessoa para ficar durante todo o evento à disposição das pessoas interessadas em conhecer um determinado programa ou recurso, tirar dúvidas e/ou obter dicas.&lt;br />&lt;br />Como ajudar?&lt;br />&lt;br />Você pode ajudar o evento de diversas maneiras. A mais simples é divulgando-o para os seus amigos, na sua escola ou no seu trabalho.&lt;br />&lt;br />Se você quiser, pode ser um instalador ou palestrante no InstallFest. Envie um e-mail para Carlos Ferreira &lt;chlferreira EM gmail.com.br> ou Luiz Aldabalde &lt;lg.aldabalde EM gmail.com> falando um pouco sobre a sua experiência com GNU/Linux ou qualquer outra aplicação livre que seja instalada durante o evento.&lt;br />&lt;br />Caso queira ajudar de qualquer outra forma, entre em contato conosco por e-mail. Toda a ajuda é bem vinda!&lt;br />&lt;br />O que devo fazer para me preparar para o Install Fest?&lt;br />&lt;br />ATENÇÂO: Maquinas do tipo Desktop(com gabinete) só poderão entrar no Campus da PUC-Rio até as 12:00 horas, após este horário somente laptops dentro de mochilas.&lt;br />&lt;br />Checagem de Hardware: No Windows, vá até o Painel de Controle e escolha Sistema. Liste:&lt;br />&lt;br /> * Placa de rede (marca, modelo, configuração)&lt;br /> * Placa de vídeo (marca, modelo, configuração)&lt;br /> * Placa de Som (marca, modelo, configuração)&lt;br /> * CPU (Processador)&lt;br /> * Memória RAM&lt;br /> * Modem (marca, modelo, configuração)&lt;br /> * Espaço livre em disco (mínimo de 5.0 Gb)&lt;br /> * Componentes SCSI (se houver algum) &lt;br />&lt;br />* Faça backup dos seus dados. Por precaução, você deve fazer uma cópia dos seus dados importantes no computador do seu amigo ou em CD-ROM.&lt;br />&lt;br />* Particionamento do disco: se você souber como fazer, faça uma partição de no mínimo 5.0 Gb. Quanto maior for essa partição, mais utilidades do Linux poderão ser instaladas. Se você não souber fazer isso, nós faremos no dia do Install Fest. Apenas irá demorar mais tempo.&lt;br />&lt;br />* Desfragmento do disco: Se você não souber fazer o particionamento, desfragmente o seu disco. Se você não souber fazer isso, ou não quiser, nós o faremos no dia do Install Fest. Apenas a sua instalação demorará mais que se você o tivesse feito antecipadamente. Para desfragmentar no Windows, primeiro desabilite todos os programas. Isso incluirá ICQ, navegadores, anti-vírus ou qualquer outra coisa que você estiver rodando. A seguir, clique em Iniciar, Programas, Acessórios, Desfragmentador de Disco. A seguir, clique em Iniciar na janela que aparecer nesse instante.&lt;br />&lt;br />* Os custos de transporte do seu PC são de sua responsabilidade.&lt;br />&lt;br />* Trazer para o Install Fest o Gabinete,Teclado, mouse e ainda, cabos de comunicação CPU-Periférico e cabos de força. Enfim, tudo o que é necessário para fazer seu computador funcionar. Se possível, traga também os manuais do seu hardware.&lt;br />&lt;br />Apoio&lt;br />&lt;br />CASA DO MOODLE &lt;a href="http://www.casadomoodle.com">http://www.casadomoodle.com&lt;/a>&lt;br />&lt;br />Responsáveis&lt;br />&lt;br />Coordenador: &lt;br /> o Carlos Henrique Lucas Ferreira &lt;chlferreira EM gmail.com> &lt;br />&lt;br />Colaboradores:&lt;br /> o Luiz Guilherme Aldabalde&lt;br /> o Avalci Suzano&lt;br /> o Carlos Eduardo(Cadunico)&lt;br /> o Luis Felipe Costa&lt;br /> o Bruno Garcia&lt;br /> o Josir Gomes&lt;/div></description></item><item><title>Sobre o FISL e tudo mais</title><link>http://pacman.blog.br/blog/2008/04/20/sobre-o-fisl-e-tudo-mais/</link><pubDate>Sun, 20 Apr 2008 21:40:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/20/sobre-o-fisl-e-tudo-mais/</guid><description>&lt;div class='post'>
Rapidamente, foi ótimo reencontrar os amigos de Porto Alegre. Os ultimos dias do FISL me cansaram demais, porém foi ótimo conversar pessoalmente com o &lt;a href="http://aurelio.net">Aurélio&lt;/a> (alias o livro dele é ANIMAL! vale a pena adquirir!), rever o &lt;a href="http://twiki.softwarelivre.org/bin/view/TWikiBar/WebHome">Julio Neves&lt;/a>, a galera do &lt;a href="http://tchelinux.org">Tchelinux&lt;/a>, sem falar na galera que eu conheci no evento (que eu insistia em trocar o nome, procedência, etc). Um abraço especial pro &lt;a href="http://erainfo.blogspot.com">Marcelo Martins&lt;/a>, que deve estar em Torres agora.&lt;br />&lt;br />Destaque para a palestra do &lt;a href="gc.blog.br">Guilherme Chapiewski&lt;/a>.&lt;br />&lt;br />Devo me preparar melhor para os próximos eventos, tanto em Poa ano que vem quanto os próximos eventos (como o &lt;a href="http://www.flisol.info/FLISOL2008/Brasil/RioDeJaneiro">FLISOL&lt;/a> dia 26 de Abril na PUC-RJ, sem falar no Hack'n Rio). To doido pra ir no Javauy 2008 mas acho que não vai rolar :( Estou cheio de ideias!&lt;br />&lt;br />Peço desculpas a todos que não conseguiram me encontrar ou que não pude conversar direito! Forte Abraço!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
O Fisl foi bom demais!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Aurélio Jargas&lt;/div>
&lt;div class='content'>
Daê Thiago, legal te conhecer também cara, valeu pela força, abração!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
"art of testing" ??&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>The Art of Testing&lt;/div>
&lt;div class='content'>
Grande Peczenyj, foi muito bom conversar contigo cara. Varias e grandes idéias trocadas. Abração cara!!1&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Um corretor ortográfico em gawk</title><link>http://pacman.blog.br/blog/2008/04/13/um-corretor-ortogrfico-em-gawk/</link><pubDate>Sun, 13 Apr 2008 14:39:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/13/um-corretor-ortogrfico-em-gawk/</guid><description>&lt;div class='post'>
Ano passado eu publiquei &lt;a href="http://peczenyj.blogspot.com/2007/08/implementando-um-corretor-ortogrfico.html">uma pequena nota sobre um pequeno corretor ortográfico feito em Python&lt;/a>.&lt;br />&lt;br />No &lt;a href="http://norvig.com/spell-correct.html">artigo&lt;/a> do Peter Norwig, ele explica o principio estatístico do algoritmo. No final, ele mostra varias implementações do algoritmo (em D, Java, Ruby e até Erlang).&lt;br />&lt;br />Depois de muito pesquisar, decidi fazer uma versão em gawk. A primeira tinha 30 linhas e não funcionava muito bem, arrumando e testando cheguei a esta forma final com apenas 15 linhas.&lt;br />&lt;br />Eu chamo de linha um &lt;span style="font-style:italic;">statement&lt;/span> completo do awk. Perceba que nenhuma linha dessas possui o separador de statement &lt;span style="font-weight:bold;">;&lt;/span> (ponto-e-virgula), exceto quando estou utilizando o for no estilo C.&lt;br />&lt;br />&lt;pre>&lt;code># Usage: gawk -v word=something -f thisfile.awk [ big.txt [ big2.txt ... ]]&lt;br /># Gawk version with 15 lines -- 04/13/2008&lt;br /># Author: tiago (dot) peczenyj (at) gmail (dot) com &lt;br /># Based on : http://norvig.com/spell-correct.html&lt;br />function edits(w,max,candidates,list, i,j){&lt;br /> for(i=0;i&lt; max ;++i) ++list[substr(w,0,i) substr(w,i+2)] &lt;br /> for(i=0;i&lt; max-1;++i) ++list[substr(w,0,i) substr(w,i+2,1) substr(w,i+1,1) substr(w,i+3)] &lt;br /> for(i=0;i&lt; max ;++i) for(j in alpha) ++list[substr(w,0,i) alpha[j] substr(w,i+2)] &lt;br /> for(i=0;i&lt;= max ;++i) for(j in alpha) ++list[substr(w,0,i) alpha[j] substr(w,i+1)] &lt;br /> for(i in list) if(i in NWORDS) candidates[i] = NWORDS[i] }&lt;br />&lt;br />function correct(word ,candidates,i,list,max,temp){&lt;br /> edits(word,length(word),candidates,list)&lt;br /> if (!asort(candidates,temp)) for(i in list) edits(i,length(i),candidates)&lt;br /> return (max = asorti(candidates)) ? candidates[max] : word }&lt;br />&lt;br />BEGIN{ if (ARGC == 1) ARGV[ARGC++] = "big.txt" # http://norvig.com/big.txt&lt;br /> while(++i&lt;=length(x="abcdefghijklmnopqrstuvwxyz")) alpha[i]=substr(x,i,1)&lt;br /> IGNORECASE=RS="[^"x"]+" }&lt;br />&lt;br />{ ++NWORDS[tolower($1)] }&lt;br />&lt;br />END{ print (word in NWORDS) ? word : "correct("word")=> " correct(tolower(word)) }&lt;/code>&lt;/pre>&lt;br />&lt;br />Veja o script em funcionamento:&lt;br />&lt;pre>$ time gawk -v word=somethink -f spelling.awk&lt;br />correct(somethink)=> something&lt;br />&lt;br />real 0m4.862s&lt;br />user 0m4.702s&lt;br />sys 0m0.093s&lt;/pre>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Rael&lt;/div>
&lt;div class='content'>
Tiago, mais uma vez, parabéns!&lt;BR/>É muito divertido mexer com estas coisas, não?&lt;BR/>Ah, eu não esqueci de te mandar a versão otimizada em Java... eu só não achei seu email pra enviar! :P&lt;BR/>Me manda um email, e eu te dou reply!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Corretor ortográfico, tatuagem... esse foi um final de semana divertido pra você heim! hahahha&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Participe do Domingão do Faustão</title><link>http://pacman.blog.br/blog/2008/04/05/participe-do-domingo-do-fausto/</link><pubDate>Sat, 05 Apr 2008 16:35:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/05/participe-do-domingo-do-fausto/</guid><description>&lt;div class='post'>
Vou fazer uma propaganda descarada: o &lt;a href="http://domingaodofaustao.globo.com/">Domingão do Faustão&lt;/a> lançou o quadro Dança da Galera!&lt;br />&lt;br />Para participar, basta seguir as instruções &lt;a href="http://domingaodofaustao.globo.com/ENT/Colunas/0,,10398,00-FAUSTAO%20DANCA%20DA%20GALERA.htmL">aqui &lt;/a>e enviar o seu vídeo!&lt;br />&lt;br />2008 promete muitas novidades! Aguardem!&lt;/div></description></item><item><title>Venha Tomar um Chimarrão no Estande da Globo.com!</title><link>http://pacman.blog.br/blog/2008/04/04/venha-tomar-um-chimarro-no-estande-da/</link><pubDate>Fri, 04 Apr 2008 15:35:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/04/venha-tomar-um-chimarro-no-estande-da/</guid><description>&lt;div class='post'>
Acompanhando o &lt;a href="http://gc.blog.br/2008/04/04/fisl-90-ai-vou-eu/">post do Guilherme&lt;/a>, dia 18 eu devo aparecer por Porto Alegre, para o FISL.&lt;br />&lt;br />Venha Tomar um Chimarrão no Estande da Globo.com durante o FISL!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
É claro que irei :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Luis Eduardo Bohrer da Silva&lt;/div>
&lt;div class='content'>
Muito legal Tiago.&lt;BR/>&lt;BR/>Nos veremos lá.&lt;BR/>Para tomar um chimarrão e falar um pouco de tecnologia. :-D&lt;BR/>&lt;BR/>Até mais.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Programando em C para console - parte 1</title><link>http://pacman.blog.br/blog/2008/04/02/programando-em-c-para-cons/</link><pubDate>Wed, 02 Apr 2008 14:10:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/02/programando-em-c-para-cons/</guid><description>&lt;div class='post'>
(Depois de um fecundo primeiro de Abril... )&lt;br />&lt;br />Cada vez mais eu me espanto com a quantidade de novatos que tentam fazer programas para o "modo console" que não fazem o menor sentido.&lt;br />&lt;br />Programas com menuzinho (1 - saque , 2 - deposito, 3 - sair) ou do estilo "digite um numero (q para sair)" são totalmente contra-produtivos. O novato perde TEMPO fazendo um monte de código desnecessário quando esquece o que deveria fazer (o tal do &lt;span style="font-style:italic;">algoritmo&lt;/span>).&lt;br />&lt;br />Veja um exemplo: um programa que receba uma quantidade variavel de números e que imprima a soma dos mesmos. IMHO a forma mais interessante para fazer isso é pegar os números como argumentos do programa principal. Vc cria um programa console absolutamente limpo e facil de scriptar, por exemplo.&lt;br />&lt;br />Veja só:&lt;br />&lt;br />&lt;pre>&lt;code>#include &amp;lt;stdio.h&amp;gt;&lt;br />&lt;br />int main(int argc, char *argv[]){&lt;br /> double soma = 0.0;&lt;br />&lt;br /> printf("A soma dos numeros eh %g\n",soma);&lt;br />&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Feito esse simples arquivo, vamos compilar&lt;br />&lt;pre>$ gcc -Wall soma.c&lt;br />$ ./a.out 1 2 3 4 5 &lt;br />A soma dos numeros eh 0&lt;/pre>&lt;br />&lt;br />Ai vc fala "po, ta errado!", mas claro, eu primeiro escrevi a base do meu programa. Perceba que eu compilei com a opção -Wall, que me informa todos os &lt;span style="font-style:italic;">warnings&lt;/span> que a compilação pode gerar (o que sempre é uma excelente pratica, eu procuro compilar sempre com 0 warnings).&lt;br />&lt;br />Feito isso, vamos definir 2 coisas:&lt;br /> - O algoritmo da soma e&lt;br /> - Possiveis fluxos de excessão.&lt;br />&lt;br />Vou partir do suposto que, se vc digitar alguma coisa que não seja um numero, eu vou ignorar e considerar como 0. Caso eu não informe nenhum numero ao programa, isso significa que estou faltando com alguma coisa, nesse caso vou informar uma mensagem elucidativa sobre o uso do programa.&lt;br />&lt;br />&lt;pre>&lt;code>#include &amp;lt;stdio.h&amp;gt;&lt;br />#include &amp;lt;stdlib.h&amp;gt;&lt;br />&lt;br />int main(int argc, char *argv[]){&lt;br /> int i;&lt;br /> double soma = 0.0;&lt;br />&lt;br /> if(argc == 1){&lt;br /> fprintf(stderr,"Faltando Argumentos!\n");&lt;br /> fprintf(stderr,"Uso: %s x1 [ x2 .. xN ]\n",argv[0]);&lt;br /> return 1;&lt;br /> }&lt;br />&lt;br /> for(i=1;i&amp;lt;argc;i++) &lt;br /> soma += atof(argv[i]);&lt;br />&lt;br /> printf("A soma dos numeros eh %g\n",soma);&lt;br />&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Todos os argumentos que eu passo para o programa, incluindo o nome do mesmo, ficam no vetor &lt;span style="font-weight:bold;">argv&lt;/span>, e o número de argumentos fica na variavel &lt;span style="font-weight:bold;">arcc&lt;/span>. Dessa forma, o nome do programa é o argv[0] e, se eu não passar nenhum argumento adicional, argc será 1. A função atof converte a string para um número de ponto flutuante e retorna 0 se não for possivel converter.&lt;br />&lt;br />Simples, não? Agora vamos executar:&lt;br />&lt;br />&lt;pre>$ ./a.out &lt;br />Faltando Argumentos!&lt;br />Uso: ./a.out x1 [ x2 .. xN ]&lt;br />$ echo $?&lt;br />1&lt;br />$ ./a.out 1 2 3 4 5&lt;br />A soma dos numeros eh 15&lt;br />$ echo $?&lt;br />0&lt;/pre>&lt;br />&lt;br />A mensagem de uso utiliza uma notação no manual de alguns programas do mundo unix: colocar os argumentos opcionais entre colchetes. Eu informo que preciso de pelo menos &lt;span style="font-weight:bold;">um&lt;/span> argumento. Caso eu entre no fluxo de excessão, o meu main retorna um valor diferente de 0 para o sistema operacional que pode ser capturado pela variavel de ambiente $? (nesse caso estou em um linux utilizando o bash, em outros sistemas mais exotéricos como o Windows eu não imagino como vc poderia capturar essa informação, tampouco imagino se ela seria util).&lt;br />&lt;br />Perceba que eu posso criar um script extremamente simples para utilizar esse programa, assim como testar o resultado é uma tarefa de um grep (ou diff). Eu poderia juntar um script de teste e um makefile nesse post mas estou esperando um exemplo um pouco mais interessante.&lt;br />&lt;br />Eu criei um programa sucinto, facil de entender e muito util, sem ter que perguntar para o usuario nada. transformar esse programa num que calcula a média, por exemplo, é uma tarefa de colocar apenas uma linha (na verdade uma subtração e uma divisão) a mais. Espero que os programadores novatos se inspirem nessa forma de pensar e que utilizem os programas básicos do unix como o grep, cat, diff, cp, etc, para seus futuros trabalhos.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Aguardando....&lt;BR/>&lt;BR/>OFF: As mentiras de ontem forma muito engraçadas, a do Java mesmo :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Felipem, o GDB por si só precisaria de um post exclusivo. Tenho que pensar bem no exemplo para que seja util.&lt;BR/>&lt;BR/>Estou pensando num algoritmo de ordenação com algum &lt;I>errinho&lt;/I>, ou algum processo recursivo como calcular fibonacci, etc.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Poucos sabem o que é um UNIX. Programam no DOS usando um while(1) para não fechar a tela do DOS, não sabem nem ir no cmd e digitar o nome do programa, eles clicam no executável.&lt;BR/>&lt;BR/>O C é uma linaguagem que os programadores mais comuns não sabem/se interessam. Ler o TCPL sem entender o que é um wc, grep, sort... é IMHO impossível.&lt;BR/>&lt;BR/>Aguardo os posts sobre getopt e GDB(ah sim GDB não está na lista de "promessas", mas vai ter, vai?)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Duas coisas que esqueci de comentar: &lt;BR/>&lt;BR/>1) As mensagens de erro vão para a saida de erro (stderr)&lt;BR/>&lt;BR/>2) A mensagem "A soma dos numeros eh " é totalmente desnecessária. Inclusive seria mais sucinto se a resposta fosse apenas o valor numérico.&lt;BR/>&lt;BR/>fica para a proxima então: scripts de teste, makefile, getopt (posso querer utilizar uma opção -v [verbose]) e, se der tempo, localização!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Java 1.7 vai ter Ponteiros!!!</title><link>http://pacman.blog.br/blog/2008/04/01/java-17-vai-ter-ponteiros/</link><pubDate>Tue, 01 Apr 2008 19:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/01/java-17-vai-ter-ponteiros/</guid><description>&lt;div class='post'>
Sensacional.&lt;br />&lt;br />Um dos recursos mais uteis do C finalmente conquistou o mundo java: a notação de ponteiros do Kernighan &amp; Ritchie.&lt;br />&lt;br />&lt;code>&lt;pre>public class Example{&lt;br /> public static void main(String [] args){&lt;br /> int *x, y=0;&lt;br /> x = &amp;y;&lt;br /> System.out.println("O valor de x eh " + *x);&lt;br /> }&lt;br />}&lt;/pre>&lt;/code>&lt;br />&lt;br />Agora será possivel fazer, em java:&lt;br />&lt;br />- Passar primitivos por referência.&lt;br />- Usar malloc, realloc e free.&lt;br />- Utilizar ponteiros void para converter uma URL em String, ou um Throwable em um List.&lt;br />- Sem falar que as Strings terão um caracter a mais no fim: o famoso \0 (na verdade a classe String deve desaparecer no Java 1.8, sendo substituida pelo bom e velho array de char)&lt;br />&lt;br />Parabéns Sun!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
É claudemiro, vc deveria observar a data que eu postei essa mensagem :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Claudemiro&lt;/div>
&lt;div class='content'>
cadê a fonte disso? cara sinto muito mas acho que isso não vai acontecer. e para o tiago stos. C sempre tera ponteiros. os ponteiros são um dos recursos mais importantes da linguagem c.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Sinto falta de um eval() no Java.&lt;BR/>&lt;BR/>eval("variavel" +i + " = " + j);&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>tiago_stos&lt;/div>
&lt;div class='content'>
Estranho observar essas mudanças nas linguagens. Ainda hoje ouvi dizer que na próxima versão do gcc a linguagem C não usará mais ponteiros, isso para fascilitar o aprendizado e aumentar o número de programadores C...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Claudio Rodrigues&lt;/div>
&lt;div class='content'>
Sinto a falta de métodos destrutores.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>WhiteSpace Server Pages</title><link>http://pacman.blog.br/blog/2008/04/01/whitespace-server-pages/</link><pubDate>Tue, 01 Apr 2008 18:59:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/01/whitespace-server-pages/</guid><description>&lt;div class='post'>
E... para completar o dia: &lt;br />&lt;pre>&amp;lt;?WhiteSpace&lt;br />Say hello. &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br />&lt;br /> &lt;br />&lt;br />&lt;br />&lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br />&lt;br />&lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />&lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br /> &lt;br />?>&lt;/pre>&lt;/div></description></item><item><title>Novas Tecnologias .Net</title><link>http://pacman.blog.br/blog/2008/04/01/novas-tecnologias-net/</link><pubDate>Tue, 01 Apr 2008 18:51:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/01/novas-tecnologias-net/</guid><description>&lt;div class='post'>
A Microsoft resolveu contra-atacar a proposta da SUN com o FSP que, de uma tacada só, 6 novas linguagens no mundo &lt;span style="font-style:italic;">dot NET&lt;/span>: vejam exemplos dos novissimos ABAP .Net, ASM .Net, BrainFuck .Net, JCL .Net e VHDL .Net.&lt;br />&lt;br />Para a parte web, vc poderá utilizar qualquer uma destas linguagens. Todas serão compiladas para CLI pelo ISS. A nova tecnologia permite, inclusive, rodar um .BAT, veja os exemplos abaixo!&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?ABAP&lt;br /> REPORT ZHB00001.&lt;br /> WRITE: 'Hello world'.&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?ASM&lt;br /> SECTION .data&lt;br />&lt;br /> msg db "Hello, world!",0xa ; &lt;br /> len equ $ - msg&lt;br />&lt;br /> SECTION .text&lt;br /> global main&lt;br />&lt;br />main:&lt;br /> mov eax,4 &lt;br /> mov ebx,1 &lt;br /> mov ecx,msg&lt;br /> mov edx,len &lt;br /> int 0x80&lt;br />&lt;br /> mov eax,1&lt;br /> mov ebx,0 &lt;br /> int 0x80&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?BRAINFUCK&lt;br /> ++++++++++[>+++++++>++++++++++>+++&lt;&lt;&lt;-]>++.>+.+++++++&lt;br /> ..+++.>++.&lt;&lt;+++++++++++++++.>.+++.------.--------.>+.&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?MSDOS&lt;br /> @ECHO OFF&lt;br /> REM Hello World for DOS batch&lt;br />&lt;br /> ECHO Hello World!&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?JCL&lt;br /> //HERIB JOB ,'HERIBERT OTTEN',PRTY=12&lt;br /> //* Hello World for MVS&lt;br /> //HALLO EXEC PGM=IEBGENER&lt;br /> //SYSPRINT DD SYSOUT=*&lt;br /> //SYSUT2 DD SYSOUT=T&lt;br /> //SYSUT1 DD *&lt;br /> Hello World!&lt;br /> /*&lt;br /> //&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;code>&lt;pre>&amp;LT;?VHDL&lt;br /> ENTITY helloworld IS&lt;br /> END helloworld;&lt;br />&lt;br /> ARCHITECTURE hw OF helloworld IS&lt;br />&lt;br /> BEGIN&lt;br />&lt;br /> ASSERT FALSE&lt;br /> REPORT "HELLO, WORLD!"&lt;br /> SEVERITY NOTE;&lt;br />&lt;br /> END hw;&lt;br />?>&lt;/code>&lt;/pre>&lt;br />&lt;br />Essa microsoft...&lt;/div></description></item><item><title>FSP - Fortran Server Pages!</title><link>http://pacman.blog.br/blog/2008/04/01/fsp-fortran-server-pages/</link><pubDate>Tue, 01 Apr 2008 11:21:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/04/01/fsp-fortran-server-pages/</guid><description>&lt;div class='post'>
Sensacional.&lt;br />&lt;br />A SUN está ressucitando uma das mais velozes linguagens de todos os tempos. Uma nova tecnologia web foi anunciada hoje: Fortran Server Pages!&lt;br />&lt;br />&lt;pre>&lt;code>&lt;br />&amp;lt;?FORTRAN&lt;br />*&lt;br />C Hello World in Fortran 77&lt;br />C (lines must be 6 characters indented)&lt;br />*&lt;br /> PROGRAM HELLOW&lt;br /> WRITE(UNIT=*, FMT=*) 'Hello World'&lt;br /> END&lt;br />?>&lt;/pre>&lt;/code>&lt;br />&lt;br />A ideia é atingir um novo patamar em sistemas web.&lt;br />&lt;br />Fonte: &lt;a href="http://www.google.com/search?q=fortran+server+pages&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a">Google&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
Boa cara. Já encomendei meus livros de Fortran. Não posso ficar fora dessa.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Hackeando um Hello World com sed</title><link>http://pacman.blog.br/blog/2008/03/28/hackeando-um-hello-world-com-sed/</link><pubDate>Fri, 28 Mar 2008 17:55:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/28/hackeando-um-hello-world-com-sed/</guid><description>&lt;div class='post'>
Fantástico o que o sed pode fazer!&lt;br />&lt;br />&lt;pre>&lt;code>$ cat a.c&lt;br />main(){ &lt;br /> puts("hello world"); &lt;br />}&lt;br />$ gcc a.c&lt;br />$ ./a.out &lt;br />hello world&lt;br />$ sed -i 's/hello world/_ola mundo_/'./a.out &lt;br />$ ./a.out &lt;br />_ola mundo_&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>A internacionalização do Engodo (2)</title><link>http://pacman.blog.br/blog/2008/03/12/internacionalizao-do-engodo-2/</link><pubDate>Wed, 12 Mar 2008 14:37:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/12/internacionalizao-do-engodo-2/</guid><description>&lt;div class='post'>
Excelente artigo do Olavo de Carvalho:&lt;br />&lt;br />&lt;a href="http://www.olavodecarvalho.org/semana/080310dc.html">A internacionalização do Engodo (2)&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>La Batalema Pitonisto&lt;/div>
&lt;div class='content'>
Gostei do texto, só achei um tanto tendencioso.&lt;BR/>&lt;BR/>Enquanto realmente muitas reclamações contra o filme veem de esquerdistas alienados, fãs das FARCs e de ONGs corruptas, o artigo peca pelo exagero na direção contrária, claramente fascista e contra a ação das ONGs.&lt;BR/>&lt;BR/>Se alguém vai comentar sobre esses assuntos não precisa concordar com as FARCs, mas precisa entender sua existência; não precisa achar que toda ONG é boazinha, mas julgar todas por algumas é um erro similar.&lt;BR/>&lt;BR/>Mesmo a atual postura direitista contra as drogas é tendenciosa e prejudicial ao bem comum.&lt;BR/>&lt;BR/>Para opinar sobre qualquer assunto é preciso avaliar o máximo de variáveis envolvidas possível e tentar entender todos os lados &amp;ndash; veja bem, entender, não concordar. Assim como o sr. Foley foi tendencioso contra o filme, o Olavo foi tendencioso a favor do facismo.&lt;BR/>&lt;BR/>[]'s&lt;BR/>Cacilhas, La Batalema&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>La Batalema Pitonisto&lt;/div>
&lt;div class='content'>
Gostei do texto, só achei um tanto tendencioso.&lt;BR/>&lt;BR/>Enquanto realmente muitas reclamações contra o filme veem de esquerdistas alienados, fãs das FARCs e de ONGs corruptas, o artigo peca pelo exagero na direção contrária, claramente fascista e contra a ação das ONGs.&lt;BR/>&lt;BR/>Se alguém vai comentar sobre esses assuntos não precisa concordar com as FARCs, mas precisa entender sua existência; não precisa achar que toda ONG é boazinha, mas julgar todas por algumas é um erro similar.&lt;BR/>&lt;BR/>Mesmo a atual postura direitista contra as drogas é tendenciosa e prejudicial ao bem comum.&lt;BR/>&lt;BR/>Para opinar sobre qualquer assunto é preciso avaliar o máximo de variáveis envolvidas possível e tentar entender todos os lados &amp;ndash; veja bem, entender, não concordar. Assim como o sr. Foley foi tendencioso contra o filme, o Olavo foi tendencioso a favor do facismo.&lt;BR/>&lt;BR/>[]'s&lt;BR/>Cacilhas, La Batalema&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
A beleza da democracia é poder concordar com ele :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Andre Almeida&lt;/div>
&lt;div class='content'>
Será que ele vai juntando várias besteiras pra por tudo junto num artigo só?&lt;BR/>Porque pra conseguir dizer tanta besteira junta só se esforçando, e muito!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Pra bom entendedor...</title><link>http://pacman.blog.br/blog/2008/03/10/pra-bom-entendedor/</link><pubDate>Mon, 10 Mar 2008 14:07:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/10/pra-bom-entendedor/</guid><description>&lt;div class='post'>
&lt;img src="http://imgs.xkcd.com/comics/real_programmers.png"/>&lt;br />&lt;br />Fonte: &lt;a href="http://xkcd.com/378/">http://xkcd.com/378/&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Antonio Carlos Silveira&lt;/div>
&lt;div class='content'>
Excelente :-) o Phillip deve se identificar bem com esta tira&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Projeto reconhece profissões de TI</title><link>http://pacman.blog.br/blog/2008/03/07/projeto-reconhece-profisses-de-ti/</link><pubDate>Fri, 07 Mar 2008 19:14:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/07/projeto-reconhece-profisses-de-ti/</guid><description>&lt;div class='post'>
Projeto reconhece profissões de TI, mas exclui criação de conselhos&lt;br />&lt;br />Fonte: &lt;a href="http://www.tiinside.com.br/Filtro.asp?C=265&amp;ID=86125">TI Inside&lt;/a>&lt;br />&lt;br />&lt;blockquote>A Comissão de Ciência, Tecnologia, Inovação, Comunicação e Informática (CCT) do Senado aprovou, nesta quarta-feira (5/3), parecer favorável do senador Eduardo Azeredo (PSDB-MG) ao projeto de lei que regulamenta o exercício das profissões de analista de sistemas e técnico de informática. A proposta é de autoria do senador Expedito Júnior (PR-RO) e agora será encaminhada à Comissão de Assuntos Sociais (CAS), na qual receberá decisão terminativa.&lt;br />(...)&lt;br />De acordo com a proposta, a profissão de analista de sistemas somente poderá ser exercida por pessoas que possuam diploma de nível superior em análise de sistemas, ciência da computação ou processamento de dados.&lt;/blockquote>&lt;br />&lt;br />Sem comentários...&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>[OsR]_fuckyou&lt;/div>
&lt;div class='content'>
estou fazendo sistemas de informação quando me formar não poderei ser contratado como analista? Serei apenas um programador? putz animador.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>[OsR]_fuckyou&lt;/div>
&lt;div class='content'>
estou fazendo sistemas de informação quando me formar não poderei ser contratado como analista? Serei apenas um programador? putz animador.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
blpsilva, eu passei por exatamente o mesmo problema (inclusive na mesma empresa...). E além da anuidade do CREA, tinha que pagar a contribuição sindical, mesmo contratado como analista. Um absurdo.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>blpsilva&lt;/div>
&lt;div class='content'>
Como inúmeras pessoas da área não tem formação nessa área, acredito que isto só vai gerar novas derivações de ocupações. Em vez de "Analista de Sistemas", "Analista de XYZ", e vida que segue.&lt;BR/>&lt;BR/>Eu cursei Engenharia Eletrônica e de Computação, e mesmo sendo um curso próximo de Ciência da Computação, não sei como ficaria isso legalmente.&lt;BR/>&lt;BR/>Por outro lado, já vi coisas bem revoltantes ocorrendo com Engenharia, que já tem regulamentação há uns bons anos. Um amigo meu da faculdade fazia estágio na Embratel, que exigiu dele o CREA para efetivá-lo. Entretanto, em vez de registrá-lo como Engenheiro Eletrônico (e pagar o piso da época, de R$ 3500 CLT), efetivaram ele como Analista (sei lá de quê) e o salário era de menos de R$ 2500. Isso eu acho um absurdo. Exigir CREA, mas não contratar como Engenheiro pra mim é picaretagem.&lt;BR/>&lt;BR/>Por essas e outras acho que essa regulamentação da profissão não terá impactos tão profundos na profissão pelo menos por uns bons anos.&lt;BR/>&lt;BR/>Abraços,&lt;BR/>&lt;BR/>Bruno Pereira&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
Shame....&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sobre o "ensino" de Java hoje em dia.</title><link>http://pacman.blog.br/blog/2008/03/06/sobre-o-ensino-de-java-hoje-em-dia/</link><pubDate>Thu, 06 Mar 2008 08:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/06/sobre-o-ensino-de-java-hoje-em-dia/</guid><description>&lt;div class='post'>
Java é uma linguagem orientada a objetos que contem tipos primitivos e wrappers para estes tipos, é executada sobre uma maquina virtual, com suporte a herança simples mas possui &lt;span style="font-style:italic;">interfaces&lt;/span>, com mecanismos de sobreescrita e sobrecarga de métodos, com um sistema de tratamento de exceções que te &lt;span style="font-weight:bold;">obriga&lt;/span> a tratar determinadas situações e por ai vai.&lt;br />&lt;br />Ao meu ver o estudo da linguagem deveria focar o domínio do mecanismo de herança e a construção de classes, domínio dos métodos, tipos de retorno, escopos de variavel, conversão de tipos, domínio das estruturas condicionais, de loops e de tratamento de erros, domínio das operações matemáticas e lógicas e,principalmente, domínio da classe String (ok, &lt;span style="font-style:italic;">domínio&lt;/span> pode ser uma palavra forte, talvez uma boa noção fosse suficiente em algumas situações).&lt;br />&lt;br />Com disso tudo, o aluno deveria primeiro trabalhar com argumentos de linha de comando (o que vc acha que o &lt;span style="font-weight:bold;">main&lt;/span> recebe?), depois passar a estudar a leitura e escrita em arquivo texto e, por fim, leitura pela entrada padrão.&lt;br />&lt;br />Pois leitura pela entrada padrão é o que vc menos vai fazer em Java. Ninguem faz programa com menuzinho em Java pra console no mercado. Temos coisas mais complexas pela frente e sem conhecer tudo aquilo que eu listei antes só é possivel fazer gambiarras (como as famosas &lt;span style="font-style:italic;">class functions&lt;/span>, gigantescos métodos que fazem centenas de coisas com nomes adequados do tipo &lt;span style="font-weight:bold;">createTree3&lt;/span>).&lt;br />&lt;br />Ensina-se Java ao contrário: primeiro o camarada programa como se fosse C, perdendo tempo em fazer menus e estruturas de controle pois o usuario pode ter dado um enter, tab, "ç" ou ter digitado algo inválido quando deveria aprender os fundamentos da linguagem. Cria-se vícios que pode ser custoso para remover (como encher o código de getters/setters sem necessidade). A prova disso é que invariavelmente temos comparação de Strings usando o operador == quando deveria ser utilizado os métodos adequados para isso (imagina o susto quando a galera descobre o &lt;a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)">equalsIgnoreCase&lt;/a>).&lt;br />&lt;br />Eu vejo muitos estudantes incapazes de compilar e executar uma classe (o famoso &lt;a href="http://guj.com.br/java.tutorial.artigo.16.1.guj">hello world&lt;/a>) pois os mesmos nunca fizeram uso da linha de comando muito menos foram apresentados ao conceito de &lt;a href="http://guj.com.br/java.tutorial.artigo.108.1.guj">classpath&lt;/a>. Vejo barbaridades típicas de quem não conhece (ou não sabe ler) o javadoc das classes básicas. Fico me perguntando quando esses jovens serão capazes de ler um "Effective Java", por exemplo.&lt;br />&lt;br />&lt;a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/">Aqui&lt;/a> tem um excelente começo.&lt;br />&lt;br />Espero que os professores acordem para essa realidade e que os alunos percebam que estão sendo prejudicados e passem a estudar por sua conta os tópicos necessários para sair arrasando pro ai.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
O problema é que esses tais sistemas distribuídos não existem em qualquer lugar como se fala, e as pessoas frequentemente usam objetos fantoches independente da situação. Os sistemas distribuídos acabaram virando uma "desculpa" para os "objetos burros" existirem...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
tem tda razão ferhr, mas no caso do sistema distribuido estamos falando de Data Transfer Objects (DTOs). É o caso que é necessario o fantochismo (as vezes da ate pra colocar alguma funcionalidade neles... mas é raro)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
(aliás, todo problema gerado por quaisquer linguagens de programação é o abuso).&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
Também vejo problemas com abuso. Neste caso, concordo plenamente.&lt;BR/>&lt;BR/>Mas também não vejo problemas com certos fantochismos, principalmente quando você tem que tratar um objeto (ou seria neste caso "dados"?) em sistemas distribuídos ou usando duas, três linguagens diferentes.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ao invés de criar um objeto cheio de get/set desnecessário, poderiamos preparar interfaces fluentes, como no exemplo do &lt;A HREF="http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/" REL="nofollow">Chapiewski&lt;/A>.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
o problema está escrito la, chegou a ler o post? Voce deixa de programar orientado a objetos pra programar estruturado.&lt;BR/>&lt;BR/>value objects nunca precisaram obrigatoriamente de getters e setters. alias, value objects imutaveis sao muito mais interessantes.&lt;BR/>&lt;BR/>getters e setters não fazem encapsulamento por si só, isso é uma ilusão! as vezes muito pelo contrario: voce acaba expondo atributos que nao deveria expor: deveria ter criado métodos para trabalhar com esses atributos, em vez de apenas fornecer um simples par de getter e setter. Esse é o mais que conhecido anti pattern do dominio de modelo anemico:&lt;BR/>&lt;BR/>http://www.guj.com.br/posts/list/75388.java&lt;BR/>&lt;BR/>Seus objetos acabam virando fantoches:&lt;BR/>http://www.fragmental.com.br/wiki/index.php?title=Fantoches&lt;BR/>&lt;BR/>Em nenhum momento falei para nunca utilizar getter e setters, o problema é seu abuso. quem vem de linguagem estruturada e esta comecando com orientacao a objetos, costuma abusar demais disso, deixando seu sistema identico a um nao orientado a objetos.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
> fehr, usar getters e setters gerados, como &lt;BR/>> voce falou, é muito perigoso e pode gerar&lt;BR/>> um dominio muito fraco. os objetos podem&lt;BR/>> passar a ser apenas estruturinhas de dados:&lt;BR/>&lt;BR/>ValueObjects / encapsulação, anyone? E qual o problema de alguns objetos serem apenas "estruturinhas de dados"? Nenhum. Depende da aplicação, da idéia. Não há bala de prata.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
Oi Tiago! Agradeço o link para o blog da Caelum. Nos tentamos seguir essa linha de pensamento, focar no que é realmente importante: interfaces, polimorfismo, reescrita de método, encapsulamento. Alias, quando mostramos java.util e java.io, damos mais atencao para o bom uso das interfaces e polimorfismo desses pacotes do que a API em si. Saber fazer um bom design é o que é fundamental.&lt;BR/>&lt;BR/>fehr, usar getters e setters gerados, como voce falou, é muito perigoso e pode gerar um dominio muito fraco. os objetos podem passar a ser apenas estruturinhas de dados:&lt;BR/>&lt;BR/>http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/&lt;BR/>&lt;BR/>e atraves de reflection da sim para manipular os atributos, sem necessidade dos getter e setters, nao vejo reflection como motivacao para o uso dos getters e setters.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Daniel Wildt&lt;/div>
&lt;div class='content'>
Tiago, belo post. Eu vejo ser necessário ensinar o aluno que java não é dependente de uma IDE como ocorre com algumas outras linguagens de programação. Passo pelo menos 3 aulas trabalhando diretamente na linha de comando e usando um editor de texto sem sintax highlight. E desde o início trabalho identação de código fonte, organização de código fonte, enfim, o programador tem que entender a base do processo e tem que saber aplicar isto para qualquer outra linguagem de programação que venha a aprender.&lt;BR/>&lt;BR/>Ainda, que você não precisa de uma IDE com 5000 plug-ins para ter produtividade. Deve achar o que te deixa produtivo, como disse o &lt;A HREF="http://vitorpamplona.com/lastChanges.pr?page=6" REL="nofollow">Vitor Pamplona&lt;/A>.&lt;BR/>&lt;BR/>E principalmente, focar no ensino de orientação a objetos. Criar classes, entender composição e herança, saber diferenciar uma classe abstrata de uma interface. Gosto de trabalhar todos os princípios para que um aluno possa ler um livro sobre design patterns e saber como construir aquilo, porque ele entende orientação a objetos, e não porque sabe java. &lt;BR/>&lt;BR/>Já vi aluno meu reclamar que não consegue aprender patterns porque o material que passei não era em java.&lt;BR/>&lt;BR/>O &lt;A HREF="http://www.urubatan.com.br/coisas-que-eu-nao-entendo-mercado-de-trabalho/" REL="nofollow">Urubatan já falou em um post dele que aprender uma linguagem de programação deveria ser um processo rápido&lt;/A>. Concordo com isto e no meu entendimento isto está relacionado a sua habilidade de abstração e de entender como as linguagens orientadas a objetos funcionam.&lt;BR/>&lt;BR/>Eu aqui fico pensando em como estes profissionais que hoje tem problemas vão evoluir para novas linguagens de programação e assim manter a própria empregabilidade em alta.&lt;BR/>&lt;BR/>Será culpa somente do aluno ou também é culpa do professor? &lt;BR/>&lt;BR/>Como professor, me considero um cara muito chato e deixo claro sempre para os alunos que não existe melhor linguagem de programação. Semestre passado em uma disciplina de desenvolvimento para web, ensinei ASP.NET, Java Server Faces e Ruby on Rails. Só que antes disto trabalhei muito o que envolve desenvolver para a internet.&lt;BR/>&lt;BR/>Ufa, ficou longo o comentário... :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Ana Carolina&lt;/div>
&lt;div class='content'>
Oi Tiago.&lt;BR/>&lt;BR/>Concordo totalmente contigo.&lt;BR/>Trabalho com cursos e também disciplinas de cursos técnicos e sei que não adianta começar com a parte prática sem a parte teórica, e também não adianta o objetivo ser "conquistar o mundo", é com exemplos simples, mastigados e várias atividades que se consegue base para um bom profissional. Depois disso é que podemos aprofundar o assunto e abordar tópicos mais avançados.&lt;BR/>&lt;BR/>Ah! E não é só Java.&lt;BR/>Tenho muito aluno que vem dizendo que "eu sei trabalhar com banco de dados" e na verdade usou o Access e nem sabe o que é uma view.&lt;BR/>&lt;BR/>Quando surge o incêndio, é a teoria que te ajuda. &lt;BR/>&lt;BR/>Se o aluno aprende primeiro "na mão", da forma mais trabalhosa e programando em modo texto, com certeza depois ele pode ir pra uma interface gráfica, mas o contrário não é verdadeiro.&lt;BR/>&lt;BR/>Conheço um "professor" de Linguagem C que não sabia que um for() pode ser infinito heheheh &lt;BR/>&lt;BR/>Por esses problemas é que eu sou contra estes cursos muito curtos que ensinam "tudo" e não ensinam os fundamentos das coisas. &lt;BR/>&lt;BR/>É por essas e outras que quem trabalha com TI sofre tanto preconceito. Todos os anos vários "fabricantes de gambiarras" aparecem por aí (mas eles não tem muito sucesso, não se preocupe! heheheh)&lt;BR/>&lt;BR/>Um forte abraço.&lt;BR/>&lt;BR/>Ana Carolina &lt;BR/>http://anacarol.blog.br&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
No início (bem no início, há mais de dez anos) via a questão dos getters/setters com muita desconfiança. &lt;BR/>&lt;BR/>No entanto é fácil de criá-los, nem que seja através de geração de código. &lt;BR/>&lt;BR/>Sem eles, entretanto, fica difícil fazer certas coisas com reflexão e afins.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Melhorando o “try()” do Ruby, a maneira “Groovy” [parte final]</title><link>http://pacman.blog.br/blog/2008/03/05/melhorando-o-try-do-ruby-maneira-groovy_05/</link><pubDate>Wed, 05 Mar 2008 18:21:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/05/melhorando-o-try-do-ruby-maneira-groovy_05/</guid><description>&lt;div class='post'>
&lt;pre>&lt;code>class Omega&lt;br /> def a&lt;br /> self&lt;br /> end&lt;br /> def b&lt;br /> self&lt;br /> end&lt;br /> def c&lt;br /> self&lt;br /> end&lt;br /> def to_s&lt;br /> "Omega"&lt;br /> end&lt;br />end&lt;br />&lt;br />def da? &lt;br /> begin&lt;br /> yield() if block_given?&lt;br /> rescue => exc&lt;br /> nil&lt;br /> end&lt;br />end&lt;br />&lt;br />xyz = nil&lt;br />a = da? { xyz.a.b.c } &lt;br />&lt;br />xyz = Omega.new&lt;br />b = da? { xyz.a.b.c } &lt;br />&lt;br />puts "da? com nil -> '#{a}'"&lt;br />puts "da? com Omega -> '#{b}'"&lt;/code>&lt;/pre>&lt;br />&lt;br />Executando:&lt;br />&lt;pre>da? com nil -> ''&lt;br />da? com Omega -> 'Omega'&lt;/pre>&lt;br />&lt;br />O que eu fiz? como a expressão xyz.a.b.c poderia retornar algum erro pois um dos métodos poderia returnar nil, bastaria executar em um bloco de código com a ajuda do método da? (péssimo nome, uma corruptela de "da para executar sem erro? se não, me retorna nil e era wilson...), que captura qualquer erro e some com ele.&lt;br />&lt;br />Ruby é divertido. :)&lt;br />&lt;br />ps: teste com&lt;br />&lt;br />&lt;code>a = da? { xyz.a.b.c } || "nao deu..."&lt;/code>&lt;/div></description></item><item><title>Melhorando o “try()” do Ruby, a maneira “Groovy” [parte 2]</title><link>http://pacman.blog.br/blog/2008/03/05/melhorando-o-try-do-ruby-maneira-groovy/</link><pubDate>Wed, 05 Mar 2008 15:32:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/05/melhorando-o-try-do-ruby-maneira-groovy/</guid><description>&lt;div class='post'>
Vou pedir perdão ao meu amigo Urubatan, que publicou um &lt;a href="http://www.urubatan.info/2008/03/a-better-try-for-ruby-why-not-do-the-groovy-way/">artigo&lt;/a> de mesmo nome.&lt;br />&lt;br />&lt;pre>&lt;code>class Omega&lt;br /> def doIt&lt;br /> puts "ola"&lt;br /> self&lt;br /> end&lt;br />end&lt;br />&lt;br />class NullableClass&lt;br /> def method_missing(*x)&lt;br /> self&lt;br /> end&lt;br />end&lt;br />&lt;br />class Object&lt;br /> def existe?&lt;br /> self&lt;br /> end&lt;br />end&lt;br />&lt;br />class NilClass&lt;br /> def existe? &lt;br /> NullableClass.new &lt;br /> end&lt;br />end&lt;br />&lt;br />xyz = Omega.new &lt;br />xyz . existe? . doIt . doIt&lt;br />&lt;br />abc = nil&lt;br />abc . existe? . doIt . doIt&lt;/code>&lt;/pre>&lt;br />&lt;br />Estou em duvida sobre o nome do metodo, por enquando fica &lt;span style="font-weight:bold;">existe?&lt;/span> mesmo.&lt;br />&lt;br />O que isso faz? Imagine que vc tem uma variavel ou atributo de classe que &lt;span style="font-style:italic;">pode&lt;/span> ser nil. Se for nil ela vai lançar um um erro em tempo de execução quando vc for tentar chamar algum método que a NilClass não possua (o que geralmente acontece, é semelhante ao NullPointerException do java).&lt;br />&lt;br />Eu poderia resolver isso alterando o method_missing da NilClass, porém alguns scripts podem estar esperando erros desse tipo. Decidi então criar um método que, para qualquer objeto, retorna ele mesmo (self). Caso seja nil, ele vai retornar um NullableClass (outro nome infeliz, não tenho nenhuma ideia melhor) que simplesmente retorna ele para qq método requisitado.&lt;br />&lt;br />IMHO pode ser o suficiente quando queremos fazer um teste simples: o objeto é nil? então não faz nada.&lt;br />&lt;br />Se alguem achar isso util por favor me avise :)&lt;br />&lt;br />Ah sim, a execução do script acima resulta em:&lt;br />&lt;pre>ola&lt;br />ola&lt;/pre>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Urubatan&lt;/div>
&lt;div class='content'>
como eu disse quando tu postou este comentário no meu blog, este teu esquema não resolve o problema de aninhamento de objetos, por exemplo&lt;BR/>&lt;BR/>@person.company.manager.name&lt;BR/>se eu digitar&lt;BR/>@person.existe?.company.manager.name &lt;BR/>e company for nil vai explodir tudo&lt;BR/>e um .existe?. depois de cada objeto vai ficar gigante e pior do que o try na minha opinião :D&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Escher em Lego</title><link>http://pacman.blog.br/blog/2008/02/27/escher-em-lego/</link><pubDate>Wed, 27 Feb 2008 11:03:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/02/27/escher-em-lego/</guid><description>&lt;div class='post'>
Sensacional:&lt;br />&lt;img src='http://www.gravestmor.com/strips/escher%20lego.jpg'/>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
DCC?&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Pesquisador&lt;/div>
&lt;div class='content'>
muito legal!&lt;BR/>você é do dcc?&lt;BR/>&lt;BR/>&lt;A HREF="http://www.trofia.com" REL="nofollow" TITLE="Ir para o site Trofia.com">Trofia.com&lt;/A>&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Andre&lt;/div>
&lt;div class='content'>
Muuuuuuito bom...&lt;BR/>&lt;BR/>Se publicar um passo-a-passo eu até compro lego pra fazer igual... :D&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Que nerdisse!!!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Alterando Multiplos Arquivos (versão final?)</title><link>http://pacman.blog.br/blog/2008/02/22/alterando-multiplos-arquivos-verso/</link><pubDate>Fri, 22 Feb 2008 19:27:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/02/22/alterando-multiplos-arquivos-verso/</guid><description>&lt;div class='post'>
O site Dicas-L trouxe na ultima semana 2 formas de renomear multiplos arquivos (&lt;a href="http://www.dicas-l.com.br/dicas-l/20080219.php">aqui&lt;/a> e &lt;a href="http://www.dicas-l.com.br/dicas-l/20080221.php">aqui&lt;/a>)&lt;br />&lt;br />&lt;code>&lt;pre>#Forma 1&lt;br />for o in $(ls -1 *.txt); do&lt;br /> mv $o $(echo $o | awk -F. '{print $1".htm"}');&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />&lt;code>&lt;pre>#Forma 2&lt;br />for i in `ls *.txt`; do&lt;br /> mv $i $(echo `basename $i .txt`.html)&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />São ambas formas interessantes, porém ao meu ver consomem muito recursos da maquina, sem falar que são um tanto... feios... (nada contra - o que importa é que funcione)&lt;br />&lt;br />Vou utiliza-los como exemplo de como podemos tornar algo melhor e mais prático (se o tempo permitir).&lt;br />&lt;br />Vamos dividir as paradas:&lt;br />&lt;br />&lt;code>&lt;pre>altera() { mv $1 $(echo `basename $1 .txt`.html) ; }&lt;br />&lt;br />for i in `ls *.txt`; do&lt;br /> altera $i&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />Agora vamos tomar um cuidado: arquivos com espaço no nome&lt;br />&lt;br />&lt;code>&lt;pre>altera() { mv "$1" $(echo `basename "$1" .txt`.html) ; }&lt;br />&lt;br />for i in `ls *.txt`; do&lt;br /> altera "${i}"&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />Bom, o for pode iterar sobre uma lista de argumentos. As mascaras de nome de arquivo são expandidos pelo shell durante a execução, logo...&lt;br />&lt;br />&lt;code>&lt;pre>for i in *.txt ; do&lt;br /> altera "${i}"&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />Agora, a rotina de alteração do nome do arquivo de destino é complicadissima, depende de um ou mais sub-processos. Isso poderia ser...&lt;br />&lt;br />&lt;code>&lt;pre>altera() { mv "$1" "${1%.txt}.html" ; }&lt;/pre>&lt;/code>&lt;br />&lt;br />Que, inserido no for...&lt;br />&lt;br />&lt;code>&lt;pre>for i in *.txt ; do&lt;br /> mv "${i}" "${i%.txt}.html"&lt;br />done&lt;/pre>&lt;/code>&lt;br />&lt;br />Interessante, certo? Nenhum sub-processo, exceto o inumeros mv que serão executados. Existem outras formas de fazer a mesma coisa&lt;br />&lt;br />&lt;code>&lt;pre>ls *.txt | awk -F. -v OFS=. '{ O=$0; $NF="html" ;printf "\"%s\" \"%s\"\n",O,$0 }' | xargs -n 2 mv&lt;br />&lt;br />ls *.txt | sed 's#^\(.\+\)\.[^.]\+$#"&amp;" "\1.html"#g' | xargs -n 2 mv &lt;/pre>&lt;/code>&lt;br />&lt;br />(rodem as linhas acima sem o mv do xargs para entende-las -- é metaprogramação)&lt;br />&lt;br />Agora... tudo isso é muito bonito mas... veja se o seu computador possui os comandos mmv ou rename (que facilitam Absurdamente a tarefa)&lt;br />&lt;br />&lt;code>&lt;pre>rename .txt .html *.txt&lt;br />&lt;br />mmv "*.txt" "#1.html"&lt;/pre>&lt;/code>&lt;br />&lt;br />Simples, não?&lt;br />&lt;br />Tudo depende do tempo que temos e das nossas necessidades. Mesmo que o rename/mmv sejam uteis, pode ser que a forma com awk / sed valha mais a pena pois o ls pode ser substituido por um find (ja pensou nisso?)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Leonardo Bernardes&lt;/div>
&lt;div class='content'>
Já conhecia o NF, depois de conhecê-lo queimei um pouco a cabeça tentando elaborar um método pra fazer essa passagem do 1 ao NF. Pensei em qualquer coisa semelhante ao while.. mas não veio nada.&lt;BR/>&lt;BR/>Na verdade, Tiago, sou um belo amador, brinco de fazer scripts como terapia.. terapia que eu realizava aos montes na época de mIRC.&lt;BR/>&lt;BR/>Por conta mesmo do meu amadorismo, não consegui entender seu exemplo de como queimar os registros intermediários. Mas não esquente com isso, se não há aquela variável mágica que eu usava no mIRC, é melhor que eu me contente com minhas limitações. Em todo caso, fico ligado nas suas dicas da seção shell.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ola Leonardo.&lt;BR/>&lt;BR/>Infelizmente o gawk não tem o conceito de range. Quando vc utiliza o operador $X vc esta pegando o X-ésimo campo daquele registro. Vc tem uma variavel que é setada a cada registro que é NF, o numero de registros, que permite que vc leia o ultimo registro de forma simples&lt;BR/>&lt;BR/>print $1,$NF&lt;BR/>&lt;BR/>Agora... tem uma sacanagem que vc pode fazer: $0 é o registro inteiro, porém vc pode "queimar" alguns registros intermediarios&lt;BR/>&lt;BR/>no seu caso, se vc fizesse&lt;BR/>&lt;BR/>$3=$4=$5=$6=""&lt;BR/>print $0&lt;BR/>&lt;BR/>só sobraria o que vc quer.&lt;BR/>&lt;BR/>Uma forma, menos agressiva, seria tentar pegar um padrão via expressões regulares.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Leonardo Bernardes&lt;/div>
&lt;div class='content'>
Tiago,&lt;BR/>&lt;BR/>Você parece o sujeito certo pra esclarecer um dúvida:&lt;BR/>&lt;BR/>Se eu quiser filtrar uma string do seguinte tipo&lt;BR/>&lt;BR/>7718 0.0 0.0 1756 476 ? Ss 17:59 0:00 /bin/sh -c pidgin&lt;BR/>&lt;BR/>Como AWK eu posso fazer através de algo como "awk '{print $1,$2,$10}'" &lt;BR/>&lt;BR/>Mas se eu quiser, por exemplo, filtrar o $1, o $2 e todos OS DEMAIS após o $7 sem saber o número total de termos, há alguma variável pra isso? Não sei se me fiz entender, mas essa dúvida me persegue desde que lembrei que quando eu brincava editando scripts no mIRC, uma simples $7- realizava essa função&lt;BR/>&lt;BR/>Desculpe o abuso, abraços&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Building Didier Stevens' SpiderMonkey in Cygwin</title><link>http://pacman.blog.br/blog/2008/02/02/building-didier-stevens-spidermonkey-in/</link><pubDate>Sat, 02 Feb 2008 14:26:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/02/02/building-didier-stevens-spidermonkey-in/</guid><description>&lt;div class='post'>
Eu estava quebrando a cabeça até que encontrei &lt;a href="http://pmelson.blogspot.com/2007/12/building-didier-stevens-spidermonkey-in.html">este&lt;/a> post.&lt;br />&lt;br />O Paul Melson ensinou de forma facil a compilar o SpiderMonkey para Cygwin: agora posso criar scripts usando javascript standalone.&lt;br />&lt;br />Vantagem: Nenhuma, coisa de nerd :)&lt;/div></description></item><item><title>Twitter.sh versão 2.0</title><link>http://pacman.blog.br/blog/2008/01/30/twittersh-verso-20/</link><pubDate>Wed, 30 Jan 2008 09:02:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/30/twittersh-verso-20/</guid><description>&lt;div class='post'>
O Bruno me deu uma ótima sugestão: um simples &lt;span style="font-style:italic;">usage&lt;/span>.&lt;br />&lt;br />Entretanto ontem eu fiquei batendo cabeça com os inúmeros tac/tail's mas percebi q um sed resolvia a questão. Alias é possivel também passar uma lista de parâmetros também!&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />TWIURL=http://m.twitter.com # utilizando versão 'mobile' do twitter&lt;br />USAGEMSG="Usage: $(basename $0) &amp;lt;twitter-user&amp;gt; [user list...]"&lt;br />&lt;br />[ -z "$1" ] &amp;&amp; { echo "${USAGEMSG}" ; exit 1 ; }&lt;br />for i in "$@" ; do&lt;br /> echo "==============================="&lt;br /> links -dump "${TWIURL}/${i}" | sed -r '1,3d;/^\ +Older [0-9]+/,$d'&lt;br />done&lt;/code>&lt;/pre>&lt;br />Agora chega :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Oi Paulo,&lt;BR/>&lt;BR/>O Gabriel Stein me deu uma ótima ideia de como postar no twitter:&lt;BR/>&lt;BR/>http://gabrielstein.org/?p=181&lt;BR/>&lt;BR/>Estou pensando em fazer um script simples para ler e postar no twitter e isso pode evoluir para muita coisa :) Se quiser colaborar ou indicar como eu poderia divulgar mais, sinta-se à vontade.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Paulo Diovani&lt;/div>
&lt;div class='content'>
Script interessante.&lt;BR/>Já pensou em fazer algum widget para desktop com ele? Ou quem sabe divulgar em alguma comunidade internacional para alguém fazê-lo.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Twitter + shell script</title><link>http://pacman.blog.br/blog/2008/01/29/twitter-shell-script/</link><pubDate>Tue, 29 Jan 2008 21:59:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/29/twitter-shell-script/</guid><description>&lt;div class='post'>
Como acessar o twitter a partir de um shell script de apenas 2 linhas? Fácil&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />links -dump http://m.twitter.com/${1} | tac | sed -n '/\*/,$p' | tac | tail +2&lt;/code>&lt;/pre>&lt;br />&lt;br />Basta informar o username a ser impresso:&lt;br />&lt;br />&lt;pre>$./twitter.sh pac_man&lt;br /> Twitter&lt;br />&lt;br /> pac_man pac_man fogo controlado agora. about 1 hour ago&lt;br />&lt;br /> Previous Updates&lt;br /> * minha cozinha pegou fogo. about 4 hours ago&lt;br /> * @gchapiewski To com a cuia, onde se compra a erva (mate)? about 9&lt;br /> hours ago&lt;br /> * @pcalcado alias XYZZY='echo -ne Zork!' about 16 hours ago&lt;br /> * XYZZY about 16 hours ago&lt;br /> * 4 horas pra montar um armario. Pelo menos jantei pizza. 08:36 PM&lt;br /> January 28, 2008&lt;br /> * Odeio fazer mudanc,a! Armario ainda nao ta pronto... 03:41 PM January&lt;br /> 28, 2008&lt;br /> * Amanha chega a minha mudanc,a. Terei um pc finalmente. 07:41 PM&lt;br /> January 27, 2008&lt;br /> * Odeio limpar a areia dos gatos. 07:38 PM January 27, 2008&lt;br /> * E ainda tenho q desmontar uma geladeira :/ 12:30 PM January 27, 2008&lt;/pre>&lt;br />&lt;br />Não consegui fazer com que o links entenda o conjunto de caracteres correto mas... quebra um galho. Depois vou fazer um que submeta um post :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>aprendiz&lt;/div>
&lt;div class='content'>
Fiz algumas pequenas modificações pra ficar mais legal:&lt;BR/>&lt;BR/>#!/bin/bash&lt;BR/>&lt;BR/>if [ "$1" = "" ]; then&lt;BR/> echo "Usage: $0 &lt; twitter-username >"&lt;BR/>fi&lt;BR/>&lt;BR/>links -dump http://m.twitter.com/${1} | tac | sed -n '/\*/,$p' | tac | tail -n +2&lt;BR/>&lt;BR/>adicionei o Usage, pra daqui uns 6 meses eu nao precisar abrir pra ver o que faz :P&lt;BR/>&lt;BR/>e também adicionei ao tail o -n +number pq tail +number ta deprecated na minha versao do tail.&lt;BR/>&lt;BR/>Abraços,&lt;BR/>Bruno Carvalho&lt;BR/>&lt;BR/>PS: Aguardamos sua primeira aparição aqui na globo.com ! Bem vindo a equipe :)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Nada de muito novo.</title><link>http://pacman.blog.br/blog/2008/01/28/nada-de-muito-novo/</link><pubDate>Mon, 28 Jan 2008 20:27:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/28/nada-de-muito-novo/</guid><description>&lt;div class='post'>
A mudança chegou hoje. Sexta começa a labuta, até lá tem muita coisa pra desencaixotar.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Thadeu Penna&lt;/div>
&lt;div class='content'>
Tsc, tsc, tsc, ainda é gaúcho. O cara se muda para o Rio e acha que vai começar a trabalhar na sexta-feira de Carnaval :D))) Nem entrou no clima...&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Enquanto isso, no RJ</title><link>http://pacman.blog.br/blog/2008/01/20/enquanto-isso-no-rj/</link><pubDate>Sun, 20 Jan 2008 15:15:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/20/enquanto-isso-no-rj/</guid><description>&lt;div class='post'>
Depois de uma semana turbulenta cheguei vivo ao RJ, e continuo até agora.&lt;br />&lt;br />Não tenho muitas novidades além do calos e da ansiedade - e estou sem PC em casa. &lt;br />&lt;br />Logo terei novidades.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>J. F. Mitre&lt;/div>
&lt;div class='content'>
Eu não sei como lhe dizer isso, meu caro, então vou direto ao ponto: estamos em clima de outono aqui no Rio...&lt;BR/>&lt;BR/>Calor fez nos últimos 15 dias de dezembro passado (que chegou a 42 graus). Agora está suave, não tem nem chego a 40 graus...&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Centésimo Post: Uma novidade!</title><link>http://pacman.blog.br/blog/2008/01/09/centsimo-post-uma-novidade/</link><pubDate>Wed, 09 Jan 2008 19:59:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/09/centsimo-post-uma-novidade/</guid><description>&lt;div class='post'>
Um dia eu estava conferindo os sites e blogs do meu bookmark quando vi &lt;a href="http://blog.fragmental.com.br/2007/07/24/contratando-agilistas-retardatarios/">este post&lt;/a>. Fiquei impressionado como &lt;span style="font-weight:bold;">tanta &lt;/span>coisa fez sentido pra mim.&lt;br />&lt;br />Eu era só um &lt;span style="font-style:italic;">test developer&lt;/span> que tinha começado como testador lá em são leopoldo. Vi sistemas serem feitos de todas as formas, principalmente as erradas. E tive &lt;a href="erainfo.blogspot.com">amigos &lt;/a>que diziam "isso não se faz mais, hoje em dia se usa hibernate/struts/webwork/...", q coisa não? &lt;br />&lt;br />Voltando a vaca fria, fui lendo os posts e artigos do Phillip Calçado - assim como os seus posts no GUJ - e fui acordado para a minha verdadeira vocação: &lt;span style="font-style:italic;">programar&lt;/span>. Mas quando li &lt;a href="http://blog.fragmental.com.br/2007/08/15/introduzindo-agilidade-num-ambiente/">este post&lt;/a> eu criei coragem e enviei um email, extremamente humilde, perguntando o que eu poderia estudar para não fazer feio em uma entrevista na &lt;a href="http://videos.globo.com/">globo.com&lt;/a> , afinal eu sabia das minhas limitações e, naquela época, eu estava pensando em tentar a vida lá.&lt;br />&lt;br />Phillip foi super-simpático e conseguiu uma entrevista por telefone. Foi um terror, não estava preparado, eu só queria ter uma idéia, naquela época, do que estudar para conseguir sair da minha função mais reativa, para uma função ativa (o ato de desenvolver o software em si com qualidade e ter orgulho disso). Mas não desisti.&lt;br />&lt;br />Nas minhas férias eu tive 3 entrevistas na globo.com, sendo a última no sábado pela manhã (eu ia voltar para Poa no domingo). Valeu a pena, quando o telefone tocou e o &lt;a href="http://gc.blog.br">Guilherme&lt;/a> disse "e ai, pacman?" eu gelei.&lt;br />&lt;br />Tinha sido aceito no grupo mais louco e fera que eu já conheci (e olha que eu ja trabalhei com o Porto e com o Casantos). Fui super humilde em todos os momentos, cheguei a acreditar que não iria conseguir em muitos momentos, mas aconteceu.&lt;br />&lt;br />Pena que o Phillip foi para Melbourne, queria te-lo conhecido pessoalmente. Por outro lado, eu sempre poderei ler os seus blogs e posts e poderei contribuir no trabalho que ele começou na WebMedia.&lt;br />&lt;br />Tenho que agradecer a muitas pessoas: Marujo, Marlon, Fernando, James, Marcelo Martins, a galera da HP que me atura a mais de 3 anos e a todos os loucos que me mandam parabéns pelo orkut ou gtalk e que vou sentir falta.&lt;br />&lt;br />"Trabalhar na Barra da Tijuca, ruim né?"&lt;br />&lt;br />Poucos sabem das reais dificuldades que eu enfrentei pra chegar ao dia de hoje. E não vou deixar de ser quem eu sou, amigos. Quando ao emprego que eu já tinha conseguido, eu tive que recusar gentilmente.&lt;br />&lt;br />2008 promete :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>RIC@RDO&lt;/div>
&lt;div class='content'>
"...(e olha que eu ja trabalhei com o Porto e com o Casantos)..."&lt;BR/>&lt;BR/>hahahahahahahahaha&lt;BR/>Essa foi pra matar Peczenyj!!!!&lt;BR/>E os vovôs continuam aqui aprontando das suas... :P&lt;BR/>&lt;BR/>Abraço amigo!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Marcelo,&lt;BR/>&lt;BR/>Essa resposta eu estou esperando do Phillip até hoje. Entretanto o Guilherme Chapiewski me deu algumas boas sugestões, basicamente livros sobre Agile e Domain Design Driven.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo&lt;/div>
&lt;div class='content'>
Olá,&lt;BR/>&lt;BR/>Também cheguei até o seu blog através do Fragmental. Fiquei muito curioso em saber qual foi a resposta do Phillip Calçado sobre o que se deve estudar para não fazer feio em uma entrevista na Globo.com.&lt;BR/>&lt;BR/>Parabéns pela conquista&lt;BR/>&lt;BR/>Marcelo&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Seja bem vindo a equipe pacman!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Luis Eduardo Bohrer da Silva&lt;/div>
&lt;div class='content'>
Gostaria de dar os parabéns Peczenyj.&lt;BR/>Também cheguei aqui, através do framental.&lt;BR/>&lt;BR/>Via seus comentários no GUJ mas não sabia que éramos conterrâneos, mas agora já está indo embora.&lt;BR/>Enfim parabéns pelo esforço, pois tudo isso é fruto dele.&lt;BR/>Estarei acompanhando o Blog.&lt;BR/>Valeu.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Roger&lt;/div>
&lt;div class='content'>
Parabéns Peczenyj !&lt;BR/>Quando comecei a ler o post e vi as referências a posts do Fragmental, GC ... já pensei: "Não acredito que o cara conseguiu um trampo lá !"&lt;BR/>O ambiente lá parece ser muito legal, eu também sonho com uma oportunidade dessas, se por acaso souber de algum lugar desse em Sampa mando meu cv na hora. Enquanto isso continuo estudando "coisas inúteis" como TDD, Scrum, XP, DSLs, Ruby ... etc. mesmo sabendo que onde estou nunca vou usar. :-(&lt;BR/>Por sinal acompanho o blog do gc também! Muito bom.&lt;BR/>&lt;BR/>Sucesso pra ti merrmão (carioques fluente!)&lt;BR/>&lt;BR/>Roger Leite&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Coisas que eu gostaria de ter escutado antes.</title><link>http://pacman.blog.br/blog/2008/01/07/coisas-que-eu-gostaria-de-ter-escutado/</link><pubDate>Mon, 07 Jan 2008 16:51:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/07/coisas-que-eu-gostaria-de-ter-escutado/</guid><description>&lt;div class='post'>
Tive a (in)felicidade de escolher, no ano de 98, ingressar no curso de Física da UFRGS. Na época eu era Nerd e não entendia nada da vida, afinal eu era um adolescente, achei que estava fazendo a coisa certa.&lt;br />&lt;br />Dizem que é melhor que a gente se arrependa por algo que fez do que por algo que a gente não fez. Durante o meu curso, optei pelo Bacharelado (um dos cursos mais dífíceis da UFRGS inteira), acreditando que este seria o meu futuro.&lt;br />&lt;br />Não posso reclamar: tive contato com excelentes professores e ótimos amigos. Conheci o Linux, o Fortran, o Matlab, o Método de Monte Carlo, as Equações Diferenciais e o Cálculo Numérico (sem falar na Mecânica Estatística, no Claudio Schneider,...) e conheci a reprovação, os conceitos 'C' e um primeiro A (em Algoritmos e Programação - onde aprendi Pascal e praticava em um &lt;em>potente&lt;/em> 286 com 1 mega de ram).&lt;br />&lt;br />Graças ao professor Daniel Stariolo tive 3 anos de bolsas de iniciação científica com programação em C. Por intermédio do destino, o Daniel esqueceu de renovar a minha bolsa e precisei procurar emprego para sobreviver.&lt;br />&lt;br />Este foi o impulso que eu precisava: consegui um emprego na área de testes. Com pouca experiência mas muita nerdisse, comecei na CWI a procurar defeitos nos programas dos outros.&lt;br />&lt;br />As vezes precisamos acordar: estar dentro de um curso de graduação, principalmente no curso &lt;strong>errado&lt;/strong>, limita um pouco a nossa visão do mundo. A nossa vontade de encontrar um grupo social nos faz crer que estamos fazer o que é certo e que estamos felizes (ou não estamos triste demais).&lt;br />&lt;br />Coisas que eu gostaria de ter escutado antes:&lt;br />&lt;br />- Leia muitos e diferentes livros&lt;br />- Aprenda Inglês (ao ponto de falar bem ao telefone)&lt;br />- Se tiver a chance: Aprenda a Dirigir. Dane-se que vc não tem carro&lt;br />- Trate o seu currículo e a sua carreira com respeito&lt;br />- Aprenda Java, Python, Ruby, Shell, AWK, HTML, C++, LISP, SQL...&lt;br />- Aprenda BEM e pratique muito.&lt;br />- Tenha Amizades positivas (do tipo que vão trabalhar com o que vc quer, que pensam parecido com vc, que te ajudem e sejam ajudados por ti).&lt;br />E o principal,&lt;br />- Faculdade é parte da nossa carreira. Se vc não estuda diariamente, se vc não se atualiza, se vc não se esforça, vc está perdendo tempo. Mude alguma coisa e não tenha medo de ousar: melhor do que estar a 9 anos no mesmo curso e ficar apatico com perguntas do tipo "não vai te formar?".&lt;br />&lt;br />Sim, jovens que estão prestando vestibular ou que estão pensando no que fazer ainda, o mundo é cruel e complexo. A melhor maneira de se adaptar ao mundo chamado "Brasil País de Terceiro Mundo" é tenho conhecimento amplo, variado e capaz de gerar mais conhecimento - evitando conhecimentos do tipo 'paranóicos' e 'fanatistas'. &lt;br />&lt;br />Quando eu nasci o Brasil era uma ditadura. Meu avô era membro do PC-do-B, já podem imaginar. Eu lembro que ele escutava a Radio de Moscou (na programação de 2 horas em português) todo o dia e acreditava em tudo. Um dia o muro de Berlin caiu... e o mundo pode ver a quantidade de casas sem agua potável ou esgoto na antiga URSS, por exemplo. Tivemos o Collor, o FHC e, agora, o Lula. O Mundo muda, o Brasil mudou. Quem se dedicar a uma vida mais limitada sofrerá com as mudanças futuras e necessárias para que possamos alcançar um bom padrão de vida - ou vai sofrer ao se adaptar a um país melhor lá fora.&lt;br />&lt;br />Pensem. Leiam. Tenham bons amigos e tenham boas conversas. Se informem diariamente e não fiquem mantendo as mesmas ideias por muito tempo: é necessário fluidez.&lt;br />&lt;br />E fluidez não se ensina, se aprende aos poucos.&lt;br />&lt;br />Quem estiver em dúvida sobre o que fazer, seja na vida acadêmica, na carreira profissional ou na vida amorosa, opte por procurar diferentes fontes de informação, dê atenção as fontes de melhor qualidade, raciocine e faça uma escolha - tendo a responsabilidade de arcar com o escolhido.&lt;br />&lt;br />E se preparem para errar. Só acerta muito quem erra bastante.&lt;br />&lt;br />Pronto, acabou a sessão "auto-ajuda" de hoje. Não vou prometer que dinheiro é encontrado no Vaso Sanitário ou que o Brócolis torna a Vida mais Feliz. Aliás a felicidade é algo passageiro e momentâneo, o resto das nossas vidas é desprovido de felicidade. É interessante pensar nisso pois precisamos encarar a verdade: o mundo é chato, é feio, é fedido, é cheio de gente que não presta e ainda podemos levar uma bala perdida devido a um debil mental que usa revolver para comemorar o fim de ano. Teremos pouquissimos momentos realmente felizes na nossa vida e são esses momentos que valem a pena.&lt;br />&lt;br />Um abraço e espero que faça sentido para alguem :)&lt;br />&lt;br />Feliz 2008!&lt;br />&lt;br />Ps: é normal rodar em Cálculo I a primeira vez que se faz. Acredite.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Thadeus, o seu comentário só enriquece o que tentei passar: em dados momentos vamos sentir que fizemos escolhas erradas. É momentâneo, afinal até as piores escolhas nos moldam no que somos hoje.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Thadeu Penna&lt;/div>
&lt;div class='content'>
Eu também mudei, apesar de não ter saído da Física: era físico nuclear experimental, conheci a computação e fui para a física computacional. Hoje trabalho em projetos interdisciplinares com engenheiros, médicos e até computeiros.&lt;BR/>O seu post é uma experiência pessoal, daí eu não posso dizer o que é certo ou errado, apenas dizer o que concordo ou não. Nossos casos são semelhantes, de certa forma, e eu acho que se não fôssemos físicos não conseguiríamos transitar de uma área para a outra, com tanta facilidade. É fácil ver físicos trabalhando em computação, economia e finanças, etc. (eu mesmo já orientei alguns alunos que hoje estão nestas áreas). Daí eu não concordo que você tenha escolhido "o curso errado", pelo contrário, você escolheu o curso que permite mudar de idéia, área, etc. e perder menos com isso e, talvez, até ser um diferencial em relação aos formandos tradicionais. &lt;BR/>&lt;BR/>[]s&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>trbecker&lt;/div>
&lt;div class='content'>
Hah, eu passei de primeira em cálculo 1, e isso é estranho. Mas em cálculo 2 eu penei, levei 4 semestres para aprender a visualizar certas equações em espaços de 3 dimensões. E cálculo 2 é quase só isso.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
&lt;I>Aliás a felicidade é algo passageiro e momentâneo, o resto das nossas vidas é desprovido de felicidade. É interessante pensar nisso pois precisamos encarar a verdade: o mundo é chato, é feio, é fedido, é cheio de gente que não presta e ainda podemos levar uma bala perdida devido a um debil mental que usa revolver para comemorar o fim de ano. Teremos pouquissimos momentos realmente felizes na nossa vida e são esses momentos que valem a pena.&lt;/I>&lt;BR/>&lt;BR/>Rapaz, até que enfim encontrei alguém que pensa assim como eu - e tem coragem de dizer abertamente sem ser tachado de "pessimista" ou "prá baixo", etc.&lt;BR/>&lt;BR/>&lt;I>Ps: é normal rodar em Cálculo I a primeira vez que se faz. Acredite.&lt;/I>&lt;BR/>&lt;BR/>Que ótimo, me sinto normal agora. Estava achando que era falta de inteligência minha. :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Camila Peczenyj&lt;/div>
&lt;div class='content'>
Eu já tinha te dito, mais de uma vez, para tirar a carteira de motorista e o vô era filiado ao PSB. &lt;BR/>Nunca é tarde para recomeçar, isso eu tb já tinha te dito...&lt;BR/>Gostei do texto e ele é cheio de verdades, só espero que vc o siga.&lt;BR/>BJ&lt;BR/>Camila&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Julli&lt;/div>
&lt;div class='content'>
Finalmente eu vejo que você percebeu muita coisa que eu já te falava há tempos. :)&lt;BR/>Agora é a minha vez. Beijo, te amo.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Ótimo texto, ultimamente tenho visto como isso de ler muitos livros é importante.&lt;BR/>&lt;BR/>Dois livros que estou lendo:&lt;BR/>Getting Real(37signals) e&lt;BR/>A estrada do futuro(Bill Gates, 1995)&lt;BR/>&lt;BR/>Os 2 falam(dentre outras coisa)justamente da capacidade que a pessoa e/ou empresa deve ter para mudar rapidamente as opiniões/idéias/produtos.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Pra bom entendedor...</title><link>http://pacman.blog.br/blog/2008/01/06/pra-bom-entendendor/</link><pubDate>Sun, 06 Jan 2008 16:11:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/06/pra-bom-entendendor/</guid><description>&lt;div class='post'>
&lt;img src="http://weblogs.newsday.com/sports/watchdog/blog/pacman.gif"/>&lt;/div></description></item><item><title>Coisas boas do Rio de Janeiro</title><link>http://pacman.blog.br/blog/2008/01/03/coisas-boas-do-rio-de-janeiro/</link><pubDate>Thu, 03 Jan 2008 18:56:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/01/03/coisas-boas-do-rio-de-janeiro/</guid><description>&lt;div class='post'>
Porto Alegre tem coisas boas (chimarrão, redenção, xis do cavanhas, suco da lancheria do parque, gasômetro e polar).&lt;br />&lt;br />Entretanto o Rio de Janeiro me impressiona cada vez mais. A imensa variedade de sabores (na mesma quadra vc encontra culinária nordestina, frutos do mar, empadas, picanha, sushi e muito, mas muito chopp), as praias, os recantos escondidos (como grumari), a floresta da tijuca, o jardim botânico, a imensa atividade (em TODO o lugar tem algo acontecendo, a qualquer hora).&lt;br />&lt;br />Fora o Calor...&lt;br />&lt;br />A personalidade do carioca é um tanto diferente da gaúcha. Falta a estética do frio, o que ja era de se esperar.&lt;br />&lt;br />Domingo volto pra porto alegre, algumas despedidas irão rolar. Até la estou juntando alguns assuntos nerds para postar aqui :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Erlon&lt;/div>
&lt;div class='content'>
tu ve... eu odiei e odeio o Rio de Janeiro e alguns outros estados do país!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Peczenyj agora é cidadão carioca</title><link>http://pacman.blog.br/blog/2007/12/24/peczenyj-agora-cidado-carioca/</link><pubDate>Mon, 24 Dec 2007 12:47:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/12/24/peczenyj-agora-cidado-carioca/</guid><description>&lt;div class='post'>
Pois é...&lt;br />&lt;br />Depois de muitas considerações decidi encarar o desafio de me mudar de Porto Alegre para o Rio de Janeiro. Facil não é, tampouco barato.&lt;br />&lt;br />Recebi uma proposta irrecusável de uma empresa para trabalhar com o middleware de Tv Digital. Vai envolver muitos testes automatizados, java, lua, C, desafios novos, cidade nova, enfim, muita coisa boa. Logo vou postar umas coisas que eu ando aprontando aqui...&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Roger&lt;/div>
&lt;div class='content'>
Olá Peczenyj !&lt;BR/>Acompanho o blog de vez em quando, fiquei curioso. Como surgiu esta oportunidade ? Você fica em busca sempre sem compromisso e por indicação ?&lt;BR/>&lt;BR/>De qualquer maneira parabéns !&lt;BR/>sucesso!&lt;BR/>&lt;BR/>Roger Leite&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Middleware ou mediador, no campo de computação distribuída, é um programa de computador que faz a mediação entre outros softwares. É utilizado para mover informações entre programas ocultando do programador diferenças de protocolos de comunicação, plataformas e dependências do sistema operacional.&lt;BR/>&lt;BR/>&lt;A HREF="http://pt.wikipedia.org/wiki/Middleware" REL="nofollow">Mais aqui...&lt;/A>&lt;BR/>&lt;BR/>No caso da TV Digital eu ainda vou descobrir o que ele faz.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Nome:philix(GDH)&lt;BR/>&lt;BR/>O que o middleware de TV digital? :-?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>No Rio</title><link>http://pacman.blog.br/blog/2007/12/18/no-rio/</link><pubDate>Tue, 18 Dec 2007 19:06:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/12/18/no-rio/</guid><description>&lt;div class='post'>
3 dias de viagens seguidos. Foi cansativo.&lt;br />&lt;br />Sábado saimos de Poa para chegar, 9 horas depois, em Curitiba. Muitos desvios na estrada, duas gatas berrando de vez em quando, sol e fome. Chegando, fomos numa churrascaria muito boa chamada Per Tutti e dormimos.&lt;br />&lt;br />Domingo chegamos em São Paulo - a estrada para lá é hedionda. Depois de descansar um pouco, fomos numa 'lancheria' chamada Fifties, muito boa. Depois tomei um café expresso e dormimos.&lt;br />&lt;br />Segunda chegamos no Rio. Depois de enfrentar um longo caminho, foi um alívio passar pela Serra das Araras e chegar à cidade. Deixamos nossas duas gatas na avó da Juliana e viemos pra casa, na Tijuca.&lt;br />&lt;br />Hoje o dia foi cheio, andei um bom pedaço do centro do Rio, andei de metrô, tive conversas interessantes... quinta vou beber com o pessoal do MBB em lugar secreto, até lá terei alguma coisa boa para comemorar (alem de estar na cidade magavilhosa).&lt;br />&lt;br />Quarta é o dia...&lt;/div></description></item><item><title>Ferias</title><link>http://pacman.blog.br/blog/2007/12/14/ferias/</link><pubDate>Fri, 14 Dec 2007 21:24:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/12/14/ferias/</guid><description>&lt;div class='post'>
Estou saindo de férias, quando tiver novidades irei postar :)&lt;/div></description></item><item><title>Testes Unitários com VBScript</title><link>http://pacman.blog.br/blog/2007/12/03/testes-unitrios-com-vbscript/</link><pubDate>Mon, 03 Dec 2007 12:49:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/12/03/testes-unitrios-com-vbscript/</guid><description>&lt;div class='post'>
Nas ultimas semanas, tive que aprender VBScript por conta de alguns testes que estão por vir. A sintaxe é bem estranha, mas fazer o que...&lt;br />&lt;br />Entretanto é simples o suficiente para se desenvolver pequenas rotinas e, de quebra, aprender boas praticas de programação, como TDD, no exemplo abaixo:&lt;br />&lt;br />&lt;pre>&lt;code>' Função a ser testada&lt;br />' EhPrimo determina se um determinado número inteiro é primo ou não&lt;br />Function EhPrimo(numero)&lt;br /> '&lt;br /> 'coloque o codigo aqui :)&lt;br /> '&lt;br /> EhPrimo=false ' so pra retornar algo...&lt;br />End Function&lt;br />&lt;br />'Coloquei o nome Test para ficar mais facil :)&lt;br />Sub Test( objQuery, strMessage ) &lt;br /> If Not objQuery Then&lt;br /> WScript.Echo VbCrlf &amp; "ERRO: " &amp; strMessage&lt;br /> WScript.Quit 'no primeiro teste errado...&lt;br /> End If&lt;br />End Sub&lt;br />&lt;br />' Testando primos&lt;br />Primos = array(2,3,5,7,11)&lt;br />For Each Numero In Primos&lt;br /> Test EhPrimo(Numero),"Numero " &amp; Numero &amp; " deve ser primo!"&lt;br />Next&lt;br />&lt;br />' Testando _nao_ primos&lt;br />NaoPrimos = array(4,6,8,9,10)&lt;br />For Each Numero In NaoPrimos&lt;br /> Test (Not EhPrimo(Numero)),"Numero " &amp; Numero &amp; " NAO deve ser primo!"&lt;br />Next&lt;br />&lt;br />' Testando outras coisas&lt;br />Test (Not EhPrimo( 0)),"Numero 0 NAO deve ser primo!"&lt;br />Test (Not EhPrimo( 1)),"Numero 1 NAO deve ser primo!"&lt;br />Test (Not EhPrimo(-1)),"Numero -1 NAO deve ser primo!"&lt;br />&lt;br />&lt;br />WScript.Echo VbCrlf &amp; "Pronto, passou tudo!"&lt;/code>&lt;/pre>&lt;br />&lt;br />Pronto, agora &lt;br />&lt;br />Qual a vantagem dessa abordagem?&lt;br /> 1) vc se obriga a testar o seu código &lt;br /> 2) vc descobre quais parametros são uteis nas suas funções&lt;br /> 3) vc especifica o comportamento das suas funções ANTES de implementa-la:)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Paranóia minha, mas código VB sempre me pareceu como um texto que abriu com erros... :D&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Evento Tchelinux nesse Sábado</title><link>http://pacman.blog.br/blog/2007/11/28/evento-tchelinux-nesse-sbado/</link><pubDate>Wed, 28 Nov 2007 13:14:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/28/evento-tchelinux-nesse-sbado/</guid><description>&lt;div class='post'>
Nerds do Sul!&lt;br />&lt;br />Sábado (1 de dezembro) haverá mais uma edição do Tchelinux, dessa vez em Porto Alegre.&lt;br />&lt;br />Será um dia cheio de palestras de workshops, ao custo de 2 kilos de alimentos não pereciveis.&lt;br />&lt;br />&lt;a href="http://www.tchelinux.org/2007/">http://www.tchelinux.org/2007/&lt;/a>&lt;br />&lt;br />Inclusive eu irei ministrar uma palestra sobre AWK/SED no começo da tarde. Destaco também a palestra do Carlos Santos sobre "A História do Unix".&lt;br />&lt;br />Enfim, um dia cheio de Ubuntu, Python, KDE, Kernel, BSD e muito mais!&lt;br />&lt;br />Apareçam!&lt;/div></description></item><item><title>Analise Orientada a Objetos com Java - Parte 1</title><link>http://pacman.blog.br/blog/2007/11/17/analise-orientada-objetos-com-java/</link><pubDate>Sat, 17 Nov 2007 15:02:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/17/analise-orientada-objetos-com-java/</guid><description>&lt;div class='post'>
Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java. &lt;br />&lt;br />Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa de análise orientada à objetos feita de forma progressiva, comentários são bem vindos.&lt;br />&lt;br />A primeira proposta foram 2 matrizes bidimensionais, uma com os professores disponíveis naquele dia e outra com as turmas, distribuidas ao longo de uma semana. Eu logo percebi que isso podia ser um problema de modelagem, pois se vc vai utilizar matrizes, paineis, interface textual ou seja lá o que for, isto é apenas uma camada - &lt;span style="font-weight:bold;">a visão&lt;/span>. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:&lt;br />&lt;br />&lt;pre>&lt;code>class Professor{}&lt;br />class Disciplina{}&lt;br />class Turma{&lt;br /> Disciplina disciplina;&lt;br /> Professor professor;&lt;br />}&lt;br />public class Main{&lt;br /> public static void main(String[] args) {&lt;br /> Professor oseias = new Professor();&lt;br /> Disciplina matematica = new Disciplina();&lt;br /> Turma matA = new Turma();&lt;br /> &lt;br /> matA.disciplina = matematica;&lt;br /> matA.professor = oseias;&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />A minha classe &lt;span style="font-weight:bold;">Main &lt;/span>mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe &lt;span style="font-weight:bold;">Professor&lt;/span>, uma classe &lt;span style="font-weight:bold;">Disciplina &lt;/span>e uma classe &lt;span style="font-weight:bold;">Turma&lt;/span>. Se vc observarem qualquer instituição de ensino vão perceber que uma turma tem-um professor e tem-uma disciplina associados (&lt;span style="font-style:italic;">composição&lt;/span>).&lt;br />&lt;br />Percebam também que eu não fui até uma escola ou universidade e fiquei horas levantando requisitos, criado diagramas uml ou documentos no word - apenas criei uma casca inicial de código (cheio de problemas por sinal). Também não me importo, ainda, com nenhum aspecto &lt;span style="font-style:italic;">temporal&lt;/span>. Sem falar que esta escola todos os professores podem dar qualquer disciplina - agora vamos implementar direito.&lt;br />&lt;br />Vejamos... uma turma não troca de disciplina facilmente, mas de professor sim. Faz sentido, então, ter um setter de professor e um construtor que receba uma disciplina. Outra coisa, eu não defini nada nas outras classes, então está na hora de definir 2 atributos : id (numérico) e nome (String). Vou diferenciar os objetos pelo código, isto é, o seu id, e o nome será utilizado como descrição. Vou sobreescrever os métodos equals e toString.&lt;br />&lt;br />Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).&lt;br />&lt;br />&lt;pre>&lt;code>class Professor{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> public Professor(long id,String nome){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ return this.nome ; }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Professor))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Professor) o).getId() == this.id; &lt;br /> return test;&lt;br /> } &lt;br />}&lt;br />class Disciplina{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> public Disciplina(long id,String nome){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ return this.nome ; }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Disciplina))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Disciplina) o).getId() == this.id; &lt;br /> return test;&lt;br /> }&lt;br />}&lt;br />class Turma{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> private Disciplina disciplina;&lt;br /> private Professor professor;&lt;br /> public Turma(long id, String nome,Disciplina disciplina){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> this.disciplina = disciplina;&lt;br /> }&lt;br /> public void setProfessor(Professor professor){&lt;br /> this.professor = professor;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ &lt;br /> return this.nome + " [" + this.disciplina &lt;br /> + "] c/ " + this.professor ; &lt;br /> }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Turma))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Turma) o).getId() == this.id; &lt;br /> return test;&lt;br /> } &lt;br />}&lt;br />public class Main {&lt;br /> public static void main(String[] args) {&lt;br /> /* objetos bem comportados */&lt;br /> Professor oseias = new Professor(1L,"Oseias");&lt;br /> Disciplina matematica = new Disciplina(1L,"Matematica");&lt;br /> Turma matA = new Turma(1L,"Matematica A", matematica);&lt;br /> matA.setProfessor(oseias); &lt;br /> &lt;br /> System.out.println("Professor " + oseias); &lt;br /> System.out.println("Disciplina " + matematica); &lt;br /> System.out.println("Turma " + matA);&lt;br /> &lt;br /> /* objetos mal comportados &lt;br /> * Sujeitos a NullPointerException */&lt;br /> Professor juca = new Professor(2L,null);&lt;br /> Disciplina calculo = new Disciplina(2L,null);&lt;br /> Turma matB = new Turma(2L,"Matematica B", null);&lt;br /> matB.setProfessor(null); // nem precisava mas...&lt;br /> Turma matC = new Turma(3L,"Matematica C",calculo); &lt;br /> Turma matD = new Turma(4L,"Matematica D",calculo);&lt;br /> matD.setProfessor(juca);&lt;br /> &lt;br /> System.out.println("Juca? " + juca);&lt;br /> System.out.println("Calculo?" + calculo);&lt;br /> System.out.println("matB? " + matB); &lt;br /> System.out.println("matC? " + matC);&lt;br /> System.out.println("matD? " + matD);&lt;br /> }&lt;br />}&lt;/pre>&lt;/code>&lt;br />&lt;br />Mas que raios eu estou fazendo? veja a saída desse programa:&lt;br />&lt;br />&lt;pre>Professor Oseias&lt;br />Disciplina Matematica&lt;br />Turma Matematica A [Matematica] c/ Oseias&lt;br />Juca? null&lt;br />Calculo?null&lt;br />matB? Matematica B [null] c/ null&lt;br />matC? Matematica C [null] c/ null&lt;br />matD? Matematica D [null] c/ null&lt;/pre>&lt;br />&lt;br />Qual o significado? Bom... eu tenho uma forma razoavel de representar um professor, disciplina e turma, porém não é pratico, o construtor está gigante e, em muitas situações, eu posso ter parâmetros nulos, o que pode ser uma fonte de problemas. Existem muitas formas de refatorar estas classes, eu nem toquei no &lt;a href="http://blog.caelum.com.br/2006/09/04/ensinando-que-e-o-hashcode/">HashCode&lt;/a>, enfim, tem muito pano pra manga. &lt;br />&lt;br />Apresento a vcs o desenvolvimento em etapas, iterativo. Eu estou chutando requisitos aos poucos, é verdade, mas eu entrego um codigo testável e completo e cada ciclo. Com os usuarios testando esse código (nesse caso, uma API, mas enfim...) eu obtenho um feedback interessante. O que vc acha?&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Saudações, sir Peczenyj. :)&lt;BR/>Muito boa a abordagem da análise.&lt;BR/>Java, como sempre, usual e prático no que diz respeito a conceitos de orientação a objeto (a não ser herança múlt... ops, heim? alguém disse algo? ah bom... :D ). &lt;BR/>Pois bem, quero ver a segunda parte pra descobrir o que pretende com esses construtores.&lt;BR/>No mais, já que Professores e Disciplinas são apenas referenciados em Turmas, e têm a sua existência independente destas, ainda acredito que a relação seria uma Agregação. E não Composição, como citou.&lt;BR/>Voltando... Vc descreveu o problema como possuindo o objetivo de atribuir professores às disciplinas. Tem alguma restrição ou regra geral que o problema define e pretende seguir (disponibilidade, horários, etc)? Ou continuará o foco em relacionar professores e disciplinas sem maiores restrições?&lt;BR/>Então é isso, continue o bom trabalho de sempre.&lt;BR/>Abraço.&lt;BR/>Até +.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcio&lt;/div>
&lt;div class='content'>
Eu acho que você deveria usar um problema mais complexo como exemplo e ver se isso realmente funciona. Seu exemplo é bem simples e todo mundo conhece o domínio (estou deduzindo que você estudou e fez faculdade :))&lt;BR/>&lt;BR/>Acho que não é necessário coletar todos os requisitos possíveis e modelar todos os detalhes do sistema, mas é quase obrigatório um estudo do domínio e um design, nem que seja um rascunho, do sistema. Os outros detalhes surgirão com a implementação. :)&lt;BR/>&lt;BR/>[]'s&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Nascimentos</title><link>http://pacman.blog.br/blog/2007/11/08/nascimentos/</link><pubDate>Thu, 08 Nov 2007 19:56:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/08/nascimentos/</guid><description>&lt;div class='post'>
Coisas maravilhosas acontecem.&lt;br />&lt;br />Descubro recentemente que um amigo meu virou papai. A pequena Sophia nasceu prematura, logo deve estar aos cuidados da família coruja. Agora descubro que outro amigo será pai: já está na sétima semana. Eta Canoenses!&lt;br />&lt;br />É... o tempo passa... quando estamos na faculdade descobri que um colega será pai/mãe é incomum, mas com o passar do tempo temos que escutar "e tu, pra quando vai ser?"...&lt;br />&lt;br />Na hora certa (espero eu).&lt;/div></description></item><item><title>Ferramentas de Teste</title><link>http://pacman.blog.br/blog/2007/11/06/ferramentas-de-teste/</link><pubDate>Tue, 06 Nov 2007 14:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/06/ferramentas-de-teste/</guid><description>&lt;div class='post'>
Excelente comparativo de duas ferramentas gratuitas de teste automatizado para interfaces web.&lt;br />&lt;br />&lt;a href="http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/">http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/&lt;/a>&lt;br />&lt;br />Pelo escore final, creio que muitos projetos web poderiam ser beneficiados pela combinação destas duas ferramentas.&lt;/div></description></item><item><title>From Nand to Tetris in 12 Steps</title><link>http://pacman.blog.br/blog/2007/11/06/from-nand-to-tetris-in-12-steps/</link><pubDate>Tue, 06 Nov 2007 13:50:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/06/from-nand-to-tetris-in-12-steps/</guid><description>&lt;div class='post'>
Otimo vídeo - Google Tech Talks October 10 ,2007&lt;br />&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=7654043762021156507&amp;hl=en" flashvars=""> &lt;/embed>&lt;br />&lt;br />Link direto &lt;a href="http://video.google.com/videoplay?docid=7654043762021156507">aqui&lt;/a>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Pois é, pena que é bem corrido.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Ótimo esse vídeo. principalmente para min que estou quebrando cabeça com o funcionamento do MIPS.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>AWK e Arrays Associativos</title><link>http://pacman.blog.br/blog/2007/10/31/awk-e-arrays-associativos/</link><pubDate>Wed, 31 Oct 2007 13:09:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/31/awk-e-arrays-associativos/</guid><description>&lt;div class='post'>
Um grande problema para quem trabalha com arrays associativos no AWK é&lt;br />com relação a ordem dos elementos quando esta fazendo uma iteração.&lt;br />&lt;br />Ex:&lt;br />&lt;pre>&lt;code>$ gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'&lt;br />1&lt;br />3&lt;br />5&lt;br />4&lt;br />2&lt;/pre>&lt;/code>&lt;br />&lt;br />Eu inseri, nessa ordem, 5, depois 4, depois 2... porém o acesso aos&lt;br />elementos de um array em um for do tipo&lt;br />&lt;pre>&lt;code>for( variavel in array)&lt;/pre>&lt;/code>&lt;br />é imprevisive / incontrolável.&lt;br />&lt;br />Agora vejamos isto:&lt;br />&lt;br />&lt;pre>&lt;code>$ WHINY_USERS=1 gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'&lt;br />5&lt;br />4&lt;br />2&lt;br />1&lt;br />3&lt;/pre>&lt;/code>&lt;br />&lt;br />WOW! Através da variavel de ambiente do unix WHINY_USERS agora eu consigo acessar os elementos na ordem em que eles foram inseridos no array!&lt;br />&lt;br />E para acessar os valores na ordem crescente:&lt;br />&lt;pre>&lt;code>$ WHINY_USERS=1 gawk 'BEGIN{ split("5 4 2 1 3",T)&lt;br /> asort(T) ; for(i in T) print T[i] }'&lt;br />1&lt;br />2&lt;br />3&lt;br />4&lt;br />5&lt;/pre>&lt;/code>&lt;br />&lt;br />A variavel de ambiente WHINY_USERS &lt;span style="font-weight:bold;">não&lt;/span> esta documentada no man, muito menos na documentação que consegui a respeito do gawk. Descobri esta dica no &lt;span style="font-style:italic;">comp.lang.awk&lt;/span> e, por incrivel que pareça, tive que vasculhar o codigo fonte do &lt;span style="font-style:italic;">gawk&lt;/span> (graças a deus podemos fazer isso) para entender melhor o que essa variavel poderia fazer.&lt;br />&lt;br />Enfim, fica a dica.&lt;/div></description></item><item><title>Tchelinux 2007 - Chamada de trabalhos</title><link>http://pacman.blog.br/blog/2007/10/30/tchelinux-2007-chamada-de-trabalhos/</link><pubDate>Tue, 30 Oct 2007 14:53:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/30/tchelinux-2007-chamada-de-trabalhos/</guid><description>&lt;div class='post'>
Seja bem-vindo à chamada de trabalhos do 2º Seminário do Software Livre Tchelinux que irá acontecer dia 1º de Dezembro de 2007 na UFRGS em Porto Alegre, RS. Antes de enviar sua proposta de palestra, recomendamos que leia atenciosamente o regulamento abaixo:&lt;br />&lt;br />Sobre o Temário:&lt;br />&lt;br />A equipe de avaliação de propostas irá selecionar 10 palestras técnicas sobre Software Livre dentro dos seguintes temas:&lt;br />&lt;br />Sistemas Operacionais&lt;br />Desktop baseado em Software Livre&lt;br />Aplicativos Gráficos&lt;br />Jogos e Multimídia&lt;br />Linguagens de programação&lt;br />Ferramentas para desenvolvimento&lt;br />Banco de dados&lt;br />Administração de Sistemas&lt;br />Redes e Segurança da Informação&lt;br />&lt;br />Sobre as Apresentações:&lt;br />&lt;br />- Cada palestrante terá 75 minutos para apresentar seu trabalho &lt;br />- Os recursos disponíveis serão projetor multimídia e micro-computador rodando Ubuntu Gutsy&lt;br />- O palestrante deverá permitir que os slides de sua palestra seja publicada no site do grupo&lt;br />- Não haverá nenhuma remuneração ou reembolso de despesas para palestrantes&lt;br />&lt;br />&lt;a href="http://www.tchelinux.org/papers/">http://www.tchelinux.org/papers/&lt;/a>&lt;br />&lt;br />Participem!&lt;/div></description></item><item><title>Entendendo Ponteiros na linguagem C</title><link>http://pacman.blog.br/blog/2007/10/24/entendendo-ponteiros-na-linguagem-c/</link><pubDate>Wed, 24 Oct 2007 11:09:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/24/entendendo-ponteiros-na-linguagem-c/</guid><description>&lt;div class='post'>
Entender ponteiros (e ponteiros para ponteiros) nem sempre é facil quando estamos vendo C ou C++ pela primeira vez. O conceito é absurdamente simples, assim como os operadores * e &amp;, mas pelo menos para mim demorou um tempão para a ficha cair (e olha que eu utilizava arrays direto e nem me ligava nesse detalhe).&lt;br />&lt;br />Com auxilio do pre-processador C, vejamos se este exemplo que pode ser elucidativo:&lt;br />&lt;br />&lt;pre>&lt;code>#include "pointer.h" &lt;br />int main () &lt;br />{ &lt;br /> int x = 0; // variavel de exemplo &lt;br /> pointer(int) y; // ponteiro &lt;br />&lt;br /> y = address(x); // y aponta para o endereco de x &lt;br />&lt;br /> x++; // incrementamos o valor de x &lt;br /> value(y)++; // incremento indireto (via ponteiro) &lt;br />&lt;br /> printf("value %d %d\n",x, value(y) ); &lt;br /> printf("address %p %p\n",address(x), y ); &lt;br />&lt;br /> return 0; &lt;br />} &lt;/code>&lt;/pre>&lt;br />&lt;br />Ou seja, a criação de um ponteiro para uma variavel do tipo inteira é através da macro pointer. Outra macro, address, retorna o endereço de uma variavel e, assim, tenho uma referência aquela variavel. Posso então ter acesso ao valor e até mesmo manipular a variavel original.&lt;br />&lt;br />Vejamos agora o resultado da execução:&lt;br />&lt;pre>$ ./a.out&lt;br />value 2 2&lt;br />address 0xbfffeaa4 0xbfffeaa4&lt;/pre>&lt;br />&lt;br />Perceba que eu consegui incrementar a variavel duas vezes (através das duas formas disponíveis). Perceba também que o ponteiro y tem como valor o mesmo endereço de memória que a variavel x, razão pela qual consigo alterar o seu valor.&lt;br />&lt;br />O codigo gerado pelas macros &lt;br />&lt;br />&lt;pre>&lt;code>int main () &lt;br />{ &lt;br /> int x = 0; // variavel de exemplo &lt;br /> int * y; // ponteiro &lt;br />&lt;br /> y = (&amp;(x)); // y aponta para o endereco de x &lt;br />&lt;br /> x++; // incrementamos o valor de x &lt;br /> (*y)++; // incremento indireto (via ponteiro) &lt;br />&lt;br /> printf("value %d %d\n",x, (*y)); &lt;br /> printf("address %p %p\n",(&amp;(x)), y); &lt;br />&lt;br /> return 0; &lt;br />} &lt;/code>&lt;/pre>&lt;br />&lt;br />Eu recomendo que, uma vez que o conceito tenha ficado claro, &lt;span style="font-weight:bold;">que não se use mais este header&lt;/span> sob pena de criar arquivos ilegíveis. Por exemplo, tente compilar com a opção de gerar os simbolos para debug (-g) e depois tente debugar esse programa: perceberão que o gdb, por exemplo, não mostra o codigo fonte com tanta clareza.&lt;br />&lt;br />Para fazer este exemplo, utilizamos este arquivo header:&lt;br />&lt;br />&lt;pre>&lt;code>#define pointer(type) type *&lt;br />#define value(var) (*(var))&lt;br />#define address(var) (&amp;(var))&lt;/code>&lt;/pre>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Magoei... :(&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Ron&lt;/div>
&lt;div class='content'>
lixo! vai aprender a programar! :D&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tropa de Elite 2 - Dia de Treinamento Java</title><link>http://pacman.blog.br/blog/2007/10/07/tropa-de-elite-2-dia-de-treinamento/</link><pubDate>Sun, 07 Oct 2007 21:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/07/tropa-de-elite-2-dia-de-treinamento/</guid><description>&lt;div class='post'>
Seguimos com novos exemplos inspirados na triste realidade da polícia carioca.&lt;br />&lt;br />&lt;pre>&lt;code>/*&lt;br />* O Bope foi criado para atuar quando a policia perde o controle&lt;br />* E no rio de janeiro isso acontece com bastante frequencia&lt;br />*/&lt;br />class Bope{ &lt;br /> private String nome; &lt;br /> private int qtdeVitimas = 1; // ja começa bem!&lt;br /> &lt;br /> public Bope(String nome){&lt;br /> this.nome = nome;&lt;br /> } &lt;br /> // sobrecarga do método ondeTaOBaiano&lt;br /> public void ondeTaOBaiano(Estudante e){&lt;br /> e.sabeVoarEstudante();&lt;br /> }&lt;br /> public void ondeTaOBaiano(Traficante t){&lt;br /> t.levaSacoNaCabeca();&lt;br /> }&lt;br /> // exemplo de método final!&lt;br /> public final Doze encontreiOBaiano(Baiano b){&lt;br /> return b.naCaraNaoQueEhPraNaoEstragarVelorio();&lt;br /> }&lt;br />}&lt;br />&lt;br />public class Treinamento{&lt;br /> public static void main(String [] xxx){&lt;br /> // Apresento o capitão nascimento&lt;br /> Bope instrutor = new Bope("Capitao Nascimento");&lt;br /> try{&lt;br /> // de cada 100 policiais que fazem o curso do Bope,&lt;br /> // so se formam 5, e eu, quando me formei parceiro, &lt;br /> // eramos apenas 3. &lt;br /> Turma.tentaFazerCursoBopeCom(capitao);&lt;br /> } catch (PolicialCorruptoEncontrado pce){&lt;br />&lt;br /> } catch (PolicialFracoEncontrado pfe){&lt;br />&lt;br /> } catch (PolicialSemABandoleiraNessaAlturadoCampeonato e){&lt;br />&lt;br /> }&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />SEUS FANFARRÕES!&lt;br />VCS TEM 10 &lt;span style="font-weight:bold;">SEGUNDOS &lt;/span>PARA COMPLETAR ESSE CÓDIGO!&lt;br />&lt;br />- O zero-dois NÃO está escrevendo!&lt;br />- SEU zero-dois, porque o senhor não escreveu nenhuma linha?&lt;br />- A-a minha IDE não terminou de carregar, senhor...&lt;br />- Agora a sua IDE ja carregou, seu zero-dois?&lt;br />- S-sim senhor...&lt;br />- Então, seu zero-dois, termine o seu programa, senão todos os seus colegas terão que usar o EDIT do MS-DOS até o fim do curso E A CULPA EH DO ZERO-DOIS!&lt;br />&lt;br /> &lt;hr/>&lt;br />HOMEM DE PRETO QUAL É A SUA MISSÃO?&lt;br />É APRENDER JAVA SEM PRECISAR DE CERTIFICAÇÃO!&lt;br />HOMEM DE PRETO O QUE É QUE VC FAZ?&lt;br />FAÇO CODIGO FONTE QUE ASSUSTA O SATANÁS!&lt;br /> &lt;hr/>&lt;br />Estratégia, do inglês, &lt;a href="http://www.tml.tkk.fi/~pnr/GoF-models/html/Strategy.html">Strategy&lt;/a>...&lt;br />&lt;br />- Senhor, o zero-cinco está dormindo...&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Lucas&lt;/div>
&lt;div class='content'>
Muito bom :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Felipe&lt;/div>
&lt;div class='content'>
Hahaha muito bom!!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Sergio&lt;/div>
&lt;div class='content'>
Só faltou isso:&lt;BR/>&lt;BR/>"Tira esse pin do peito que vc não é desenvolvedor java... vc é muleke!!!"&lt;BR/>&lt;BR/>muito bom esse post&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>gto&lt;/div>
&lt;div class='content'>
hahaha!!&lt;BR/>Isso vai virar um paradigma logo, logo.&lt;BR/>&lt;BR/>"Eu uso OO (orientação a objeto).. Eu uso OE (orientação a eventos)..&lt;BR/>&lt;BR/>Eu uso BP! (bope, porra!)"&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Aprendendo Conceitos antes de Sintaxe</title><link>http://pacman.blog.br/blog/2007/10/04/aprendendo-conceitos-antes-de-sintaxe/</link><pubDate>Thu, 04 Oct 2007 21:10:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/04/aprendendo-conceitos-antes-de-sintaxe/</guid><description>&lt;div class='post'>
O homem aprende por dois motivos: por gosto ou por necessidade.&lt;br />&lt;br />Depois de passar um semestre brincando com Pascal na era pré-google ( quando não encontravamos uma pagina através do yahoo ou cadê, tentavamos urls aleatórias como www.pascal.org - que era a pagina da família pascal ), tive uma disciplina cujo professor só sabia Fortran e C.&lt;br />&lt;br />Através do &lt;a href="http://en.wikipedia.org/wiki/MOO">MOO&lt;/a> descobri o curso on-line da UFMG, e pude dar os primeiros passos em C. Entretanto o foco dessa disciplina não era fazer agenda ou video-locadora - eram programas científicos. Linux, gnuplot, maple... foi um mundo muito divertido.&lt;br />&lt;br />É claro que algumas coisas eu simplesmente não compreendia: os tais dos ponteiros, por exemplo. Era só ver um * que não fosse multiplicação que eu já tinha dor de cabeça. E assim se passaram alguns anos onde eu apenas reproduzia os comandos que tinha aprendido.&lt;br />&lt;br />Anos depois, conversando com o &lt;a href="http://unixmania.blogspot.com/">CaSantos&lt;/a> caímos em uma micro-aula de programação. Eis que ele profere sabias palavras: &lt;span style="font-style:italic;">Ao estudar uma linguagem de programação, a primeira coisa que se precisa estudar são os conceitos e, por último, a sua sintaxe&lt;/span>.&lt;br />&lt;br />Toda a vez que eu entrava em uma lista de discussão ou forum e via as perguntas dos novatos eu lembrava dessa frase. Coisas como dizer que os arquivos .h do C são bibliotecas, colocar system("pause") pro programa não "fechar do nada" e por ai vai. O tipo da coisa que, quem conhece o conceito, não perguntaria.&lt;br />&lt;br />Por que razão não se ensina os conceitos de uma linguagem logo no começo? Eu só posso pensar que é para os alunos aprenderem de forma intuitiva no começo e resgatar isso mais tarde (talvez em uma cadeira de compiladores, sei lá), mas será que isso acontece? &lt;br />&lt;br />Geralmente o trabalho de fim de semestre dessas cadeiras é um CRUD em C com listagem (ou relatório) de alguma coisa ordenada de uma ou mais formas. Cadastrar alunos ou contas bancárias, salvando em arquivo.&lt;br />&lt;br />Pois bem, se é uma disciplina &lt;span style="font-style:italic;">introdutória&lt;/span>, por que raios alguem iria pedir um CRUD?? Meu deus, os alunos mal sabem como compilar o programa, tampouco debuga-lo - No maximo enchem de printf("passei por aqui") - e pedem um programa com 'menu interativo'! Ai o camarada perde metade do tempo fazendo 'menuzinho' com asteriscos ou outro caracter e não consegue implementar a lógica. Quando implementa é aquela maçaroca. O que isso &lt;span style="font-style:italic;">ensina&lt;/span>?&lt;br />&lt;br />Eu daria uma sugestão: quer ensinar C ou Java ou Snobol 4, ensine. Mas não peça um programa CRUD cheio de frescura - peça uma biblioteca. De um arquivo header ou uma interface java e diga: implementem essas funções/metodos ai. Eu vou testar o meu programa com essa biblioteca e espero que tudo funcione.&lt;br />&lt;br />videolocadora.h&lt;br />&lt;pre>&lt;code>int cadastra_video(char *nome, int preco, int categoria);&lt;br />int cadastra_cliente(char *nome, char *cpf, char *endereco);&lt;br />int aluga_video(...);&lt;/code>&lt;/pre>&lt;br />&lt;br />Enfim, não consigo pensar num exemplo melhor. A ideia é introduzir um desenvolvimento em camadas, deixando o aluno pensar em como ele vai gravar, ler e ordenar os dados sem frescuras de tela, ensinando a fazer testes e também a debugar a aplicação.&lt;br />&lt;br />Quer ensinar a fazer telinha? Ensina em outra disciplina, nesse caso ensinando técnicas de design &lt;span style="font-style:italic;">apropriadas&lt;/span>. Começando pela linha de comando do unix: como pode um aluno se formar sem nunca ter criado o seu próprio &lt;span style="font-weight:bold;">grep&lt;/span>? Criar interfaces com o usuário não é algo facil, requer muito estudo, principalmente de usabilidade.&lt;br />&lt;br />Alias fazer "telinhas" geralmente supõe colocar um programa em um &lt;span style="font-style:italic;">estado&lt;/span>. Quem aprende o conceito de maquina de estados no momento que esta fazendo esse cadastro? Posso apostar que esse pessoal não sabe o que é stateless e statefull e o professor nem pensa q isso seja importante (aqui eu lembro da agenda de telefones que eu fiz em pascal).&lt;br />&lt;br />Fica aqui a minha sugestão. Espero que faça sentido :)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Setf&lt;/div>
&lt;div class='content'>
Excelente post Tiago. Acredito que os cursos de programação melhorariam muito (especialmente os de C) se utilizassem essa idéia simples de criar uma biblioteca ao invéz de perder tempo criando interfaces que nem ao menos são práticas ou úteis. Um professor poderia já entregar essa interface com o usuário pronta e o aluno implementar as funcionalidades dela. Seria muito mais empolgante.&lt;BR/>&lt;BR/>Parabéns novamente pelo post.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Convertendo Números</title><link>http://pacman.blog.br/blog/2007/10/01/convertendo-nmeros/</link><pubDate>Mon, 01 Oct 2007 19:29:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/10/01/convertendo-nmeros/</guid><description>&lt;div class='post'>
Um dos meus primeiros desafios na área de programação foi fazer um conversor de números decimais para romanos. Eu estava aprendendo Turbo Pascal e usava um potente 286 com 1MB de memória - sem HD.&lt;br />&lt;br />Fiz a maior sequencia de ifs da minha vida. Hoje estava relembrando e resolvi fazer uma versão SED.&lt;br />&lt;br />&lt;pre>&lt;code>/[0-9]*[5-9]...$/q&lt;br />s/1...$/M&amp;/;s/2...$/MM&amp;/;s/3...$/MMM&amp;/;s/4...$/MMMM&amp;/&lt;br />s/6..$/DC&amp;/;s/7..$/DCC&amp;/;s/8..$/DCCC&amp;/;s/9..$/CM&amp;/&lt;br />s/1..$/C&amp;/;s/2..$/CC&amp;/;s/3..$/CCC&amp;/;s/4..$/CD&amp;/;s/5..$/D&amp;/&lt;br />s/6.$/LX&amp;/;s/7.$/LXX&amp;/;s/8.$/LXXX&amp;/;s/9.$/XC&amp;/&lt;br />s/1.$/X&amp;/;s/2.$/XX&amp;/;s/3.$/XXX&amp;/;s/4.$/XL&amp;/;s/5.$/L&amp;/&lt;br />s/1$/I/;s/2$/II/;s/3$/III/;s/4$/IV/;s/5$/V/&lt;br />s/6$/VI/;s/7$/VII/;s/8$/VIII/;s/9$/IX/&lt;br />s/[0-9]//g&lt;/pre>&lt;/code>&lt;br />&lt;br />Tendo um número por linha ja basta. &lt;br />&lt;br />&lt;pre>$ echo '3999' | sed -f other.sed&lt;br />MMMCMXCIX&lt;/pre>&lt;br />&lt;br />O sed é realmente fantástico! Pena que acima de 5 mil tem que colocar &lt;a href="http://en.wikipedia.org/wiki/Roman_numerals">uma barra em cima dos números&lt;/a>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>voyeg3r&lt;/div>
&lt;div class='content'>
Também sou super fã do SED, estou no momento criando um script para converter um wiki do pbwiki para moinmoin, são mais de 300 páginas e adição manual seria um trabalho digno para um usuário windows :)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Aprenda Java com os melhores versão Tropa de Elite</title><link>http://pacman.blog.br/blog/2007/09/30/aprenda-java-com-os-melhores-verso/</link><pubDate>Sun, 30 Sep 2007 21:01:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/30/aprenda-java-com-os-melhores-verso/</guid><description>&lt;div class='post'>
Exatamente: Não vem com essa que vc é &lt;span style="font-style:italic;">istudante&lt;/span>, vai tomar tapa na cara se não aprender Java. Saiba que, de cada 100, só 5 terminam o curso. Nem na Sun se treina programador assim.&lt;br />&lt;br />&lt;pre>&lt;code>/*&lt;br />* O Bope foi criado para atuar quando a policia perde o controle&lt;br />* E no rio de janeiro isso acontece com bastante frequencia&lt;br />*/&lt;br />class Bope{&lt;br /> &lt;br /> private String nome; &lt;br /> private int vitimas;&lt;br /> &lt;br /> public Bope(String nome){&lt;br /> this.nome = nome;&lt;br /> this.vitimas =0;&lt;br /> }&lt;br /> &lt;br /> public void matou(int tantas_vitimas_agora){ &lt;br /> this.vitimas = this.vitimas + tantas_vitimas_agora;&lt;br /> }&lt;br /> &lt;br /> public int quantas_vitimas(){&lt;br /> return this.vitimas;&lt;br /> }&lt;br />}&lt;br />&lt;br />public class Programa{&lt;br /> public static void main(String [] xxx){&lt;br /> // Apresento o capitão nascimento&lt;br /> Bope capitao = new Bope("Capitao Nascimento");&lt;br /> &lt;br /> // quando o capitão sobe a favela, é pra matar, não pra morrer&lt;br /> capitao.matou(1000);&lt;br /> &lt;br /> // agora ele subiu o morro de novo, com ele não tem erro.&lt;br /> capitao.matou(2000);&lt;br /> &lt;br /> // e a farda dele não é azul, é PRETA&lt;br /> System.out.println("O Bope matou: " + capitao.quantas_vitimas());&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Entendeu? Não?&lt;br />&lt;br />ENTÃO PEDE PRA SAIR, GUERREIRO!&lt;br />TU É CORRUPTO, TEU LUGAR É COM .NET, É COM VB! JOCKEY DE IDE! PEDE PRA SAIR AGORA!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>RIC@RDO&lt;/div>
&lt;div class='content'>
Te puxou em Peczenyj!!&lt;BR/>Essa ficou muito boa!!!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>gto&lt;/div>
&lt;div class='content'>
hahah!&lt;BR/>Nunca tinha comentado por aqui, mas leio as vezes. Dessa vez me obriguei a comentar.&lt;BR/>&lt;BR/>Vou te dizer, pra ficar bem ao estilo do bope, com direito a caveirão e tudo mais, só faltava um método "ondeTaOBaianoPorra" :D&lt;BR/>&lt;BR/>E claro, as ameaças com vouTeMostrarOSaco e pegaAVassoura...&lt;BR/>&lt;BR/>uh!&lt;BR/>&lt;BR/>[]'s!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Fala Peczenyj.&lt;BR/>Estamos na mesma, só na base das descrições.&lt;BR/>Agora, "Jokey de IDE" foi PHoda. LOL&lt;BR/>Nunca tinha achado uma expressão que casasse tão bem. (com o jeito do Capitão Nascimento claro) :D&lt;BR/>Isso inspira a fazer um do senado.&lt;BR/>Difícil é que nunca sairia da prioridade mais alta (e com imunidade a kills).&lt;BR/>Farewell. :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Acontece que o Capitão Nascimento aprendeu C primeiro, eu até tentei corrigir isso mas ele me ameaçou, disse q eu era moleque.&lt;BR/>&lt;BR/>E não vi o filme ainda, me alimento das descrições eletrizadas dos meus colegas de trabalho :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Edson&lt;/div>
&lt;div class='content'>
Assistiu ao filme na versão oficial (na única sala que o passa em Jundiaí) ou foi em piratão mesmo? &lt;BR/>Tem de tomar um tapa no ouvido mesmo, que "quantas_vitimas" é o jeito C de falar, e BOPE que se preza fala em Java ("quantasVitimas") :P&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>rsfair&lt;/div>
&lt;div class='content'>
Nada como comentários para facilitar o entendimento do programa :)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Ruby e o method_missing</title><link>http://pacman.blog.br/blog/2007/09/28/ruby-e-o-methodmissing/</link><pubDate>Fri, 28 Sep 2007 11:43:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/28/ruby-e-o-methodmissing/</guid><description>&lt;div class='post'>
Os objetos em Ruby possuem um método chamado 'respond_to?' para verificar se o objeto possui (ou melhor, se ele responde a) um determinado método. Em uma linguagem dinâmica como o ruby, onde podemos incluir um método numa classe em &lt;span style="font-style:italic;">runtime&lt;/span>, é um recurso muito necessário, ainda mais se pensarmos em termos de &lt;span style="font-style:italic;">Duck Typing&lt;/span>.&lt;br />&lt;br />Em caso de dúvida, basta fazer um &lt;span style="font-weight:bold;">if&lt;/span>, afinal chamar um método que não existe causa um &lt;span style="font-weight:bold;">NoMethodError&lt;/span>, certo?&lt;br />&lt;br />Depende. Observe:&lt;br />&lt;br />&lt;pre>&lt;code>class A&lt;br /> def xxx()&lt;br /> puts "xxx"&lt;br /> end&lt;br /> def method_missing(m, *args)&lt;br /> puts "nao tenho esse metodo: #{m}"&lt;br /> end&lt;br />end&lt;br />&lt;br />a = A.new&lt;br />a.xxx&lt;br /># aqui normalmente daria erro e o script seria abortado &lt;br /># sem o rescue adequado&lt;br />a.yyy &lt;/code>&lt;/pre>&lt;br />&lt;br />Resultado:&lt;br />&lt;pre>~> ruby A.rb&lt;br />xxx&lt;br />nao tenho esse metodo: yyy&lt;/pre>&lt;br />&lt;br />Eu sobreescrevi o método 'method_missing', que como o próprio nome indica, intercepta uma chamada a um método inexistente. Divertido, não?&lt;/div></description></item><item><title>Ruby e suas travessuras</title><link>http://pacman.blog.br/blog/2007/09/24/ruby-e-suas-travessuras/</link><pubDate>Mon, 24 Sep 2007 23:33:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/24/ruby-e-suas-travessuras/</guid><description>&lt;div class='post'>
&lt;pre>&lt;code>irb(main):001:0> def some(thing)&lt;br />irb(main):002:1> puts "some#{thing}"&lt;br />irb(main):003:1> end&lt;br />=> nil&lt;br />irb(main):004:0> some "thing"&lt;br />something&lt;br />=> nil&lt;br />irb(main):005:0> some = "thing"&lt;br />=> "thing"&lt;br />irb(main):006:0> some(some)&lt;br />something&lt;br />=> nil&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Ajude para ser ajudado.</title><link>http://pacman.blog.br/blog/2007/09/22/ajude-para-ser-ajudado/</link><pubDate>Sat, 22 Sep 2007 15:47:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/22/ajude-para-ser-ajudado/</guid><description>&lt;div class='post'>
Não é incomum encontrarmos pedidos de ajuda (as vezes em caps lock, com a palavra "urgente" e com açassinatos ao idioma corrente) em listas de discussão ou foruns.&lt;br />&lt;br />Por exemplo:&lt;br /> &lt;blockquote>no postgresql o comando sql abaixo funciona perfeitamente &lt;br /> &lt;br /> "SELECT c.descricao, u.nome, v.data_venda ," &lt;br /> + "v.valor_total, v.condicao_pagamento, v.codigo" &lt;br /> + "from venda v, carro c, usuario u" &lt;br /> + "where v.carro = c.codigo and v.usuario = u.codigo"; &lt;br /> &lt;br /> mas quando executo no java ocorre erro&lt;/blockquote> &lt;br />&lt;br />Não vejo diferença entre falar apenas isso e esta conversa pelo telefone:&lt;br />&lt;br />&lt;blockquote>- Alo, consultório médico&lt;br />- Doutor, é a primeira vez que ligo, nunca nos vimos...&lt;br />- Pronto, me diga o que esta sentindo.&lt;br />- me sinto mal...&lt;br />- Ah, tome um chá de joaçaba com mel e 2 anti-coagulantes&lt;br />- Certo, e quanto a isso aqui na minha perna?&lt;br />- Humm... vamos ter que operar. Ou espera uma semana que passa...&lt;/blockquote>&lt;br />&lt;br />Enfim...&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Taner Pereira&lt;/div>
&lt;div class='content'>
Você deve ouvir mais do que falar, por isso temos dois ouvidos e apenas uma boca.&lt;BR/>&lt;BR/>Mas nos fóruns a coisa inverte, acho que precisamos de mais bocas e menos ouvidos. Tem gente que só participa para pedir ajuda mas nunca ajuda ninguém.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Marcos, vc está certo, porém com uma descrição tão pobre eu não sei se era só _este_ erro. Sem bola de cristal fica dificil. &lt;BR/>&lt;BR/>Mas fora o pessoal "sem noção", foruns são extremamente úteis!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>MarcosJordao''&lt;/div>
&lt;div class='content'>
Pior que é verdade... rs&lt;BR/>&lt;BR/>Contudo, fóruns são muito produtivos e já me ajudaram muito!&lt;BR/>&lt;BR/>A propósito, o erro em questão é que pela concatenação os comandos ficarão sem espaços, por exemplo:&lt;BR/>"...v.codigofrom venda..."&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Renan&lt;/div>
&lt;div class='content'>
A diferença é que o primeiro você pode consertar...&lt;BR/>&lt;BR/>O segundo já não dá :P&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Resumo do primeiro Chopp on Rails de Poa</title><link>http://pacman.blog.br/blog/2007/09/22/resumo-do-primeiro-chopp-on-rails-de/</link><pubDate>Sat, 22 Sep 2007 00:55:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/22/resumo-do-primeiro-chopp-on-rails-de/</guid><description>&lt;div class='post'>
O pessoal da lista &lt;a href="http://groups.google.com/group/rails-rs">rails-rs&lt;/a> organizou um encontro em um local com bastante cerveja.&lt;br />&lt;br />Acho que a melhor descrição do que poderia ter sido é esta:&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/7TTqNXNMnHk">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/7TTqNXNMnHk" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;/div></description></item><item><title>Curso de Ruby on Rails em Porto Alegre</title><link>http://pacman.blog.br/blog/2007/09/18/curso-de-ruby-on-rails-em-porto-alegre/</link><pubDate>Tue, 18 Sep 2007 10:11:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/18/curso-de-ruby-on-rails-em-porto-alegre/</guid><description>&lt;div class='post'>
Uma oportunidade imperdível!&lt;br />&lt;br />A &lt;a href="http://www.techoffice.com.br/">Tech Office IT&lt;/a> realiza no período de 24 a 28 de setembro de 2007 em Porto Alegre, o curso presencial &lt;a href="http://pt.wikipedia.org/wiki/Ruby_on_Rails">Ruby on Rails&lt;/a>, voltado a desenvolvedores Ruby que desejam conhecer mais sobre Rails e desenvolvedores de outras linguagens que tenham interesse em ingressar no RoR. O curso objetiva auxiliar o aluno a entender o Ruby on Rails e possibilitar a criação de aplicações o utilizando, além de expor suas vantagens e limitações.&lt;br />&lt;br />Após o curso o aluno estará apto a desenvolver aplicações WEB utilizando o Ruby On Rails, saberá onde procurar mais recursos para acelerar o desenvolvimento e adicionar recursos na aplicação desenvolvida.&lt;br />&lt;br />Com carga horária de 20 horas/aula, o treinamento será 100% prático e ministrado em laboratório. Durante o curso, os participantes desenvolverão uma loja de DVDs completa que poderá ser utilizada como exemplo ou como base para o desenvolvimento de uma aplicação mais complexa pós-curso. Mais informações poderão ser obtidas através do site www.techoffice.com.br ou e-mail contato (at) techoffice (.) com (.) br, além do telefone 51.3012.8241.&lt;br />&lt;br />&lt;a href="http://www.techoffice.com.br/ruby/flyer_ruby.htm">Mais detalhes sobre o curso de Ruby on Rails&lt;/a>&lt;br />&lt;br />&lt;a href="http://www.techoffice.com.br/ruby/insc_ruby.htm">Clique aqui para se inscrever no curso de Ruby On Rails&lt;/a>&lt;br />&lt;br />Se alguem não sabe o poder do Ruby on Rails, veja esse &lt;a href="http://www.youtube.com/v/Gzj723LkRJY">video&lt;/a>:&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/Gzj723LkRJY">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/Gzj723LkRJY" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;/div></description></item><item><title>Vagas Abertas!</title><link>http://pacman.blog.br/blog/2007/09/18/vagas-abertas/</link><pubDate>Tue, 18 Sep 2007 09:58:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/18/vagas-abertas/</guid><description>&lt;div class='post'>
Pessoal, trago aqui pelo menos 5 oportunidades de ingressar em uma das maiores empresas de tecnologia do mundo. O ambiente de trabalho é excelente, as condições são muito boas e existem muitas possibilidades de crescimento. Todas as vagas são para trabalhar em Porto Alegre/RS.&lt;br />&lt;br />&lt;span style="font-weight:bold;">Desenvolvedor C# - 3 vagas&lt;/span>&lt;br />Experiência em desenvolvimento/programação de SW em C# e .Net&lt;br />Conhecimentos sobre UML e OO e design patterns&lt;br />Conhecimentos sobre XML e XPATH&lt;br />Inglês avançado/fluente&lt;br />&lt;br />&lt;span style="font-weight:bold;">Desenvolvedor/Testador - 2 vagas&lt;/span>&lt;br />Experiência na área de teste de software&lt;br />Conhecimento de WebServices e protocolos SOAP e HTTP&lt;br />Conhecimento de XML, XPATH e alguma linguagem Script&lt;br />Experiência em OO&lt;br />Inglês fluente&lt;br />&lt;br />É claro, caso alguem queira ingressar na área de informática, eu sugiro que pense nessa vaga:&lt;br />&lt;span style="font-weight:bold;">Testador de Software&lt;/span>&lt;br />Experiência na área de teste de software&lt;br />Conhecimentos em Banco de Dados e SQL (select, update, insert,delete)&lt;br />&lt;br />Aos interessados enviar email com currículo para tiago (.) peczenyj (at) gmail (.) com&lt;/div></description></item><item><title>Die Working Hardly</title><link>http://pacman.blog.br/blog/2007/08/29/die-working-hardly/</link><pubDate>Wed, 29 Aug 2007 21:29:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/29/die-working-hardly/</guid><description>&lt;div class='post'>
Sensacional Filme sobre efeitos especiais... sem efeitos especiais.&lt;br />&lt;br />Foi dirigido pelo &lt;span style="font-style:italic;">Zach Lipovsky&lt;/span>, para concorrer no &lt;span style="font-style:italic;">On The Lot&lt;/span>, um dos programas mais inteligentes dos ultimos tempos: um reality show sobre cinema e o vencedor ganhou um contrato com a Dreamworks e foi trabalhar com o Steven Spielberg (entretanto não foi o Zach que ganhou)!&lt;br />&lt;br />Quem não gostaria de fazer isso no seu proprio ambiente de trabalho?&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/PdSvYGIuiUw">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/PdSvYGIuiUw" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />Link &lt;a href="http://www.youtube.com/watch?v=PdSvYGIuiUw">aqui&lt;/a>.&lt;/div></description></item><item><title>Metaprogramação com awk e sed</title><link>http://pacman.blog.br/blog/2007/08/28/metaprogramao/</link><pubDate>Tue, 28 Aug 2007 15:17:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/28/metaprogramao/</guid><description>&lt;div class='post'>
Criar um programa que cria programas é simples nas linguagens interpretadas.&lt;br />&lt;br />Criamos o programa em uma string e executamos via &lt;span style="font-weight:bold;">eval()&lt;/span> ou então gravamos em arquivo e executamos novamente.&lt;br />&lt;br />Me deparei com o seguinte problema: inverter as palavras de uma frase ou arquivo &lt;span style="font-weight:bold;">mantendo&lt;/span> a ordem em que aparecem.&lt;br />&lt;br />É claro que eu pensei em usar o rev, mas ele inverte a linha como um todo. Depois de fazer um laço for muito feio em awk, fiquei pensando em como resolver de forma mais legível.&lt;br />&lt;br />Tive esta ideia: vou fazer uma lista de palavras, inverte-las com o rev e, para cada palavra, vou substitui-la pela palavra invertida. Beleza, o &lt;span style="font-weight:bold;">sed &lt;/span>faz isso com um pé nas costas.&lt;br />&lt;br />Eu tenho um arquivo (poderia ser um &lt;a href="http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo011#Named_Pipes">named pipe&lt;/a>) chamado 'direito' que contem uma lista de palavras sem repetição, com uma palavra por linha. Outro arquivo, com o mesmo conteudo mas revertido via 'rev'.&lt;br />&lt;br />Uso o paste para colocar os arquivo lado a lado e uso o awk para gerar comandos como este:&lt;pre>s/\bpalavra\b/palavra_revertida/g;&lt;/pre>&lt;br />&lt;br />Usei o awk pq a sintaxe fica mais clara, o sed ficou muito poluído. Perceba que eu uso o recurso de &lt;span style="font-weight:bold;">borda&lt;/span> das expressões regulares. Isso me garante que vou trocar uma palavra inteira, e não um pedaço da string.&lt;br /> &lt;br />Agora vem o pulo do gato: mando estes comandos via &lt;span style="font-style:italic;">stdin &lt;/span>para o sed, fazendo uso de um pipe. eu informo para o sed que os comandos virão pela stdin passando a opção -f -&lt;br />&lt;br />Vejam o resultado abaixo, espero que seja útil para alguem :)&lt;br />&lt;br />&lt;pre>&lt;code>$ cat stuff&lt;br />Nosso fórum principal.&lt;br />&lt;br />Problemas com hardware em geral,&lt;br />&lt;br />temperaturas, comparação de desempenho,&lt;br />&lt;br />compatibilidades de componentes, etc.&lt;br />&lt;br />$ LC_ALL=pt_BR grep -oE '\w+' stuff | sort -u | tee direito | rev > reverso&lt;br />&lt;br />$ paste direito reverso | awk '{&lt;br /> printf "s/\\b%s\\b/%s/g;\n",$1,$2 # facil, não?&lt;br /> }' | sed -f - stuff&lt;br />ossoN muróf lapicnirp.&lt;br />&lt;br />samelborP moc erawdrah me lareg,&lt;br />&lt;br />sarutarepmet, oãçarapmoc ed ohnepmesed,&lt;br />&lt;br />sedadilibitapmoc ed setnenopmoc, cte.&lt;/code>&lt;/pre>&lt;br />Como o arquivo possui acentos, precisei setar a variavel &lt;span style="font-weight:bold;">LC_ALL&lt;/span> para &lt;span style="font-weight:bold;">pt_BR&lt;/span>, caso contrario a expressão regular &lt;span style="font-weight:bold;">\w+&lt;/span> não iria casar com todas as palavras.&lt;br />&lt;br />Ps: Julio, que tal chamar isso de "Inversor do Tiago"?&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
O que acontece é o seguinte:&lt;BR/>&lt;BR/>cada vez que vc invoca o comando rev, vc perde tempo com a inicialização do programa e seu término. Eu utilizei o rev apenas uma vez, mas vc executa a cada palavra.&lt;BR/>&lt;BR/>É a mesma diferença de&lt;BR/>&lt;BR/>for i in *.txt ; do rm $i ; done&lt;BR/>&lt;BR/>e rm *.txt&lt;BR/>&lt;BR/>A segunda forma recebe ja todos os parâmetros e só tem o trabalho de iterar internamente sobre esta lista. A primeira forma cria um custoso laço por conta do detalhe que eu ja lhe falei.&lt;BR/>&lt;BR/>Shel é sensacional, porém não pode ser pensado como uma linguagem script sempre, ele é uma forma de interação do usuario com o sistema ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Leandro Santiago&lt;/div>
&lt;div class='content'>
Mas, se você transformar esse for acima numa função, tipo&lt;BR/>InverteFrase()&lt;BR/>{&lt;BR/> local IFS=' ' # tab e espaço&lt;BR/> string=($@)&lt;BR/> for (( i=0; i&lt;=${#string[@]}; i+=1 ))&lt;BR/> {&lt;BR/> echo ${string[$i]} | rev | tr "\n" ' '&lt;BR/> }&lt;BR/>}&lt;BR/>&lt;BR/>Pode utilizar para fazer num arquivo, simplesmente tomando cada linha como uma string independente:&lt;BR/>&lt;BR/>while read LINHA&lt;BR/>do&lt;BR/> InverteFrase $LINHA&lt;BR/> echo ## esse daqui é para quebrar a linha, no final de cada frase&lt;BR/>done &lt; &lt;(cat arquivo_de_texto)&lt;BR/>&lt;BR/>Nossa, esse meu aí demorou 18 segundos num arquivo de textos simples, mas em compensação não precisa escrever em disco. Contra o seu método, que no mesmo arquivo demorou 0.12 segundo... hauhaau&lt;BR/>&lt;BR/>Flw, e foi mal invadir assim o seu blog ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Leandro&lt;/div>
&lt;div class='content'>
Poderia também utilizar vetores, num forzão bem cabuloso.&lt;BR/>Exemplo:&lt;BR/>$ read string&lt;BR/>o rato roeu a roupa do rei de roma&lt;BR/>$ string=($string)&lt;BR/>$ for (( i=0; i&lt;=${#string[@]}; i+=1 ))&lt;BR/>> {&lt;BR/>> echo ${string[$i]} | rev | tr "\n" ' '&lt;BR/>> }&lt;BR/>o otar ueor a apuor od ier ed amor&lt;BR/>&lt;BR/>Mas só funciona com uma só string... rsrs. Só é muito lento, pois o rev, que troca palavra por palavra, é executado muuitas vezes, quebrando a linha, o que me obriga a utilizar um tr para substituir as quebras por espaço... Fica muito lento... (mas funciona para uma string ;-))&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ola NetWalker,&lt;BR/>&lt;BR/>Pois bem, o sed pode parecer dispendioso, porém em alguns casos a perda de desempenho é imperceptível. Sem falar que a sintaxe dele é mais clara (99% dos casos eu uso a opção de busca e substituição).&lt;BR/>&lt;BR/>Mas perceba que o sed pode ser usado de forma mais otimizada, como o caso de imprimir apenas a linha 105 de um grande arquivo:&lt;BR/>&lt;BR/>sed -n '105q;d' arquivo&lt;BR/>&lt;BR/>sed + awk são uma dupla muito interessante ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Cá denovo. :)&lt;BR/>Depois de achar um exemplo teu de inversor em sed pela net (assustador lol), lhe pergunto: que faz/fez tanto com sed?? :D&lt;BR/>Outra questão q intriga fora o uso real desse inversor (http://www.alltooflat.com/geeky/elgoog/ ?? weird heheh); é se já fez alguma avaliação sobre a performance do sed em relação ao awk, ou mesmo tarefas q possam ser substituídas por grep, cut, expansões e afins.&lt;BR/>Pois em alguns casos sed me pareceu meio dispendioso. Porém não conheço sed a fundo para saber sobre o quanto os comandos estavam otimizados.&lt;BR/>E adiantando, muito boa essa indicação do "On The Lot". Não conhecia. :) Ótimos posts como sempre.&lt;BR/>Então é isso.&lt;BR/>Farewell.&lt;BR/>&lt;BR/>NetWalker&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>match&lt;/div>
&lt;div class='content'>
bem legaw, olha, estou usando o tput e para me familiarizar com ele resolvi fazer algo pratico brincando com ele e fazendo a "Screen Matrix" em shel, consiste em usar colunas fixas no tput com linhas aleatorias pra gerar akela chuva verde de caracters do Matrix Movie, saiu meio bagunçado e n tive tempo ainda de por uma ordem, talvez vc esteja interessando em ajudar o codigo estah em: http://crimeboy.110mb.com/neo.sh&lt;BR/>[]z&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Extended Globbing</title><link>http://pacman.blog.br/blog/2007/08/28/extended-globbing/</link><pubDate>Tue, 28 Aug 2007 15:15:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/28/extended-globbing/</guid><description>&lt;div class='post'>
Não sei se é conhecimento de todos mas o Bash possui, alem do globbing normal (a expansão * ? e [a-z] de nomes de arquivos e diretórios), um globbing extendido.&lt;br />&lt;br />Acho que, em alguns casos, podera ser BEM util, eliminando um pipe para um grep por exemplo.&lt;br />&lt;br />São eles (direto do man)&lt;br />&lt;pre>?(pattern-list)&lt;br /> Matches zero or one occurrence of the given patterns&lt;br />*(pattern-list)&lt;br /> Matches zero or more occurrences of the given patterns&lt;br />+(pattern-list)&lt;br /> Matches one or more occurrences of the given patterns&lt;br />@(pattern-list)&lt;br /> Matches exactly one of the given patterns&lt;br />!(pattern-list)&lt;br /> Matches anything except one of the given patterns&lt;/pre>&lt;br />Para poder utiliza-lo precisa executar o shopt conforme o exemplo abaixo&lt;br />&lt;br />&lt;pre>&lt;code>$ shopt -s extglob&lt;br />&lt;br />$ ls&lt;br />file filename filenamename fileutils&lt;br />&lt;br />$ ls file?(name) # padrão pode aparecer 0 a 1 vezes&lt;br /> &lt;br />file filename&lt;br />&lt;br />$ ls file*(name) # padrão pode aparecer 0 a N vezes&lt;br />file filename filenamename&lt;br />&lt;br />$ ls file+(name) # padrão pode aparecer 1 a N vezes&lt;br />filename filenamename&lt;br />&lt;br />$ ls file@(name) # padrão deve aparecer 1 unica vez&lt;br />filename&lt;br />&lt;br />$ ls file!(name) # divertido esse! padrão NÃO deve aparecer&lt;br />file filenamename fileutils&lt;br />&lt;br />$ ls file+(name|utils) # cada padrão pode aparecer 1 a N vezes&lt;br />filename filenamename fileutils&lt;br />&lt;br />$ ls file@(name|utils) # "lembra" um file{name,utils} ;-)&lt;br />filename fileutils&lt;/code>&lt;/pre>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Para um administrador é interessante saber as opções huponexit e restricted_shell -- e depois dizem que o shell é complicado.&lt;BR/>&lt;BR/>Po é cada coisa util que tem :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Hail again Peczenyj. :)&lt;BR/>Esse recurso extended globbing realmente é uma mão-na-roda. Isso sem falar em outros built-in do shell acessíveis pelo shopt. Lembrei de um comum q alguns odeiam, e tem quem goste: o cdspell; e mesmo o cmdhist.&lt;BR/>No mais vale lembrar, pra quem visita, o óbvio desses globbings, q é um globbing poder "englobbar" outro. :P&lt;BR/>Assim sendo: ls file!(+(name))&lt;BR/>Eliminando qualquer ocorrência de name.&lt;BR/>Até +.&lt;BR/>&lt;BR/>NetWalker&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>JEDI - Java Education and Development Initiative</title><link>http://pacman.blog.br/blog/2007/08/18/jedi-java-education-and-development/</link><pubDate>Sat, 18 Aug 2007 15:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/18/jedi-java-education-and-development/</guid><description>&lt;div class='post'>
&lt;span style="font-weight:bold;">JEDI e o ensino de Java gratuito&lt;/span>&lt;br />&lt;br />Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystems, nasce através do Java Research &amp; Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.&lt;br />&lt;br />A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.&lt;br />&lt;br />Tecnologia Java&lt;br />&lt;br />A tecnologia Java está presente, hoje, em 2 bilhões de dispositivos tecnológicos em todo o planeta - e também fora dele, já que podemos localizar dispositivos Java rodando até em Marte. Existem hoje, no mundo, cerca de 579 milhões de celulares com Java, 93 operadoras de telefonia móvel, 750 milhões de cartões SmartCard (do tipo JavaCard) distribuídos, 650 milhões de computadores pessoais e com 2 milhões de cópias da plataforma empresarial J2EE. Por isto, 68% das novas aplicações, hoje, são desenvolvidas em Java, que substituiu o C++ como a competência mais procurada pelos profissionais. É executado em múltiplas plataformas e em uma ampla gama de dispositivos, indo de um pequeno chip em SmartCards aos servidores dos Grandes Data Centers.&lt;br />&lt;br />Demanda por Profissionais&lt;br />&lt;br />Com tudo isso, existe hoje, uma demanda por 2 milhões de novos profissionais de TI a cada ano. Desenvolvedores Java, devem prover soluções nas mais diversas áreas de tecnologia. Torna-se crescente a necessidade, por exemplo, do desenvolvimento de soluções para aparelhos celulares que demandam uma integração com sistemas legados, de maneira a fornecer soluções corporativas. A partir disto, o conhecimento de Java e de sistemas abertos, são imprescindíveis para profissionais de TI.&lt;br />&lt;br />Além da demanda, a tendência é um outro fator motivador para este mercado. No Brasil, esta aponta para direção de trabalhos realizados para clientes de fora do país - o outsourced. É crescente a procura por parte das organizações, o desenvolvimento de projetos baseados em tecnologia Java, distribuindo-se as aplicações desenvolvidas aqui pela Internet.&lt;br />&lt;br />Todavia, a busca do mercado por esse perfil de profissional vai de encontro com a capacidade de fornecimento do conhecimento Java. O fato é que, o mercado tem dificuldade em encontrar desenvolvedores com competência nos fundamentos de Tecnologia da Informação, orientação a objetos, conhecimento e experiência em Java avançado, competência em comunicação e nas relações interpessoais.&lt;br />&lt;br />A industria de software supre o despreparo dos profissionais formados pelo mercado, com a necessidade de re-treinamento interno dos novos contratados, muitos graduados sem conhecimento em TI. A grande maioria não tem uma certificação, que tem um valor adicional no mercado, especialmente para trabalhos executados fora do pais. Outro fator que colabora para o despreparo do profissional é fato do treinamento oficial Java da Sun ser relativamente caro e os programas de treinamento interno das empresas atuais serem pouco abrangentes. Disso resulta uma contratação de apenas 5% dos currículos recebidos nas empresas.&lt;br />&lt;br />Academicamente o treinamento é, muitas vezes gratuito e de boa qualidade, é acessível. Contrastando, os professores não possuem experiência prática das demandas da indústria e não há, por parte de centros acadêmicos, a compreensão com respeito ás preocupações da industria de software, que não conseguem cobrir as necessidades que o mercado exige. Aliado a isso, está a dificuldade de alterar os currículos acadêmicos.&lt;br />&lt;br />E o JEDI ?&lt;br />&lt;br />O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais, slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas. Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.&lt;br />&lt;br />Na Filipinas já existe uma estrutura acadêmica dividida em fases. Na primeira fase foram disponibilizados os cursos de Introdução a programação I (versão 1.3); Introdução a Programação II (versão 1.1) e Estruturas de Dados (versão1.1). Na segunda fase os cursos de Engenharia de software (versão 1.0); Desenvolvimento de aplicações móveis (versão 1.0); Programação Web (versão 1.0). Na terceira fase, os cursos de Web Services; Segurança em Java e Programação, modelagem e análise orientada à objetos. Completando quatro semestres de curso com: Sistemas operacionais; Gerenciamento de projetos orientados à objetos e Inteligência artificial. Todo este material está atualmente disponível para download, em Inglês, no site Java.net.&lt;br />&lt;br />A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas através de JP Petines (Java champion), no Brasil através de Daniel deOliveira (Java champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.&lt;br />&lt;br />Hoje o JEDI concentra o maior número de membros nas Filipinas. Desde fevereiro de 2005 até abril de 2006 são 110 escolas - 10% de todas as universidades e faculdades das Filipinas aderentes ao programa; Foram realizados 13 treinamentos e formados 207 instrutores multiplicadores, que formaram 1.318 instrutores que atendem a 48.205 estudantes.&lt;br />&lt;br />Países de Língua Portuguesa&lt;br />&lt;br />O Brasília Java Users Group - DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Angola, Cabo Verde, Guiné-Bissau, Brasil, Moçambique, Portugal, São Tomé e Príncipe; Timor Leste serão países que poderão fazer o treinamento em língua nativa, com todos os recursos que a iniciativa provê. O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que fornece ao grupo apoio logístico, administrativo e jurídico.&lt;br />&lt;br />Atualmente, o Brasil conta, segundo a SUN Microsystems, com 70 mil desenvolvedores Java e 43 grupos de usuários Java, com mais de 25 mil membros participantes. É através do apoio destes grupos distribuídos em todos os estados da nação que esta iniciativa espera se consolidar, para elevar o nível de aprendizado Java, provendo melhores profissionais para atender as exigências do mercado mundial.&lt;br />&lt;br />Como participar do JEDI ?&lt;br />&lt;br />No momento estamos trabalhando na tradução e adaptação do material utilizado na Filipinas. Um vez que este esteja concluído, os cursos poderão ser acessados pelo site. Ao concluir o processo cada aluno terá que fazer uma prova presencial para obter a sua certificação, que será oferecida agentes que serão certificados em todo Brasil.&lt;br />&lt;br />O DFJUG necessita de pessoas para corrigir e dar opiniões sobre todo o material produzido e realizar testes de Stress no site aonde o JEDI será hospedado, isso é um trabalho que somente poderá ser realizado com o apoio de toda a comunidade javanesa existente no Brasil. Quem quiser participar da iniciativa, no Brasil, deve acessar a página do DFJUG (www.dfjug.org) e entrar em contato com o grupo. Junte-se a nós, participe no instrutor ou como aluno desta iniciativa, poderemos assim enriquecer o conhecimento da linguagem e difundi-la de uma forma totalmente gratuita, voluntária e colaborativa, no Brasil e em diversos paises de língua portuguesa, será seu trabalho e seu empenho que ajudará elevar o Brasil ao hall dos melhores desenvolvedores JAVA no mundo.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Eduardo Bregaida&lt;/div>
&lt;div class='content'>
Me manda um e-mail ou MP no GUJ e fala tbm com o WilliamSilva do GUJ tbm q vc entra rapidinho =)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Eduardo Bregaida&lt;/div>
&lt;div class='content'>
Boa, está também envolvido no JEDI?&lt;BR/>&lt;BR/>[]s&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Israel&lt;/div>
&lt;div class='content'>
Putz cara... vou confessar que só caiu a ficha agora no lance do "nuts" UHAUHAUHAUHUA :D&lt;BR/>&lt;BR/>Vou te colocar no blogroll. Abraços!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Israel&lt;/div>
&lt;div class='content'>
Nunca viu Jericho? Não sabe o que tá perdendo hehehe :)&lt;BR/>&lt;BR/>A propósito, bem legal o teu blog. Gostei muito dos posts. Parabéns.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>I Jornada em Defesa do Pensamento Científico</title><link>http://pacman.blog.br/blog/2007/08/16/i-jornada-em-defesa-do-pensamento/</link><pubDate>Thu, 16 Aug 2007 13:47:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/16/i-jornada-em-defesa-do-pensamento/</guid><description>&lt;div class='post'>
A disciplina de Metodologia Científica do curso de Geociências e&lt;br />Educação Ambiental do Instituto de Geociências da USP e a &lt;a href="http://www.ceticos.org/">Sociedade&lt;br />Brasileira de Céticos e Racionalistas&lt;/a> realizarão a I Jornada em Defesa&lt;br />do Pensamento Científico.&lt;br />&lt;br />Abaixo mais detalhes e a programação:&lt;br />—————&lt;br />Data: 18 de setembro (terça-feira)&lt;br />Local: IGc/USP - R. do Lago, 562 - Cid. Universitária - Butantã - São&lt;br />Paulo - SP&lt;br />&lt;br />Programação:&lt;br />09h10 a 09h30: Abertura Prof. Drs. Arlei Benedito Macedo (USP) e&lt;br />Renato Sabbatini (Unicamp).&lt;br />09h40 a 10h20: Analfabetismo científico, Prof. Dr. Renato Sabbatini&lt;br />(Unicamp).&lt;br />10h20 a 10h40: Café.&lt;br />10h40 a 11h20: Criacionismo, Prof. Dr. Mário de Pinna (USP).&lt;br />11h30 a 12h10: Como vender o pensamento não-científico, Prof. Dr.&lt;br />Francisco Stefano Wechsler (UNESP)&lt;br />12h10 a 14h00: Almoço.&lt;br />14h00 a 14h40: Sensacionalismo e Jornalismo Científico, - Ulisses&lt;br />Capozzoli - Astronomy Brasil).&lt;br />14h50 a 15h30: Pensamento Crítico - Panorama da América Latina - Sr.&lt;br />Alejandro J. Borgo (Pensar - CFI/Argentina)&lt;br />15h30 a 15h50: Café&lt;br />15h50 a 16h30: A defesa do pensamento científico nas universidades e&lt;br />centros de pesquisa (mesa-redonda).&lt;br />16h40 a 17h10: Resultados preliminares da pesquisa sobre&lt;br />Pseudociências (alunos do LIGEA)&lt;br />19h00 a 19h40: Ilusões e equívocos do pensamento humano, - Dr. Sérgio&lt;br />Navega - (Intelliwise Research and Training).&lt;br />19h40 a 20h00: Sumário e encerramento, - Prof. Dr. Francisco Stefano&lt;br />Wechsler - UNESP).&lt;br />&lt;br />Taxa de inscrição: R$ 60,00&lt;br />Mais informações: palestrasreflexoes2007@gmail.com&lt;/div></description></item><item><title>Implementando um Corretor Ortográfico</title><link>http://pacman.blog.br/blog/2007/08/11/implementando-um-corretor-ortogrfico/</link><pubDate>Sat, 11 Aug 2007 23:56:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/11/implementando-um-corretor-ortogrfico/</guid><description>&lt;div class='post'>
O maluco do &lt;a href="http://norvig.com/">Peter Norvig&lt;/a> (google) publicou no seu site o artigo &lt;a href="http://norvig.com/spell-correct.html">How to Write a Spelling Corrector&lt;/a>. Impressionante o que 21 linhas de Python são capazes de fazer!&lt;br />&lt;br />&lt;pre>&lt;code>>>> correct('speling')&lt;br />'spelling'&lt;br />>>> correct('korrecter')&lt;br />'corrector'&lt;/code>&lt;/pre>&lt;br />&lt;br />Não é atoa que o Google é o que é hoje em dia.&lt;/div></description></item><item><title>Linux para Leigos</title><link>http://pacman.blog.br/blog/2007/08/11/linux-para-leigos/</link><pubDate>Sat, 11 Aug 2007 10:45:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/11/linux-para-leigos/</guid><description>&lt;div class='post'>
Vamos analisar a condição de &lt;span style="font-style:italic;">leigo&lt;/span>.&lt;br />&lt;br />Eu já vi centenas de &lt;span style="font-style:italic;">leigos&lt;/span> que, ao sentar no computador, baixavam músicas, videos e jogos com os mais diversos programas, conectavam no irc, msn, icq, colocavam luzinhas e bichinhos animados para acompanhar o cursor do mouse, trocavam as fontes e os temas, procuravam os mais bizarros jogos, encontravam videos extremamente incomuns (&lt;span style="font-weight:bold;">sem &lt;/span>youtube), etc. Para o que &lt;span style="font-weight:bold;">não presta&lt;/span>, os &lt;span style="font-style:italic;">leigos &lt;/span>tem uma criatividade impressionante!&lt;br />&lt;br />Quando falamos em um sistema pra leigos não precisamos pensar que as usuarios tem preguiça mental. Eles até podem ter, mas aí cabe aos projetistas desafiar e exercitar essa criatividade do mal e tranformar em criatividade do bem. Qualquer pessoa que senta na frente de um browser vai acabar nas paginas mais escabrosas mesmo que não sabia o que é 'google'. Vai me dizer que, nesse caso, a linha de comando é ameaçadora ou difícil?&lt;br />&lt;br />Das duas, uma: ou pensamos em uma camada de software para permitir que um usuario &lt;span style="font-weight:bold;">abstraia&lt;/span> o sistema operacional e as configurações (normalmente se faz isso em sistemas "embarcados") e use todos os recursos multimídia e de troca de informação com a facilidade de um pensamento &lt;span style="font-weight:bold;">OU&lt;/span> pensamos em sistemas mais inteligentes, com documentação adequada e, com a ajuda da comunidade, divulgamos as informações e conceitos corretos. O Linux só é seguro porque o usuario comum, que &lt;span style="font-weight:bold;">vai&lt;/span> fazer besteira, não tem a senha de &lt;span style="font-weight:bold;">root&lt;/span>.&lt;br />&lt;br />Não podemos fazer sistemas operacionais à prova de gente sem noção ou que sejam capazes de oferecer tanta intuitividade sem sacrificar a segurança, por exemplo.&lt;br />&lt;br />Puxa, não tem nada mais fácil que usar a linha de comando (ok, sou suspeito pra falar). As pessoas não usam [o shell] pois não tem como acessar o orkut, ver vídeo do youtube, etc, de um jeito bonitinho. Alem de tudo, tá em inglês, ECA. Hoje em dia existem shells para pessoas iniciantes que ajudam, colorem o texto e sugerem mudanças praticas, como o &lt;a href="http://nacaolivre.org/2007/07/12/friendly-interactive-shell-%e2%80%93-shell-interativo-e-amigavel/">fish&lt;/a>.&lt;br />&lt;br />É assim que fazemos um sistema pra &lt;span style="font-style:italic;">leigos &lt;/span>-- temos que desafia-los a usar a criatividade que normalmente é usada pra criatividade do MAL e mostrar que um PC com linux não é um playstation. Quer usar um browser de verdade e usar o orkut e o youtube? PO! não tem nada mais facil que instalar um ubuntu da vida e clicar no icone do firefox!&lt;br />&lt;br />Não vamos tomar atitudes de forma a não desafiar intelectualmente os usuários. Eles merecem todo o nosso respeito. Agora quem quer que o usuário não pense que faça uma camada de software que abstraia o Sistema Operacional. Existe mercado para ambas as coisas.&lt;br />&lt;br />Entretanto acho mais humano que a gente exercite os cérebros atrofiados dos empurradores de mouse. Há 20 anos as pessoas usavam computadores com 32 kb de RAM e carregavam os jogos de uma fita K7 e ninguem morreu por isso -- pelo contrário desenvolveram &lt;span style="font-style:italic;">skills &lt;/span>hoje necessárias em muitos cargos importantes e empresas como algumas multinacionais procuram desesperadamente.&lt;/div></description></item><item><title>Torvalds - A Microsoft simplesmente não me interessa</title><link>http://pacman.blog.br/blog/2007/08/10/linus-torvalds-microsoft-simplesmente/</link><pubDate>Fri, 10 Aug 2007 00:53:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/10/linus-torvalds-microsoft-simplesmente/</guid><description>&lt;div class='post'>
&lt;blockquote>&lt;br />&lt;span style="font-weight:bold;">Será que Linus Torvalds e a comunidade do software livre podem vencer esta guerra contra as legiões de Bill Gates&lt;/span>?&lt;br />&lt;br />Linus Torvalds - Não vejo isso como uma “batalha”. Faço o que faço porque gosto e acho que vale à pena, e não estou nessa por causa de nenhuma cruzada anti-Microsoft. Usei alguns produtos da Microsoft ao longo dos anos, mas nunca nutri uma forte antipatia contra eles. A Microsoft simplesmente não me interessa. E o movimento de código aberto não é um movimento anti-Microsoft, apesar de haver certos grupos que talvez participem devido aos seus sentimentos anti-Microsoft.&lt;br />&lt;br />O código aberto é um modelo sobre como fazer coisas, e eu acredito que este é um jeito muito melhor de fazer as coisas. O código livre vai tomar conta do mercado não por causa de nenhuma “batalha”, mas simplesmente porque jeitos melhores de fazer as coisas eventualmente tomam o lugar de métodos inferiores.&lt;br />&lt;br />Por acaso a “ciência” é uma batalha contra a “ignorância”? Não, a ciência simplesmente é. E ela funciona tão bem que assume o lugar de velhas noções ignorantes. Não precisamos nos preocupar com gatos pretos cruzando a nossa frente, passar por baixo de escadas ou espelhos quebrados, pois hoje sabemos como o mundo funciona, e nos demos conta de que gatos pretos não são mais um sinal de perigo.&lt;/blockquote>&lt;br />Fonte: &lt;a href="http://idgnow.uol.com.br/mercado/2007/08/09/idgnoticia.2007-07-18.5493239809/paginador/pagina_6">idgnow&lt;/a>&lt;br />&lt;br />Sem mais palavras...&lt;/div></description></item><item><title>Google Wars</title><link>http://pacman.blog.br/blog/2007/08/07/google-wars/</link><pubDate>Tue, 07 Aug 2007 18:43:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/07/google-wars/</guid><description>&lt;div class='post'>
Inutilidade Pública: veja o que/quem possui mais resultados no google?&lt;br />&lt;br />&lt;pre>&lt;code>./GoogleWars.sh superman batman&lt;br />&lt;span style="color:red;">batman 48500000&lt;/span>&lt;br />superman 33700000&lt;br />&lt;br />./GoogleWars.sh gremio inter&lt;br />&lt;span style="color:red;">inter 213000000&lt;/span>&lt;br />gremio 5560000&lt;br />&lt;br />./GoogleWars.sh hp ibm&lt;br />&lt;span style="color:red;">hp 379000000&lt;/span>&lt;br />ibm 147000000&lt;br />&lt;br />./GoogleWars.sh cobol java fortran perl ruby lisp haskell&lt;br />&lt;span style="color:red;">java 272000000&lt;/span>&lt;br />perl 103000000&lt;br />ruby 101000000&lt;br />lisp 21400000&lt;br />fortran 17400000&lt;br />haskell 15400000&lt;br />cobol 10900000&lt;/code>&lt;/pre>&lt;br />O script é simples, abusando um pouco do SED e do AWK, com um toque de SORT ;-)&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />COR=`echo -ne '\e[31;1m'`&lt;br />END=`echo -ne '\e[m'`&lt;br />CORSED="1s/.*/${COR}&amp;${END}/"&lt;br />GOOGLE='http://www.google.com/search'&lt;br />&lt;br />[[ $2 ]] || { echo "usage: $0 item item2 [ ... item n]" ; exit 0 ; }&lt;br />&lt;br />SEDCMD='/did not match any documents/{s/.*/0/g;p;q}&lt;br /> /Results/{s/.* about[ ]\+\([0-9,.]\+\).*/\1\n/;p;q}'&lt;br />AWKCMD='{ result[$1]=$2 ; x = length($1) ; if(x > max) max=x }&lt;br /> END{ for(i in result) printf "%-"max"s\t%s\n",i,result[i]}'&lt;br />&lt;br />for i in "$@" ; do echo -ne "${i}\t" &lt;br /> lynx -dump "${GOOGLE}?q=${i}" | tr -d '\n.,' | sed -n "${SEDCMD}" &lt;br />done | awk -F '\t' "${AWKCMD}" | sort -nr -t $'\t' -k 2 | sed "${CORSED}"&lt;/pre>&lt;/code>&lt;br />&lt;br />Quem quiser melhora-lo, sinta-se à vontade :)&lt;br />&lt;br />Edit: ja lancei uma versão .02 com umas correções cosméticas &lt;a href="http://pastebin.com/f2459820a">aqui&lt;/a> -- não resisti...&lt;/div></description></item><item><title>Considerações de Segurança</title><link>http://pacman.blog.br/blog/2007/08/06/consideraes-de-segurana/</link><pubDate>Mon, 06 Aug 2007 14:21:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/06/consideraes-de-segurana/</guid><description>&lt;div class='post'>
Me irrita profundamente usar um script que pressupõe certas definições no meu ambiente sem aviso prévio. O caso mais comum é, em algum *nix, acreditar que o diretório corrente faz parte do PATH -- contrariando uma regra básica de segurança, inclusive.&lt;br />&lt;br />Não é dificil fazer ./&lt;span style="font-style:italic;">programa&lt;/span> (na verdade com o tempo isso vira padrão até). Fica uma dica importante: nunca façam suposições a respeito do ambiente, variaveis, estruturas de diretórios sem documentar ou fazer os testes necessários (pelo menos quando for fora de algum &lt;span style="font-style:italic;">padrão&lt;/span>).&lt;/div></description></item><item><title>Nightwish - Wishmaster Versão Alternativa</title><link>http://pacman.blog.br/blog/2007/08/03/nightwish-wishmaster-verso-alternativa/</link><pubDate>Fri, 03 Aug 2007 20:23:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/03/nightwish-wishmaster-verso-alternativa/</guid><description>&lt;div class='post'>
Sensacional esta 'versão':&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/q-K8x4x4i68">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/q-K8x4x4i68" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />Hamster - Apprendice - HeartBurn - Seven Seagals - Mario - this Apple - in me - Jewish Master !&lt;br />&lt;br />Se não conseguiu visualizar clique &lt;a href="http://www.youtube.com/v/q-K8x4x4i68">aqui&lt;/a>.&lt;/div></description></item><item><title>Caçadores da Classe Perdida</title><link>http://pacman.blog.br/blog/2007/08/03/caadores-da-classe-perdida/</link><pubDate>Fri, 03 Aug 2007 16:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/03/caadores-da-classe-perdida/</guid><description>&lt;div class='post'>
Eu já tinha feito algo parecido mas este &lt;a href="http://www.claudius.com.br/blog/claudio/2007/07/29/Como-encontrar-uma-classe">post&lt;/a> do Claudio Miranda reavivou a minha memória.&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />[[ $2 ]] || { echo "Uso: ${0} diretorio classe" ; exit 1 ; }&lt;br />find "${1}" -name \*.jar -print | xargs -n 1 unzip -l 2>&amp;- | awk -v class="${2}" '&lt;br /> BEGIN { IGNORECASE=1 }&lt;br /> /^Archive/ { file="\nArquivo:\n\t"$NF": \nClasses:\n\t" }&lt;br /> /class$/ &amp;&amp; $NF ~ class { print file,$NF ; file="\t"; total++ }&lt;br /> END { print "\nTotal",total + 0,"classes encontradas!" }'&lt;/code>&lt;/pre>&lt;br />&lt;br />Informando como parâmetros um diretório de partida e um fragmento do nome da classe, o find localizará todos os arquivos com extensão jar e vai mandar pro nosso amigo xargs. Este envia um a um para o unzip que lista (-l) o conteúdo de cada arquivo. Eu poderia procurar a classe que eu quero com o grep, mas o awk foi a escolha para formatar melhor a saída de dados.&lt;br />&lt;br />Perceba que a variavel IGNORECASE tem valor diferente de 0, assim eu posso procurar por um trecho do tipo xml ou XML. Eu preciso saber o nome do arquivo 'corrente' e isso é informado pela linha que começa com 'Archive'. Quando eu encontro uma linha que termina com 'class' e o ultimo campo ( $NF ) 'casa' com o fragmento de nome (alias pode ser uma expressão regular!) eu imprimo esta linha.&lt;br />&lt;br />Eu fiz uma sacanagem pra saída de dados ficar 'bonitinha', que é imprimir o 'cabeçalho' apenas uma vez, depois eu troco por tab (\t) -- e no final eu mostro um sumário com o número de referências encontradas.&lt;br />&lt;br />Este script pode ser modificado para outros propósitos. Note que eu procuro tanto no nome da classe quando no nome dos pacotes (diretórios), assim xml poderia casar com XMLHelper.class ou /java/xml/foobar.jar -- mas basta ser criativo para resolver isso!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
AWK é extremamente versátil!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Claudio Miranda&lt;/div>
&lt;div class='content'>
Olá Tiago, obrigado pela dica-dica e manter a formatação de saída. Vou aprender um pouco mais de AWK.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Powders Graduation</title><link>http://pacman.blog.br/blog/2007/08/02/powders-graduation/</link><pubDate>Thu, 02 Aug 2007 16:31:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/02/powders-graduation/</guid><description>&lt;div class='post'>
Os programas de tradução estão cada vez melhores.&lt;br />&lt;br />Pós Graduação = Powders Graduation&lt;br />&lt;br />Graduação em Pó? Pulverizada?&lt;br />&lt;br />São 22 resultados no &lt;a href="http://www.google.com/search?q=%22powders+graduation%22">google &lt;/a>até o momento!&lt;/div></description></item><item><title>Usando o curl com Endereços IPv6</title><link>http://pacman.blog.br/blog/2007/08/02/usando-o-curl-com-endereos-ipv6/</link><pubDate>Thu, 02 Aug 2007 13:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/02/usando-o-curl-com-endereos-ipv6/</guid><description>&lt;div class='post'>
Hoje em dia usar endereçamento &lt;a href="http://pt.wikipedia.org/wiki/IPv6">IPv6&lt;/a> parece um pouco exótico, porém aos poucos ele começa a aparecer em algumas redes internas e logo será a unica saída quando todos os 32 bits do IPv4 estiverem em uso, previsto para 2012.&lt;br /> &lt;br />Diga adeus ao "206.45.32.234" - longa vida ao "2001:bce4:5641:3412:341:45ae:fe32:65". Perceba como agora utilizamos a representação hexadecimal e cada quarteto é separado por um ':' -- o que torna mais fácil a sua memorização (e viva o DNS). Um bom artigo introdutório pode ser lido &lt;a href="http://www.guiadohardware.net/artigos/entendendo-ipv6/">aqui&lt;/a>.&lt;br />&lt;br />Pois bem, imagine agora que precisamos acessar uma pagina em um servidor (por enquanto interno) através de um endereço IPv6. A url ficaria assim, por exemplo:&lt;br />&lt;br />&lt;pre>&lt;code>http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php&lt;/code>&lt;/pre>&lt;br />&lt;br />Como o caracter ':' é usado em uma url para separar o servidor da porta (é claro que isso é omitido na maioria dos casos, quando usamos a porta 80), e tiveram que proteger o ip entre [colchetes]. Um browser como o Firefox consegue entender esta url facilmente, entretanto não tive a mesma sorte ao usar os browsers modo texto mais comuns - lynx e o curl. &lt;br />&lt;br />Não subestime a importância destes browsers! Muitas vezes nos encontramos em um sistema com poucos recursos ou precisamos efetuar certas ações via algum script e eles caem como uma luva -- principalmente o curl, que simplesmente transfere informações de/para um servidor web, fazendo GET, POST, HEAD, upload de arquivos, etc. &lt;br />&lt;br />No man do curl descobri que o mesmo depende da libcurl ser capaz de resolver endereços ipv6 - inclusive posso forçar a usar apenas ipv6 com a opção -6.&lt;br />&lt;br />Entretanto o curl tem outra interpretação dos colchetes em uma url -- elas são um recurso de sequência para multiplos downloads (da mesma forma como o bash faz, porém é interno ao curl), como nesse exemplo:&lt;br />&lt;br />&lt;pre>&lt;code>curl 'http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html'&lt;/code>&lt;/pre>&lt;br />&lt;br />Para desabilitar este "URL globbing parser" basta usar a opção -g, o que nos leva a solução completa:&lt;br />&lt;br />&lt;pre>&lt;code>curl -6g 'http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php'&lt;/code>&lt;/pre>&lt;br />&lt;br />Caso não queria desabilitar o globbing, basta 'escapar' os colchetes usando a contra-barra antes. O curl é um programa extremamente versátil, um verdadeiro canivete suíço na linha de comando, vale a pena estuda-lo em algum tempinho livre.&lt;/div></description></item><item><title>Barbosa</title><link>http://pacman.blog.br/blog/2007/07/26/barbosa/</link><pubDate>Thu, 26 Jul 2007 14:09:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/barbosa/</guid><description>&lt;div class='post'>
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.casacinepoa.com.br/imagens/filmes/250/barbosa.jpg">&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px;" src="http://www.casacinepoa.com.br/imagens/filmes/250/barbosa.jpg" border="0" alt="" />&lt;/a>&lt;span style="font-style:italic;">Trinta e oito anos depois da Copa do Mundo de 1950, um homem volta no tempo a fim de impedir o gol que derrotou o Brasil, destruiu seus sonhos de infância e acabou com a carreira do goleiro Barbosa.&lt;/span>&lt;br />&lt;br />Premiadíssimo curta de Jorge Furtado e Ana Luiza Azevedo, de 1988, unindo ficção científica e futebol de uma forma incrivelmente brasileira. Com Antônio Fagundes e Zé Vitor Castiel.&lt;br />&lt;br />Para saber mais: &lt;a href="http://www.casacinepoa.com.br/port/filmes/barbosa.htm">CASACINEPOA&lt;/a>&lt;br />&lt;br />Assista &lt;a href="http://www.portacurtas.com.br/pop_160.asp?COD=150&amp;Exib=2660">aqui&lt;/a>. Vale a pena!&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 7 - open failed: |</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-7-open/</link><pubDate>Thu, 26 Jul 2007 14:03:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-7-open/</guid><description>&lt;div class='post'>
Imagine um arquivo com algumas linhas duplicadas:&lt;br />&lt;pre>&lt;code>$ cat arquivo&lt;br />permission denied&lt;br />bad interpreter&lt;br />missing separator&lt;br />set correct localle&lt;br />parameter list too long&lt;br />unary operator expected&lt;br />parameter list too long&lt;br />bad interpreter&lt;/code>&lt;/pre>&lt;br />&lt;br />Obter as linhas distintas pode ser feito com a ajuda do sort + uniq&lt;br />&lt;br />&lt;pre>&lt;code>$ cat arquivo | sort | uniq&lt;br />bad interpreter&lt;br />missing separator&lt;br />parameter list too long&lt;br />permission denied&lt;br />set correct localle&lt;br />unary operator expected&lt;/code>&lt;/pre>&lt;br />&lt;br /> - Puxa! Que ótima combinação! Vamos guarda-la?&lt;br />&lt;br />Bom, podemos querer guardar este e outros comandos em uma variável de ambiente também, afinal, deve funcionar sem maiores problemas, certo?&lt;br />&lt;pre>&lt;code>$ CMD="sort | uniq"&lt;br />$ cat arquivo | $CMD&lt;br />&lt;span style="font-weight:bold;">sort: open failed: |: No such file or directory&lt;/span>&lt;/code>&lt;/pre>&lt;br />&lt;br /> - OPA! Eu sabia, maldito shell, encrenca com tudo!&lt;br /> &lt;br />Tsc... isso acontece porque o pipe | não foi informado como um 'pipe' e sim como a string "|" -- e o sort não conseguiu abrir o arquivo "|".&lt;br />Este tipo de problema pode ser resolvido pelo eval -- ele interpreta novamente as strings na linha de comando.&lt;br />&lt;pre>&lt;code>$ eval "cat arquivo | $CMD"&lt;br />bad interpreter&lt;br />missing separator&lt;br />parameter list too long&lt;br />permission denied&lt;br />set correct localle&lt;br />unary operator expected&lt;/code>&lt;/pre>&lt;br />&lt;br /> - Ah, agora funciona. Mas esse eval ai ficou feio...&lt;br />&lt;br />Então vamos criar um alias para o comando!&lt;br />&lt;pre>&lt;code>$ alias cmd="sort | uniq"&lt;br />$ cat arquivo | cmd&lt;br />bad interpreter&lt;br />missing separator&lt;br />parameter list too long&lt;br />permission denied&lt;br />set correct localle&lt;br />unary operator expected&lt;/code>&lt;/pre>&lt;br />&lt;br />Perceba que o comportamento do alias é diferente de uma variavel de ambiente. Devemos ficar atento à correta interpretação da nossa linha de comando pelo shell corrente, senão vamos ter resultados nem sempre amigáveis.&lt;br />&lt;br />Ah, sim, o cat nesse exemplo é completamente supérfluo, poderia ser assim: 'sort arquivo | uniq' &lt;br />&lt;br /> - E o uniq precisa do sort ? &lt;br /> &lt;br />Sim... sem o sort ele fatalmente vai se perder, e é muito mais facil eliminar linhas repetidas que estejam em sequencia do que aleatórias. É bom dar uma lida no man destes comandos pois possuem opções muito poderosas!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Claro, sort + uniq é um prato cheio! &lt;BR/>&lt;BR/>Uma coisa interessante é nessa dupla é, por exemplo, imprimir apenas as linhas repetidas ou não repetidas de um texto (opções -u ou -d) e, quando a entrada vem ordenada, o resultado é extremamente confiável.&lt;BR/>&lt;BR/>Entretanto não lembro se não existe algum furo no sort -u apenas, vou pesquisar.&lt;BR/>&lt;BR/>Abração!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Alexsander&lt;/div>
&lt;div class='content'>
Olá! muito boas as dicas q tens disponibilizado!&lt;BR/>só uma sugestão:&lt;BR/>"sort -u" também remove duplicidades.&lt;BR/>abraços&lt;BR/>t+&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 6 - unary operator expected</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-6-unary/</link><pubDate>Thu, 26 Jul 2007 13:07:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-6-unary/</guid><description>&lt;div class='post'>
Uma desatenção, muito comum quando trabalhamos com variáveis de ambiente no shell é que, quando elas não foram setadas ainda, o shell expande elas para... nada.&lt;br />&lt;br />&lt;pre>&lt;code>$ [ $XALALA == "oi" ] &amp;&amp; echo 'ok' || echo 'nok'&lt;br />-bash: [: ==: unary operator expected&lt;br />nok&lt;/code>&lt;/pre>&lt;br />&lt;br />Nesse caso o (resultado do) teste da variável até pode fazer sentido, porém troque o == por um != e veja o resultado. A solução é proteger a variável com aspas!&lt;br />&lt;br />&lt;pre>&lt;code>$ [ "$XALALA" != "oi" ] &amp;&amp; echo 'ok' || echo 'nok'&lt;br />ok&lt;/code>&lt;/pre>&lt;br />&lt;br />Simples e rápido!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Bah, não tinha reparado nisso.&lt;BR/>&lt;BR/>E faz sentido, afinal [[ é built-in e [ é, geralmente, um apelido para o comando /bin/test&lt;BR/>&lt;BR/>valeu!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Cláudio&lt;/div>
&lt;div class='content'>
Outra solução: usar [[ ]] ao invés de [ ].&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 5 - The parameter list is too long</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-5-parameter/</link><pubDate>Thu, 26 Jul 2007 12:50:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-5-parameter/</guid><description>&lt;div class='post'>
Essa é raro, mas acontece&lt;br />&lt;br />&lt;code>&lt;pre>$ cd /meu/diretorio&lt;br />$ rm *.dll&lt;br />Error: The parameter list is too long&lt;/pre>&lt;/code>&lt;br />&lt;br /> - O que? Eu não posso apagar todos os meus 3459834574935734957 arquivos?&lt;br />&lt;br />Bom, primeiro vamos analisar o que aconteceu: a linha de comando 'rm *.dll' é expandida pelo shell corrente a 'rm arquivo1.dll arquivo2.dll ... arquivoN.dll' e, nesse caso, esta lista de parâmetros foi demais pro probrezinho do rm. &lt;br />&lt;br />Com o &lt;span style="font-weight:bold;">xargs&lt;/span> é facil de resolver!&lt;br />&lt;code>&lt;pre>$ find /meu/diretorio -name '*.dll' -print | xargs rm&lt;/pre>&lt;/code>&lt;br />&lt;br />O que ele faz? o xargs recebe pela &lt;span style="font-style:italic;">stdin&lt;/span> toda uma lista de parâmetros que será entregue ao programa rm. Se esta lista extender o limite do sistema, então o xargs, inteligentemente, irá executar o rm uma vez, com a lista que for possível e, depois, executar de novo, até que todos os parâmetros sejam lidos. Aliás o xargs possui muitas opções interessantes, vale a pena dar uma estudada nele.&lt;br />&lt;br />E assim todas as dll's são apagadas -- em definitivo, pois com rm 'tr00' não tem undelete ;-)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ah sim, quem limita/expande os coringas é o shell. Acho que escrevi uma frase ambígua -- valeu!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>eljunior&lt;/div>
&lt;div class='content'>
na verdade a lista de parâmetros não foi demais para o `rm', quem limita isso é o próprio shell (tanto é que, num caso desses, nem um ls * funciona...). também não funcionaria somente `xargs rm', se fosse limitação do `rm'; seria necessário limitar a quantidade de parâmetros com a opção -n pro `xargs'. ;-)&lt;BR/>&lt;BR/>nas máquinas que usei, o limite do bash geralmente fora 32768 parâmetros...&lt;BR/>&lt;BR/>falou!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 4 - Corrigindo o localle</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-4/</link><pubDate>Thu, 26 Jul 2007 12:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-4/</guid><description>&lt;div class='post'>
Precisamos estar atento que as variáveis de ambiente de &lt;a href="http://focalinux.cipsga.org.br/guia/avancado/ch-pers.htm">localização &lt;/a>podem atrapalhar, e muito, o comportamento de algumas &lt;a href="http://aurelio.net/er/">expressões regulares&lt;/a>.&lt;br />&lt;br />Por exemplo, se eu quero encontrar uma palavra que começe com a e termine com o (ex: ação)&lt;br />&lt;pre>&lt;code>$ cat arquivo&lt;br />luz, camera, ação&lt;br />$ grep -oE 'a\w+o' arquivo # nao mostra nada!&lt;/code>&lt;/pre>&lt;br />Antes de sair dizendo que o linux, grep ou as expressões regulares não prestam, vamos testar o mesmo comando no nosso 'idioma'&lt;br />&lt;pre>&lt;code>$ LC_ALL=pt_BR grep -oE 'a\w+o' arquivo&lt;br />ação&lt;/code>&lt;/pre>&lt;br />Ahá! Agora vamos ver um exemplo mais interessante:&lt;br />&lt;pre>&lt;code>$ tr '[:lower:]' '[:upper:]' &lt; arquivo&lt;br />LUZ, CAMERA, AçãO&lt;br />$ LC_ALL=pt_BR tr '[:lower:]' '[:upper:]' &lt; arquivo&lt;br />LUZ, CAMERA, AÇÃO&lt;/code>&lt;/pre>&lt;br />Perceberam como a variavel altera o comportamento das ERs? &lt;br />&lt;br />Como ultima dica: sempre que precisarem comparar textos independente da 'caixa' (se maiúscula ou minúscula), usem os recursos de ignorecase da ferramenta utilizada. Converter um texto todo para minúscula pode não apenas ser afetado pela localização como existem idiomas onde alguns caracteres não tem o exato correspondente entre uma caixa e outra como nós pensamos -- é o caso do idioma Turco, onde o 'i' maiúsculo não é 'I'. E, principalmente, não tente fazer &lt;a href="http://worsethanfailure.com/Articles/Extra-Sensitive-Case-Insensitivity.aspx">isso&lt;/a>.&lt;br />&lt;br />Mais informações em 'man locale' ;-)&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 3 - missing separator</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-3-missing/</link><pubDate>Thu, 26 Jul 2007 11:44:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-3-missing/</guid><description>&lt;div class='post'>
O &lt;a href="http://www.gnu.org/software/make/manual/make.html">make &lt;/a>é um comando incrivelmente poderoso, principalmente para programadores, permitindo que tarefas sejam organizadas de acordo com dependências, por exemplo.&lt;br />&lt;br />Um caso básico seria &lt;span style="font-style:italic;">construir &lt;/span>um grande programa, composto de diversos arquivos-fonte. O Makefile permite que vc &lt;span style="font-style:italic;">compile &lt;/span>apenas os arquivos que vc alterou desde o ultimo &lt;span style="font-style:italic;">build&lt;/span>, por exemplo, comparando o &lt;span style="font-style:italic;">timestamp &lt;/span>do fonte com o codigo objeto gerado.&lt;br />&lt;br />Bom, ai um Makefile poderoso foi editado num editor de texto profissional e, na hora de testar, nos deparamos com:&lt;br />&lt;pre>&lt;code>$ make &lt;br />Makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.&lt;br />&lt;br />$ cat Makefile # nome padrão de arquivo para o make.&lt;br /># um makefile comum&lt;br />all:&lt;br /> @echo "oi mundo"&lt;/code>&lt;/pre>&lt;br />&lt;br />Puxa, parece tudo certo... entretanto ai vai um pequeno detalhe: para cada &lt;span style="font-style:italic;">target&lt;/span> do makefile, os comandos que vem a seguir devem começar por um TAB (alias a mensagem de erro é bem clara nesse sentido, certo?). Vamos conferir:&lt;br />&lt;br />&lt;pre>&lt;code>$ cat -A Makefile # é mais pontente que o -v&lt;br /># um makefile comum$&lt;br />all:$&lt;br /> @echo "oi mundo"$&lt;/code>&lt;/pre>&lt;br /> &lt;br />Tcharam! Se a linha do echo iniciasse com um TAB, como deveria ser, apareceria um ^I no inicio da linha. Provavelmente a origem disso é um editor de texto que transforma os TABS em 8 espaços por questões estéticas. Vamos corrigir o Makefile?&lt;br />&lt;br />&lt;pre>&lt;code>$ sed -i 's/^\ \{8\}/\t/' Makefile&lt;br />$ cat -A Makefile&lt;br /># um makefile comum$&lt;br />all:$&lt;br />^I@echo "oi mundo"$&lt;br />$ make&lt;br />oi mundo&lt;/code>&lt;/pre>&lt;br />&lt;br />Pronto, basta substituir os espaços por TAB. Outra solução corrigir em um editor de textos mas sem a opção de expansão dos TABs -- no vim basta fazer&lt;br />&lt;br />&lt;pre>:set noexpandtab&lt;/pre>&lt;br />&lt;br />e editar numa boa.&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 1 - Permission denied</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-1/</link><pubDate>Thu, 26 Jul 2007 11:12:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-1/</guid><description>&lt;div class='post'>
Não é incomum, quando não temos experiência em shell, passar por uma situação dessas:&lt;br />&lt;br />&lt;pre>&lt;code>$ ./script.sh&lt;br />-bash: ./script.sh: Permission denied&lt;/code>&lt;/pre>&lt;br />&lt;br />Antes de sair olhando se há algo errado com o script, vamos analisar a mensagem de erro em pt_BR: &lt;span style="font-weight:bold;">Permissão negada&lt;/span>. Diferente de outros sistemas operacionais, no mundo *nix o que faz de um arquivo um programa executável não é a sua extensão e sim as suas &lt;span style="font-weight:bold;">permissões&lt;/span>.&lt;br />&lt;br />Resumidamente, existem 3 permissões básicas quando se trata de arquivos: ler, escrever e (finalmente) executar (representado pelas letras r,w e x, respectivamente). Isto é o que impede um usuário de conseguir ler os documentos de outro, por exemplo. Então, um programa, para ser executado, precisa ter esta permissão correspondente, e ai entra o comando &lt;a href="http://focalinux.cipsga.org.br/guia/iniciante/ch-perm.htm#s-perm-chmod">chmod&lt;/a>.&lt;br />&lt;br />&lt;pre>&lt;code>$ ls -l script.sh&lt;br />-rw-r--r-- 1 peczenyj users 22 2007-07-26 11:08 script.sh&lt;br />$ chmod +x script.sh # vamos ativar o bit de execução (x)&lt;br />$ ls -l script.sh&lt;br />-rw&lt;span style="font-weight:bold;">x&lt;/span>r-xr-x 1 peczenyj users 22 2007-07-26 11:08 &lt;span style="font-weight:bold;">./script.sh&lt;/span>&lt;br />$ ./script.sh #agora sim!!!&lt;br />oi&lt;/code>&lt;/pre>&lt;br />&lt;br />Problema resolvido.&lt;/div></description></item><item><title>Resolvendo Problemas Comuns 2 - bad interpreter</title><link>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-2-bad/</link><pubDate>Thu, 26 Jul 2007 11:07:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/resolvendo-problemas-comuns-2-bad/</guid><description>&lt;div class='post'>
Seguindo na nossa sessão de dicas, quem nunca passou por isso?&lt;br />&lt;br />&lt;pre>&lt;code>$ ./script.sh&lt;br />: bad interpreter: No such file or directory&lt;br />&lt;br />$ cat script.sh&lt;br />#!/bin/bash&lt;br />echo "oi"&lt;/code>&lt;/pre>&lt;br /> - Hein? Mas está tudo certo, eu tenho um &lt;span style="font-weight:bold;">/bin/bash&lt;/span>, o que está acontecendo?&lt;br />&lt;br />Bom, vamos ver mais de perto:&lt;br />&lt;pre>&lt;code>$ cat -v script.sh # 'show nonprinting'&lt;br />#!/bin/bash^M&lt;br />echo "oi"^M&lt;/code>&lt;/pre>&lt;br />&lt;br />Ahá! Tem um ^M no final das linhas atrapalhando. &lt;br /> - Mas o que é isso?&lt;br />Muito provavelmente a origem desde script é uma maquina windows. A explicação é o caracter &lt;a href="http://en.wikipedia.org/wiki/Newline">newline&lt;/a>. O windows precisa de 2 caracteres para simbolizar o fim de uma linha em um arquivo texto puro, a dupla \r\n (veja link para a wikipedia), porém os *nix não precisam do \r -- que o cat gentilmente mostrou como um ^M. Este caracter a mais atrapalha o interpretador, que não recebe um /bin/bash e sim /bin/bash\r -- e isso realmente não existe.&lt;br />&lt;br />Como resolver? Existem dois programas para este fim: unix2dos e dos2unix (as vezes aparecem como unixtodos e dostounix) que convertem os finais de linha em casos como este. Se vc abrir um arquivo texto do *nix em um bloco de texto vai ver todas as quebras de linha substituidas por um quadrado preto e todas as linhas em uma só.&lt;br />&lt;br />Caso vc não tenha um programa conversor, pode usar o SED&lt;br />&lt;pre>&lt;code>$ sed -i 's/\r$//' script.sh&lt;br />$ ./script.sh&lt;br />oi&lt;/code>&lt;/pre>&lt;br />&lt;br />O tr também poderia ser usado, mas não é tão amigável.&lt;br />&lt;pre>&lt;code>$ tr -d '\r' &lt; script.sh > novo_script.sh&lt;/code>&lt;/pre>&lt;br />&lt;br />Este detalhe pode ser muito importante um dia!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>arpapa&lt;/div>
&lt;div class='content'>
Pode também converter usando o comando dos2unix script.sh que funciona legal.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rioges&lt;/div>
&lt;div class='content'>
Resolveu o meu problema, muito obrigado pela dica!!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tio Maneco</title><link>http://pacman.blog.br/blog/2007/07/26/tio-maneco/</link><pubDate>Thu, 26 Jul 2007 02:26:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/tio-maneco/</guid><description>&lt;div class='post'>
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://contigo.abril.com.br/imagem/cel_flaviomigliaccio1d.gif">&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 73px;" src="http://contigo.abril.com.br/imagem/cel_flaviomigliaccio1d.gif" border="0" alt="" />&lt;/a>Quem se lembra do &lt;a href="http://www.infantv.com.br/maneco.htm">Tio Maneco&lt;/a>?&lt;br />&lt;br />Pois bem, descobri que foi aprovada a captação de recursos para a produção do filme "As aventuras de Reina Caiman em o resgate do Maneco" (RF Cinema e TV Ltda).&lt;br />&lt;br />Pra mim, este é o filme mais esperado de todos os tempos, mal posso esperar para ver o Flávio Migliaccio de novo, em um dos papeis mais legais e inteligentes da tv brasileira -- afinal os filmes são impossiveis de serem achados e a série original foi &lt;span style="font-weight:bold;">apagada&lt;/span> acidentalmente pela tv cultura.&lt;br />&lt;br />(se alguem tiver mais informações, please, me avise!!!)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Sim, o Flávio tava processando a Cultura até. Não sei a quantas anda isso, o que é uma pena pois eu tinha boas lembranças da série.&lt;BR/>&lt;BR/>Nem lembro do nome dos Robos feitos com bules e chaleiras :(&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>panglossa&lt;/div>
&lt;div class='content'>
É verdade que foi tudo perdido? "Apagado acidentalmente"?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Calculando Números Primos usando Shell</title><link>http://pacman.blog.br/blog/2007/07/26/calculando-nmeros-primos-usando-shell/</link><pubDate>Thu, 26 Jul 2007 01:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/calculando-nmeros-primos-usando-shell/</guid><description>&lt;div class='post'>
Será possivel determinar se um número é primo, ou não, usando o bom e velho shell?&lt;br />&lt;br />A resposta está no comando &lt;span style="font-weight:bold;">factor&lt;/span>&lt;br />&lt;br />&lt;pre>&lt;code>seq 1 250 | factor | awk -F \: '$1 == $2{ print $1}' | column -x&lt;br />2 3 5 7 11 13 17 19 23 29&lt;br />31 37 41 43 47 53 59 61 67 71&lt;br />73 79 83 89 97 101 103 107 109 113&lt;br />127 131 137 139 149 151 157 163 167 173&lt;br />179 181 191 193 197 199 211 223 227 229&lt;br />233 239 241&lt;/code>&lt;/pre>&lt;br />&lt;br />A ideia é simples: se um número é primo ele possui apenas um único fator -- ele mesmo. Basta detectar esses casos via awk (ou grep, sed, existem varias formas). Usei aqui o &lt;span style="font-weight:bold;">seq&lt;/span> para gerar uma seqüência e o &lt;span style="font-weight:bold;">column &lt;/span>para tabular os resultados.&lt;/div></description></item><item><title>Identificando linhas repetidas em varios arquivos</title><link>http://pacman.blog.br/blog/2007/07/26/identificando-linhas-repetidas-em/</link><pubDate>Thu, 26 Jul 2007 00:10:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/26/identificando-linhas-repetidas-em/</guid><description>&lt;div class='post'>
Vamos imaginar dois arquivos bem simples e tres formas de identificar as linhas que aparecem em ambos:&lt;br />&lt;br />&lt;pre>&lt;code>$ cat arq1&lt;br />oi&lt;br />awk&lt;br />ciencia&lt;br />oi zoi&lt;br />&lt;br />$ cat arq2&lt;br />luxo&lt;br />awk&lt;br />oi&lt;br />luxo&lt;/code>&lt;/pre>&lt;br />&lt;br />Simples de perceber que as linhas 'oi' e 'awk' se repetem. Poderiamos pensar em uma poderosa união de sort + uniq &lt;br />&lt;pre>&lt;code>$ sort &lt;(sort arq1 | uniq) &lt;(sort arq2 | uniq) | uniq -d&lt;br />awk&lt;br />oi&lt;/code>&lt;/pre>&lt;br />&lt;br />Ou podemos abordar arrays em AWK (elegante, não?)&lt;br />&lt;pre>&lt;code>$ awk 'NR==1{ base=FILENAME } &lt;br />base == FILENAME {linhas[$0]++}&lt;br />base != FILENAME &amp;&amp; linhas[$0] { print }' arq1 arq2&lt;br />awk&lt;br />oi&lt;/code>&lt;/pre>&lt;br />&lt;br />Ou podemos usar o bom e velho grep:&lt;br />&lt;pre>&lt;code>$ grep -xf arq1 arq2&lt;br />awk&lt;br />oi&lt;/code>&lt;/pre>&lt;br />Qual a melhor abordagem? Ai depende de cada um :)&lt;br />&lt;br />Veja toda a aula que deu origem à estes scritps &lt;a href="http://br.groups.yahoo.com/group/shell-script/message/23362">aqui&lt;/a>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Denis, mantive os seus dois comentarios, apesar de serem semelhantes.&lt;BR/>&lt;BR/>Saca só, se pensarmos em 16 milhões de linhas, temos q pensar exatamente no que queremos. se for para encontrar as linhas exatas, talvez o grep seja mais rápido, porém acredito que vai ter muito acesso a disco.&lt;BR/>&lt;BR/>Se separarmos os arquivos em partes, de acordo com os caracteres iniciais, acho que a pesquisa pode ficar bem mais rapida -- se estiverem ordenados então vai q é um tapa.&lt;BR/>&lt;BR/>Ou talvez seja o momento de pensar em algoritmos mais complexos :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Denis&lt;/div>
&lt;div class='content'>
Imagino que para um busca menor de 16milhoes a melhor seria o grep, pois nao utiliza os redirects como no caso do UNIQ.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Denis&lt;/div>
&lt;div class='content'>
Imagino que para um busca menor de 16milhoes a melhor seria o grep, pois nao utiliza os redirects como no caso do SORT. Se nao o AWK.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>As Origens do Caos Aereo Brasileiro</title><link>http://pacman.blog.br/blog/2007/07/18/as-origens-do-caos-aereo-brasileiro/</link><pubDate>Wed, 18 Jul 2007 21:33:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/18/as-origens-do-caos-aereo-brasileiro/</guid><description>&lt;div class='post'>
O dia 17 de julho será lembrando, infelizmente, como a data do pior desastre aéreo em território Brasileiro. Todos os meios de comunicação enviam maciçamente informações, fotos e, sobretudo, opiniões de especialistas sobre o assunto. Não há como não se envolver -- principalmente no Rio Grande do Sul, o estado de origem da maioria dos passageiros.&lt;br />&lt;br />As opiniões se dividem: terá sido erro do piloto (que não está aqui para se defender), a pista estava com problemas ou terá sido um acidente &lt;span style="font-style:italic;">inevitável&lt;/span>? &lt;br />&lt;br />Independente da resposta, a explicação do &lt;span style="font-style:italic;">inegável &lt;/span>Caos Aéreo Brasileiro não está em uma Caixa-Preta, ou em Tapes de Conversa de pilotos com a torre, não foi culpa dos Controladores de Vôo muito menos do Clima. Engana-se quem acha que tudo começou com o acidente da Gol.&lt;br />&lt;br />A resposta vem em uma apresentação do presidente da Andep (Associação Defesa dos Direitos dos Passageiros do Transporte Aéreo) Cláudio Candiota Filho, na CPI do Apagão Aéreo. Especialista no ramo que, humildemente, cedeu uma cópia para que todos possam ver o inegável desmantelamento do setor aéreo e a fome de cargos corrupta que aniquilou o sistema de aviação civil brasileiro.&lt;br />&lt;br />&lt;object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=79560&amp;doc=apresentao-andep-v2994" width="425" height="348">&lt;param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=79560&amp;doc=apresentao-andep-v2994" />&lt;/object>&lt;br />&lt;br />Link direto para a apresentação: &lt;a href="http://www.slideshare.net/peczenyj/apresentao-andep-v2/">aqui&lt;/a>.&lt;br />&lt;br />Minhas condolências a todos que perderam um ente querido ou sofreram com este terrível acidente.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Opa, Valeu! Tche, andei fazendo umas pesquisas estes dias, vem coisa nova aí em breve.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Saudações Peczenyj.&lt;BR/>Descobri teu blog há alguns posts atrás. E já chamou-me a atenção pela qualidade dos posts, sobretudo pelas citações de Rogue e The Last Star Fighter (old memories :), bem como demais "assuntos computacionais".&lt;BR/>Não detectei a freqüência com que o atualiza, mas fica aqui um pedido de um leitor assíduo que já até realizou um fork de seu youtube downloader: continue a postar. :)&lt;BR/>Espero que não tenha perdido algúem próximo, nesse terrível descaso "Brazileiro". Sobre o qual a "vergonha cidadã" impede-me de tecer maiores comentários.&lt;BR/>No mais, fica meus agradecimentos pelas contribuições em conhecimento e pelo youtube downloader.&lt;BR/>[]s (NetWalker)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Baixando musicas do iJigg</title><link>http://pacman.blog.br/blog/2007/07/18/baixando-musicas-do-ijigg/</link><pubDate>Wed, 18 Jul 2007 14:54:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/18/baixando-musicas-do-ijigg/</guid><description>&lt;div class='post'>
O &lt;a href="http://www.ijigg.com">iJigg&lt;/a> é um youtube de mp3, basicamente. É interessante para trocar músicas ou mesmo colocar um pequeno player no seu site, como este:&lt;br />&lt;object width="315" height="80">&lt;param name="movie" value="http://www.ijigg.com/jiggPlayer.swf?songID=V2DA7ADPD&amp;Autoplay=0">&lt;param name="scale" value="noscale" />&lt;param name="wmode" value="transparent">&lt;embed src="http://www.ijigg.com/jiggPlayer.swf?Autoplay=0&amp;songID=V2DA7ADPD" width="315" height="80" scale="noscale" wmode="transparent">&lt;/embed>&lt;/object>&lt;br />&lt;br />Escolhi a musica &lt;a href="http://www.ijigg.com/songs/V2DA7ADPD">Surfista Calhorda&lt;/a>, dos Replicantes. Conheci este site graças a esta &lt;a href="http://www.dicas-l.com.br/dicas-l/20070718.php">dica&lt;/a> do dicas-l.&lt;br />&lt;br />Como todo bom nerd, decidi melhorar a dica, provendo um script para isso.&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br />[ -z "${1}" ] &amp;&amp; { echo "usage: $0 &lt; ijigg URL | ID >" ; exit 1 ; }&lt;br />ID=${1##*/}&lt;br />CMD='/Location\|Title/{s/&lt;[^>]\+>//g;p}'&lt;br />URL="http://www.ijigg.com/cgi-bin/loadSongData.cgi?songID=${ID}"&lt;br />&lt;br />set - $( wget -q -O - "${URL}" | sed -n "${CMD}" | tr '\n ' '\t_' )&lt;br />&lt;br />wget ${1} -O "${2%.mp3}.mp3"&lt;/code>&lt;/pre>&lt;br />&lt;br />Ao executar e passar a URL ou ID da música como argumento, eu faço uma busca no site atras de informações sobre a mesma (veja variavel URL). Esta consulta é um xml que retorna a localização do arquivo mp3 e do seu nome. Faço uns malabarismos com SED -- que nem são tão complicados assim -- e obtenho a url direta para baixar o arquivo e o seu nome em um bom formato (troco os espaços do nome por '_' -- para permanecer os espaços no nome tem q fazer mais uns malabarismos...).&lt;br />&lt;br />Nesse caso:&lt;pre>$ ./ijigg.sh http://www.ijigg.com/songs/V2DA7ADPD&lt;br />--15:10:05-- http://staticmdb-001.ijigg.com/songdata04/...&lt;br /> => `Replicantes_-_Surfista_calhorda.mp3'&lt;br />...&lt;br />15:10:55 (33.26 KB/s) - `Replicantes_-_Surfista_calhorda.mp3' saved&lt;/pre>&lt;br />Agora basta ouvir no seu player preferido.&lt;/div></description></item><item><title>Battlestar Galactica</title><link>http://pacman.blog.br/blog/2007/07/16/battlestar-galactica/</link><pubDate>Mon, 16 Jul 2007 22:14:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/16/battlestar-galactica/</guid><description>&lt;div class='post'>
Simplesmente a &lt;span style="font-weight:bold;">melhor&lt;/span> série de ficção científica dos ultimos anos. A série é um remake de um clássico dos anos 70 -- surgida na esteira de Star Wars, mostrando os últimos humanos percorrendo as profundezas do espaço atras da mitológica Terra. O diferencial eram as batalhas dos caças Vipers contra as forças robóticas Cylons -- com o temível olho vermelho cintilante.&lt;br />&lt;br />A nova série possui um grande &lt;span style="font-weight:bold;">diferencial&lt;/span>: a ausência total de tecnobobagem e o clima extremamente realista e muito similar ao nosso mundo. Tirando o fato de usarem naves, eles fumam, sofrem, amam, brigam, morrem... até as armas são metralhadoras e pistolas comuns.&lt;br />&lt;br />Isso prova que a boa ficção não são efeitos especiais ou badulaques e sim a força dos seus conceitos. Estes sobreviventes veneram os deuses gregos, mas são tão imperfeitos quanto nós. Destaque para o General Tigh com seu péssimo humor e alcoolismo crônico. Não é uma série que eles usam difratores de fótons ligados numa matriz parabólica -- eles gritam "MORRAM TORRADEIRAS" e mandam bala nos robos assassinos [quando não usam ogivas atômicas -- alguma graça tinha que ter].&lt;br />&lt;br />Alias, robôs estes que estão &lt;span style="font-style:italic;">muito&lt;/span> diferentes, lembrando muito Blade Runner - aliás o novo Capitão Adama é o ator Edward James Olmos, que interpretou o enigmático Gaff no filme de Ridley Scott. &lt;br />&lt;br />É uma série com muita energia, desespero, ação e roteiros muito inteligêntes. Temas incomuns como tortura, esquadrões da morte e estupro ja foram abordados, mostrando que é possivel ser adulto no universo FC. As filmagens no espaço são muito realistas e é a unica série de &lt;span style="font-style:italic;">naves&lt;/span> que as pessoas fazem sexo!&lt;br />&lt;br />Se vc não se importa em ver uns &lt;span style="font-style:italic;">spoilers&lt;/span> da terceira temporada, veja a cena que, na minha opinião, e a &lt;span style="font-style:italic;">melhor&lt;/span> de todos os tempos!&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/05PZO6-iWAU">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/05PZO6-iWAU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />Passa na Tv a Cabo e os DVDs estão a venda -- começe pelo piloto de 3 horas e não vai se arrepender.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ora... temos os DVDs :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Juliana&lt;/div>
&lt;div class='content'>
poxa, e eu não terminei de ver a segunda temporada ainda. :/&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Frente quer proibir aborto em caso de estupro</title><link>http://pacman.blog.br/blog/2007/07/16/frente-quer-proibir-aborto-em-caso-de/</link><pubDate>Mon, 16 Jul 2007 15:13:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/16/frente-quer-proibir-aborto-em-caso-de/</guid><description>&lt;div class='post'>
Sinto muito mas... isso me deixa indignado.&lt;br />&lt;br />&lt;cite>Criada em abril passado, a Frente Parlamentar Contra a Legalização do Aborto - Pelo Direito à Vida tornou-se um dos grupos mais atuantes do Congresso Nacional. Os 199 parlamentares, entre deputados e senadores - o que representa 33,5% das duas Casas - têm agitado os corredores da Câmara e prepara uma nova ofensiva: a distribuição de uma cartilha intitulada "Por que Somos Contra o Aborto", com 30 mil exemplares. A versão preliminar da cartilha, editada pelo presidente da frente, deputado Leandro Sampaio (PPS-RJ), não só combate a legalização do aborto como critica a autorização para a interrupção da gravidez nos casos de estupro, como prevê a lei atual. O aborto em caso de risco para a mãe, outra hipótese permitida pelo Código Penal, é questionado na cartilha, com o argumento de que os avanços da medicina permitem salvar vidas mesmo em casos de extrema gravidade. O debate em torno do aborto ganhou força desde que o ministro da Saúde, José Gomes Temporão, considerou a prática um problema de saúde pública e lançou a proposta de que a sociedade discuta uma nova legislação sobre o tema. Hoje, tramitam na Câmara 19 projetos sobre aborto.&lt;/cite> &lt;br />&lt;br />Sinceramente... que p$#@$ de país é esse? Não basta termos um investimento ridículo em educação e cultura, deixar os investimentos em ciências à beira do ridículo, termos um dos piores sistemas de saúde do mundo, leis que não funcionam, etc, e ainda temos q ver mais um retrocesso?&lt;br />&lt;br />Sério... todo o brasileiro que chega a idade adulta é um milagre, ja dizia o &lt;span style="font-style:italic;">Pasquim&lt;/span> -- graças à políticos como estes. O que virá depois: Criacionismo nas escolas?&lt;br />&lt;br />Obrigado, Brasil.&lt;/div></description></item><item><title>Lucas 14 anos - urgente - Doadores Porto Alegre</title><link>http://pacman.blog.br/blog/2007/07/15/lucas-14-anos-urgente-doadores-porto/</link><pubDate>Sun, 15 Jul 2007 14:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/15/lucas-14-anos-urgente-doadores-porto/</guid><description>&lt;div class='post'>
&lt;span style="font-weight:bold;">Lucas 14 anos - urgente - Doadores Porto Alegre&lt;/span>&lt;br />&lt;br />Repassando o apelo de André Parodi: &lt;cite>O meu sobrinho Lucas,fez uma cirurgia no cerebro,e precisa URGENTE de doadores de sangue de qualquer tipo, pois, ele faz um tratamento com plaquetas ( 1 bolsa a cada 8 horas ),&lt;span style="font-weight:bold;">precisamos de 42 doadores&lt;/span>.A Familia esta mobilizada.Contamos com a sua ajuda.&lt;br />Hospital da PUC Sao lucas / Banco de Sangue 2 andar&lt;br />Paciente: LUCAS PARODI SPIER AS FAMILIAS PARODI SPIER AGRADECEM&lt;/cite>&lt;br />&lt;br />Doar sangue é uma das coisas mais &lt;span style="font-weight:bold;">bonitas &lt;/span>que podemos fazer - ajudará não apenas esse garoto como muitas outras pessoas com o plasma, por exemplo. Vamos difundir esta mensagem tanto quanto difundimos os nossos sistemas operacionais, browsers e &lt;span style="font-style:italic;">gadgets&lt;/span> preferidos.&lt;/div></description></item><item><title>Piadas de Programador</title><link>http://pacman.blog.br/blog/2007/07/13/piadas-de-programador/</link><pubDate>Fri, 13 Jul 2007 20:53:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/13/piadas-de-programador/</guid><description>&lt;div class='post'>
Why do programmers always get Christmas and Halloween mixed up?&lt;br />Because &lt;span style="font-weight:bold;">DEC 25 = OCT 31&lt;/span>&lt;br />&lt;br />Essas e outras vc encontra em &lt;a href="http://www.workjoke.com/projoke20.htm">profession jokes&lt;/a>.&lt;/div></description></item><item><title>O que mais falta inventar...</title><link>http://pacman.blog.br/blog/2007/07/13/o-que-mais-falta-inventar/</link><pubDate>Fri, 13 Jul 2007 13:13:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/13/o-que-mais-falta-inventar/</guid><description>&lt;div class='post'>
&lt;a href="http://bbspot.com/News/2003/01/os_quiz.php">&lt;br />&lt;img src="http://www.bbspot.com/Images/News_Features/2003/01/os_quiz/amiga.jpg" width="300" height="90" border="0" alt="You are Amiga OS. Ahead of your time. You keep a lot of balls in the air. If only your parents had given you more opportunities to suceed.">&lt;br>Which OS are You?&lt;/a>&lt;br />&lt;br />&lt;a href="http://www.bbspot.com/News/2006/08/language_quiz.php">&lt;br />&lt;img src="http://www.bbspot.com/Images/News_Features/2006/08/language/smalltalk.jpg" width="300" height="90" border="0" alt="You are Smalltalk. You like to treat everyone the same way, but this lack of individuality makes everyone feel like objects.">&lt;br/>Which Programming Language are You?&lt;/a>&lt;br />&lt;br />&lt;a href="http://www.bbspot.com/News/2004/10/extension_quiz.php">&lt;br />&lt;img src="http://www.bbspot.com/Images/News_Features/2004/10/file_extensions/gif.jpg" width="300" height="90" border="0" alt="You are .gif Sometimes you are animated, but usually you just sit there and look pretty.">&lt;br>Which File Extension are You?&lt;/a>&lt;/div></description></item><item><title>Introdução aos Device Drivers no Linux</title><link>http://pacman.blog.br/blog/2007/07/12/introduo-aos-device-drivers-no-linux/</link><pubDate>Thu, 12 Jul 2007 17:17:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/12/introduo-aos-device-drivers-no-linux/</guid><description>&lt;div class='post'>
Vamos fazer um /dev/hello_word ?&lt;br />&lt;br />Aprenda a fazer um neste &lt;a href="http://www.linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html">fascinante artigo&lt;/a> -- nunca se sabe quando será util!&lt;/div></description></item><item><title>Printf Format Specifications Quick Reference</title><link>http://pacman.blog.br/blog/2007/07/12/printf-format-specifications-quick/</link><pubDate>Thu, 12 Jul 2007 15:38:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/12/printf-format-specifications-quick/</guid><description>&lt;div class='post'>
Tudo o que vc sempre quis saber sobre o printf mas tinha medo de perguntar:&lt;br />&lt;a href="http://www.pixelbeat.org/programming/format_specs.html">http://www.pixelbeat.org/programming/format_specs.html&lt;/a>&lt;/div></description></item><item><title>Bases Numericas em Bash</title><link>http://pacman.blog.br/blog/2007/07/12/bases-numericas-em-bash/</link><pubDate>Thu, 12 Jul 2007 11:49:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/12/bases-numericas-em-bash/</guid><description>&lt;div class='post'>
Com Bash, podemos representar números nas mais variadas bases, desde &lt;a href="http://en.wikipedia.org/wiki/Base2">2&lt;/a> até &lt;a href="en.wikipedia.org/wiki/Base64">64&lt;/a> usando o operador # como no exemplo abaixo:&lt;pre>&lt;code>&lt;br />X=101 &lt;br />for BASE in 2 8 10 16 32 64 ; do &lt;br /> echo "$X na base $BASE eh $(( ${BASE}#${X} ))" # conversao pra decimal&lt;br />done&lt;br />101 na base 2 eh 5&lt;br />101 na base 8 eh 65&lt;br />101 na base 10 eh 101&lt;br />101 na base 16 eh 257&lt;br />101 na base 32 eh 1025&lt;br />101 na base 64 eh 4097 &lt;br />&lt;br />echo $((16#FF)) $((32#V))&lt;br />255 31&lt;br />&lt;br />echo $((64#z)) $((64#Z)) $((64#@)) $((64#_)) # atenção nos 2 ultimos!&lt;br />35 61 62 63&lt;br />&lt;/code>&lt;/pre>&lt;br />Além de ser possível usar a notação de octal e hexa do C (iniciar a expressão com 0 e 0x, respectivamente)&lt;pre>&lt;code>echo $((10)) $(( 010 )) $(( 0x10 )) $((10 + 010 + 0x10))&lt;br />10 8 16 34&lt;code>&lt;/pre>&lt;br />Bastante útil para pequenas conversões. Agora se quisermos converter um numero de uma base qualquer para outra, o nosso amigo &lt;span style="font-weight:bold;">bc&lt;/span> pode servir:&lt;br />&lt;br />&lt;pre>&lt;/code>bc &lt;&lt;&lt; 'ibase = 8 ; obase = 16 ; 1027'&lt;br />2A3&lt;/code>&lt;/pre>&lt;br />Onde ibase é a base de entrada (input) e a obase é a de saída (output). A diferença fica nas bases muito altas (32 ou 64) onde não são usados os caracteres minúsculos, maiusculos e especiais.&lt;br />&lt;br />Esta dica foi tirada do &lt;a href="http://tldp.org/LDP/abs/abs-guide.pdf">Advanced Bash Scripting Guide&lt;/a>.&lt;br />&lt;br />&lt;!-- INICIO DO CODIGO DO CONTADOR DE VISITAS 2W.COM.BR -->&lt;br />&lt;img src="http://www.2w.com.br/imgcontador.php?p=e3ca6d6d" alt="Contador de visitas" border=0>&lt;br />&lt;!-- FIM DO CODIGO DO CONTADOR DE VISITAS 2W.COM.BR -->&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ola!&lt;BR/>&lt;BR/>Se vc prestar atenção eu coloquei um comentário que informava a conversão para a base decimal pois achei q, se colocasse o 'na base 10' no final de cada linha poderia ficar um pouco poluido. Pelo visto ficou é confuso.&lt;BR/>&lt;BR/>agora, 101 em hexa é 257 sim, uma vez que 100 significaria, nesse caso, 1 x 16^2 -- 256. Vou postar mais sobre o assunto ai e vai vamos chegar a um consenso ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>naoliv&lt;/div>
&lt;div class='content'>
Hum... comentando com um amigo meu eu acho que você quis dizer:&lt;BR/>&lt;BR/>101 na base 2 eh 5 na base 10&lt;BR/>&lt;BR/>101 na base 8 eh 65 na base 10&lt;BR/>&lt;BR/>101 na base 10 eh 101 na base 10&lt;BR/>&lt;BR/>101 na base 16 eh 257 na base 10&lt;BR/>&lt;BR/>101 na base 32 eh 1025 na base 10&lt;BR/>&lt;BR/>101 na base 64 eh 4097 na base 10&lt;BR/>&lt;BR/>Faltou os "na base 10" :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>naoliv&lt;/div>
&lt;div class='content'>
Isso tá certo?&lt;BR/>Como que o número pode ser 5 na base 2? (se só existem os caracteres 0 e 1)&lt;BR/>&lt;BR/>101 em hexa (base 16), por exemplo, é 65 e não 257.&lt;BR/>&lt;BR/>Ou eu entendi errado o seu post?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sindicato dos Messias</title><link>http://pacman.blog.br/blog/2007/07/12/sindicato-dos-messias/</link><pubDate>Thu, 12 Jul 2007 09:49:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/12/sindicato-dos-messias/</guid><description>&lt;div class='post'>
Basta de oligopólios monoteístas!&lt;br />&lt;br />O &lt;span style="font-weight:bold;">Sindicato dos Messias &amp;reg;&lt;/span> é uma tradicional sociedade de Messias, Profetas, Avatares e Deuses, que remonta, neste plano, aos tempos de antes do &lt;span style="font-weight:bold;">Grande Uósh&lt;/span> que escaramurfou as Formas de Vida Errantes da Terra. Fora deste Universo o Sindicato dos Messias existe desde antes do ínicio do Tempo como o conhecemos, e mesmo antes do surgimento do Primeiro Deus, sendo que os registros mais antigos remontam ao tempo em que nem o Nada existia ainda, só havia o conceito idealizado do Sindicato dos Messias, e mais um bando de idéias bizarras boiando num mar de Coisas Inexistentes Inimagináveis.&lt;br />&lt;br />Continua...&lt;/div></description></item><item><title>StarCraft 2</title><link>http://pacman.blog.br/blog/2007/07/11/starcraft-2/</link><pubDate>Wed, 11 Jul 2007 23:42:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/starcraft-2/</guid><description>&lt;div class='post'>
&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/ELhtXtnV3pg">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/ELhtXtnV3pg" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />O que eu posso dizer... &lt;br />&lt;br />...YEAAAAAAAAAAAAAAAAAAAHHH!!! &lt;a href="http://www.starcraft2.com">StarCraft 2&lt;/a> está chegando!!!&lt;br />&lt;br />Vejam a primeira apresentação para o publico: ainda é Beta, mas ja temos ideia de como serão algumas unidades, principalmente as Protoss.&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/OoCaHjfw618">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/OoCaHjfw618" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />Alguem mais alem de mim achou sensacional o buraco negro que a nave mãe gera?&lt;/div></description></item><item><title>Bad Astronomy</title><link>http://pacman.blog.br/blog/2007/07/11/bad-astronomy/</link><pubDate>Wed, 11 Jul 2007 23:23:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/bad-astronomy/</guid><description>&lt;div class='post'>
Não posso deixar de recomendar o ótimo site do Astrônomo Phil Plait: badastronomy.com&lt;br />&lt;br />Phil é uma daquelas pessoas que se dedicam a informar, acabando com boatos e inverdades científicas - em especial na sua área, a astronomia. Também é escritor do (excelente) livro &lt;span style="font-weight:bold;">Bad Astronomy - Misconceptions and Misuses Revealed, from Astrology to Moon Landing "Hoax"&lt;/span>.&lt;br />&lt;br />Um link realmente importante é sobre a &lt;a href="http://www.badastronomy.com/bad/tv/foxapollo.html">"Fraude" da ida à lua&lt;/a>. Com uma linguagem clara e muitos exemplos, fotos e diagramas, ele refuta todos os mais absurdos comentários sobre a impossíbilidade da missão Apollo ter descido até o nosso satélite natural. Confiram para ver.&lt;br />&lt;br />Um artigo na mesma linha (em pt_BR) está presente no ótimo site do &lt;a href="http://www.projetoockham.org/historia_lua_1.html">Projeto Ockham&lt;/a>, escrito pelo engenheiro Widson Porto Reis.&lt;br />&lt;br />Ps: se ouvirem falar de um filme chamado "What the Bleep do We Know", leiam este &lt;a href="http://dragaodagaragem.blogspot.com/2006/11/o-guia-ctico-para-assistir-what-bleep.html">guia cético&lt;/a> bem humorado (e informado).&lt;/div></description></item><item><title>Paz, Amor &amp; Linux</title><link>http://pacman.blog.br/blog/2007/07/11/paz-amor-linux/</link><pubDate>Wed, 11 Jul 2007 16:13:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/paz-amor-linux/</guid><description>&lt;div class='post'>
Hacker é como Punk, Ateu ou Geek -- um rótulo.&lt;br />&lt;br />Uma hora a mídia fala q ser Hacker é ruim. Outra hora fala q não são Hackers, são os Crackers que são a ameaça. Acho que falta um pouco de romantismo na nossa vida...&lt;br />&lt;br />Proponho uma revolução no mundo digital através do amor. Vamos deixar comentarios no codigo fonte repleto de belas mensagens, poemas e juras de amor eterno. Vamos visitar o apartamento frio e escuro dos nossos amigos mais anti-sociais e levar bolos, café e carinho. Vamos fazer divertidas obras de arte como borboletas e caras-de-gatos com os DVDs do windows vista e distribuir para os nossos amigos.&lt;br />&lt;br />Bigodinho e chifres nas fotos do Bill Gates e Steve Ballmer nunca mais! Vamos colocar coraçõezinhos e flores coloridas e passar muita energia positiva. Sejamos francos e sinceros. Vamos usar de adjetivos angelicais e fala suave para que amor sempre venha a tona.&lt;br />&lt;br />Assim, o codigo fonte sera alvo do nosso tórrido amor. Interfaces apaixonadas e Algoritmos envolventes serão o nosso legado.&lt;br />&lt;br />E assim o &lt;span style="font-weight:bold;">amor &lt;/span>triunfa. Nada de esmurrar o teclado. No lugar do café: flores. No lugar do ódio: Linux.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>pauloriceli&lt;/div>
&lt;div class='content'>
&lt;B> :) &lt;/B>&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sugestões de Leitura</title><link>http://pacman.blog.br/blog/2007/07/11/sugestes-de-leitura/</link><pubDate>Wed, 11 Jul 2007 15:38:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/sugestes-de-leitura/</guid><description>&lt;div class='post'>
Ja ouviu falar na tal Web 2.0? Veja os &lt;a href="http://www.slideshare.net/pcalcado/somos-nozes">slides&lt;/a> da apresentação do Philip Calçado.&lt;br />&lt;br />Quer dominar o Vi/Vim? Veja este pequeno &lt;a href="http://wiki.if.uff.br/operador/doku.php/dicas:vi">guia&lt;/a>.&lt;br />&lt;br />Se inglês não é problema, vc pode aprender &lt;a href="http://www.planetpdf.com/developer/article.asp?ContentID=6632">Java&lt;/a>, &lt;a href="http://www.planetpdf.com/developer/article.asp?ContentID=6634">C++&lt;/a> ou &lt;a href="http://www.advancedlinuxprogramming.com/">Programação Avançada em Linux&lt;/a> usando livros gratuitos e de ótima qualidade.&lt;br />&lt;br />No site da InfoQ vc ainda pode baixar livros de &lt;a href="http://www.infoq.com/minibooks/enterprise-soa">SOA&lt;/a>, &lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches">Scrum &amp; XP&lt;/a>, &lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">Domain Driven&lt;/a> e &lt;a href="http://www.infoq.com/minibooks/vsnettt">Dicas de Visual Studio .NET&lt;/a>.&lt;br />&lt;br />E, se vc se interessa por Gerência de Projetos, vai gostar &lt;a href="http://www.leanconstruction.org/pdf/ObsoleteTheory.pdf">desse artigo&lt;/a>.&lt;br />&lt;br />Boa leitura!&lt;/div></description></item><item><title>O Último Guerreiro Estelar</title><link>http://pacman.blog.br/blog/2007/07/11/o-ltimo-guerreiro-estelar/</link><pubDate>Wed, 11 Jul 2007 12:47:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/o-ltimo-guerreiro-estelar/</guid><description>&lt;div class='post'>
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.hollywoodteenmovies.com/Last%20StarfighterBigPic.jpg">&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.hollywoodteenmovies.com/Last%20StarfighterBigPic.jpg" border="0" alt="" />&lt;/a>&lt;br />&lt;br />&lt;br />&lt;span style="font-weight:bold;">Saudações, Guerreiro Estelar! Você foi recrutado pela Liga Estelar para defender a Fronteira contra XUR e a Armada Ko-Dan!&lt;/span>&lt;br />&lt;br />Assim começa o jogo na (antiga) maquina de Arcade. Alex Hogan é apenas um adolescente morando em um conjunto de trailers na california, mas é o melhor jogador de todos os tempos, atingindo o recorde da maquina.&lt;br />&lt;br />Seria mais um filme nerd bobo se não fosse pelas consequências: o video-game é, na verdade, uma maquina caça-talentos e descobre um promissor piloto espacial! Uma noite Alex recebe a visita de um homem chamado Centauri e, então, sua vida muda completamente, conhecendo o espaço, suas maravilhas e perigos.&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/zCpF6mWwlR0">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/zCpF6mWwlR0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object> &lt;br />Uma premissa interessante: quem não gostaria de ver o seu jogo favorito se tornar realidade? Entretanto, nada é facil para Alex, que resolve &lt;span style="font-weight:bold;">desistir &lt;/span>quando sente a responsabilidade -- quando se torna, literalmente, o último guerreiro das estrelas. &lt;br />&lt;br />The Last Starfighter entrou para a história do cinema por usar intensamente cenas feitas em CGI pela primeira vez -- tornando as batalhas impressionantes para a época. Destaque para a cena final com o uso da "Arma da Morte" com a classica fala "We Die". &lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/qsR_1C4t1eU">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/qsR_1C4t1eU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />Vai bem com um balde de pipoca, em um aparelho de DVD mais perto de vc.&lt;/div></description></item><item><title>Ansi C orientado à objetos</title><link>http://pacman.blog.br/blog/2007/07/10/ansi-c-orientado-objetos/</link><pubDate>Tue, 10 Jul 2007 16:37:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/10/ansi-c-orientado-objetos/</guid><description>&lt;div class='post'>
Divertido! Compila e não gera nenhum warning.&lt;br />&lt;br />&lt;pre>&lt;code>&lt;br />#include &amp;lt;stdio.h&amp;gt;&lt;br />&lt;br />struct {&lt;br /> struct {&lt;br /> int (*println) (const char *);&lt;br /> } out;&lt;br />} System = { {puts} };&lt;br />&lt;br />&lt;br />int main (void){&lt;br />&lt;br /> System.out.println("ola mundo");&lt;br />&lt;br /> return 0;&lt;br />}&lt;/pre>&lt;/code>&lt;br />&lt;br />Achei um pdf no google sobre o assunto chamado &lt;a href="http://www.planetpdf.com/codecuts/pdfs/ooc.pdf">Orientação A Objetos em C Ansi&lt;/a>. Neste caso, eu criei um ponteiro para a função puts (presente na libc), chamado println. Criei uma variavel chamada &lt;span style="font-style:italic;">System&lt;/span>, que é uma estrutura que possui uma variavel chamada &lt;span style="font-style:italic;">out &lt;/span>que, por sua vez, possui o ponteiro &lt;span style="font-style:italic;">println&lt;/span>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ola!&lt;BR/>Esqueci mesmo, achei o pdf e postei na correria. :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>J. F. Mitre&lt;/div>
&lt;div class='content'>
Amigo, &lt;BR/>tenho acompanhado seu textos a algum tempo, são de alta qualidade, mesmo quando são curtos. Muito bom.&lt;BR/>&lt;BR/>Mas quando você escreveu esse texto e colocou esse link no fim da página, você esqueceu de mencionar que era um &lt;B>livro gratuito de mais de 200 páginas...&lt;/B>&lt;BR/>&lt;BR/>&lt;A HREF="http://www.planetpdf.com/developer/article.asp?ContentID=object_orientated_programming_&amp;gid=6635" REL="nofollow">Link para a página de divulgação do livro&lt;/A>. Bom para saber quando e quem escreveu.&lt;BR/>&lt;BR/>Eu só posso dizer obrigado !&lt;BR/>&lt;BR/>1[]'s&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Falando em Feira da Fruta...</title><link>http://pacman.blog.br/blog/2007/07/07/falando-em-feira-da-fruta/</link><pubDate>Sat, 07 Jul 2007 15:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/07/falando-em-feira-da-fruta/</guid><description>&lt;div class='post'>
Uma imagem fala mais o que mil palavras.&lt;br />&lt;br />&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://oglobo.globo.com/blogs/arquivos_upload/2007/07/146_354-bino2.jpg">&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://oglobo.globo.com/blogs/arquivos_upload/2007/07/146_354-bino2.jpg" border="0" alt="" />&lt;/a>&lt;span style="font-style:italic;">&lt;br />Stênio Garcia e Antonio Fagundes, quem diria, deram uma de super-heróis. E se vestiram, justamente, de Batman e Robin. No episódio de sexta-feira de "Carga pesada", Bino (Stênio) e Pedro são assaltados por uma quadrilha e largados, sem nada, num galpão abandonado. Lá, eles encontram as fantasias, que quebram um galho no momento de aperto. &lt;/span>&lt;br />&lt;br />Essa trama de serem trancados em um galpão lembra muito McGyver ou Esquadrão Classe-A :)&lt;/div></description></item><item><title>Como aprender...</title><link>http://pacman.blog.br/blog/2007/07/07/como-aprender/</link><pubDate>Sat, 07 Jul 2007 14:59:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/07/como-aprender/</guid><description>&lt;div class='post'>
Para aprender C, leia o curso da &lt;a href="http://www.ppgia.pucpr.br/~maziero/ensino/so/projetos/curso-c/">UFMG&lt;/a>. &lt;br />&lt;br />E Linux ?, um bom começo é o &lt;a href="http://focalinux.cipsga.org.br/">Guia Foca Linux&lt;/a>.&lt;br />&lt;br />Quer ir mais longe e aprender &lt;a href="http://www.numaboa.com/content/section/11/57/">criptografia &lt;/a>ou fazer o seu &lt;a href="http://www.numaboa.com/content/view/739/228/">proprio bootloader&lt;/a> ? O lugar é o &lt;a href="http://www.numaboa.com">aldeia numaboa&lt;/a>.&lt;br />&lt;br />Ou quem sabe ler um delicioso artigo sobre &lt;a href="http://www.javafree.org/content/view.jf?idContent=182">programação orientada à aspectos&lt;/a>?&lt;br />&lt;br />Se vc souber pesquisar, vai encontrar muitos tutoriais escritos no seu idioma. Mas os melhores textos ainda estão escritos em inglês. Não se pode virar as costas à este fato, porém não é de todo ruim. Aprender coisas novas mantém o cérebro ágil e jovem.&lt;br />&lt;br />Não importa o assunto, a internet está ai: pesquise. Isso pode tanto fazer um diferencial competitivo na hora de arrumar um (novo) emprego, quanto prover uma melhor qualidade de vida.&lt;br />&lt;br />Afinal, se não fosse pela internet não teriamos o classico &lt;a href="http://www.youtube.com/watch?v=Izn2Pq5t2aQ">Batimã: Feira da Fruta&lt;/a>.&lt;/div></description></item><item><title>Bunny Suicides</title><link>http://pacman.blog.br/blog/2007/07/06/bunny-suicides/</link><pubDate>Fri, 06 Jul 2007 16:51:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/06/bunny-suicides/</guid><description>&lt;div class='post'>
Conheça os adoraveis &lt;a href="http://www.retrocomputing.net/racconti/umor/coniglio/pandora.beptuui.html">coelhos suicidas&lt;/a>.&lt;br />&lt;br />&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.retrocomputing.net/racconti/umor/coniglio/1_840000.jpg">&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://www.retrocomputing.net/racconti/umor/coniglio/1_840000.jpg" border="0" alt="" />&lt;/a>&lt;/div></description></item><item><title>Pra bom entendedor...</title><link>http://pacman.blog.br/blog/2007/07/06/pra-bom-entendedor/</link><pubDate>Fri, 06 Jul 2007 16:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/06/pra-bom-entendedor/</guid><description>&lt;div class='post'>
Coitado do latinha nesse universo amálgama:&lt;br />&lt;br />&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.created.ca/banners/corps_ironlantern.jpg">&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.created.ca/banners/corps_ironlantern.jpg" border="0" alt="" />&lt;/a>&lt;/div></description></item><item><title>Youtube Downloader 2.0</title><link>http://pacman.blog.br/blog/2007/07/06/youtube-downloader-20/</link><pubDate>Fri, 06 Jul 2007 15:25:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/06/youtube-downloader-20/</guid><description>&lt;div class='post'>
A versão 1.0 foi até pro &lt;a href="http://www.dicas-l.com.br/dicas-l/20070705.php">Dicas-L&lt;/a>. Graças a esta exposição percebi que o script é muito útil para quem não tem um plug-in flash (que preste) no &lt;span style="font-style:italic;">browser&lt;/span>. É o caso do pessoal que usa &lt;a href="en.wikipedia.org/wiki/BeOS">Beos&lt;/a>, por exemplo. &lt;br />&lt;br />Reduzi o número de linhas, usei a &lt;a href="http://www.aurelio.net/shell/canivete.html#expansao">expansão de variáveis&lt;/a> do bash para algumas substituições simples e agora vc pode informar o nome do arquivo que vc quer salvar, senão será usado aquele nada pratico id. A extensão é flv que pode ser visualizado pelo &lt;span style="font-style:italic;">mplayer &lt;/span>ou convertido pra mpeg.&lt;br />&lt;br />&lt;pre>$ ./script.sh endereço_do_video nome_do_video&lt;/pre>&lt;br />Eis o código&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br /># youtube downloader&lt;br />test -n "${1}" || { echo -e "Missing url or id!\nUsage: ${0} &amp;lt;url | id&amp;gt; [filename]" ; exit 1; }&lt;br />&lt;br />set - ${1/*=} ${2:-${1/*=}} "http://www.youtube.com/watch?v=${1/*=}" 'video_id=.+&amp;t=[^\"&amp;]+'&lt;br /> &lt;br />wget -O "${2%.flv}.flv" "${3%/*}/get_video?$(wget -qO - "${3}" | grep -oE "${4}" | sed '1q')" &lt;br />&lt;/code>&lt;/pre>&lt;br />&lt;br />Tentei usar o &lt;span style="font-weight:bold;">curl &lt;/span>e não consegui. Quem quiser tentar, faça um curl -I na url final e veja os cabeçalhos -- não sei como ir para o 'Location'. O wget faz isso numa boa, mas seria interessante ter a opção com o curl.&lt;br />&lt;br />O que seria mais interessante? Baixar uma lista de videos? Baixar os X primeiros videos que aparecem em uma dada pesquisa?&lt;/div></description></item><item><title>Respostas Claras</title><link>http://pacman.blog.br/blog/2007/07/05/respostas-claras/</link><pubDate>Thu, 05 Jul 2007 14:17:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/05/respostas-claras/</guid><description>&lt;div class='post'>
Em exemplo interessante de falta de atenção (inspirado em casos reais):&lt;br />&lt;table id="shazam">&lt;tr>&lt;td>Nome&lt;/td>&lt;td>&lt;input text="text" value="Tiago Peczenyj"/>&lt;/td>&lt;/tr>&lt;tr>&lt;td>Idade&lt;/td>&lt;td>&lt;input type="text" value="27"/>&lt;/td>&lt;/tr> &lt;tr>&lt;td>Opinião&lt;/td>&lt;td>&lt;input size="80" type="text" value="Acho que algumas traduções deveriam ser feitas com cuidado!"/>&lt;/td>&lt;/tr>&lt;/table>&lt;br />&lt;input type="button" onclick="javascript:alert('Feito!')" value="Salvar"/>&lt;input type="button" onclick="javascript:for(var i=0;i!=3;i++) { document.getElementById('shazam').getElementsByTagName('input')[i].value = ''} " value="Respostas Claras"/>&lt;/div></description></item><item><title>Curiosidade</title><link>http://pacman.blog.br/blog/2007/07/04/curiosidade/</link><pubDate>Wed, 04 Jul 2007 10:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/04/curiosidade/</guid><description>&lt;div class='post'>
Desde que comecei com este blog, não imaginei que receberia visitas do Vietnã e do Hawaii (graças ao Google Analytics).&lt;br />&lt;br />Aos visitantes de tão longe, assim como os de tão perto, um grande abraço!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Sergio&lt;/div>
&lt;div class='content'>
Meu blog eh bem novo mas percebi que quem acessa mais no estrangeiro é a Germany segundo portugual e terceiro Japan, gostaria de saber o que ele acham de tudo isso hauahuahua...&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Linux Ubuntu</title><link>http://pacman.blog.br/blog/2007/07/03/linux-ubuntu/</link><pubDate>Tue, 03 Jul 2007 16:42:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/03/linux-ubuntu/</guid><description>&lt;div class='post'>
Houve um tempo que usar &lt;a href="http://pt.wikipedia.org/wiki/Linux">linux &lt;/a>era coisa de louco. Era &lt;span style="font-style:italic;">difícil&lt;/span> de instalar, as interfaces gráficas eram pobres, poucos programas... era o sistema ideial para programadores e nerds. Quem precisa de Word quando tem o &lt;a href="http://pt.wikipedia.org/wiki/Vi">Vi&lt;/a> e o &lt;a href="http://pt.wikipedia.org/wiki/Latex">LaTeX&lt;/a>? Quem precisa de Excel quando tem &lt;a href="http://pt.wikipedia.org/wiki/AWK">AWK&lt;/a>? Ora... é uma questão de escolha, simples assim.&lt;br />&lt;br />O que era um projeto de nerds virou um modelo de negócios. Surgiram boas distribuições, inovações como o &lt;a href="http://pt.wikipedia.org/wiki/Mandrakelinux">Linux Mandrake&lt;/a> (nunca a instalação de um sistema foi tão fácil e bonita), o &lt;a href="http://pt.wikipedia.org/wiki/StarOffice">StarOffice&lt;/a>, o &lt;a href="http://pt.wikipedia.org/wiki/WindowMaker">WindowMaker&lt;/a>, &lt;a href="http://pt.wikipedia.org/wiki/KDE">KDE&lt;/a>...&lt;br />&lt;br />Pois bem, eis que surgiu o &lt;a href="http://pt.wikipedia.org/wiki/Ubuntu_Linux">Ubuntu Linux&lt;/a>. Criado pelo programador E turista espacial &lt;a href="http://pt.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth&lt;/a>, o Ubuntu é um sistema inteligente, projetado para ser utilizado com simplicidade por qualquer pessoa. O resultado foi uma distribuição extremamente popular, bonita e intuitiva.&lt;br />&lt;br />Fica ai a dica: façam um test-drive com um LiveCD do Ubuntu (vcs podem pedir CDs de graça no &lt;a href="www.ubuntu.com/">site oficial&lt;/a> -- eles entregam no brasil).&lt;br />&lt;br />A seguir uma breve entrevista do Mark Shuttleworth:&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/Ke-kel9zOFo">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/Ke-kel9zOFo" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;/div></description></item><item><title>Oportunidades de Emprego (Porto Alegre)</title><link>http://pacman.blog.br/blog/2007/07/03/oportunidades-de-emprego-porto-alegre/</link><pubDate>Tue, 03 Jul 2007 11:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/03/oportunidades-de-emprego-porto-alegre/</guid><description>&lt;div class='post'>
Tens &lt;span style="font-weight: bold;">experiência &lt;/span>em Java / Oracle / .Net / C / C++ / Javascript / Teste de Software / Gerência de Projetos /Cobol ou Clipper?&lt;br />&lt;br />Procurando &lt;span style="font-weight: bold;">emprego&lt;/span> na região de Porto Alegre?&lt;br />&lt;br />&lt;UL>&lt;br />&lt;LI>Desenvolvedor C# (2 vagas)&lt;/LI>&lt;br />&lt;LI>Desenvolvedor de Testes&lt;/LI>&lt;br />&lt;LI>Analista de Suporte Java&lt;/LI>&lt;br />&lt;LI>Integrador de Sistemas&lt;/LI>&lt;br />&lt;LI>Analista de Sistemas&lt;/LI>&lt;br />&lt;LI>Lider Técnico - Java (mínimo 3 anos de experiência)&lt;/LI>&lt;br />&lt;LI>&lt;span style="font-weight:bold;">Desenvolvedor Java/Oracle&lt;/span> (4 anos experiência)&lt;/LI>&lt;br />&lt;LI>&lt;span style="font-weight:bold;">Desenvolvedor Oracle Developer (Forms/Report) &lt;/span>(3 anos de experiência)&lt;/LI>&lt;br />&lt;/UL>&lt;br />Não perca tempo, envie o seu curriculo atualizado para &lt;a href="mailto:peczenyj.curriculos@gmail.com">mim&lt;/a> informando, principalmente, tempo de experiência, certificações e nível de inglês.&lt;br />&lt;br />Sugiro também a leitura deste &lt;a href="http://pythonologia.org/2007/06/07/desempregado-ou-despreparado/ ">post&lt;/a> do blog &lt;span style="font-style:italic;">pythonologia&lt;/span>. Muito interessante na hora de redigir um currículo ou email para alguma vaga.&lt;/div></description></item><item><title>Parâmetros em Shell Script</title><link>http://pacman.blog.br/blog/2007/07/02/parmetros-em-shell-script/</link><pubDate>Mon, 02 Jul 2007 22:46:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/parmetros-em-shell-script/</guid><description>&lt;div class='post'>
Meu primeiro artigo, resultado de uma boa noite de insônia.&lt;br />&lt;br />Direto do CentOSBR: &lt;a href="http://centosbr.org/modules/smartsection/item.php?itemid=108">Parâmetros no Shell&lt;/a>.&lt;br />&lt;br />Estou enrolando outros textos tem tempo: vamos ver se agora eu continuo.&lt;/div></description></item><item><title>Conheça o Incrível Ruby on Rails</title><link>http://pacman.blog.br/blog/2007/07/02/conhea-o-incrvel-ruby-on-rails/</link><pubDate>Mon, 02 Jul 2007 17:39:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/conhea-o-incrvel-ruby-on-rails/</guid><description>&lt;div class='post'>
&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/Gzj723LkRJY">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/Gzj723LkRJY" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />&lt;a href="http://pt.wikipedia.org/wiki/Ruby_(linguagem_de_programa%C3%A7%C3%A3o)">Ruby&lt;/a> é uma linguagem interpretada orientada à objetos que vem aparecendo no mercado faz tempo. Sua popularidade vem subindo graças ao framework &lt;a href="http://pt.wikipedia.org/wiki/Ruby_on_Rails">on Rails&lt;/a>, que pode acelerar, e muito, o desenvolvimento de aplicações para a web. &lt;br />&lt;br />Gostou da demonstração? O ponto de partida para um entusiasta pode ser o &lt;a href="http://rubyonbr.org/">Ruby on Br&lt;/a>, com alguns bons artigos e um forum que une os melhores profissionais no ramo. &lt;br />&lt;br />Dê uma olhada nos &lt;a href="http://eustaquiorangel.com/files">tutoriais&lt;/a> do Taq e, se gostar, compre o livro (é muito bom, recomendo). Outro livro muito bom é o do &lt;a href="http://www.akitaonrails.com/">Akita&lt;/a> (responsável pela &lt;a href="http://gettingreal.37signals.com/GR_por.php">tradução&lt;/a> do livro Getting Real by 37 Signals para pt_BR).&lt;br />&lt;br />Embarque nessa vc também!&lt;/div></description></item><item><title>Rogue: Muita Ação em 1980</title><link>http://pacman.blog.br/blog/2007/07/02/rogue-muita-ao-em-1980/</link><pubDate>Mon, 02 Jul 2007 12:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/rogue-muita-ao-em-1980/</guid><description>&lt;div class='post'>
No fim da década de 90, fui o feliz proprietário de um PC 286 dotado de monitor CGA monocromático. Rodando DOS 5.0 no disquete maior, esta &lt;span style="font-style:italic;">pontente&lt;/span> maquina possibilitou que eu aprendesse Pascal para a faculdade, alem de testar centenas de sharewares baixados do Sintel.net.&lt;br />&lt;br />A vontade de jogar era maior do que tudo, obviamente. As limitações do Hardware, entretanto, só foram eliminadas com um jogo extremamente simples, datado da década de 80: &lt;a href="http://www.classicgaming.com/rotw/rogue.shtml">Rogue&lt;/a> (uma breve história do jogo pode ser encontrada &lt;a href="http://www.wichman.org/roguehistory.html">aqui&lt;/a>).&lt;br />&lt;br />&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.maranci.net/rogue.jpg">&lt;img style="cursor:pointer; cursor:hand;width: 652px;" src="http://www.maranci.net/rogue.jpg" border="0" alt="" />&lt;/a>&lt;br />&lt;br />Rogue é um jogo simples: tu és um guerreiro (ou alguma coisa parecida) representado por uma carinha ascii (ou uma @, dependendo da versão). Navegando por labirintos cheios de itens mágicos, armas e monstros, vais descendo até encontrar o temível Dragão (representado pela letra D -- após algumas horas de jogo, o alfabeto torna-se incrivelmente ameaçador!).&lt;br />&lt;br />A complexidade do jogo não é pequena: vc pode usar um anel amaldiçoado (cursed) que te teleporte aleatoriamente até que vc consiga remove-lo com a mágica certa. Um dos monstros pode remover níveis do seu personagem, &lt;span style="font-weight:bold;">involuindo-o&lt;/span> (letra X se não me engano -- alias esse foi o único jogo que apresentava esse tipo de desafio). Cada jogo é diferente do outro, o que representa centenas de horas de diversão. Para saber mais, começe &lt;a href="http://en.wikipedia.org/wiki/Roguelike">aqui&lt;/a>.&lt;br />&lt;br />Jogos em modo texto, com este tipo de interface gráfica ou os mais simples como &lt;a href="http://en.wikipedia.org/wiki/Zork">Zork&lt;/a> ou &lt;a href="http://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Colossal Caves&lt;/a> representam um excelente desafio: jogos cujo impacto seja a sua estória, suas possibilidades e a criatividade do autor. Qualquer um que pense em criar jogos (mirabolantes ou não) deveria conhecer estes vovôs dos jogos atuais, e tentar fazer um, inclusive.&lt;br />&lt;br />Existe espaço até para jogos multiplayers, como no caso dos &lt;a href="http://pt.wikipedia.org/wiki/Multi-user_dungeon">MUDs&lt;/a>. Tem gente jogando a mais de uma década o que os mais novos descobriram no &lt;a href="http://www.worldofwarcraft.com">WoW&lt;/a>.&lt;br />&lt;br />ps: eu SEMPRE joguei em modo "Fast Play" (Scroll Lock!), exceto em ambientes grandes e escuros.&lt;/div></description></item><item><title>O melhor de dois mundos: C e Fortran</title><link>http://pacman.blog.br/blog/2007/07/02/o-melhor-de-dois-mundos-c-e-fortran/</link><pubDate>Mon, 02 Jul 2007 11:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/o-melhor-de-dois-mundos-c-e-fortran/</guid><description>&lt;div class='post'>
C é uma ótima linguagem de programação, simples e clara.&lt;br />Fortran, para problemas matemáticos, é imbativel!&lt;br />&lt;br />Que tal usar o melhor dos dois mundos com este &lt;a href="http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html">tutorial&lt;/a>?&lt;br />&lt;br />Vejamos o exemplo abaixo:&lt;br />&lt;br />Arquivo testC.cpp&lt;br />&lt;pre>&lt;code>#include &lt;iostream>&lt;br />&lt;br />using namespace std;&lt;br />&lt;br />extern"C" {&lt;br />void fortfunc_(int *ii, float *ff);&lt;br />}&lt;br />&lt;br />main()&lt;br />{&lt;br />&lt;br /> int ii=5;&lt;br /> float ff=5.5;&lt;br />&lt;br /> fortfunc_(&amp;ii, &amp;ff);&lt;br />&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Arquivo testF.f&lt;br />&lt;pre>&lt;code> subroutine fortfunc(ii,ff)&lt;br /> integer ii&lt;br /> real*4 ff&lt;br />&lt;br /> write(6,100) ii, ff&lt;br /> 100 format('ii=',i2,' ff=',f6.3)&lt;br />&lt;br /> return&lt;br /> end&lt;/code>&lt;/pre>&lt;br />&lt;br />Compilando&lt;br />&lt;br />&lt;pre>$ f77 -c testF.f&lt;br />$ g++ -c testC.cpp&lt;br />$ g++ -o test testF.o testC.o -lg2c&lt;/pre>&lt;br />&lt;br />Executando&lt;br />&lt;br />&lt;pre>$ ./test&lt;br />ii= 5 ff= 5.500&lt;/pre>&lt;br />&lt;br />Aceito sugestões, agora que não tenho muita coisa para fazer em Fortran.&lt;/div></description></item><item><title>Mono: C# no Linux</title><link>http://pacman.blog.br/blog/2007/07/02/mono-c-no-linux/</link><pubDate>Mon, 02 Jul 2007 11:33:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/mono-c-no-linux/</guid><description>&lt;div class='post'>
Considere este simples código:&lt;br />&lt;br />&lt;pre>&lt;code>using System;&lt;br />&lt;br />class MainClass {&lt;br />&lt;br /> public static void Main() {&lt;br /> Console.WriteLine("Eu sou um programa feito em C#");&lt;br /> Console.ReadLine();&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Tcharam: um &lt;span style="font-style:italic;">hello world&lt;/span> que, no mundo MS, seria compilado no Visual Studio após alguns segundos de espera. Para plataformas abertas, podemos usar o &lt;a href="http://www.mono-project.com/">Mono&lt;/a>:&lt;br />&lt;br />&lt;pre>$ uname&lt;br />Linux&lt;br />$ mcs Example.cs # Mono Compiler Suite&lt;br />$ mono Example.exe # Mono's ECMA-CLI native code generator&lt;br />Eu sou um programa feito em C#&lt;br />[enter]&lt;br />$ &lt;/pre>&lt;br />&lt;br />Independente de &lt;span style="font-style:italic;">Ideologias&lt;/span>, C# é uma linguagem interessante e seu uso está cada vez mais comum. Para quem não quer ficar fora do mercado de trabalho, o mono pode ser uma ótima oportunidade para praticar. O site java2s possui um &lt;a href="http://www.java2s.com/Tutorial/CSharp/CatalogCSharp.htm">tutorial interessante&lt;/a> para os curiosos.&lt;/div></description></item><item><title>Youtube Downloader</title><link>http://pacman.blog.br/blog/2007/07/02/youtube-downloader/</link><pubDate>Mon, 02 Jul 2007 10:26:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/02/youtube-downloader/</guid><description>&lt;div class='post'>
Cerca de um ano atras eu pesquisei uma forma de fazer o download automatico de videos do youtube informando o id ou a url inteira. Ele é bem didático, basta ser um pouco nerd e conhecer um pouco de expressões regulares (alias o livro do Aurelio está em &lt;a href="http://aurelio.wordpress.com/2007/06/28/descontao-livro-saindo-por-menos-de-20-reais/">promoção&lt;/a>).&lt;br />&lt;br />Minha inspiração para postar este script veio desta &lt;a href="http://br-linux.org/linux/videos-do-youtube-no-lynx-em-ascii">notícia&lt;/a>, onde Warren Harding baixou um vídeo usando o Lynx e usou o Mplayer para exibir o vídeo no modo &lt;span style="font-style:italic;">ASCII&lt;/span>. O resultado é insano, porém divertido.&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br /># youtube downloader&lt;br /># usage: script &lt;url or video_id>&lt;br /># YouTube URL: http://www.youtube.com/watch?v=[video_id] &lt;br />&lt;br />[ -z "${1}" ] &amp;&amp; { echo 'Error! Missing url or video_id!' ; exit 1 ; }&lt;br />&lt;br />URL="http://www.youtube.com"&lt;br />&lt;br /># download link: http://youtube.com/get_video?video_id=[video_id]&amp;t=[t_id]&amp;...&lt;br />&lt;br />DOWNLOAD=`wget -qO - "${URL}/watch?v=${1/*=}" | grep -oE 'video_id=.*&amp;t=[^\"&amp;]*' | head -1`&lt;br />&lt;br />wget -O "${1/*=}.flv" "${URL}/get_video?${DOWNLOAD}"&lt;/code>&lt;/pre>&lt;br />&lt;br />Eu poderia ter feito tudo em uma unica linha usando xargs, porém ficaria um pouco poluído para publicar neste humilde blog, mas fica aí a dica.&lt;/div></description></item><item><title>Classificação do Brasileiro via Shell Script</title><link>http://pacman.blog.br/blog/2007/06/25/classificao-do-brasileiro-via-shell/</link><pubDate>Mon, 25 Jun 2007 14:07:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/25/classificao-do-brasileiro-via-shell/</guid><description>&lt;div class='post'>
Querendo saber a classificação do seu time no campeonato brasileiro de 2007.&lt;br />&lt;br />O bom e velho &lt;b>lynx + grep&lt;/b> resolve.&lt;br />&lt;br />&lt;pre>&lt;code>$ URL=http://esportes.terra.com.br/futebol/brasileiro2007/classificacao/&lt;br />$ lynx --dump ${URL} | grep '%'&lt;br />&lt;br /> Colocação Time PG J V E D GP GC SG %&lt;br /> 1º Botafogo 17 7 5 2 0 18 7 11 81%&lt;br /> 2º Paraná 14 7 4 2 1 14 9 5 67%&lt;br /> 3º São Paulo 13 7 4 1 2 7 2 5 62%&lt;br /> 4º Goiás 12 7 4 0 3 13 9 4 57%&lt;br /> Fluminense 12 7 3 3 1 11 6 5 57%&lt;br /> Corinthians 12 6 3 3 0 7 2 5 67%&lt;br /> 7º Atlético-PR 11 7 3 2 2 12 10 2 52%&lt;br /> Atlético-MG 11 7 3 2 2 11 9 2 52%&lt;br /> Vasco 11 7 3 2 2 11 10 1 52%&lt;br /> 10º Cruzeiro 10 7 3 1 3 16 15 1 48%&lt;br /> Figueirense 10 7 3 1 3 13 14 -1 48%&lt;br /> 12º Grêmio 9 7 3 0 4 5 12 -7 43%&lt;br /> 13º Palmeiras 8 7 2 2 3 9 12 -3 38%&lt;br /> 14º Juventude 7 7 2 1 4 9 11 -2 33%&lt;br /> Internacional 7 7 2 1 4 8 12 -4 33%&lt;br /> Santos 7 7 2 1 4 7 11 -4 33%&lt;br /> 17º Flamengo 6 6 1 3 2 11 15 -4 33%&lt;br /> 18º Sport 5 7 1 2 4 9 13 -4 24%&lt;br /> Náutico 5 7 1 2 4 9 15 -6 24%&lt;br /> 20º América-RN 4 7 1 1 5 6 12 -6 19%&lt;/code>&lt;/pre>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
O link de 2007 tambem serve, o terra redireciona para o brasileirão atual :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>J. F. Mitre&lt;/div>
&lt;div class='content'>
O novo link para 2008 é:&lt;BR/>&lt;BR/>http://esportes.terra.com.br/futebol/brasileiro/2008/classificacao/&lt;BR/>&lt;BR/>funciona igualzinho ao anterior...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Alexandre&lt;/div>
&lt;div class='content'>
Bacana isso ( de mais um flamenguista -triste- por aqui).&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Julio&lt;/div>
&lt;div class='content'>
Isso serve para mostrar como o Shell tem mil-e-uma utilidades. Script simples e rápido.&lt;BR/>&lt;BR/>Legal Tiago, ficará melhor ainda qdo o &lt;B>mengão&lt;/B> estiver em 1o. lugar. :)&lt;BR/>&lt;BR/>Julio&lt;BR/>:wq&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>The Linux Documentation Project</title><link>http://pacman.blog.br/blog/2007/06/21/linux-documentation-project/</link><pubDate>Thu, 21 Jun 2007 23:37:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/21/linux-documentation-project/</guid><description>&lt;div class='post'>
Muitos guias, tutoriais e Howtos &lt;a href="http://tldp.org/guides.html">aqui&lt;/a>.&lt;br />&lt;br />O 'Advanced Bash-Scripting Guide' do Mendel Cooper merece destaque especial -- um livro excelente, assim como o 'Bash Guide for Beginners' do Machtelt Garrels e o 'Linux From Scratch' Gerard Beekmans.&lt;br />&lt;br />Pesquisando um pouco conseguimos ate encontrar o &lt;a href="http://br.tldp.org/projetos/howto/arquivos/html/Portuguese-HOWTO/Portuguese-HOWTO.pt_BR.html">Linux Portuguese-HOWTO&lt;/a> escrito em 1997 pelo &lt;a href="http://unixmania.blogspot.com">CaSantos&lt;/a>.&lt;br />&lt;br />Boa leitura!&lt;/div></description></item><item><title>Entrevista com Matthew Smith</title><link>http://pacman.blog.br/blog/2007/06/20/entrevista-com-matthew-smith/</link><pubDate>Wed, 20 Jun 2007 10:40:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/20/entrevista-com-matthew-smith/</guid><description>&lt;div class='post'>
Uma entrevista com o criador do "Maniac Miner" para ZX Spectrum&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/FWmmMZlhcqU">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/FWmmMZlhcqU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />Maniac Miner foi um grande sucesso na epoca. Percebam como o Matthew Smith ficou loucão depois de uma temporada na holanda tomando todo o tipo de drogas com o dinheiro ganho com os jogos.&lt;br />&lt;br />Agradecimentos ao Thielo por ter me mostrado o video.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>maykon&lt;/div>
&lt;div class='content'>
muito loko o cara;;;&lt;BR/>auauauaua&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>NUTS - Amendoins para Salvar Jericho!</title><link>http://pacman.blog.br/blog/2007/06/19/nuts-amendoins-para-salvar-jericho/</link><pubDate>Tue, 19 Jun 2007 12:09:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/19/nuts-amendoins-para-salvar-jericho/</guid><description>&lt;div class='post'>
Devido à baixa audiência, o canal CBS cancelou a série que conta o ponto de vista da pequena cidade de Jericho em um futuro próximo, onde um devastador ataque nuclear varre as principais cidades americanas. Muita paranóia, caos e personagens interessantes, temos ai um bom clima para uma série muito interessante e ousada.&lt;br />&lt;br />Seria mais um caso como tantas outras séries sendo canceladas se não fosse a persistencia dos fãs. Bem organizados, uma verdadeira chuva de emails, petições e campanhas foram organizadas, não dando tregua a CBS. Qualquer um poderia achar um exagero, afinal isso raramente dá certo.&lt;br />&lt;br />Entretanto mais de 7 toneladas de amendoins foram enviadas à CBS sob forma de protesto, graças ao site &lt;a href="http://www.nutsonline.com/jericho">Nuts on Line&lt;/a>. &lt;br />&lt;br />Nuts! Assim terminou a primeira temporada da série de TV americana Jericho (terminou de forma totalmente aberta, diga-se de passagem). Um termo, à principio sem sentido, é explicado pelo site &lt;a href="http://www.poltrona.tv/toneladas-de-amendoins-para-salvar-jericho/">Poltrona.tv&lt;/a>:&lt;br />&lt;br />&lt;cite>A frase "Nuts!" é atribuída ao general norte-americano Anthony Clement McAuliffe durante a II Guerra Mundial. Cercado por alemães ao fim da Batalha do Bulge, na França, McAuliffe soltou a frase sem nenhum sentido aparente para afirmar que não se renderia.&lt;/cite>&lt;br />&lt;br />Deu certo. A &lt;a href="http://www.aintitcool.com/node/32903">CBS encomendou 7 novos episódios&lt;/a> -- e existe a possibilidade da série continuar dependendo da audiência. Uma boa noticias aos fãs tão ousados e persistentes (ou, nas palavras da CBS: &lt;cite>P.S. Please stop sending us nuts &lt;/cite> ) &lt;br />&lt;br />Vamos torcer para que passe no Brasil logo!&lt;/div></description></item><item><title>Canivete Multifunções do Shell</title><link>http://pacman.blog.br/blog/2007/06/19/canivete-multifunes-do-shell/</link><pubDate>Tue, 19 Jun 2007 11:35:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/19/canivete-multifunes-do-shell/</guid><description>&lt;div class='post'>
O Aurelio (verde) levou algum tempo juntando excelentes dicas sobre shell script que podem ser vistas aqui: o famoso &lt;a href="http://www.aurelio.net/shell/canivete.html">Canivete Suiço do Shell&lt;/a>.&lt;br />&lt;br />Facil de consultar, é extremamente útil para qualquer administrador ou usuário experiente de algum sabor de *nix (ou mesmo no Windows, via Cygwin).&lt;/div></description></item><item><title>Bebendo da Fonte quando o assunto for WEB</title><link>http://pacman.blog.br/blog/2007/06/19/bebendo-da-fonte-quando-o-assunto-for/</link><pubDate>Tue, 19 Jun 2007 11:28:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/19/bebendo-da-fonte-quando-o-assunto-for/</guid><description>&lt;div class='post'>
Se existe um (bom) ponto de partida para todos os programandores e/ou web-designers no que diz respeito às principais tecnologias, siglas, formatos e padrões Web, este é o site do &lt;a href="http://www.w3schools.com/">w3schools&lt;/a>.&lt;br />&lt;br />Começando pelo extremamente simples &lt;a href="http://www.w3schools.com/html/default.asp">learn HTML&lt;/a>, podemos ver um pouco de Javascript, XML, Ajax e ate PHP e SQL. Muito útil e simples, fica aí a dica.&lt;/div></description></item><item><title>O Desenvolvimento da Linguagem C</title><link>http://pacman.blog.br/blog/2007/06/18/o-desenvolvimento-da-linguagem-c/</link><pubDate>Mon, 18 Jun 2007 16:30:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/18/o-desenvolvimento-da-linguagem-c/</guid><description>&lt;div class='post'>
Um texto cativante e histórico (por Dennis M. Ritchie): &lt;br />&lt;br />&lt;a href="http://cm.bell-labs.com/cm/cs/who/dmr/chistPT.html">http://cm.bell-labs.com/cm/cs/who/dmr/chistPT.html&lt;/a>&lt;br />&lt;br />a Linguagem C e o Sistema Operacional Unix foram revolucionários, trazendo conceitos usados até hoje. Qualquer um que queira se aventurar no mundo da informática, seja como hobbie ou profissão, tem que conhece-los ao menos um pouco.&lt;/div></description></item><item><title>Closures em Shell</title><link>http://pacman.blog.br/blog/2007/06/15/closures-em-shell/</link><pubDate>Fri, 15 Jun 2007 17:27:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/15/closures-em-shell/</guid><description>&lt;div class='post'>
Uma das coisas mais impressionantes (pelo menos para mim) da linguagem Ruby são os Closures:&lt;br />&lt;br />&lt;pre>&lt;code>$ ruby -e 'r=0...3 ; r.each { puts "oi"}&lt;br />oi&lt;br />oi&lt;br />oi&lt;/code>&lt;/pre>&lt;br />&lt;br />em um objeto do tipo Range eu tenho um método chamado each que recebe um bloco de código como argumento. Este bloco pode até ser parametrizado, por exemplo:&lt;br />&lt;br />&lt;pre>&lt;code>$ ruby -e 'r=0...3 ; r.each { |i| puts 2*i}'&lt;br />0&lt;br />2&lt;br />4&lt;/code>&lt;/pre>&lt;br />&lt;br />O que o metodo each faz é passar este bloco de código para 'dentro de si' e aplica-o em cada elemento do objeto 'range'. Pode ser para imprimir o resultado ou efetuar uma operação matemática, até mesmo substituindo um laço for simples. A verdade é que os Closures são bem mais do que isso e permitem fazer scripts bem interessantes.&lt;br />&lt;br />Sera que poderiamos ter o mesmo em BashScript ? Bem... vou simular aqui &lt;br />&lt;br />&lt;pre>&lt;code>$ each(){ &lt;br /> local F="${@}" &lt;br /> while read i ; do &lt;br /> set - $i &lt;br /> eval "${F}" &lt;br /> done &lt;br />}&lt;br />&lt;br />$ seq 3 | each '{ echo "encontrei $1" ; }'&lt;br />encontrei 1&lt;br />encontrei 2&lt;br />encontrei 3&lt;/code>&lt;/pre>&lt;br />&lt;br />Simples heim? Eu crio uma variavel local dentro de uma função e 'executo-a' para cada resultado via comando eval. Se este tipo de construção for util para alguem, fica aí a dica!&lt;/div></description></item><item><title>Avaliando Espaço em Disco</title><link>http://pacman.blog.br/blog/2007/06/13/avaliando-espao-em-disco/</link><pubDate>Wed, 13 Jun 2007 17:19:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/13/avaliando-espao-em-disco/</guid><description>&lt;div class='post'>
Um problema comum de qualquer administrador é o espaço em disco. As politicas de quotas geralmente resolvem boa parte destes problemas, é claro, mas nem sempre são suficientes.&lt;br />&lt;br />O caso: pensando de forma genérica, diversas pessoas criam diretórios de trabalho dentro do bom e velho/local e, com o passar do tempo, esta partição pode lotar e comprometer o trabalho de todos. Politicas de uso racional do espaço em disco podem ser aplicadas mas as vezes a coisa pode sair do controle -- nesse caso o prejuizo pode ser grande.&lt;br />&lt;br />Os diretorios possuem o seguinte formato:&lt;br />&lt;pre>/local/diretorio/algum_nome_identificador.vws&lt;/pre>&lt;br />&lt;br />Vamos recorrer ao bom e velho Shell-Script para investigar se existe algum problema em andamento!&lt;br />&lt;br />&lt;pre>$ df /local&lt;br />Filesystem 1K-blocks Used Available Use% Mounted on&lt;br />/dev/sdb1 35001508 11330452 21893064 35% /local&lt;/pre>&lt;br />&lt;br />Vejam só: apenas 35% da partição está sendo ocupada e isso não representa risco neste momento. Se estivesse acima de 80% alguma medida perventiva deveria ser tomada. Como podemos fazer este teste? Existem varias formas, vou usar o poder das expressões regulares para isso!&lt;br />&lt;br />&lt;pre>&lt;code>$ seq -f"%g%%" 10 5 100 | grep -E '(100|[89][0-9])%'&lt;br />&lt;br />80%&lt;br />85%&lt;br />90%&lt;br />95%&lt;br />100%&lt;/code>&lt;/pre>&lt;br />&lt;br />A expressão usada no grep casa com valores de porcentagem acima de 80% (inclusive), logo podemos usar em um teste simples&lt;br />&lt;br />&lt;pre>&lt;code> if df /local | grep -qE '(100|[89][0-9])%' ; then&lt;br /> echo '/local [quase] lotado!'&lt;br /> else&lt;br /> echo '/local seguro (menos de 80%)'&lt;br /> fi&lt;/code>&lt;/pre>&lt;br />&lt;br />Simples, não? Poderia ter usado os operadores &amp;&amp; e || mas não queria sacrificar a legibilidade do código.&lt;br />&lt;br />Agora vem a parte divertida: e se o /local estiver ficando cheio, vamos fazer o que?&lt;br />&lt;br />Quando vc não tem a responsabilidade de apagar arquivos desnecessários, o maximo que vc pode fazer é avisar os responsáveis. Elaborar um relatório com os 'problemas' encontrados e enviar por email usando shell script é simples.&lt;br />&lt;br />Vamos usar o du para calcular o espaço gasto em cada diretório e o sort para ordenar do maior para o menor tamanho total.&lt;br />&lt;br />&lt;pre>&lt;code>$ du -bs /local/diretorio/* 2>&amp;- | sort -nr &lt;br />3765643919 /local/diretorio/nonono001.vws&lt;br />2290883178 /local/diretorio/nonono002.vws&lt;br />2067295469 /local/diretorio/nonono003.vws&lt;br />932165874 /local/diretorio/nonono004.vws&lt;br />...&lt;br />267271 /local/viewstore1/nonono999.vws&lt;/code>&lt;/pre>&lt;br />&lt;br />Facil heim ? Se vc se dá ao trabalho de ler as man pages do du e do sort, basta fazer algumas experiências até obter o resultado que mais lhe agrada. Por exemplo, uma atitude interessante seria listar os X maiores diretórios e enviar por email para o administrador.&lt;br />&lt;br />&lt;pre>&lt;code>$ du -bs /local/diretorio/* 2>&amp;- | sort -nr | head -10 > /tmp/arquivo.log &lt;br />$ mailx -S "Lista dos 10 maiores diretorios" "administrador@server" &lt; /tmp/arquivo.log&lt;/code>&lt;/pre>&lt;br />&lt;br />Talvez vc pergunte o motivo pelo qual eu utilizo um arquivo temporário: caso o envio do email dê algum problema, é possivel recuperar a lista.&lt;br />&lt;br />Um script para rodar na cron e enviar o email de forma automatizada teria este formato:&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br /># Autor: Tiago Peczenyj - 13/jun/2007&lt;br /># Script parametrizado para avaliar tamanho de alguns diretorios&lt;br />&lt;br />X=10&lt;br />DIR=/local/diretorio&lt;br />EMAIL=administrador@server&lt;br />SUBJECT="Lista dos ${X} maiores diretorios em $(date +"%Y%m%d" )"&lt;br />if df ${DIR} | grep -qE '(100|[89][0-9])%' ; then&lt;br /> du -bs ${DIR}/* 2>&amp;- | sort -nr | head -${X} > /tmp/arquivo.log &lt;br /> mailx -S "${SUBJECT}" ${EMAIL} &lt; /tmp/arquivo.log&lt;br />fi&lt;/code>&lt;/pre>&lt;br />&lt;br />O script parece simples, entretanto algo simples como informar o usuario dono de cada diretório é muito mais complexo. A minha solução foi esta:&lt;br />&lt;br />&lt;code>&lt;pre>paste -d '\t' &lt;(du -bs /local/viewstore1/* 2>&amp;-) \&lt;br />&lt;(ls -l /local/viewstore1 | awk '/^d/{print $3}') | awk '{&lt;br /> OFS="\t" ; print $1,$3,$2&lt;br />}'| sort -nr&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Utilidade Pública</title><link>http://pacman.blog.br/blog/2007/06/13/utilidade-pblica/</link><pubDate>Wed, 13 Jun 2007 13:25:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/13/utilidade-pblica/</guid><description>&lt;div class='post'>
Tirado do blog Gambiarra!&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/9ggf95Kp0Cs">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/9ggf95Kp0Cs" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />Uma utilíssima maquina de dobrar camisas!&lt;/div></description></item><item><title>Um Caracter Inconveniente</title><link>http://pacman.blog.br/blog/2007/06/12/um-caracter-inconveniente/</link><pubDate>Tue, 12 Jun 2007 17:19:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/12/um-caracter-inconveniente/</guid><description>&lt;div class='post'>
Não é incomum passar pelo problema de tentar apagar um arquivo cujo nome começa com o caracter '-', como no exemplo abaixo:&lt;br />&lt;br />&lt;pre>&lt;code>$ rm -arquivo.txt&lt;br />rm: invalid option -- a&lt;/code>&lt;/pre>&lt;br />&lt;br />Não adianta proteger a string pois não é o Shell que atrapalha a ação, e sim o próprio programa que reconhece o símbolo - de uma forma diferente. O programa &lt;span style="font-weight:bold;">rm&lt;/span> aceita, alem de uma lista de arquivos para apagar, uma série de opções que modificam o seu funcionamento. As mais comuns são:&lt;br />&lt;br />&lt;pre>&lt;code> -f ignore nonexistent files, never prompt&lt;br /> -i prompt before any removal&lt;br /> -r remove the contents of directories recursively&lt;br /> -v explain what is being done&lt;/code>&lt;/pre>&lt;br />&lt;br />As opções normalmente pode ser colocadas em qualquer lugar da lista de parâmetros.&lt;br />&lt;br />&lt;pre>&lt;code>$ rm -v a.out&lt;br />removed `a.out'&lt;br />&lt;br />$ rm a.out -v &lt;br />removed `a.out'&lt;/code>&lt;/pre>&lt;br />&lt;br />Quem avalia os parâmetros normalmente é uma função chamada getopt (presente em várias linguagens, inclusive no Bash). Bom, vimos que o - é um caracter especial para o getopt, mas existe alguma forma de &lt;span style="font-weight:bold;">burlar&lt;/span> isso?&lt;br />&lt;br />Sim! O proprio getopt prove essa funcionalidade: o uso dos simbolos '--'. Eles interrompem a expansão de parâmetros e tudo o que vier &lt;span style="font-weight:bold;">depois&lt;/span> desses dois caracteres será interpretado literalmente pelo programa.&lt;br />&lt;br />Assim sendo:&lt;br />&lt;br />&lt;pre>&lt;code>$ rm -v -- -arquivo.txt&lt;br />removed `-arquivo.txt'&lt;/code>&lt;/pre>&lt;br />&lt;br />Esta dica está no help do comando rm e vale para todos os programas que usem getopts.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>La Batalema Pitonisto&lt;/div>
&lt;div class='content'>
É Tiago,&lt;BR/>&lt;BR/>Nunca caí nessa do arquivo começado com sinal de menos, não por ser mais esperto que os outros, mas porque sou uma traça de manual. =)&lt;BR/>&lt;BR/>Basta um man rm para resolver o problema (foi o que fiz na primeira vez em que me deparei com um arquivo desses).&lt;BR/>&lt;BR/>Mas sabia que existe um livro que muitos chamam de «A Bíblia Negra do Hacker» (creio que a alcunha correta seria «o livreto negro de bolso do lammer»)? Esse livro apresenta a questão do «ataque» (ó! pretenção) onde o «atacante» (uf!) usa :> para criar arquivos começando com sinal de menos, cuja única forma de resolver o problema, segundo o livro, é mover todos os demais arquivos para outro diretório e apagar (argh!) o diretório onde estão os arquivos maliciosos.&lt;BR/>&lt;BR/>É de se escangalhar de rir&amp;hellip; um verdadeiro livreto de piadas sujas.&lt;BR/>&lt;BR/>[]'s&lt;BR/>Cacilhas&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Transformers</title><link>http://pacman.blog.br/blog/2007/06/12/transformers/</link><pubDate>Tue, 12 Jun 2007 14:58:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/12/transformers/</guid><description>&lt;div class='post'>
Estréia em Julho:&lt;br />&lt;br />&lt;object width="425" height="350">&lt;param name="movie" value="http://www.youtube.com/v/s7uXvqfQvNI">&lt;/param>&lt;param name="wmode" value="transparent">&lt;/param>&lt;embed src="http://www.youtube.com/v/s7uXvqfQvNI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350">&lt;/embed>&lt;/object>&lt;br />&lt;br />More Than Meet The Eyes!&lt;/div></description></item><item><title>Ola Mundo!</title><link>http://pacman.blog.br/blog/2007/06/11/ola-mundo/</link><pubDate>Mon, 11 Jun 2007 16:42:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/11/ola-mundo/</guid><description>&lt;div class='post'>
Quando aprendemos uma nova linguagem de programação, normalmente o primeiro exemplo é o famoso "Hello World!", ou seja, um pequeno código que imprime uma mensagem na tela do computador.&lt;br />&lt;br />Em C, ele seria assim:&lt;br />&lt;br />&lt;pre>&lt;code>/* Um comentário */&lt;br />#include &amp;lt;stdio.h&amp;gt;&lt;br />&lt;br />int main ()&lt;br />{&lt;br /> puts ("Hello world!");&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />As vezes o &lt;span style="font-weight:bold;">puts&lt;/span> é substituido pelo multifacetado &lt;span style="font-weight:bold;">printf&lt;/span> no exemplo, mas o efeito é o mesmo. Vejamos como seria em Java.&lt;br />&lt;br />&lt;pre>&lt;code>/* Comentarios, igual ao C */&lt;br />package Hello;&lt;br />&lt;br />public class HelloWorld {&lt;br /> public static void main(String[] args) {&lt;br /> System.out.println("Hello world");&lt;br /> }&lt;br /> }&lt;/code>&lt;/pre>&lt;br />&lt;br />As diferenças são várias, apesar da estrutura ser semelhante. Em C nós temos funções parametrizadas, enquanto em Java nós temos objetos (System.out) e métodos (println). &lt;br />&lt;br />Por fim, vamos ver um exemplo em Shell Script&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br /># comentario&lt;br />echo "Hello World!"&lt;/code>&lt;/pre>&lt;br />&lt;br />Diferente de uma linguagem de programação, aqui o interpretador de comandos (normalmente) chama um programa capaz de escrever mensagens para o usuario. Ou seja, alguem ja escreveu um "Hello World!" genérico o suficiente para nós. &lt;br />&lt;br />Cada linguagem possui um propósito. Enquanto vc projeta sistemas operacionais e drivers em C, Java ocupa uma área no desenvolvimento de grandes sistemas corporativos enquanto o shell está presente na administração de determinadas tarefas de um servidor (normalmente rodando algum sabor de *nix). &lt;br />&lt;br />Não basta comparar um hello world, pois é preciso ver muito além da sintaxe e recursos da linguagem, mas normalmente se começa por ele.&lt;br />&lt;br />Outros exemplos podem ser encontrados &lt;a href="http://www.roesler-ac.de/wolfram/hello.htm">aqui&lt;/a>.&lt;br />&lt;br />Abraços&lt;/div></description></item></channel></rss>