<?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-7625142089219834118</id><updated>2011-11-24T12:03:04.858-08:00</updated><category term='Filme'/><category term='Música'/><category term='Tecnologias'/><category term='Ciências da Computação'/><category term='Servlets'/><category term='javascript'/><category term='java'/><category term='São Paulo'/><category term='Resenha'/><category term='Psicologia'/><category term='Scrum'/><category term='Free Software'/><category term='Fotos'/><category term='Jornalismo'/><category term='Engenharia de Software'/><category term='Biocombustíveis'/><category term='Política'/><category term='Jogos'/><category term='Web'/><category term='Economia'/><title type='text'>42 - Opiniões</title><subtitle type='html'>A vida o universo e tudo mais... 
Mas eu tenho uma certa predileção por computação, tecnologias, comportamento e política</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4183959113426993557</id><published>2011-11-08T17:55:00.000-08:00</published><updated>2011-11-16T04:39:59.377-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><category scheme='http://www.blogger.com/atom/ns#' term='São Paulo'/><title type='text'>Invasão na USP</title><content type='html'>&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;Tudo começou com os policiais abordando três estudantes que portavam alguns baseados. Não seria provocação fumar na cara dos policiais? O que parece que a Universidade é um feudo, e dentro da Universidade as leis são diferentes. Bom, não é. Mas nem todas as leis são corretas.&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;Não é porque a lei existe que ela é justa. Cabe sim aos universitários questionar as leis. E veja, eu não defendo o uso das drogas nem a discriminalização do seu comércio. Mas defendo o direito de se debater isso de forma civilizada. O que nos leva de volta ao ocorrido na USP.&amp;nbsp; Sim, a polícia é um forte instrumento de coerção. Seria legal ser levado a delegacia porque você "estacionou" em lugar proibido? Não parece exagero, excesso de força!? Então, o que essa ala revolucionária ultrajovem por meio da assembleia (antidemocrática) dos estudantes propõe é que a vigilância seja exercida pela guarda universitária e não pela PM (bom… é uma solicitação razoável).&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;O diabo é que a USP convive com com uma violência assustadora. É fácil cometer todo tipo de crime e fugir por uma das diversas portas não mais vigiadas da USP.&amp;nbsp; Não mais vigiadas porque a bandidagem é tão grande que não é "seguro" para a guarda universitária vigiar essas portas (não para o contigente nem&amp;nbsp; para as armas que ela dispõe). A USP está a mercê de bandidos que residem nas&amp;nbsp; comunidades carentes que orbitam sua existência. Bandidos existem em todos lugares, mas a desigualdade social, a pobreza, a exclusão social e uma série de outros fatores acabam por fazer que as comunidades mais carentes mais expostos ao crime, principalmente a criminalidade violenta.&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;Não que a USP deva ser uma exceção e ter o privilégio de não compartilhar das mesmas mazelas da sociedade, principalmente a vizinha. São então os estudantes da USP melhores que os moradores da São Remo? Ocorre que nossa sociedade não "democratiza"&amp;nbsp; todas as suas coisas. A USP em si é um ótimo exemplo de exclusão social. A maior parte da verba destinada a educação é dirigida a instituições como ela da qual apenas uma ínfima fração da sociedade pode aproveitar. Uma vez que temos essa incongruência estabelecida seria ainda errado não zelar pelos recursos estão em parte concentrados nela, incluindo o humano.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;De volta ao feudo que criamos,&amp;nbsp; a USP como uma extensão dos condomínios&amp;nbsp; da classe média. Sem a segurança devida, a USP é de fato uma gorda oferta aos petralhas. Fácil de entrar, fácil de sair, fácil acesso para "favelas", e várias alvos potenciais. Inclusive alguns estudantes de forma mais direta alimentam o crime assim como esses alimentam seus vícios. Então, ok, todos querem segurança (na USP) mas será que não é ingénuo achar que a guarda universitária é capaz de lidar com os problemas da complexidade descrita acima? Que a PM não está perfeitamente capacitada para abordar os estudantes concordamos mas parece pior a situação sem ela.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;De onde nos leva ao linchamento público. Reitero minha opinião: não concordo com certas opiniões mas concordo muito que opiniões sejam respeitadas. Isso não é democracia. É um conceito muito maior. Justiça!? Respeito!? Bom, não sei o nome mas diverge daquilo que ocorreu. Já é difícil uma assembleia estudantil em que propostas mais ponderadas vençam e quando isso acontece o pessoal ignora? Para que? Repetir a agressão as autoridades. Forçar uma decisão que não tem o apoio da maioria. Para forçar goela abaixo uma opinião. Essas ações divergem de tudo… dos ideais, da civilidade, de tudo.&amp;nbsp; Como defender essas atitudes?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4183959113426993557?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4183959113426993557/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4183959113426993557' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4183959113426993557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4183959113426993557'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2011/11/invasao-na-usp.html' title='Invasão na USP'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4329751754889318335</id><published>2011-10-10T13:02:00.000-07:00</published><updated>2011-10-10T13:02:48.371-07:00</updated><title type='text'>The Climb</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: white; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; line-height: 14px;"&gt;Oi, pessoal!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px; line-height: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; line-height: 14px;"&gt;Acabamos de inaugurar o site (obrigada Carolina Daffara, Bruno Gouveia, Marcos Sobrinho e Igor Escobar _ espero que não tenha esquecido de ninguém) e estamos dando início ao processo de divulgação da theClimb. Inicialmente vamos nos concentrar na região próxima à USP, mas em breve estaremos espalhados por sampa! Convido a todos que sejam ou conheçam alunos de inglês em potencial e professores procurando aulas na região do Butantã/Osasco que divulguem e acessem o site:&amp;nbsp;&lt;a href="http://www.theclimb.com.br/" rel="nofollow nofollow" style="color: #3b5998; cursor: pointer; text-decoration: none;" target="_blank"&gt;www.theclimb.com.br&lt;/a&gt;&amp;nbsp;. Many, many thanks to you all (críticas e sugestões ao site são benvindas!!!)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; line-height: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.theclimb.com.br/img/home.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.theclimb.com.br/img/home.png" width="271" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4329751754889318335?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4329751754889318335/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4329751754889318335' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4329751754889318335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4329751754889318335'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2011/10/climb.html' title='The Climb'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-7129696820675200765</id><published>2011-05-05T10:05:00.000-07:00</published><updated>2011-05-05T10:05:01.683-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jogos'/><title type='text'></title><content type='html'>Alemanha sempre me surpreende...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recentemente eu tenho conhecido um pessoal aqui em São Paulo que tem jogado jogos de Tabuleiro ao estilo Alemão.&lt;br /&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/German-style_board_game (a versão da wikipedia em português é péssima... melhor pedir para o google traduzir a página em inglês).&lt;br /&gt;&lt;br /&gt;A sacada é a seguinte... os jogos de tabuleiro tradicionais (do mercado) brasileiro são ruins... e os alemães são ótimos... Por que? Eis  os pontos mágicos:&lt;br /&gt;&lt;br /&gt;1) Os jogadores não devem ser eliminados: em jogos de guerra como WAR, um jogador por ser retirado do jogo prematuramente. Isso é bem chato... enquanto o resto do grupo joga, os jogadores eliminados olham para o teto.&lt;br /&gt;&lt;br /&gt;2) O jogo termina: Jogos ruins como WAR, Banco imobiliária, etc... o jogo pode durar uma quantidade indefinida de turnos. Isso torna o jogo chato. A forma do jogo não durar infinitamente são duas: ou o jogo dura um número finito e pré-definido de turnos ou existe algum recurso (também finito e conhecido) do jogo que se exauri (continuamente) com o passar dos turnos.&lt;br /&gt;&lt;br /&gt;3) Estratégia deve estar acima da Sorte: acho que isso fala por si só, mas 2 pontos são bons ressaltar. 1) Jogos determinísticos podem ser difíceis demais para reles mortalis; 2) basta que o jogo priorize um pouquinho a sorte para ele incomodar.&lt;br /&gt;&lt;br /&gt;Bom, apenas para exemplificar um jogo maravilhoso nessa linha... Pillars of the Earth (Pilares da Terra ou ainda  Die Säulen der Erde), jogo homônimo ao Best Seller que fala sobre a construção de uma catedral Gótica. Imperdível.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img border="0" height="375" src="http://images.boardgamegeek.com/images/pic172957_md.jpg" width="500" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/MayFair-Games-4102617-Pillars-Earth/dp/B000P0TEBG"&gt;Jogo na Amazon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#fica_a_dica!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-7129696820675200765?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/7129696820675200765/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=7129696820675200765' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7129696820675200765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7129696820675200765'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2011/05/alemanha-sempre-me-surpreende.html' title=''/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5313233749300664123</id><published>2011-01-13T06:02:00.000-08:00</published><updated>2011-01-13T10:12:16.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Código Inspirado</title><content type='html'>&lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shCore.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushJava.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushErlang.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;br /&gt;Acabo de reler um código que escrevi e achei a solução tão maluca e útil rs que vale a pena ser comentada. O objetivo é implementar uma versão simples do HttpResponse cujo comportamento seja minimamente próximo a versão original, sem no entanto precisar extender um NullObject do HttpResponse. A solução de sempre... proxy dinâmico.&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class DynamicProxy implements InvocationHandler{&lt;br /&gt; private Set&lt;method&gt; set = new HashSet&lt;method&gt;();&lt;br /&gt; private Object target;&lt;br /&gt; private String getTarget;&lt;br /&gt; &lt;br /&gt; public DynamicProxy(Object target, String getTarget){&lt;br /&gt; Method[] methods = target.getClass().getMethods();&lt;br /&gt; set.addAll(Arrays.asList(methods));&lt;br /&gt; this.getTarget = getTarget;&lt;br /&gt; this.target = target; &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public Object invoke(Object proxy, Method method, Object[] args)&lt;br /&gt;  throws Throwable {&lt;br /&gt; if (set.contains(method)){&lt;br /&gt;  return method.invoke(target, args);&lt;br /&gt; }else {&lt;br /&gt;  if (method.toString().equals(getTarget)){&lt;br /&gt;    return target;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return null;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora o método que fabrica  o HttpResponse. O resultado do response será colocado no printWriter. É bom notar que o Response praticamente implementa a interface do PrintWriter então o código poderia ser melhorado para usar isso.&lt;br /&gt;&lt;pre class="java" name="code"&gt;private HttpServletResponse createHttpResponse(StringWriter stringWriter) {&lt;br /&gt;// Ninjutsu!&lt;br /&gt; PrintWriter printWriter = new PrintWriter(stringWriter);&lt;br /&gt; DynamicProxy dynamicProxy = new DynamicProxy(printWriter,&lt;br /&gt;    "public abstract java.io.PrintWriter javax.servlet.ServletResponse.getWriter() throws java.io.IOException");&lt;br /&gt; HttpServletResponse response = (HttpServletResponse) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),&lt;br /&gt;     new Class[] { HttpServletResponse.class }, dynamicProxy);&lt;br /&gt; return response;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;script language="javascript"&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5313233749300664123?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5313233749300664123/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5313233749300664123' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5313233749300664123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5313233749300664123'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2011/01/codigo-inspirado.html' title='Código Inspirado'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2999030250130560281</id><published>2011-01-06T06:44:00.000-08:00</published><updated>2011-01-07T08:57:42.142-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologias'/><title type='text'>Apple não é o dono da Bola</title><content type='html'>Tem uma anedota que ilustra bem como o que a Apple e o Android OS significam no mercado de &lt;i&gt;smartphones&lt;/i&gt; e &lt;i&gt;tablets&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Todas as tardes, o pessoal saía para jogar bola num campinho próximo ao centro. O encontro não era formal, não havia hora combinada, não sabíamos quem compareceria nem quem iria trazer a bola. Na verdade a questão da bola costumava ser a mais problemática. &amp;nbsp;As mães não gostavam que levássemos a bola novinha &amp;nbsp;para se perder no meio do mato ou coisas assim. Mas tentávamos o possível para sempre ter uma bola ali.&lt;br /&gt;&lt;br /&gt;Em alguns casos, aparecia um moleque mimado que, por estar ele com uma bola, deixávamos que ele participasse do racha. Geralmente esses moleques não suportavam a primeira dividida e ameaçavam levar a &lt;i&gt;preciosa&lt;/i&gt; redonda caso fossem contrariados. Evitávamos esse mal estar: quando&amp;nbsp;encontrávamos&amp;nbsp;essa situação, tolerávamos o cidadão o máximo possível.&lt;br /&gt;&lt;br /&gt;Foi então um dia que cheguei um pouco mais tarde que o habitual e o jogo já havia começado. E era um daqueles dias que tinha um moleque mimado jogando. Um que eu nunca tinha visto antes e que era especialmente insuportável. Reclamava de tudo e de todos.&amp;nbsp;O pessoal não acreditava na folga dele.&amp;nbsp;E como de costume, procurávamos não pegar pesado. Até que alguém da turma grita: "pessoal, eu tenho que ir embora mas depois vocês podem levar a bola lá para casa".&lt;br /&gt;&lt;br /&gt;'Hein!? Pára tudo! Então a bola não é daquele moleque???' _ dava para ouvir o pensamento das pessoas ali. Olhávamos uns para a cara do outros incrédulos que havíamos suportando aquele estorvo por tanto tempo.&lt;br /&gt;&lt;br /&gt;Mas foi o que bastou...A partir daquele momento o pobre não conseguiu mais tocar na bola. Sempre havia alguém para dar um esbarrãozinho nele e fazê-lo voar uns 3 metros para frente. "Foi na bola!", "Foi mal!", etc. &lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;O Android OS é justamente alguém gritando: "a bola pode ficar aqui. Joguem a vontade". Será que os mimadinhos da Apple vão continuar jogando do mesmo jeito???&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hPUGNCIozp0?fs=1&amp;amp;hl=pt_BR"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hPUGNCIozp0?fs=1&amp;amp;hl=pt_BR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&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/7625142089219834118-2999030250130560281?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2999030250130560281/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2999030250130560281' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2999030250130560281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2999030250130560281'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2011/01/apple-nao-e-o-dono-da-bola.html' title='Apple não é o dono da Bola'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-6034866624806334317</id><published>2010-12-21T10:29:00.000-08:00</published><updated>2011-01-21T10:05:37.073-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologias'/><title type='text'>Easy Tricks</title><content type='html'>&lt;!-- Include required JS files --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushCss.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I've already done a thumbnail page, using DropBox, ImageMagick, bash &amp;gt; ls &amp;gt; html &amp;gt; css.&lt;br /&gt;&lt;br /&gt;First tip: You can sync your files online and across computers with @Dropbox. 2GB account is free! &lt;a href="http://db.tt/8HxJSFX"&gt;https://www.dropbox.com/home&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Second, select a collection of files (in my case, PDF files about boardgames) and put them in a public folder within Dropbox (I've created games subfolder in public folder to do that).&lt;br /&gt;&lt;br /&gt;Use ImageMagick to create thumbnail from files:&lt;br /&gt;&amp;nbsp;(to install imagemagick in Linux use:&amp;nbsp; sudo apt-get install imagemagick)&lt;br /&gt;&lt;br /&gt;So, to create a thumb for all files I've used following command: &lt;br /&gt;&lt;pre name="code"&gt;for a in $(ls *.pdf); do convert -thumbnail x96 $a[0] $a.png; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, it is possible create HTML from these files:&lt;br /&gt;&lt;pre  name="code"&gt;for a in $(ls *.pdf); do echo "&lt; a href=\"$a\" class=\"image\" &gt;&lt; img src=\"$a.png\" /&gt; &lt; span class=\"text\"&gt;$a&lt;/ span &gt;&lt; / a &gt;" &gt;&gt; file.html; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(yes, I know... I would use sed command to change pdf extension rather than just to suffix ".png"... it's just to keep things simple :D)&lt;br /&gt;&lt;br /&gt;Next, I've created an index file to exhibit that files. Basicly, the file&amp;nbsp; use the following css (thanx to Gabriel Ricci):&lt;br /&gt;&lt;pre name="code" class="css"&gt;a.image&lt;br /&gt;{&lt;br /&gt;float: left;&lt;br /&gt;display: block;&lt;br /&gt;text-align: center;&lt;br /&gt;margin: 5px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;a.image img{&lt;br /&gt;display: block;&lt;br /&gt;border: none;&lt;br /&gt;}&lt;br /&gt;a.image .text{&lt;br /&gt;display: block;&lt;br /&gt;width: 100px;&lt;br /&gt;word-wrap: break-word;&lt;br /&gt;font-size: small;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Done! A very fast and simple thumbnail from PDF files.&lt;br /&gt;&lt;br /&gt;&lt;script language="javascript"&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O resultado segue aqui: &lt;a href="http://dl.dropbox.com/u/6351101/games/index.html"&gt;galeria de jogos de tabuleiro&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-6034866624806334317?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/6034866624806334317/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=6034866624806334317' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6034866624806334317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6034866624806334317'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/12/easy-tricks.html' title='Easy Tricks'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-7159103846712264833</id><published>2010-11-25T12:48:00.000-08:00</published><updated>2010-11-25T12:52:12.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='São Paulo'/><title type='text'>Chuva de Granizo...</title><content type='html'>O som das pedras de granizo estourando no telhado era o mais impressionante&lt;br /&gt;&lt;br /&gt;&lt;a href="http://goo.gl/photos/3JacBva8Pi" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"&gt;&lt;img border="0" src="http://lh6.ggpht.com/_du5DCjwyc9c/TO7KBiju0cE/AAAAAAAAAdY/u6fdGIvnV3g/s160-c/Sampa.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-7159103846712264833?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/7159103846712264833/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=7159103846712264833' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7159103846712264833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7159103846712264833'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/11/sampa.html' title='Chuva de Granizo...'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_du5DCjwyc9c/TO7KBiju0cE/AAAAAAAAAdY/u6fdGIvnV3g/s72-c/Sampa.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5277128279828651235</id><published>2010-11-03T18:16:00.000-07:00</published><updated>2010-11-03T18:16:15.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='São Paulo'/><title type='text'>Esquizofrenia paulistana</title><content type='html'>São Paulo não tem identidade.&lt;br /&gt;É uma terra perdida, perplexa.&lt;br /&gt;Sua origem é universal, &lt;br /&gt;Reinventada a cada dia.&lt;br /&gt;Caminha a noite, de dia, &lt;br /&gt;Nas avenidas que voltam para si mesmas:&lt;br /&gt;Avenidas sem fim...&lt;br /&gt;Avenidas mineiras, paulistas,&lt;br /&gt;estrangeiras.&lt;br /&gt;São Paulo não tem fronteiras. &lt;br /&gt;Embora teimem os mapas&lt;br /&gt;Sua cara não mente&lt;br /&gt;São todas as caras&lt;br /&gt;De dor, alegria,&lt;br /&gt;Ódio e amor.&lt;br /&gt;São Paulo é isto...&lt;br /&gt;Me desculpe, não tem como descrevê-lo&lt;br /&gt;Vão achar mil faces para detestar&lt;br /&gt;Mas Sampa tem milhões,&lt;br /&gt;muitos milhões de faces&lt;br /&gt;Que um dia irão olhar para si&lt;br /&gt;E se reconhecer Paulista&lt;br /&gt;Mas hoje Paulo olha as estrelas &lt;br /&gt;em busca de um destino&lt;br /&gt;E elas quietas respondem todos os destinos possíveis&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5277128279828651235?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5277128279828651235/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5277128279828651235' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5277128279828651235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5277128279828651235'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/11/esquizofrenia-paulistana.html' title='Esquizofrenia paulistana'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2586275150230423071</id><published>2010-10-26T11:24:00.000-07:00</published><updated>2010-10-26T14:23:58.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><title type='text'>Sobre o xiismo</title><content type='html'>Não é bom, correto ou adequado utilizar o termo xiita como sinônimo para fundamentalista ou radical.  Xiita é só um dos ramos da religião Muçulmana com mais de 100 milhões de seguidores em todo mundo. No Iraque, os xiitas foram massacrados pelos sunitas liderados por Saddam Hussain o que foi considerado um crime contra a humanidade e levou a condenação de Hussain. No Irã, os sunitas foram oprimidos por xiitas. Mas o fundamentalismo ou radicalismo não é inerente a essas crenças e não faz o menor sentido pensar que um grupo é moderado e outro é radical.&lt;br /&gt;Aliás, de quem é a frase: "ou você está do nosso lado ou contra nós": dos xiitas? dos sunitas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-2586275150230423071?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2586275150230423071/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2586275150230423071' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2586275150230423071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2586275150230423071'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/10/sobre-o-xiismo.html' title='Sobre o xiismo'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-3287027771854400293</id><published>2010-10-20T18:56:00.001-07:00</published><updated>2010-10-20T18:56:58.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free Software'/><title type='text'>Poetic License</title><content type='html'>(c) 2005 Alexander E Genaud&lt;br /&gt;&lt;br /&gt;This work ‘as-is’ we provide.&lt;br /&gt;No warranty express or implied.&lt;br /&gt;We’ve done our best,&lt;br /&gt;to debug and test.&lt;br /&gt;Liability for damages denied.&lt;br /&gt;&lt;br /&gt;Permission is granted hereby,&lt;br /&gt;to copy, share, and modify.&lt;br /&gt;Use as is fit,&lt;br /&gt;free or for profit.&lt;br /&gt;These rights, on this notice, rely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-3287027771854400293?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/3287027771854400293/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=3287027771854400293' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3287027771854400293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3287027771854400293'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/10/poetic-license.html' title='Poetic License'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-6500527301486299778</id><published>2010-09-20T08:44:00.000-07:00</published><updated>2010-09-21T11:24:38.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Engenharia de Software'/><title type='text'>O Tempo, o pôquer  e o planejamento</title><content type='html'>As frases de efeitos que carregam a pregação do Scrum muitas vezes atrapalham mais do que ajudam a explicar certas cerimônias do Scrum. Isso acontece por exemplo com a reunião de planejamento, onde os membros do time precisam estimar o tamanho das histórias e o julgamento dos membros é enublado por referências como "não é possível dizer quanto uma tarefa é maior que outra devido a imprecisão inerente a estimativa".&lt;br /&gt;&lt;br /&gt;Pretendo aqui fazer uma reflexão sobre a estimativa do Scrum que, em minha opinião, não rompe com as convenções usuais de estimativa e onde os valores atribuidos as tarefas expressam de fato o "tamanho" médio estimado para cada tarefa com relação ao tempo.&lt;br /&gt;&lt;br /&gt;Para quem não sabe, durante a reunião de planejamento o Product Owner explica as histórias do "Backlog", o time precisa estimar o "esforço" necessário para concluir cada delas. A&lt;br /&gt;ferramenta para auxiliar a estimativa é o pôquer do planejamento. No pôquer do planejamento, cada membro da equipe utiliza um baralho de cartas de uma pseudo-sequência de fibonacci (os baralhos mais comuns seguem a sequência 1,2,3,5,8,13,20,40, 100). Escolhe-se uma tarefa como referência a pontuação. Ex: uma aplicação simples de cadastro é a tarefa de valor 2.&lt;br /&gt;&lt;br /&gt;A cada história, após o PO apresentar o problema e de uma discussão inicial dos membros da equipe, os membros da equipe iniciam o jogo. Simultaneamente apresentam a carta que melhor aproxima o valor que cada um considera representar o esforço (em relação a tarefa de referência) necessário para a realização da tarefa. Se ocorrerem divergências, jogadores que escolheram os valores mínimos ou máximos expõem o motivo porque acreditam que a pontuação deva ser maior ou menor apresentando facilidades e dificuldades que talvez outros membros não tenham percebido. Outras rodadas do pôquer se sucedem até&lt;br /&gt;que os jogadores entrem em consenso.&lt;br /&gt;&lt;br /&gt;Sterilis theoria, auream praxis. Na prática, muitas pessoas ficam confusas sobre o valores e a escala do pôquer do planejamento. Um colega meu defendia a ideia que os números não representam valores escalares, ou por exemplo uma atividade 2 não foi estimada 2,5 vezes mais fácil do que uma atividade 5 e que para justamente não levar ao erro dessa relação matemática entre as grandezas fora escolhida uma sequência estranha de progressão. Por esse raciocínio, 5 expressa apenas um esforço maior que 2 e 3 porém menor que 8.&lt;br /&gt;&lt;br /&gt;Para a discussão ficar mais rica irei ilustrar o problema com 4 atividades para serem avaliadas: ler um exemplar da Revista Caras, ler um livro da série Harry Potter, ler Os Lusíadas e ler a teoria de Galois. Ao final, a equipe deve ser capaz de fazer um resumo ou apontar os pontos mais importantes da leitura. Esse exemplo foi inspirado num exemplo utilizado num “curso de Scrum”. Em nosso cenário imaginário, esse é o primeiro Sprint&lt;br /&gt;e a equipe deve eleger uma história como referência. Vamos supor que a história de ler um exemplar da Revista Caras seja escolhido como referência (o esforço estimado é 2). Ainda por hipótese, ninguém da equipe leu a série Harry Potter nem o exemplar específico da Revista Caras em questão. Qual deveria ser o esforço estimado para a leitura de um Harry Potter???&lt;br /&gt;&lt;br /&gt;Para ser mais específico, considerando que um livro da série Harry Potter tenha 700 páginas e que uma revista Caras tenha 50 páginas, imaginando que a linguagem utilizada no livro seja no máximo tão difícil quanto a linguagem utilizada na revista, seria errado assumir que o livro é no mínimo dez vezes mais difícil que a revista? Tudo leva a crer que sim....&lt;br /&gt;&lt;br /&gt;Para compreender melhor isso é importante saber para que essas avaliações serão utilizadas.  A avaliação não apenas torna possível ordenar as tarefas. Ela permite estimar o conjunto de tarefas que o grupo é capaz de realizar num Sprint. Primeiro porque a cada Sprint, um total de histórias é realizado. Cada história leva consigo sua pontuação. Logo, a cada Sprint tem-se a média de total de pontos que o time é capaz de entregar (entre outros estimadores como o mínimo de pontos entregues, mediana, etc). Esses valores balizam a quantidade de pontos que o time pode se comprometer a entregar.  Na verdade,  mesmo num primeiro Sprint, o time deveria ser capaz de imaginar qual valor seria razoável como esse limite.&lt;br /&gt;&lt;br /&gt;Se a sequencia fosse apenas uma ordem (digamos A para a tarefa mais fácil e G para a tarefa mais difícil) não seria possível estimar a capacidade de produção do time. Além disso, após as estimativas, o PO tem a liberdade de escolher qualquer combinação de histórias cujo total seja menor ou igual a capacidade da equipe. Para isso, seria muito saudável que uma história 8 fosse 4 vezes “maior” que uma história 2.&lt;br /&gt;&lt;br /&gt;Num segundo momento, essa capacidade média de produção será utilizada para que o PO possa estimar o tempo para a realização de histórias maiores, mesmo com incertezas grandes. Toda ideia de estimativa é essa, senão estaríamos falando de definição do tempo.&lt;br /&gt;&lt;br /&gt;Voltamos ao exemplo dos livros... Ao invés da revista Caras vamos considerar que história básica seja ler “A Volta ao Mundo em Oitenta Dias” (com 256 páginas).  Com todas as variáveis constante a menos do tamanho dos livros,  Harry Potter teria nota 5,4.&lt;br /&gt;&lt;br /&gt;Ocorre que qualquer estimativa leva consigo uma certa incerteza. O pôquer do planejamento resolve isso com uma relação implícita entre intervalos e valores ao limitar a escolha de valores intermediários. Dessa forma, ao estimar uma história com 2 seria uma forma de dizer que a história tem valor maior que 1 e menor que 3, logo de um intervalo de 2 pontos.  Aliás, a série de Fibonacci  serve justamente para isso, qualquer número da série (maior que 1) é igual a diferença entre o número que sucede e antecede. &lt;br /&gt;&lt;br /&gt;Avaliar a leitura de um livro da série de Harry Potter, deveria considerar esse intervalo. E dessa forma 5 seria um valor que faria bastante sentindo. Agora, qual a dificuldade de ler (e entender ) a teoria de Galois que poderia ser escrita em 10 páginas. Os cursos de graduação em bacharelado de matemática dedicam um semestre ao estudo dessa teoria. Logo, questões como a complexidade ou incertezas podem ser fatores decisivos na estimativa. Assim como a experiência anterior dos membros da equipe (por exemplo, poderíamos ter matemáticos no time o que diminuiria bastante a dificuldade dessa história).&lt;br /&gt;&lt;br /&gt;Para finalizar, qualquer metologia de estimativa descrita nos livros de engenharia de software das abordagens tradicionais apontam questões como extensão, complexidade, experiência da equipe e a incerteza. O Scrum não pormenoriza o processo de como estimar deixando isso a cargo do time, mas de qualquer forma trata de avaliar a seguinte grandeza: velocidade (ou trabalho sobre tempo) (lembrando que essa velocidade inclui incertezas inerentes ao processo de estimativa e a diferença entre o cenário especulado e o cenário real).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-6500527301486299778?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/6500527301486299778/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=6500527301486299778' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6500527301486299778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6500527301486299778'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/09/o-tempo-o-poquer-e-o-planejamento.html' title='O Tempo, o pôquer  e o planejamento'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-852776407312987673</id><published>2010-09-10T08:24:00.000-07:00</published><updated>2010-09-10T08:33:25.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotos'/><category scheme='http://www.blogger.com/atom/ns#' term='São Paulo'/><title type='text'>Em frente a estação Cidade Universitária</title><content type='html'>&lt;div style='text-align:center;margin:0px auto 10px;'&gt;&lt;a href='http://picasaweb.google.com.br/rdllopes/Panorama?authkey=Gv1sRgCPjIrvSRqYybRg#5515273548317367314'&gt;&lt;img src='http://lh5.ggpht.com/_du5DCjwyc9c/TIowEi6QnBI/AAAAAAAAAR0/6tkUQgcjufg/s1024/ciduniversitaria3.jpg' border='0' alt='' /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Boa surpresa em frente a estação Cidade Universitária.&lt;div style='clear:both; text-align:CENTER'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-852776407312987673?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/852776407312987673/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=852776407312987673' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/852776407312987673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/852776407312987673'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/09/boa-surpresa-em-frente-estacao-cidade.html' title='Em frente a estação Cidade Universitária'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_du5DCjwyc9c/TIowEi6QnBI/AAAAAAAAAR0/6tkUQgcjufg/s72-c/ciduniversitaria3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4296646360581184510</id><published>2010-09-09T06:00:00.000-07:00</published><updated>2010-09-09T06:00:09.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jogos'/><title type='text'>StarCraft II - Wings of Liberty</title><content type='html'>After 12 years, this software looks like just a expansion pack of Starcraft.&lt;br /&gt;&lt;br /&gt;Starcraft II é o super lançamento da Blizzard para 2010. Um jogo aguardado por 10 anos, mais que chega com cara de pacote de expansão.&lt;br /&gt;&lt;br /&gt;Sim, Starcraft II (ou SC2) apresenta algumas melhorias em relação ao jogo "original". O microgerenciamento melhorou bastante com duas novidades:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Fila de tarefas: é possível determinar que uma unidade cumpra uma fila tarefas, isso serve, por exemplo, para determinar que&amp;nbsp; os "peões" (SCV) construam uma&amp;nbsp; sequência de Suply Depots, ou que o imbecil do Siege Tank faça transformação Siege apenas após atingir o local adequado, ou para determinar a ordem de ataque de unidades, tornando o focus fire mais eficiente.&lt;/li&gt;&lt;li&gt;Smart Cast: ao selecionar um grupo de casters, apenas uma unidade (provavelmente a mais apta) irá executar o comando designado. Por exemplo, se um grupo de&amp;nbsp; High Templar forem selecionados, ao utilizar o comando Void, apenas uma unidade laçará o spell no alvo o que acaba evitando desperdício de "energy".&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Além dessas novidades, SC2 conta com todas as melhorias de Warcraft III como Set Rally Point em recursos que atribui a tarefa de extração ao peões assim que esses são produzidos pelo Centro de Controle.&lt;br /&gt;&lt;br /&gt;Do ponto de vista do visual, as melhorias são mais óbvias mas nada de revolucionário. Wings of Liberty praticamente contém um "filme" inserido em sua narrativa digital que ocorre entre as diversas missões do jogo. A história é centrada em Jim Rainor,um misto de cowboy com motoqueiro desse universo cyberpunk. Várias são as referências aos filmes de Western. Para citar alguns: Mar Sara é um planeta árido, sem construções verticais, praticamente abandonado da civilização; Antes da Zero Hour &lt;br /&gt;Jim encontra-se num bar com um crânio de Zerg&amp;nbsp; pendurado na parede, bebendo alguma coisa que se assemelha a Whisky, planejando sua próxima ação para confrontar as forças da Tirana Domination entre elas, o ataque aos comboios de suprimentos da Domination. Raynor é agora um hard-drinking amargurado anti-herói perseguido pelas trágicas lembranças dos conflitos intergalácticos que antecederam SC2 e busca a redenção de seus atos e ao mesmo tempo executar seus planos revolucionários. Sua maior culpa foi inculbir Sarah Kerrigan a uma missão em que ela fora abandonada a sorte, capturada e transformada pelos Zergs na Rainha das Lâminas (Queen of Blades). A história culmina com o confronto de Jim com Sarah.&lt;br /&gt;&lt;br /&gt;Junto com essa narrativa Wings of Liberty traz uma nova engine gráfica 12 anos mais moderna que a versão anterior mas cuja as diferenças são apenas&lt;br /&gt;sutilezas: as unidades são bem semelhante as unidades do jogo anterior mais rica em detalhes e com uma textura mais sofisticada. Todos os reviews consideram &lt;br /&gt;o visual e a música ponto fortes do jogo, mas está longe de ser uma revolução como prometido.&lt;br /&gt;&lt;br /&gt;A um certo nível de competitividade variações nos atributos das unidades provocam mudanças nas estratégias adotadas pelos jogadores. E essas mudanças ocorrem em Wings of Liberty:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Algumas unidades ignoram diferença de níveis em Terrenos;&lt;/li&gt;&lt;li&gt;Nidus Network e Warp Gate permitem que unidades sejam lançadas em diferentes pontos de cenário, inclusive pŕoximo a bases inimigas;&lt;/li&gt;&lt;li&gt;Para o Late game, as unidades terráqueas ficaram mais fortes. Smart cast tornam Battlecruisers mais eficientes, especialmente contra os Carriers.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A BattleNet está também bem mudada e bem mais potente. O sistema de ranking, alianças, jogo com amigos está online do que nunca. Por outro lado, a Blizzard acabou com a farra das LANs e o jogo não oferece suporte a jogo em rede, apenas pela Internet. Welcome to www (wait wait wait) games.&lt;br /&gt;&lt;br /&gt;Do ponto de vista da jogabilidade o jogo é ainda menos inovador. Embora SC e SC2 sejam muito melhores que Warcraft III com seu doente sistema de microgerenciamento, Starcraft sofre da pouca inteligência de unidades, e um ridículo conjunto de comandos que não permitem às tropas se organizarem e combarem de forma eficiente, a menos que você tenha a pachorra de controlar cada uma de suas idiotas unidades individualmente.&lt;br /&gt;&lt;br /&gt;Estou falando de alguma coisa de outro mundo? Acho que não:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Age of Empires (1998) inclui várias opções de formação para tropas. Além disso, a quantidade de tropas permitidas nesse jogo faz o microgerenciamento pouco eficiente.&lt;/li&gt;&lt;li&gt;BattleTanks e guntaxx são jogos mesozóicos que permitem aos jogadores programarem o funcionamento de suas unidades. Cada jogador pode utilizar um script personalizado do &lt;br /&gt;funcionamento do seu tanque, por exemplo em battletanks.&lt;/li&gt;&lt;li&gt;Battle Realms possui a opção de Guard. Essa ação faz com que uma unidade tente guardar uma outra posição, estrutura ou outra unidade. Em Starcraft, isso permitiria por exemplo que unidades anti-aereas protegessem um battlecruiser ou que marauders protegessem um siege tank em siege mode. A função guard não faz apenas com que uma&amp;nbsp;unidade ataque qualquer uma unidade hostil que se aproxime do alvo. Faz com que a unidade se coloque entre a unidade guardada e a unidade hostil e engage that unit into a battle.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Essa falta de inteligência das unidades não tira do jogo a diversão de criar e se defender de estratégias como Banneling Bust, Rush, etc, mas torna o jogo sofrível para quem quiser competir com pessoas afeiçoadas ao miserável microgerenciamento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4296646360581184510?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4296646360581184510/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4296646360581184510' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4296646360581184510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4296646360581184510'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/09/starcraft-ii-wings-of-liberty.html' title='StarCraft II - Wings of Liberty'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-6464500286691402362</id><published>2010-07-12T10:06:00.000-07:00</published><updated>2010-07-13T04:58:23.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ciências da Computação'/><title type='text'>Magia Assíncrona</title><content type='html'>&lt;p&gt;&lt;a href="http://dl.dropbox.com/u/6351101/www/document.pdf"&gt;Versão PDF&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shCore.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushJava.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;script src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushErlang.js" type="text/javascript"&gt;&lt;/script&gt;  &lt;br /&gt;&lt;h2&gt;Como transformar objetos comuns em "objetos assíncronos"&lt;/h2&gt;&lt;h3&gt;Programação Concorrente em Erlang - A inspiração&lt;/h3&gt;Joe Armstrong, um dos criadores da linguagem Erlang nos mostrou uma  maneira muito elegante de tratar concorrência na programação. Iremos introduzir  alguns conceitos de Erlang que tangem a programação concorrente deixando de  lado uma séria de sofisticações como o tratamento e propagação de erros,  programação remota para focar nos conceitos mais básicos e gerais. &lt;br /&gt;O primeiro comando básico de concorrência é o BIF (built in function)  ``spawn''.  Essa função é usada para criar um novo ``processo" (na nomenclatura de  Erlang, processo seria uma linha de execução (portanto uma thread) que  não compartilha dados). A assinatura da função é a seguinte: spawn(Module,  Exported Function, List of Arguments). Considere o seguinte módulo (extraído do  tutorial do Erlang): &lt;br /&gt;&lt;pre class="erlang" name="code"&gt;--module(example1).&lt;br /&gt;&lt;br /&gt;-export([start/0, say_something/2]).&lt;br /&gt;&lt;br /&gt;say_something(_, 0) -&amp;gt; done;&lt;br /&gt;&lt;br /&gt;say_something(What, Times)-&amp;gt; &lt;br /&gt; io:format("~p~n", [What]),&lt;br /&gt; say_something(What, Times - 1).&lt;br /&gt;&lt;br /&gt;start() -&amp;gt;&lt;br /&gt; spawn(example1, say_something, [hello, 3]),&lt;br /&gt; spawn(example1, say_something, [goodbye, 3]).&lt;/pre&gt;A função start() deste módulo bem simples cria dois processos que  executa a função \verb+say_something+ com os parâmetros $[hello, 3]$ e  $[goodbye,3]$. Além disso, a função devolve o id do processo criado (como veremos a frente). &lt;br /&gt;&lt;pre&gt;1&gt; c(example1).&lt;br /&gt;{ok,example1}&lt;br /&gt;2&gt; example1:start().&lt;br /&gt;hello&lt;br /&gt;goodbye&lt;br /&gt;&lt;0.43.0&gt;&lt;br /&gt;hello&lt;br /&gt;goodbye&lt;br /&gt;hello&lt;br /&gt;goodbye&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Por enquanto, criamos processos que executam ações mas não escutam  mensagens. Mas enviar mensagens para um objeto que  não responde é como estender a  mão a um cego esperando que aperte sua mão. Façamos então o processo enxegar ou  ouvir mensagens. Para isso, utilizamos a estrutura receive. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A construção receive é usada para permitir que processos esperem  mensagens de outros. Seu formato é:&lt;br /&gt;&lt;/p&gt;&lt;pre class="erlang" name="code"&gt;receive&lt;br /&gt; pattern1 -&amp;gt;&lt;br /&gt;  actions1;&lt;br /&gt; pattern2 -&amp;gt;&lt;br /&gt;  actions2;&lt;br /&gt; ....&lt;br /&gt; patternN&lt;br /&gt;  actionsN&lt;br /&gt;end.&lt;/pre&gt;O que é um tanto quanto intuitivo. Ao receber alguma mensagem que  coincida com o pattern1 o processo executará actions1 e assim sucessivamente. Outra  construção igualmente importante é a forma como enviamos mensagens para um  processo. Para isso usamos o operador ``!''. &lt;br /&gt;&lt;pre class="erlang" name="code"&gt;Pid ! Message &lt;/pre&gt;A construção acima envia a mensagem Message (que pode ser qualquer  ``termo'' Erlang) para processo cujo id seja igual a Pid.  A seguir, um exemplo de programa com interações (processos enviando mensagens para  outros processos), ilustrando o uso das construções citadas: &lt;br /&gt;&lt;pre class="erlang" name="code"&gt;-module(example2).&lt;br /&gt;&lt;br /&gt;-export([start/0, ping/2, pong/0]).&lt;br /&gt;&lt;br /&gt;ping(0, Pong_PID) -&gt;&lt;br /&gt; Pong_PID ! finished,&lt;br /&gt; io:format("ping finished~n", []);&lt;br /&gt;&lt;br /&gt;ping(N, Pong_PID) -&amp;gt;&lt;br /&gt; Pong_PID ! {ping, self()},&lt;br /&gt; receive&lt;br /&gt;  pong -&amp;gt; io:format("Ping received pong~n", [])&lt;br /&gt; end,&lt;br /&gt; ping(N - 1, Pong_PID).&lt;br /&gt;&lt;br /&gt;pong() -&amp;gt;&lt;br /&gt; receive&lt;br /&gt;  finished -&amp;gt; io:format("Pong finished~n", []);&lt;br /&gt;  {ping, Ping_PID} -&amp;gt;&lt;br /&gt;   io:format("Pong received ping~n", []),&lt;br /&gt;   Ping_PID ! pong, pong()&lt;br /&gt; end.&lt;br /&gt;start() -&amp;gt;&lt;br /&gt; Pong_PID = spawn(example2, pong, []),&lt;br /&gt; spawn(example2, ping, [3, Pong_PID]).&lt;br /&gt;&lt;/pre&gt;Ao executar o código acima teremos o seguinte resultado:&lt;br /&gt;&lt;pre&gt;1&gt; c(example2.erl).&lt;br /&gt;{ok,example2}&lt;br /&gt;2&gt; example2:start().&lt;br /&gt;Pong received ping&lt;br /&gt;&lt;0.43.0&gt;&lt;br /&gt;Ping received pong&lt;br /&gt;Pong received ping&lt;br /&gt;Ping received pong&lt;br /&gt;Pong received ping&lt;br /&gt;Ping received pong&lt;br /&gt;ping finished&lt;br /&gt;Pong finished&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Surpreendentemente simples e útil. Por trás dessas simples construções, Erlang&lt;br /&gt;cria um novo processo (spawn) e uma ``caixa de mensagens'' para este processo.&lt;br /&gt;Sempre que uma mensagem é enviado ao processo (Pid ! Message), a mensagem fica&lt;br /&gt;guardada na caixa de mensagens até que o processo esteja disponível para recebê-lo. O processo então retira a mensagem da caixa (receive) e seleciona qual ação tomará baseado no&lt;br /&gt;padrão que a mesma se encaixa.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Asynchronous Proxy Factory - Java Strike Back&lt;/h3&gt;Um dos grandes apelos das linguagens tipadas é a facilidade de saber quais&lt;br /&gt;mensagens são entendidas por objetos dessa linguagem, e sempre que a assinatura&lt;br /&gt;das mensagens enviadas não coincidirem com a interface do objeto tem-se um erro&lt;br /&gt;em tempo de compilação. Isso permite a uma IDE como Eclipse fornecer dicas de&lt;br /&gt;codificação no momento que o programador digita o código.&lt;br /&gt;Em oposição, durante a codificação de mensagens em Erlang com a construção "Pid ! Message"&lt;br /&gt;não é possível saber quais mensagens, afinal, o processo Pid escuta.&lt;br /&gt;Java, não fornece estruturas simples como Erlang para mensageria mas um&lt;br /&gt;complicado e também sofisticado arcabouço de concorrência java.util.concurrent.&lt;br /&gt;Nossa proposta é criar uma biblioteca auxiliar que forneça os mecanismos de&lt;br /&gt;concorrência para objetos que funcionem de forma ``síncrona'' usando apenas as&lt;br /&gt;ferramentas já disponíveis na linguagem.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Versão OO do Ping-Pong&lt;/h4&gt;Para uma melhor comparação entre os conceitos de atores de Erlang e os conceitos&lt;br /&gt;de Orientação a Objetos de Java, iremos fazer uma adaptação do programa&lt;br /&gt;ping-pong (example2). Tomaremos o cuidado de fazer uma versão testável, quer&lt;br /&gt;dizer, ao invés dos métodos escreverem String na saída padrão, eles irão&lt;br /&gt;preencher um ``log de conversação'' que será analisado num teste unitário. Comecemos&lt;br /&gt;pelo teste.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Test&lt;br /&gt; public void ping(){&lt;br /&gt;  StringBuffer string = new StringBuffer();&lt;br /&gt;  Ping ping = new Ping(string);&lt;br /&gt;  PingInterface pong = new Ping(string);&lt;br /&gt;  ping.sendPing(3, pong);&lt;br /&gt;  verifyPingConversation(string, 3);&lt;br /&gt; }&lt;/pre&gt;StringBuffer é uma versão sincronizada do StringBuilder. Isto vem a calhar&lt;br /&gt;porque devemos evitar condições de corrida na escrita do log. A grosso modo,&lt;br /&gt;este método é uma versão junit da função start() do programa example2.&lt;br /&gt;A verificação que implementaremos apenas verifica se todas as falas foram&lt;br /&gt;realizadas durante o diálogo dos atores. Inicializaremos uma mapa com as frases&lt;br /&gt;e a quantidade de vezes que aquelas frases devem aparecer. Sempre que uma frase&lt;br /&gt;for dita, iremos decrementar o contador no mapa até zerá-lo quando riscaremos &lt;br /&gt;a frase do mapa.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;private void verifyPingConversation(StringBuffer string, int i) {&lt;br /&gt;  String[] messages = string.toString().split("\n");&lt;br /&gt;  Map&lt;String, Integer&gt; expectedResult = &lt;br /&gt;   new HashMap&lt;string, integer=""&gt;();&lt;br /&gt;  expectedResult.put("Pong received ping", i);&lt;br /&gt;  expectedResult.put("Ping received pong", i);&lt;br /&gt;  expectedResult.put("Pong finished", 1);&lt;br /&gt;  expectedResult.put("ping finished", 1);&lt;br /&gt;  for (String string2 : messages) {&lt;br /&gt;   Integer count = expectedResult.get(string2);&lt;br /&gt;   count--;&lt;br /&gt;   if (count ==0){&lt;br /&gt;    expectedResult.remove(string2);&lt;br /&gt;   } else {&lt;br /&gt;    expectedResult.put(string2, count);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  Assert.assertTrue(expectedResult.isEmpty());&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Agora a versão Java do Ping. Bonus: definimos uma interface de comunicação,&lt;br /&gt;eliminamos os seletores e a classe é testável.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class Ping implements PingInterface {&lt;br /&gt; private StringBuffer conversation;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public Ping(StringBuffer string){&lt;br /&gt;  conversation = string;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void sendPing(int n, PingInterface pid) {&lt;br /&gt;  if (n ==0 ){&lt;br /&gt;   pid.finished();&lt;br /&gt;   say("ping finished\n");   &lt;br /&gt;  } else {&lt;br /&gt;   pid.ping(this);&lt;br /&gt;   sendPing(n-1, pid);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void say(String string) {&lt;br /&gt;  conversation.append(string);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void finished() {&lt;br /&gt;  say("Pong finished\n"); &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void pong(PingInterface pong) {&lt;br /&gt;  say("Ping received pong\n");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; public void ping(PingInterface ping) {&lt;br /&gt;  say("Pong received ping\n");&lt;br /&gt;  ping.pong(this);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;h4&gt;Padrão Produtor-Consumidor em Java&lt;/h4&gt;Inicialmente, precisaremos de um sistema de mensageria como Erlang. Para&lt;br /&gt;isso, teremos uma ``caixa de mensagens'' que faremos com o uso de uma&lt;br /&gt;BlockingQueue (fila bloqueante do pacote java.util.concurrent). Por questões de&lt;br /&gt;simplicidade utilizaremos a implementação ArrayBlockingQueue.&lt;br /&gt;Deixaremos um consumidor a espera de serviços que chegarão na&lt;br /&gt;``caixa de mensagens''. Este trabalhador terá uma linha de execução&lt;br /&gt;independente do programa principal e um reservatório de trabalhadores para&lt;br /&gt;executar cada uma das mensagens. &lt;br /&gt;Para controlar o ciclo de vida do consumidor, o consumidor irá dispor de:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Uma tarefa kill; Ao receber a tarefa kill, o processo deve parar. A   ideia é que essa seja a última tarefa a ser executada pelo processo.&lt;/li&gt;&lt;li&gt; Uma variável sentinel; caso o valor falso seja atribuido o processo pára   independente se outras tarefas existam na fila;&lt;/li&gt;&lt;li&gt; um método para interrupção;&lt;/li&gt;&lt;/ul&gt;Internamente, o consumidor terá controle sobre o reservatório de trabalhadores&lt;br /&gt;através da interface ExecutorService.&lt;br /&gt;Abaixo, propriedades do executor conforme mencionado:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;/**&lt;br /&gt;  * caixa de mensagens (tarefas) do executor&lt;br /&gt;  */&lt;br /&gt; protected BlockingQueue&lt;t&gt; blockingQueue;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * reservatorio de trabalhadores&lt;br /&gt;  */&lt;br /&gt; protected ExecutorService executorService;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; // variaveis de controle do ciclo de vida&lt;br /&gt; private boolean sentinel = true;&lt;br /&gt; /**&lt;br /&gt;  *  Tarefa que finaliza&lt;br /&gt;  */&lt;br /&gt; private final T kill;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * variavel de sincronizacao: quando chegar a zero, o&lt;br /&gt;  *  processo terminou sua execucao&lt;br /&gt;  */&lt;br /&gt; private CountDownLatch countDownLatch = new CountDownLatch(1);&lt;/t&gt;&lt;/pre&gt;O método principal do Executor, é o método público run() da interface Runnable.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Override&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   // importante para interromper o loop infinito&lt;br /&gt;   while (isSentinelEnable()) {&lt;br /&gt;    T t = getBlockingQueue().take();&lt;br /&gt;    if (t == kill) {&lt;br /&gt;     kill();&lt;br /&gt;     sentinel = false;&lt;br /&gt;    } else {&lt;br /&gt;     execute(t);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   // anuncia que o programa terminou&lt;br /&gt;   getCountDownLatch().countDown();&lt;br /&gt;  } catch (InterruptedException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; } &lt;/pre&gt;Se uma mensagem kill é recebida, o método kill() será invocado para que o objeto&lt;br /&gt;possa realizar algum procedimento de sanidade. Para as demais mensagens, o&lt;br /&gt;método execute() é invocado.&lt;br /&gt;Enquanto execute() é abstrato o método kill() possui um implementação básica&lt;br /&gt;vazia.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;protected abstract void execute(T t);&lt;br /&gt;&lt;br /&gt; protected void kill() {&lt;br /&gt; }&lt;/pre&gt;A classe possui ainda três métodos de razoável importância. O construtor, um&lt;br /&gt;inicializador e um método de sincronização. Os demais métodos são accessors e&lt;br /&gt;mutators, além de possíveis métodos para finalização.  &lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;/**&lt;br /&gt;  * Instancia o executor, mas nao inicia seu processamento &lt;br /&gt;  * @param n tamanho do pool de trabalhadores&lt;br /&gt;  * @param m capacidade maxima da caixa de mensagens&lt;br /&gt;  * @param kill tarefa utilizada para finalizar o processamento&lt;br /&gt;  */&lt;br /&gt; public Executor(int n, int m, T kill) {&lt;br /&gt;  executorService = Executors.newFixedThreadPool(n);&lt;br /&gt;  blockingQueue = new ArrayBlockingQueue&lt;t&gt;(m);&lt;br /&gt;  this.kill = kill;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Inicia o processamento com uma nova linha de execucao&lt;br /&gt;  */&lt;br /&gt; public void execute() {&lt;br /&gt;  final Thread thread = new Thread(this);&lt;br /&gt;  thread.start();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * aguarda o fim do processamento e finaliza o reservatorio &lt;br /&gt;  * de trabalhadores&lt;br /&gt;  */&lt;br /&gt; public void awaitTermination() {&lt;br /&gt;  try {&lt;br /&gt;   getCountDownLatch().await();&lt;br /&gt;   this.executorService.shutdown();&lt;br /&gt;   this.executorService.awaitTermination(1000,&lt;br /&gt;                       TimeUnit.MILLISECONDS);&lt;br /&gt;  } catch (final InterruptedException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;/t&gt;&lt;/pre&gt;&lt;h4&gt;Quicksort Paralelo em Java&lt;/h4&gt;Façamos agora uma pausa, no desenvolvimento da solução para testar a classe&lt;br /&gt;acima. Como prova de conceito iremos implementar uma versão paralela do&lt;br /&gt;Quicksort que utliza o código.&lt;br /&gt;A ideia básica, em implementar um quicksort paralelo usando o padrão&lt;br /&gt;produtor-consumidor é receber uma tarefa com um vetor a ser ordenado&lt;br /&gt;e particioná-los através de um elemento pivo (desse vetor) e&lt;br /&gt;adicionar cada uma das partições como novas tarefas da fila de execução do&lt;br /&gt;executor.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Override&lt;br /&gt; public void execute(QuickSortJob&lt;t&gt; t) {&lt;br /&gt;  int size = t.array.length;&lt;br /&gt;  if (size &lt; thresold){&lt;br /&gt;   Arrays.sort(t.array);&lt;br /&gt;   t.result = t.array;&lt;br /&gt;   t.array = null;&lt;br /&gt;   if (t.joinToFather()){&lt;br /&gt;    doneSignal.countDown();&lt;br /&gt;   }&lt;br /&gt;   return ;&lt;br /&gt;  } &lt;br /&gt;  int rand = random.nextInt(size);&lt;br /&gt;  final T comparable = t.array[rand];&lt;br /&gt;  T[] rights = newInstanceArray(t);&lt;br /&gt;  T[] lefts = newInstanceArray(t);&lt;br /&gt;  T[] mids  = newInstanceArray(t);&lt;br /&gt;  int l = 0, r = 0, m = 0;&lt;br /&gt;  for (int i = 0; i &lt; t.array.length; i++) {&lt;br /&gt;    T array_element = t.array[i];&lt;br /&gt;   if (array_element.compareTo(comparable) &lt; 0){&lt;br /&gt;    lefts[l++] = array_element;&lt;br /&gt;    continue;&lt;br /&gt;   }&lt;br /&gt;   if (array_element.compareTo(comparable) &gt; 0){&lt;br /&gt;    rights[r++] = array_element;&lt;br /&gt;    continue;&lt;br /&gt;   }&lt;br /&gt;   mids[m++] = array_element;&lt;br /&gt;  }  &lt;br /&gt;  BlockingQueue&lt;quicksortjob&gt;&gt; blockingQueue = getBlockingQueue();&lt;br /&gt;  blockingQueue.add(new QuickSortJob&lt;t&gt;&lt;br /&gt;   (t, QuickSortJob.LEFT, Arrays.copyOf(lefts, l)));&lt;br /&gt;  t.mid = Arrays.copyOf(mids, m);&lt;br /&gt;  blockingQueue.add&lt;br /&gt;   (new QuickSortJob&lt;t&gt;(t, &lt;br /&gt;    QuickSortJob.RIGHT, Arrays.copyOf(rights, r)));&lt;br /&gt;  t.array = null;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Podemos programar um certificado \footnote{algoritmos de verficação ou&lt;br /&gt;certificados estão relacionados com complexidade computacional. Uma breve&lt;br /&gt;explicação sobre o assunto pode nas do &lt;br /&gt;&lt;a href="http://www.ime.usp.br/%7Epf/analise_de_algoritmos/aulas/NPcompleto2.html#short-certificate"&gt;Paulo Feofiloff&lt;/a&gt; para ordenação. Para isto criamos um vetor desordenado, executamos o ordenador  e verificamos se os elementos do vetor estão ordenados.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public void testQuickSort() throws Exception { &lt;br /&gt;  Random random = new Random(); int n = 200000;  &lt;br /&gt;  Integer[] problem = new Integer[n];&lt;br /&gt;  for (int i =0; i &lt; n ; i++){&lt;br /&gt;      problem[i] = random.nextInt();&lt;br /&gt;  }&lt;br /&gt;  final long timeMilis = System.currentTimeMillis();  &lt;br /&gt;  QuickSortWorker.doneSignal = new CountDownLatch(1);&lt;br /&gt;  originalJob =  new QuickSortJob&lt;integer&gt;(null, 0, problem);  &lt;br /&gt;  QuickSortWorker&lt;integer&gt; executor = &lt;br /&gt;    new QuickSortWorker&lt;integer&gt;(10, n); // executor  &lt;br /&gt;  executor.getBlockingQueue().add(originalJob);&lt;br /&gt;  executor.setCountDownLatch(QuickSortWorker.doneSignal);&lt;br /&gt;  executor.execute();&lt;br /&gt;  executor.awaitTermination();&lt;br /&gt;  &lt;br /&gt;  final long lastMilis = System.currentTimeMillis();&lt;br /&gt;  System.out.println("Tempo Total:" + (lastMilis - timeMilis));&lt;br /&gt;  &lt;br /&gt;  int temp = Integer.MIN_VALUE;&lt;br /&gt;  QuickSortJob&lt;integer&gt; job = originalJob;&lt;br /&gt;  for (int i = 0; i &amp;lt; job.result.length; i++) {&lt;br /&gt;   assertTrue(temp &amp;lt;= job.result[i]);&lt;br /&gt;   temp = job.result[i];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Junit verde! Podemos prosseguir com o desenvolvimento do utilitário.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Uma versão estática&lt;/h4&gt;O que a construção receive faz em Erlang, um ``switch case'' poderia fazer no&lt;br /&gt;template method execute. Podemos fazer melhor que isto. Em Java, é possível&lt;br /&gt;fazer com que o compilador verifique se as mensagens enviadas são entendidas por&lt;br /&gt;meio de sua assinatura. Para isto, iremos criar um wrapper que implementa &lt;br /&gt;a (mesma) interface de um objeto alvo e transformar a mensagem bloqueante numa&lt;br /&gt;assíncrona. Criaremos uma classe message com todas as informações necessárias&lt;br /&gt;a execução da mensagem o próprio método (java.lang.reflec.Method), o objeto&lt;br /&gt;alvo e os parâmetros da chamada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class Message implements Callable{&lt;br /&gt; &lt;br /&gt; Object[] parameters;&lt;br /&gt; Object target;&lt;br /&gt; Method method;&lt;br /&gt; &lt;br /&gt; public Message(Object target2, Method method2, Object[] args) {&lt;br /&gt;  parameters = args;&lt;br /&gt;  this.method = method2;&lt;br /&gt;  this.target = target2;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Message() {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public Object call() throws Exception {&lt;br /&gt;  return method.invoke(target, parameters);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;Agora, iremos criamos uma especialização do Executor que processa uma FutureTask.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class SpawnExecutor extends Executor&lt;futuretask&gt;{&lt;br /&gt; public SpawnExecutor(int n, int m) {&lt;br /&gt;  super(n, m, new FutureTask(new Message()));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void execute(FutureTask task) {&lt;br /&gt;  executorService.execute(task);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void shutdown(){&lt;br /&gt;  try {&lt;br /&gt;   getBlockingQueue().put(getKill());&lt;br /&gt;  } catch (InterruptedException e) {&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/futuretask&gt;&lt;/pre&gt;Devemos encapsular o objeto Message numa FutureTask. Dessa forma, podemos&lt;br /&gt;notificar os interessados sobre a conclusão de uma mensagem específica. Façamos então uma outra especialização (do Executor) que exporte estas funcionalidades além de&lt;br /&gt;oferecer uma interface mais simples para o envio de mensagens.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public void send(Message message) {&lt;br /&gt;  FutureTask futureTask = new FutureTask(message);&lt;br /&gt;  spawnExecutor.getBlockingQueue().add(futureTask);&lt;br /&gt;  notify(futureTask);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void notify(FutureTask futureTask) {&lt;br /&gt;  if (observer != null){&lt;br /&gt;   observer.notify(futureTask);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Observer observer;&lt;br /&gt; &lt;br /&gt; public void setObserver(Observer observer) {&lt;br /&gt;  this.observer = observer;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public Observer getObserver() {&lt;br /&gt;  return observer;&lt;br /&gt; }&lt;/pre&gt;Na listagem, o efeito é conseguido com o padrão Decorator.&lt;br /&gt;Temos um último problema: popular o objeto Message. Enquanto que objeto alvo e&lt;br /&gt;os parâmetros são conhecidos, ainda precisamos encontrar o objeto Method apartir&lt;br /&gt;do pacote de reflexão (queremos encontrar o método apartir do nome). Para isso,&lt;br /&gt;faremos um objeto mais especializado que recebe uma mensagem e cria e popula um&lt;br /&gt;objeto Message e o coloca na fila de trabalhos.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public abstract class AsynchronousStaticExecutor extends AsynchronousExecutor{&lt;br /&gt;  protected void sendMessage(Method method, Object[] params) {&lt;br /&gt;  if (parameters.length - parameterTypes.length != 0)&lt;br /&gt;   return false;&lt;br /&gt;  for (int i = 0; i &amp;lt; parameters.length; i++) {&lt;br /&gt;   Object object = parameters[i];&lt;br /&gt;   if (!parameterTypes[i].isAssignableFrom(&lt;br /&gt;           object.getClass()))&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Agora podemos criar a versão estática assíncrona do programa ping pong.&lt;br /&gt;Mas, como de costume iremos apresentar o teste unitário para tal.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Test&lt;br /&gt; public void testAsyncStaticPing(){&lt;br /&gt;  StringBuffer string = new StringBuffer();&lt;br /&gt;  Ping ping = new Ping(string);  &lt;br /&gt;  AsyncPing pong = new AsyncPing(ping);&lt;br /&gt;  // iniciar processo&lt;br /&gt;  pong.start();&lt;br /&gt;  &lt;br /&gt;  ping.sendPing(3, pong);&lt;br /&gt;  &lt;br /&gt;  // finaliza processo&lt;br /&gt;  pong.shutdown();&lt;br /&gt;  pong.awaitForTermination();&lt;br /&gt;  &lt;br /&gt;  verifyPingConversation(string, 3);&lt;br /&gt; }&lt;/pre&gt;E, a classe estática.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class AsyncPing extends AsynchronousStaticExecutor &lt;br /&gt;     implements PingInterface {&lt;br /&gt;&lt;br /&gt; private Ping target;&lt;br /&gt;&lt;br /&gt; public AsyncPing(Ping ping) {&lt;br /&gt;  this.target = ping;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected Object getTarget() {&lt;br /&gt;  return target;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void finished() {&lt;br /&gt;  sendMessage("finished", new Object[] {});&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void ping(PingInterface ping) {&lt;br /&gt;  sendMessage("ping", new Object[] { ping });&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void pong(PingInterface pong) {&lt;br /&gt;  sendMessage("pong", new Object[] { pong });&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;h4&gt;Java Lang Reflection&lt;/h4&gt;Um mago sabe a importância de um espelho. Entre as várias mágicas que o pacote&lt;br /&gt;de reflexão da linguagem está o truque de criar um proxy às chamadas&lt;br /&gt;de um conjunto de interfaces. Essa simples mágica talvez seja a forma  mais&lt;br /&gt;fácil de adicionar algum comportamento em tempo de execução para algum objeto&lt;br /&gt;genérico (outras formas seriam a manipulação de byte code ou do próprio&lt;br /&gt;código-fonte). Por tamanha facilidade, a API de reflexão é utilizada nas&lt;br /&gt;chamadas RMI para forjar um representante local de uma classe remota. Este&lt;br /&gt;representante recebe as chamadas locais e delega sua execução a entidade remota &lt;br /&gt;correspondente dando a ilusão ao programador que as chamadas são realizadas localmente.&lt;br /&gt;E, tudo isso graças a uma fábrica de proxies e uma interface de manipulação:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public interface InvocationHandler {&lt;br /&gt;    Object invoke(Object proxy, Method method, Object[] args)&lt;br /&gt;        throws Throwable;&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="java" name="code"&gt;public class GenericProxyFactory {&lt;br /&gt;&lt;/pre&gt;Limitação importante: Não é possível&lt;br /&gt;criar proxy para objetos sem interfaces. Para contornar o problema é&lt;br /&gt;possível utlizar a refatoração: extract interface. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Aplicação: AsynchronousProxy&lt;/h4&gt;Vamos agora ao objetivo final desse artigo, apresentar um proxy para transformar&lt;br /&gt;chamadas bloqueantes em chamadas não bloqueantes. O uso básico desse proxy e&lt;br /&gt;permitir que o programador faça uma versão simples do código, sem se preocupar&lt;br /&gt;com concorrência e depois, sem mudança de paradigma ou expressivade, utilizar a&lt;br /&gt;concorrência.&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Test&lt;br /&gt; public void testAsyncPing() throws Exception {&lt;br /&gt;  StringBuffer string = new StringBuffer();&lt;br /&gt;  Ping ping = new Ping(string);&lt;br /&gt;  Ping pong = new Ping(string);&lt;br /&gt;  // iniciar processo&lt;br /&gt;  AsynchronousProxyFactory asynchronousProxyFactory = new AsynchronousProxyFactory (1, 10, pong);&lt;br /&gt;  PingInterface asyncPong = asynchronousProxyFactory.getAsynchronousProxy(PingInterface.class);&lt;br /&gt;  asynchronousProxyFactory.start();&lt;br /&gt;  &lt;br /&gt;  ping.sendPing(3, asyncPong);&lt;br /&gt;  &lt;br /&gt;  // finalizar processo&lt;br /&gt;  asynchronousProxyFactory.shutdown();&lt;br /&gt;  asynchronousProxyFactory.awaitForTermination();&lt;br /&gt;  &lt;br /&gt;  verifyPingConversation(string, 3);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;public class AsynchronousInvocationHandler implements InvocationHandler{&lt;br /&gt; private final AsynchronousExecutor asynchronousExecutor;&lt;br /&gt; private final T target; &lt;br /&gt; public AsynchronousInvocationHandler&lt;br /&gt;   (AsynchronousExecutor asynchronousObject, T target) {&lt;br /&gt;  this.asynchronousExecutor = asynchronousObject;&lt;br /&gt;  this.target = target;&lt;br /&gt; }&lt;br /&gt; @Override&lt;br /&gt; public Object invoke&lt;br /&gt;   (Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;  asynchronousExecutor.send(new Message(target, method, args));&lt;br /&gt;  return null; &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class AsynchronousProxyFactory extends AsynchronousExecutor {&lt;br /&gt;&lt;br /&gt; private T target;&lt;br /&gt;&lt;br /&gt; public AsynchronousProxyFactory(int n, int m, T obj) {&lt;br /&gt;  super(n, m);&lt;br /&gt;  this.target = obj;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; public T getAsynchronousProxy(Class&lt;t&gt; intf) {&lt;br /&gt;  return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),&lt;br /&gt;    new Class[] { intf },&lt;br /&gt;    new AsynchronousInvocationHandler(this, target));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;Feito!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;script language="javascript"&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-6464500286691402362?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/6464500286691402362/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=6464500286691402362' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6464500286691402362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6464500286691402362'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/07/magia-assincrona.html' title='Magia Assíncrona'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4640866631259749579</id><published>2010-06-18T14:26:00.000-07:00</published><updated>2011-01-21T06:49:57.461-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologias'/><category scheme='http://www.blogger.com/atom/ns#' term='São Paulo'/><title type='text'>Luz 360 graus</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/aPGvSY5UASU-YFtBZEbRovR1ITjrwY_U_LvHEFJZrA0?feat=directlink" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;img border="0" height="62" src="http://3.bp.blogspot.com/_du5DCjwyc9c/TBvkWTtgtYI/AAAAAAAAAQw/d92UoP5CMew/s640/luz4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Com ajuda do Hugin, e das dicas do Marcos Sobrinho, criei uma imagem da histórica estação da Luz da capital paulista com as fotos tiradas do meu celular LG. &lt;br /&gt;&lt;br /&gt;:D&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hugin.sourceforge.net/"&gt;http://hugin.sourceforge.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4640866631259749579?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4640866631259749579/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4640866631259749579' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4640866631259749579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4640866631259749579'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/06/luz-360-graus.html' title='Luz 360 graus'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_du5DCjwyc9c/TBvkWTtgtYI/AAAAAAAAAQw/d92UoP5CMew/s72-c/luz4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2322549443297622634</id><published>2010-04-07T22:00:00.001-07:00</published><updated>2010-04-07T22:00:41.881-07:00</updated><title type='text'>Uma crítica da crítica do BBB</title><content type='html'>Eu não acredito no que estou fazendo. Estou maculando meu blog com um post sobre BBB. Então, primeiro, a minha defesa, por que escrevo sobre isso. Basicamente porque todas as análises sobre o programa que li foram toscas e por  muitas vezes de pessoas que se sentiram ofendidas, magoadas, pelo resultado. E? E o fato delas se sentirem  magoadas é sinal que elas precisam aprender a respeitar a opinião alheia. O presente texto tem objetivo apaziguador, diplomático e didático. &lt;br /&gt;Toda essa discussão que o último BBB trouxe já torna evidente a relevância do programa. Ele traz em voga a discussão sobre comportamento e a percepção do comportamento.&lt;br /&gt;Não importa quanto a produção tenha manipulado os jogadores, ou quanto a edição participou do programa. Fato é que um enredo fora apresentado e ao final de cada semana um outro jogo era travado. Sim, a votação é um jogo que como foi provado por Kenneth Arrow, matematicamente impossível de se ter um sistema que seja perfeitamente justa (ou que otimize a função de  bem-estar social).&lt;br /&gt;Não vou entrar aqui nos detalhes da teoria dos jogos e sobre a impossibilidade de Arrow. Estou apenas deixando evidente que o público jogou BBB, no intuito de fazer valer o seu gosto individual, sua opinião sobre o que achou mais interessante. E cabe aqui ressaltar um outro detalhe que muitos não compreenderam:  O público do BBB não tem interesse em escolher o participante de maior QI, conhecimento, etc. Não tem motivo algum para escolher o “participante” que seria o melhor presidente da república porque esse poderia ser um chato que não teria feito ressaltar suas qualidades ou, mais do que isso, não teria transmitido alguma ideia relevante.&lt;br /&gt;É claro que quando digo “participante” falo da imagem do participante real, do recorte apresentado ao público da história que ele viveu ali, da série de decisões e atitudes naquele intervalo de espaço-tempo (obviamente editadas, manipuladas, etc _ ressalto que isso não interessa. A história é mais importante que a veracidade dos fatos; porque é essa que é analisada). Se essas decisões e atitudes refletem um ponto de vista é o que basta.&lt;br /&gt;Pois, voltando ao público como jogadores. O jogo torna-se mais interessante quando pontos de vista que partes do público se identificam colidem. Aí a inteligência dos produtores em selecionar tipos, caricaturas que provoquem discussões (e outras interações) entre o público.&lt;br /&gt;Mas então, qual seria o ponto de vista que o vencedor desse BBB apresentou? Pedro Bial, o jornalista apresentador do reallity show, deu excelentes pistas disso, no discurso que declarou o vencedor da competição, quando muitos já haviam fracassado miseravelmente. Sim, porque alguns preferiram simplificar a história como: a vitória do preconceito sobre a diversidade. Torpe! Débora Secco, fortemente malhada por Tutty Vasquez se aproximou muito mais da realidade com suas declarações despretensiosas do que esses jornalistas.&lt;br /&gt;Segundo, segundo Bial, Dourado representou a ideia do cara sofrido, derrotado mil vezes pela vida mas que ainda assim insistia em lutar. O grande perdedor, transformado em vencedor na epopeia. Já Débora Secco avaliou que o personagem representou o imperfeito, a pessoas cheia de defeitos, como as pessoas reais, e que mesmo assim jogava para ser vitorioso; foi o errado que deu certo.Vasquez foi taxativo: a lógica da militância dourada: “por maiores que sejam os defeitos, dá para vencer no Brasil”.&lt;br /&gt;Vasquez, porque você fugiu da biblioteca nas aulas de literatura? Poderia teria aproveitado “Memórias de um sargento de milícias” e ter aprendido que existem personagens pícaros (os bons professores de literatura costumam ensinar sobre isso). Se você mora na Terra e tem um pouco de senso crítico já deve ter percebido que existe um desgaste do maniqueismo. &lt;br /&gt;Falo de Tutty Vasquez porque ele foi o epitoma da obtusidade. Mas outros jornalistas falaram sobre o reinado do lado negro a partir do BBB7, sobre os jedis do lado claro da força. Aff!&lt;br /&gt;Dizer que algum gay deveria ganhar é igualmente patusco. Pela própria ideia de igualdade, a opção sexual do vencedor não deveria importar em absoluto. Um gay não é um gay antes de tudo. É uma pessoa, e como pessoa deveria ser julgado. Essa é a ideia de igualdade que parece ter permeado o julgamento do público, ou pelo menos da maioria “vencedora”.&lt;br /&gt;A maioria que tomou repulsa desse tipo de imposição de valores (“esse Big Brother deveria ser para celebrar a diversidade”. A resposta do público foi como: “O BB celebra o que eu quero, cara pálida”.&lt;br /&gt;As impressões passadas pelo personagem dourado refletem, além do que já foi falado (seu jeito pícaro, do coração Rocky Balboa ), a repulsa a imposição. Algumas de suas frases ilustram bem isso: Numa brincadeira ao vivo de como o publico gay aumentava no Brasil, o Dourado se pôs como hétero, dizendo ser da "resistência hétero". Outra, quando Dicesar, após  indicá-lo para o Paredão,  na mesma semana que havia falado que ele merecia uma folga do paredão responde: “Apesar de ser viado, seje homem”.&lt;br /&gt;Mas, muitas outras divertidas e absurdas frases serão encontradas na internet. Aqui uma pequena seleção:&lt;br /&gt;&lt;br /&gt;Fernanda : Dourado, você vai chupar o picolé de banana ?&lt;br /&gt;Dourado: Eu não chupo, eu como. &lt;br /&gt;---------&lt;br /&gt;Dourado: Homem que é homem não repara em celulite.&lt;br /&gt;Serginho: Eu reparo!&lt;br /&gt;Dourado: E você é homem?&lt;br /&gt;---------&lt;br /&gt;Dourado na piscina e Fernanda pergunta: Vai mergulhar?&lt;br /&gt;Dourado: Não. Só entrei pra ver se não era Sprite. &lt;br /&gt;---------&lt;br /&gt;Dicesar : Você não deveria rir assim porque escapou de um paredão.&lt;br /&gt;Dourado: Você votou em mim ?&lt;br /&gt;Dicesar: Sim.&lt;br /&gt;Dourado: Então estou rindo é de você&lt;br /&gt;&lt;br /&gt;Outras estapafúrdias (e equivocadas) como a  frase sobre a relação dos homossexuais e a AIDS. &lt;br /&gt;&lt;br /&gt;Cabe, enfim lembrar uma frase célebre de Oscar Wilde, um dos maiores escritores do mundo, diga-se de passagem, gay: “É absurdo dividir as pessoas em boas e más. As pessoas ou são charmosas ou tediosas”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-2322549443297622634?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2322549443297622634/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2322549443297622634' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2322549443297622634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2322549443297622634'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/04/uma-critica-da-critica-do-bbb.html' title='Uma crítica da crítica do BBB'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-1614888330639034056</id><published>2010-02-10T08:04:00.000-08:00</published><updated>2010-02-10T08:44:42.953-08:00</updated><title type='text'>Eu sou pessoa?</title><content type='html'>Pessoa: um indivíduo, com referência a seu relacionamento social.&lt;br /&gt;&lt;br /&gt;A mãe tentava explicar a filha de três anos porque era preciso fazer silêncio no ônibus.&lt;br /&gt;_ As pessoas podem não gostar do barulho. As pessoas têm o direito de não ser perturbada.&lt;br /&gt;_ Karina, uma coisa... _ levantou o dedinho para interromper a mãe _ eu sou pessoa ?&lt;br /&gt;Dava para ver em seus olhos sua preocupação sincera em saber se gozava do título mencionado, e desses direitos. Talvez por "ser pinininha", como ela racionalizara certa vez, não teria tal sorte.&lt;br /&gt;A mãe respondeu com um abraço:&lt;br /&gt;_ Claro que é uma "pessoa". E uma pessoa maravilhosa!&lt;br /&gt;A pequena se encheu de alegria pelo respeito concedido a ela.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-1614888330639034056?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/1614888330639034056/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=1614888330639034056' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/1614888330639034056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/1614888330639034056'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/02/eu-sou-pessoa.html' title='Eu sou pessoa?'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-6904315466503445550</id><published>2010-02-01T14:14:00.001-08:00</published><updated>2010-02-11T07:52:18.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Psicologia'/><title type='text'>Irmão  melhor</title><content type='html'>Essa história eu ouvi de uma entrevista do Pedro Bloch a muitos anos atrás (1998). Ainda melhor que a história dos pregos... Não encontrei o texto em nenhum lugar. Então estou recontando a história da forma como lembro.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Na sala do médico, duas crianças de oito anos estão numa consulta de rotina.&lt;br /&gt;Eram  gêmeos. Desses que é difícil dizer quem é quem. Mas que a aparência não o engane. Eram irmãos&lt;br /&gt;de personalidades diferentes. Na entrevista, o médico perguntou aos garotos:&lt;br /&gt;_ Quem é o mais estudioso !?&lt;br /&gt;_ É ele! _ respondeu alegre o mais cerelepe.&lt;br /&gt;_ Ah. Quem é o mais inteligente !?&lt;br /&gt;_ É ele! _ denovo o garoto cerelepe.&lt;br /&gt;_ Ah. Então quem é o mais bonito !?&lt;br /&gt;_ É ele! _ não titumbeou o garoto.&lt;br /&gt;_ Mmm. E de quem a mãe mais gosta!?&lt;br /&gt;_ É dele! _ respondeu mais um vez sem nem dar chance do seu irmão falar alguma coisa.&lt;br /&gt;Bom, mas essa última pergunta também não ajudava muito: se ele é o mais estudioso, inteligente e bonito,&lt;br /&gt;claro que a mãe iria gostar mais dele.&lt;br /&gt;_ Escuta garoto _ exclamou o médico em tom sério _ não tem nada que você não seja "mais" não !?&lt;br /&gt;_ Sim. _ respondeu o outro gêmeo _ ele é mais irmão.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;span style="color: rgb(136, 136, 136);"&gt; Rodrigo&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-6904315466503445550?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/6904315466503445550/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=6904315466503445550' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6904315466503445550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6904315466503445550'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2010/02/irmao-mais.html' title='Irmão  melhor'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-6764091730134376957</id><published>2009-12-30T07:49:00.000-08:00</published><updated>2009-12-30T08:15:33.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Música'/><title type='text'>Um texto  pós-moderno - better man</title><content type='html'>Espere olhando para as horas... são 4 horas. Tem que parar. Nesse tom melancólico, começa a modesta música "better man", uma balada pop composta por Eddie Vedder ainda na adolescência. A música é a ilustração perfeita da ironia. O próprio título é irônico, uma vez que em momento algum na música aparece um better man.&lt;br /&gt;&lt;br /&gt;She lies and says she's in love with him, can't find a better man...&lt;br /&gt;&lt;br /&gt;Irônico, não!? Para começar, com a personagem central da história, a mulher que aguarda tarde da noite seu esposo... Ela chega a treinar com o espelho o fim do relacionamento. E o que faz? Diz a negação do que queria dizer.&lt;br /&gt;&lt;br /&gt;Vedder escreve músicas sobre sentimentos fortes. Sua relação com a mãe foi bastante complicada pelo o que descreve em suas canções. Na trilogia Mommy, Vedder descreve um homem perturbado com o relacionamento materno; a mãe mente para o filho sobre a identidade do pai, revela a verdade para o garoto na puberdade dizendo a ele como se parece com o verdadeiro pai e o leva a uma relação incestuosa. Sua reflexão: "Ainda estou vivo...". No final da trilogia, a mãe morre e o personagem central é condenado à pena capital.&lt;br /&gt;&lt;br /&gt;Em better man, Vedder ataca a posição passiva e conformada da mãe, mas de uma forma mais singela. Basta ouvir a música uma única vez para perceber que o tom melancólico do refrão é (outra) ironia. Can't find a better man? A música cresce, continuamente, torna-se viva e cheia de esperança. É claro que ela pode. Desde o princípio sempre pode. E carregado de certeza do contrário, o refrão canta: can't find a better man x2. Can't find a better maaaaaaaaaaan... Ao final da música, o ouvinte se sente energizado e esperançoso, o que é irônico a essas palavras.&lt;br /&gt;&lt;br /&gt;Assim, dentro da simplicidade do gênero grunge, o vocalista consegue pintar com a antítese: verdadeiro com falso, esperança com melancolia de forma clara como cristal. O recurso consagrado por imortais da literatura como Oscar Wilde e Machado de Assis fica estampado nos acordes metálicos dessa simples mas vibrante música. Da abertura sombria para o esperançoso final, os vários tons de uma figura de linguagem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-6764091730134376957?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/6764091730134376957/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=6764091730134376957' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6764091730134376957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/6764091730134376957'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/12/um-texto-pos-moderno-better-man.html' title='Um texto  pós-moderno - better man'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4650294108990940236</id><published>2009-12-30T07:45:00.000-08:00</published><updated>2009-12-30T07:46:05.692-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Psicologia'/><title type='text'>Palavras de Verdade</title><content type='html'>A primeira palavra que minha filha aprendeu a falar foi "pai". O que pode parecer estranho porque ele morava com a mãe e eu não tinha tanto contato assim com ela. Talvez tenha sido coincidência que o som que ela emitia ao me ver  fosse parecido com pai. Fato é que ela aprendeu rápido a chamar o pai, a mãe e depois vários objetos. Mas nenhuma dessas palavras foi tão palavra quanto aquela que ela aprendeu a falar pouco tempo depois: "não". &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O que acontece com o "não" é que esse advérbio tem um valor semântico variável. Ao contrário de mãe, pai, bola, água cujo valor semântico é constante para a criança (pai é sempre o mesmo pai, assim como bola sempre significa uma bola, oras), o não é usado para expressar a negação de qualquer coisa. Portanto, "não" pode ser qualquer coisa.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A aquisição de tal vocábulo é o início de uma nova relação com o mundo. O mundo deixa de ter apenas objetos e passa a ter história, inter relações que começam a ser compreendidas. A mudança é tão fantástica que nossas lembranças mais remotas remetem a um certo momento em que conseguimos expressar o mundo por tais vocábulos.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hoje minha afilhada chamou a mãe várias vezes por &lt;span class="il"&gt;mamãezinha&lt;/span&gt;. A mudança sutil entre chamar a mãe por mãe e por &lt;span class="il"&gt;mamãezinha&lt;/span&gt; é outra enorme mudança. Quando a criança chama a mãe por &lt;span class="il"&gt;mamãezinha&lt;/span&gt; ela já está "mal" intencionada. Ela não quer simplesmente invocar a mãe, mas chamá-la de forma que ela se sinta prestigiada, agradada por ela. E isso aconteceu  porque essa criança notou que as palavras estão dentro de um jogo de comunicação onde o mais importante não é expressar o que queremos, o que já é tarefa bastante complicada, mas convencer as pessoas a nos ajudar a conseguir tal coisa. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cá estou com meus botões a pensar que com um pouco de sensibilidade encontramos nos pequeninos gestos das crianças as  sutilezas que nos tornam tão complexos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4650294108990940236?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4650294108990940236/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4650294108990940236' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4650294108990940236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4650294108990940236'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/12/palavras-de-verdade.html' title='Palavras de Verdade'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5720907908900285520</id><published>2009-10-28T20:05:00.000-07:00</published><updated>2009-10-28T20:06:59.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Psicologia'/><title type='text'>Minisaia na Uniban</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=gWUyKgs0u-4"&gt;http://www.youtube.com/watch?v=gWUyKgs0u-4 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://virgula.uol.com.br/ver/noticia/news/2009/10/28/226552-aluna-da-uniban-ameacada-de-estupro-no-campus-por-usar-minissaia"&gt;http://virgula.uol.com.br/ver/noticia/news/2009/10/28/226552-aluna-da-uniban-ameacada-de-estupro-no-campus-por-usar-minissaia&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Para mim, a menina da minissaia é uma heroína, ao exercer a liberdade de escolher suas vestes, e destoar de uma regra implícita, velada por sociedade cínica e&lt;br /&gt;hipócrita em que “estava” inserida.&lt;br /&gt;&lt;br /&gt;As razões que explicam a reação dos estudantes vão muito além das simplificações sobre a qualidade da escola. A natureza humana é perversa, e mesmo submersos a um mundo de controle e disciplinas, carregamentos essa perversidade intrínseca em alguma parte de nossa mente.&lt;br /&gt;&lt;br /&gt;Abaixo, trecho extraído da natureza do terrorismo:&lt;br /&gt;&lt;br /&gt;“O terrorismo é uma manifestação da psique. A raiz psicológica do terrorismo é um ódio quase-psicótico do ressentimento fanático que origina nas profundidades da psique arquétipa.&lt;br /&gt;&lt;br /&gt;Um exemplo literário clássico é de Melville,  Moby Dick. O Capitão Ahab, com seu ódio fanático da baleia branca, é um paradigma do terrorista moderno. Os terroristas articulados expressam-se geralmente na terminologia (arquétipa) religiosa. O inimigo é considerado como o princípio de mal objetivo [“puta” em nossa versão da Uniban] e o terrorista percebe-se como herói,  agente de justiça divina ou objetiva.&lt;br /&gt;&lt;br /&gt;Para tratar o terrorismo eficazmente nós devemos compreendê-lo. Estes indivíduos não são criminosos e não são loucos embora tenham algumas qualidades de ambos. Vamos chamá-los de fanáticos. Os fanáticos são possuídos pelo arquétipos dinâmicos transpessoais que derivam-se da coletividade inconsciente.“&lt;br /&gt;&lt;br /&gt;Para aqueles interessados em entender mais o assunto eu recomendo um estudo sério da psicologia de C.G. Jung.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5720907908900285520?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5720907908900285520/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5720907908900285520' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5720907908900285520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5720907908900285520'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/10/minisaia-na-uniban.html' title='Minisaia na Uniban'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-21299295928936870</id><published>2009-10-23T19:49:00.000-07:00</published><updated>2009-10-28T20:05:03.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><category scheme='http://www.blogger.com/atom/ns#' term='Economia'/><title type='text'>Bolsa Família - Além de Bom é Mágico ??? (2)</title><content type='html'>&lt;p&gt;Uma longa discussão foi travada por conta de um artigo "científico" sobre se o bolsa família gera renda (veja post anterior). Para quem quiser conferir, o artigo está no link:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ipc-undp.org/publications/mds/33P.pdf" rel="nofollow"&gt;http://www.ipc-undp.org/publications/mds/33P.pdf&lt;/a&gt;&lt;/p&gt;(Agradeço aqui Warrior e Delmar pelos esclarecimentos).&lt;br /&gt;&lt;br /&gt;O objetivo do presente post e fazer uma análise desse artigo do senhor Paulo Henrique Landim Junior e seu prof. Dr. Naercio Aquino Menezes Filho: &lt;p&gt;A idéia do trabalho desses autores é confrontar dois grupos: aqueles que mais se beneficiaram com o bolsa família, e o os demais que servirão como grupo de controle aos dados observados.&lt;/p&gt; &lt;p&gt;“Para aprofundar esta análise, destacamos os municípios onde mais de 50% da população é beneficiada pelo Programa Bolsa Família. Esses municípios foram comparados com outros, onde uma parcela menor da população é beneficiada. Para isso foram criados e analisados os dois grupos de municípios: aqueles em que mais de 50% da população é beneficiada pelo PBF (grupo 1) e aqueles em que menos de 50% da população é beneficiada pelo PBF (grupo 2).” (página 10)&lt;/p&gt; &lt;p&gt;Feito essa divisão, é analisado, para cada grupo, o aumento do PIB e o aumento do bolsa família e constatado que com uma margem de confiança de 62,38% (ver regressão econométrica nas páginas 16 e 17) que o aumento do PIB e o aumento do repasse per capita nos municípios mais beneficiados são correlacionados.&lt;/p&gt; &lt;p&gt;Agora vamos refletir nesses números: por que eles são óbvios? A resposta é porque quase 62% da população ativa desses municípios recebeu o bolsa-família (página 11).&lt;/p&gt; &lt;p&gt;Sejamos mais radiciais para entender a questão. Vamos imaginar um outro cenário…Antes do bolsa-família, esses 62% da população não recebiam nada. Então, a partir de um certo ano, o governo passou a repassar o BF a essa população. Será que haverá alguma corelação do repasse com o PIB desses municípois? É evidente que sim, a população que contriui com o PIB do município quase triplicou. &lt;/p&gt; &lt;p&gt;O BF destinado a esses 712 municípios mais beneficiados não vieram deles (apenas uma fração ínfima – o PIB total desses municípios é de R$33.350.080.000,00 (página 11)), mas dos outros 4789 municípios da união. Isso chama-se repasse, e é o propósito do programa (transferir renda dos mais pobres para os mais ricos). O PIB influenciado pelo BF cresceu nessa região porque diminuiu (o PIB influenciado pelo BF) em outro lugar. É como tirar a água de um balde e jogar em outro,  sugerir que como o primeiro balde está ficando seco, os baldes ficarão sem água.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Ainda, analisando o trabalho:&lt;br /&gt;“Estimou-se um aumento de 0,06% no PIB per capita para cada aumento de 1% no valor de repasse per capita.”&lt;/p&gt; &lt;p&gt;Vamos aceitar a margem de confiança de 62% e concordar que para os 472 municípios mais beneficiados com o BF, ocorreu um aumento de 0,06% no PIB per capita para cada aumento de 1% no valor de repasse per capita, e, o que o estudo não fala, que nos demais municípios, de onde saiu esse dinheiro, o BF impactou negativamente no PIB. Daí, temos que é inaceitável concluir o seguinte:&lt;/p&gt; &lt;p&gt;“(..). Com base nessas informações é possível obter o benefício estimado da expansão do Programa Bolsa Família no ano de 2006. Para isso basta multiplicar 0,06 por 30,34. O valor obtido, 1,82%, é o impacto estimado do aumento de 30,34% no repasse per capita sobre o PIB dos municípios [TODOS]. Em 2006 o PIB brasileiro foi R$ 2.369.797.000.000 e, portanto um aumento de 1,82% neste significa um acréscimo de R$ 43.139.784.588,00.”&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-21299295928936870?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/21299295928936870/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=21299295928936870' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/21299295928936870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/21299295928936870'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/10/bolsa-familia-alem-de-bom-e-magico.html' title='Bolsa Família - Além de Bom é Mágico ??? (2)'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2279254588596035942</id><published>2009-10-16T20:54:00.000-07:00</published><updated>2009-10-23T19:49:30.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><title type='text'>Bolsa Família - Além de Bom  é Mágico ???</title><content type='html'>Saiu no Estado de São Paulo os resultados de um estudo  sobre o impacto da ampliação do Bolsa Esmola na Economia. Basicamente é o seguinte: com os 1,6 bilhão de Reais  adicionais investidos no programa (de 2005 a 2006.), o governo impulsionou o PIB em 0,6%  (43,1 bilhões de reais).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://digital.estadao.com.br/download/pdf/2009/10/16/A9.pdf"&gt;http://digital.estadao.com.br/download/pdf/2009/10/16/A9.pdf&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O significado disso é muito óbvio: de acordo com o estudo o estado não deveria perder seu tempo a não ser fazer algo que multiplica por 25 o dinheiro investido! O que não fica claro é como isso é possível. A explicação apresentada no jornal é o chamado multiplicador keneysiano. As pessoas inclusas no projeto fazem girar as engrenagens econômicas. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bom, é díficil acreditar que demanda simplesmente gere renda... Existe um interessante post do Guilherme Stein &lt;a href="http://rabiscoseconomicos.blogspot.com/2007/09/misria-do-multiplicador-keynesiano-lei.html"&gt;"A Miséria do Multiplicador Keynesiano: A Lei de Say corretamente entendida"&lt;/a&gt;, sobre esse problema. Talvez o programa tenha afetado a economia local (regiões com mais bolsas famílias distribuídas), e o jornal "estrategicamente" omitiu esse fato.&lt;br /&gt;&lt;br /&gt;(Será? Bom houve uma longa discussão sobre o assunto no &lt;a href="http://colunistas.ig.com.br/jpkupfer/2009/10/16/impactos-economicos-do-bolsa-familia/#comments"&gt;blog do JPK&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;É até vazio dizer mais alguma coisa sem ter acesso ao trabalho (tive acesso e publicarei os resultado).  Por outro lado, as pessoas que criticam o projeto (sem pesar seus benefícios) parecem que estão anos luz de conhecer os fatos; Simplesmente não dá para discutir se o projeto é ou não bom.  Isso é ponto pacífico. Algumas discussões cabíveis: por que publicar que o bolsa família aumenta o PIB? Como melhorar o projeto?&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-2279254588596035942?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2279254588596035942/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2279254588596035942' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2279254588596035942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2279254588596035942'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/10/bolsa-esmola-ii.html' title='Bolsa Família - Além de Bom  é Mágico ???'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-7580949560126734509</id><published>2009-09-24T10:27:00.000-07:00</published><updated>2009-10-14T05:43:18.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><title type='text'>Bolsa Esmola - Melhor programa ever</title><content type='html'>Tomo esse post como uma nota mental: "o bolsa esmola é o melhor programa ever". Comecemos pelos básico... O governo é uma máquina pesada, pesadíssima. O imposto brasileiro incomoda, drena 40% da renda. Isso deveria tornar o país numa social democracia: duas pessoas trabalham para sustentar uma terceira. Mas, por "algum motivo" a renda não é distribuida.&lt;br /&gt;&lt;br /&gt;Uma pessoa do grupo dos 1% mais ricos &lt;span id="brtpTexto"&gt;"pode gastar em três dias o equivalente ao que um brasileiro do grupo dos 10% mais pobres levaria um ano para gastar".  Ou ainda, a riqueza dos 1% mais ricos corresponde a renda dos 45% mais pobres.  Uau... Comparemos isso com outros países do mundo, e encontramos 11 países em situação pior (dos 212 países analisados pela ONU): Namíbia, Lesoto, Serra Leoa, República Centro-Africana, Botsuana, Bolívia, Haiti, Colômbia, Paraguai, África do Sul. Parece ruim, não é!? Bom, é pior.&lt;br /&gt;A parcela de 1% mais rico da população é aquela que tem renda per capita igual ou superior a R$4500,00.&lt;br /&gt;&lt;br /&gt;Então voltemos ao problema do governo.. O super estado com um monte de funcionários, escolas, universidades, etc... consumindo recursos e mais recursos, não consegue fazer o óbvio: tirar esses milhões de brasileiros da miséria (uma distribuição equalitária de 33% da renda seria suficiente para isso). Mas o que? Que absurdo! Sair por ai distribuindo o meu dinheiro suado!!! Deixa para lá... É mais justo o governo saquear 40% da renda para não fazer nada, né!?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-7580949560126734509?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/7580949560126734509/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=7580949560126734509' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7580949560126734509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7580949560126734509'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2009/09/bolsa-esmola-melhor-programa-ever.html' title='Bolsa Esmola - Melhor programa ever'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-1643315744636889234</id><published>2008-08-13T15:36:00.001-07:00</published><updated>2008-08-13T16:21:04.051-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Do Browser para Impressora - Considerações Finais</title><content type='html'>&lt;span&gt;&lt;span style="font-size:130%;"&gt;Problemas com XML-FO&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Solução Flying Saucer&lt;/span&gt;&lt;p&gt;&lt;br /&gt;Apesar de ser apreciável a iniciativa da Apache com o XML-FO, o Apache FOP não está suficiente maduro para ser utilizado em qualquer&lt;br /&gt;ocasião. Uma interessante alternativa é outro projeto que realiza uma transformação XSL mas diretamente para PDF. Esse é o projeto Flying&lt;br /&gt;Saucer, que contém entre outras coisas suporte para CSS3. Para o meu problema, O Flying Saucer tem mostrado como a melhor solução em termos de precisão além de contar com qualidades como flexibilidade e eficiência.&lt;br /&gt;&lt;/p&gt;Podemos verificar no projeto que ele faz uso do iText para gerar o arquivo PDF, mas tem a possibilidade de utilizar renderizadores para arquivos de saída diferentes.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Procedimento necessário&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Instalar o Flying Saucer e suas dependências no Classpath do seu projeto. No caso de um projeto WEB, adicionar as bibliotecas no&lt;br /&gt;diretório WEB-INF.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Utilizar o JAPX (The Java API for XML Processing ) para converter um arquivo XML num documento DOM (org.w3c.dom.Document).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();&lt;br /&gt;InputSource inputSource = new InputSource(new InputStreamReader(arrayInputStream, "ISO-8859-1"));&lt;br /&gt;builder.setEntityResolver(new CatalogResolver());&lt;br /&gt;Document doc = builder.parse(inputSource);&lt;br /&gt;&lt;/pre&gt; &lt;/li&gt; &lt;li&gt;Passar o documento para o Flying Saucer:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ByteArrayOutputStream bos = new ByteArrayOutputStream();&lt;br /&gt;ITextRenderer renderer = new ITextRenderer();&lt;br /&gt;renderer.setDocument(doc, rootPath);&lt;br /&gt;renderer.layout();&lt;br /&gt;renderer.createPDF(bos);&lt;br /&gt;&lt;/pre&gt; &lt;/li&gt;&lt;/ol&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;PROBLEMAS COM ANÁLISE SINTÁTICA&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Solução XML Catalog&lt;/span&gt;&lt;p&gt; Cabe aqui uma observação sobre o uso do Docbuilder – o analisador sintático (parser) de XML da especificação JAPX. O comportamento padrão do DocumentBuilder é processar o arquivo de origem com base nos recursos descritos nele mesmo, incluindo seus descritores como o DTD ou&lt;br /&gt;XSD. O problema que a declaração do tipo do documento (Document Type Declaration or Doctype) geralmente aponta para a URL do publicador. Por exemplo :&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&lt;br /&gt;&lt;/pre&gt;E especificações grandes como o Xhtml são particionados em vários fragmentos dtd que apontam para outros resultando numa míriade de documentos virtualmente remotos.&lt;br /&gt;&lt;br /&gt;Para que o Docbuilder faça a análise sintática, é necessário que o processo tenha acesso a essas localizações. Num servidor de aplicação, acessos remotos poderiam ser impedido por questões de segurança. Nesse caso é preciso ter uma cópia de cada recurso localmente e utilizar um proxy que converta as localizações virtualmente remotas para os arquivos locais.&lt;br /&gt;&lt;p&gt; Na verdade, seria possível abrir arquivo por arquivo e procurar as referências remotas e trocá-las por referências locais, mas isso poderia dar um trabalho demasiado grande e sujeito a erros.&lt;br /&gt;&lt;/p&gt;&lt;span&gt;XML Catalog&lt;/span&gt;O propósito do XML Catalog da Apache Foundation (explicado em detalhes&lt;a href="http://evc-cit.info/dom4j/dom4j_groovy.html"&gt; nesse artigo&lt;/a&gt;) é servir de proxy para o analisador sintático encontrar os recursos descritos nos documentos com localizações universais. A solução é bem simples. Uma objeto (Factory) cria o proxy com base num arquivo properties localizado no mesmo nível que o classloader. Isso é feito de forma transparente, ao instanciar um objeto da classe CatalogResolver.&lt;br /&gt;&lt;p&gt;A solução passo a passo seria a seguinte:&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Procure o projeto catalog da apache. Coloque o resolver.jar no seu classpath... (WEB-INF,etc)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Baixe o sgml-lib da w3c. Adicione o contéudo do sgml-lib no diretório de códigos-fonte da sua aplicação.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Adicione também o arquivo Catalog.properties.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;relative-catalogs=no&lt;br /&gt;catalogs=sgml-lib/xml.soc&lt;br /&gt;verbosity=0&lt;br /&gt;prefer=system&lt;br /&gt;allow-oasis-xml-catalog-pi=no&lt;br /&gt;static-catalog=yes&lt;br /&gt;&lt;/pre&gt; &lt;/li&gt; &lt;li&gt;E adiciona o suporte ao catálogo no Parser.&lt;br /&gt;&lt;pre&gt;builder.setEntityResolver(new CatalogResolver());&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;Problemas com Mime Type&lt;/span&gt;&lt;span&gt;&lt;br /&gt;Solução: Especificar o Mime Type&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ter um arquivo PDF em memória, não garante sua renderização correta no cliente. Essa questão é resolvida com atributos MIME. Aespecificação dos Servlet descreve como os tipos MIME podem ser especificados na interface de resposta (Response) do Servlet.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; response.setContentType("application/pdf");&lt;br /&gt;response.setHeader("Content-disposition", "attachment; filename=NotaFiscal.pdf");&lt;br /&gt;response.setContentLength(bos.size());&lt;br /&gt;OutputStream os = response.getOutputStream();&lt;br /&gt;bos.writeTo(os);&lt;br /&gt;os.flush();&lt;br /&gt;os.close();&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;Problemas com o processo manual de imprissão&lt;/span&gt;&lt;span&gt;&lt;br /&gt;Solução: Incluir Javascript no PDF&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Em casos extremos, fornecer um arquivo PDF para o usuário, com o Adobe Acrobat Reader instalado em sua máquina não é o suficiente paraque ele se sinta a vontade para imprimir o documento corretamente. Para evitar maiores transtornos com a parte de treinamente, é possível automatizar o processo de impressão.&lt;br /&gt;&lt;br /&gt;Para isso, felizmente, o arquivo PDF permite a inclusão de scripts que, por sua vez, permitem a interação entre os recurso da máquinacliente e o documento a ser exibido/imprimido. É uma excelente oportunidade para demonstrar como a API do iText pode incluir Script em um PDF ao mesmo tempo que automatizo a ação de imprimir na máquina cliente. Para realizar tal tarefa é necessário duplicar o documento a ser imprimido.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; PdfReader reader = new PdfReader(bytes);&lt;br /&gt;ByteArrayOutputStream bos = new ByteArrayOutputStream();&lt;br /&gt;com.lowagie.text.Document document = new com.lowagie.text.Document(new Rectangle(585, 936), 0 ,0 ,0 ,0);&lt;br /&gt;PdfWriter writer = PdfWriter.getInstance(document, bos);&lt;br /&gt;document.open();&lt;br /&gt;PdfContentByte cb = writer.getDirectContent();&lt;br /&gt;document.newPage();&lt;br /&gt;PdfImportedPage page = writer.getImportedPage(reader, 1);&lt;br /&gt;cb.addTemplate(page, 0, 0);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Agora, basta incluir o fragmento Javascript via PDFWriter:&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;writer.addJavaScript("this.print({bUI: false,bSilent: false,bShrinkToFit: true});" + "\r\n"+ "this.closeDoc();");&lt;br /&gt;document.close();&lt;br /&gt;return bos;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Ufa! Isso é tudo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-1643315744636889234?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/1643315744636889234/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=1643315744636889234' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/1643315744636889234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/1643315744636889234'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/08/do-browser-para-impressora-consideraes.html' title='Do Browser para Impressora - Considerações Finais'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2861184857326063085</id><published>2008-08-13T15:29:00.000-07:00</published><updated>2008-08-13T15:32:06.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Do Browser para Impressora - Parte 3</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;Teoricamente, recuperar a saída de um Servlet (em geral um documento em texto como o HTML, mas pode ser qualquer arquivo incluso na resposta do servidor)  mesmo que seja um JSP,  deveria ser fácil. O JSP é convertido em uma classe Java que segue uma interface da especificação do Java Servlet com todas os métodos necessários para recuperar sua saída. Infelizmente, as classes geradas encontram-se em um contexto que o Classloader que executa os servlets não  tem acesso. Então, para acessar as saídas dos JSPs é necessário uma abordagem mais indiretas. Na arquitetura J2EE, temos os seguintes recursos à nossa disposição:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Filtros: antes do  envio da resposta ao cliente a cadeia de filtros intercepta a  mensagem e pode enviar uma nova mensagem baseado na mensagem  interceptada;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;RequestDispatcher.include:  esse (novo) método  permite um servlet programaticamente  adicionar o conteúdo de outro, o que é semelhante a  tag jsp:include;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;new  URL(urlLocation).openStream: método que abre uma conexão  com a localização urlLocation e retorna um stream de  dados para leitura;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;A solução utilizando url.openstream é simples, mas exige uma nova conexão para o servidor de aplicação proveniente dele mesmo. E é preciso tomar o cuidado utilizar a mesma sessão do usuário. Para isso, basta concatenar a url solicitada como jsessionId.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:130%;"&gt;Adapter Pattern&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;"&gt;O uso de filtros ou do include method exige o uso de classes que sigam assinatura &lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;HttpServletResponse e do ServletOutputStream e que ao mesmo tempo, guarde as informações das chamadas em algum tipo de repositório. Essa é uma interessante aplicação do Adapter Pattern. O Adapter Pattern pode ser sumarizado da seguinte maneira. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Problema: (Múltipla herança) É desejado o comportamento de um objeto que infelizmente não segue uma assinatura específica. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Solução: Criar uma classe que implemente a interface e direcione as chamadas de forma apropriada ao objeto cujo comportamento é desejado.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Sendo o repositório escolhido para informações, um vetor de bytes. Escolhemos o ByteArrayOutputStream, que pode ser visto como um OutputStream e cujo resultado é guardado no vetor de bytes. Isso nos permite criar um objeto adaptado a interface ServletOutputStream e cuja implementação fica a cargo do ByteArrayOutputStream. Facilita também, utlizar  o PrintWriter que já realiza as operações de Writer do ServletOutputStream. Esse PrintWriter deverá escrever diretamente no objeto  ByteArrayOutputStream. Isso é feito ao passarmos esse objeto no construtor do PrintWriter. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Uma vez que temos essa classe, implementar a classe ServletResponse é muito simples:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletResponse &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;extends&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; HttpServletResponseWrapper{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteArrayOutputStream &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;contentBuffer&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; PrintWriter &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;writer&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletOutputStream &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;servletOutputStream&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;          &lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletResponse(HttpServletResponse response) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(response);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; PrintWriter getWriter() {     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;writer&lt;/span&gt;&lt;span style="color:#000000;"&gt; == &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000c0;"&gt;contentBuffer&lt;/span&gt;&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteArrayOutputStream();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000c0;"&gt;writer&lt;/span&gt;&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; PrintWriter(&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;contentBuffer&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000c0;"&gt;servletOutputStream&lt;/span&gt;&lt;span style="color:#000000;"&gt; = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletOutputStream(&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;writer&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;contentBuffer&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;         &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;         &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;writer&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;     &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ServletOutputStream getOutputStream() &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; IOException {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; getWriter();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;servletOutputStream&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;    &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;byte&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] getData() {  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;  getWriter().flush();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000c0;"&gt;contentBuffer&lt;/span&gt;&lt;span style="color:#000000;"&gt;.toByteArray();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;E então podemos utilizar o include method:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletResponse includeJsp(ActionMapping mapping, ActionForm form, HttpServletRequest request,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;   HttpServletResponse response) &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ServletException, IOException {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  request.getSession().setAttribute(&lt;/span&gt;&lt;span style="color:#c10000;"&gt;"geraNota"&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Boolean.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  FakeServletResponse fakeServletResponse = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FakeServletResponse(response);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  BuscaNotaAction buscaNotaAction = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; BuscaNotaAction();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;  buscaNotaAction.execute(mapping, form, request, fakeServletResponse);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  RequestDispatcher requestDispatcher = request.getRequestDispatcher(&lt;/span&gt;&lt;span style="color:#c10000;"&gt;"/jsp/operacoes/notaFiscal/imprimeNota.jsp"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;  requestDispatcher.include(request, fakeServletResponse);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; fakeServletResponse;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-size:85%;"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-2861184857326063085?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2861184857326063085/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2861184857326063085' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2861184857326063085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2861184857326063085'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/08/do-browser-para-impressora-parte-3.html' title='Do Browser para Impressora - Parte 3'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5227527345558805696</id><published>2008-07-23T11:47:00.000-07:00</published><updated>2008-07-23T15:26:51.261-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Do Browser para Impressora - Parte 2</title><content type='html'>Ao invés de utilizar o browser para enviar um documento HTML para a impressora, podemos fazer uso de técnicas mais indiretas. Para isso, devemos utilizar um padrão que facilite manipulação de seu conteúdo.  O padrão apropriado é o XHTML. Antes de explicar como o XHTML pode ser usado para transformação de um documentos em comandos de impressão, consideremos outros benefícios de se utilizar o XHTML no lugar do HTML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;XHTML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma das interessantes convergências tecnológicas é o padrão XML. O XML é uma especificação de texto com marcações derivado do SGML, que utiliza uma gramática mais restrita.&lt;br /&gt;&lt;br /&gt;Por uma especificação de texto com marcações eu quero dizer que o XML possui marcadores que definem uma certa propriedade do texto: por exemplo que um certo fragmento é um paragrafo (&lt;p&gt;Isso é um parágrafo&lt;/p&gt;), ou  o nome de diretor de cinema(&lt;diretor&gt;Tim Burton&lt;/diretor&gt;, etc.  Por uma gramática mais restrita eu quero dizer que a definição do que pode e o que não pode no XML é mais simples. Para maiores informações veja: diferenças entre o HTML e  o XML.&lt;br /&gt;&lt;br /&gt;Essas características tornam mais fácil a construção de analisadores sintáticos. Por esse motivo, o XML é utilizado como base para uma gama de atividades relacionadas com troca de informações por arquivo texto. O XHTML foi criado para agregar, ao HTML, esses valores.&lt;br /&gt;&lt;br /&gt;O XHTML é basicamente o padrão HTML como algumas adaptações para contemplar as restrições do XML. Nada muito complicado. E esse rigor trouxe algumas vantagens adicionais:&lt;br /&gt;Adaptabilidade – o conteúdo é facilmente convertido para outros formatos;&lt;br /&gt;Previsibilidade – enquanto existe um padrão definido para renderizar um documento HTML  o mesmo não acontece para um documento mal-formatado. Um navegador ao renderizar um documento desse tipo entra no modo chamado quirks. Não existe um padrão para o modo quirks de tal sorte que o  resultado pode variar em cada navegador. A fácil verificação que um documento é aderente a especificação do XHTML torna supérfluo a renderização por modo quirks. Também, os criadores de parser são guiados por uma especificação mais simples o que os leva a cometer menos erros;&lt;br /&gt;Legibilidade  – o documento é mais legível para máquinas e seres humanos devido a simplicidade da gramática;&lt;br /&gt;&lt;br /&gt;Vejamos esse primeiro quesito. O XHTML permite o uso de uma família de linguagens de transformação chamado XSL (Extensible Stylesheet Language). O XSL é a definição da W3C que trata transformações no XML. Essa tecnologia define como um XML pode ser transformado para  um XHTML, um arquivo texto qualquer ou num XSL-FO. É possível inclusive delegar aos navegadores essa  tarefa de transformação. Muitos navegadores modernos, inclusive o Internet Explorer 5.0 suportam o uso do XSL para realizar transformações nos documentos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;XML-FO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;XML-FO é um padrão de descrição para impressão. O XML-FO não possui todos os detalhes da impressão, mas é suficientemente rico para conter grande parte das descrições utilizadas na impressão. Note que o XML-FO é também um documento que segue a especificação XML. Basicamente, seu uso consiste de uma transformação subseqüente em que o documento é finalmente convertido para um de impressão: tipicamente o PDF.&lt;br /&gt;&lt;br /&gt;No site da Antenna House é possível encontrar scripts de transformação do XHTML para fo ( xhtml2fo.xsl). Agora, com o uso de bibliotecas de manipulação do XML como o Xalan, é possível com um comando converter o XHTML para XSL-FO.&lt;br /&gt;&lt;br /&gt;java -classpath $CLASSPATH org.apache.xalan.xslt.Process -IN  -XSL xhtml2fo.xsl -OUT  -tt&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Docbook &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para exemplificar o mecanismo de transformação de um XML para PDF, vou utilizar um script Ant que utilizo para converter meus arquivos docbook para PDF. Para o XHTML o mecanismo é o mesmo, o que muda é o arquivo XSL responsável pela transformação.&lt;br /&gt;&lt;br /&gt;Docbook que é uma  linguagem própria para documentação cujo enfoque é a semântica. A filosofia básica por trás do Docbook é discriminar o valor semântico de cada parte de um texto. Por exemplo: para um computador o fragmento &lt;h2&gt;título&lt;/h2&gt; não significa necessariamente o começo de uma seção ou capítulo; No Docbook é possível especificar exatamente esse tipo de informação (começo ou fim de uma seção, capítulos, ênfase, etc)... mas o padrão não fala nada sobre a formatação. Fica a cargo de outros mecanismos cuidarem para que elementos sejam corretamente formatados.&lt;br /&gt;&lt;br /&gt;Um projeto para converter o docbook  poderia conter os  seguintes elementos:&lt;br /&gt;&lt;br /&gt;Ambiente de desenvolvimento com Java 1.4, Apache Ant e Apache Fop (já inclui o Xalan e o Xerces) instalados.&lt;br /&gt;Diretório src incluindo os fontes em docbook.&lt;br /&gt;Diretório output onde serão gerados os arquivos em pdf.&lt;br /&gt;&lt;br /&gt;Na raiz do projeto, poderia ser criado o script do Ant (build.xml) responsável por invocar as classes responsáveis pelo processamento. O Ant dispõe de mecanismos para invocar a máquina virtual do Java para executar um comando específico. Felizmente, nem mesmo isso é necessário, porque essas bibliotecas já dispõe de tags para que realizam a transformação do documentos:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;   &lt;br /&gt;&lt;xslt classpathref="xalan.classpath" style="" extension=".fo" basedir="${source.dir}" destdir="${fo.dir}"&gt;        xslt classpathref="xalan.classpath" style="${fo.stylesheet}" extension=".fo" basedir="${source.dir}" destdir="${fo.dir}"&lt;br /&gt;         include name="${target.name}.xml" /&lt;br /&gt;     /xslt&lt;br /&gt;&lt;br /&gt;     fop format="application/pdf" fofile="${fo.dir}/${target.name}.fo" outfile="${fo.dir}/${target.name}.pdf" /&lt;br /&gt;&lt;include name="${target.name}.xml"&gt;&lt;br /&gt;&lt;/include&gt;&lt;br /&gt;&lt;br /&gt;&lt;fop format="application/pdf" fofile="${fo.dir}/${target.name}.fo" outfile="${fo.dir}/${target.name}.pdf"&gt;&lt;/fop&gt;&lt;/xslt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5227527345558805696?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5227527345558805696/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5227527345558805696' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5227527345558805696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5227527345558805696'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/07/do-browser-para-impressora-parte-2.html' title='Do Browser para Impressora - Parte 2'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-3331674663717044267</id><published>2008-07-18T06:14:00.001-07:00</published><updated>2008-07-18T06:14:57.360-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filme'/><category scheme='http://www.blogger.com/atom/ns#' term='Resenha'/><title type='text'>Filme: Obrigado Por Fumar</title><content type='html'>&lt;p id="i_ua" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua0" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;b id="i_ua1"&gt;Obrigado Por Fumar &lt;i id="i_ua2"&gt;(Thank you for Smoking)&lt;/i&gt;&lt;/b&gt; - 2006&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua3" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua4" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Filme escrito e dirigido por Jason Reitman, produzido por David Sacks e baseado na novela de Christopher Buckley. Duração de 92 minutos.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua5" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua7" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua8" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;"Obrigado Por Fumar" é um aclamado filme, vencedor do globo de ouro 2006 e sucesso em bilheterias (com faturamento superior a 39 milhões de dólares). O filme conta a história de Nick Naylor (Aaron Eckhart), vice-presidente da empresa Academia do Estudo do Tabaco, um &lt;i id="i_ua9"&gt;lobby&lt;/i&gt; da indústria tabagista, e como ele usa suas habilidades de persuação para defender os interesses de seus superiores.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua10" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua12" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua13" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Direção muito interessante: ao contrário do que se pode esperar, o filme não mostra um quadro contaminado por fumaça em que o próprio telespectador tenha dificuldades em respirar. Aliás, o filme não mostra nehuma pessoa fumando. Também não faz uma crítica raivosa à indústria do cigarro. Seus argumentos são sutis, inteligentes e bem-humorados. Mas, a mensagem não passa despercebida pelo público, apenas não o agride. Por exemplo, logo no começo do filme Nick se apresenta como um representante de um dos maiores assassinos: a indústria tabagista, responsável por mais de 100 mil mortes nos EUA. Num dos encontros com o M.O. D. (do Inglês “Merchants of Death”, mercadores da morte, uma espécie de esquadrão das indústrias que mais matam: armamentista, tabagista e a de bebidas alcoólicas), Nick provoca seus colegas, lançando uma competição para determinar qual das indústrias teria matado mais. Dessa forma, o filme brinca com a sátira e o cinismo dos personagens caricaturais (cada um, como uma metonímia, representa a própria indústria à qual se quer criticar) sem cair no maniqueísmo, nem no melodrama.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua14" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua16" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua17" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;A história começa num &lt;i id="i_ua18"&gt;talkshow&lt;/i&gt; onde os convidados são Nick, representantes de associações anti-tabagistas e um garoto que adquiriu câncer depois de fumar. Diante de uma platéia hostil e de uma situação delicada, Nick reverte o jogo fazendo com que pareça que a indústria do Fumo apoia o garoto com câncer, ao passo que os anti-tabagistas o condenam:&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua19" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua21" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua22" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;“É do nosso maior interesse manter Robin vivo e fumando. As pessoas contra o fumo querem que Robin morra”.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua23" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua25" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua26" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Assim, logo na primeira cena, é possível ter uma noção de como os diálogos irão se desenvolver. O filme é uma seqüência de situações em que o personagem principal usa (e abusa) de seu poder de persuasão e argumentação para atingir os objetivos de quem representa. No decorrer da narrativa, a vida profissional desse insensível, porém extremamente perspicaz, lobista é despudoradamente retratada. No entanto, para não cair na armadilha do maniqueísmo, o filme também constrói a imagem de Nick como um sujeito simpático e pai carinhoso, que quer seu filho por perto e precisa conviver com a desaprovação da ex-esposa em relação à influência que seu trabalho e estilo de vida exercem sobre o garoto. &lt;/span&gt; &lt;/p&gt; &lt;p id="i_ua27" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua29" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua30" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;O maior opositor de Nick Naylor é o Senador Ortolan Finistirre (William H. Macy&lt;/span&gt;&lt;a id="i_ua31" href="http://en.wikipedia.org/wiki/William_H._Macy"&gt;&lt;span id="i_ua32" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;)&lt;/span&gt;&lt;/a&gt;&lt;span id="i_ua33" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;, um ambientalista de Vermont que quer introduzir na legislação uma lei solicitando a figura de caveira com ossos cruzados nas estampas dos pacotes de cigarro. Porém, em todos os embates entre os dois, Nick parece sair sempre vitorioso. Inclusive, o filme acaba logo após o derradeiro desses embates.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua34" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua36" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua37" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;No plano profissional, após a aparição no &lt;i id="i_ua38"&gt;talkshow&lt;/i&gt;, Nick consegue convencer seu chefe a empreender sua influência na indústria do entretenimento e colocar de volta cenas de estrelas fumando nos filmes. Tais idéias e iniciativas são bem rebecidas pelo misterioso bilionário Captain, czar da indústria do Tabaco, que incumbe à Nick a missão de, presentear com uma pasta abarrotada de dinheiro o famoso &lt;i id="i_ua39"&gt;cowboy&lt;/i&gt; dos comerciais da Malboro. O intuito do presente é corromper o vaqueiro para dissuadi-lo de prejudicar a indústria tabagista pelo fato de ter contraído câncer. Ao inferir que o caubói aceita o dinheiro, mais uma vez, o filme joga com a elasticidade da ética e dos valores morais de cada personagem.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua40" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua42" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua43" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Nas cenas que mostram o envolvimento de Nick com a jornalista, Heather Holloway (Katie Holmes), as distorções morais ficam bem claras, principalmente quando ele a diz que sua motivação é pagar a hipoteca. Mais à frente, a jornalista repete a mesma desculpa depois de seduzi-lo para escrever uma matéria bombástica, que temporariamente destrói a carreira de Nick. &lt;/span&gt; &lt;/p&gt; &lt;p id="i_ua44" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua46" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua47" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Assim, mais importe que questionar os valores da indústria tabagista é a forma como o filme disserta sobre a poder da sedução e, principalmente, da persuasão e de como eles flexibilizam os princípios éticos e valores morais. Os argumentos dessa dissertação estão pulverizados por todo filme e são mais visíveis nos trechos em que o personagem principal conversa com seu filho Joey explicando e defendendo seu trabalho. Por exemplo, no dia da carreira, o senhor Naylor explica para a classe de Joey: “Assim como as estrelas de cinema, minha profissão é conversar”. Naylor, por fim, coloca em dúvida a autoridade dos adultos para falar sobre determinados assuntos: “Quem disse isso? (...) Minha opinião é que vocês devam pensar por si próprios.” &lt;/span&gt; &lt;/p&gt; &lt;p id="i_ua48" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua50" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua51" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Em outra cena, o filho pede ajuda ao pai para responder uma lição de casa: “Por que o sistema americano é o melhor sistema do mundo?”. “Foi sua professora que formulou essa questão?” _ questiona. Naylor então explica que essa questão é vazia. O menino poderia responder o que ele quisesse porque não se pode afirmar que o sistema americano é o melhor do mundo. &lt;/span&gt; &lt;/p&gt; &lt;p id="i_ua52" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua54" style="margin-bottom: 0in;"&gt;&lt;span id="i_ua55" style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Nessa linha, o que ocorre também numa cena, em que, na missão de convencer Hollywood a colocar cenas de pessoas fumando, o lobista leva seu filho consigo. Após as reuniões de negócio, mais uma vez os dois personagens dialogam e o filho questiona sobre a questão moral do trabalho do pai: “e se você não estiver certo?”. Nick alega que defender a indústria tabagista é como defender um sabor de soverte.”Não existe quem está certo”. A distância entre os dois pontos dessa analogia não é ignorada pelo garoto que insiste com o pai que não falava de sabores de sorvete. Naylor conclui que cabe às pessoas a decisão e é importante que usufruam da liberdade de escolha.&lt;/span&gt;&lt;/p&gt; &lt;p id="i_ua56" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;p id="i_ua58" style="margin-bottom: 0in;"&gt;&lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-3331674663717044267?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/3331674663717044267/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=3331674663717044267' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3331674663717044267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3331674663717044267'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/07/filme-obrigado-por-fumar.html' title='Filme: Obrigado Por Fumar'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-4199527211506018168</id><published>2008-07-17T18:59:00.000-07:00</published><updated>2008-07-18T06:47:28.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologias'/><category scheme='http://www.blogger.com/atom/ns#' term='Economia'/><title type='text'>Where does AMD go to?</title><content type='html'>7 trimestres consecutivos no vermelho!!! E o que podemos esperar da AMD? Ok!  Você pode não gostar da AMD, mas acentuar o monopólio da Intel não seria o futuro dourado para o mercado de computadores.&lt;br /&gt;&lt;br /&gt;Acho que o pior já passou. As maiores besteiras da AMD já foram feitas. Ex:  atraso de uma CPU decente por 14 meses (se é que podemos chamar o "fraco" Phenom 9950 como decente). Finalmente a AMD trouxe novidades que despertam interesse além da mera apelação de preços baixos. São eles o Chipset 780g, o Radeon HD4800 e o  Ultra Puma (plataforma para notebook) .&lt;br /&gt;&lt;br /&gt;Primeiro, o elogiado chipset 780g é o primeiro processador gráfico integrado que pode substituir uma placa-gráfica de "verdade". E ainda pode trabalhar em conjunto com as placas da série HD3400 tornando (o conjuto) comparáveis as HD3800. Sem contar que consome menos energia e são beeeem mais baratos.&lt;br /&gt;&lt;br /&gt;Depois, a série HD4800 que desbanca a poderosa Nvidia gtx 260 e gtx 280 em dois aspectos. O primeiro aspecto é o desempenho: temos o HD4870 superior ao gtx 260 e o HD4870 x2 superior ao gtx 280. Depois o preço... a série estava bem mais barata que o salgados preços da concorrência. Tanto que a Ndivia já baixo em mais de 30% o preço de suas placas e elas continuam, digamos, 30% mais caras. Wow. Quem diria isso depois do fiasco da série 3800.&lt;br /&gt;&lt;br /&gt;Finalmente o Ultra Puma... Vamos à história:&lt;br /&gt;Eu nunca me baseei no nome de um fabricante para comprar um computador. Acho que a Intel abusa do fato de ser a líder do setor e cobra bem mais caro por seus produtos. Mas, ultimamente a Intel tem praticado preços compatíveis: suas melhores CPUs  podem ser o dobro do preço por dispor do dobro do desempenho. Justíssimo! Embora as CPU de desempenho medianos e inferiores (low e mid-market) são mais caras que a concorrente por dispor do logo azul, e ainda, a Intel aproveitar para ganhar com os demais componentes da arquitetura (como a placa-mãe). Placas-mãe da arquitetura AMD são geralmente 50% mais baratas do que as "equivalentes" Intel.&lt;br /&gt;&lt;br /&gt;Exatamente por esses motivos que os computadores daqui de casa são AMD. Como eu nunca comprei os computadores high market, não vi sentido em pagar mais para usufruir do mesmo desempenho. Bom... todos os computadores, com uma exceção: o notebook. Até  pouco tempo atrás era impossível encontrar um notebook a preço e desempenhos competitivos  da marca AMD. Meu pobre notebook é um Kennex dual Core T2130 , 2Gb de RAM, 120Gb HDD Sata, (etc blá blá) com um detalhe interessante... uma placa de vídeo HD2300. Tudo isso por módicos 2000 reais.&lt;br /&gt;&lt;br /&gt;Mas uma pena... após o lançamento do Ultra Puma é possível encontrar um notebook HP com Ultra Turion 2.4GHz, 2Gb de RAM, 160Gb HDD Sata (etc blá blá) com o processador onboard HD3200 (graças ao mobile 780g) por módicos 700 dólares. Aproximadamente o preço do Kennex graças aos custos de importação daqui do Brasil com o dobro do desempenho (e da durabilidade da bateria).&lt;br /&gt;&lt;br /&gt;Opa! A AMD volta a vida. Ou quase... Infelizmente, para a AMD, as críticas não pontuam com precisão os atributos de suas plataformas. Não é incomum você encontrar, na comparação de Phenom com os Core 2 Duo, placas de vídeo High Market. Isso é injusto porque tira a vantagem da plataforma AMD de já vir com uma placa de vídeo (chipset 780g) que entre outras coisas realiza decodificações multimídia.&lt;br /&gt;&lt;br /&gt;Enquanto que a ausência de placas de vídeos não fazem sentido para computadores acima de 800 dólares, esse não é o mercado mais comum para maior parte dos países em desenvolvimento, como o Brasil. Pagamos cerca de três vezes em dólares PPP o preço de um notebook.  Então precisamos considerar faixas de valores mais estreitos. Isso me leva a seguinte análise:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;style&gt;   &lt;!--   .openoffice td { font-family:"Nimbus Sans L"; font-size:x-small; text-align: center }    --&gt;  &lt;/style&gt;    &lt;table class="openoffice" border="1" cellspacing="0" cols="7" rules="none" frame="void"&gt;  &lt;colgroup&gt;&lt;col width="177"&gt;&lt;col width="146"&gt;&lt;col width="138"&gt;&lt;col width="178"&gt;&lt;col width="141"&gt;&lt;col width="86"&gt;&lt;col width="86"&gt;&lt;/colgroup&gt;  &lt;tbody&gt;   &lt;tr&gt;    &lt;td align="left" width="177" height="19"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left" width="146"&gt;Core 2 Duo Q6600  250USD&lt;/td&gt;    &lt;td align="left" width="138"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left" width="178"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left" width="141"&gt;Phenom 9950  250USD&lt;/td&gt;    &lt;td align="left" width="86"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left" width="86"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;&lt;span style="font-family:Nimbus Roman No9 L;"&gt;Categorias/Quesitos&lt;/span&gt;&lt;/td&gt;    &lt;td align="left"&gt;Custo ao Consumidor&lt;/td&gt;    &lt;td align="left"&gt;3DMark06&lt;/td&gt;    &lt;td align="left"&gt;Explicação&lt;/td&gt;    &lt;td align="left"&gt;Custo ao Consumidor&lt;/td&gt;    &lt;td align="left"&gt;3DMark06&lt;/td&gt;    &lt;td align="left"&gt;Explicação&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;Own IGP Onboard &lt;/td&gt;    &lt;td sdval="100" sdnum="1046;" align="right"&gt;100&lt;/td&gt;    &lt;td sdval="300" sdnum="1046;" align="right"&gt;300&lt;/td&gt;    &lt;td align="left"&gt;Intel 775pin&lt;/td&gt;    &lt;td sdval="80" sdnum="1046;" align="right"&gt;80&lt;/td&gt;    &lt;td sdval="3000" sdnum="1046;" align="right"&gt;3000&lt;/td&gt;    &lt;td align="left"&gt;780g&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;Better IGP Onboard&lt;/td&gt;    &lt;td sdval="70" sdnum="1046;" align="right"&gt;70&lt;/td&gt;    &lt;td sdval="1500" sdnum="1046;" align="right"&gt;1500&lt;/td&gt;    &lt;td align="left"&gt;Nvidia 7050&lt;/td&gt;    &lt;td sdval="80" sdnum="1046;" align="right"&gt;80&lt;/td&gt;    &lt;td sdval="3000" sdnum="1046;" align="right"&gt;3000&lt;/td&gt;    &lt;td align="left"&gt;780g&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;Low Offboard + mainboard&lt;/td&gt;    &lt;td sdval="120" sdnum="1046;" align="right"&gt;120&lt;/td&gt;    &lt;td sdval="2000" sdnum="1046;" align="right"&gt;2000&lt;/td&gt;    &lt;td align="left"&gt;HD3400&lt;/td&gt;    &lt;td sdval="130" sdnum="1046;" align="right"&gt;130&lt;/td&gt;    &lt;td sdval="4500" sdnum="1046;" align="right"&gt;4500&lt;/td&gt;    &lt;td align="left"&gt;780g + Hybrid CrossFire&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;Mid Offboard + mainboard&lt;/td&gt;    &lt;td sdval="220" sdnum="1046;" align="right"&gt;220&lt;/td&gt;    &lt;td sdval="4000" sdnum="1046;" align="right"&gt;4000&lt;/td&gt;    &lt;td align="left"&gt;HD3850&lt;/td&gt;    &lt;td sdval="130" sdnum="1046;" align="right"&gt;130&lt;/td&gt;    &lt;td sdval="4500" sdnum="1046;" align="right"&gt;4500&lt;/td&gt;    &lt;td align="left"&gt;780g + Hybrid CrossFire&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;HighMid Offboard +mainboard&lt;/td&gt;    &lt;td sdval="260" sdnum="1046;" align="right"&gt;260&lt;/td&gt;    &lt;td sdval="6000" sdnum="1046;" align="right"&gt;6000&lt;/td&gt;    &lt;td align="left"&gt;HD4850&lt;/td&gt;    &lt;td sdval="260" sdnum="1046;" align="right"&gt;260&lt;/td&gt;    &lt;td sdval="6000" sdnum="1046;" align="right"&gt;6000&lt;/td&gt;    &lt;td align="left"&gt;HD4850 &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;High End OffBoard  + Mainboard (CrossFireX)&lt;/td&gt;    &lt;td sdval="380" sdnum="1046;" align="right"&gt;380&lt;/td&gt;    &lt;td sdval="8000" sdnum="1046;" align="right"&gt;8000&lt;/td&gt;    &lt;td align="left"&gt;HD4870&lt;/td&gt;    &lt;td sdval="380" sdnum="1046;" align="right"&gt;380&lt;/td&gt;    &lt;td sdval="8000" sdnum="1046;" align="right"&gt;8000&lt;/td&gt;    &lt;td align="left"&gt;HD4870&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;Adicionais&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="36"&gt;+High End Mainboard&lt;/td&gt;    &lt;td sdval="100" sdnum="1046;" align="right"&gt;100&lt;/td&gt;    &lt;td sdval="9000" sdnum="1046;" align="right"&gt;9000&lt;/td&gt;    &lt;td align="left"&gt;HD4870 + mainboard DDR3  + E6600&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" height="19"&gt;+High End CPU&lt;/td&gt;    &lt;td sdval="300" sdnum="1046;" align="right"&gt;300&lt;/td&gt;    &lt;td sdval="10000" sdnum="1046;" align="right"&gt;10000&lt;/td&gt;    &lt;td align="left"&gt;HD4870 + mainboard DDR3 + Q9550&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;    &lt;td align="left"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Essa tabela resume a comparação das plataformas Intel e AMD considerando preços médios (google products) e benchmarks disponíveis na internet (Tom Hardware, etc). Podemos ver que a AMD não pode oferecer CPUs competitivas  para os verdadeiros entusiastas. Mas enquanto o conjunto CPU + GPU + Placa-Mãe não ultrapassa 400 dólares, a AMD mostra uma vantagem consistente.&lt;br /&gt;&lt;br /&gt;Fica os segmentos de mercados designados para cada companhia, particionado pelo poder aquisitivo. Isso não é nenhuma virada da empresa do logo verde, mas já é um alívio para o mercado a beira do monopólio.&lt;br /&gt;&lt;br /&gt;E para quem quiser saber do HP de 700 dólares... aqui &lt;a href="http://www.shopping.hp.com/webapp/shopping/computer_can_series.do?storeName=computer_store&amp;amp;category=notebooks&amp;amp;a1=Category&amp;amp;v1=Versatile+performance&amp;amp;series_name=dv5z_series"&gt;está!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-4199527211506018168?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/4199527211506018168/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=4199527211506018168' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4199527211506018168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/4199527211506018168'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/07/where-does-amd-go-to.html' title='Where does AMD go to?'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-2309502306966261050</id><published>2008-07-05T13:30:00.000-07:00</published><updated>2008-07-18T06:52:37.478-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ciências da Computação'/><category scheme='http://www.blogger.com/atom/ns#' term='Free Software'/><title type='text'>Analisando o Debian</title><content type='html'>Já faz algum tempo que eu estudo as comunidades de software livre. Para mim, sempre foi um desafio conseguir analisá-las de uma forma sistemática e consistente. Em 2006, eu pensei em materializar meu estudo. Tive várias idéias, mas pouca coisa foi implementado. Uma dessas idéias era avaliar o "poder" de uma comunidade pela dependência que outros projetos teriam do projeto dessa comunidade. Essa análise poderia ser feita com ajuda do sistema de pacotes do Debian.&lt;br /&gt;O Debian é uma das mais reconhecidads distribuições do Linux, sendo base para várias outras distribuições como Ubuntu, Knopixx, etc. O que a distribuição Debian fez, que as outras distribuições não fizeram foi trazer um sistema eficiente para instalação de programas ao Sistema Operacional. O eficiente sistema de pacotes do Debian é baseado no utilitário apt-get que antes de baixar e instalar o programa desejado com um simples comando,  descobre todas as dependências (e as dependências das dependências) daquele pacote e caso algum esteja faltando, pergunta ao usuário se quer as instalar tais dependências. Se o usuário confirmar a seleção, o utilitário baixa e instala todas as dependências e, lógico, o progama escolhido.&lt;br /&gt;Analisando o código fonte do apt-get, eu descobri que toda a informação de depedências encontra-se no arquivo Packages de uma distribuição debian. O arquivo Packages é um arquivo texto com blocos de informações sobre cada um dos pacotes.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Package: 3270-common&lt;br /&gt;Priority: optional&lt;br /&gt;Section: net&lt;br /&gt;Installed-Size: 96&lt;br /&gt;Maintainer: Bastian Blank &lt;waldi@debian.org&gt;&lt;br /&gt;Architecture: i386&lt;br /&gt;Source: ibm-3270&lt;br /&gt;Version: 3.3.4p6-3.3&lt;br /&gt;Depends: libc6 (&gt;= 2.3.6-6)&lt;br /&gt;Recommends: x3270 (= 3.3.4p6-3.3) | c3270 (= 3.3.4p6-3.3), pr3287 (= 3.3.4p6-3.3)&lt;br /&gt;Filename: pool/main/i/ibm-3270/3270-common_3.3.4p6-3.3_i386.deb&lt;br /&gt;Size: 21910&lt;br /&gt;MD5sum: 209bb0595c53421c433f4524147d6335&lt;br /&gt;SHA1: c89e5ef06fa0978b5a0935c90273b5c5997b2142&lt;br /&gt;SHA256: 881cf62382b9e1945155bdd366645d9660c1848aaab3a58e73d2bdfaa49301ae&lt;br /&gt;Description: Common files for IBM 3270 emulators and pr3287&lt;br /&gt;3270-common contains files referenced in other 3270 packages&lt;br /&gt;&lt;br /&gt;&lt;/waldi@debian.org&gt;&lt;/pre&gt;&lt;br /&gt;Bom, agora é hora de procurar uma ferramenta já disponível para trabalhar com grafos.  Tenho uma experiência negativa com SGB (Stanford Graph Base, do Donald Knuth), então espero que o arcabouço que eu encontrar seja mais amigável. E eis que surge o jung (Java Universal Network Graph).&lt;br /&gt;&lt;br /&gt;Bom, é muito simples utilizar o JUNG e ele fornece um monte de coisas como diversos algoritmos diferentes de visualização, análise de grafos, etc. Munido desse poderoso arcabouço tentei VISUALIZAR O DEBIAN. Parece ser uma tarefa bem mais complicada do que eu imaginei...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_du5DCjwyc9c/SHABiQjFvAI/AAAAAAAAABM/DJfwle58F8A/s1600-h/grafo_Debian.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_du5DCjwyc9c/SHABiQjFvAI/AAAAAAAAABM/DJfwle58F8A/s320/grafo_Debian.jpg" alt="" id="BLOGGER_PHOTO_ID_5219673656191728642" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-2309502306966261050?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/2309502306966261050/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=2309502306966261050' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2309502306966261050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/2309502306966261050'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/07/analisando-o-debian.html' title='Analisando o Debian'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_du5DCjwyc9c/SHABiQjFvAI/AAAAAAAAABM/DJfwle58F8A/s72-c/grafo_Debian.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-7262826069883511080</id><published>2008-06-28T17:35:00.000-07:00</published><updated>2008-07-22T14:32:32.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><title type='text'>Ciência do Trânsito</title><content type='html'>Com todo a tecnologia que mudou a sua paisagem, o homem moderno se acostumou a olhar o congestionamento  como apenas mais uma mazela urbana. Encontrar certas vias engarrafadas no final das tardes ou no começo da manhã se tornou uma rotina. Mas compreender  o funcionamento dessa complexa rede de transporte afim de propor alternativas coerentes e eficientes não é uma tarefa para qualquer um.&lt;br /&gt;&lt;br /&gt;Motivados por isso, engenheiros, cientistas e urbanistas começaram a estudar o trânsito como uma ciência. Essa é origem do livro A  física do trânsito do  especialista na teoria de trânsito veicular, Boris Kerner, físico pesquisador da Daimler Chrysler na Alemanha. No livro, Kerner explica que o princípio da teoria do trânsito está na definição de três fase para o trânsito.&lt;br /&gt;&lt;br /&gt;A primeira é o que ele chama de fluxo livre (do inglês, free flow). Nas condições de fluxo livre, o motorista pode escolher a velocidade e o comportamento que desejar. Mesmo que um motorista trafegue em velocidade mais lenta, outros motoristas conseguem se desviar dele.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_du5DCjwyc9c/SGbZksJ0keI/AAAAAAAAAA0/R_UkQhY-CqU/s1600-h/FreeFlow.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_du5DCjwyc9c/SGbZksJ0keI/AAAAAAAAAA0/R_UkQhY-CqU/s320/FreeFlow.png" alt="" id="BLOGGER_PHOTO_ID_5217096442706170338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se a quantidade de veículos  aumenta, os motoristas não terão opção senão guiar na mesma velocidade do carro mais lento da pista, porque para evitar colisões, os veículos guiam em velocidade igual ou inferior ao veículo a frente ou tentam escolher uma pista em  melhor situação. Com o número de veículos suficiente, todos as pistas estarão em situação semelhante.   O fluxo já não é livre, mas é sincronizado (synchronised flow).  Todos juntos, a uma velocidade sincronizada, eventualmente chegam a algum lugar. Como a avenida Rebouças, em São Paulo, pouco antes do horário de pico. Os carros seguem lado a lado, quase encostados em seus vizinhos. A velocidade beira os 40km/h, mas, considerando o caos subseqüente, que pode (e normalmente vai) se instaurar, está ótimo. Nessa hora o motorista tem a noção desesperadora de que, se ocorrer um acidente ali na frente, o trânsito terá problemas, mas segue otimista, com fé na ordem natural das coisas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_du5DCjwyc9c/SGbZwhz101I/AAAAAAAAAA8/H7OobRS54nI/s1600-h/SynchronizedFlow.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_du5DCjwyc9c/SGbZwhz101I/AAAAAAAAAA8/H7OobRS54nI/s320/SynchronizedFlow.png" alt="" id="BLOGGER_PHOTO_ID_5217096646088053586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No entanto, esse mesmo equilíbrio delicado pode ser abruptamente interrompido por, digamos, um  eventual  pneu furado em algum veículo. A partir desse instante, o trânsito se torna instável e o que Boris Kerner chama de congestionamentos dinâmicos (moving jams) começam a emergir. Os veículos se movem durante breves intervalos e voltam a esperar o movimento dos veículos da frente ou pela luz verde do semáforo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_du5DCjwyc9c/SGbZ_Antn2I/AAAAAAAAABE/nF9_GwQd0ZE/s1600-h/MovingJam.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_du5DCjwyc9c/SGbZ_Antn2I/AAAAAAAAABE/nF9_GwQd0ZE/s320/MovingJam.png" alt="" id="BLOGGER_PHOTO_ID_5217096894876852066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;É interessante notar como os físicos comparam os veículos com partículas conscientes. Diferente das moléculas, os veículos evitam colisões enquanto tentam se mover. Esse esforço para atingir seus  destinos e evitar colisões agem de forma similar as forças de atração causadas pelas pontes de hidrogênio na água. Isso sugere que a densidade de veículos tem efeito semelhante ao calor na água. Se o calor aumenta, as partículas se movem mais rapidamente até que as pontes de hidrogênio não consigam mais aglutinar as moléculas levando ao estado gasoso. Quando as moléculas de água cedem energia, as forças de coesão acabam aglutinando as moléculas, primeiro para o estado líquido e por fim para o estado sólido.&lt;br /&gt;&lt;br /&gt;A analogia serve ao trânsito como uma luva. No fluxo livre, os veículos agem como se estivessem no estado gasoso, bastante disperso, e com liberdade de movimentos  e velocidades bem diferentes. No fluxo sincronizado, os veículos seguem em velocidades similares como um líquido escoando  e no congestionamento, os veículos se movem como o teto de uma caverna de gelo que parte degela e enquanto outra parte congela.&lt;br /&gt;&lt;br /&gt;Para saber mais:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;- &lt;a href="http://physicsworld.com/cws/article/print/996" class="external free" title="http://physicsworld.com/cws/article/print/996" rel="nofollow"&gt;http://physicsworld.com/cws/article/print/996&lt;/a&gt; &lt;/p&gt;&lt;p&gt;- &lt;a href="http://www.thp.uni-koeln.de/%7Eas/Mypage/traffic.html" class="external free" title="http://www.thp.uni-koeln.de/~as/Mypage/traffic.html" rel="nofollow"&gt;http://www.thp.uni-koeln.de/~as/Mypage/traffic.html&lt;/a&gt; &lt;/p&gt;&lt;p&gt;- &lt;a href="http://en.wikipedia.org/wiki/Fundamental_diagram_of_traffic_flow" class="external free" title="http://en.wikipedia.org/wiki/Fundamental_diagram_of_traffic_flow" rel="nofollow"&gt;http://en.wikipedia.org/wiki/Fundamental_diagram_of_traffic_flow&lt;/a&gt; &lt;/p&gt;&lt;p&gt;- &lt;a href="http://en.wikipedia.org/wiki/Three_phase_traffic_theory" class="external free" title="http://en.wikipedia.org/wiki/Three_phase_traffic_theory" rel="nofollow"&gt;http://en.wikipedia.org/wiki/Three_phase_traffic_theory&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Editado:  Analogia com a água e referências.&lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-7262826069883511080?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/7262826069883511080/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=7262826069883511080' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7262826069883511080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/7262826069883511080'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/06/cincia-do-trnsito.html' title='Ciência do Trânsito'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_du5DCjwyc9c/SGbZksJ0keI/AAAAAAAAAA0/R_UkQhY-CqU/s72-c/FreeFlow.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-9216588599812209287</id><published>2008-06-28T13:33:00.000-07:00</published><updated>2008-07-18T06:36:33.551-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Economia'/><title type='text'>Could Reactos be good for community?</title><content type='html'>Many Foss evangelists could not understand how the ReactOS project is so important. So, despite my poor English knowledge, I will try to summarize some important questions here.&lt;br /&gt;&lt;br /&gt;First, Open Source is about choice, freedom, words that do not go with with monopoly even when the monopolist is an open software foundation or project. The bigger the community, the more human resources it will have. However, lesser will be the voice of each member. So, conflicting ideas may lie in different communities of different sizes, proportional to its acceptance. Once implemented, that idea could seem more interesting than another and change the equilibrium  of these communities to its side. So, in the long term, the fragmentation of a community could be better than a mere monopoly.  And Reactos is an amazing ideia, for example, to fully use all drivers, softwares, architecture from the dominant operation system.So, many things already exist, it will be a waste to rewrite everything because of pure arrogance.&lt;br /&gt;&lt;br /&gt;Second, Windows compatibility is a very very important thing, nowadays. Focusing only on Foss community, more than 30% of all projects in Sourceforge are only targeted Windows Plataform. Outside Foss world, how may programs in use were developed only for Windows? There is a real problem of  installed base of applications not to be ignored. Windows compatibility will benefit the market by weakening monopolist forces such as Metcalf Law, Cost of Transition, etc... In the end, with Windows compatibility, your investment in software will not be a hostage to a company.&lt;br /&gt;&lt;br /&gt;Shall we (re)summarize it?&lt;br /&gt;&lt;br /&gt;_ ReactOS is a very healthy manifestation of freedom.&lt;br /&gt;_ How good is software reuse? How good is it to be able use all drivers, softwares, architecture already made for Windows?&lt;br /&gt;_ Windows compatibiltiy is not a "would be" but a "must be" in IT manangemant nowadays.&lt;br /&gt;_ And last but not least, ReactOS strengthens Windows user's position against Redmont's giant, at the same time it weakens the inherently monopolist forces of software market (Metcalf Law, Cost of Transition, etc).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-9216588599812209287?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/9216588599812209287/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=9216588599812209287' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/9216588599812209287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/9216588599812209287'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/06/could-reactos-be-good-for-community.html' title='Could Reactos be good for community?'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-3426413127713959474</id><published>2008-04-17T23:00:00.000-07:00</published><updated>2008-07-18T06:34:42.299-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>Do HTML para impressora - Parte 1</title><content type='html'>Certas vezes, nós nos deparamos como a necessidade de fazer um objeto de apresentação para situações bem diferentes como o Browser e a impressora. A briga é boa: podemos criar objetos especializados para cada meio ou criar um objeto versátil o suficiente para atender os meios alvos. A seguinte proposta se guia pelo segundo caso objetivando a codificação de um único código para realizar uma tarefa específica.&lt;br /&gt;&lt;br /&gt;Imagine uma aplicação com a seguinte funcionalidade: A aplicação tem basicamente a função de buscar notas por um certo critério, exibir e imprimir a nota procurada. Um operador informa os campos chaves da nota. No passo seguinte, a aplicação devolve uma página com os dados da nota e uma formatação que mimetize ao máximo o layout originial da nota. Eventualmente, como essa nota está integrada a uma aplicação web, a página conterá outras “informações” como logo, links de navegação etc que não tem nada a ver com a nota mas apenas com a aplicação que a contém.&lt;br /&gt;Sem um tratamento adequado, o conteúdo da página não pode ser utilizado na impressão da nota dentro nos específicos formulários. Felizmente para isso, o HTML e CSS fornecem um ferramental que permite escolher informações que cabem a renderização em um contexto e não em outros. O atributo media da tag “link” do HTML permite que um determinado estilo seja aplicado para uma mídia específica como tela ou impressora. Além disso, atributos CSS 2  permitem excluir itens da renderização. Com esses dois conceitos, é possível escolher os elementos que serão apresentados em uma mídia e em outra não, e como serão apresentados. Finalmente o CSS 3 traz atributos específicos a impressão como tamanho da página, margens, etc que ajudam a definir com precisão o layout da impressão.&lt;br /&gt;Nessa implementação, será criado um arquivo de estilo destinado a impressão (printer.css) que é ligado ao HTML pelo comando abaixo.&lt;br /&gt;&lt;br /&gt;link rel="stylesheet" type="text/css" href="/css/printer.css" media="print"&lt;br /&gt;&lt;br /&gt;O Arquivo é definido como abaixo:&lt;br /&gt;body {&lt;br /&gt;font-family : sans-serif;&lt;br /&gt;font-size : 12px;&lt;br /&gt;margin: 0%;&lt;br /&gt;padding: 0%;&lt;br /&gt;width: 8.125in; &lt;br /&gt;}&lt;br /&gt;.advertising {&lt;br /&gt;display : none !important;&lt;br /&gt;}&lt;br /&gt;.hideToPrint { &lt;br /&gt;display : none !important;&lt;br /&gt;}&lt;br /&gt;.transparentPrint{&lt;br /&gt;visibility: hidden !important; &lt;br /&gt;}&lt;br /&gt;* {&lt;br /&gt;border-collapse: collapse !important; &lt;br /&gt;}&lt;br /&gt;td {&lt;br /&gt;border:none !important; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;img {&lt;br /&gt;display : none;&lt;br /&gt;}&lt;br /&gt;@page{&lt;br /&gt;margin : 0%;&lt;br /&gt;size: 8.125in 13in; /* width height */ &lt;br /&gt;}&lt;br /&gt;Observe que a classe  transparentPrint utiliza um atributo de visibilidade enquanto que a classe  hideToPrint utiliza  um atributo que define se um objeto deve participar da renderização. Objetos com atributos ocultos ocupam o espaço que seriam renderizados. Na verdade eles são renderizados como se fossem transparentes. Já os objetos com atributo display: none não ocupam espaço. No nosso caso, esse recurso é utilizado para os cabeçalhos ocuparem os espaços necessários no formulário sem que sejam imprimidos (os cabeçalhos dos campos dos formulários já estão impressos).&lt;br /&gt;A página com a nota é definida com mesma escala e precisão do formulário. Por exemplo, para um formulário é definido em polegadas (8 ¼  x  13), da mesma forma que os campos. Utilizamos a definição de página:&lt;br /&gt;@page{&lt;br /&gt;size: 8.125in 13in; /* width height */ &lt;br /&gt;}&lt;br /&gt;No HTML (ou JSP), definimos os campos com o mesmo cuidado:&lt;br /&gt; tr class="transparentPrint table_header" style="height: 0.375in" &lt;br /&gt;  td style="width: 7.5in"/td&lt;br /&gt;  td style="width: 0.625in; font-weight: bolder;"Nº/td&lt;br /&gt; /tr&lt;br /&gt; tr style="height: 0.25in" &lt;br /&gt;  td style="width: 7.5in" /td&lt;br /&gt;  td style="width: 0.625in;" &lt;br /&gt;   bean:write name="nota" property="numeroNota" /&lt;br /&gt;  /td&lt;br /&gt; /tr&lt;br /&gt;&lt;br /&gt;Com isso, conseguimos definir um HTML com definições precisas para impressão e visualização. Num cenário mais simples poderíamos associar um comando Javascript no botão de impressão.&lt;br /&gt;&lt;br /&gt;input type="button" class="hideToPrint" value="imprimir" onclick='window.print();'/&lt;br /&gt;&lt;br /&gt;Infelizmente, os navegadores de Internet interferem na impressão com suas próprias definições do tamanho do papel, margens e até cabeçalhos e rodapés o que nos impede tomarmos tal abordagem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-3426413127713959474?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/3426413127713959474/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=3426413127713959474' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3426413127713959474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3426413127713959474'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/02/do-html-para-impressora-parte-1.html' title='Do HTML para impressora - Parte 1'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5188880564860694624</id><published>2008-04-17T09:12:00.000-07:00</published><updated>2010-05-27T20:19:08.438-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Javascripting in Java</title><content type='html'>&lt;!-- Include required JS files --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushJava.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_du5DCjwyc9c/SAd4rS3BYOI/AAAAAAAAAAs/0jugjDSaooE/s1600-h/Resultado.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_du5DCjwyc9c/SAd4rS3BYOI/AAAAAAAAAAs/0jugjDSaooE/s320/Resultado.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5190249780760109282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Linguagens dinâmicas apresentam várias vantagens sobre as linguagens compiladas. Uma dessas vantagens é a habilidade de adicionar código em tempo de execução com facilidade. Por exemplo, imagine um servidor que de alguma forma receba e processe comandos. Num ambiente Java (onde o  servidor é um programa Java assim como os comandos são objetos Java) é um certo malabarismo com o Classloader para fazer isso.&lt;br /&gt;&lt;br /&gt;http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enquanto que esse dinamismo é ainda “sustentável” para Classes,  a situação é mais complicada para fragmentos  de código. Nesse caso é preciso compilar uma classe Java e carregá-la. Com Javascript, a situação é outra. Uma vez que a linguagem é interpretada, é simplesmente trivial adicionar fragmentos de código. Para provar isso vou  implementar um programa que imprime gráficos, para funções arbitrárias de uma variável x “real” (aliás, radicalmente arbitrárias... não irei nem mesmo validar se a entrada é de fato uma função).&lt;br /&gt;&lt;br /&gt;Inicialmente definimos uma interface para a função. Não queremos que o código cliente seja impregnado com detalhes técnicos do funcionamento do javax.script. Queremos definir a interface mais simples possível sem comprometer o desempenho da aplicação. &lt;br /&gt;&lt;pre name="code" class="java"&gt; public interface Function {&lt;br /&gt;  double[] function(double xInit, double xfinal, double step);&lt;br /&gt;&lt;br /&gt;  public double function(double x);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora faremos teste com uma função bem conhecida x^2 (ou f(x) = x*x). Aqui o teste unitário da função:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt; /**&lt;br /&gt;  * Test of function method, of class RhinoCalc.&lt;br /&gt;  */&lt;br /&gt; @Test&lt;br /&gt; public void functionXQuadrado() throws Exception {&lt;br /&gt;  setFunction();&lt;br /&gt;  double xInit = 0.0;&lt;br /&gt;  double xfinal = 10.0;&lt;br /&gt;  double step = 1;&lt;br /&gt;  double[] result = function.function(xInit, xfinal, step);&lt;br /&gt;  assertTrue(Arrays.equals(new double[] { 0, 1, 4, 9, 16, 25, 36, 49, 64,&lt;br /&gt;    81, 0 }, result));&lt;br /&gt;  for (int i = 0; i &lt; result.length; i++) {&lt;br /&gt;   System.out.println(result[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Para implementar a classe vou seguir os passos mais simples para adicionar o Javascript. Isso se resume a carregar o motor de scripts, adicionar a função e realizar a chamada necessária.Para carregar o motor de scripts:&lt;pre name="code" class="java"&gt; public RhinoFunction() {&lt;br /&gt;  ScriptEngineManager mgr = new ScriptEngineManager();&lt;br /&gt;  jsEngine = mgr.getEngineByName("JavaScript");&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Atribuir uma função arbitrária:&lt;pre name="code" class="java"&gt; public void setFunction(String function) throws ScriptException {&lt;br /&gt;  jsEngine.eval("function f(x) { \n" + " return  " + function + ";}");&lt;br /&gt;  invocableEngine = (Invocable) jsEngine;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;e  invocar uma função:&lt;pre name="code" class="java"&gt; public double function(double x) {&lt;br /&gt;  try {&lt;br /&gt;   return (Double) invocableEngine.invokeFunction("f", x);&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   Logger.getLogger(RhinoFunction.class.getName()).log(Level.SEVERE,&lt;br /&gt;     null, e);&lt;br /&gt;   throw new RuntimeException(e);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public double[] function(double xInit, double xfinal, double step) {&lt;br /&gt;  double deltaX = xfinal - xInit;&lt;br /&gt;  int size = (int) Math.ceil(deltaX / step);&lt;br /&gt;  double[] result = new double[size + 1];&lt;br /&gt;  int i = 0;&lt;br /&gt;  for (double x = xInit; x &lt; xfinal; x += step, i++) {&lt;br /&gt;   try {&lt;br /&gt;    result[i] = (Double) invocableEngine.invokeFunction("f", x);&lt;br /&gt;   } catch (Exception ex) {&lt;br /&gt;    Logger.getLogger(RhinoFunction.class.getName()).log(&lt;br /&gt;      Level.SEVERE, null, ex);&lt;br /&gt;    throw new RuntimeException(ex);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return result;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Agora um teste que exige mais desempenho. Podemos utilizar a classe para gerar gráficos de funções. Aqui um modelo que resume o funcionamento dessas classes:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_du5DCjwyc9c/SAd4OS3BYNI/AAAAAAAAAAk/cb6-sKdcS2g/s1600-h/rect2160.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_du5DCjwyc9c/SAd4OS3BYNI/AAAAAAAAAAk/cb6-sKdcS2g/s320/rect2160.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5190249282543902930" /&gt;&lt;/a&gt;Ao pressionar o botão “plot” o seguinte método atualiza o modelo do plano cartesiano e solicita a atualização do painel.&lt;pre name="code" class="java"&gt; private void plotButtonActionPerformed(java.awt.event.ActionEvent evt) {&lt;br /&gt;  CartesianPanel painel = (CartesianPanel) this.graphicPanel;&lt;br /&gt;  try {&lt;br /&gt;   rhinoFunction.setFunction(polinomioTextField.getText());&lt;br /&gt;  } catch (ScriptException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;   JOptionPane&lt;br /&gt;    .showMessageDialog(&lt;br /&gt;    this,&lt;br /&gt;    "O interpretador não conseguiu interpretar a função escrita.",&lt;br /&gt;    "Função Inválida", JOptionPane.ERROR_MESSAGE);&lt;br /&gt;  }&lt;br /&gt;  painel.setFunction(rhinoFunction);&lt;br /&gt;  double initialX = Double.parseDouble(initialXTextField.getText());&lt;br /&gt;  double finalX = Double.parseDouble(xFinalTextField.getText());&lt;br /&gt;  double initialY = Double.parseDouble(initialYTextField.getText());&lt;br /&gt;  double finalY = Double.parseDouble(finalYTextField.getText());&lt;br /&gt;  painel.getCartesianPlan().setDimension(initialX, finalX, initialY, finalY);&lt;br /&gt;  painel.repaint();&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;Eu adicionei alguns métodos de “zoom” com o mouse de forma que o programa tivesse mais dinamismo. Essas funcionalidades foram implementadas tanto no painel do desenho que sofre a ação como numa classe especialista “adapter” para o mouse. Isso é praticamente um completo programa de “plot” extramente simples e compacto que ilustra as facilidades do JFC e javax.script.Outras ConsideraçõesClaro que o exemplo poderia ser estendido para compreender outros conceitos e funcionalidades facilmente implementadas com JFC (como a possibilidade de impressão do gráfico), a habilidade de desenhar retângulos com a área selecionada, a possibilidade de arrastar o gráfico deslocando o ponto inicial, etc. Mas isso vai longe: uma longa caminhada do ArcTest para o Kplot... http://java.sun.com/applets/jdk/1.4/demo/applets/ArcTest/example1.htmlhttp://edu.kde.org/kmplot/&lt;script language="javascript"&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5188880564860694624?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5188880564860694624/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5188880564860694624' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5188880564860694624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5188880564860694624'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/04/javascripting-in-java.html' title='Javascripting in Java'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_du5DCjwyc9c/SAd4rS3BYOI/AAAAAAAAAAs/0jugjDSaooE/s72-c/Resultado.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-603779670799369925</id><published>2008-04-02T04:18:00.001-07:00</published><updated>2009-11-23T06:42:11.703-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ciências da Computação'/><title type='text'>Objetos versus Arquivos (Squeak vs Eclipse)</title><content type='html'>Objetos ou Arquivos&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No Unix, os arquivos são utilizados como a metáfora comum para uma ampla variedade de propósitos. Nesse mundo, dispositivos, processos, recursos do sistema são mostrados como arquivos. Apesar das limitações, esse é um conveniente meio de realizar diversas tarefas administrativas. Operações com direcionamento são utilizados de forma sistemática para arquivos ou dispositivos (ex: ls &gt; ls.txt ou ls &gt; /dev/lpt1 ). No windows, todos recursos são objetos, inclusive os arquivos. Isso também proporciona uma forma conveniente para manipular tais conceitos. Mas, não vemos no Windows a mesma facilidade de manipulação para fins administrativos que temos no Unix.&lt;br /&gt;&lt;br /&gt;Um cenário semelhante acontece com as plataformas de desenvolvimento. De um lado, temos o Java/Eclipse, onde cada classe é representado por arquivos do SO e do outro lado, Smalltalk/Squeak as classes são objetos armazenados em memória e de alguma maneira persistido no computador (a tal imagem da área de trabalho). No caso dessas duas plataformas, fico com o Java, porque ela não me bloqueia a alteração das classes. Basta um bloco de notas para fazer alterações. Assim, é possível delegar para outros programas funções como backup, transmissão de informação, versionamento.... O que é mais fácil, compartilhar uma classe em Java ou em Smalltalk!? E, dentro do ambiente Eclipse, temos quase a sensação que a classe não é um mero arquivo, mas de fato um modelo de objeto, com propriedades e funções, com várias formas de se apresentar.&lt;br /&gt;&lt;br /&gt;Não quero aqui desprezar a idéia da representação de objetos, mas reforçar a idéia de que  a interoperabilidade é peça fundamental na arquitetura de um sistema. Vale mais um monte de arquivos, que se possa manipular da forma do que objetos que sejam de difícieis de mexer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-603779670799369925?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/603779670799369925/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=603779670799369925' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/603779670799369925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/603779670799369925'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/04/objetos-versus-arquivos.html' title='Objetos versus Arquivos (Squeak vs Eclipse)'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-932168503928339990</id><published>2008-03-14T04:19:00.001-07:00</published><updated>2008-03-14T04:19:55.319-07:00</updated><title type='text'>Ask me - The Smiths</title><content type='html'>Shyness is nice, and&lt;br /&gt;Shyness can stop you&lt;br /&gt;From doing all the things in life&lt;br /&gt;You'd like to&lt;br /&gt;&lt;br /&gt;Shyness is nice, and&lt;br /&gt;Shyness can stop you&lt;br /&gt;From doing all the things in life&lt;br /&gt;You'd like to&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, if there's something you'd like to try&lt;br /&gt;If there's something you'd like to try&lt;br /&gt;ASK ME - I WON'T SAY "NO" - HOW COULD I ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coyness is nice, and&lt;br /&gt;Coyness can stop you&lt;br /&gt;From saying all the things in&lt;br /&gt;Life you'd like to&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, if there's something you'd like to try&lt;br /&gt;If there's something you'd like to try&lt;br /&gt;ASK ME - I WON'T SAY "NO" - HOW COULD I ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Spending warm Summer days indoors&lt;br /&gt;Writing frightening verse&lt;br /&gt;To a buck-toothed girl in Luxembourg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ASK ME, ASK ME, ASK ME&lt;br /&gt;ASK ME, ASK ME, ASK ME&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Because if it's not Love&lt;br /&gt;Then it's the Bomb, the Bomb, the Bomb, the Bomb, the Bomb, the Bomb, the Bomb&lt;br /&gt;That will bring us together&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nature is a language - can't you read ?&lt;br /&gt;Nature is a language - can't you read ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SO ... ASK ME, ASK ME, ASK ME&lt;br /&gt;ASK ME, ASK ME, ASK ME&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Because if it's not Love&lt;br /&gt;Then it's the Bomb, the Bomb, the Bomb, the Bomb, the Bomb, the Bomb, the Bomb&lt;br /&gt;That will bring us together&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If it's not Love&lt;br /&gt;Then it's the Bomb&lt;br /&gt;Then it's the Bomb&lt;br /&gt;That will bring us together&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SO ... ASK ME, ASK ME, ASK ME&lt;br /&gt;ASK ME, ASK ME, ASK ME&lt;br /&gt;Oh, la ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-932168503928339990?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/932168503928339990/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=932168503928339990' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/932168503928339990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/932168503928339990'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/03/ask-me-smiths.html' title='Ask me - The Smiths'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-8162604790102819671</id><published>2008-03-02T05:06:00.000-08:00</published><updated>2010-05-27T20:07:13.929-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Servlet - Mensagens Assíncronas</title><content type='html'>&lt;!-- Include required JS files --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://dl.dropbox.com/u/6351101/www/dp.SyntaxHighlighter/Scripts/shBrushJava.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_du5DCjwyc9c/R9dI5dbq_hI/AAAAAAAAAAY/0X0ORZDCweo/s1600-h/clip_image004.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_du5DCjwyc9c/R9dI5dbq_hI/AAAAAAAAAAY/0X0ORZDCweo/s320/clip_image004.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5176686448676109842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_du5DCjwyc9c/R9dIrNbq_gI/AAAAAAAAAAQ/URHbrK7iscI/s1600-h/clip_image002.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_du5DCjwyc9c/R9dIrNbq_gI/AAAAAAAAAAQ/URHbrK7iscI/s320/clip_image002.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5176686203862973954" /&gt;&lt;/a&gt;&lt;br /&gt;Meu trabalho de conclusão de curso foi sobre um sistema de comunicação de bibliotecas. Desenvolvi o trabalho inicialmente nas aulas de XP e mais tarde, junto com o co-autor da monografia, Leandro Bororo.&lt;br /&gt;&lt;br /&gt;Todo o trabalho gira em torno de dois problemas: exportar os dados da base para um formato especial, denominado MARC, e importar os dados desse formato para o banco. Podemos separar isso na discussão legal e na discussão chata. A discussão chata é justamente os objetivos básicos do projeto supracitados. A discussão legal é como criar uma interface WEB para esse componente que permita o acompanhamento do processo de importação ou exportação. Obviamente vou falar sobre o segundo caso.&lt;br /&gt;&lt;br /&gt;Desenvolver uma interface WEB para o MARC não é nenhum problema. No entanto, acompanhar a importação/exportação e permitir que o sistema trabalhe com arquivos grandes (mais de 10 megabytes) é outra história. A própria natureza de uma aplicação WEB torna a solução síncrona problemática. A análise de um arquivo MARC pode demorar bastante. O suficiente para a conexão HTTP (cliente-servidor) finalizar por timeout. Além disso, não seria a implementação mais responsiva (se todas as informações são direcionadas para a saída padrão, essas serão exibidas com sorte na linha de comando ou em algum arquivo de registro do servidor, em todo caso, não visível para o cliente). Para resolver isso, o tratamento da informação deveria ser assíncrono.&lt;br /&gt;&lt;br /&gt;Inicialmente, poderíamos pensar em enviar as mensagens diretamente para o browser. Mas isso não é possível fazer diretamente. De fato, é o navegador faz as solicitações (request) de um certo recurso (disponível numa localização específica - URL). Uma alternativa seria o uso de Ajax (Asynchronous Javascript And XML) que daria a sensação de que o browser é capaz receber notificações do servidor. Na verdade, no Ajax, é o  navegador que faz chamadas remotas de tempos em tempos (sem que o usuário tome alguma ação específica). O fato de a primeira requisição bloquear.&lt;br /&gt;&lt;br /&gt;Abaixo, segue o funcionamento da comunicação síncrona entre Browser e servidor que mostra porque o browser irá bloquear ao enviar o arquivo para processamento:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;public Response processar (Request request) {&lt;br /&gt;   // magia negra para pegar arquivo do request &lt;br /&gt;   File file = pegaArquivo(request);&lt;br /&gt;   &lt;br /&gt; // magia negra para processar o  arquivo&lt;br /&gt;   Resposta resposta = processa(arquivo);&lt;br /&gt;   &lt;br /&gt; // magia para transformar resposta em  response&lt;br /&gt;   return transforma(resposta); &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A conversa do navegador com o servidor é feito por ciclos de requisições e respostas. Se for necessário que numa requisição o servidor processe um dado arquivo, é preciso esperar todo o processamento para se obter a resposta do servidor. Pode-se separar o processamento da submissão do arquivo, delegando a responsabilidade para outro processo. Exemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;public Response processar (Request request) {&lt;br /&gt;  // magia negra para pegar arquivo do request&lt;br /&gt;     File file = pegaArquivo(request);&lt;br /&gt;  &lt;br /&gt; // apenas grava o arquivo.. uma outra linha de execução processa o arquivo.  &lt;br /&gt;     grava(arquivo); &lt;br /&gt;     return paginaSucesso();&lt;br /&gt; } &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se o processamento do arquivo é feito na mesma linha de execução da submissão, o cliente só terá uma resposta após o processamento do arquivo.&lt;br /&gt;&lt;br /&gt;Para o servidor processar o arquivo de forma assíncrona é necessário que primeiro um "Servlet" processe e grava o arquivo num repositório temporário (seja ele uma fila JMS, um caixa de email, um diretório, etc) e um outro processo, de tempos em tempos, verifique o conteúdo desse repositório.&lt;br /&gt;&lt;br /&gt;Esse outro processo pode atualizar um arquivo de log a medida que for necessário (por exmplo: a medida que os registros Marcs forem processados) . Dessa forma,  o cliente poderá  "requisitar" o conteúdo do arquivo quantas vezes quiser. &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;// isso é fácil...&lt;br /&gt; public Resposta processar(Request request) {&lt;br /&gt;  descobreIdArquivo(request);&lt;br /&gt;  // conteúdo atual do arquivo&lt;br /&gt;  String arquivo = leArquivo(idArquivo);&lt;br /&gt;  return converteParaResponse(arquivo);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A síntese da solução é a seguinte: Num primeiro momento o usuário faria o "upload" do arquivo. Depois o usuário deveria listar o arquivo em importação e consultar os detalhes da importação. O mesmo pode ser feito para a exportação.  Uma fila de mensagens assíncronas e um processo em execução paralela devem ser implementados.&lt;br /&gt;&lt;br /&gt;Implementamos o processo da seguinte maneira:&lt;br /&gt;&lt;br /&gt;O servidor recebe um arquivo, via FormFile (essa classe é um utilitário da biblioteca commons-upload [do projeto Commons  da Apache Software Foundation] para tratar multipart/form-data de  uma requisição HTTP) e o grava num diretório específico. Em seguida,  envia um objeto comando como mensagem para uma fila  (com o nome do arquivo já atribuído a uma de suas propriedades). Por outro lado, o sistema mantém uma reserva (pool) de trabalhadores que consomem os "trabalhos" enviados para a fila. Cada processamento é registrado por um registrador (logger) num mapa cuja chave é o nome do arquivo. Um Servlet controla o ciclo de vida desses trabalhadores. Os trabalhadores devem por isso, realizar pequenos blocos de operações e verificar se pode executar o próximo bloco, para evitar bloquear o servidor caso seja necessário reiniciá-lo. Abaixo, segue como foi implementado o trabalhador:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   while (condicao) {&lt;br /&gt;    Command command = works.take();&lt;br /&gt;    if (NO_MORE_WORK == command) {&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;    try {&lt;br /&gt;     while (command.hasWork() &amp;&amp; condicao) {&lt;br /&gt;      command.process();&lt;br /&gt;     }&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;    command.finish();&lt;br /&gt;   }&lt;br /&gt;  } catch (InterruptedException e) {&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Nesse trecho de código, o objeto works representa a fila de trabalhos (BlockingQueue do pacote utilitário de concorrência do Java 1.5 e superiores). Ele será o repositório da comunicação Produtor-Consumidor. Command é a classe que implementa o padrão Command [Gof], o comando que será executado. A variável condicao permite que o trabalhador verifique se deve continuar a execução do trabalho atual. Aqui a implementação do comando para a Importação do  MARC:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt; private class ImportMarcCommand extends Command {&lt;br /&gt;  private LenientMarcStreamReader reader;&lt;br /&gt;  private MarcManager marcManager;&lt;br /&gt;  private FileInputStream inputStream;&lt;br /&gt;  private String nomeArquivo;&lt;br /&gt;  private FileChannel channel;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public boolean hasWork() {&lt;br /&gt;   return reader.hasNext();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void process() throws Exception {&lt;br /&gt;   marcManager.parse(reader.next());&lt;br /&gt;   marcManager.getLog().setAvailable(channel.position());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public ImportMarcCommand(String nomeDoArquivo, boolean sobrescreveItem,&lt;br /&gt;    boolean sobrescreveExemplar) throws NamingException,&lt;br /&gt;    IOException {&lt;br /&gt;   marcManager = new MarcManager(sobrescreveItem, sobrescreveExemplar);&lt;br /&gt;   Logger.getInstance().getLogs().add(marcManager.getLog());&lt;br /&gt;   this.nomeArquivo = nomeDoArquivo;&lt;br /&gt;   File file = new File(nomeDoArquivo);&lt;br /&gt;   inputStream = new FileInputStream(file);&lt;br /&gt;   channel = inputStream.getChannel();&lt;br /&gt;   marcManager.getLog().setInitialAvailable(file.length());&lt;br /&gt;   reader = new LenientMarcStreamReader(inputStream);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void finish() {&lt;br /&gt;   marcManager.getLog().setFinalDate(new Date());&lt;br /&gt;   // vou fechar o stream por educação. se eu não conseguir, não vou&lt;br /&gt;   // ligar.&lt;br /&gt;   if (inputStream != null) {&lt;br /&gt;    try {&lt;br /&gt;     inputStream.close();&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   // tenta apagar educadamente.&lt;br /&gt;   File f = new File(nomeArquivo);&lt;br /&gt;   if (!f.exists() &amp;&amp; !f.canWrite()) {&lt;br /&gt;    f.delete();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Algumas observações:&lt;br /&gt;&lt;br /&gt;O ImportMarcCommand processa um registro MARC por vez (então, o processo pode ser finalizado logo que o registro atual for processado).&lt;br /&gt;&lt;br /&gt;O objeto reader é responsável por identificar o registro e mover o indicador da posição de leitura do arquivo.&lt;br /&gt;&lt;br /&gt;O objeto channel permite que essa informação (sobre o indicador da posição seja computado) seja computada no cálculo do total decorrido.&lt;br /&gt;&lt;br /&gt;O Logger é o repositório com as informações sobre o histórico de cada processamento (tempo inicial, final , etc).&lt;br /&gt;&lt;br /&gt;No método finish, é registrado o fim do processamento e o arquivo é apagado.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt; public class ThreadMonitorServlet extends HttpServlet {&lt;br /&gt;  private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void destroy() {&lt;br /&gt;   for (int i = 0; i &lt; workers.length; i++) {&lt;br /&gt;    workers[i].setCondicao(false);&lt;br /&gt;    try {&lt;br /&gt;     queue.put(ImportWorker.NO_MORE_WORK);&lt;br /&gt;    } catch (InterruptedException e) {&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   super.destroy();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static final int capacity = 10;&lt;br /&gt;  final int numWorkers = 3;&lt;br /&gt;  public static BlockingQueue&lt;Command&gt; queue = new ArrayBlockingQueue&lt;Command&gt;(&lt;br /&gt;    capacity);&lt;br /&gt;  ImportWorker[] workers = new ImportWorker[numWorkers];&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void init(ServletConfig servletConfig) throws ServletException {&lt;br /&gt;   super.init(servletConfig);&lt;br /&gt;   for (int i = 0; i &lt; workers.length; i++) {&lt;br /&gt;    workers[i] = new ImportWorker(queue);&lt;br /&gt;    workers[i].start();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;O método init recebe o evento de inicialização do servidor. Nesse momento, o Servlet "contrata" os trabalhadores que serão responsáveis pelo processamento dos comandos, isso é, o Servlet atribui a lista de trabalho e inicia as threads. No método destroy o Servlet recebe o evento para finalizar e então muda a condição de execução das threads de tal forma que elas parem sua execução.Declarado no web.xml da seguinte maneira:&lt;div align="left" class="java"&gt;&lt;table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff"&gt;&lt;tr&gt; &lt;!-- start source code --&gt; &lt;td nowrap="nowrap" valign="top" align="left"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-name&amp;gt;monitor&amp;lt;/servlet-name&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;servlet-&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;br.usp.ime.colmeia.async.ThreadMonitorServlet&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/servlet-&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;load-on-startup&amp;gt;&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/load-on-startup&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/servlet&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt; &lt;!-- end source code --&gt; &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;!-- =       END of automatically generated HTML code       = --&gt;&lt;!-- ======================================================== --&gt;Depois disso, tem-se a ação para listar a situação do processamento de cada arquivo.&lt;script language="javascript"&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-8162604790102819671?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/8162604790102819671/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=8162604790102819671' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/8162604790102819671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/8162604790102819671'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/03/blog-post.html' title='Servlet - Mensagens Assíncronas'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_du5DCjwyc9c/R9dI5dbq_hI/AAAAAAAAAAY/0X0ORZDCweo/s72-c/clip_image004.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-8030388191124959020</id><published>2008-02-11T16:55:00.000-08:00</published><updated>2008-07-18T06:37:26.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ciências da Computação'/><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologias'/><title type='text'>GPGPU - Parte I</title><content type='html'>&lt;p class="western"&gt;Utilizando a placa de vídeo para realizar operações matriciais.&lt;/p&gt;&lt;br /&gt;&lt;p class="western"&gt;&lt;/p&gt;Essa é uma idéia que ouço desde quando entrei na USP em 1998. Basicamente, as placas de vídeo são capazes de realizar operações matriciais de "uma só vez". Peço aos mais entendidos que me corrijam quando eu estiver (muito) errado.&lt;br /&gt;&lt;br /&gt;Isso pode parecer meio estranho mas muitas das  transformações de imagens apresentadas por sua placa de vídeo são série de transformações lineares.  Dito isso, é um desperdício de tempo e processamento multiplicar uma matriz por outra com três laços aninhados! Aliás, é um desperdício deixar sua planilha eletrônica resolver equações lineares e outros problemas lineares computando um elemento da planilha por vez.&lt;br /&gt;&lt;br /&gt;Chegou a hora de dar um basta nisso. Já não era sem tempo. Com avanço das placas de vídeo e das linguagens de renderização (pasmem! eu pensei que isso já seria possível a 10 anos atrás) é possível, por exemplo, multiplicar um vetor por um escalar em tempo constante.&lt;br /&gt;&lt;br /&gt;Vamos por colocar as mãos na massa... O que é necessário ? Pelo que eu investiguei, é preciso do OpenGL 2.0 (mais especificamente o GLSL que a linguagem de programação de shaders) ou uma das edições recentes do DirectX (9 em diante).&lt;br /&gt;&lt;br /&gt;Peraí... alguém me explica: isso é complicado mesmo ou por que ninguém fez nada até agora?  E pra que essa linguagem GLSL. Porque, conforme veremos, enviar blocos de código para a Placa de Vídeo executar requer uma certa sofisticação tecnológica que tanto a Kronos como os fabricantes de placas de vídeo não nos deram.&lt;br /&gt;&lt;br /&gt;Um passo por vez... o que é OpenGL? Isso pode parecer uma pergunta besta mas na verdade entender o significado do OpenGL ajuda a compreender a sofisticação do processo. O OpenGL não é uma API para interagir com a placa de vídeo! Nada disso... o OpenGL é na verdade uma API para a renderização de gráficos. O programador dispõe de uma linguagem para descrever o modelo gráfico que desejar e os drivers das placas de vídeo (que implementam o OpenGL) transformam esse modelo em chamadas de baixo nível para a placa. Essa últimas realizam as computações necessárias e emitem seus resultados para o monitor.&lt;br /&gt;&lt;br /&gt;Veja que o programador não programa diretamente a placa para realizar as operações lineares. Também, observe quanto o OpenGL é diferente do DirectX que fornece através do seu componente Direct3D chamadas de baixo nível a placa de vídeo (o que favorece o desenvolvimento de jogos _ Por outro lado, a linguagem de renderização do OpenGL favorece o desenvolvimento de programas gráficos profissionais). Perceba que no OpenGL o desenvolvedor descreve os vários conceitos presentes no o 3D Studio : cenário,  fontes de iluminação, textura dos objetos, a câmera etc. Bom é através de um mapeamento desses conceitos para a computação tradicional é que é possível implementar o GPGPU.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-8030388191124959020?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/8030388191124959020/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=8030388191124959020' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/8030388191124959020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/8030388191124959020'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2008/02/gpgpu-parte-i.html' title='GPGPU - Parte I'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5970056992982701472</id><published>2007-08-13T19:15:00.000-07:00</published><updated>2008-07-18T06:32:03.574-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><category scheme='http://www.blogger.com/atom/ns#' term='Jornalismo'/><title type='text'>A Mino Carta: "Narciso acha feio o que não é espelho"</title><content type='html'>Em sua postagem em 01 de agosto de 2007, intitulado &lt;a href="http://z001.ig.com.br/ig/61/51/937843/blig/blogdomino/2007_08.html"&gt;"Caixa Preta"&lt;/a&gt; o senhor Mino Carta coloca a questão do aeroporto de Congonhas como um problema inventado pela oposição para arranhar a imagem do governo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Ocorre que nos empenhamos em praticar o verdadeiro jornalismo, baseado, em primeiro lugar, na verdade factual. Que eu saiba, ninguém se queixava, até três semanas atrás, nem graúdo, nem miúdo, quanto à localização do aeroporto, embora protestasse, com razão, contra o apagão, contra os atrasos constantes e insuportáveis. Os defeitos de Congonhas só passaram a ser apontados depois do acidente, o qual, nas circunstâncias, ocorreria de qualquer maneira. Tal é a verdade factual, assim como o são as chuvas torrenciais que desabaram sobre São Paulo.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Indignado, (será que as convicções políticas do Mino Carta interferiram em sua memória!? Custava fazer uma pesquisa e verificar a verdade de suas afirmações!?)  postei em seu blog:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Mino,&lt;br /&gt;&lt;br /&gt;O senhor está de brincadeira! Quantos paulistanos já não reclamaram do Aeroporto !? Na televisão, um sem número de vezes. Até no Faustão já apareceu uma cidadã se queixando e o apresentador ironizou ao dizer que daqui a pouco um avião deveria pousar em cima do outro no aeroporto. Francamente, estamos cansados de Congonhas e já faz muito tempo.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Logo, uma legião de fãs começou a defender o jornalista (&lt;a href="http://z001.ig.com.br/ig/61/51/937843/blig/blogdomino/comentarios/18916069.html"&gt;divirtam-se&lt;/a&gt;).   Chamo a atenção para o comentário de um de seus defensores, o Francenildo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Ao sabidão logo abaixo: traga uma só, uminha, qualquer que seja, matéria que prove o que dizes sobre as tais frequentes reclamações da mídia e dos paulistas cansados, relacionadas à Congonhas. Está óbvio que os paulistas se indignaram tanto que ficaram cansados, ou melhor, fartos e exaustos com o monstruoso problema de ter que descer, contrariados, num aeroporto tão mal localizado. Lembro o rapaz que a autorização para operar Airbus foi dada pelo privata-mor fhc, pai do filho que a tua mídia nunca soube...mas traga notícias anteriores ao começo do golpe, ok?. Vamos lá, pela certeza com que repreendestes o Mino deves ter muitas delas à nos mostrar, não é mesmo? &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O que coloco a seguir é o que não foi publicado pela censura do senhor Mino Carta:&lt;br /&gt;Primeiro que fiz a seguinte busca no google: aeroporto congonhas, para verificar quantos links eu precisaria percorrer para encontrar uma, "uminha só", notícia que falasse mal de Congonhas antes da data fatídica: 17 de julho. &lt;a href="http://www.google.com.br/search?client=firefox-a&amp;rls=org.mozilla%3Apt-BR%3Aofficial&amp;amp;channel=s&amp;hl=pt-BR&amp;amp;q=aeroporto+de+congonhas&amp;meta=&amp;amp;btnG=Pesquisa+Google"&gt;Quarto Resultado&lt;/a&gt;... Globo Online... &lt;a href="http://g1.globo.com/Noticias/SaoPaulo/0,,MUL70904-5605,00.html"&gt;Avião derrapa no Aeroporto de Congonhas&lt;/a&gt;, postado no dia 16 de julho.&lt;br /&gt;&lt;br /&gt;Postei a respota mais ou menos assim:&lt;br /&gt;Respondendo ao senhor Reginaldo, segue o link tal publicado que o quarto resultado da busca no google por Aeroporto de Congonhas.&lt;br /&gt;&lt;br /&gt;Claro que eu fui um tosco com esta respostinha medíocre. Minha esposa tratou de fazer uma intervenção bem mais didática:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Dê uma olhada nessas notícias referentes ao aeroporto de congonhas:&lt;br /&gt;&lt;br /&gt;http://g1.globo.com/Noticias/SaoPaulo/0,,AA1335284-5605,00.html&lt;br /&gt;&lt;br /&gt;http://www.tvcultura.com.br/reportereco/materia.asp?materiaid=440&lt;br /&gt;&lt;br /&gt;Foram anteriores ao acidente, para citar alguns exemplos. Aliás, Lygia Horta, citada nas reportagens, ajudou a fundar a Associação dos Moradores de Moema em 1986 para, entre outras coisas, reclamar do aeroporto.&lt;br /&gt;&lt;br /&gt;Mas, para falar em reclamações graúdas, que tal uma ação civil pública contra a Anac e a Infraero, onde vc poderá ler frases do tipo: “Quantas vidas mais serão colocadas em risco para que medidas efetivas e satisfatórias sejam tomadas? Quantos incidentes ainda terão que ocorrer para que as autoridades se conscientizem dos valores constitucionais máximos, dentre eles o direito à vida e à integridade física?” (p. 24)&lt;br /&gt;Vale lembrar q a ação foi movida em 24 de janeiro deste ano, ou seja, mais de 6 meses antes da tragédia.&lt;br /&gt;Veja o texto na íntegra aqui (aliás, vc pode ver no corpo do texto da ação, diversas notícias de jornais apontando problemas no aeroporto desde bem antes da tragédia):&lt;br /&gt;&lt;br /&gt;http://producao.prsp.mpf.gov.br/news/internews/intcong.pdf&lt;br /&gt;&lt;br /&gt;Resumo da ópera, de vez em quando falamos sem saber dos fatos. Isso pode acontecer com qualquer um, inclusive com o nosso querido Mino Carta. ;)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Conclusão... depois de postado isto, o blog não aceitou mais nenhum comentário exceto este:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;enviado por: Maurício Gil&lt;br /&gt;Conciso e preciso.&lt;br /&gt;Parabéns, mais uma vez.&lt;br /&gt;Em: 13/08/2007 11:43:53&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Mino/Narciso, cuidado para não se afogar nesse rio virtual chamado internet, onde há pouco ou nenhum lugar para aqueles que não aceitam críticas e sim apenas elogios...idéias refletidas no espelho de seu ego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5970056992982701472?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5970056992982701472/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5970056992982701472' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5970056992982701472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5970056992982701472'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2007/08/mino-carta-narciso-acha-feio-o-que-no.html' title='A Mino Carta: &quot;Narciso acha feio o que não é espelho&quot;'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-3619953806639140213</id><published>2007-08-10T08:10:00.000-07:00</published><updated>2008-07-18T06:31:01.810-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Biocombustíveis'/><category scheme='http://www.blogger.com/atom/ns#' term='Economia'/><title type='text'>O argumento anti-álcool</title><content type='html'>A &lt;a href="http://www.brasildefato.com.br/v01/agencia/internacional/a-internacionalizacao-do-genocidio"&gt;lógica contra a produção do álcool&lt;/a&gt; é mais ou menos a seguinte:&lt;br /&gt;&lt;br /&gt;Os produtores capitalistas, produtores do combustível de humanos e máquinas irão preferir vender combustível mais caro para os mais ricos do que comida barata para os mais pobres. Máquinas e homens irão competir por combustível... Mas enquanto os ricos terão dinheiro para comprar comida e combustível o que sobrará aos pobres!? Vale lembrar que não importa se a produção é de cana ou de milho, a competição é pela terra e não pelo grão. Ainda, mesmo que o país agrícola taxe o produtor de combustível de maneira diferenciada ao produtor de comida, o governo teria maiores dificuldades em repartir o "bolo", haja vista que os governos que temos não são as instituições mais eficientes e, além do que, a comida estará mais cara.&lt;br /&gt;&lt;br /&gt;Ora, esquecem os "amigos" comunistas que a venda de biocombustível dará aos países agrícolas uma oportunidade ímpar de participar da economia mundial como protagonistas, e não meros figurantes. Isso trará mais justiça à economia mundial (melhorará a distribuição de renda entre países ricos e pobres), mas é bom lembrar que o maior fator de atraso dos países do Terceiro Mundo, não é a ordem mundial. O biocombustível tornará os "países agrícolas" mais ricos porém não mais justos.&lt;br /&gt;&lt;br /&gt;Os governos dos países agrícolas terão mais trabalho em dividir a riqueza. Mas, seria este o grande mal? Parece discurso de governante incompetente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-3619953806639140213?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/3619953806639140213/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=3619953806639140213' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3619953806639140213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/3619953806639140213'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2007/08/o-argumento-anti-lcool.html' title='O argumento anti-álcool'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7625142089219834118.post-5564061679253615959</id><published>2007-08-10T06:24:00.000-07:00</published><updated>2007-08-10T06:31:35.913-07:00</updated><title type='text'>Initial Post</title><content type='html'>Apenas para avisar (aos desavisados) sobre o título: eu não pretendo colocar 42 opiniões neste blog. Nem, 42 opiniões em cada post. Nem um série de 2, 3 e 7 opiniões, etc, etc. Foi só uma forma de dizer que este blog não é sobre nada em específico  ao mesmo tempo que é sobre &lt;a href="http://en.wikipedia.org/wiki/The_Answer_to_Life,_the_Universe,_and_Everything"&gt;tudo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625142089219834118-5564061679253615959?l=42opinioes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://42opinioes.blogspot.com/feeds/5564061679253615959/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7625142089219834118&amp;postID=5564061679253615959' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5564061679253615959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7625142089219834118/posts/default/5564061679253615959'/><link rel='alternate' type='text/html' href='http://42opinioes.blogspot.com/2007/08/initial-post.html' title='Initial Post'/><author><name>Rodrigo di Lorenzo Lopes</name><uri>http://www.blogger.com/profile/15321938905440662162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_du5DCjwyc9c/S71iMLpWXrI/AAAAAAAAAN0/KAXwrsXoQiw/S220/Rodrigo_social_cinza3.png'/></author><thr:total>0</thr:total></entry></feed>
