<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2122907654784586589</id><updated>2011-11-27T21:55:39.862-03:00</updated><category term='Help'/><category term='Cygwin'/><category term='C'/><category term='Programacao'/><category term='Brasil'/><category term='Vagas'/><category term='Security'/><category term='futebol'/><category term='sed'/><category term='Shell'/><category term='awk'/><category term='Bope'/><category term='TDD'/><category term='msn'/><category term='Chrome'/><category term='PortoAlegre'/><category term='Mono'/><category term='rs'/><category term='Testes'/><category term='Funny'/><category term='Tchelinux'/><category term='Western'/><category term='flisol'/><category term='jabber'/><category term='Javascript'/><category term='globo.com'/><category term='Jobs'/><category term='HQs'/><category term='XML'/><category term='Perl'/><category term='Amor'/><category term='Se-Arrependimento-Matasse'/><category term='Java'/><category term='FISL'/><category term='Gabeira43'/><category term='Rj'/><category term='Fortran'/><category term='off-topic'/><category term='jericho'/><category term='Ruby'/><category term='Linux'/><category term='twitter'/><category term='Filhos'/><category term='Messias'/><category term='Punk'/><category term='Nerd'/><category term='Politica'/><category term='Ceticismo'/><category term='open-source'/><category term='Erlang'/><title type='text'>O Peczenyj</title><subtitle type='html'>varias coisas</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default?start-index=101&amp;max-results=100'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>153</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5985165688726484508</id><published>2009-01-03T15:22:00.002-03:00</published><updated>2009-01-03T15:24:33.574-03:00</updated><title type='text'>Mudando de endereço</title><content type='html'>Foram centenas de posts desde que comecei a usar o blogspot como valvula de escape.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Atualizem os seus feeds: &lt;a href="http://pacman.blog.br"&gt;pacman.blog.br&lt;/a&gt;, estou desativando este site. Obrigado a todos pela audiência :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5985165688726484508?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5985165688726484508/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5985165688726484508' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5985165688726484508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5985165688726484508'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2009/01/mudando-de-endereo.html' title='Mudando de endereço'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3046085458547185169</id><published>2008-12-22T13:44:00.003-03:00</published><updated>2008-12-22T13:50:32.918-03:00</updated><title type='text'>Novas Distribuições Linux</title><content type='html'>Diariamente eu leio noticias sobre novas distribuições, brasileiras ou internacionais.&lt;br /&gt;&lt;br /&gt;Até que ponto isso é &lt;span style="font-style:italic;"&gt;realmente&lt;/span&gt; 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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3046085458547185169?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3046085458547185169/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3046085458547185169' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3046085458547185169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3046085458547185169'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/12/novas-distribuies-linux.html' title='Novas Distribuições Linux'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5352660677001069485</id><published>2008-11-24T18:26:00.004-03:00</published><updated>2008-11-24T19:11:48.444-03:00</updated><title type='text'>Tirando o Mofo</title><content type='html'>Fiquei uns dias sem postar, hehe.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Nesse tempo também participei de alguns eventos legais, a começar pelo &lt;a href="http://www.temporealeventos.com.br/?area=116"&gt;workshop de design patterns&lt;/a&gt; ministrado pelo &lt;a href="http://www.bruceeckel.com/"&gt;Bruce Eckel&lt;/a&gt; (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/"&gt;Coding Dojo&lt;/a&gt; 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 /&gt;&lt;br /&gt;Também participei da &lt;a href="http://pyconbrasil.com.br/"&gt;PyConBrasil 2008&lt;/a&gt;. 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 /&gt;&lt;br /&gt;Outro evento sensacional foi o workshop de &lt;a href="http://blog.fragmental.com.br/2008/10/08/domain-driven-design-agile-fechando-malas/"&gt;Domain-Driven Design&lt;/a&gt; ministrado pelo Philip Calçado na &lt;a href="http://www.caelum.com.br/"&gt;Caelum/RJ&lt;/a&gt;. 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 /&gt;&lt;br /&gt;Sabado passado começou o curso on-line e intensivo de &lt;a href="http://blog.egenial.com.br/?p=192"&gt;BDD on Rails com RSpec&lt;/a&gt; ministrado pelo &lt;a href="http://www.dtsato.com/"&gt;Danilo Sato&lt;/a&gt; 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 /&gt;&lt;br /&gt;Estou preparando outros posts, devo atualizar este blog em breve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5352660677001069485?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5352660677001069485/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5352660677001069485' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5352660677001069485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5352660677001069485'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/11/tirando-o-mofo.html' title='Tirando o Mofo'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3467721319634739977</id><published>2008-10-24T10:02:00.003-03:00</published><updated>2008-10-24T10:10:59.844-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gabeira43'/><title type='text'>Fear, uncertainty and doubt</title><content type='html'>Fear, uncertainty and doubt (ou simplesmente &lt;a href="http://en.wikipedia.org/wiki/FUD_factor"&gt;FUD&lt;/a&gt;) 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 /&gt;&lt;br /&gt;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"&gt;Aqui&lt;/a&gt; e &lt;a href="http://porumbrasildecente.blogspot.com/2008/10/mais-um-boato-da-campanha-de-paes.html"&gt;aqui&lt;/a&gt; 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 /&gt;&lt;br /&gt;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"&gt;desse tipo&lt;/a&gt;, mas que não acrescentam nada. &lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3467721319634739977?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3467721319634739977/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3467721319634739977' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3467721319634739977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3467721319634739977'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/10/fear-uncertainty-and-doubt.html' title='Fear, uncertainty and doubt'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2467375866702298231</id><published>2008-10-07T14:06:00.003-03:00</published><updated>2008-10-07T14:08:03.485-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='rs'/><category scheme='http://www.blogger.com/atom/ns#' term='open-source'/><category scheme='http://www.blogger.com/atom/ns#' term='msn'/><title type='text'>Policia do RS usa MSN</title><content type='html'>Pelo que eu vejo nesse &lt;a href="http://g1.globo.com/Noticias/Brasil/0,,MUL787936-5598,00.html"&gt;link&lt;/a&gt;, a Policia do RS está utilizando o MSN, que é um messenger bem comum hoje em dia, para receber chamados de socorro.&lt;br /&gt;&lt;br /&gt;Com protocolos livres como o Jabber e clientes livres como o Pidgin, sera que uma alternativa mais barata e eficiente não poderia ser desenhada?&lt;br /&gt;&lt;br /&gt;Da forma como é hoje, um serviço de segurança esta nas mãos de software/serviço e protocolo proprietário e &lt;strong&gt;fechado&lt;/strong&gt;, e isso me preocupa como cidadão!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2467375866702298231?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2467375866702298231/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2467375866702298231' title='12 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2467375866702298231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2467375866702298231'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/10/policia-do-rs-usa-msn.html' title='Policia do RS usa MSN'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5701606562778695809</id><published>2008-09-02T16:48:00.007-03:00</published><updated>2008-09-03T11:33:07.875-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><title type='text'>Chrome: o browser da google</title><content type='html'>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 /&gt;&lt;br /&gt;Até um &lt;a href="http://www.google.com/googlebooks/chrome/"&gt;gibi&lt;/a&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697182/" title="primeira_impressao by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3226/2822697182_2d26579398.jpg" width="500" height="374" alt="primeira_impressao" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bem interessante é o gerenciador de tarefas, (Controlar Pagina Atual &gt; Desenvolvedor) onde podemos ver o consumo de cpu, memória e rede de cada aba (que rodam como processos independentes).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697178/" title="gerenciador_tarefas by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3040/2822697178_a150abe1fc.jpg" width="500" height="377" alt="gerenciador_tarefas" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697176/" title="chrome_memory by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3048/2822697176_fbbb8e2688.jpg" width="500" height="374" alt="chrome_memory" /&gt;&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;O histórico é limpo e muito bonito&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697170/" title="chrome_historico by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3099/2822697170_3f5a9469a0.jpg" width="500" height="376" alt="chrome_historico" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697164/" title="chrome_abas by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3114/2822697164_05a9ce10db.jpg" width="500" height="377" alt="chrome_abas" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por fim, basta instalar com um clique o plugin flash para navegar no Youtube ou Globo Videos&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822697168/" title="chrome_globo_videos by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3036/2822697168_242b7a4e5d.jpg" width="500" height="374" alt="chrome_globo_videos" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Link para download: &lt;a href="http://gears.google.com/chrome"&gt; http://gears.google.com/chrome &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Edit: o Chrome tem o mesmo problema que o Firefox tinha para gerenciar senhas: ele mostra a senha sem pudor algum:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/25513475@N05/2822070365/" title="Senhas by grande_uosh, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3268/2822070365_c3594ac41b.jpg" width="500" height="390" alt="Senhas" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Poderia ter um recurso mais seguro como o da &lt;a href="http://br.mozdev.org/firefox/senha-mestra"&gt;senha mestra&lt;/a&gt; do Firefox, parece que não pensaram (tanto) na nossa privacidade. Quem sabe no futuro isso não será corrigido?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5701606562778695809?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5701606562778695809/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5701606562778695809' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5701606562778695809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5701606562778695809'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/09/chrome-o-browser-da-google.html' title='Chrome: o browser da google'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3226/2822697182_2d26579398_t.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6768639413465431018</id><published>2008-08-29T21:13:00.003-03:00</published><updated>2008-08-29T21:18:29.487-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='globo.com'/><title type='text'>Despedida do Antonio</title><content type='html'>Esta foi a ultima semana do &lt;a href="http://www.acarlos.com.br/blog"&gt;Antonio&lt;/a&gt; na &lt;a href="http://videos.globo.com"&gt;globo.com&lt;/a&gt;. A despedida foi em grande estilo, com direito a galeria gourmet. Fica o exemplo e a saudade desse grande colega.&lt;br /&gt;&lt;br /&gt;Em clima de festa com direito a montinho e tudo:&lt;br /&gt;&lt;object width="425" height="319"&gt;&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" &gt;&lt;/param&gt;&lt;param name="wmode" value="transparent" &gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always" &gt;&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"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Fico feliz por ter surpreendido do Antonio nesses poucos meses que trabalhei com ele, agora os desafios são outros (aka Expurgo...)!&lt;br /&gt;&lt;br /&gt;Toninho, boa sorte no Yahoo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6768639413465431018?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6768639413465431018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6768639413465431018' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6768639413465431018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6768639413465431018'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/despedida-do-antonio.html' title='Despedida do Antonio'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4993499254355869053</id><published>2008-08-25T13:11:00.005-03:00</published><updated>2008-08-25T15:57:28.898-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>SQL Injection - A fina arte de criar paginas realmente inseguras</title><content type='html'>Este post diz tudo:&lt;br /&gt;&lt;img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"/&gt;&lt;br /&gt;&lt;br /&gt;Por mais que existam alertas sobre os perigos de &lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL Injection&lt;/a&gt;, 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 /&gt;&lt;br /&gt;Uma das primeiras coisas que aprendi quando trabalhava como testador foi tentar este código em telas de login:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;' or '1' ='1&lt;code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Imagine que o impacto dessa belezinha em uma query como esta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;"SELECT USUARIO FROM TABELA WHERE USUARIO = '" + usuario + "' AND SENHA = '" + senha + "'"&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;temos, então:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;SELECT USUARIO FROM TABELA WHERE USUARIO = 'qqCoisa' AND SENHA = '' or '1' ='1'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Consegui efetuar o login devido a extrema &lt;b&gt;preguiça&lt;/b&gt; do desenvolvedor que nunca se interessou em estudar um pouco de segurança, muito menos sabe o que é um &lt;b&gt;prepared statement&lt;/b&gt;. Isso no melhor dos casos, posso querer inserir um DROP TABLE da vida facilmente, pois o sistema está, literalmente, de pernas abertas.&lt;br /&gt;&lt;br /&gt;Recentemente um colega testou esse tipo de ataque contra um site de uma &lt;span style="font-style:italic;"&gt;instituição&lt;/span&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Se o seu site não pode receber aspas simples, duplas ou %, tenha MUITO medo, pois alguem VAI fazer algo em breve...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4993499254355869053?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4993499254355869053/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4993499254355869053' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4993499254355869053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4993499254355869053'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/sql-injection.html' title='SQL Injection - A fina arte de criar paginas realmente inseguras'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6923756168774000729</id><published>2008-08-11T10:48:00.003-03:00</published><updated>2008-08-11T11:46:17.309-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Closures em Java - Parte 2</title><content type='html'>Ainda sobre a Closures do java 7, agora será possivel fazer isso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class A {&lt;br /&gt;        public static void main(String args[]) {&lt;br /&gt;            @Shared int acumulador = 0;&lt;br /&gt;&lt;br /&gt;            {int =&gt; int } xxx  = { int i =&gt;  acumulador += i; i};&lt;br /&gt;&lt;br /&gt;            System.out.println(xxx.invoke(1));&lt;br /&gt;            System.out.println(xxx.invoke(2));&lt;br /&gt;            System.out.println(xxx.invoke(3));&lt;br /&gt;            System.out.println("o valor do acumulador eh " + acumulador );&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Só eu estou achando divertido?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html"&gt;http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6923756168774000729?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6923756168774000729/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6923756168774000729' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6923756168774000729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6923756168774000729'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/closures-em-java-parte-2.html' title='Closures em Java - Parte 2'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6896270126294254188</id><published>2008-08-08T19:23:00.003-03:00</published><updated>2008-08-08T19:26:03.455-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Closures em Java</title><content type='html'>Olha o que vai ter no java 1.7&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class A {&lt;br /&gt;        public static void main(String args[]) {&lt;br /&gt;                exec( { int a, int b =&gt; a + b });&lt;br /&gt;                exec( { int a, int b =&gt; a * b });&lt;br /&gt;                exec( { int a, int b =&gt; &lt;br /&gt;                        System.out.println("closure " + a + ":" + b); &lt;br /&gt;                        (a * a) + (b * b) &lt;br /&gt;                });&lt;br /&gt;        }&lt;br /&gt;        public static void exec({ int, int =&gt; int } closure){&lt;br /&gt;                System.out.println(closure.invoke(3,2));&lt;br /&gt;        }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ java -Xbootclasspath/p:./closures-2008-08-04/lib/closures.jar   A&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;closure 3:2&lt;br /&gt;13&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Divertido :)&lt;br /&gt;&lt;br /&gt;Fonte:&lt;br /&gt;&lt;a href="http://guj.com.br/posts/list/99477.java"&gt;http://guj.com.br/posts/list/99477.java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6896270126294254188?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6896270126294254188/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6896270126294254188' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6896270126294254188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6896270126294254188'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/closures-em-java.html' title='Closures em Java'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-397922964124393565</id><published>2008-08-08T15:01:00.002-03:00</published><updated>2008-08-08T15:05:21.689-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Parsing de XML na linguagem ABC</title><content type='html'>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 /&gt;&lt;br /&gt;Eis um bom começo:&lt;br /&gt;&lt;a href=="http://www.w3schools.com/xml/default.asp"&gt;http://www.w3schools.com/xml/default.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Acho que nenhuma linguagem tem mais variações sobre o mesmo tema que Java: http://guj.com.br/artigos.jsp#87031&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-397922964124393565?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/397922964124393565/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=397922964124393565' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/397922964124393565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/397922964124393565'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/parsing-de-xml-na-linguagem-abc.html' title='Parsing de XML na linguagem ABC'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5945045853723100931</id><published>2008-08-08T14:29:00.001-03:00</published><updated>2008-08-08T14:30:50.456-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Testable &amp; Untestable Code</title><content type='html'>Leitura recomendada:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/"&gt;http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.testingreflections.com/node/view/7221"&gt;http://www.testingreflections.com/node/view/7221&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5945045853723100931?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5945045853723100931/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5945045853723100931' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5945045853723100931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5945045853723100931'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/testable-untestable-code.html' title='Testable &amp; Untestable Code'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6463792218628609749</id><published>2008-08-07T18:40:00.005-03:00</published><updated>2008-08-07T18:55:55.309-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Western'/><title type='text'>The Good, the Bad and the Ugly</title><content type='html'>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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hVnoaPPpWog&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&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"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;- "When you have to shoot, shoot. Don’t talk!"&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6463792218628609749?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6463792218628609749/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6463792218628609749' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6463792218628609749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6463792218628609749'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/good-bad-and-ugly.html' title='The Good, the Bad and the Ugly'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6530357360545344552</id><published>2008-08-07T17:43:00.003-03:00</published><updated>2008-08-07T18:05:00.558-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Voltas às Aulas e o Java - parte 2</title><content type='html'>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 /&gt;&lt;br /&gt;Vejamos: &lt;br /&gt;1) O número de faltas é acima do permitido?. Aqui entra um &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; dos bons com uma comparação numérica, quando um número é maior ou igual a outro.&lt;br /&gt;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 /&gt;&lt;br /&gt;Uma forma de fazer é:&lt;br /&gt;&lt;code&gt; if( numero_de_faltas &amp;gt; maximo_de_faltas_toleradas) {&lt;br /&gt;   // reprovado por faltas&lt;br /&gt;} else if ( media_do_aluno &amp;lt; media_para_passar ){&lt;br /&gt;  // reprovado por nota&lt;br /&gt;} &lt;br /&gt;// se nem um nem outro, esta aprovado&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;code&gt; if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /&gt;   // aprovado!&lt;br /&gt;} else {&lt;br /&gt;  // reprovado!&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;É claro que eu posso que eu posso querer saber o motivo pelo qual o aluno foi reprovado:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /&gt;   // aprovado!&lt;br /&gt;} else if(numero_de_faltas &amp;gt; maximo_de_faltas_toleradas){&lt;br /&gt;   // reprovado pelo número de faltas: ignoro a média.&lt;br /&gt;} else {&lt;br /&gt;  // aqui só sobra a reprovação por nota, &lt;br /&gt;  // basta fazer a tabela-verdade dessas expressões&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6530357360545344552?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6530357360545344552/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6530357360545344552' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6530357360545344552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6530357360545344552'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/voltas-s-aulas-e-o-java-parte-2.html' title='Voltas às Aulas e o Java - parte 2'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-940923799551181864</id><published>2008-08-06T15:05:00.006-03:00</published><updated>2008-08-06T15:51:49.598-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Algumas pessoas PRECISAM fazer programas interativos</title><content type='html'>Este código:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv){&lt;br /&gt;        int i;&lt;br /&gt;        double total =0;&lt;br /&gt;&lt;br /&gt;        for(i=1;i &amp;lt; argc;i++){&lt;br /&gt;            total = total + atof(argv[i]);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        printf("A soma dos %d parametros eh %f\n",(argc - 1),total);&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;É 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 /&gt;&lt;br /&gt;&lt;pre&gt;$ gcc -Wall soma.c&lt;br /&gt;$ ./a.out 1 2 3 4 5&lt;br /&gt;A soma dos 5 parametros eh 15.000000&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Não é mais facil assim do que fazer milhões de menus? Nem precisa de system("pause") system("cls")!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-940923799551181864?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/940923799551181864/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=940923799551181864' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/940923799551181864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/940923799551181864'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/algumas-pessoas-precisam-fazer.html' title='Algumas pessoas PRECISAM fazer programas interativos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3335619123710704402</id><published>2008-08-06T14:31:00.008-03:00</published><updated>2008-08-06T15:22:30.070-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Test Driven Development - parte 1.</title><content type='html'>Veja este código:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt; public void testEhPar() throws Exception{&lt;br /&gt;  assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /&gt;  assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /&gt;  assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /&gt;  &lt;br /&gt;  assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /&gt;  assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /&gt;  assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5));  &lt;br /&gt; }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dentro de uma classe de teste, usando o framework &lt;a href="http://junit.sourceforge.net/#Getting"&gt;JUnit&lt;/a&gt;, a leitura dessas linhas é a seguinte:&lt;br /&gt;&lt;br /&gt;Eu tenho um objeto chamado &lt;span style="font-style:italic;"&gt;algortimo&lt;/span&gt;.&lt;br /&gt;A chamada algoritmo.ehPar(2) deve retornar &lt;span style="font-weight:bold;"&gt;true&lt;/span&gt;, pois 2 é par, e este método informa se o parâmetro informado é, ou não, par.&lt;br /&gt;O método &lt;span style="font-weight:bold;"&gt;assertTrue&lt;/span&gt; recebe dois parâmetros: uma mensagem informando o significado deste teste, e o resultado do mesmo.&lt;br /&gt;&lt;br /&gt;Se o método estivesse com algum problema e retornasse false, isso:&lt;br /&gt;&lt;br /&gt;assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /&gt;&lt;br /&gt;seria o mesmo que&lt;br /&gt;&lt;br /&gt;assertTrue("2 deve ser par",false);&lt;br /&gt;&lt;br /&gt;Logo, o teste falha, pois &lt;span style="font-weight:bold;"&gt;2 deve ser par&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Esta é uma forma &lt;span style="font-style:italic;"&gt;programática&lt;/span&gt; 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 /&gt;&lt;br /&gt;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="/2008/08/voltas-s-aulas-e-o-java.html"&gt;aqui&lt;/a&gt;, lembra?), eu posso pensar nos comportamentos esperados e, então, vou desenvolvendo até que todos os testes estejam passando.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;$ ant clean test&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;é muito mais rápido! &lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;No caso desse exemplo, esta é uma solução:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public boolean ehPar(int numero){&lt;br /&gt;      return numero % 2 == 0;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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/"&gt;Evite a otimização precoce&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Programar profissionalmente é uma tarefa de &lt;span style="font-weight:bold;"&gt;muita&lt;/span&gt; responsabilidade. Desenvolver testes para garantir a qualidade provê excelentes resultados a longo prazo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3335619123710704402?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3335619123710704402/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3335619123710704402' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3335619123710704402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3335619123710704402'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/test-driven-development-parte-1.html' title='Test Driven Development - parte 1.'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3359718916052396856</id><published>2008-08-06T14:19:00.004-03:00</published><updated>2008-08-06T15:21:04.491-03:00</updated><title type='text'>Trocar de Emprego</title><content type='html'>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 /&gt;&lt;br /&gt;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;"&gt;qualificada&lt;/span&gt;, 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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;"&gt;sempre&lt;/span&gt; caótico, veja isso com muito cuidado).&lt;br /&gt;&lt;br /&gt;O currículo precisa estar atualizado. Ja leu isto &lt;a href="http://info.abril.com.br/aberto/infonews/082008/06082008-25.shl"&gt;aqui&lt;/a&gt;? E &lt;a href="http://pythonologia.org/2007/06/07/desempregado-ou-despreparado/"&gt;isso&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Ps: &lt;a href="http://usabilidoido.com.br/como_vai_seu_ingles.html"&gt;como vai o seu inglês&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3359718916052396856?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3359718916052396856/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3359718916052396856' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3359718916052396856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3359718916052396856'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/trocar-de-emprego.html' title='Trocar de Emprego'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2381946913630836600</id><published>2008-08-04T12:20:00.005-03:00</published><updated>2008-08-08T20:50:52.278-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Voltas às Aulas e o Java</title><content type='html'>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;"&gt;while&lt;/span&gt; ou algum exercício sobre Fibonacci: eles não tentam, simplesmente colam o enunciado do problema esperando a resposta pronta.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;br /&gt;Exemplo pratico:&lt;br /&gt;&lt;br /&gt;- 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 /&gt;- 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 /&gt;- Crie a estrutura abaixo, ainda no diretório de trabalho:&lt;br /&gt;src/java&lt;br /&gt;src/test&lt;br /&gt;- Instale o aplicativo ant (de novo o google te ajuda, alias vc tem algum JDK instalado, certo??).&lt;br /&gt;- Crie um arquivo chamado build.xml no diretorio de trabalho.&lt;br /&gt;- 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 /&gt;&lt;br /&gt;Agora vem a proposta: baseado nessa interface:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public interface Algoritmo{&lt;br /&gt;/* dado um numero, retorna true se for par */        &lt;br /&gt;boolean ehPar(int numero);&lt;br /&gt;/* calcula o valor absoluto ou modulo de um numero, ex: -1 vira 1, 1 vira 1 */&lt;br /&gt;int calculaModulo(int numero);&lt;br /&gt;/* calcula algum termo da série de fibonacci: se 0, mostra o primeiro, se 1 mostra o segundo...*/&lt;br /&gt;int calculaFibonacci(int elemento);&lt;br /&gt;/* calcula o fatorial do numero indicado */&lt;br /&gt;long calculaFatorial(int numero);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;No diretorio src/test vc vai salvar esta classe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;public class AlgoritmoTeste extends TestCase{&lt;br /&gt; Algoritmo algoritmo;&lt;br /&gt; public void setUp(){&lt;br /&gt;  algoritmo = new SuaClasse();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void tearDown(){&lt;br /&gt;  algoritmo = null;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void testEhPar() throws Exception{&lt;br /&gt;  assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /&gt;  assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /&gt;  assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /&gt;  &lt;br /&gt;  assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /&gt;  assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /&gt;  assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5));  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void testCalculaModulo() throws Exception{&lt;br /&gt;  assertTrue("modulo de  3 deve ser 3",algoritmo.calculaModulo(3) == 3);&lt;br /&gt;  assertTrue("modulo de -3 deve ser 3",algoritmo.calculaModulo(-3) == 3);&lt;br /&gt;  assertTrue("modulo de  5 deve ser 5",algoritmo.calculaModulo(5) == 5);&lt;br /&gt;  assertTrue("modulo de -5 deve ser 5",algoritmo.calculaModulo(-5) == 5);  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void testCalculaFibonacci() throws Exception{&lt;br /&gt;  assertTrue("elemento  0 da serie fibonacci deve ser   0",algoritmo.calculaFibonacci(0) == 0);&lt;br /&gt;  assertTrue("elemento  1 da serie fibonacci deve ser   1",algoritmo.calculaFibonacci(1) == 1);&lt;br /&gt;  assertTrue("elemento  2 da serie fibonacci deve ser   1",algoritmo.calculaFibonacci(2) == 1);&lt;br /&gt;  assertTrue("elemento  3 da serie fibonacci deve ser   2",algoritmo.calculaFibonacci(3) == 2);  &lt;br /&gt;  assertTrue("elemento  4 da serie fibonacci deve ser   3",algoritmo.calculaFibonacci(4) == 3);&lt;br /&gt;  assertTrue("elemento  5 da serie fibonacci deve ser   5",algoritmo.calculaFibonacci(5) == 5);&lt;br /&gt;  assertTrue("elemento  6 da serie fibonacci deve ser   8",algoritmo.calculaFibonacci(6) == 8);&lt;br /&gt;  assertTrue("elemento  7 da serie fibonacci deve ser  13",algoritmo.calculaFibonacci(7) == 13);  &lt;br /&gt;  assertTrue("elemento 11 da serie fibonacci deve ser  89",algoritmo.calculaFibonacci(11) == 89);&lt;br /&gt;  assertTrue("elemento 13 da serie fibonacci deve ser 223",algoritmo.calculaFibonacci(13) == 233);  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void testCalculaFatorial() throws Exception{&lt;br /&gt;  assertTrue("Fatorial de  1 deve ser        1",algoritmo.calculaFatorial(1) == 1);&lt;br /&gt;  assertTrue("Fatorial de  2 deve ser        2",algoritmo.calculaFatorial(2) == 2);&lt;br /&gt;  assertTrue("Fatorial de  3 deve ser        6",algoritmo.calculaFatorial(3) == 6);&lt;br /&gt;  assertTrue("Fatorial de  4 deve ser       24",algoritmo.calculaFatorial(4) == 24);&lt;br /&gt;  assertTrue("Fatorial de  5 deve ser      120",algoritmo.calculaFatorial(5) == 120);&lt;br /&gt;  assertTrue("Fatorial de  6 deve ser      720",algoritmo.calculaFatorial(6) == 720);&lt;br /&gt;  assertTrue("Fatorial de 10 deve ser 3628800L",algoritmo.calculaFatorial(10) == 3628800L);  &lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Ok, vc tem a interface que vc deve respeitar e um arquivo de teste. Vamos falar do arquivo de build do ant.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;project name="Meu Projeto" basedir="." default="dist"&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;&lt;br /&gt;                Aprendendo a fazer um build.xml para o ant&lt;br /&gt;        &amp;lt;/description&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;property name="lib"   location="lib"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="src"   location="src/java"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="test"  location="src/test"/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;property name="build" location="build"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="dist"  location="dist"/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;path id="classpath.test"&amp;gt; &lt;br /&gt;                &amp;lt;pathelement location="${test}" /&amp;gt;&lt;br /&gt;                &amp;lt;pathelement location="${build}" /&amp;gt;&lt;br /&gt;                &amp;lt;pathelement location="${lib}/junit-4.4.jar" /&amp;gt;&lt;br /&gt;        &amp;lt;/path&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;target name="init"&amp;gt;&lt;br /&gt;                &amp;lt;!-- Create the time stamp --&amp;gt;&lt;br /&gt;                &amp;lt;tstamp/&amp;gt;&lt;br /&gt;                &amp;lt;!-- Create the build directory structure used by compile --&amp;gt;&lt;br /&gt;                &amp;lt;mkdir dir="${build}"/&amp;gt;&lt;br /&gt;        &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;target name="compile" depends="init" description="compile the source " &amp;gt;&lt;br /&gt;                &amp;lt;!-- Compile the java code from ${src} into ${build} --&amp;gt;&lt;br /&gt;                &amp;lt;javac srcdir="${src}" destdir="${build}"/&amp;gt;&lt;br /&gt;        &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;target name="dist" depends="compile" description="generate the distribution" &amp;gt;&lt;br /&gt;                &amp;lt;!-- Create the distribution directory --&amp;gt;&lt;br /&gt;                &amp;lt;mkdir dir="${dist}/lib"/&amp;gt;&lt;br /&gt;&lt;br /&gt;                &amp;lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&amp;gt;&lt;br /&gt;                &amp;lt;jar jarfile="${dist}/lib/Algortimo-${DSTAMP}.jar" basedir="${build}"/&amp;gt;&lt;br /&gt;        &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;target name="clean" description="clean up" &amp;gt;&lt;br /&gt;                &amp;lt;!-- Delete the ${build} and ${dist} directory trees --&amp;gt;&lt;br /&gt;                &amp;lt;delete dir="${build}"/&amp;gt;&lt;br /&gt;                &amp;lt;delete dir="${dist}"/&amp;gt;&lt;br /&gt;        &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;target name="test" depends="compile"&amp;gt;&lt;br /&gt;                &amp;lt;javac srcdir="${test}"&amp;gt;&lt;br /&gt;                        &amp;lt;classpath refid="classpath.test"/&amp;gt;&lt;br /&gt;                &amp;lt;/javac&amp;gt;&lt;br /&gt;                &amp;lt;junit&amp;gt;&lt;br /&gt;                        &amp;lt;classpath refid="classpath.test" /&amp;gt;&lt;br /&gt;                        &amp;lt;formatter type="brief" usefile="false" /&amp;gt;&lt;br /&gt;                        &amp;lt;test name="AlgoritmoTeste"/&amp;gt;&lt;br /&gt;                &amp;lt;/junit&amp;gt;&lt;br /&gt;        &amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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;"&gt;não&lt;/span&gt; quer.&lt;br /&gt;&lt;br /&gt;$ ant &lt;br /&gt;isso deve compilar a sua classe e gerar um jar (pode ser util no futuro).&lt;br /&gt;&lt;br /&gt;$ ant clean&lt;br /&gt;limpa os diretorios que vc acabou de criar com as suas paradas compiladas.&lt;br /&gt;&lt;br /&gt;$ ant test&lt;br /&gt;compila e executa os testes unítarios.&lt;br /&gt;&lt;br /&gt;É claro que vc vai dizer, e agora??? Bom, veja isso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class SuaClasse implements Algoritmo{&lt;br /&gt;        public boolean ehPar(int numero){return false;}&lt;br /&gt;        public int calculaModulo(int numero){ return -1;}&lt;br /&gt;        public int calculaFibonacci(int elemento){return -1;}&lt;br /&gt;        public long calculaFatorial(int numero){return -1;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Olha que legal! Uma classe que tem o minimo pra compilar! Agora vamos testar...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ant test&lt;br /&gt;Buildfile: build.xml&lt;br /&gt;&lt;br /&gt;init:&lt;br /&gt;    [mkdir] Created dir: /home/GLOBO.COM/peczenyj/test/junit/build&lt;br /&gt;&lt;br /&gt;compile:&lt;br /&gt;    [javac] Compiling 2 source files to /home/GLOBO.COM/peczenyj/test/junit/build&lt;br /&gt;&lt;br /&gt;test:&lt;br /&gt;    [javac] Compiling 1 source file&lt;br /&gt;    [junit] Testsuite: AlgoritmoTeste&lt;br /&gt;    [junit] Tests run: 4, Failures: 4, Errors: 0, Time elapsed: 0.005 sec&lt;br /&gt;    [junit] &lt;br /&gt;    [junit] Testcase: testEhPar(AlgoritmoTeste):        FAILED&lt;br /&gt;    [junit] 2 deve ser par&lt;br /&gt;    [junit] junit.framework.AssertionFailedError: 2 deve ser par&lt;br /&gt;    [junit]     at AlgoritmoTeste.testEhPar(Unknown Source)&lt;br /&gt;    [junit] &lt;br /&gt;    [junit] &lt;br /&gt;    [junit] Testcase: testCalculaModulo(AlgoritmoTeste):        FAILED&lt;br /&gt;    [junit] modulo de  3 deve ser 3&lt;br /&gt;    [junit] junit.framework.AssertionFailedError: modulo de  3 deve ser 3&lt;br /&gt;    [junit]     at AlgoritmoTeste.testCalculaModulo(Unknown Source)&lt;br /&gt;    [junit] &lt;br /&gt;    [junit] &lt;br /&gt;    [junit] Testcase: testCalculaFibonacci(AlgoritmoTeste):     FAILED&lt;br /&gt;    [junit] elemento  0 da serie fibonacci deve ser   0&lt;br /&gt;    [junit] junit.framework.AssertionFailedError: elemento  0 da serie fibonacci deve ser   0&lt;br /&gt;    [junit]     at AlgoritmoTeste.testCalculaFibonacci(Unknown Source)&lt;br /&gt;    [junit] &lt;br /&gt;    [junit] &lt;br /&gt;    [junit] Testcase: testCalculaFatorial(AlgoritmoTeste):      FAILED&lt;br /&gt;    [junit] Fatorial de  1 deve ser        1&lt;br /&gt;    [junit] junit.framework.AssertionFailedError: Fatorial de  1 deve ser        1&lt;br /&gt;    [junit]     at AlgoritmoTeste.testCalculaFatorial(Unknown Source)&lt;br /&gt;    [junit] &lt;br /&gt;    [junit] &lt;br /&gt;    [junit] Test AlgoritmoTeste FAILED&lt;br /&gt;&lt;br /&gt;BUILD SUCCESSFUL&lt;br /&gt;Total time: 1 second&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Enfim, eu seria um professor muito malvado }-)&lt;br /&gt;&lt;br /&gt;Não perca a parte 2 &lt;a href="/2008/08/voltas-s-aulas-e-o-java-parte-2.html"&gt;aqui&lt;/a&gt;, e uma introdução ao TDD &lt;a href="/2008/08/test-driven-development-parte-1.html"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2381946913630836600?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2381946913630836600/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2381946913630836600' title='11 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2381946913630836600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2381946913630836600'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/08/voltas-s-aulas-e-o-java.html' title='Voltas às Aulas e o Java'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7708148659508760464</id><published>2008-07-08T16:14:00.001-03:00</published><updated>2008-07-08T16:16:05.074-03:00</updated><title type='text'>Tor: Um sistema anónimo de comunicação na Internet</title><content type='html'>Pelo veto ao projeto de cibercrimes - Em defesa da liberdade e do progresso do conhecimento na Internet Brasileira&lt;br /&gt;&lt;br /&gt;http://www.petitiononline.com/veto2008/&lt;br /&gt;&lt;br /&gt;Se esta lei for aprovada, podemos fazer uso do Tor para navegar tranquilamente.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Fonte: http://www.torproject.org/index.html.pt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7708148659508760464?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7708148659508760464/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7708148659508760464' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7708148659508760464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7708148659508760464'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/07/tor-um-sistema-annimo-de-comunicao-na.html' title='Tor: Um sistema anónimo de comunicação na Internet'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6582954084042783163</id><published>2008-07-03T17:35:00.000-03:00</published><updated>2008-07-03T17:36:44.987-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funny'/><title type='text'>Sudo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/sandwich.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://imgs.xkcd.com/comics/sandwich.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6582954084042783163?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6582954084042783163/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6582954084042783163' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6582954084042783163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6582954084042783163'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/07/sudo.html' title='Sudo'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3577936648625866104</id><published>2008-06-19T15:15:00.002-03:00</published><updated>2008-06-19T15:19:09.362-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Erlang é dificil (parte 2)</title><content type='html'>Agora vamos usar as funções específicas para manipular listas.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;-module(tut).&lt;br /&gt;-export([generate/1]).&lt;br /&gt;&lt;br /&gt;%%&lt;br /&gt;%% Funcao generate(X)&lt;br /&gt;%% Quando X for 0, retorna [0]&lt;br /&gt;%% Quando X &gt; 0, retorna [X,X-1,...,0]&lt;br /&gt;%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br /&gt;%%&lt;br /&gt;generate(0) -&gt; [0];&lt;br /&gt;generate(L) when integer(L), L &gt; 0 -&gt; &lt;br /&gt;        lists:seq(0,L); % cria uma lista de 0 até L&lt;br /&gt;generate(L) when integer(L) -&gt; &lt;br /&gt;        % vamos reverter a lista?&lt;br /&gt;        lists:reverse(generate(-L)).&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Muito mais simples, certo? Veja o teste:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ erl&lt;br /&gt;Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Eshell V5.5.5  (abort with ^G)&lt;br /&gt;1&gt; c(tut). &lt;br /&gt;{ok,tut}&lt;br /&gt;2&gt; tut:generate(5) ++ tut:generate(-5).&lt;br /&gt;[0,1,2,3,4,5,5,4,3,2,1,0]&lt;br /&gt;3&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O operador ++ une 2 listas :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3577936648625866104?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3577936648625866104/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3577936648625866104' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3577936648625866104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3577936648625866104'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/06/erlang-dificil-parte-2.html' title='Erlang é dificil (parte 2)'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2878606424886049187</id><published>2008-06-18T19:10:00.002-03:00</published><updated>2008-06-18T19:26:15.525-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Erlang é dificil?</title><content type='html'>Erlang é realmente dificil?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;-module(tut).&lt;br /&gt;-export([generate/1]).&lt;br /&gt;&lt;br /&gt;%%&lt;br /&gt;%% Funcao generate(X)&lt;br /&gt;%% Quando X for 0, retorna [0]&lt;br /&gt;%% Quando X &gt; 0, retorna [X,X-1,...,0]&lt;br /&gt;%% Caso contrario retorna [0,1,2,...,abs(X)]&lt;br /&gt;%%&lt;br /&gt;generate(0) -&gt; [0];&lt;br /&gt;generate(L) when integer(L) -&gt; gera_lista(L).&lt;br /&gt;&lt;br /&gt;gera_lista(L) when L &amp;gt; 0 -&gt; gera_lista_direita(L);&lt;br /&gt;gera_lista(L) -&gt; gera_lista_inversa(-L).&lt;br /&gt;&lt;br /&gt;gera_lista_direita(L) -&gt; gera_lista_direita(L,[]).&lt;br /&gt;&lt;br /&gt;gera_lista_direita(-1,Z) -&gt; Z;&lt;br /&gt;gera_lista_direita( L,Z) -&gt; &lt;br /&gt;        %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /&gt;        gera_lista_direita(L - 1,[L | Z]).&lt;br /&gt;&lt;br /&gt;gera_lista_inversa(L) -&gt; gera_lista_inversa(L,[]).&lt;br /&gt;&lt;br /&gt;gera_lista_inversa(-1,Z) -&gt; Z;&lt;br /&gt;gera_lista_inversa( L,Z) -&gt; gera_lista_inversa(L,0,Z).&lt;br /&gt;&lt;br /&gt;gera_lista_inversa(-1,_,Z) -&gt; gera_lista_inversa(-1,Z);&lt;br /&gt;gera_lista_inversa( L,A,Z) -&gt; &lt;br /&gt;        %io:format("chamando: h(~p,~p,Z)~n",[L,A]), &lt;br /&gt;        h(L - 1, A + 1,[A | Z]).&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Fiz uma pequena função chamada generate, do modulo tut (de &lt;span style="font-style:italic;"&gt;tutorial&lt;/span&gt;, 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 /&gt;&lt;br /&gt;Veja só:&lt;br /&gt;&lt;pre&gt;$ erlc tut.erl   # compilando o modulo&lt;br /&gt;$ erl&lt;br /&gt;Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Eshell V5.5.5  (abort with ^G)&lt;br /&gt;1&gt; c(tut).           # carregando o modulo&lt;br /&gt;{ok,tut}&lt;br /&gt;2&gt; tut:generate(0).  # invocando modulo:funcao(parametros).&lt;br /&gt;[0]&lt;br /&gt;3&gt; tut:generate(10).&lt;br /&gt;[0,1,2,3,4,5,6,7,8,9,10]&lt;br /&gt;4&gt; tut:generate(-10).&lt;br /&gt;[10,9,8,7,6,5,4,3,2,1,0]&lt;br /&gt;5&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A função &lt;span style="font-weight:bold;"&gt;generate&lt;/span&gt; chama a função gera_lista se o parametro passado for um número inteiro.&lt;br /&gt;A função &lt;span style="font-weight:bold;"&gt;gera_lista&lt;/span&gt; chama a função para gerar a lista direita ou inversa, de acordo com o valor do parâmetro.&lt;br /&gt;&lt;br /&gt;Veja só a simplicidade:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;gera_lista_direita(L) -&gt; gera_lista_direita(L,[]).&lt;br /&gt;&lt;br /&gt;gera_lista_direita(-1,Z) -&gt; Z;&lt;br /&gt;gera_lista_direita( L,Z) -&gt; &lt;br /&gt;        %io:format("chamando: gera_lista_direita(~p,Z)~n",[L]),&lt;br /&gt;        gera_lista_direita(L - 1,[L | Z]).&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Ah sim, o google é seu amigo:&lt;br /&gt;&lt;br /&gt;http://www.dei.isep.ipp.pt/~paf/orgcdocs/Intro_Erlang.pdf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2878606424886049187?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2878606424886049187/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2878606424886049187' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2878606424886049187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2878606424886049187'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/06/erlang-dificil.html' title='Erlang é dificil?'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6444818668284104617</id><published>2008-06-18T15:15:00.002-03:00</published><updated>2008-06-18T15:21:02.070-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='futebol'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Tabela do Brasileirão 2008 com links + sed</title><content type='html'>O sed é um processador de texto muito versátil.&lt;br /&gt;&lt;br /&gt;O links é um browser modo texto com features tão interessantes quanto do antigo lynx.&lt;br /&gt;&lt;br /&gt;Ano passado eu &lt;a href="http://peczenyj.blogspot.com/2007/06/classificao-do-brasileiro-via-shell.html"&gt;postei&lt;/a&gt; como imprimir a tabela do brasileirão com um one liner interessante. Agora eu resolvi beber de outra fonte:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;TIME=Internacional&lt;br /&gt;COLOR=$(echo -ne '\e[31;1m&amp;\e[m')&lt;br /&gt;URL=http://globoesporte.globo.com/Esportes/Futebol/Classificacao/0,,ESP0-9827,00.html&lt;br /&gt;links --dump ${URL} | sed -r 's/\[[0-9]*\]//;/(^[0-9]|J jogos)/!d' | sed "s/${TIME}/${COLOR}/&lt;br /&gt;         1a-----Libertadores----------&lt;br /&gt;         4a-----Pre-Libertadores------&lt;br /&gt;         5a-----Sul-Americana---------&lt;br /&gt;        13a---------------------------&lt;br /&gt;        17a-----Rebaixado-------------"&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O resultado não é tão bom quanto o do ano passado, é verdade, mas não deixa de ser uma alternativa&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6444818668284104617?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6444818668284104617/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6444818668284104617' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6444818668284104617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6444818668284104617'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/06/tabela-do-brasileiro-2008-com-links-sed.html' title='Tabela do Brasileirão 2008 com links + sed'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3391315770964659746</id><published>2008-06-13T23:24:00.001-03:00</published><updated>2008-06-13T23:51:37.332-03:00</updated><title type='text'>Gerenciando Inovações</title><content type='html'>No ramo da tecnologia da informação, vulgo &lt;em&gt;informática&lt;/em&gt;, saber gerenciar inovações é uma &lt;em&gt;arte&lt;/em&gt;. 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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&gt;medo&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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"&gt;microsoft bob&lt;/a&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Medo de prejuizos. Principalmente se alguem lembrar &lt;strong&gt;muito&lt;/strong&gt;, ou &lt;strong&gt;pouco&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3391315770964659746?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3391315770964659746/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3391315770964659746' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3391315770964659746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3391315770964659746'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/06/blog-post.html' title='Gerenciando Inovações'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3272086785208055090</id><published>2008-05-28T18:17:00.008-03:00</published><updated>2008-05-28T18:44:37.264-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Pesquisando nos Grupos do Yahoo</title><content type='html'>Meu amigo MrBits me deu essa grande ideia:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;QTDE=20&lt;br /&gt;CHARSET=UTF-8&lt;br /&gt;GROUP=shell-script&lt;br /&gt;&lt;br /&gt;while getopts g:c:q: OPTION ; do&lt;br /&gt;        case $OPTION in&lt;br /&gt;        g) GROUP=$OPTARG ;;&lt;br /&gt;        c) CHARSET=$OPTARG ;;&lt;br /&gt;        q) QTDE=$OPTARG ;;&lt;br /&gt;        esac&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;shift $(($OPTIND -1))&lt;br /&gt;&lt;br /&gt;SEARCH="$@"&lt;br /&gt;&lt;br /&gt;if [ -z "$SEARCH" ]; then &lt;br /&gt;        echo "Usage: $(basename $0) [-q qtde] [-g grupo] [-c charset] search" &lt;br /&gt;        exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;BASEURL="http://br.groups.yahoo.com/group"&lt;br /&gt;URL="${BASEURL}/${GROUP}/msearch?submit=OK&amp;charset=${CHARSET}&amp;cnt=${QTDE}&amp;query=${SEARCH// /+}"  &lt;br /&gt;SEDCMD="/message/!d;/${GROUP}/!d;/.*[0-9]/!d;s#/group#${BASEURL}#g;s/&lt;[^&gt;]*span&gt;//g;s/$/&amp;lt;br \/&amp;gt;/"&lt;br /&gt;&lt;br /&gt;LYNXOPT="-dump -force_html -assume_charset=${CHARSET}"&lt;br /&gt;lynx $LYNXOPT &lt;(  curl -b /tmp/cookie$$ -sL "${URL}" |  sed "${SEDCMD}" )&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vejamos em uso:&lt;br /&gt;&lt;pre&gt;$ ./find.sh              &lt;br /&gt;Usage: find.sh [-q qtde] [-g grupo] [-c charset] search&lt;br /&gt;&lt;br /&gt;$ ./find.sh -q 10 getopts # procurando por getopts limitando a 10 registros&lt;br /&gt;   [1]Re: [shell-script] Script de busca de mensagens&lt;br /&gt;   [2]Re: [shell-script] Re: script iterativo / passo a passo&lt;br /&gt;   [3]Re: [shell-script] Script de Backup&lt;br /&gt;   [4]Re: [shell-script] Script de Backup&lt;br /&gt;   [5]Re: [shell-script] Script de Backup&lt;br /&gt;   [6]Re: [shell-script] Script de Backup&lt;br /&gt;   [7]Re: [shell-script] Echo e executa: superecho&lt;br /&gt;   [8]Re: [shell-script] testar se parametro $1 foi passado&lt;br /&gt;   [9]Re: [shell-script] Echo e executa: superecho&lt;br /&gt;   [10]Re: [shell-script] testar se parametro $1 foi passado&lt;br /&gt;&lt;br /&gt;References&lt;br /&gt;&lt;br /&gt;   1. http://br.groups.yahoo.com/group/shell-script/message/26373&lt;br /&gt;   2. http://br.groups.yahoo.com/group/shell-script/message/26204&lt;br /&gt;   3. http://br.groups.yahoo.com/group/shell-script/message/26078&lt;br /&gt;   4. http://br.groups.yahoo.com/group/shell-script/message/26076&lt;br /&gt;   5. http://br.groups.yahoo.com/group/shell-script/message/26075&lt;br /&gt;   6. http://br.groups.yahoo.com/group/shell-script/message/26072&lt;br /&gt;   7. http://br.groups.yahoo.com/group/shell-script/message/25742&lt;br /&gt;   8. http://br.groups.yahoo.com/group/shell-script/message/25720&lt;br /&gt;   9. http://br.groups.yahoo.com/group/shell-script/message/25719&lt;br /&gt;  10. http://br.groups.yahoo.com/group/shell-script/message/25718&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Divertido, não? o default é procurar no grupo shell-script do yahoo, mas ele pode investigar em qualquer um.&lt;br /&gt;&lt;br /&gt;Valeu Mr.Bits!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3272086785208055090?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3272086785208055090/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3272086785208055090' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3272086785208055090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3272086785208055090'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/pesquisando-nos-grupos-do-yahoo.html' title='Pesquisando nos Grupos do Yahoo'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6010790723770548825</id><published>2008-05-27T23:18:00.002-03:00</published><updated>2008-05-27T23:21:40.984-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ceticismo'/><title type='text'>Francisco Ayala: Ciencia e Religiao</title><content type='html'>Interessante conclusão do Francisco J. Ayala:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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&gt;&lt;br /&gt;&lt;br /&gt;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"&gt;aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O começo:&lt;br /&gt;&lt;blockquote&gt;Ex-padre defende que Deus e teoria evolutiva de Darwin são compatíveis&lt;br /&gt;&lt;br /&gt;Para um professor universitário, Francisco J. Ayala passa muito tempo na estrada. &lt;br /&gt;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&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6010790723770548825?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6010790723770548825/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6010790723770548825' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6010790723770548825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6010790723770548825'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/francisco-ayala-ciencia-e-religiao.html' title='Francisco Ayala: Ciencia e Religiao'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2602708133736510538</id><published>2008-05-21T13:47:00.005-03:00</published><updated>2008-05-28T19:21:28.698-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programacao'/><title type='text'>Hello World orientado a objetos</title><content type='html'>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 /&gt;&lt;br /&gt;Vejamos um exemplo em C++&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;class HelloWorld{&lt;br /&gt;        string mensagem;&lt;br /&gt;        public:&lt;br /&gt;        HelloWorld(string mensagem) { // construtor!&lt;br /&gt;                this-&amp;gt;mensagem = mensagem;&lt;br /&gt;        }&lt;br /&gt;     &lt;br /&gt;        void show() { // metodo show&lt;br /&gt;                cout &amp;lt;&amp;lt; "mensagem: " &amp;lt;&amp;lt; this-&amp;gt;mensagem &amp;lt;&amp;lt; endl;&lt;br /&gt;        }&lt;br /&gt;};&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;        HelloWorld obj("ola mundo");&lt;br /&gt;        obj.show();&lt;br /&gt;        return(0);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora o mesmo código em Java:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;package Hello;&lt;br /&gt;&lt;br /&gt;public class HelloWorld{&lt;br /&gt;        private String mensagem;&lt;br /&gt;        public HelloWorld(String mensagem){ &lt;br /&gt;                this.mensagem = mensagem;&lt;br /&gt;        }&lt;br /&gt;        public void show() { &lt;br /&gt;                System.out.println("mensagem: " + mensagem);&lt;br /&gt;        }&lt;br /&gt;        public static void main(String [] args){&lt;br /&gt;                HelloWorld obj = new HelloWorld("ola mundo");&lt;br /&gt;                obj.show();&lt;br /&gt;        }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora, percebam a simplicidade do Ruby:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class HelloWorld&lt;br /&gt;        def initialize(mensagem)&lt;br /&gt;                @mensagem = mensagem &lt;br /&gt;        end&lt;br /&gt;        def show &lt;br /&gt;                puts "mensagem: #{@mensagem}"&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;obj = HelloWorld.new "ola mundo"&lt;br /&gt;obj.show&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora em Perl (sim, Perl!)&lt;br /&gt;&lt;pre&gt;&lt;code&gt;package HelloWorld;&lt;br /&gt;&lt;br /&gt;sub new&lt;br /&gt;{&lt;br /&gt;        my ($class, $mensagem) = @_;&lt;br /&gt;        my $self = {  mensagem =&amp;gt; $mensagem  };&lt;br /&gt;        bless $self, $class; # abençoando a variavel!&lt;br /&gt;        return $self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub show&lt;br /&gt;{&lt;br /&gt;        my $self = shift; # sim, ela vem como argumento!&lt;br /&gt;        print "mensagem: " . $self-&amp;gt;{mensagem} . "\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my $obj = new HelloWorld("ola mundo");&lt;br /&gt;$obj-&amp;gt;show(); # parece artificial, não?&lt;br /&gt;&lt;br /&gt;1;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PHP também é: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;Class HelloWorld{&lt;br /&gt;        var $mensagem = "";&lt;br /&gt;        function HelloWorld($mensagem){&lt;br /&gt;                $this-&amp;gt;mensagem = $mensagem;&lt;br /&gt;        }&lt;br /&gt;        function show(){&lt;br /&gt;                echo "mensagem : " . $this-&amp;gt;mensagem . "&amp;lt;br/&amp;gt;";&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$obj = new HelloWorld("ola mundo");&lt;br /&gt;$obj-&amp;gt;show();&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por fim, vamos criar um tipo usando JavaScript&lt;br /&gt;&lt;pre&gt;&lt;code&gt;function HelloWorld(mensagem){&lt;br /&gt;        this.mensagem = mensagem;&lt;br /&gt;        this.show = function(){&lt;br /&gt;                alert("mensagem: " + this.mensagem);&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var obj = new HelloWorld("ola mundo");&lt;br /&gt;obj.show();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Edit: Python, atendendo a diversos pedidos&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class HelloWorld:&lt;br /&gt;    def __init__(self, arg):&lt;br /&gt;        self.message = arg&lt;br /&gt;&lt;br /&gt;    def show(self):&lt;br /&gt;        print "mensagem: ", self.message&lt;br /&gt;&lt;br /&gt;hello = HelloWorld("Ola Mundo")&lt;br /&gt;hello.show()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Vou abordar o tema "herança" no proximo post, espero que seja útil :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2602708133736510538?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2602708133736510538/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2602708133736510538' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2602708133736510538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2602708133736510538'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/hello-world-orientado-objetos.html' title='Hello World orientado a objetos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4251585748305113728</id><published>2008-05-02T16:07:00.002-03:00</published><updated>2008-05-02T16:24:07.791-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>CRDS - Conselho Regional de Desenvolvedores de Software</title><content type='html'>Num futuro não muito distante, o carlinhos está desenvolvendo um pequeno sistema de contas a pagar para a &lt;em&gt;Padaria do Manoel&lt;/em&gt;. Entretando o seu local de trabalho recebe uma visita de um fiscal do CRDS!&lt;br /&gt;&lt;br /&gt;- Pronto &lt;br /&gt;- Sr Carlos Silva?&lt;br /&gt;- É ele.&lt;br /&gt;- Meu nome é Teobaldo, sou fiscal do Conselho Regional de Desenvolvedores de Software. Fiquei sabendo que nesse recindo está sendo desenvolvido um "software".&lt;br /&gt;- Exato! To desenvolvendo um...&lt;br /&gt;- Antes de mais nada, qual a sua formação?&lt;br /&gt;- 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 /&gt;- Puxa, ultimamente só tem dado essa faculdade. &lt;br /&gt;- Po, ela custa 49,99 por mês...&lt;br /&gt;- É claro. Continuando, onde está a ART desse sistema?&lt;br /&gt;- Bom, é um sistema pequeno, com menos de mil linhas, precisa ART?&lt;br /&gt;- Claro, e vc pode imprimir o boleto pelo site da CRDS, não tem desculpas.&lt;br /&gt;- Ok. Eu pagarei...&lt;br /&gt;- 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 /&gt;- 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 /&gt;- Ok, mas o CRDS &lt;strong&gt;exige&lt;/strong&gt; essa documentação no template .doc que vc pode baixar do site&lt;br /&gt;- Mas q .doc ?? Ta maluco, eu uso openoffice no meu linux.&lt;br /&gt;- Linux ?? Vc desenvolve em um sistema operacional não homologado pela CRDS? Se ainda fosse Ubuntu...&lt;br /&gt;- Mas Ubuntu é linux.&lt;br /&gt;- Chega, se não tem documentação, como vc sabe que o sistema funciona?&lt;br /&gt;- Eu uso testes unitários!&lt;br /&gt;- Humm... teste precisa de um profissional habilitado em testes.&lt;br /&gt;- Mas eu uso JUNIT, veja!&lt;br /&gt;- Ei... q java esquisito é esse com esses @ e esses "maior e menor"?&lt;br /&gt;- Isso se chama Annotations e Generics! Ta desde o Java 1.5&lt;br /&gt;- 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 /&gt;- E se eu estivesse usando MacOS ?&lt;br /&gt;- MacOS não foi homologado pelo CRDS ainda.&lt;br /&gt;- Mas java é multiplataforma!&lt;br /&gt;- Certo certo... e o modelo ER?&lt;br /&gt;- Eu uso Hibernate para Abstrair o modelo ER..&lt;br /&gt;- Hibernate ? Ok, terei que embargar o seu sistema...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4251585748305113728?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4251585748305113728/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4251585748305113728' title='10 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4251585748305113728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4251585748305113728'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/crds-conselho-regional-de.html' title='CRDS - Conselho Regional de Desenvolvedores de Software'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1852829962400530094</id><published>2008-05-02T15:00:00.003-03:00</published><updated>2008-05-02T15:03:53.132-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Programacao'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD com Perl</title><content type='html'>É possivel fazer Test Driven Development com Perl? Mas claro :)&lt;br /&gt;&lt;br /&gt;Artigo interessante sobre &lt;a href="http://perldoc.perl.org/Test/More.html"&gt;Test::More&lt;/a&gt;:&lt;br /&gt;&lt;a href="http://www.testingreflections.com/node/view/5333"&gt;http://www.testingreflections.com/node/view/5333&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tutorial bem sucinto:&lt;br /&gt;&lt;a href="http://www.wgz.org/chromatic/perl/IntroTestMore.pdf"&gt;http://www.wgz.org/chromatic/perl/IntroTestMore.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Excelente apresentação:&lt;br /&gt;&lt;a href="http://wellington.pm.org/archive/200606/tdd/"&gt;http://wellington.pm.org/archive/200606/tdd/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1852829962400530094?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1852829962400530094/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1852829962400530094' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1852829962400530094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1852829962400530094'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/tdd-com-perl.html' title='TDD com Perl'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6172477656406792414</id><published>2008-05-02T14:48:00.003-03:00</published><updated>2008-12-10T03:31:28.963-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Pra descontrair...</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_TDd0BWQ-Qes/SBtVFGpuiHI/AAAAAAAAABM/hfcTSKDN2wg/s1600-h/padre.jpg"&gt;&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" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://charges.uol.com.br/2008/04/30/ronike-e-os-trans-cantam-mulheres"&gt;&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/"&gt;&lt;/iframe&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6172477656406792414?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6172477656406792414/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6172477656406792414' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6172477656406792414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6172477656406792414'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/pra-descontrair.html' title='Pra descontrair...'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TDd0BWQ-Qes/SBtVFGpuiHI/AAAAAAAAABM/hfcTSKDN2wg/s72-c/padre.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4305002467780617773</id><published>2008-05-02T14:26:00.005-03:00</published><updated>2008-05-02T15:09:04.836-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politica'/><title type='text'>Regulamentar a profissão dos outros é refresco</title><content type='html'>Na onda da campanha contra a regulamentação das profissões da área de informática&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;a href="http://blog.fragmental.com.br/2008/03/21/ainda-bem-que-estou-aqui/"&gt;http://blog.fragmental.com.br/2008/03/21/ainda-bem-que-estou-aqui/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cito a opinião da &lt;a href="http://www.sbc.org.br/index.php?language=1&amp;subject=107"&gt;Sociedade Brasileira de Computação &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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 /&gt;2. Nenhum conselho de profissão pode criar qualquer impedimento ou restrição ao princípio acima.&lt;br /&gt;3. A área deve ser Auto-Regulada.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Parafraseando o &lt;a href="http://www.kumpera.net"&gt;Rodrigo Kumpera&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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&gt;&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4305002467780617773?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4305002467780617773/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4305002467780617773' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4305002467780617773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4305002467780617773'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/regulamentar-profisso-dos-outros.html' title='Regulamentar a profissão dos outros é refresco'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1714457334839062677</id><published>2008-05-02T14:24:00.001-03:00</published><updated>2008-05-02T14:32:13.041-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FISL'/><title type='text'>Código transparente, contas fechadas ?</title><content type='html'>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/"&gt;começamos&lt;/a&gt; &lt;a href="http://br-linux.org/2008/fisl-e-a-transparencias-das-contas-em-eventos-da-comunidade/"&gt;a falar &lt;/a&gt;em “Transparência de Contas” e aparece gente dizendo q queremos acabar com o FISL. Parece que a ideia é “&lt;b&gt;Aceite o FISL como ele É ou tu és contra o software livre no Brasil&lt;/b&gt; (e provavelmente usa &lt;i&gt;Windows&lt;/i&gt; em casa)”.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;“Código transparente, contas fechadas” é um lema perigoso que pode acabar com a reputação da comunidade de software livre brasileira.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1714457334839062677?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1714457334839062677/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1714457334839062677' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1714457334839062677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1714457334839062677'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/05/cdigo-transparente-contas-fechadas.html' title='Código transparente, contas fechadas ?'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3417975650382226820</id><published>2008-04-26T14:41:00.006-03:00</published><updated>2008-04-27T20:25:05.199-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='sed'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Manipulando logs com AWK e SED</title><content type='html'>Eis que a lista de &lt;a href="http://br.groups.yahoo.com/group/shell-script/"&gt;shell script&lt;/a&gt; traz um bom desafio.&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Galera, tenho o seguinte log.:&lt;br /&gt;&lt;br /&gt;AAAA-------------campo_1-------------campo_2-----campo_3----campo_4---------- &lt;br /&gt;teste_1 371508787 371547453 38666 testetesteteste&lt;br /&gt;&lt;br /&gt;BBBB-------------campo_1-------------campo_2-----campo_3----campo_4---------- &lt;br /&gt;teste_2 4625081503 4651313710 26232207 testetesteteste&lt;br /&gt;&lt;br /&gt;Estou a tentar usar o awk com a seguinte função : &lt;br /&gt;awk '$1~"teste_" {print $5";"$4}' teste &gt; teste_.csv&lt;br /&gt;&lt;br /&gt;a funcao busca realmente o que desejo:&lt;br /&gt;$5 $4&lt;br /&gt;testetesteteste 38666&lt;br /&gt;testetesteteste 6232207&lt;br /&gt;&lt;br /&gt;porem,, gostaria que seprasse da forma:&lt;br /&gt;&lt;br /&gt;AAAA------------- &lt;br /&gt;testetesteteste 38666 &lt;br /&gt;BBBB------------- &lt;br /&gt;testetesteteste 26232207 &lt;br /&gt;&lt;br /&gt;Alguém tem uma dica de como fazer?&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Ah... o bom e velho &lt;span style="font-weight:bold;"&gt;SED&lt;/span&gt; pode resolver isso&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sed -rn '/(^[^-]+-+).*/{s//\1/;h};&lt;br /&gt;/^teste_/{s/.* ([^ ]+) +([^ ]+$)/\2 \1/;x;p;g;p}' arquivo.log&lt;br /&gt;AAAA-------------&lt;br /&gt;testetesteteste 38666&lt;br /&gt;BBBB-------------&lt;br /&gt;testetesteteste 26232207&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ok, ok, ta muito complicado, mas veja só:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sed -rn '/^[^-]+-+/h;/^teste_/{x;p;g;p}' arquivo.log &lt;br /&gt;AAAA-------------campo_1-------------campo_2-----campo_3----campo_4----------&lt;br /&gt;teste_1 371508787 371547453 38666 testetesteteste&lt;br /&gt;BBBB-------------campo_1-------------campo_2-----campo_3----campo_4----------&lt;br /&gt;teste_2 4625081503 4651313710 26232207 testetesteteste&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Vamos explicar&lt;br /&gt;1) a opção -n serve para informar ao sed "imprima apenas quando eu mandar"&lt;br /&gt;2) a opção -p serve para utilizar expressões regulares extendidas&lt;br /&gt;(assim não preciso escapar o quantificador + , que significa "um ou&lt;br /&gt;mais vezes", assim como os parentesis, para informar os grupos).&lt;br /&gt;&lt;br /&gt;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 /&gt;do AAAA------------- ... ).&lt;br /&gt;&lt;br /&gt;Agora, quando eu encontro uma linha que começa com teste_ eu:&lt;br /&gt;&lt;br /&gt;x) troco essa linha com a linha que esta na memória (a atual&lt;br /&gt;'teste_...' vai, outra volta).&lt;br /&gt;p) imprimo a linha que veio (AAAA---------- ...)&lt;br /&gt;g) pego a linha da memória (teste_...)&lt;br /&gt;p) imprimo a linha cachorrona&lt;br /&gt;&lt;br /&gt;Só que não fica como vc quer. Ai vc precisa fazer a sacanagem:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;se uma linha NÃO tem o que eu quero, então eu a manipulo habilmente&lt;br /&gt;até que ela chegue ao que eu quero&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu poderia ter usado varias tecnicas mas... uma vez com sed, podemos continuar nele.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sed -rn '/(^[^-]+-+).*/{s//\1/;h};&lt;br /&gt;/^teste_/{s/.* ([^ ]+) +([^ ]+$)/\2 \1/;x;p;g;p}' arquivo.log&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;eu transformei a primera ER em  (minha_ER).* -- ou seja, criei um &lt;span style="font-style:italic;"&gt;grupo&lt;/span&gt; para o que me interessa. basta fazer:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;s/(minha_ER).*/\1/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;para que toda a linha seja reduzida ao que a minha ER casa. em outras palavras, eu apaguei o resto da linha.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Vamos ver a versão &lt;span style="font-weight:bold;"&gt;AWK&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ awk '/^[^-]+-+/{match($0,/^[^-]+-+/); x=substr($0,1,RLENGTH)}&lt;br /&gt;/^teste_/{print x,"\n"$5,$4}' arquivo.log&lt;br /&gt;AAAA-------------&lt;br /&gt;testetesteteste 38666&lt;br /&gt;BBBB-------------&lt;br /&gt;testetesteteste 26232207&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Aqui fala um pouco dessas duas funções: &lt;a href="http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html"&gt;http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eu poderia ter resolvido dessa forma também&lt;br /&gt;&lt;code&gt;$ awk '/^[^-]+-+/{sub(/-[^-]+.*$/,"-");x=$0} &lt;br /&gt;/^teste_/{print x,"\n"$5,$4}' arquivo.log&lt;br /&gt;AAAA-------------&lt;br /&gt;testetesteteste 38666&lt;br /&gt;BBBB-------------&lt;br /&gt;testetesteteste 26232207&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;AWK &amp; SED são ferramentas sensacionais para esse tipo de problema ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3417975650382226820?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3417975650382226820/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3417975650382226820' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3417975650382226820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3417975650382226820'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/manipulando-logs-com-awk-e-sed.html' title='Manipulando logs com AWK e SED'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8027431846989028151</id><published>2008-04-25T12:46:00.004-03:00</published><updated>2008-04-25T12:53:35.306-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flisol'/><title type='text'>Sbado dia 26 de Abril tem FLISOL na PUC-Rio !!</title><content type='html'>&lt;img src="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro?action=AttachFile&amp;do=get&amp;target=banner+rio.png"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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&gt;&lt;br /&gt;&lt;br /&gt;Veja mais informações aqui:&lt;br /&gt;&lt;a href="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro"&gt;http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Software disponível&lt;br /&gt;&lt;br /&gt;    * Linux: Ubuntu&lt;br /&gt;    * Openoffice e Firefox.&lt;br /&gt;    * 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 /&gt;&lt;br /&gt;Palestras&lt;br /&gt;&lt;br /&gt;&lt;a href="http://installfest.info/FLISOL2008/Brasil/RioDeJaneiro/Clique_aqui_e_veja_a_grade_de_palestras_completa"&gt;Veja aqui a grade de palestras completa.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Como ajudar?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Se você quiser, pode ser um instalador ou palestrante no InstallFest. Envie um e-mail para Carlos Ferreira &lt;chlferreira EM gmail.com.br&gt; ou Luiz Aldabalde &lt;lg.aldabalde EM gmail.com&gt; 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 /&gt;&lt;br /&gt;Caso queira ajudar de qualquer outra forma, entre em contato conosco por e-mail. Toda a ajuda é bem vinda!&lt;br /&gt;&lt;br /&gt;O que devo fazer para me preparar para o Install Fest?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Checagem de Hardware: No Windows, vá até o Painel de Controle e escolha Sistema. Liste:&lt;br /&gt;&lt;br /&gt;    * Placa de rede (marca, modelo, configuração)&lt;br /&gt;    * Placa de vídeo (marca, modelo, configuração)&lt;br /&gt;    * Placa de Som (marca, modelo, configuração)&lt;br /&gt;    * CPU (Processador)&lt;br /&gt;    * Memória RAM&lt;br /&gt;    * Modem (marca, modelo, configuração)&lt;br /&gt;    * Espaço livre em disco (mínimo de 5.0 Gb)&lt;br /&gt;    * Componentes SCSI (se houver algum) &lt;br /&gt;&lt;br /&gt;* 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 /&gt;&lt;br /&gt;* 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 /&gt;&lt;br /&gt;* 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 /&gt;&lt;br /&gt;* Os custos de transporte do seu PC são de sua responsabilidade.&lt;br /&gt;&lt;br /&gt;* 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 /&gt;&lt;br /&gt;Apoio&lt;br /&gt;&lt;br /&gt;CASA DO MOODLE &lt;a href="http://www.casadomoodle.com"&gt;http://www.casadomoodle.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Responsáveis&lt;br /&gt;&lt;br /&gt;Coordenador:  &lt;br /&gt;          o Carlos Henrique Lucas Ferreira &lt;chlferreira EM gmail.com&gt; &lt;br /&gt;&lt;br /&gt;Colaboradores:&lt;br /&gt;          o Luiz Guilherme Aldabalde&lt;br /&gt;          o Avalci Suzano&lt;br /&gt;          o Carlos Eduardo(Cadunico)&lt;br /&gt;          o Luis Felipe Costa&lt;br /&gt;          o Bruno Garcia&lt;br /&gt;          o Josir Gomes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8027431846989028151?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8027431846989028151/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8027431846989028151' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8027431846989028151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8027431846989028151'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/sbado-dia-26-de-abril-tem-flisol-na-puc.html' title='Sbado dia 26 de Abril tem FLISOL na PUC-Rio !!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8044004206622523468</id><published>2008-04-20T21:40:00.001-03:00</published><updated>2008-04-20T21:42:45.618-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FISL'/><category scheme='http://www.blogger.com/atom/ns#' term='PortoAlegre'/><title type='text'>Sobre o FISL e tudo mais</title><content type='html'>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"&gt;Aurélio&lt;/a&gt; (alias o livro dele é ANIMAL! vale a pena adquirir!), rever o &lt;a href="http://twiki.softwarelivre.org/bin/view/TWikiBar/WebHome"&gt;Julio Neves&lt;/a&gt;, a galera do &lt;a href="http://tchelinux.org"&gt;Tchelinux&lt;/a&gt;, 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"&gt;Marcelo Martins&lt;/a&gt;, que deve estar em Torres agora.&lt;br /&gt;&lt;br /&gt;Destaque para a palestra do &lt;a href="gc.blog.br"&gt;Guilherme Chapiewski&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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"&gt;FLISOL&lt;/a&gt; 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 /&gt;&lt;br /&gt;Peço desculpas a todos que não conseguiram me encontrar ou que não pude conversar direito! Forte Abraço!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8044004206622523468?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8044004206622523468/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8044004206622523468' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8044004206622523468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8044004206622523468'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/sobre-o-fisl-e-tudo-mais.html' title='Sobre o FISL e tudo mais'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6959276813008203806</id><published>2008-04-13T14:39:00.003-03:00</published><updated>2008-04-13T16:11:17.838-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Um corretor ortográfico em gawk</title><content type='html'>Ano passado eu publiquei &lt;a href="http://peczenyj.blogspot.com/2007/08/implementando-um-corretor-ortogrfico.html"&gt;uma pequena nota sobre um pequeno corretor ortográfico feito em Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No &lt;a href="http://norvig.com/spell-correct.html"&gt;artigo&lt;/a&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Eu chamo de linha um &lt;span style="font-style:italic;"&gt;statement&lt;/span&gt; completo do awk. Perceba que nenhuma linha dessas possui o separador de statement &lt;span style="font-weight:bold;"&gt;;&lt;/span&gt; (ponto-e-virgula), exceto quando estou utilizando o for no estilo C.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# Usage: gawk -v word=something -f thisfile.awk [ big.txt [ big2.txt ... ]]&lt;br /&gt;# Gawk version with 15 lines -- 04/13/2008&lt;br /&gt;# Author: tiago (dot) peczenyj (at) gmail (dot) com &lt;br /&gt;# Based on : http://norvig.com/spell-correct.html&lt;br /&gt;function edits(w,max,candidates,list,        i,j){&lt;br /&gt;       for(i=0;i&lt;  max ;++i) ++list[substr(w,0,i) substr(w,i+2)]  &lt;br /&gt;       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 /&gt;       for(i=0;i&lt;  max ;++i) for(j in alpha) ++list[substr(w,0,i) alpha[j] substr(w,i+2)] &lt;br /&gt;       for(i=0;i&lt;= max ;++i) for(j in alpha) ++list[substr(w,0,i) alpha[j] substr(w,i+1)] &lt;br /&gt;       for(i in list) if(i in NWORDS) candidates[i] = NWORDS[i] }&lt;br /&gt;&lt;br /&gt;function correct(word            ,candidates,i,list,max,temp){&lt;br /&gt;       edits(word,length(word),candidates,list)&lt;br /&gt;       if (!asort(candidates,temp)) for(i in list) edits(i,length(i),candidates)&lt;br /&gt;       return (max = asorti(candidates)) ? candidates[max] : word }&lt;br /&gt;&lt;br /&gt;BEGIN{ if (ARGC == 1) ARGV[ARGC++] = "big.txt" # http://norvig.com/big.txt&lt;br /&gt;       while(++i&lt;=length(x="abcdefghijklmnopqrstuvwxyz")) alpha[i]=substr(x,i,1)&lt;br /&gt;       IGNORECASE=RS="[^"x"]+" }&lt;br /&gt;&lt;br /&gt;{      ++NWORDS[tolower($1)]   }&lt;br /&gt;&lt;br /&gt;END{   print (word in NWORDS) ? word : "correct("word")=&gt; " correct(tolower(word)) }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Veja o script em funcionamento:&lt;br /&gt;&lt;pre&gt;$ time gawk -v word=somethink -f spelling.awk&lt;br /&gt;correct(somethink)=&gt; something&lt;br /&gt;&lt;br /&gt;real    0m4.862s&lt;br /&gt;user    0m4.702s&lt;br /&gt;sys     0m0.093s&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6959276813008203806?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6959276813008203806/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6959276813008203806' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6959276813008203806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6959276813008203806'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/um-corretor-ortogrfico-em-gawk.html' title='Um corretor ortográfico em gawk'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8328418443801406995</id><published>2008-04-05T16:35:00.002-03:00</published><updated>2008-04-05T16:41:41.158-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='globo.com'/><title type='text'>Participe do Domingão do Faustão</title><content type='html'>Vou fazer uma propaganda descarada: o &lt;a href="http://domingaodofaustao.globo.com/"&gt;Domingão do Faustão&lt;/a&gt; lançou o quadro Dança da Galera!&lt;br /&gt;&lt;br /&gt;Para participar, basta seguir as instruções &lt;a href="http://domingaodofaustao.globo.com/ENT/Colunas/0,,10398,00-FAUSTAO%20DANCA%20DA%20GALERA.htmL"&gt;aqui &lt;/a&gt;e enviar o seu vídeo!&lt;br /&gt;&lt;br /&gt;2008 promete muitas novidades! Aguardem!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8328418443801406995?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8328418443801406995/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8328418443801406995' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8328418443801406995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8328418443801406995'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/participe-do-domingo-do-fausto.html' title='Participe do Domingão do Faustão'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-623313834853876819</id><published>2008-04-04T15:35:00.002-03:00</published><updated>2008-04-04T15:38:53.015-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FISL'/><category scheme='http://www.blogger.com/atom/ns#' term='globo.com'/><title type='text'>Venha Tomar um Chimarrão no Estande da Globo.com!</title><content type='html'>Acompanhando o &lt;a href="http://gc.blog.br/2008/04/04/fisl-90-ai-vou-eu/"&gt;post do Guilherme&lt;/a&gt;, dia 18 eu devo aparecer por Porto Alegre, para o FISL.&lt;br /&gt;&lt;br /&gt;Venha Tomar um Chimarrão no Estande da Globo.com durante o FISL!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-623313834853876819?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/623313834853876819/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=623313834853876819' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/623313834853876819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/623313834853876819'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/venha-tomar-um-chimarro-no-estande-da.html' title='Venha Tomar um Chimarrão no Estande da Globo.com!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8874491449747334724</id><published>2008-04-02T14:10:00.003-03:00</published><updated>2008-04-02T17:48:58.322-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programacao'/><title type='text'>Programando em C para console -  parte 1</title><content type='html'>(Depois de um fecundo primeiro de Abril... )&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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;"&gt;algoritmo&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Veja só:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]){&lt;br /&gt;        double soma = 0.0;&lt;br /&gt;&lt;br /&gt;        printf("A soma dos numeros eh %g\n",soma);&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Feito esse simples arquivo, vamos compilar&lt;br /&gt;&lt;pre&gt;$ gcc -Wall soma.c&lt;br /&gt;$ ./a.out 1 2 3 4 5 &lt;br /&gt;A soma dos numeros eh 0&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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;"&gt;warnings&lt;/span&gt; que a compilação pode gerar (o que sempre é uma excelente pratica, eu procuro compilar sempre com 0 warnings).&lt;br /&gt;&lt;br /&gt;Feito isso, vamos definir 2 coisas:&lt;br /&gt; - O algoritmo da soma e&lt;br /&gt; - Possiveis fluxos de excessão.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]){&lt;br /&gt;        int i;&lt;br /&gt;        double soma = 0.0;&lt;br /&gt;&lt;br /&gt;        if(argc == 1){&lt;br /&gt;                fprintf(stderr,"Faltando Argumentos!\n");&lt;br /&gt;                fprintf(stderr,"Uso: %s x1 [ x2 .. xN ]\n",argv[0]);&lt;br /&gt;                return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        for(i=1;i&amp;lt;argc;i++) &lt;br /&gt;                soma += atof(argv[i]);&lt;br /&gt;&lt;br /&gt;        printf("A soma dos numeros eh %g\n",soma);&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Todos os argumentos que eu passo para o programa, incluindo o nome do mesmo, ficam no vetor &lt;span style="font-weight:bold;"&gt;argv&lt;/span&gt;, e o número de argumentos fica na variavel &lt;span style="font-weight:bold;"&gt;arcc&lt;/span&gt;. 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 /&gt;&lt;br /&gt;Simples, não? Agora vamos executar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ./a.out          &lt;br /&gt;Faltando Argumentos!&lt;br /&gt;Uso: ./a.out x1 [ x2 .. xN ]&lt;br /&gt;$ echo $?&lt;br /&gt;1&lt;br /&gt;$ ./a.out 1 2 3 4 5&lt;br /&gt;A soma dos numeros eh 15&lt;br /&gt;$ echo $?&lt;br /&gt;0&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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;"&gt;um&lt;/span&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8874491449747334724?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8874491449747334724/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8874491449747334724' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8874491449747334724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8874491449747334724'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/programando-em-c-para-cons.html' title='Programando em C para console -  parte 1'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5147662642087842603</id><published>2008-04-01T19:28:00.005-03:00</published><updated>2008-04-01T20:11:19.301-03:00</updated><title type='text'>Java 1.7 vai ter Ponteiros!!!</title><content type='html'>Sensacional.&lt;br /&gt;&lt;br /&gt;Um dos recursos mais uteis do C finalmente conquistou o mundo java: a notação de ponteiros do Kernighan &amp; Ritchie.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;public class Example{&lt;br /&gt;    public static void main(String [] args){&lt;br /&gt;       int *x, y=0;&lt;br /&gt;       x = &amp;y;&lt;br /&gt;       System.out.println("O valor de x eh " + *x);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora será possivel fazer, em java:&lt;br /&gt;&lt;br /&gt;- Passar primitivos por referência.&lt;br /&gt;- Usar malloc, realloc e free.&lt;br /&gt;- Utilizar ponteiros void para converter uma URL em String, ou um Throwable em um List.&lt;br /&gt;- 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 /&gt;&lt;br /&gt;Parabéns Sun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5147662642087842603?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5147662642087842603/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5147662642087842603' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5147662642087842603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5147662642087842603'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/java-17-vai-ter-ponteiros.html' title='Java 1.7 vai ter Ponteiros!!!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2653146854678825474</id><published>2008-04-01T18:59:00.001-03:00</published><updated>2008-04-01T19:02:14.475-03:00</updated><title type='text'>WhiteSpace Server Pages</title><content type='html'>E... para completar o dia: &lt;br /&gt;&lt;pre&gt;&amp;lt;?WhiteSpace&lt;br /&gt;Say hello.   &lt;br /&gt;          &lt;br /&gt;       &lt;br /&gt;          &lt;br /&gt;        &lt;br /&gt;          &lt;br /&gt;        &lt;br /&gt;          &lt;br /&gt;         &lt;br /&gt;          &lt;br /&gt;         &lt;br /&gt;         &lt;br /&gt;         &lt;br /&gt;         &lt;br /&gt;         &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;         &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;         &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;          &lt;br /&gt;           &lt;br /&gt;         &lt;br /&gt;           &lt;br /&gt;    &lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;                                          &lt;br /&gt;&lt;br /&gt;                                                          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                          &lt;br /&gt;    &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;                                          &lt;br /&gt; &lt;br /&gt;     &lt;br /&gt; &lt;br /&gt;                                                                          &lt;br /&gt; &lt;br /&gt;      &lt;br /&gt;    &lt;br /&gt; &lt;br /&gt;                                        &lt;br /&gt;&lt;br /&gt;                                                                          &lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;                                  &lt;br /&gt; &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;      &lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;                                                                  &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt; &lt;br /&gt;                                &lt;br /&gt;&lt;br /&gt;                                                                  &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;        &lt;br /&gt;   &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;                                                          &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt; &lt;br /&gt;   &lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;?&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2653146854678825474?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2653146854678825474/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2653146854678825474' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2653146854678825474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2653146854678825474'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/whitespace-server-pages.html' title='WhiteSpace Server Pages'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6361120870971677138</id><published>2008-04-01T18:51:00.002-03:00</published><updated>2008-04-01T18:57:26.211-03:00</updated><title type='text'>Novas Tecnologias .Net</title><content type='html'>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;"&gt;dot NET&lt;/span&gt;: vejam exemplos dos novissimos ABAP .Net, ASM .Net, BrainFuck .Net, JCL .Net e VHDL .Net.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?ABAP&lt;br /&gt;  REPORT ZHB00001.&lt;br /&gt;  WRITE: 'Hello world'.&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?ASM&lt;br /&gt; SECTION .data&lt;br /&gt;&lt;br /&gt; msg db "Hello, world!",0xa ; &lt;br /&gt; len equ     $ - msg&lt;br /&gt;&lt;br /&gt; SECTION .text&lt;br /&gt; global main&lt;br /&gt;&lt;br /&gt;main:&lt;br /&gt;        mov     eax,4 &lt;br /&gt;        mov     ebx,1   &lt;br /&gt;        mov     ecx,msg&lt;br /&gt;        mov     edx,len &lt;br /&gt; int     0x80&lt;br /&gt;&lt;br /&gt; mov eax,1&lt;br /&gt;        mov     ebx,0      &lt;br /&gt;        int     0x80&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?BRAINFUCK&lt;br /&gt;  ++++++++++[&gt;+++++++&gt;++++++++++&gt;+++&lt;&lt;&lt;-]&gt;++.&gt;+.+++++++&lt;br /&gt;  ..+++.&gt;++.&lt;&lt;+++++++++++++++.&gt;.+++.------.--------.&gt;+.&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?MSDOS&lt;br /&gt;  @ECHO OFF&lt;br /&gt;  REM Hello World for DOS batch&lt;br /&gt;&lt;br /&gt;  ECHO Hello World!&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?JCL&lt;br /&gt;  //HERIB    JOB  ,'HERIBERT OTTEN',PRTY=12&lt;br /&gt;  //* Hello World for MVS&lt;br /&gt;  //HALLO    EXEC PGM=IEBGENER&lt;br /&gt;  //SYSPRINT DD SYSOUT=*&lt;br /&gt;  //SYSUT2   DD SYSOUT=T&lt;br /&gt;  //SYSUT1   DD *&lt;br /&gt;  Hello World!&lt;br /&gt;  /*&lt;br /&gt;  //&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;LT;?VHDL&lt;br /&gt;  ENTITY helloworld IS&lt;br /&gt;  END helloworld;&lt;br /&gt;&lt;br /&gt;  ARCHITECTURE hw OF helloworld IS&lt;br /&gt;&lt;br /&gt;  BEGIN&lt;br /&gt;&lt;br /&gt;  ASSERT FALSE&lt;br /&gt;  REPORT "HELLO, WORLD!"&lt;br /&gt;  SEVERITY NOTE;&lt;br /&gt;&lt;br /&gt;   END hw;&lt;br /&gt;?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essa microsoft...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6361120870971677138?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6361120870971677138/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6361120870971677138' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6361120870971677138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6361120870971677138'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/novas-tecnologias-net.html' title='Novas Tecnologias .Net'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5010306399193479540</id><published>2008-04-01T11:21:00.003-03:00</published><updated>2008-04-01T11:24:26.107-03:00</updated><title type='text'>FSP - Fortran Server Pages!</title><content type='html'>Sensacional.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?FORTRAN&lt;br /&gt;*&lt;br /&gt;C Hello World in Fortran 77&lt;br /&gt;C (lines must be 6 characters indented)&lt;br /&gt;*&lt;br /&gt;      PROGRAM HELLOW&lt;br /&gt;      WRITE(UNIT=*, FMT=*) 'Hello World'&lt;br /&gt;      END&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A ideia é atingir um novo patamar em sistemas web.&lt;br /&gt;&lt;br /&gt;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"&gt;Google&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5010306399193479540?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5010306399193479540/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5010306399193479540' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5010306399193479540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5010306399193479540'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/04/fsp-fortran-server-pages.html' title='FSP - Fortran Server Pages!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-9169061673852696265</id><published>2008-03-28T17:55:00.001-03:00</published><updated>2008-03-28T17:57:39.963-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Hackeando um Hello World com sed</title><content type='html'>Fantástico o que o sed pode fazer!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ cat a.c&lt;br /&gt;main(){ &lt;br /&gt;     puts("hello world"); &lt;br /&gt;}&lt;br /&gt;$ gcc a.c&lt;br /&gt;$ ./a.out &lt;br /&gt;hello world&lt;br /&gt;$ sed -i 's/hello world/_ola mundo_/'./a.out &lt;br /&gt;$ ./a.out &lt;br /&gt;_ola mundo_&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-9169061673852696265?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/9169061673852696265/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=9169061673852696265' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9169061673852696265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9169061673852696265'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/hackeando-um-hello-world-com-sed.html' title='Hackeando um Hello World com sed'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1441248940361485944</id><published>2008-03-12T14:37:00.001-03:00</published><updated>2008-03-12T14:38:17.912-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>A internacionalização do Engodo (2)</title><content type='html'>Excelente artigo do Olavo de Carvalho:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.olavodecarvalho.org/semana/080310dc.html"&gt;A internacionalização do Engodo (2)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1441248940361485944?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1441248940361485944/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1441248940361485944' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1441248940361485944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1441248940361485944'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/internacionalizao-do-engodo-2.html' title='A internacionalização do Engodo (2)'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3883874052746808490</id><published>2008-03-10T14:07:00.001-03:00</published><updated>2008-03-10T14:11:39.354-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Pra bom entendedor...</title><content type='html'>&lt;img src="http://imgs.xkcd.com/comics/real_programmers.png"/&gt;&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://xkcd.com/378/"&gt;http://xkcd.com/378/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3883874052746808490?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3883874052746808490/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3883874052746808490' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3883874052746808490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3883874052746808490'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/pra-bom-entendedor.html' title='Pra bom entendedor...'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7873164707756307853</id><published>2008-03-07T19:14:00.002-03:00</published><updated>2008-03-07T19:17:37.479-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politica'/><title type='text'>Projeto reconhece profissões de TI</title><content type='html'>Projeto reconhece profissões de TI, mas exclui criação de conselhos&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://www.tiinside.com.br/Filtro.asp?C=265&amp;ID=86125"&gt;TI Inside&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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 /&gt;(...)&lt;br /&gt;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&gt;&lt;br /&gt;&lt;br /&gt;Sem comentários...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7873164707756307853?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7873164707756307853/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7873164707756307853' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7873164707756307853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7873164707756307853'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/projeto-reconhece-profisses-de-ti.html' title='Projeto reconhece profissões de TI'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4462112284260746762</id><published>2008-03-06T08:22:00.003-03:00</published><updated>2008-03-06T08:55:51.598-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Sobre o "ensino" de Java hoje em dia.</title><content type='html'>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;"&gt;interfaces&lt;/span&gt;, 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;"&gt;obriga&lt;/span&gt; a tratar determinadas situações e por ai vai.&lt;br /&gt;&lt;br /&gt;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;"&gt;domínio&lt;/span&gt; pode ser uma palavra forte, talvez uma boa noção fosse suficiente em algumas situações).&lt;br /&gt;&lt;br /&gt;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;"&gt;main&lt;/span&gt; recebe?), depois passar a estudar a leitura e escrita em arquivo texto e, por fim, leitura pela entrada padrão.&lt;br /&gt;&lt;br /&gt;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;"&gt;class functions&lt;/span&gt;, gigantescos métodos que fazem centenas de coisas com nomes adequados do tipo &lt;span style="font-weight:bold;"&gt;createTree3&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;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)"&gt;equalsIgnoreCase&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;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"&gt;hello world&lt;/a&gt;) 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"&gt;classpath&lt;/a&gt;. 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 /&gt;&lt;br /&gt;&lt;a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/"&gt;Aqui&lt;/a&gt; tem um excelente começo.&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4462112284260746762?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4462112284260746762/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4462112284260746762' title='11 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4462112284260746762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4462112284260746762'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/sobre-o-ensino-de-java-hoje-em-dia.html' title='Sobre o &quot;ensino&quot; de Java hoje em dia.'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1472239024068079364</id><published>2008-03-05T18:21:00.004-03:00</published><updated>2008-03-05T18:29:21.618-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Melhorando o “try()” do Ruby, a maneira “Groovy” [parte final]</title><content type='html'>&lt;pre&gt;&lt;code&gt;class Omega&lt;br /&gt;        def a&lt;br /&gt;                self&lt;br /&gt;        end&lt;br /&gt;        def b&lt;br /&gt;                self&lt;br /&gt;        end&lt;br /&gt;        def c&lt;br /&gt;                self&lt;br /&gt;        end&lt;br /&gt;        def to_s&lt;br /&gt;                "Omega"&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def da? &lt;br /&gt;        begin&lt;br /&gt;                yield() if block_given?&lt;br /&gt;        rescue =&gt; exc&lt;br /&gt;                nil&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;xyz = nil&lt;br /&gt;a = da? { xyz.a.b.c } &lt;br /&gt;&lt;br /&gt;xyz = Omega.new&lt;br /&gt;b = da? { xyz.a.b.c } &lt;br /&gt;&lt;br /&gt;puts "da? com nil -&gt; '#{a}'"&lt;br /&gt;puts "da? com Omega -&gt; '#{b}'"&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Executando:&lt;br /&gt;&lt;pre&gt;da? com nil -&gt; ''&lt;br /&gt;da? com Omega -&gt; 'Omega'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Ruby é divertido. :)&lt;br /&gt;&lt;br /&gt;ps: teste com&lt;br /&gt;&lt;br /&gt;&lt;code&gt;a = da? { xyz.a.b.c } || "nao deu..."&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1472239024068079364?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1472239024068079364/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1472239024068079364' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1472239024068079364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1472239024068079364'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/melhorando-o-try-do-ruby-maneira-groovy_05.html' title='Melhorando o “try()” do Ruby, a maneira “Groovy” [parte final]'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3382122467976819467</id><published>2008-03-05T15:32:00.004-03:00</published><updated>2008-03-05T15:58:25.975-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Melhorando o “try()” do Ruby, a maneira “Groovy” [parte 2]</title><content type='html'>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/"&gt;artigo&lt;/a&gt; de mesmo nome.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Omega&lt;br /&gt;   def doIt&lt;br /&gt;     puts "ola"&lt;br /&gt;     self&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class NullableClass&lt;br /&gt;   def method_missing(*x)&lt;br /&gt;      self&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Object&lt;br /&gt;   def existe?&lt;br /&gt;      self&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class NilClass&lt;br /&gt;   def existe? &lt;br /&gt;      NullableClass.new &lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;xyz = Omega.new &lt;br /&gt;xyz . existe? . doIt . doIt&lt;br /&gt;&lt;br /&gt;abc = nil&lt;br /&gt;abc . existe? . doIt . doIt&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Estou em duvida sobre o nome do metodo, por enquando fica &lt;span style="font-weight:bold;"&gt;existe?&lt;/span&gt; mesmo.&lt;br /&gt;&lt;br /&gt;O que isso faz? Imagine que vc tem uma variavel ou atributo de classe que &lt;span style="font-style:italic;"&gt;pode&lt;/span&gt; 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;IMHO pode ser o suficiente quando queremos fazer um teste simples: o objeto é nil? então não faz nada.&lt;br /&gt;&lt;br /&gt;Se alguem achar isso util por favor me avise :)&lt;br /&gt;&lt;br /&gt;Ah sim, a execução do script acima resulta em:&lt;br /&gt;&lt;pre&gt;ola&lt;br /&gt;ola&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3382122467976819467?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3382122467976819467/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3382122467976819467' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3382122467976819467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3382122467976819467'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/03/melhorando-o-try-do-ruby-maneira-groovy.html' title='Melhorando o “try()” do Ruby, a maneira “Groovy” [parte 2]'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1262321371875188261</id><published>2008-02-27T11:03:00.000-03:00</published><updated>2008-02-27T11:04:21.691-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Escher em Lego</title><content type='html'>Sensacional:&lt;br /&gt;&lt;img src='http://www.gravestmor.com/strips/escher%20lego.jpg'/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1262321371875188261?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1262321371875188261/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1262321371875188261' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1262321371875188261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1262321371875188261'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/02/escher-em-lego.html' title='Escher em Lego'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-834512391393364030</id><published>2008-02-22T19:27:00.003-03:00</published><updated>2008-02-22T19:36:53.993-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Alterando Multiplos Arquivos (versão final?)</title><content type='html'>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"&gt;aqui&lt;/a&gt; e &lt;a href="http://www.dicas-l.com.br/dicas-l/20080221.php"&gt;aqui&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;#Forma 1&lt;br /&gt;for o in $(ls -1 *.txt); do&lt;br /&gt;  mv $o $(echo $o | awk -F. '{print $1".htm"}');&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;#Forma 2&lt;br /&gt;for i in `ls *.txt`; do&lt;br /&gt;  mv $i $(echo `basename $i .txt`.html)&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Vou utiliza-los como exemplo de como podemos tornar algo melhor e mais prático (se o tempo permitir).&lt;br /&gt;&lt;br /&gt;Vamos dividir as paradas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;altera() { mv $1 $(echo `basename $1 .txt`.html) ; }&lt;br /&gt;&lt;br /&gt;for i in `ls *.txt`; do&lt;br /&gt;  altera $i&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos tomar um cuidado: arquivos com espaço no nome&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;altera() { mv "$1" $(echo `basename "$1" .txt`.html) ; }&lt;br /&gt;&lt;br /&gt;for i in `ls *.txt`; do&lt;br /&gt;  altera "${i}"&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;for i in *.txt ; do&lt;br /&gt;  altera "${i}"&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;altera() { mv "$1" "${1%.txt}.html" ; }&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que, inserido no for...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;for i in *.txt ; do&lt;br /&gt;  mv "${i}" "${i%.txt}.html"&lt;br /&gt;done&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Interessante, certo? Nenhum sub-processo, exceto o inumeros mv que serão executados. Existem outras formas de fazer a mesma coisa&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;ls *.txt | awk -F. -v OFS=. '{ O=$0; $NF="html" ;printf "\"%s\" \"%s\"\n",O,$0 }' | xargs -n 2 mv&lt;br /&gt;&lt;br /&gt;ls *.txt | sed 's#^\(.\+\)\.[^.]\+$#"&amp;" "\1.html"#g' | xargs -n 2 mv &lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(rodem as linhas acima sem o mv do xargs para entende-las -- é metaprogramação)&lt;br /&gt;&lt;br /&gt;Agora... tudo isso é muito bonito mas... veja se o seu computador possui os comandos mmv ou rename (que facilitam Absurdamente a tarefa)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;rename .txt .html *.txt&lt;br /&gt;&lt;br /&gt;mmv "*.txt" "#1.html"&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Simples, não?&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-834512391393364030?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/834512391393364030/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=834512391393364030' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/834512391393364030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/834512391393364030'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/02/alterando-multiplos-arquivos-verso.html' title='Alterando Multiplos Arquivos (versão final?)'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6458474993155764059</id><published>2008-02-02T14:26:00.000-03:00</published><updated>2008-02-02T14:33:26.864-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Building Didier Stevens' SpiderMonkey in Cygwin</title><content type='html'>Eu estava quebrando a cabeça até que encontrei &lt;a href="http://pmelson.blogspot.com/2007/12/building-didier-stevens-spidermonkey-in.html"&gt;este&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;O Paul Melson ensinou de forma facil a compilar o SpiderMonkey para Cygwin: agora posso criar scripts usando javascript standalone.&lt;br /&gt;&lt;br /&gt;Vantagem: Nenhuma, coisa de nerd :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6458474993155764059?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6458474993155764059/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6458474993155764059' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6458474993155764059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6458474993155764059'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/02/building-didier-stevens-spidermonkey-in.html' title='Building Didier Stevens&apos; SpiderMonkey in Cygwin'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6514185293207821094</id><published>2008-01-30T09:02:00.000-03:00</published><updated>2008-01-30T10:39:05.862-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Twitter.sh versão 2.0</title><content type='html'>O Bruno me deu uma ótima sugestão: um simples &lt;span style="font-style:italic;"&gt;usage&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;TWIURL=http://m.twitter.com   # utilizando versão 'mobile' do twitter&lt;br /&gt;USAGEMSG="Usage: $(basename $0) &amp;lt;twitter-user&amp;gt; [user list...]"&lt;br /&gt;&lt;br /&gt;[ -z "$1" ] &amp;&amp; { echo "${USAGEMSG}" ; exit 1 ; }&lt;br /&gt;for i in "$@" ; do&lt;br /&gt;    echo "==============================="&lt;br /&gt;    links -dump "${TWIURL}/${i}" | sed -r '1,3d;/^\ +Older [0-9]+/,$d'&lt;br /&gt;done&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Agora chega :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6514185293207821094?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6514185293207821094/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6514185293207821094' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6514185293207821094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6514185293207821094'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/twittersh-verso-20.html' title='Twitter.sh versão 2.0'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7950969381235903098</id><published>2008-01-29T21:59:00.000-03:00</published><updated>2008-01-29T22:24:06.667-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter + shell script</title><content type='html'>Como acessar o twitter a partir de um shell script de apenas 2 linhas? Fácil&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;links -dump http://m.twitter.com/${1} | tac | sed -n '/\*/,$p' | tac | tail +2&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Basta informar o username a ser impresso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$./twitter.sh pac_man&lt;br /&gt;   Twitter&lt;br /&gt;&lt;br /&gt;   pac_man pac_man fogo controlado agora. about 1 hour ago&lt;br /&gt;&lt;br /&gt;   Previous Updates&lt;br /&gt;     * minha cozinha pegou fogo. about 4 hours ago&lt;br /&gt;     * @gchapiewski To com a cuia, onde se compra a erva (mate)? about 9&lt;br /&gt;       hours ago&lt;br /&gt;     * @pcalcado alias XYZZY='echo -ne Zork!' about 16 hours ago&lt;br /&gt;     * XYZZY about 16 hours ago&lt;br /&gt;     * 4 horas pra montar um armario. Pelo menos jantei pizza. 08:36 PM&lt;br /&gt;       January 28, 2008&lt;br /&gt;     * Odeio fazer mudanc,a! Armario ainda nao ta pronto... 03:41 PM January&lt;br /&gt;       28, 2008&lt;br /&gt;     * Amanha chega a minha mudanc,a. Terei um pc finalmente. 07:41 PM&lt;br /&gt;       January 27, 2008&lt;br /&gt;     * Odeio limpar a areia dos gatos. 07:38 PM January 27, 2008&lt;br /&gt;     * E ainda tenho q desmontar uma geladeira :/ 12:30 PM January 27, 2008&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7950969381235903098?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7950969381235903098/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7950969381235903098' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7950969381235903098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7950969381235903098'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/twitter-shell-script.html' title='Twitter + shell script'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1296774309072643033</id><published>2008-01-28T20:27:00.000-03:00</published><updated>2008-01-28T20:29:37.430-03:00</updated><title type='text'>Nada de muito novo.</title><content type='html'>A mudança chegou hoje. Sexta começa a labuta, até lá tem muita coisa pra desencaixotar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1296774309072643033?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1296774309072643033/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1296774309072643033' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1296774309072643033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1296774309072643033'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/nada-de-muito-novo.html' title='Nada de muito novo.'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3027072429989275544</id><published>2008-01-20T15:15:00.000-03:00</published><updated>2008-01-20T15:16:51.066-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rj'/><title type='text'>Enquanto isso, no RJ</title><content type='html'>Depois de uma semana turbulenta cheguei vivo ao RJ, e continuo até agora.&lt;br /&gt;&lt;br /&gt;Não tenho muitas novidades além do calos e da ansiedade - e estou sem PC em casa. &lt;br /&gt;&lt;br /&gt;Logo terei novidades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3027072429989275544?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3027072429989275544/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3027072429989275544' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3027072429989275544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3027072429989275544'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/enquanto-isso-no-rj.html' title='Enquanto isso, no RJ'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8444579251843198140</id><published>2008-01-09T19:59:00.000-03:00</published><updated>2008-01-09T21:28:48.099-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='globo.com'/><title type='text'>Centésimo Post: Uma novidade!</title><content type='html'>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/"&gt;este post&lt;/a&gt;. Fiquei impressionado como &lt;span style="font-weight:bold;"&gt;tanta &lt;/span&gt;coisa fez sentido pra mim.&lt;br /&gt;&lt;br /&gt;Eu era só um &lt;span style="font-style:italic;"&gt;test developer&lt;/span&gt; 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"&gt;amigos &lt;/a&gt;que diziam "isso não se faz mais, hoje em dia se usa hibernate/struts/webwork/...", q coisa não? &lt;br /&gt;&lt;br /&gt;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;"&gt;programar&lt;/span&gt;. Mas quando li &lt;a href="http://blog.fragmental.com.br/2007/08/15/introduzindo-agilidade-num-ambiente/"&gt;este post&lt;/a&gt; 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/"&gt;globo.com&lt;/a&gt; , afinal eu sabia das minhas limitações e, naquela época, eu estava pensando em tentar a vida lá.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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"&gt;Guilherme&lt;/a&gt; disse "e ai, pacman?" eu gelei.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;"Trabalhar na Barra da Tijuca, ruim né?"&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;2008 promete :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8444579251843198140?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8444579251843198140/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8444579251843198140' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8444579251843198140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8444579251843198140'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/centsimo-post-uma-novidade.html' title='Centésimo Post: Uma novidade!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8916010241196518061</id><published>2008-01-07T16:51:00.000-03:00</published><updated>2008-01-07T17:30:08.057-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Se-Arrependimento-Matasse'/><title type='text'>Coisas que eu gostaria de ter escutado antes.</title><content type='html'>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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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&gt;potente&lt;/em&gt; 286 com 1 mega de ram).&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;As vezes precisamos acordar: estar dentro de um curso de graduação, principalmente no curso &lt;strong&gt;errado&lt;/strong&gt;, 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 /&gt;&lt;br /&gt;Coisas que eu gostaria de ter escutado antes:&lt;br /&gt;&lt;br /&gt;- Leia muitos e diferentes livros&lt;br /&gt;- Aprenda Inglês (ao ponto de falar bem ao telefone)&lt;br /&gt;- Se tiver a chance: Aprenda a Dirigir. Dane-se que vc não tem carro&lt;br /&gt;- Trate o seu currículo e a sua carreira com respeito&lt;br /&gt;- Aprenda Java, Python, Ruby, Shell, AWK, HTML, C++, LISP, SQL...&lt;br /&gt;- Aprenda BEM e pratique muito.&lt;br /&gt;- 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 /&gt;E o principal,&lt;br /&gt;- 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;E fluidez não se ensina, se aprende aos poucos.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;E se preparem para errar. Só acerta muito quem erra bastante.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Um abraço e espero que faça sentido para alguem :)&lt;br /&gt;&lt;br /&gt;Feliz 2008!&lt;br /&gt;&lt;br /&gt;Ps: é normal rodar em Cálculo I a primeira vez que se faz. Acredite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8916010241196518061?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8916010241196518061/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8916010241196518061' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8916010241196518061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8916010241196518061'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/coisas-que-eu-gostaria-de-ter-escutado.html' title='Coisas que eu gostaria de ter escutado antes.'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1928077140616777052</id><published>2008-01-06T16:11:00.000-03:00</published><updated>2008-01-06T16:21:07.969-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rj'/><title type='text'>Pra bom entendedor...</title><content type='html'>&lt;img src="http://weblogs.newsday.com/sports/watchdog/blog/pacman.gif"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1928077140616777052?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1928077140616777052/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1928077140616777052' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1928077140616777052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1928077140616777052'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/pra-bom-entendendor.html' title='Pra bom entendedor...'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3957507305711208121</id><published>2008-01-03T18:56:00.000-03:00</published><updated>2008-01-06T16:19:58.216-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Coisas boas do Rio de Janeiro</title><content type='html'>Porto Alegre tem coisas boas (chimarrão, redenção, xis do cavanhas, suco da lancheria do parque, gasômetro e polar).&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Fora o Calor...&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Domingo volto pra porto alegre, algumas despedidas irão rolar. Até la estou juntando alguns assuntos nerds para postar aqui :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3957507305711208121?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3957507305711208121/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3957507305711208121' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3957507305711208121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3957507305711208121'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2008/01/coisas-boas-do-rio-de-janeiro.html' title='Coisas boas do Rio de Janeiro'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3349739785699609382</id><published>2007-12-24T12:47:00.000-03:00</published><updated>2007-12-24T12:56:41.333-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Peczenyj agora é cidadão carioca</title><content type='html'>Pois é...&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3349739785699609382?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3349739785699609382/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3349739785699609382' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3349739785699609382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3349739785699609382'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/12/peczenyj-agora-cidado-carioca.html' title='Peczenyj agora é cidadão carioca'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8397208896339439455</id><published>2007-12-18T19:06:00.000-03:00</published><updated>2007-12-18T19:13:18.150-03:00</updated><title type='text'>No Rio</title><content type='html'>3 dias de viagens seguidos. Foi cansativo.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Quarta é o dia...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8397208896339439455?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8397208896339439455/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8397208896339439455' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8397208896339439455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8397208896339439455'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/12/no-rio.html' title='No Rio'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5296986094809880724</id><published>2007-12-14T21:24:00.000-03:00</published><updated>2007-12-14T21:25:58.895-03:00</updated><title type='text'>Ferias</title><content type='html'>Estou saindo de férias, quando tiver novidades irei postar :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5296986094809880724?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5296986094809880724/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5296986094809880724' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5296986094809880724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5296986094809880724'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/12/ferias.html' title='Ferias'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-162787614338082210</id><published>2007-12-03T12:49:00.000-03:00</published><updated>2007-12-03T12:55:29.118-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Testes Unitários com VBScript</title><content type='html'>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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;' Função a ser testada&lt;br /&gt;' EhPrimo determina se um determinado número inteiro é primo ou não&lt;br /&gt;Function EhPrimo(numero)&lt;br /&gt;   '&lt;br /&gt;   'coloque o codigo aqui :)&lt;br /&gt;   '&lt;br /&gt;   EhPrimo=false ' so pra retornar algo...&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;'Coloquei o nome Test para ficar mais facil :)&lt;br /&gt;Sub Test( objQuery, strMessage ) &lt;br /&gt;   If Not objQuery Then&lt;br /&gt;    WScript.Echo VbCrlf &amp; "ERRO: " &amp; strMessage&lt;br /&gt;    WScript.Quit 'no primeiro teste errado...&lt;br /&gt;   End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;' Testando primos&lt;br /&gt;Primos = array(2,3,5,7,11)&lt;br /&gt;For Each Numero  In Primos&lt;br /&gt;  Test EhPrimo(Numero),"Numero " &amp; Numero &amp; " deve ser primo!"&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;' Testando _nao_ primos&lt;br /&gt;NaoPrimos = array(4,6,8,9,10)&lt;br /&gt;For Each Numero In NaoPrimos&lt;br /&gt;  Test (Not EhPrimo(Numero)),"Numero " &amp; Numero &amp; " NAO deve ser primo!"&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;' Testando outras coisas&lt;br /&gt;Test (Not EhPrimo( 0)),"Numero  0 NAO deve ser primo!"&lt;br /&gt;Test (Not EhPrimo( 1)),"Numero  1 NAO deve ser primo!"&lt;br /&gt;Test (Not EhPrimo(-1)),"Numero -1 NAO deve ser primo!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WScript.Echo VbCrlf &amp; "Pronto, passou tudo!"&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pronto, agora &lt;br /&gt;&lt;br /&gt;Qual a vantagem dessa abordagem?&lt;br /&gt; 1) vc se obriga a testar o seu código &lt;br /&gt; 2) vc descobre quais parametros são uteis nas suas funções&lt;br /&gt; 3) vc especifica o comportamento das suas funções ANTES de implementa-la:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-162787614338082210?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/162787614338082210/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=162787614338082210' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/162787614338082210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/162787614338082210'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/12/testes-unitrios-com-vbscript.html' title='Testes Unitários com VBScript'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8813681178130871570</id><published>2007-11-28T13:14:00.000-03:00</published><updated>2007-11-28T13:17:38.621-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tchelinux'/><title type='text'>Evento Tchelinux nesse Sábado</title><content type='html'>Nerds do Sul!&lt;br /&gt;&lt;br /&gt;Sábado (1 de dezembro) haverá mais uma edição do Tchelinux, dessa vez em Porto Alegre.&lt;br /&gt;&lt;br /&gt;Será um dia cheio de palestras de workshops, ao custo de 2 kilos de alimentos não pereciveis.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tchelinux.org/2007/"&gt;http://www.tchelinux.org/2007/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Enfim, um dia cheio de Ubuntu, Python, KDE, Kernel, BSD e muito mais!&lt;br /&gt;&lt;br /&gt;Apareçam!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8813681178130871570?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8813681178130871570/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8813681178130871570' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8813681178130871570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8813681178130871570'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/11/evento-tchelinux-nesse-sbado.html' title='Evento Tchelinux nesse Sábado'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1966825651230014510</id><published>2007-11-17T15:02:00.000-03:00</published><updated>2007-11-17T15:06:12.624-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Analise Orientada a Objetos com Java - Parte 1</title><content type='html'>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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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;"&gt;a visão&lt;/span&gt;. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Professor{}&lt;br /&gt;class Disciplina{}&lt;br /&gt;class Turma{&lt;br /&gt; Disciplina disciplina;&lt;br /&gt; Professor  professor;&lt;br /&gt;}&lt;br /&gt;public class Main{&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  Professor  oseias     = new Professor();&lt;br /&gt;  Disciplina matematica = new Disciplina();&lt;br /&gt;  Turma matA = new Turma();&lt;br /&gt;  &lt;br /&gt;  matA.disciplina = matematica;&lt;br /&gt;  matA.professor  = oseias;&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A minha classe &lt;span style="font-weight:bold;"&gt;Main &lt;/span&gt;mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe &lt;span style="font-weight:bold;"&gt;Professor&lt;/span&gt;, uma classe &lt;span style="font-weight:bold;"&gt;Disciplina &lt;/span&gt;e uma classe &lt;span style="font-weight:bold;"&gt;Turma&lt;/span&gt;. 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;"&gt;composição&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;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;"&gt;temporal&lt;/span&gt;. Sem falar que esta escola todos os professores podem dar qualquer disciplina - agora vamos implementar direito.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Professor{&lt;br /&gt; long id;&lt;br /&gt; private String nome;&lt;br /&gt; public Professor(long id,String nome){&lt;br /&gt;  this.id = id;&lt;br /&gt;  this.nome = nome;&lt;br /&gt; }&lt;br /&gt; public long getId(){ return id; }&lt;br /&gt; public String toString(){ return this.nome ; }&lt;br /&gt; public boolean equals(Object o){&lt;br /&gt;  boolean test = false;&lt;br /&gt;&lt;br /&gt;  if (!(o instanceof Professor))&lt;br /&gt;   test = super.equals(o);&lt;br /&gt;  else &lt;br /&gt;   test = ((Professor) o).getId() == this.id; &lt;br /&gt;  return test;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;class Disciplina{&lt;br /&gt; long id;&lt;br /&gt; private String nome;&lt;br /&gt; public Disciplina(long id,String nome){&lt;br /&gt;  this.id = id;&lt;br /&gt;  this.nome = nome;&lt;br /&gt; }&lt;br /&gt; public long getId(){ return id; }&lt;br /&gt; public String toString(){ return this.nome ; }&lt;br /&gt; public boolean equals(Object o){&lt;br /&gt;  boolean test = false;&lt;br /&gt;&lt;br /&gt;  if (!(o instanceof Disciplina))&lt;br /&gt;   test = super.equals(o);&lt;br /&gt;  else &lt;br /&gt;   test = ((Disciplina) o).getId() == this.id; &lt;br /&gt;  return test;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;class Turma{&lt;br /&gt; long id;&lt;br /&gt; private String nome;&lt;br /&gt; private Disciplina disciplina;&lt;br /&gt; private Professor  professor;&lt;br /&gt; public Turma(long id, String nome,Disciplina disciplina){&lt;br /&gt;  this.id = id;&lt;br /&gt;  this.nome = nome;&lt;br /&gt;  this.disciplina = disciplina;&lt;br /&gt; }&lt;br /&gt; public void setProfessor(Professor  professor){&lt;br /&gt;  this.professor = professor;&lt;br /&gt; }&lt;br /&gt; public long getId(){ return id; }&lt;br /&gt; public String toString(){ &lt;br /&gt;  return this.nome + " [" + this.disciplina &lt;br /&gt;         + "] c/ " + this.professor ; &lt;br /&gt; }&lt;br /&gt; public boolean equals(Object o){&lt;br /&gt;  boolean test = false;&lt;br /&gt;&lt;br /&gt;  if (!(o instanceof Turma))&lt;br /&gt;   test = super.equals(o);&lt;br /&gt;  else &lt;br /&gt;   test = ((Turma) o).getId() == this.id; &lt;br /&gt;  return test;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;public class Main {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  /* objetos bem comportados */&lt;br /&gt;  Professor  oseias     = new Professor(1L,"Oseias");&lt;br /&gt;  Disciplina matematica = new Disciplina(1L,"Matematica");&lt;br /&gt;  Turma matA = new Turma(1L,"Matematica A", matematica);&lt;br /&gt;  matA.setProfessor(oseias); &lt;br /&gt;  &lt;br /&gt;  System.out.println("Professor  " + oseias);    &lt;br /&gt;  System.out.println("Disciplina " + matematica);  &lt;br /&gt;  System.out.println("Turma      " + matA);&lt;br /&gt;  &lt;br /&gt;  /* objetos mal comportados &lt;br /&gt;   * Sujeitos a NullPointerException    */&lt;br /&gt;  Professor juca = new Professor(2L,null);&lt;br /&gt;  Disciplina calculo = new Disciplina(2L,null);&lt;br /&gt;  Turma matB = new Turma(2L,"Matematica B", null);&lt;br /&gt;  matB.setProfessor(null); // nem precisava mas...&lt;br /&gt;  Turma matC = new Turma(3L,"Matematica C",calculo);  &lt;br /&gt;  Turma matD = new Turma(4L,"Matematica D",calculo);&lt;br /&gt;  matD.setProfessor(juca);&lt;br /&gt;  &lt;br /&gt;  System.out.println("Juca?   " + juca);&lt;br /&gt;  System.out.println("Calculo?" + calculo);&lt;br /&gt;  System.out.println("matB?   " + matB);  &lt;br /&gt;  System.out.println("matC?   " + matC);&lt;br /&gt;  System.out.println("matD?   " + matD);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mas que raios eu estou fazendo? veja a saída desse programa:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Professor  Oseias&lt;br /&gt;Disciplina Matematica&lt;br /&gt;Turma      Matematica A [Matematica] c/ Oseias&lt;br /&gt;Juca?   null&lt;br /&gt;Calculo?null&lt;br /&gt;matB?   Matematica B [null] c/ null&lt;br /&gt;matC?   Matematica C [null] c/ null&lt;br /&gt;matD?   Matematica D [null] c/ null&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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/"&gt;HashCode&lt;/a&gt;, enfim, tem muito pano pra manga. &lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1966825651230014510?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1966825651230014510/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1966825651230014510' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1966825651230014510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1966825651230014510'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/11/analise-orientada-objetos-com-java.html' title='Analise Orientada a Objetos com Java - Parte 1'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2669988203802873754</id><published>2007-11-08T19:56:00.000-03:00</published><updated>2007-11-08T20:02:40.481-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filhos'/><title type='text'>Nascimentos</title><content type='html'>Coisas maravilhosas acontecem.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;É... 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 /&gt;&lt;br /&gt;Na hora certa (espero eu).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2669988203802873754?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2669988203802873754/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2669988203802873754' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2669988203802873754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2669988203802873754'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/11/nascimentos.html' title='Nascimentos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4970524329641521540</id><published>2007-11-06T14:28:00.001-03:00</published><updated>2007-11-06T14:33:28.966-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testes'/><title type='text'>Ferramentas de Teste</title><content type='html'>Excelente comparativo de duas ferramentas gratuitas de teste automatizado para interfaces web.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/"&gt;http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pelo escore final, creio que muitos projetos web poderiam ser beneficiados pela combinação destas duas ferramentas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4970524329641521540?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4970524329641521540/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4970524329641521540' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4970524329641521540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4970524329641521540'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/11/ferramentas-de-teste.html' title='Ferramentas de Teste'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7035321534920993307</id><published>2007-11-06T13:50:00.000-03:00</published><updated>2007-11-06T13:52:29.916-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nerd'/><title type='text'>From Nand to Tetris in 12 Steps</title><content type='html'>Otimo vídeo - Google Tech Talks October 10 ,2007&lt;br /&gt;&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=""&gt; &lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Link direto &lt;a href="http://video.google.com/videoplay?docid=7654043762021156507"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7035321534920993307?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7035321534920993307/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7035321534920993307' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7035321534920993307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7035321534920993307'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/11/from-nand-to-tetris-in-12-steps.html' title='From Nand to Tetris in 12 Steps'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-9105988811877501493</id><published>2007-10-31T13:09:00.000-03:00</published><updated>2007-10-31T13:12:43.997-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>AWK e Arrays Associativos</title><content type='html'>Um grande problema para quem trabalha com arrays associativos no AWK é&lt;br /&gt;com relação a ordem dos elementos quando esta fazendo uma iteração.&lt;br /&gt;&lt;br /&gt;Ex:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'&lt;br /&gt;1&lt;br /&gt;3&lt;br /&gt;5&lt;br /&gt;4&lt;br /&gt;2&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Eu inseri, nessa ordem, 5, depois 4, depois 2... porém o acesso aos&lt;br /&gt;elementos de um array em um for do tipo&lt;br /&gt;&lt;pre&gt;&lt;code&gt;for( variavel in array)&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;é imprevisive / incontrolável.&lt;br /&gt;&lt;br /&gt;Agora vejamos isto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ WHINY_USERS=1 gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'&lt;br /&gt;5&lt;br /&gt;4&lt;br /&gt;2&lt;br /&gt;1&lt;br /&gt;3&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;E para acessar os valores na ordem crescente:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ WHINY_USERS=1  gawk 'BEGIN{ split("5 4 2 1 3",T)&lt;br /&gt; asort(T) ;  for(i in T) print T[i] }'&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A variavel de ambiente WHINY_USERS &lt;span style="font-weight:bold;"&gt;não&lt;/span&gt; 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;"&gt;comp.lang.awk&lt;/span&gt; e, por incrivel que pareça, tive que vasculhar o codigo fonte do &lt;span style="font-style:italic;"&gt;gawk&lt;/span&gt; (graças a deus podemos fazer isso) para entender melhor o que essa variavel poderia fazer.&lt;br /&gt;&lt;br /&gt;Enfim, fica a dica.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-9105988811877501493?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/9105988811877501493/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=9105988811877501493' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9105988811877501493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9105988811877501493'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/awk-e-arrays-associativos.html' title='AWK e Arrays Associativos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3550880422781392812</id><published>2007-10-30T14:53:00.000-03:00</published><updated>2007-10-30T14:55:01.468-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Tchelinux 2007 - Chamada de trabalhos</title><content type='html'>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 /&gt;&lt;br /&gt;Sobre o Temário:&lt;br /&gt;&lt;br /&gt;A equipe de avaliação de propostas irá selecionar 10 palestras técnicas sobre Software Livre dentro dos seguintes temas:&lt;br /&gt;&lt;br /&gt;Sistemas Operacionais&lt;br /&gt;Desktop baseado em Software Livre&lt;br /&gt;Aplicativos Gráficos&lt;br /&gt;Jogos e Multimídia&lt;br /&gt;Linguagens de programação&lt;br /&gt;Ferramentas para desenvolvimento&lt;br /&gt;Banco de dados&lt;br /&gt;Administração de Sistemas&lt;br /&gt;Redes e Segurança da Informação&lt;br /&gt;&lt;br /&gt;Sobre as Apresentações:&lt;br /&gt;&lt;br /&gt;- Cada palestrante terá 75 minutos para apresentar seu trabalho &lt;br /&gt;- Os recursos disponíveis serão projetor multimídia e micro-computador rodando Ubuntu Gutsy&lt;br /&gt;- O palestrante deverá permitir que os slides de sua palestra seja publicada no site do grupo&lt;br /&gt;- Não haverá nenhuma remuneração ou reembolso de despesas para palestrantes&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tchelinux.org/papers/"&gt;http://www.tchelinux.org/papers/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Participem!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3550880422781392812?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3550880422781392812/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3550880422781392812' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3550880422781392812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3550880422781392812'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/tchelinux-2007-chamada-de-trabalhos.html' title='Tchelinux 2007 - Chamada de trabalhos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6217281068639391090</id><published>2007-10-24T11:09:00.000-03:00</published><updated>2007-10-25T09:12:27.512-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Entendendo Ponteiros na linguagem C</title><content type='html'>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 /&gt;&lt;br /&gt;Com auxilio do pre-processador C, vejamos se este exemplo que pode ser elucidativo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include "pointer.h" &lt;br /&gt;int main () &lt;br /&gt;{ &lt;br /&gt;        int x = 0;              // variavel de exemplo &lt;br /&gt;        pointer(int) y;         // ponteiro &lt;br /&gt;&lt;br /&gt;        y = address(x);         // y aponta para o endereco de x &lt;br /&gt;&lt;br /&gt;        x++;                    // incrementamos o valor de x &lt;br /&gt;        value(y)++;             // incremento indireto (via ponteiro) &lt;br /&gt;&lt;br /&gt;        printf("value   %d %d\n",x, value(y) ); &lt;br /&gt;        printf("address %p %p\n",address(x), y ); &lt;br /&gt;&lt;br /&gt;        return 0; &lt;br /&gt;} &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Vejamos agora o resultado da execução:&lt;br /&gt;&lt;pre&gt;$ ./a.out&lt;br /&gt;value   2 2&lt;br /&gt;address 0xbfffeaa4 0xbfffeaa4&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;O codigo gerado pelas macros &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;int main () &lt;br /&gt;{ &lt;br /&gt;        int x = 0; // variavel de exemplo &lt;br /&gt;        int * y; // ponteiro &lt;br /&gt;&lt;br /&gt;        y = (&amp;(x)); // y aponta para o endereco de x &lt;br /&gt;&lt;br /&gt;        x++; // incrementamos o valor de x &lt;br /&gt;        (*y)++; // incremento indireto (via ponteiro) &lt;br /&gt;&lt;br /&gt;        printf("value   %d %d\n",x, (*y)); &lt;br /&gt;        printf("address %p %p\n",(&amp;(x)), y); &lt;br /&gt;&lt;br /&gt;        return 0; &lt;br /&gt;} &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eu recomendo que, uma vez que o conceito tenha ficado claro, &lt;span style="font-weight:bold;"&gt;que não se use mais este header&lt;/span&gt; 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 /&gt;&lt;br /&gt;Para fazer este exemplo, utilizamos este arquivo header:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#define pointer(type)                    type *&lt;br /&gt;#define value(var)                       (*(var))&lt;br /&gt;#define address(var)                     (&amp;(var))&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6217281068639391090?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6217281068639391090/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6217281068639391090' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6217281068639391090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6217281068639391090'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/entendendo-ponteiros-na-linguagem-c.html' title='Entendendo Ponteiros na linguagem C'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-513616368760185567</id><published>2007-10-07T21:22:00.000-03:00</published><updated>2007-10-07T21:33:32.941-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nerd'/><title type='text'>Tropa de Elite 2 - Dia de Treinamento Java</title><content type='html'>Seguimos com novos exemplos inspirados na triste realidade da polícia carioca.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/*&lt;br /&gt;* O Bope foi criado para atuar quando a policia perde o controle&lt;br /&gt;* E no rio de janeiro isso acontece com bastante frequencia&lt;br /&gt;*/&lt;br /&gt;class Bope{      &lt;br /&gt; private String nome; &lt;br /&gt; private int qtdeVitimas = 1; // ja começa bem!&lt;br /&gt;  &lt;br /&gt; public Bope(String nome){&lt;br /&gt;  this.nome = nome;&lt;br /&gt; }  &lt;br /&gt; // sobrecarga do método ondeTaOBaiano&lt;br /&gt; public void ondeTaOBaiano(Estudante e){&lt;br /&gt;    e.sabeVoarEstudante();&lt;br /&gt; }&lt;br /&gt; public void ondeTaOBaiano(Traficante t){&lt;br /&gt; t.levaSacoNaCabeca();&lt;br /&gt; }&lt;br /&gt; // exemplo de método final!&lt;br /&gt; public final Doze encontreiOBaiano(Baiano b){&lt;br /&gt; return b.naCaraNaoQueEhPraNaoEstragarVelorio();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Treinamento{&lt;br /&gt; public static void main(String [] xxx){&lt;br /&gt;  // Apresento o capitão nascimento&lt;br /&gt;  Bope instrutor = new Bope("Capitao Nascimento");&lt;br /&gt;  try{&lt;br /&gt; // de cada 100 policiais que fazem o curso do Bope,&lt;br /&gt; // so se formam 5, e eu, quando me formei parceiro,   &lt;br /&gt; // eramos apenas 3.  &lt;br /&gt;        Turma.tentaFazerCursoBopeCom(capitao);&lt;br /&gt;  } catch (PolicialCorruptoEncontrado pce){&lt;br /&gt;&lt;br /&gt;  } catch (PolicialFracoEncontrado pfe){&lt;br /&gt;&lt;br /&gt;  } catch (PolicialSemABandoleiraNessaAlturadoCampeonato e){&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;SEUS FANFARRÕES!&lt;br /&gt;VCS TEM 10 &lt;span style="font-weight:bold;"&gt;SEGUNDOS &lt;/span&gt;PARA COMPLETAR ESSE CÓDIGO!&lt;br /&gt;&lt;br /&gt;- O zero-dois NÃO está escrevendo!&lt;br /&gt;- SEU zero-dois, porque o senhor não escreveu nenhuma linha?&lt;br /&gt;- A-a minha IDE não terminou de carregar, senhor...&lt;br /&gt;- Agora a sua IDE ja carregou, seu zero-dois?&lt;br /&gt;- S-sim senhor...&lt;br /&gt;- 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 /&gt;&lt;br /&gt; &lt;hr/&gt;&lt;br /&gt;HOMEM DE PRETO QUAL É A SUA MISSÃO?&lt;br /&gt;É APRENDER JAVA SEM PRECISAR DE CERTIFICAÇÃO!&lt;br /&gt;HOMEM DE PRETO O QUE É QUE VC FAZ?&lt;br /&gt;FAÇO CODIGO FONTE QUE ASSUSTA O SATANÁS!&lt;br /&gt; &lt;hr/&gt;&lt;br /&gt;Estratégia, do inglês, &lt;a href="http://www.tml.tkk.fi/~pnr/GoF-models/html/Strategy.html"&gt;Strategy&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;- Senhor, o zero-cinco está dormindo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-513616368760185567?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/513616368760185567/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=513616368760185567' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/513616368760185567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/513616368760185567'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/tropa-de-elite-2-dia-de-treinamento.html' title='Tropa de Elite 2 - Dia de Treinamento Java'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5597463576440891884</id><published>2007-10-04T21:10:00.001-03:00</published><updated>2007-10-04T21:42:47.296-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nerd'/><title type='text'>Aprendendo Conceitos antes de Sintaxe</title><content type='html'>O homem aprende por dois motivos: por gosto ou por necessidade.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Através do &lt;a href="http://en.wikipedia.org/wiki/MOO"&gt;MOO&lt;/a&gt; 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 /&gt;&lt;br /&gt;É 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 /&gt;&lt;br /&gt;Anos depois, conversando com o &lt;a href="http://unixmania.blogspot.com/"&gt;CaSantos&lt;/a&gt; caímos em uma micro-aula de programação. Eis que ele profere sabias palavras: &lt;span style="font-style:italic;"&gt;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&gt;.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Pois bem, se é uma disciplina &lt;span style="font-style:italic;"&gt;introdutória&lt;/span&gt;, 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;"&gt;ensina&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;videolocadora.h&lt;br /&gt;&lt;pre&gt;&lt;code&gt;int cadastra_video(char *nome, int preco, int categoria);&lt;br /&gt;int cadastra_cliente(char *nome, char *cpf, char *endereco);&lt;br /&gt;int aluga_video(...);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Quer ensinar a fazer telinha? Ensina em outra disciplina, nesse caso ensinando técnicas de design &lt;span style="font-style:italic;"&gt;apropriadas&lt;/span&gt;. 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;"&gt;grep&lt;/span&gt;? Criar interfaces com o usuário não é algo facil, requer muito estudo, principalmente de usabilidade.&lt;br /&gt;&lt;br /&gt;Alias fazer "telinhas" geralmente supõe colocar um programa em um &lt;span style="font-style:italic;"&gt;estado&lt;/span&gt;. 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 /&gt;&lt;br /&gt;Fica aqui a minha sugestão. Espero que faça sentido :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5597463576440891884?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5597463576440891884/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5597463576440891884' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5597463576440891884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5597463576440891884'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/aprendendo-conceitos-antes-de-sintaxe.html' title='Aprendendo Conceitos antes de Sintaxe'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1502911505960747500</id><published>2007-10-01T19:29:00.000-03:00</published><updated>2007-10-02T18:58:15.245-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Convertendo Números</title><content type='html'>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 /&gt;&lt;br /&gt;Fiz a maior sequencia de ifs da minha vida. Hoje estava relembrando e resolvi fazer uma versão SED.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/[0-9]*[5-9]...$/q&lt;br /&gt;s/1...$/M&amp;/;s/2...$/MM&amp;/;s/3...$/MMM&amp;/;s/4...$/MMMM&amp;/&lt;br /&gt;s/6..$/DC&amp;/;s/7..$/DCC&amp;/;s/8..$/DCCC&amp;/;s/9..$/CM&amp;/&lt;br /&gt;s/1..$/C&amp;/;s/2..$/CC&amp;/;s/3..$/CCC&amp;/;s/4..$/CD&amp;/;s/5..$/D&amp;/&lt;br /&gt;s/6.$/LX&amp;/;s/7.$/LXX&amp;/;s/8.$/LXXX&amp;/;s/9.$/XC&amp;/&lt;br /&gt;s/1.$/X&amp;/;s/2.$/XX&amp;/;s/3.$/XXX&amp;/;s/4.$/XL&amp;/;s/5.$/L&amp;/&lt;br /&gt;s/1$/I/;s/2$/II/;s/3$/III/;s/4$/IV/;s/5$/V/&lt;br /&gt;s/6$/VI/;s/7$/VII/;s/8$/VIII/;s/9$/IX/&lt;br /&gt;s/[0-9]//g&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tendo um número por linha ja basta. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ echo '3999' | sed -f other.sed&lt;br /&gt;MMMCMXCIX&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O sed é realmente fantástico! Pena que acima de 5 mil tem que colocar &lt;a href="http://en.wikipedia.org/wiki/Roman_numerals"&gt;uma barra em cima dos números&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1502911505960747500?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1502911505960747500/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1502911505960747500' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1502911505960747500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1502911505960747500'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/10/convertendo-nmeros.html' title='Convertendo Números'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-9104024938932641835</id><published>2007-09-30T21:01:00.000-03:00</published><updated>2007-09-30T21:08:19.446-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bope'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Aprenda Java com os melhores versão Tropa de Elite</title><content type='html'>Exatamente: Não vem com essa que vc é &lt;span style="font-style:italic;"&gt;istudante&lt;/span&gt;, 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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/*&lt;br /&gt;* O Bope foi criado para atuar quando a policia perde o controle&lt;br /&gt;* E no rio de janeiro isso acontece com bastante frequencia&lt;br /&gt;*/&lt;br /&gt;class Bope{&lt;br /&gt;        &lt;br /&gt; private String nome; &lt;br /&gt; private int vitimas;&lt;br /&gt;  &lt;br /&gt; public Bope(String nome){&lt;br /&gt;  this.nome = nome;&lt;br /&gt;  this.vitimas =0;&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; public void matou(int tantas_vitimas_agora){    &lt;br /&gt;  this.vitimas = this.vitimas + tantas_vitimas_agora;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int quantas_vitimas(){&lt;br /&gt;  return this.vitimas;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Programa{&lt;br /&gt; public static void main(String [] xxx){&lt;br /&gt;  // Apresento o capitão nascimento&lt;br /&gt;  Bope capitao = new Bope("Capitao Nascimento");&lt;br /&gt;  &lt;br /&gt;  // quando o capitão sobe a favela, é pra matar, não pra morrer&lt;br /&gt;  capitao.matou(1000);&lt;br /&gt;  &lt;br /&gt;  // agora ele subiu o morro de novo, com ele não tem erro.&lt;br /&gt;  capitao.matou(2000);&lt;br /&gt;  &lt;br /&gt;  // e a farda dele não é azul, é PRETA&lt;br /&gt;  System.out.println("O Bope matou: " + capitao.quantas_vitimas());&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Entendeu? Não?&lt;br /&gt;&lt;br /&gt;ENTÃO PEDE PRA SAIR, GUERREIRO!&lt;br /&gt;TU É CORRUPTO, TEU LUGAR É COM .NET, É COM VB! JOCKEY DE IDE! PEDE PRA SAIR AGORA!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-9104024938932641835?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/9104024938932641835/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=9104024938932641835' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9104024938932641835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/9104024938932641835'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/aprenda-java-com-os-melhores-verso.html' title='Aprenda Java com os melhores versão Tropa de Elite'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1977849899110997762</id><published>2007-09-28T11:43:00.000-03:00</published><updated>2007-09-28T11:55:11.462-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Ruby e o method_missing</title><content type='html'>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;"&gt;runtime&lt;/span&gt;, é um recurso muito necessário, ainda mais se pensarmos em termos de &lt;span style="font-style:italic;"&gt;Duck Typing&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Em caso de dúvida, basta fazer um &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt;, afinal chamar um método que não existe causa um &lt;span style="font-weight:bold;"&gt;NoMethodError&lt;/span&gt;, certo?&lt;br /&gt;&lt;br /&gt;Depende. Observe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class A&lt;br /&gt;        def xxx()&lt;br /&gt;                puts "xxx"&lt;br /&gt;        end&lt;br /&gt;        def method_missing(m, *args)&lt;br /&gt;                puts "nao tenho esse metodo: #{m}"&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;a = A.new&lt;br /&gt;a.xxx&lt;br /&gt;# aqui normalmente daria erro e o script seria abortado &lt;br /&gt;# sem o rescue adequado&lt;br /&gt;a.yyy &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Resultado:&lt;br /&gt;&lt;pre&gt;~&gt; ruby A.rb&lt;br /&gt;xxx&lt;br /&gt;nao tenho esse metodo: yyy&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1977849899110997762?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1977849899110997762/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1977849899110997762' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1977849899110997762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1977849899110997762'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/ruby-e-o-methodmissing.html' title='Ruby e o method_missing'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1865059820947096179</id><published>2007-09-24T23:33:00.001-03:00</published><updated>2007-09-24T23:33:55.842-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Ruby e suas travessuras</title><content type='html'>&lt;pre&gt;&lt;code&gt;irb(main):001:0&gt; def some(thing)&lt;br /&gt;irb(main):002:1&gt;    puts "some#{thing}"&lt;br /&gt;irb(main):003:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):004:0&gt; some "thing"&lt;br /&gt;something&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):005:0&gt; some = "thing"&lt;br /&gt;=&gt; "thing"&lt;br /&gt;irb(main):006:0&gt; some(some)&lt;br /&gt;something&lt;br /&gt;=&gt; nil&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1865059820947096179?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1865059820947096179/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1865059820947096179' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1865059820947096179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1865059820947096179'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/ruby-e-suas-travessuras.html' title='Ruby e suas travessuras'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4627513189384980755</id><published>2007-09-22T15:47:00.000-03:00</published><updated>2007-09-22T15:51:47.173-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Ajude para ser ajudado.</title><content type='html'>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 /&gt;&lt;br /&gt;Por exemplo:&lt;br /&gt;   &lt;blockquote&gt;no postgresql o comando sql abaixo funciona perfeitamente  &lt;br /&gt;     &lt;br /&gt;   "SELECT c.descricao, u.nome, v.data_venda ,"  &lt;br /&gt;   + "v.valor_total, v.condicao_pagamento, v.codigo"   &lt;br /&gt;   + "from venda v, carro c, usuario u"   &lt;br /&gt;   + "where v.carro = c.codigo and v.usuario = u.codigo";  &lt;br /&gt;     &lt;br /&gt;   mas quando executo no java ocorre erro&lt;/blockquote&gt;  &lt;br /&gt;&lt;br /&gt;Não vejo diferença entre falar apenas isso e esta conversa pelo telefone:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- Alo, consultório médico&lt;br /&gt;- Doutor, é a primeira vez que ligo, nunca nos vimos...&lt;br /&gt;- Pronto, me diga o que esta sentindo.&lt;br /&gt;- me sinto mal...&lt;br /&gt;- Ah, tome um chá de joaçaba com mel e 2 anti-coagulantes&lt;br /&gt;- Certo, e quanto a isso aqui na minha perna?&lt;br /&gt;- Humm... vamos ter que operar. Ou espera uma semana que passa...&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Enfim...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4627513189384980755?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4627513189384980755/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4627513189384980755' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4627513189384980755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4627513189384980755'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/ajude-para-ser-ajudado.html' title='Ajude para ser ajudado.'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5678618992008434456</id><published>2007-09-22T00:55:00.001-03:00</published><updated>2007-09-22T00:57:14.737-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Resumo do primeiro Chopp on Rails de  Poa</title><content type='html'>O pessoal da lista &lt;a href="http://groups.google.com/group/rails-rs"&gt;rails-rs&lt;/a&gt; organizou um encontro em um local com bastante cerveja.&lt;br /&gt;&lt;br /&gt;Acho que a melhor descrição do que poderia ter sido é esta:&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7TTqNXNMnHk"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7TTqNXNMnHk" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5678618992008434456?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5678618992008434456/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5678618992008434456' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5678618992008434456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5678618992008434456'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/resumo-do-primeiro-chopp-on-rails-de.html' title='Resumo do primeiro Chopp on Rails de  Poa'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1616642615403308601</id><published>2007-09-18T10:11:00.001-03:00</published><updated>2007-09-19T10:00:22.552-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Curso de Ruby on Rails em Porto Alegre</title><content type='html'>Uma oportunidade imperdível!&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://www.techoffice.com.br/"&gt;Tech Office IT&lt;/a&gt; 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"&gt;Ruby on Rails&lt;/a&gt;, 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;a href="http://www.techoffice.com.br/ruby/flyer_ruby.htm"&gt;Mais detalhes sobre o curso de Ruby on Rails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.techoffice.com.br/ruby/insc_ruby.htm"&gt;Clique aqui para se inscrever no curso de Ruby On Rails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se alguem não sabe o poder do Ruby on Rails, veja esse &lt;a href="http://www.youtube.com/v/Gzj723LkRJY"&gt;video&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Gzj723LkRJY"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Gzj723LkRJY" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1616642615403308601?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1616642615403308601/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1616642615403308601' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1616642615403308601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1616642615403308601'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/curso-de-ruby-on-rails-em-porto-alegre.html' title='Curso de Ruby on Rails em Porto Alegre'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-428453790941259207</id><published>2007-09-18T09:58:00.000-03:00</published><updated>2007-09-18T10:03:55.999-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vagas'/><title type='text'>Vagas Abertas!</title><content type='html'>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 /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Desenvolvedor C# - 3 vagas&lt;/span&gt;&lt;br /&gt;Experiência em desenvolvimento/programação de SW em C# e .Net&lt;br /&gt;Conhecimentos sobre UML e OO e design patterns&lt;br /&gt;Conhecimentos sobre XML e XPATH&lt;br /&gt;Inglês avançado/fluente&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Desenvolvedor/Testador - 2 vagas&lt;/span&gt;&lt;br /&gt;Experiência na área de teste de software&lt;br /&gt;Conhecimento de WebServices e protocolos SOAP e HTTP&lt;br /&gt;Conhecimento de XML, XPATH e alguma linguagem Script&lt;br /&gt;Experiência em OO&lt;br /&gt;Inglês fluente&lt;br /&gt;&lt;br /&gt;É claro, caso alguem queira ingressar na área de informática, eu sugiro que pense nessa vaga:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testador de Software&lt;/span&gt;&lt;br /&gt;Experiência na área de teste de software&lt;br /&gt;Conhecimentos em Banco de Dados e SQL (select, update, insert,delete)&lt;br /&gt;&lt;br /&gt;Aos interessados enviar email com currículo para tiago (.) peczenyj (at) gmail (.) com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-428453790941259207?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/428453790941259207/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=428453790941259207' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/428453790941259207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/428453790941259207'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/09/vagas-abertas.html' title='Vagas Abertas!'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7809149246971972963</id><published>2007-08-29T21:29:00.000-03:00</published><updated>2007-08-29T21:32:52.061-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Die Working Hardly</title><content type='html'>Sensacional Filme sobre efeitos especiais... sem efeitos especiais.&lt;br /&gt;&lt;br /&gt;Foi dirigido pelo &lt;span style="font-style:italic;"&gt;Zach Lipovsky&lt;/span&gt;, para concorrer no &lt;span style="font-style:italic;"&gt;On The Lot&lt;/span&gt;, 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 /&gt;&lt;br /&gt;Quem não gostaria de fazer isso no seu proprio ambiente de trabalho?&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PdSvYGIuiUw"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PdSvYGIuiUw" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Link &lt;a href="http://www.youtube.com/watch?v=PdSvYGIuiUw"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7809149246971972963?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7809149246971972963/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7809149246971972963' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7809149246971972963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7809149246971972963'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/die-working-hardly.html' title='Die Working Hardly'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7215601852027723253</id><published>2007-08-28T15:17:00.000-03:00</published><updated>2007-08-28T20:38:17.334-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Metaprogramação com awk e sed</title><content type='html'>Criar um programa que cria programas é simples nas linguagens interpretadas.&lt;br /&gt;&lt;br /&gt;Criamos o programa em uma string e executamos via &lt;span style="font-weight:bold;"&gt;eval()&lt;/span&gt; ou então gravamos em arquivo e executamos novamente.&lt;br /&gt;&lt;br /&gt;Me deparei com o seguinte problema: inverter as palavras de uma frase ou arquivo &lt;span style="font-weight:bold;"&gt;mantendo&lt;/span&gt; a ordem em que aparecem.&lt;br /&gt;&lt;br /&gt;É 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 /&gt;&lt;br /&gt;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;"&gt;sed &lt;/span&gt;faz isso com um pé nas costas.&lt;br /&gt;&lt;br /&gt;Eu tenho um arquivo (poderia ser um &lt;a href="http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo011#Named_Pipes"&gt;named pipe&lt;/a&gt;) 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 /&gt;&lt;br /&gt;Uso o paste para colocar os arquivo lado a lado e uso o awk para gerar comandos como este:&lt;pre&gt;s/\bpalavra\b/palavra_revertida/g;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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;"&gt;borda&lt;/span&gt; das expressões regulares. Isso me garante que vou trocar uma palavra inteira, e não um pedaço da string.&lt;br /&gt; &lt;br /&gt;Agora vem o pulo do gato: mando estes comandos via &lt;span style="font-style:italic;"&gt;stdin &lt;/span&gt;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 /&gt;&lt;br /&gt;Vejam o resultado abaixo, espero que seja útil para alguem :)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ cat stuff&lt;br /&gt;Nosso fórum principal.&lt;br /&gt;&lt;br /&gt;Problemas com hardware em geral,&lt;br /&gt;&lt;br /&gt;temperaturas, comparação de desempenho,&lt;br /&gt;&lt;br /&gt;compatibilidades de componentes, etc.&lt;br /&gt;&lt;br /&gt;$ LC_ALL=pt_BR grep -oE '\w+' stuff | sort -u | tee direito | rev &gt; reverso&lt;br /&gt;&lt;br /&gt;$ paste direito reverso | awk '{&lt;br /&gt;     printf "s/\\b%s\\b/%s/g;\n",$1,$2 # facil, não?&lt;br /&gt;  }' | sed -f - stuff&lt;br /&gt;ossoN muróf lapicnirp.&lt;br /&gt;&lt;br /&gt;samelborP moc erawdrah me lareg,&lt;br /&gt;&lt;br /&gt;sarutarepmet, oãçarapmoc ed ohnepmesed,&lt;br /&gt;&lt;br /&gt;sedadilibitapmoc ed setnenopmoc, cte.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como o arquivo possui acentos, precisei setar a variavel &lt;span style="font-weight:bold;"&gt;LC_ALL&lt;/span&gt; para &lt;span style="font-weight:bold;"&gt;pt_BR&lt;/span&gt;, caso contrario a expressão regular &lt;span style="font-weight:bold;"&gt;\w+&lt;/span&gt; não iria casar com todas as palavras.&lt;br /&gt;&lt;br /&gt;Ps: Julio, que tal chamar isso de "Inversor do Tiago"?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7215601852027723253?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7215601852027723253/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7215601852027723253' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7215601852027723253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7215601852027723253'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/metaprogramao.html' title='Metaprogramação com awk e sed'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-8098078270033514476</id><published>2007-08-28T15:15:00.000-03:00</published><updated>2007-08-28T20:46:33.109-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Extended Globbing</title><content type='html'>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 /&gt;&lt;br /&gt;Acho que, em alguns casos, podera ser BEM util, eliminando um pipe para um grep por exemplo.&lt;br /&gt;&lt;br /&gt;São eles (direto do man)&lt;br /&gt;&lt;pre&gt;?(pattern-list)&lt;br /&gt;     Matches zero or one occurrence of the given patterns&lt;br /&gt;*(pattern-list)&lt;br /&gt;     Matches zero or more occurrences of the given patterns&lt;br /&gt;+(pattern-list)&lt;br /&gt;     Matches one or more occurrences of the given patterns&lt;br /&gt;@(pattern-list)&lt;br /&gt;     Matches exactly one of the given patterns&lt;br /&gt;!(pattern-list)&lt;br /&gt;     Matches anything except one of the given patterns&lt;/pre&gt;&lt;br /&gt;Para poder utiliza-lo precisa executar o shopt conforme o exemplo abaixo&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ shopt -s extglob&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;file  filename  filenamename  fileutils&lt;br /&gt;&lt;br /&gt;$ ls file?(name) # padrão pode aparecer 0 a 1 vezes&lt;br /&gt; &lt;br /&gt;file  filename&lt;br /&gt;&lt;br /&gt;$ ls file*(name) # padrão pode aparecer 0 a N vezes&lt;br /&gt;file  filename  filenamename&lt;br /&gt;&lt;br /&gt;$ ls file+(name) # padrão pode aparecer 1 a N vezes&lt;br /&gt;filename  filenamename&lt;br /&gt;&lt;br /&gt;$ ls file@(name) # padrão deve aparecer 1 unica vez&lt;br /&gt;filename&lt;br /&gt;&lt;br /&gt;$ ls file!(name) # divertido esse! padrão NÃO deve aparecer&lt;br /&gt;file  filenamename  fileutils&lt;br /&gt;&lt;br /&gt;$ ls file+(name|utils) # cada padrão pode aparecer 1 a N vezes&lt;br /&gt;filename  filenamename  fileutils&lt;br /&gt;&lt;br /&gt;$ ls file@(name|utils) # "lembra" um file{name,utils} ;-)&lt;br /&gt;filename  fileutils&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-8098078270033514476?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/8098078270033514476/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=8098078270033514476' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8098078270033514476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/8098078270033514476'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/extended-globbing.html' title='Extended Globbing'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-5397565839149444274</id><published>2007-08-18T15:22:00.000-03:00</published><updated>2007-08-18T15:26:32.837-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JEDI - Java Education and Development Initiative</title><content type='html'>&lt;span style="font-weight:bold;"&gt;JEDI e o ensino de Java gratuito&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Tecnologia Java&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Demanda por Profissionais&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;E o JEDI ?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Países de Língua Portuguesa&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Como participar do JEDI ?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-5397565839149444274?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/5397565839149444274/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=5397565839149444274' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5397565839149444274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/5397565839149444274'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/jedi-java-education-and-development.html' title='JEDI - Java Education and Development Initiative'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6679951791337021375</id><published>2007-08-16T13:47:00.000-03:00</published><updated>2007-08-16T13:50:14.951-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ceticismo'/><title type='text'>I Jornada em Defesa do Pensamento Científico</title><content type='html'>A disciplina de Metodologia Científica do curso de Geociências e&lt;br /&gt;Educação Ambiental do Instituto de Geociências da USP e a &lt;a href="http://www.ceticos.org/"&gt;Sociedade&lt;br /&gt;Brasileira de Céticos e Racionalistas&lt;/a&gt; realizarão a I Jornada em Defesa&lt;br /&gt;do Pensamento Científico.&lt;br /&gt;&lt;br /&gt;Abaixo mais detalhes e a programação:&lt;br /&gt;—————&lt;br /&gt;Data: 18 de setembro (terça-feira)&lt;br /&gt;Local: IGc/USP - R. do Lago, 562 - Cid. Universitária - Butantã - São&lt;br /&gt;Paulo - SP&lt;br /&gt;&lt;br /&gt;Programação:&lt;br /&gt;09h10 a 09h30: Abertura Prof. Drs. Arlei Benedito Macedo (USP) e&lt;br /&gt;Renato Sabbatini (Unicamp).&lt;br /&gt;09h40 a 10h20: Analfabetismo científico, Prof. Dr. Renato Sabbatini&lt;br /&gt;(Unicamp).&lt;br /&gt;10h20 a 10h40: Café.&lt;br /&gt;10h40 a 11h20: Criacionismo, Prof. Dr. Mário de Pinna (USP).&lt;br /&gt;11h30 a 12h10: Como vender o pensamento não-científico, Prof. Dr.&lt;br /&gt;Francisco Stefano Wechsler (UNESP)&lt;br /&gt;12h10 a 14h00: Almoço.&lt;br /&gt;14h00 a 14h40: Sensacionalismo e Jornalismo Científico, - Ulisses&lt;br /&gt;Capozzoli - Astronomy Brasil).&lt;br /&gt;14h50 a 15h30: Pensamento Crítico - Panorama da América Latina - Sr.&lt;br /&gt;Alejandro J. Borgo (Pensar - CFI/Argentina)&lt;br /&gt;15h30 a 15h50: Café&lt;br /&gt;15h50 a 16h30: A defesa do pensamento científico nas universidades e&lt;br /&gt;centros de pesquisa (mesa-redonda).&lt;br /&gt;16h40 a 17h10: Resultados preliminares da pesquisa sobre&lt;br /&gt;Pseudociências (alunos do LIGEA)&lt;br /&gt;19h00 a 19h40: Ilusões e equívocos do pensamento humano, - Dr. Sérgio&lt;br /&gt;Navega - (Intelliwise Research and Training).&lt;br /&gt;19h40 a 20h00: Sumário e encerramento, - Prof. Dr. Francisco Stefano&lt;br /&gt;Wechsler - UNESP).&lt;br /&gt;&lt;br /&gt;Taxa de inscrição: R$ 60,00&lt;br /&gt;Mais informações: palestrasreflexoes2007@gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6679951791337021375?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6679951791337021375/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6679951791337021375' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6679951791337021375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6679951791337021375'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/i-jornada-em-defesa-do-pensamento.html' title='I Jornada em Defesa do Pensamento Científico'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-3015181602273787243</id><published>2007-08-11T23:56:00.000-03:00</published><updated>2007-08-12T00:02:02.224-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nerd'/><title type='text'>Implementando um Corretor Ortográfico</title><content type='html'>O maluco do &lt;a href="http://norvig.com/"&gt;Peter Norvig&lt;/a&gt; (google) publicou no seu site o artigo &lt;a href="http://norvig.com/spell-correct.html"&gt;How to Write a Spelling Corrector&lt;/a&gt;. Impressionante o que 21 linhas de Python são capazes de fazer!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&gt;&gt;&gt; correct('speling')&lt;br /&gt;'spelling'&lt;br /&gt;&gt;&gt;&gt; correct('korrecter')&lt;br /&gt;'corrector'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Não é atoa que o Google é o que é hoje em dia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-3015181602273787243?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/3015181602273787243/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=3015181602273787243' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3015181602273787243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/3015181602273787243'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/implementando-um-corretor-ortogrfico.html' title='Implementando um Corretor Ortográfico'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6920359529776016798</id><published>2007-08-11T10:45:00.000-03:00</published><updated>2007-08-11T11:41:18.737-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Nerd'/><title type='text'>Linux para Leigos</title><content type='html'>Vamos analisar a condição de &lt;span style="font-style:italic;"&gt;leigo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Eu já vi centenas de &lt;span style="font-style:italic;"&gt;leigos&lt;/span&gt; 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;"&gt;sem &lt;/span&gt;youtube), etc. Para o que &lt;span style="font-weight:bold;"&gt;não presta&lt;/span&gt;, os &lt;span style="font-style:italic;"&gt;leigos &lt;/span&gt;tem uma criatividade impressionante!&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Das duas, uma: ou pensamos em uma camada de software para permitir que um usuario &lt;span style="font-weight:bold;"&gt;abstraia&lt;/span&gt; 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;"&gt;OU&lt;/span&gt; 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;"&gt;vai&lt;/span&gt; fazer besteira, não tem a senha de &lt;span style="font-weight:bold;"&gt;root&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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/"&gt;fish&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;É assim que fazemos um sistema pra &lt;span style="font-style:italic;"&gt;leigos &lt;/span&gt;-- 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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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;"&gt;skills &lt;/span&gt;hoje necessárias em muitos cargos importantes e empresas como algumas multinacionais procuram desesperadamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6920359529776016798?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6920359529776016798/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6920359529776016798' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6920359529776016798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6920359529776016798'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/linux-para-leigos.html' title='Linux para Leigos'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-305673886204326311</id><published>2007-08-10T00:53:00.000-03:00</published><updated>2007-08-10T01:02:37.228-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Torvalds - A Microsoft simplesmente não me interessa</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Será que Linus Torvalds e a comunidade do software livre podem vencer esta guerra contra as legiões de Bill Gates&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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&gt;&lt;br /&gt;Fonte: &lt;a href="http://idgnow.uol.com.br/mercado/2007/08/09/idgnoticia.2007-07-18.5493239809/paginador/pagina_6"&gt;idgnow&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sem mais palavras...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-305673886204326311?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/305673886204326311/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=305673886204326311' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/305673886204326311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/305673886204326311'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/linus-torvalds-microsoft-simplesmente.html' title='Torvalds - A Microsoft simplesmente não me interessa'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2313794901341327909</id><published>2007-08-07T18:43:00.000-03:00</published><updated>2007-08-08T01:22:59.405-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Google Wars</title><content type='html'>Inutilidade Pública: veja o que/quem possui mais resultados no google?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./GoogleWars.sh  superman batman&lt;br /&gt;&lt;span style="color:red;"&gt;batman          48500000&lt;/span&gt;&lt;br /&gt;superman        33700000&lt;br /&gt;&lt;br /&gt;./GoogleWars.sh  gremio inter&lt;br /&gt;&lt;span style="color:red;"&gt;inter           213000000&lt;/span&gt;&lt;br /&gt;gremio          5560000&lt;br /&gt;&lt;br /&gt;./GoogleWars.sh  hp ibm&lt;br /&gt;&lt;span style="color:red;"&gt;hp      379000000&lt;/span&gt;&lt;br /&gt;ibm     147000000&lt;br /&gt;&lt;br /&gt;./GoogleWars.sh  cobol java fortran perl ruby lisp haskell&lt;br /&gt;&lt;span style="color:red;"&gt;java    272000000&lt;/span&gt;&lt;br /&gt;perl    103000000&lt;br /&gt;ruby    101000000&lt;br /&gt;lisp    21400000&lt;br /&gt;fortran 17400000&lt;br /&gt;haskell 15400000&lt;br /&gt;cobol   10900000&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;O script é simples, abusando um pouco do SED e do AWK, com um toque de SORT ;-)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;COR=`echo -ne '\e[31;1m'`&lt;br /&gt;END=`echo -ne '\e[m'`&lt;br /&gt;CORSED="1s/.*/${COR}&amp;${END}/"&lt;br /&gt;GOOGLE='http://www.google.com/search'&lt;br /&gt;&lt;br /&gt;[[ $2 ]] || { echo "usage: $0 item item2 [ ... item n]" ; exit 0 ; }&lt;br /&gt;&lt;br /&gt;SEDCMD='/did not match any documents/{s/.*/0/g;p;q}&lt;br /&gt;        /Results/{s/.* about[ ]\+\([0-9,.]\+\).*/\1\n/;p;q}'&lt;br /&gt;AWKCMD='{ result[$1]=$2 ; x = length($1) ; if(x &gt; max) max=x }&lt;br /&gt;        END{   for(i in result) printf "%-"max"s\t%s\n",i,result[i]}'&lt;br /&gt;&lt;br /&gt;for i in "$@" ; do echo -ne "${i}\t" &lt;br /&gt;        lynx -dump "${GOOGLE}?q=${i}" | tr -d '\n.,' | sed -n "${SEDCMD}" &lt;br /&gt;done | awk -F '\t' "${AWKCMD}" | sort -nr -t $'\t' -k 2 | sed "${CORSED}"&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Quem quiser melhora-lo, sinta-se à vontade :)&lt;br /&gt;&lt;br /&gt;Edit: ja lancei uma versão .02 com umas correções cosméticas &lt;a href="http://pastebin.com/f2459820a"&gt;aqui&lt;/a&gt; -- não resisti...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2313794901341327909?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2313794901341327909/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2313794901341327909' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2313794901341327909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2313794901341327909'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/google-wars.html' title='Google Wars'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-1045068512403048609</id><published>2007-08-06T14:21:00.000-03:00</published><updated>2007-08-06T14:28:44.786-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Considerações de Segurança</title><content type='html'>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 /&gt;&lt;br /&gt;Não é dificil fazer ./&lt;span style="font-style:italic;"&gt;programa&lt;/span&gt; (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;"&gt;padrão&lt;/span&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-1045068512403048609?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/1045068512403048609/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=1045068512403048609' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1045068512403048609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/1045068512403048609'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/consideraes-de-segurana.html' title='Considerações de Segurança'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4283539083080315010</id><published>2007-08-03T20:23:00.000-03:00</published><updated>2007-08-03T20:28:34.249-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Nightwish - Wishmaster Versão Alternativa</title><content type='html'>Sensacional esta 'versão':&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/q-K8x4x4i68"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/q-K8x4x4i68" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Hamster - Apprendice - HeartBurn - Seven Seagals - Mario - this Apple - in me - Jewish Master !&lt;br /&gt;&lt;br /&gt;Se não conseguiu visualizar clique &lt;a href="http://www.youtube.com/v/q-K8x4x4i68"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4283539083080315010?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4283539083080315010/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4283539083080315010' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4283539083080315010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4283539083080315010'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/nightwish-wishmaster-verso-alternativa.html' title='Nightwish - Wishmaster Versão Alternativa'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2660709504887834600</id><published>2007-08-03T16:20:00.000-03:00</published><updated>2007-08-03T16:40:01.859-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Caçadores da Classe Perdida</title><content type='html'>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"&gt;post&lt;/a&gt; do Claudio Miranda reavivou a minha memória.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;[[ $2 ]] || { echo "Uso: ${0} diretorio classe" ; exit 1 ; }&lt;br /&gt;find "${1}" -name \*.jar -print | xargs -n 1 unzip -l 2&gt;&amp;- | awk -v class="${2}" '&lt;br /&gt;        BEGIN       { IGNORECASE=1                                     }&lt;br /&gt;        /^Archive/  { file="\nArquivo:\n\t"$NF": \nClasses:\n\t"       }&lt;br /&gt;        /class$/ &amp;&amp; $NF ~ class { print file,$NF ; file="\t"; total++  }&lt;br /&gt;        END         { print "\nTotal",total + 0,"classes encontradas!" }'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2660709504887834600?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2660709504887834600/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2660709504887834600' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2660709504887834600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2660709504887834600'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/caadores-da-classe-perdida.html' title='Caçadores da Classe Perdida'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-309871687786841429</id><published>2007-08-02T16:31:00.000-03:00</published><updated>2007-08-02T16:36:05.638-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Powders Graduation</title><content type='html'>Os programas de tradução estão cada vez melhores.&lt;br /&gt;&lt;br /&gt;Pós Graduação = Powders Graduation&lt;br /&gt;&lt;br /&gt;Graduação em Pó? Pulverizada?&lt;br /&gt;&lt;br /&gt;São 22 resultados no &lt;a href="http://www.google.com/search?q=%22powders+graduation%22"&gt;google &lt;/a&gt;até o momento!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-309871687786841429?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/309871687786841429/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=309871687786841429' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/309871687786841429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/309871687786841429'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/powders-graduation.html' title='Powders Graduation'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-7517692493143079927</id><published>2007-08-02T13:28:00.000-03:00</published><updated>2007-08-02T14:40:43.428-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Usando o curl com Endereços IPv6</title><content type='html'>Hoje em dia usar endereçamento &lt;a href="http://pt.wikipedia.org/wiki/IPv6"&gt;IPv6&lt;/a&gt; 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 /&gt; &lt;br /&gt;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/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;curl 'http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para desabilitar este "URL globbing parser" basta usar a opção -g, o que nos leva a solução completa:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;curl -6g 'http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-7517692493143079927?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/7517692493143079927/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=7517692493143079927' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7517692493143079927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/7517692493143079927'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/08/usando-o-curl-com-endereos-ipv6.html' title='Usando o curl com Endereços IPv6'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-2804238491912522977</id><published>2007-07-26T14:09:00.000-03:00</published><updated>2007-07-26T14:34:07.822-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Barbosa</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.casacinepoa.com.br/imagens/filmes/250/barbosa.jpg"&gt;&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="" /&gt;&lt;/a&gt;&lt;span style="font-style:italic;"&gt;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&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Para saber mais: &lt;a href="http://www.casacinepoa.com.br/port/filmes/barbosa.htm"&gt;CASACINEPOA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Assista &lt;a href="http://www.portacurtas.com.br/pop_160.asp?COD=150&amp;Exib=2660"&gt;aqui&lt;/a&gt;. Vale a pena!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-2804238491912522977?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/2804238491912522977/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=2804238491912522977' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2804238491912522977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/2804238491912522977'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/07/barbosa.html' title='Barbosa'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-4884229416704695842</id><published>2007-07-26T14:03:00.000-03:00</published><updated>2007-07-26T14:07:01.568-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Resolvendo Problemas Comuns 7 - open failed: |</title><content type='html'>Imagine um arquivo com algumas linhas duplicadas:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ cat arquivo&lt;br /&gt;permission denied&lt;br /&gt;bad interpreter&lt;br /&gt;missing separator&lt;br /&gt;set correct localle&lt;br /&gt;parameter list too long&lt;br /&gt;unary operator expected&lt;br /&gt;parameter list too long&lt;br /&gt;bad interpreter&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Obter as linhas distintas pode ser feito com a ajuda do sort + uniq&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ cat arquivo | sort | uniq&lt;br /&gt;bad interpreter&lt;br /&gt;missing separator&lt;br /&gt;parameter list too long&lt;br /&gt;permission denied&lt;br /&gt;set correct localle&lt;br /&gt;unary operator expected&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; - Puxa! Que ótima combinação! Vamos guarda-la?&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;pre&gt;&lt;code&gt;$ CMD="sort | uniq"&lt;br /&gt;$ cat arquivo | $CMD&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sort: open failed: |: No such file or directory&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; - OPA! Eu sabia, maldito shell, encrenca com tudo!&lt;br /&gt; &lt;br /&gt;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 /&gt;Este tipo de problema pode ser resolvido pelo eval -- ele interpreta novamente as strings na linha de comando.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ eval "cat arquivo | $CMD"&lt;br /&gt;bad interpreter&lt;br /&gt;missing separator&lt;br /&gt;parameter list too long&lt;br /&gt;permission denied&lt;br /&gt;set correct localle&lt;br /&gt;unary operator expected&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; - Ah, agora funciona. Mas esse eval ai ficou feio...&lt;br /&gt;&lt;br /&gt;Então vamos criar um alias para o comando!&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ alias cmd="sort | uniq"&lt;br /&gt;$ cat arquivo | cmd&lt;br /&gt;bad interpreter&lt;br /&gt;missing separator&lt;br /&gt;parameter list too long&lt;br /&gt;permission denied&lt;br /&gt;set correct localle&lt;br /&gt;unary operator expected&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;Ah, sim, o cat nesse exemplo é completamente supérfluo, poderia ser assim: 'sort arquivo | uniq' &lt;br /&gt;&lt;br /&gt; - E o uniq precisa do sort ? &lt;br /&gt; &lt;br /&gt;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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-4884229416704695842?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/4884229416704695842/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=4884229416704695842' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4884229416704695842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/4884229416704695842'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/07/resolvendo-problemas-comuns-7-open.html' title='Resolvendo Problemas Comuns 7 - open failed: |'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2122907654784586589.post-6494154344324280962</id><published>2007-07-26T13:07:00.000-03:00</published><updated>2007-07-26T13:29:56.000-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Resolvendo Problemas Comuns 6 - unary operator expected</title><content type='html'>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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$  [ $XALALA == "oi" ] &amp;&amp; echo 'ok' || echo 'nok'&lt;br /&gt;-bash: [: ==: unary operator expected&lt;br /&gt;nok&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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 /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$  [ "$XALALA" != "oi" ] &amp;&amp; echo 'ok' || echo 'nok'&lt;br /&gt;ok&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simples e rápido!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2122907654784586589-6494154344324280962?l=peczenyj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peczenyj.blogspot.com/feeds/6494154344324280962/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2122907654784586589&amp;postID=6494154344324280962' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6494154344324280962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2122907654784586589/posts/default/6494154344324280962'/><link rel='alternate' type='text/html' href='http://peczenyj.blogspot.com/2007/07/resolvendo-problemas-comuns-6-unary.html' title='Resolvendo Problemas Comuns 6 - unary operator expected'/><author><name>Tiago "PacMan" Peczenyj</name><uri>http://www.blogger.com/profile/14804218844671345695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_TDd0BWQ-Qes/RpWYua7nUCI/AAAAAAAAAAM/zQfe99kq9Vw/s400/avatar.jpg'/></author><thr:total>2</thr:total></entry></feed>
