<?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-10449143</id><updated>2011-11-08T23:47:52.342-03:00</updated><title type='text'>Comunidade Blastêmica</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10449143.post-619457496056572690</id><published>2007-07-24T18:03:00.000-03:00</published><updated>2007-07-24T18:05:50.847-03:00</updated><title type='text'>Mudei de casa</title><content type='html'>Ahá, e vc pensou que esse blog havia morrido, não era? Pois morreu mesmo. Esse é apenas um post para informar o endereço do meu novo blog:&lt;br /&gt;&lt;br /&gt;http://marcospereira.wordpress.com/&lt;br /&gt;&lt;br /&gt;Para aqueles que usam algum agregador de feeds, o novo endereço é:&lt;br /&gt;&lt;br /&gt;http://marcospereira.wordpress.com/feed/&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-619457496056572690?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/619457496056572690/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=619457496056572690' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/619457496056572690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/619457496056572690'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2007/07/mudei-de-casa.html' title='Mudei de casa'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-116981927355586015</id><published>2007-01-26T10:41:00.000-03:00</published><updated>2007-01-26T10:47:53.566-03:00</updated><title type='text'>Filosofia futil sobre ciência e sociedade</title><content type='html'>Penso que:&lt;br /&gt;&lt;br /&gt;No final do século XX e início do século XXI, ocorreram "&lt;em&gt;rupturas paradigmáticas&lt;/em&gt;" em diversas areas de conhecimento. Nestas se faz ciência. Como exemplo poso citar:&lt;br /&gt;1 - na física o determinismo newtoniano foi rompido pela mecãnica quântica (aliás, o conceito de informação e fluxo de informação nos micro sistemas [informação quântica] é algo que me facina, pois percebo, mas ainda não sei formular bem esse pensamento, que aí está a possibilidade real de se inquirir sobre o q é informação, e então, poder trazer o entendimento dessa essencia conceitual, para o macro mundo [inclua-se aqui, o campo de nossa atuação acadêmico-profissional].&lt;br /&gt;2 - na lógica matemática, Russel e Godel&lt;br /&gt;3 - na linguística Wittgenstein e Chomsky&lt;br /&gt;4 - na biologia Darwin (teoria da evolução - um livro q todo bibliotecário deve ler), além de Crick e Watson (DNA)&lt;br /&gt;5 - os sistemas dinâmicos foram rompidos pela teoria do caos&lt;br /&gt;6 - teoria da complexidade traz/dá um novo papel ao acaso, na teroia da evolução...&lt;br /&gt;7 - na &lt;span style="color:#000099;"&gt;Ciência da Informação (Capurro, Floridi, Ingwersen, Thelwall&lt;/span&gt; etc).&lt;br /&gt;&lt;br /&gt;Somado a essa "rupturas", tem-se uma nova visão de mundo, ou melhor, uma CRISE da visão dominante, refletida num espelho cruel onde fica claro o fracasso do capitalismo e do industrialismo (inclua-se o socialismo real), ao prover as soluções finais para os problemas cruciais da humanidade, tais como:&lt;br /&gt;- &lt;span style="color:#cc0000;"&gt;poluição do meio ambiente; exlusão social; inseguranaça do cidadão; ameaça (instabilidade) constante de desemprego; violência&lt;/span&gt;, dentre outros.&lt;br /&gt;Podemos acrescentar nessa linha de raciocínio, e perdoe-me pelos erros/abusos de análise, uma competição bárbara pelo controle da informação e do poder (capital), frustração com os ideais neoliberais e, por último, perda da utopia do socialismo soviético, ainda que resista um pouco em Cuba, por exemplo.&lt;br /&gt;&lt;br /&gt;Todas essas transformações são parte de um mesmo mundo, onde a ideologia que reflete os interesses dos grupos dominantes é hegemônica. E então perguntas: o que essa assertiva tem a ver com as "rupturas" descritas acima? Respondo.&lt;br /&gt;&lt;br /&gt;A visão de mundo dominante, no decorrer do tempo e espaço (num concepção histórica dos acontecimentos/eventos), acarreta na superestrutura cultural os parâmetros objetivos desse mundo, com sua base material e econômica e ordenção político-social. É nesse contexto que a ciência (processo científico), vai fornecer aos parâmetros objetivos "as ruputras paradigmáticas". Ou seja, o paradigma torna-se um tipo de subsídio, ferramenta. Estas vão se incorporar na visão de mundo (uma visão que penso ser ao mesmo tempo, local/individual e mundial/coletiva), e vão refletir nessa objetivação.&lt;br /&gt;&lt;br /&gt;Assim, quando um paradigma torna-se parte dessa visão dos mundos, termos um paradigma hegemônico, ideologicamente inserido na rede de relações humanas, passando a influenciar em diversas e distintas áreas desse relacionamento. E vou além. Penso que em breve, as concepções das teorias econômicas que regulam o mundo atualmente, dando suporte teórico ao capitalismo neoliberal, vão se despedaçar e dar vasão a um novo paradigma, muito complexo e, talvez, oriundo/influenciado pela interação [no sentido de complemento] entre várias áreas disciplinares (ex: biologia + física + ciência cognitiva].&lt;br /&gt;Mas ainda não esta muito claro para mim, quero dizer, como vão se relacionar essas disciplinas...&lt;br /&gt;&lt;br /&gt;Então, para concluir, quando comentei sobre as relações de poder, que estão em jogo, entre ciência [enquanto processo constante] e sociedade [todas as esferas], estava defendendo essa minha teoria maluca e, ainda, desprovida de rigor empírico. É isso.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Não sei para onde vou [estudos] e nem por quê.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Bem aventurado aquele(a) que na inutilidade de Ser alcança, pelo menos, uma banal utilidade&lt;/strong&gt;.&lt;/em&gt;&lt;br /&gt;Diego Salcedo&lt;br /&gt;Biblioteconomia - últimas disciplinas UFFFAAAA&lt;br /&gt;UFPE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-116981927355586015?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/116981927355586015/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=116981927355586015' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/116981927355586015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/116981927355586015'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2007/01/filosofia-futil-sobre-cincia-e.html' title='Filosofia futil sobre ciência e sociedade'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-114804537957147045</id><published>2006-05-19T10:24:00.000-03:00</published><updated>2006-05-19T10:29:39.586-03:00</updated><title type='text'>Foto e Fato</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/4819/1008/1600/BiliotecaNY_2006.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4819/1008/320/BiliotecaNY_2006.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Um dia comum na Biblioteca Pública de Nova York - Ilha de Manhattan - Estados Unidos.&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Haja PC´s.&lt;/span&gt;&lt;br /&gt;Não basta a quantidade infinita de livros que temos para "ler" numa vida.&lt;br /&gt;Encontramos uma forma a mais de sofrimento.&lt;br /&gt;Juntamos o PC e um livro, lado a lado.&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Haja frustração&lt;/span&gt;.&lt;br /&gt;Agora temos texto e hipertexto...&lt;br /&gt;Agora tenho absoluta certeza:&lt;br /&gt;&lt;strong&gt;o ser-humano, é completamente sem noção com relação a sua insignificância diante do seu ser&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Vos assina, Diego Salcedo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-114804537957147045?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/114804537957147045/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=114804537957147045' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114804537957147045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114804537957147045'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/05/foto-e-fato.html' title='Foto e Fato'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-114437525633249349</id><published>2006-04-06T22:53:00.000-03:00</published><updated>2006-04-06T23:00:56.346-03:00</updated><title type='text'>XP, Seu nogueira e algumas lendas.</title><content type='html'>Como eu disse &lt;a href="http://blastemica.blogspot.com/2005/02/desenvolvimento-do-conhecimento.html"&gt;num post já bem antigo&lt;/a&gt; aqui do blastemica, o povo de computação sempre dá um jeito de ligar acontecimentos a algo relacionado a... ora bolas, computação. Foi o sentimento que tive ao ler &lt;a href="http://thiagoarrais.blogspot.com/2006/04/seu-nogueira_06.html"&gt;esse divertido, lendário e, como sempre, interessante post&lt;/a&gt; do &lt;a href="http://thiagoarrais.blogspot.com"&gt;Thiago Arrais&lt;/a&gt;. Não poderia deixar de fazer uma menção aqui.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-114437525633249349?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/114437525633249349/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=114437525633249349' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114437525633249349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114437525633249349'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/04/xp-seu-nogueira-e-algumas-lendas.html' title='XP, Seu nogueira e algumas lendas.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-114305457981378345</id><published>2006-03-22T15:52:00.000-03:00</published><updated>2006-04-05T00:29:15.903-03:00</updated><title type='text'>APIs que não mordem.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.flickr.com/44/118491000_73ff4d44ab.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://static.flickr.com/44/118491000_73ff4d44ab.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Desde que comecei a programar em &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; ou outras linguagens de script, como &lt;a href="http://php.net/"&gt;php&lt;/a&gt;, por exemplo, penso sobre como essas linguagens possuem APIs bem simples e diretas de usar. Nada de muitos passos para realizar operações relativamente simples, as interfaces são mais diretas e geralmente invocar um método resolve o problema, ou boa parte dele. Mais ou menos como mostrei em &lt;a href="http://blastemica.blogspot.com/2005/12/ruby-no-tempo-livre.html"&gt;um post anterior&lt;/a&gt; que apresenta, em 5 linhas, como fazer um leitor de &lt;a href="http://pt.wikipedia.org/wiki/RSS"&gt;RSS&lt;/a&gt; em Ruby. Nos ultimos dias, depois de ter conversas com &lt;a href="http://thiagoarrais.blogspot.com/"&gt;Thiago Arrais&lt;/a&gt; e com Gandhi sobre esse assunto, resolvi ler (&lt;a href="http://www.martinfowler.com/bliki/HumaneInterface.html"&gt;aqui&lt;/a&gt;, &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;entry=3311314085"&gt;aqui&lt;/a&gt;, &lt;a href="http://beust.com/weblog/archives/000346.html"&gt;aqui&lt;/a&gt; e &lt;a href="http://www.cafeaulait.org/oldnews/news2005December6.html"&gt;aqui&lt;/a&gt;) o que povo tem comentado sobre APIs, apenas para tentar formar uma opinião mais fundamentada. Também tentei ler algumas APIs em Java para fazer algumas operações que considero bastante diretas, como ler um RSS ou fazer o parse de um arquivo &lt;a href="http://yaml.org/"&gt;YAML&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Enquanto lia, constatei que a comunidade Java realmente cria ótimas APIs, boa parte pode servir como exemplo/estudo para programação e design patterns. Pode-se encontrar ótimo design em APIs como a de Collections ou IO, em um número bastante vasto de projetos open source e por aí vai. Mas, geralmente, as APIs em Java pecam por se utilizarem demais de expressões que se tornaram idiomaticas para a linguagem, ou pecam pelo excesso de zelo para escrever APIs que possam ser expandidas de acordo com a necessidade o que, de fato não as impede de ser simples. Um fato engraçado é como nem sempre as pessoas percebem que criam complicações desnecessarias. Exemplo: esses dias procurava por uma API para fazer o parse de arquivos YAML, se fizesse uma correspondencia direta do formato de um arquivo para a estrutura de uma classe, acharia perfeito. Eis que me deparo com a &lt;a href="http://yaml4j.sourceforge.net/"&gt;yaml4j - a YAML Loader/Dumper for Java&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;For those of us who wish Java were agile&lt;/span&gt;. O "agile", deixe-me explicar, fica por conta da discussão entre o formato yaml e xml. O primeiro exemplo da API é simples:&lt;br /&gt;&lt;pre&gt;File f = new File(args[0]);&lt;br /&gt;Reader reader = new BufferedReader(new FileReader(f));&lt;br /&gt;Loader loader = new Loader();&lt;br /&gt;loader.load( reader );&lt;br /&gt;&lt;br /&gt;Object doc = loader.getDocument();&lt;/pre&gt;Claro, não vou colocar os imports e tudo mais, apenas o uso mais direto. Nada demais, certo? Errado! O yaml4j peca por me fazer criar objetos dos quais eu não quero saber, apenas para dar suporte a interface provida, ou melhor para superar a barreira criada pela interface não oferecida. O que eu realmente gostaria de fazer é:&lt;br /&gt;&lt;pre&gt;Loader loader = new Loader();&lt;br /&gt;loader.load("C:/my_file.yml");&lt;br /&gt;Object doc = loader.getDocument();&lt;/pre&gt;Ou mais direto ainda:&lt;br /&gt;&lt;pre&gt;Object doc = Loader.load("C:/my_file.yaml");&lt;/pre&gt;É provavel que muita gente diga que aí eu não poderia usar outros tipos de Reades, ou seja lá o que for, para fazer o load do arquivo. Não é verdade, simplesmente. Não o é porque quero apenas uma interface mais direta e não uma mais resumida, por mim o exemplo anterior poderia existir à vontade, mas a API deveria me prover métodos mais diretos. Outros com certeza dirão que, por ser código Java, eu poderia criar uma pequena extensão para a API, parar de reclamar e resolver o problema. Também não é verdade, ao menos para mim, pois estou preocupado em resolver os problemas do meu dominio e não em escrever linhas e mais linhas para dar suporte a API.&lt;br /&gt;&lt;br /&gt;O ponto realmente é: se algo tem chance de ser usado com uma freqüência muito grande, vale a pena livrar as classes clientes da tralha, esconder a complexidade e prover uma interface para operações mais diretas. Exatamente assim:&lt;br /&gt;&lt;pre&gt;require 'yaml'&lt;br /&gt;doc = YAML::load(File.open('C:/my_file.yml'))&lt;/pre&gt;Ou, para ninguém ficar na bronca, para não pensarem que quero ver Java morta e enterrada, um exemplo da APIs que usei (alterei apenas para facilitar a leitura, mas perceba: é um correspondente direto para o código em Ruby):&lt;br /&gt;&lt;pre&gt;File file = new File("ReceiptEntry.yml");&lt;br /&gt;Entry entry = Yaml.loadType(file, Entry.class);&lt;/pre&gt;Um outro exemplo para mim é o &lt;a href="http://www.mentaframework.org/"&gt;Mentawai&lt;/a&gt;, apesar de o último release apresentar bons métodos para facilitar o uso do ActionConfig, poderia prover métodos como addForward, addRedirect, addNull. São consequences muito usados, então, por que não facilitar a vida? O addConsequence continua para permitir consequences customizadas.&lt;br /&gt;&lt;br /&gt;Enfim, boa parte dos desenvolvedores Java - outras linguagens também, eu sei - deveria aprender a manter as APIs que desenvolvem tão simples quanto possível, mesmo que isso implique a criação de metodos a mais, um pouco de esperteza vai evitar copy and paste. Isso vale para desenvolvimento de classes que não formam uma API propriamente dita, mas que podem muito bem oferecer uma interface mais amigavel. As APIs nem sempre precisam estar prontas para salvar o mundo, às vezes precisam apenas carregar um arquivo YAML.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-114305457981378345?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/114305457981378345/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=114305457981378345' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114305457981378345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114305457981378345'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/03/apis-que-no-mordem.html' title='APIs que não mordem.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-114299584560617359</id><published>2006-03-21T23:38:00.000-03:00</published><updated>2006-03-22T00:17:12.200-03:00</updated><title type='text'>Adeus avatares a lá Orkut.</title><content type='html'>&lt;div style="text-align: justify;"&gt;Há algum tempo, um usuario do &lt;a href="http://www.javafree.org/"&gt;JavaFree&lt;/a&gt; reclamou &lt;a href="http://www.javafree.org/javabb/viewtopic.jbb?t=854185"&gt;no forum&lt;/a&gt; que o esquema de cores, mais as fotografias, davam a impressão para as pessoas do trabalho de que ele estava perdendo tempo no orkut. Na época eu lembro que pensei imediatamente no Greasemonkey e em como poderia criar um script para remover as tais fotos. Pois é, como eu vivo reclamando da falta de tempo, aproveitei o dia livre - maldita dor de cabeça - para &lt;a href="http://diveintogreasemonkey.org/"&gt;ler sobre o greasemonkey&lt;/a&gt; e tentar fazer alguns scripts com utilidade pública.&lt;br /&gt;&lt;br /&gt;O primeiro foi para remover as  fotografias no forum do JavaFree. O trabalho foi minimo, especialmente depois de colocar &lt;a href="http://www.squarefree.com/bookmarklets/webdevel.html"&gt;um shell e o jsenv&lt;/a&gt; entre os meus bookmarks. Incrivel como o povo inventa utilidades para o desenvolvimento web. Mas, fim de papo, quem quiser instalar o script e se livrar dos avatares, vai precisar instalar o &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; - que? Ainda não usa? Eis mais um bom motivo! - &lt;a href="http://greasemonkey.mozdev.org/"&gt;Greasemonkey&lt;/a&gt; e depois o script. Absolutamente tranquilo! Para quem já usa o Firefox e o Greasemonkey, &lt;a href="http://www.cin.ufpe.br/%7Emsp/javafree/RemoveAvatares.user.js"&gt;clique com o direito aqui&lt;/a&gt; e seja mais feliz por não precisar aturar meu avatar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 1&lt;/span&gt;: Depois eu tento ver porque ele só remove depois que a pagina carrega.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 2&lt;/span&gt;: Segundo &lt;a href="http://www.mozdev.org/pipermail/greasemonkey/2006-February/007747.html"&gt;essa discussão&lt;/a&gt; na lista do Greasemonkey, não dá para impedir que as imagens sejam mostradas, porque o script executa apenas depois de toda a arvore DOM ser montada. Enquanto isso, o browser faz as requisições para mostrar as imagens. Verei se há alguma maneira de contornar isso.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-114299584560617359?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/114299584560617359/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=114299584560617359' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114299584560617359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/114299584560617359'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/03/adeus-avatares-l-orkut.html' title='Adeus avatares a lá Orkut.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113858021314322546</id><published>2006-01-29T21:14:00.000-03:00</published><updated>2006-03-21T17:48:08.063-03:00</updated><title type='text'>Plugins, tags e extensões</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uma das maneiras recentes mais legais de se catalogar informação é usar &lt;a href="http://en.wikipedia.org/wiki/Tags"&gt;tags&lt;/a&gt; que podem ser livremente criadas pelos usuários (exemplos: &lt;a href="http://www.technorati.com/tags/"&gt;aqui&lt;/a&gt;, &lt;a href="http://del.icio.us/tag/"&gt;aqui&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/tags/"&gt;aqui&lt;/a&gt; e aqui). Tags são um dos destaques, a meu ver, um dos mais interessantes, do que se convencionou chamar de &lt;a href="http://www.google.com/search?q=web+2.0"&gt;web 2.0&lt;/a&gt;. Antes, o que havia era um conjunto de categorias (exemplos &lt;a href="http://dir.yahoo.com/"&gt;aqui&lt;/a&gt; e &lt;a href="http://directory.google.com/"&gt;aqui&lt;/a&gt;), na maior parte das vezes hierárquicas, criadas por algum administrador da vida e vc precisava, mesmo a contragosto, usar algum ponto da hierarquia. Com tags não. Agora vc categoriza, ou melhor rotula, a informação de acordo com &lt;a href="http://en.wikipedia.org/wiki/Taxonomy"&gt;a sua percepção sobre ela&lt;/a&gt;. E o melhor, pode compartilhar da percepção que as outras pessoas têm, tanto as que coincidem com as suas quanto as que não. Enfim, tags são um desenvolvimento porque agora as pessoas podem criar as classificações segundo as suas necessidades e vontades.&lt;br /&gt;&lt;/div&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt; Vejo isso em &lt;a href="http://www.google.com/search?q=plugins+architecture"&gt;arquiteturas que permitem o uso de plugins/extensões&lt;/a&gt; também. Agora eu não uso apenas software exatamente como ele vem - &lt;i&gt;out-of-the-box&lt;/i&gt; - posso eu mesmo criar extensões de acordo com necessidades bastante particulares. Dos softwares que já usei, um dos primeiros, ao menos que eu me lembre, com esse tipo de funcionalidade era o &lt;a href="http://www.winamp.com/"&gt;Winamp&lt;/a&gt;. Agora, para mim, um dos melhores exemplos é o &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;, o tal browser que incomoda a liderança menos folgada do &lt;a href="http://www.microsoft.com/windows/ie/"&gt;Internet Explorer&lt;/a&gt;. E das tantas - e úteis - &lt;a href="https://addons.mozilla.org/extensions/?application=firefox"&gt;extensões para o Firefox&lt;/a&gt;, uma que me chama a atenção ainda mais é o &lt;a href="http://greasemonkey.mozdev.org/"&gt;Greasemonkey&lt;/a&gt; porque leva adiante o conceito de extensão. Vejo o Greasemonkey praticamente como uma extensão que permite criar extensões.&lt;br /&gt;&lt;br /&gt;É uma daquelas sacadas bem geniais e, como boa parte das idéias geniais, se baseia em um conceito simples: que tal alterar as paginas que vc usa com freqüência? Colocar os links que vc mais usa e não aparecem de imediato, botões para ações comuns, remover partes da pagina que vc não usa, mudar o tamanho das letras, remover propagandas inconvenientes, enfim, o que fazer fica a seu critério. Isso tudo com &lt;a href="http://www.userscripts.org/"&gt;scripts escritos em JavaScript&lt;/a&gt; (se vc for um programador, &lt;a href="http://diveintogreasemonkey.org/"&gt;clique aqui&lt;/a&gt;), o bom conceito de &lt;a href="http://blastemica.blogspot.com/2005/06/seja-compativel.html"&gt;se manter compatível com o que já existe&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt; O tal do Greasemonkey é bom ao ponto de mudar minha visão preconceituosa sobre JavaScript - depois de &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; a linguagem que mais desperta minha curiosidade, para ir alem de apenas validar formularios ou outras funcionalidades mais simples. Mas isso é outra história, preciso criar coragem para começar a escrever um post sobre APIs para daqui a pouco.&lt;br /&gt;&lt;/p&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113858021314322546?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113858021314322546/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113858021314322546' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113858021314322546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113858021314322546'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/01/plugins-tags-e-extenses.html' title='Plugins, tags e extensões'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113685437769335609</id><published>2006-01-09T21:52:00.000-03:00</published><updated>2006-01-09T21:52:57.706-03:00</updated><title type='text'>Não tem quem aguente!!!</title><content type='html'>Hoje fui comprar um livro.&lt;br /&gt;Abaixo do livro que compraria observei um outro livro:&lt;br /&gt;Título: Tesauros (aliás, o único titulo que se encontra a venda em todas as livrarias do Recife sobre esse tema específico).&lt;br /&gt;Até aqui tudo bem. Exceto que, eu estava na área de Física Quântica e Química.&lt;br /&gt;O livro sobre Tesauros estava na área de Química desta livraria, a qual faz parte de uma rede de âmbito nacional.&lt;br /&gt;&lt;br /&gt;Pensei!!! Está aqui por engano? Ou será que está classificado para vender assim?&lt;br /&gt;O que fazer? Deixo onde está ou investigo o por que deste equívoco?&lt;br /&gt;Como sou um graduando em biblioteconomia pensei: eu sei que está errado, mas como corregir o erro sem ser chato ou inconveniente? Como abordar um erro e dele chegar ao acerto?&lt;br /&gt;&lt;br /&gt;Chamei um vendedor e perguntei: olha, posso lhe fazer uma sugestão?.&lt;br /&gt;Ele respondeu: pois não Sr. E tirou o livro das minhas mãos.&lt;br /&gt;Eu pedi licença, e tomei o livro de volta. Avisei que não queria comprar e nem ver preço, apenas gostaria de constatar um fato.&lt;br /&gt;&lt;br /&gt;Então lhe disse: Este livro não é da área de Química.&lt;br /&gt;Ele respondeu: Na etiqueta vem dizendo Química (manuscrito ao lado do preço).&lt;br /&gt;Eu indaguei: Se eu lhe disser que Tesauro não tem nada a ver com Química e que este livro está à venda na prateleira equivocada?&lt;br /&gt;O vendedor respondeu: Olha Sr., aqui na etiqueta diz que trata de Química.&lt;br /&gt;Então eu sugeri que ele abrisse o livro e desse uma olhada mais detalhada.&lt;br /&gt;Fez um gesto com os ombros, como quem não entendeu minha intenção.&lt;br /&gt;Então fui mais além e sugeri que lesse as palavras chaves contidas na ficha catalográfica.&lt;br /&gt;&lt;br /&gt;Assim que leu as palavras chaves, pediu para que eu o acompanhasse a um computador.&lt;br /&gt;Digitou o título do livro e então, para minha supresa, no sistema de informação desta livraria de âmbito nacional o livro constava como parte integrante da área de Química.&lt;br /&gt;&lt;br /&gt;O vendedor me perguntou: Na etiqueta diz Química e no sistema também. Por que o Sr. diz que está no lugar errado?&lt;br /&gt;Eu respondi: quem sou eu para contrariar o sistema de informação desta mega loja e sua forma de classificar os livros?&lt;br /&gt;e continuei: mas, se lhe interessar aprender um pouquinho mais sobre Tesauros e Química, lhe sugiro que leia a introdução do livro, enquanto não tiver que atender um cliente.&lt;br /&gt;Assim terminamos nosso diálogo e me dirigi ao caixa para comprar meu livro de Física Quântica.&lt;br /&gt;&lt;br /&gt;Já saindo da loja, uma pessoa me para. Era o vendedor.&lt;br /&gt;Ele me disse: Obrigado Sr., pela dica. Quando li a introdução, verifiquei que não tem nada a ver com Química e sim com Linguagem e Documentação.&lt;br /&gt;Pensei: Menos mal.&lt;br /&gt;Apertei a mão do vendedor e lhe disse: Lembre-se de mudar no sistema, senão de nada adiantou a nossa intervenção.&lt;br /&gt;Ele respondeu: Vou fazer isso agorinha, Sr. Mas antes tenho que notificar o escritório central. Obrigado.&lt;br /&gt;Eu lhe respondi: não por isso.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Bem aventurado aquele(a) que na inutilidade de Ser alcança, pelo menos, uma banal utilidade&lt;/em&gt;.&lt;br /&gt;&lt;strong&gt;Diego Salcedo&lt;/strong&gt; - &lt;a href="http://www.ufpe.br"&gt;UFPE&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113685437769335609?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113685437769335609/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113685437769335609' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113685437769335609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113685437769335609'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2006/01/no-tem-quem-aguente.html' title='Não tem quem aguente!!!'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113591316372952981</id><published>2005-12-30T00:18:00.000-03:00</published><updated>2005-12-30T00:26:55.833-03:00</updated><title type='text'>Adeus ano velho...</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7510/808/1600/2006_fire.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/7510/808/200/2006_fire.jpg" alt="" border="0" /&gt;&lt;/a&gt;Feliz 2006! Sim eu sei que ainda não chegou, mas ninguém espera que eu vá bloggar durante a virada de ano, então, antes de viajar para Pipa - estou com preguiça de procurar algo no google para linkar, se vira! - ficam os votos para um ano melhor do que 2005, para todos vocês três, meus caros leitores.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Espero uma boa festa em Pipa, até porque, veja bem, apesar de nunca ter ido lá, nem ser lá, nem ir para ficar, sempre me falam bem, então as expectativas são as melhores possiveis. Blog novamente apenas lá para o dia 4 de janeiro de 2006 quando volto a falar sobre qualidade de código, sobre Ruby ou qualquer outra lombra/lenda/mito que atraia meu interesse.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113591316372952981?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113591316372952981/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113591316372952981' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113591316372952981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113591316372952981'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/12/adeus-ano-velho.html' title='Adeus ano velho...'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113582059414576889</id><published>2005-12-28T22:03:00.000-03:00</published><updated>2006-04-04T19:56:19.003-03:00</updated><title type='text'>Ruby no tempo livre.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7510/808/1600/pieceofcake.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/7510/808/320/pieceofcake.jpg" alt="" border="0" /&gt;&lt;/a&gt;Eu falei de &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; apenas &lt;a href="http://blastemica.blogspot.com/2005/06/ruby-on-rails-embasbacante.html"&gt;uma vez no blog&lt;/a&gt; até agora, na verdade, não diretamente de Ruby, e não escrevi nada mais do que algumas linhas embasbacadas por&lt;a href="http://media.nextangle.com/rails/rails_setup.mov"&gt; um video&lt;/a&gt; do &lt;a href="http://www.rubyonrails.org/"&gt;RoR&lt;/a&gt;. De lá para cá, no tempo livre, parei para estudar um pouco sobre a linguagem e sempre fica aquela impressão de "não pode ser, só isso?" ou "hum, interessante". Esses dias enquanto fuçava no repositorio remoto do gem em busca de alguma biblioteca para rss - sei lá porque rss, oras - encontrei o &lt;a href="http://simple-rss.rubyforge.org/"&gt;Simple-RSS&lt;/a&gt; (para instalar &lt;a href="http://docs.rubygems.org/"&gt;gem&lt;/a&gt; install simple-rss), e convenhamos, o "simple" no nome é bem justificado. Para testar, resolvi ler o &lt;a href="http://www.javafree.org/javabb/rss/newPosts.jbb"&gt;rss dos novos posts&lt;/a&gt; &lt;a href="http://www.javafree.org/javabb/forum.jbb"&gt;no forum&lt;/a&gt; do &lt;a href="http://www.javafree.org/"&gt;JavaFree&lt;/a&gt;. Nada de muito complicado, apenas acessar o rss, iterar sobre as entradas e mostrar os titulos dos posts. O código, gigantesco, 5 linhas, um absurdo, ficou assim:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;require 'rubygems'&lt;br /&gt;require 'simple-rss'&lt;br /&gt;require 'open-uri'&lt;br /&gt;rss = SimpleRSS.parse open('http://www.javafree.org/javabb/rss/newPosts.jbb')&lt;br /&gt;rss.channel.entries.each {|e| puts e.title}&lt;br /&gt;&lt;/pre&gt;Nem quero imaginar como fazer um leitor RSS em  Java. De qualquer modo, claro, uma ajudinha das closures, ausentes em Java, não fazem mal a ninguém. Por fim, nada de RoR, por enquanto, já que quero aprender Ruby para valer e depois sim usar o framework com alguns "add-ons". Os planos são fazer uma serie de exemplos simples e praticos até me sentir à vontade com a sintaxe. A proposito, acho que um livro não vai fazer mal.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113582059414576889?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113582059414576889/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113582059414576889' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113582059414576889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113582059414576889'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/12/ruby-no-tempo-livre.html' title='Ruby no tempo livre.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113553451917229326</id><published>2005-12-25T15:08:00.000-03:00</published><updated>2005-12-25T15:29:08.303-03:00</updated><title type='text'>Boas novas!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7510/808/1600/natal.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/7510/808/320/natal.jpg" alt="" border="0" /&gt;&lt;/a&gt;Eis que chega o fim do ano, mais um, e espero que muitos outros fins de ano cheguem. Como de praxe, não fiz tudo que queria, tudo que poderia, mas fiz muita coisa boa esse ano, então, sem lamentações, muito menos promessas para ser mais isso menos aquilo ano que vem.&lt;br /&gt;&lt;br /&gt;Se fosse fazer uma promessa seria a de ler mais, nada de livros técnicos, ou eles também. Apenas ler mais. Para não me esticar muito nesse post, afinal, fim de ano sempre se tem algo melhor para fazer do que postar em um blog, fica o Feliz Natal para todas as três pessoas que lêem os desvaneios publicados por aqui e os outros 2 que acessam para se certificarem de que eu continuo falando besteira, não tanta ainda, afinal falta tempo, fazer o que. Feliz Natal a todos, Feliz Ano novo e bla bla bla.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113553451917229326?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113553451917229326/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113553451917229326' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113553451917229326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113553451917229326'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/12/boas-novas.html' title='Boas novas!'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113504952672563586</id><published>2005-12-19T23:57:00.000-03:00</published><updated>2005-12-25T15:20:05.946-03:00</updated><title type='text'>Por um codigo melhor - II</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7510/808/1600/scared.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/7510/808/320/scared.jpg" alt="" border="0" /&gt;&lt;/a&gt;No post anterior eu postei alguns dos erros que mais me irritam quando leio código alheio. Na verdade, não chega a ser irritação de fato, se fosse não me surpreenderia se fosse diagnosticado com ulcera ou coisa pior. Penso apenas que talvez, com um pouco de pair programming, o autor provavelmente não teria cometido tais erros, ou talvez tivesse cometido menos erros. Essa segunda parte não é muita coisa além de adições de novas dicas esquecidas no post anterior. Na verdade, eu estava com preguiça, mas enfim... vamos a outras dicas para evitar que seu código dê mais trabalho do que deveria e, acredite, se vc comete esse tipo de erros, ele vai dar mais trabalho do que deveria:&lt;br /&gt;&lt;br /&gt;1. Exceptions são um fluxo à parte e não o principal. Mas que espécie de dica é essa? Todo mundo já sabe disso, o nome já explica, ora bolas. É, explica, mas não impede ninguém de escrever algo assim:&lt;br /&gt;&lt;pre&gt;public int foo(int num) {&lt;br /&gt; if(num &gt; 50) {&lt;br /&gt;&lt;br /&gt;     //faz um monte de coisas complicadas com num&lt;br /&gt;     //até chegar a um "resultado"&lt;br /&gt;&lt;br /&gt;     return resultado;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; throw new IllegalArgumentException("num deve ser maior do que 50");&lt;br /&gt;}&lt;/pre&gt;Estranho porque o fluxo que realiza a operação é tratado como secundário, à parte, ele é quem faz parte do desvio e não a exception. Esse exemplo - lembre-se, sou péssimo para exemplos - pode não parecer tão ruim, mas experimente lidar com mais de uma exception dessa maneira para vermos no que acontece:&lt;br /&gt;&lt;pre&gt;public int foo(int num) {&lt;br /&gt; if(num &gt; 50) {&lt;br /&gt;&lt;br /&gt;     if(num%2 == 0) {&lt;br /&gt;&lt;br /&gt;         // faz um monte de coisas complicadas com num&lt;br /&gt;         // até chegar a um "resultado"&lt;br /&gt;         return resultado;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     throw new IllegalArgumentException("num deve ser par");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; throw new IllegalArgumentException("num deve ser maior do que 50");&lt;br /&gt;}&lt;/pre&gt;Agora sim é possível perceber o problema com esse tipo de abordagem. Afinal, a grande questão é, porque as pessoas cometem esse tipo de erro? Pergunta retórica apenas. Exceptions, claro, devem ser tratadas em fluxos à parte, ou seja, se uma pré-condição não for satisfeita, uma exception devem ser lançada:&lt;br /&gt;&lt;pre&gt;public int foo(int num) {&lt;br /&gt;&lt;br /&gt; // eu sei que não é assim, mas o maldito do blogger não sabe!&lt;br /&gt; if(num menorOuIgual 50) {&lt;br /&gt;     throw new IllegalArgumentException("num deve ser maior do que 50");&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; if(num%2 != 0) {&lt;br /&gt;     throw new IllegalArgumentException("num deve ser par");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // faz um monte de coisas complicadas com num&lt;br /&gt; // até chegar a um "resultado"&lt;br /&gt; return resultado;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;Se vc ainda não se convenceu a escolher a segunda abordagem, experimente colocar uma nova pré-condição em cada um dos trechos e veja em qual faz isso de modo mais prático. Hoje, mesmo que ainda precise falar outras coisas sobre exception, fica apenas essa dica.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113504952672563586?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113504952672563586/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113504952672563586' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113504952672563586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113504952672563586'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/12/por-um-codigo-melhor-ii.html' title='Por um codigo melhor - II'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113462140265502170</id><published>2005-12-15T01:29:00.000-03:00</published><updated>2005-12-25T15:28:15.453-03:00</updated><title type='text'>Por um codigo melhor I</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7510/808/1600/ugly.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/7510/808/320/ugly.jpg" alt="" border="0" /&gt;&lt;/a&gt;Se vc é programador, mesmo sem nunca ter lido algum livro sobre refactoring[1], é bem provável que já tenha reescrito algum trecho de código para melhorá-lo, torná-lo mais legível, rápido, ou seja lá o que for. Refactoring é uma das práticas mais comuns em metodologias ágeis[2] porque, geralmente, metodologias ágeis estão preocupadas com a qualidade dos artefatos mais importantes e imprescindíveis. E, claro, em desenvolvimento de software, pouca coisa é realmente mais imprescindível do que o próprio código, afinal, código é o artefato sempre presente. Daí haver a necessidade de torná-lo tão legível quanto o possível para que ele represente um "documento" sobre o sistema. Refactoring também entra aí: arrumar a casa e fazer todos entenderem o propósito do código - ou seja, como citei logo acima, fazer um punhado de instruções funcionarem como um "documento" do sistema. Mas, nesse posts, não vou falar especificamente sobre um catalogo de refactoring, se quiser ler algum, nada mais recomendado do que o livro do Fowler[3]. Também vou passar ao largo de definições mais aprumadas sobre o refatoração de código ou explicações de como test unitários[4] permitem reescrever o código de maneira segura.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Minha intenção com esse post é citar algumas dicas para evitar código ruim logo de primeira. Isso não vai lhe eximir completamente de reescrever uma parte ou outra enquanto o sistema evolui, isso é natural. Minha pretensão é evitar que vc pense em trucidar alguém - talvez vc mesmo, talvez eu - quando precisa refatorar partes do software. Vamos as dicas:&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Dê nomes entendíveis a seus pacotes, classes, métodos e variáveis&lt;/span&gt;. Nomes entendíveis também passam pelo conhecimento comum entre os desenvolvedores[5]. Se for costume chamar um método que soma valores de "add", não tente usar algo como "xyz". Em suma essa dica se resume a fazer as pessoas com conhecimento do domínio reconhecerem o propósito da classe/metodo/variavel apenas pelo nome. Exemplos bobos - em Java - de como não fazer:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void copy(File x, File y);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public long diff(Date d1, Date d2);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Dã, essa ficou fácil copia um arquivo para outro e vê a diferença entre as datas. Não? Não estava tão claro assim. Hum, e se eu tentar assim:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void copy(File source, File destination);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public long diffInSeconds(Date inicio, Date fim);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Melhor, agora vc sabe qual arquivo é copiado para onde, sabe qual é a data de origem e qual a final e sabe que a diferença é em segundos. Mesmo em um exemplo tão trivial dá para perceber como escolher bem os nomes ajuda a tornar o código mais legível.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;2. &lt;span style="font-weight: bold;"&gt;Transforme operações pouco claras em métodos com nomes - ah, os nomes - que identifiquem melhor a operação&lt;/span&gt;. Mesmo em alguns casos aparentemente simples isso pode ajudar um bocado. Por exemplo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String id = "A@1232143245547657465";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(id.charAt(0) == 'A') {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // algumas linhas antes - bastam 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Permissoes p = getPermissoesAdmin();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nessa situação vc pode perceber que 1) a operação é simples mas não está clara para quem bate o olho sobre o código e 2) eu sou péssimo para dar exemplos. Deixe-me tentar novamente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;double precoFinal = preco + preco * (17/100) - 10;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tá, desisto de dar bons exemplos, vamos ao que interessa: tornar os dois trechos mais fáceis de entender. Primeiro, vamos transformar a operação do if em um método e depois usar a dica 1 para facilitar ainda mais a minha vida no futuro. Então, o código será:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String userId = "A@1232143245547657465";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(isAdministrador(userId)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // algumas linhas antes - bastam 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Permissoes permissoes = getPermissoesAdministrativas();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;private boolean isAdminitrador(String userId) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    return id.charAt(0) == 'A';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Talvez vc ache que estou forçando a escrita de mais código, mas, na verdade, melhorei a legibilidade e permiti que a operação para indicar permissões administrativas seja tratada em um único ponto. Já o segundo exemplo, ficaria melhor assim:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;double precoFinal = precoComTaxasDescontos(preco);&lt;br /&gt;&lt;br /&gt;private double precoComTaxasDescontos(double preco) {&lt;br /&gt;double imposto = preco * (17/100);&lt;br /&gt;double desconto = 10;&lt;br /&gt;return (preco + imposto - desconto);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Você até pode ter pensado no aumento de código, mas há, em sistemas reais, vantagens menos perceptíveis, ao menos nesses exemplos, como aplicar o conceito de DRY[6].&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Remova a complexidade das classes clientes para os métodos que elas usam&lt;/span&gt;. Isso faz com que o código nas classes clientes esteja preocupado com suas próprias operações, e não em dar suporte as operações dos métodos que elas usam. Exemplo bobo - mas (quase) real dessa vez:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int idBah = bah.getId();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int numBah = bah.getNum();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String name = foo.getName();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;long somethingId = foo.getSomething().getId();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;facaAlgo(idBah, numBah, name, somethingId);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ruim, muito ruim. Imagine 10 classes clientes, pense na repetição de código e... ...isso mesmo, refatore para trazer a complexidade para o método assim:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void facaAlgo(Bah bah, Foo foo) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    int idBah = bah.getId();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    int numBah = bah.getNum();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String name = foo.getName();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    long somethingId = foo.getSomething().getId();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // faz o treco&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E a classe cliente, bem mais aliviada:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;facaAlgo(bah, foo);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bom, sem mais dicas por enquanto. Alias, eu gostaria de ouvir as de vcs. Quais as dicas, bastante práticas, se possível, para tornar meu código um pouco menos fedorento?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Referências:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;[1] - &lt;a href="http://www.refactoring.com/catalog/"&gt;Refactorings in Alphabetical Order&lt;/a&gt;&lt;br /&gt;[2] - &lt;a href="http://www.google.com/search?q=agile+methodologies"&gt;Google - Agile Methodologies&lt;/a&gt;&lt;br /&gt;[3] - &lt;a href="http://www.amazon.com/gp/product/0201485672/002-1517520-5373669?v=glance&amp;n=283155"&gt;Refactoring: Improving the Design of Existing Code - Martin Fowler&lt;/a&gt;&lt;br /&gt;[4] - &lt;a href="http://www.junit.org/index.htm"&gt;JUnit, Testing Resources for Extreme Programming&lt;/a&gt;&lt;br /&gt;[5] - &lt;a href="http://java.sun.com/docs/codeconv/"&gt;Code Conventions for the Java Programming Language&lt;/a&gt;&lt;br /&gt;[6] - &lt;a href="http://c2.com/cgi/wiki?DontRepeatYourself"&gt;Don't Repeat Yourseft&lt;/a&gt;&lt;br /&gt;[7] - &lt;a href="http://www.joelonsoftware.com/articles/Wrong.html"&gt;Making Wrong Code Look Wrong&lt;/a&gt;&lt;br /&gt;[8] - &lt;a href="http://www.guj.com.br/posts/list/34017.java"&gt;Padrões de Nomenclatura - Forum GUJ&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0201485672/002-1517520-5373669?v=glance&amp;amp;n=283155"&gt;&lt;/a&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113462140265502170?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113462140265502170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113462140265502170' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113462140265502170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113462140265502170'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/12/por-um-codigo-melhor-i.html' title='Por um codigo melhor I'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-113177142127437111</id><published>2005-11-12T01:55:00.000-03:00</published><updated>2005-11-12T02:00:35.496-03:00</updated><title type='text'>De volta a ativa.</title><content type='html'>Post, só para avisar que esse blogueiro vai voltar a ativa e escrever suas impressões atuais sobre trabalho, tecnologia, programação, mudanças e outras coisas. Fim desse post.&lt;br /&gt;&lt;br /&gt;ps.: Sim, vou tentar fazer Diego Salcedo voltar a escrever aqui também. Especialmente, se conseguirmos escrever juntos, vai ser melhor ainda.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-113177142127437111?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/113177142127437111/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=113177142127437111' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113177142127437111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/113177142127437111'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/11/de-volta-ativa.html' title='De volta a ativa.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-112453772587661170</id><published>2005-08-20T08:29:00.000-03:00</published><updated>2005-08-21T20:10:30.223-03:00</updated><title type='text'>A Dimensão Humana junto às Tecnologias de Comunicação (TC's)</title><content type='html'>&lt;div align="justify"&gt;Será que, em verdade, as TC's são instrumentos auxiliares no aumento da produtividade de trabalho? Gostaria de saber como é medida essa tal de produtividade, principalmente pelas entidades governamentais nordestinas. Alguns investigadores argumentam e fundamentam que &lt;span style="color:#993399;"&gt;a inclusão de TC’s no processo produtivo não acarreta, necessariamente, aumento de produtividade&lt;/span&gt;*. Por enquanto concordo com eles.&lt;br /&gt;&lt;br /&gt;No setor industrial, no comercial, no mercado informal, no terceiro setor o advento das TC's sugere maior produtividade. Este aspecto do trabalho (produtividade), quando aumenta, acarreta o que, a quem? Segundo relatórios do  &lt;a href="www.commerce.gov"&gt;Departamento de Comércio dos Estados Unidos da América&lt;/a&gt;, pelo menos um terço do vigoroso crescimento da economia americana nos últimos 5 anos é explicado pelas tecnologias da informação e comunicação (TICs).&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="color:#33ff33;"&gt;No Brasil, e na América Latina, é o mesmo&lt;/span&gt;?&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Alguns políticos afirmam, principalmente, no Nordeste que na "sociedade da informação", o recurso escasso não é a infra-estrutura. Esta nós temos (me pergunto aonde existe tal infra???). Além disso, os mesmos afirmam em seus discursos que o recurso fundamental é a mão-de-obra qualificada, e essa nós, também, temos e podemos formar.&lt;br /&gt;&lt;br /&gt;Do meu ponto de vista, ou seja, de alguém (acadêmico) que recebe para produzir produto (material e/ou serviços) e não para discursar metáforas ideológicas (políticos), estamos formando:&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;1 - escravos das tecnologias (estes nós temos - já somos)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;2 - mão-de-obra qualificada: nós temos mas, com certeza, uma porcentagem mínima da população.&lt;br /&gt;3 – enquanto formar esta mão-de-obra: tarefa lenta - é só dar uma olhada na situação da educação nordestina – e porque não brasileira???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É bom lembrar que &lt;a href="http://www.cin.ufpe.br"&gt;Computação&lt;/a&gt; e &lt;a href="http//www.df.ufpe.br"&gt;Física&lt;/a&gt;, na &lt;a href="http://www.ufpe.br"&gt;UFPE&lt;/a&gt;, vão muito bem obrigado. Notas “A” no &lt;a href="http://www.mec.gov.br"&gt;MEC&lt;/a&gt;, alunos premiados pelo mundo afora, professores doutores...enquanto isso na porta dos departamentos vemos pessoas pedindo ajuda para comer um lanche...outros para lavar o carro por R$1,00, (mizero Real).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;&lt;strong&gt;Classe social dominante “possuir” TC's é classe, luxo, status...é manter o social como está&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;&lt;strong&gt;Pobre “ter” TC's é tomar iniciativa...endividar-se é inclusão social...ter celular e não saber ler é tornar o "ecossistema" nordestino mais competitivo.&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff6600;"&gt;&lt;strong&gt;Acredito em ações sociais participativas&lt;/strong&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Mas a realidade, nua e crua, das ruas do &lt;a href="www.recife.pe.gov.br"&gt;Recife&lt;/a&gt; não condiz com a seguinte afirmação:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;"...&lt;span style="font-size:85%;"&gt;O que é preciso é uma ação articulada entre governos, empresas e universidades, para garantir um ecossistema competitivo de empresas e instituições de tecnologia da informação em cada grande cidade nordestina&lt;/span&gt; [o q sugere ser uma cidade grande? No sentido aqui descrito, ficou entendido referir-se apenas às capitais nordestinas. E o restante?]. &lt;span style="font-size:85%;"&gt;Em &lt;a href="www.pe.gov.br"&gt;Pernambuco&lt;/a&gt;, o Governo do Estado resolveu investir nessa alternativa, aproveitando a excelente qualificação do &lt;a href="http://www.cin.ufpe.br"&gt;Centro de Informática&lt;/a&gt; da &lt;a href="http://www.ufpe.br"&gt;UFPE&lt;/a&gt;, e lançou o projeto &lt;a href="http://www.portodigital.org.br"&gt;Porto Digital&lt;/a&gt;. O Governador Jarbas Vasconcelos resolveu investir 33 milhões de reais na criação de fundos de capital de risco e de qualificação de recursos humanos [&lt;span style="font-size:100%;"&gt;quem vai qualificar os desqualificados&lt;/span&gt;?], além de apoiar a instalação no Bairro do Recife de uma plataforma de negócios capaz de gerar e consolidar empreendimentos de classe mundial [ &lt;span style="font-size:100%;"&gt;a classe local, fica a ver navios&lt;/span&gt;?] na área de tecnologia da informação&lt;/span&gt;".**&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;Ao lado deste empreendimento tecno-científico, existe a favela mais favela do Estado de Pernambuco [favela do Pilar].&lt;/div&gt;&lt;div align="justify"&gt;Será que é este tipo de ação política “pública”, que leio nos artigos de estudiosos da Ciência da Informação no país afora que devemos apoiar? De certo, não vejo os mesmos ao menos indagando se houve ou não um planejamento junto às comunidades envolvidas. Não sei onde vamos parar. Enquanto estudante de &lt;a href="http://www.biblio.ufpe.br"&gt;biblioteconomia&lt;/a&gt; não sei se o que vejo, e o que leio, é antagônico ou complementar. Talvez tenha que ler e ver mais. Talvez já baste.&lt;br /&gt;&lt;br /&gt;Alguns até podem creer que através das TC's o bibliotecário e/ou o arquivísta possam auxiliar no processo social de inclusão dos &lt;strong&gt;desinformados &lt;/strong&gt;e dos &lt;strong&gt;injustiçados&lt;/strong&gt;. Em verdade, me questiono: &lt;span style="color:#ff0000;"&gt;até que ponto&lt;/span&gt;?&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Vejo “todos” (assumo aqui a falácia de generalização) preocupados em conseguir e manter &lt;em&gt;emprego&lt;/em&gt;. Vejo muito poucos que querem &lt;em&gt;trabalho&lt;/em&gt;.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;O último trem está para partir...mas na Estação, faltou Luz.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ser intelectual é, antes de tudo, resultado da intelectualização do ser&lt;/strong&gt;. (SALCEDO, 2005).&lt;br /&gt;&lt;br /&gt;Diego Salcedo.&lt;br /&gt;Graduando de &lt;a href="http://www.biblio.ufpe.br"&gt;Biblioteconomia&lt;/a&gt; – &lt;a href="http://www.ufpe.br"&gt;UFPE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* WAINER, Jacques. O Paradoxo da produtividade. In: RUBEN, Guilhermo (Org.). &lt;a href="www.livrariacultura.com.br"&gt;Informática, organizações e sociedade no Brasil.&lt;/a&gt; São Paulo: &lt;a href="http://www.cortezeditora.com.br"&gt;Cortez&lt;/a&gt;, 2003, p. 13-55.&lt;/div&gt;&lt;div align="justify"&gt; &lt;/div&gt;&lt;div align="justify"&gt;** &lt;a href="http://www.estadao.com.br"&gt;www.estadao.com.br&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/10449143-112453772587661170?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/112453772587661170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=112453772587661170' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112453772587661170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112453772587661170'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/08/dimenso-humana-junto-s-tecnologias-de.html' title='A Dimensão Humana junto às Tecnologias de Comunicação (TC&apos;s)'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-112387434171690367</id><published>2005-08-12T15:55:00.000-03:00</published><updated>2005-08-12T16:19:01.726-03:00</updated><title type='text'>Nota sobre: "A inclusão digital não se faz a custa de vitimas".</title><content type='html'>&lt;span style="font-family:arial;"&gt;Me agradou ver que algumas pessoas, em algum fórum longínquo,&lt;br /&gt;pararam para ampliar o pensamento sobre a tecnociência&lt;br /&gt;(inclua-se bibliotecas digitais) e sua relação com a sociedade.&lt;br /&gt;&lt;br /&gt;Outrossim, é bom lembrar que &lt;span style="color:#cc6600;"&gt;a vitimização humana independe&lt;br /&gt;da inclusão digital&lt;/span&gt;. Nós somos vítimas desde que nascemos,&lt;br /&gt;de um modo ou de outro.&lt;br /&gt;&lt;br /&gt;Gostei de ler que admite-se a existência de diferentes culturas,&lt;br /&gt;acarretando necessariamente a existência de diferentes&lt;br /&gt;conteúdos digitais, respeitando as biodiversidades sociais.&lt;br /&gt;&lt;br /&gt;Por outro lado, ainda me questiono sobre:&lt;br /&gt;&lt;strong&gt;O que significa dizer socializar a informação&lt;/strong&gt;???&lt;br /&gt;&lt;br /&gt;Estou, por enquanto, pensando que diante da grande metamorfose&lt;br /&gt;que a Terra e os humanos estão passando, não é tão simples&lt;br /&gt;definir essa questão. Perece que um jargão é desementido&lt;br /&gt;com outro, faltando cautela no pensamento para encontrar um equilibrio.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Vou mais além.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:#cc6600;"&gt;A informação enquanto ente, já possui no seu ser a característica do social&lt;/span&gt;.&lt;br /&gt;O que chama a atenção, é como o indivíduo media entre o ser da informação,&lt;br /&gt;suas próprioas necessidades e, como a disponibiliza para os outros (sociedade)???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Segue-se com as reflexões sobre a informação enquanto ente existente&lt;br /&gt;e que, no mínimo, merecem todo tipo de sugestões para ampliar&lt;br /&gt;o conhecimento sobre o assunto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Acredito que os fonêmas &lt;strong&gt;social&lt;/strong&gt; e &lt;strong&gt;democracia&lt;/strong&gt;, possuem valor representativo&lt;br /&gt;relevante para todos. Mas, talvez, deva-se ter mais "&lt;em&gt;carinho&lt;/em&gt;" quanto ao uso&lt;br /&gt;exagerado dessas signifações.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:#cc6600;"&gt;Tudo em exagero, tranforma-se em desperdício&lt;/span&gt; (SALCEDO, 2005).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;a href="http://blastemica.blogspot.com/"&gt;Diego Salcedo&lt;/a&gt;&lt;br /&gt;Graduando &lt;/span&gt;&lt;a href="http://www.biblio.ufpe.br/"&gt;&lt;span style="font-family:arial;"&gt;Biblioteconomia&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; - &lt;/span&gt;&lt;a href="http://www.ufpe.br/"&gt;&lt;span style="font-family:arial;"&gt;UFPE &lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-112387434171690367?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/112387434171690367/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=112387434171690367' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112387434171690367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112387434171690367'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/08/nota-sobre-incluso-digital-no-se-faz.html' title='Nota sobre: &quot;A inclusão digital não se faz a custa de vitimas&quot;.'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-112371944844415078</id><published>2005-08-10T20:51:00.000-03:00</published><updated>2005-08-10T21:17:28.450-03:00</updated><title type='text'>Em resposta...</title><content type='html'>&lt;div style="text-align: justify;"&gt;Eu e Diego Salcedo por vezes temos idéias bastante parecidas sobre uma série de assuntos. Mas, como conhecimento se desenvolve mais fortemente sobre pontos contrários, questionamentos e a necessidade de se provar, demonstrar o &lt;span style="font-style: italic;"&gt;isso &lt;/span&gt;ao invés do &lt;span style="font-style: italic;"&gt;aquilo&lt;/span&gt;, também temos opiniões  contrárias. Parece que uma deles é sobre como a pesquisa, especialmente no meio acadêmico, deve ser usada, tema citado nesse &lt;a href="http://blastemica.blogspot.com/2005/08/comunidade-blastmica.html"&gt;post escrito por Diego&lt;/a&gt;. Qual o proposito das pesquisas feitas em universidade qualquer? Para que diacho tentamos transformar &lt;a href="http://www.google.com/search?q=%22marcos%20silva%20pereira%22"&gt;alunos mais preocupados em tomar umas&lt;/a&gt;&lt;a href="http://www.google.com/search?q=%22marcos%20silva%20pereira%22"&gt; e outras&lt;/a&gt; em cientistas que, ora, além de tomar umas e outras, façam pesquisa séria?&lt;br /&gt;&lt;br /&gt;A meu ver, o propósito é &lt;span style="font-weight: bold;"&gt;aproveitar a inteligência de muita gente para beneficiar tantas outras &lt;a href="http://blastemica.blogspot.com/2005/08/bibliotecrios-eou-intelectuaisensaio.html"&gt;além do próprio inteligente&lt;/a&gt;&lt;/span&gt;. E hoje, como se faz, da melhor maneira, a pesquisa chegar até os outros? Por qual meio se faz um "estudo sobre o ciclo de vida dos girinos no interior de Floresta" influenciar positivamente a vida de outras pessoas? De maneira nenhuma, nesse caso, porque, acredite, a pesquisa é inutil até mesmo para os girinos. E é inutil como todo conhecimento que existe por si só, que foi criado com o unico entendimento de... existir por si só. Pesquisa unicamente por pesquisa, descabida de qualquer ligação &lt;span style="font-weight: bold;"&gt;real&lt;/span&gt; com a comunidade não faz sentido. Por outro lado, pesquisas de cunho mais pratico, nascidas e voltadas para alguma necessidade da comunidade, seja ela local ou não, têm sim um meio. Muito bem desenvolvido por sinal, talvez ainda não tanto quando possa ser, especialmente no Brasil.&lt;br /&gt;&lt;br /&gt;O meio é o comercio! &lt;span style="font-weight: bold;"&gt;Não há ainda melhor meio para fazer a pesquisa chegar as pessoas do que comercializando os seus resultados&lt;/span&gt;. Claro, tudo não pode ser regido unicamente pela necessidade de empresas, mas nem é esse o assunto. Claro, deve haver pesquisa menos pop, que não gere lucro mas traga muito beneficio para a sociedade, como é o caso do &lt;a href="http://pt.wikipedia.org/wiki/Soro_caseiro"&gt;soro caseiro&lt;/a&gt;. Não percebi exatamente qual a visão que Diego tem sobre o assunto, mas devem existir alguns pontos contrarios sobre minha opinião. Ótimo! Depois eu escrevo mais sobre o assunto, agora tenho que cuidar de outras coisas.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-112371944844415078?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/112371944844415078/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=112371944844415078' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112371944844415078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112371944844415078'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/08/em-resposta.html' title='Em resposta...'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-112371474641137384</id><published>2005-08-10T19:59:00.000-03:00</published><updated>2005-08-10T19:59:06.416-03:00</updated><title type='text'>Comunidade Blastêmica</title><content type='html'>O futuro da ciência...&lt;br /&gt;&lt;br /&gt;A &lt;strong&gt;tecnociência&lt;/strong&gt;, atualmente tão aclamada, por vezes, une a supervalorização do aspecto aplicado do conhecimento com a desvalorização da pesquisa pura e do conhecimento como um&lt;br /&gt;fim em si mesmo.&lt;br /&gt;&lt;br /&gt;O &lt;strong&gt;princípio da difusão&lt;/strong&gt; por toda a sociedade dos produtos teóricos e intelectuais pode, em alguns casos, dar lugar a uma intensa privatização do saber em troca de lucros.&lt;br /&gt;&lt;br /&gt;Hoje, em vários setores, é quase impossível separar pesquisa científica de interesses e não se cumprem mais os valores de eqüidade e benefício geral, atributos natos da ciência.&lt;br /&gt;&lt;br /&gt;Esse estado de mercantilização pode colocar em risco a ciência, se já não estamos vivendo esse processo.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;O ser só é ser, enquanto AÇÃO no ser&lt;/em&gt;. (SALCEDO, 2005)&lt;br /&gt;&lt;br /&gt;Diego Salcedo&lt;br /&gt;Graduando - &lt;a href="http://www.biblio.ufpe.br"&gt;Biblioteconomia da UFPE&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-112371474641137384?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/112371474641137384/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=112371474641137384' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112371474641137384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112371474641137384'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/08/comunidade-blastmica.html' title='Comunidade Blastêmica'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-112347064327004885</id><published>2005-08-08T00:06:00.000-03:00</published><updated>2005-08-08T14:39:31.246-03:00</updated><title type='text'>Bibliotecários e/ou intelectuais...ensaio</title><content type='html'>&lt;font&gt;De certo, minimizar os&lt;/span&gt; esteriótipos e as categorias redutoras que tanto (de)limitam o pensar e o comunicar humano é papel fundamental que reside no âmago de um ativo intelectual.&lt;br /&gt;Pensava-se que o bibliotecário teria essa incumbência. Não é verdade.&lt;br /&gt;O intelectual, que possui o que &lt;a href="http://en.wikipedia.org/wiki/Michel_Foucault"&gt;Foucault&lt;/a&gt; chamou uma vez de "erudição implacável", é dramático ao cativar a atenção do público e insurgente quando aproveita-se de raras oportunidades, como estas, que hoje vivemos no Brasil.&lt;br /&gt;Deve, o intelectual, possicionar-se como indivíduo detentor de um papel público na sociedade, que não usa de um reducionismo facial ou que seja membro participativo de classes egoístas e ociosas. O bibliotecário atual, em sua grande maioria, encontra-se nesta situação, ou seja, esconde-se. Ainda, o intelectual é dotado, quando assim o quer, de uma vocação para representar, dar corpo e articular uma mensagem, uma filosofia, uma opinião baseada em fundamentos éticos e morais.&lt;br /&gt;Onde estão os intelectuais brasileiros, que poderíam e deveríam confrontar as ortodoxias e os dogmas sócio-político-culturais, intrínsecos à atualidade deste imenso Estado-Nação?&lt;br /&gt;Onde está o bibliotecário enquanto ativista e militante brasileiro?&lt;br /&gt;Em Pernambuco, o &lt;a href="http://www.pe.gov.br/governo_governador_biografia.htm"&gt;Governador&lt;/a&gt; eliminou a função de bibliotecário do quadro funcional.&lt;br /&gt;Não se viu nota pública de repúdio da classe. Há de se ter muita coragem para tornar uma palavra pública (escrever e publicar), oferecendo ambas as faces em defesa de uma posição, de uma causa. Não existe o intelectual politicamente correto. O que deve existir, é um que cause embaraço, que seja do contra e até mesmo, às vezes, desagradável.&lt;br /&gt;O papel social deste, encontra-se no obejtivo maior e universal de promover a liberdade e o conhecimento. Não sería este também, o papel do bibliotecário???&lt;br /&gt;Ainda pode-se acreditar que "as grandes narrativas de emancipação e esclarecimento" façam efeito nesta era, ao contrário do que acredita o filósofo francês &lt;a href="http://www.google.com.br/search?q=Lyotard"&gt;Lyotard&lt;/a&gt;.&lt;br /&gt;Para não cansar, os já cansados intelectuais e bibliotecários, deixa-se dito que falar a verdade ao poder não é idealismo panglossiano, outrossim, é pensar com cautela as alternativas, escolher a certa e então representá-la de maneira inteligente e una, onde se possa fazer o maior bem e causar a mudança correta.&lt;br /&gt;Todavia, eternamente, novos paradigmas surgirão.&lt;br /&gt;A metamorfose humana nunca e jamais se exauri do seu ser.&lt;br /&gt;&lt;br /&gt;Este, crente de sua função social, sugere como leitura:&lt;br /&gt;"&lt;a href="http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&amp;ProdTypeId=1&amp;amp;ProdId=284442&amp;amp;franq=2423"&gt;Representações do Intelectual&lt;/a&gt;", de Edward W. Said, Cia. das Letras, 2005.&lt;br /&gt;&lt;br /&gt;O ser só é ser, enquanto AÇÃO no ser. (SALCEDO, 2005)&lt;br /&gt;&lt;br /&gt;Diego Salcedo&lt;br /&gt;Graduando - &lt;a href="http://www.biblio.ufpe.br/"&gt;Biblioteconomia da UFPE&lt;/a&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-112347064327004885?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/112347064327004885/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=112347064327004885' title='16 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112347064327004885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/112347064327004885'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/08/bibliotecrios-eou-intelectuaisensaio.html' title='Bibliotecários e/ou intelectuais...ensaio'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111989936951789153</id><published>2005-06-27T15:55:00.000-03:00</published><updated>2005-06-27T16:09:29.526-03:00</updated><title type='text'>Seja compativel</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uma das características mais marcantes de produtos de TI bem sucedidos, como em muitas areas e diferente de tantas outras, é que eles trazem um grande diferencial de qualidade em relação aos concorrentes. Claro, depois de certo tempo a tendência é que a concorrência aperte o cerco. Mas, por algum período, cada vez menor, diga-se de passagem, o produto inovador tende a dominar sozinho o mercado. Outro fator bastante importante para o sucesso de um produto de tecnologia da informação é a compatibilidade com produtos de terceiros, geralmente tão competitivos quanto. Alias, compatibilidade é algo que movimenta qualquer setor. Carros agora não são compatíveis apenas com a gasolina, o que aquece o mercado de Álcool e, se eu parar para pensar melhor, creio que chegarei à conclusão de que convergência digital tem futuro justamente por criar compatibilidades: entre a TV e o computador, entre o telefone e o computador, entre o telefone e o cartão de crédito, entre o controle remoto e o abridor de latas, entre a &lt;a href="http://www.bohemia.com.br/"&gt;bohemia&lt;/a&gt; e corações de galinha bem temperados.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Mas antes que eu elocumbre demais em torno de convergência, deixe-me voltar para o propósito real desse post: &lt;span style="font-weight: bold;"&gt;a compatibilidade com terceiros garante maior competitividade&lt;/span&gt;. Apesar de não ser um conceito novo, parece-me que apenas agora a comunidade open source se deu conta &lt;span style="font-weight: bold;"&gt;realmente&lt;/span&gt; disso e a ideia tem se tornado algo bem mais comum. Assim que cada vez mais frameworks de A trabalham fácil com os de B, C, D e E. E não é apenas uma característica de reuso, é algo além disso. É a compatibilidade pensada antes para aproveitar a popularidade alheia a fim de ganhar competitividade. No mundo Java, não posso deixar de citar o &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;, que surgiu com suporte ao &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, &lt;a href="http://ibatis.apache.org/"&gt;iBatis&lt;/a&gt;, &lt;a href="http://jakarta.apache.org/velocity/"&gt;Velocity&lt;/a&gt;, e por aí vai. Não dá para deixar de citar também o WebWork, prontinho para se aconchegar ao Hibernate, também, Jasper, FreeMarker, Pico e, ora vejam só, Spring. Cada vez mais frameworks seguem esse caminho. Até Java por si só nasceu assim: run anywhere. Quer compatibilidade maior?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Fora isso, vale citar a movimentação do mercado em torno de se permitir funcionar no Linux, MacOS, FreeBSD e não apenas no Windows. Só para lembrar, compatibilidade foi o que fez o Windows ir além dos Mac OS da vida, ao menos quando o assunto é mercado. Abrir as APIs e deixar que os fabricantes de softwares fizessem, mais fácil e rapidamente, programas Windows, foi crucial. Agora, um pouco do esforço, proporcional a  sua popularidade, se volta para o Linux. O problema é que, aparentemente, a historia do Linux caminha no sentido oposto, o de criar tantas distribuições a ponto de criar incompatibilidades. Tomara que o "pai" do software livre aprenda algo que "filhos" que estão nascendo sabem de cor. E agora o outro lado da moeda. &lt;span style="font-weight: bold;"&gt;Criar incompatibilidades para promover inovação&lt;/span&gt;. Não exatamente isso, mas, pense bem, para que diacho adotar um padrão se ele simplesmente não é bom? Não faz sentido e as grandes empresas perceberam isso e tomaram atitudes de criar comitês, laboratórios ou projetos comuns para desenvolver padrões de acordo com o mercado que nem sempre segue as regras definidas pelo &lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt;, só para exemplificar.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Um fato talvez não tão claro a primeira vista é que, geralmente, vc precisa ser uma empresa com uma boa, mas muito boa mesmo, fatia do mercado para criar uma incompatibilidade. Por exemplo, a Microsoft lançou o Windows XP e ele simplesmente era incompativel com muitos produtos, em especial hardware ainda presentes no mercado. Muitos usuarios reclamaram, entretanto, ninguem duvida que o Windows XP é hoje o sistema operacional desktop mais usado e se duvida, deve ser por picuinha. Fora a movimentação de mercado dos fabricantes de hardware e software para se adequarem ao novo modelo e se manterem compativeis com um produto de sucesso. Enfim, a Microsoft podia se dar ao luxo de fazer algo assim porque está acima no mercado, pode ditar regras, mesmo que pareçam arbitrarias. Agora, tome o caso da &lt;a href="http://www.amd.com/"&gt;AMD&lt;/a&gt;, porque o chip de 64bits não emplacou tão rapidamente quanto o XP? Se eu desconsiderar as diferenças entre um processador e um sistema operacional, simples, a lider de mercado, com boa folga, é outra empresa, a &lt;a href="http://www.intel.com/"&gt;Intel&lt;/a&gt; e AMD se vê em uma curva S de adoção que sequer pode chegar ao fim. A Intel como boa conhecedora já aposta em outros aspectos ligados a convergencia digital e compatibilidade com terceiros, vide novo acordo com a &lt;a href="http://www.apple.com/"&gt;Apple&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111989936951789153?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111989936951789153/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111989936951789153' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111989936951789153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111989936951789153'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/06/seja-compativel.html' title='Seja compativel'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111946040146988274</id><published>2005-06-22T14:12:00.000-03:00</published><updated>2005-06-22T14:14:04.623-03:00</updated><title type='text'>Irretocável</title><content type='html'>&lt;a href="http://app.uol.com.br/radiouol/index.php?busca=teresa+cristina&amp;param1=homebusca&amp;amp;check=artista&amp;enviar=OK&amp;amp;sss=nada"&gt;Ouça!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111946040146988274?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111946040146988274/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111946040146988274' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111946040146988274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111946040146988274'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/06/irretocvel.html' title='Irretocável'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111904411617147395</id><published>2005-06-17T18:28:00.000-03:00</published><updated>2005-06-17T18:35:16.176-03:00</updated><title type='text'>Ruby on Rails: embasbacante!</title><content type='html'>&lt;div style="text-align: justify;"&gt;Se vc trabalha com desenvolvimento web, e mesmo depois de ver &lt;a href="http://media.nextangle.com/rails/rails_setup.mov"&gt;esse video&lt;/a&gt; sobre o &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;  não quiser experimentar um pouco do treco é bom procurar algum tratamento psiquiatrico! O video tem duração de ~10 minutos e vale cada um deles pela praticidade demonstrada. O cara cria um mini weblog em duas(!) classes e um pequeno HTML. Muito legal mesmo.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111904411617147395?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111904411617147395/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111904411617147395' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111904411617147395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111904411617147395'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/06/ruby-on-rails-embasbacante.html' title='Ruby on Rails: embasbacante!'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111877562016115634</id><published>2005-06-14T15:46:00.000-03:00</published><updated>2005-06-14T16:04:43.730-03:00</updated><title type='text'>Suggest com o Lucene II</title><content type='html'>&lt;div style="text-align: justify;"&gt;Como vcs viram &lt;a href="http://blastemica.blogspot.com/2005/05/suggest-com-o-lucene.html"&gt;em um post passado&lt;/a&gt;, desenvolvi um pequeno esquema para realizar suggests com o &lt;a href="http://lucene.apache.org"&gt;Lucene&lt;/a&gt;. Agora eu finalmente terminei e coloquei para funcionar em um dos sistemas em que trabalhei recentemente. É incrivel como o Lucene permite desenvolver coisas interessantes sem muita complexidade, realmente simplicidade é uma vantagem forte dessa api. Vamos lá, primeiro eu refatorei a classe Suggest para guardar tanto a palavra original quanto a sugestão e o numero de ocorrências da tal sugestão. O resultado final é:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;public class Suggest implements Comparable&amp;lt;Suggest&amp;gt; {&lt;br /&gt;&lt;br /&gt;    private String suggest;&lt;br /&gt;    private String original;&lt;br /&gt;    private int occurrences;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param suggest&lt;br /&gt;     * @param original&lt;br /&gt;     * @param occurrences&lt;br /&gt;     */&lt;br /&gt;    public Suggest ( String suggest, String original, int occurrences ) {&lt;br /&gt;&lt;br /&gt;        this.suggest = suggest;&lt;br /&gt;        this.original = original;&lt;br /&gt;        this.occurrences = occurrences;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @see java.lang.Object#equals(java.lang.Object)&lt;br /&gt;     */&lt;br /&gt;    public boolean equals( Object obj ) {&lt;br /&gt;&lt;br /&gt;        boolean result = false;&lt;br /&gt;&lt;br /&gt;        if (obj instanceof Suggest) {&lt;br /&gt;&lt;br /&gt;            Suggest s = (Suggest) obj;&lt;br /&gt;&lt;br /&gt;            String sWord = s.suggest.toLowerCase();&lt;br /&gt;            String thisWord = suggest.toLowerCase();&lt;br /&gt;&lt;br /&gt;            result = sWord.equals(thisWord) &amp;&amp;amp; occurrences == s.occurrences;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @see java.lang.Object#hashCode()&lt;br /&gt;     */&lt;br /&gt;    public int hashCode() {&lt;br /&gt;&lt;br /&gt;        return suggest.toLowerCase().hashCode() * occurrences;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @see java.lang.Object#toString()&lt;br /&gt;     */&lt;br /&gt;    public String toString() {&lt;br /&gt;&lt;br /&gt;        return suggest + " - " + occurrences;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param other&lt;br /&gt;     * @return&lt;br /&gt;     * @see java.lang.Comparable#compareTo(T)&lt;br /&gt;     */&lt;br /&gt;    public int compareTo( Suggest other ) {&lt;br /&gt;&lt;br /&gt;        return other.occurrences - occurrences;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // somente gets, o objeto é immutable&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ter a palavra original é interessante porque a partir dela posso saber se houve mesmo uma sugestão ou não. Quando trato de uma palavra simples isso não chega a ser necessário, mas no caso de frases, é importante para que eu destaque apenas as sugestões e não todas as palavras presentes em uma consulta. Tambem refatorei algumas partes da classe Suggestor para evitar que ele sugerisse a propria palavra, fiz algumas pequenas melhorias na performance, sugestões para frases e as adaptações simples decorrentes do refactoring de Suggest. O bom da historia foi ver as classes clientes de Suggestor funcionarem perfeitamente depois disso tudo. Enfim, o novo codigo de Suggestor é:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;public class Suggestor {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    public static final String PUNCTUATION_SPLITER = "[\\p{Punct}\\s]+";&lt;br /&gt;&lt;br /&gt;    private static final Log logger = LogFactory.getLog(Suggestor.class);&lt;br /&gt;&lt;br /&gt;    private Directory lucenePath;&lt;br /&gt;    private Analyzer analyzer;&lt;br /&gt;    private float minSimilarity = FuzzyQuery.defaultMinSimilarity;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param path&lt;br /&gt;     * @param analyzer&lt;br /&gt;     * @param similarity&lt;br /&gt;     */&lt;br /&gt;    public Suggestor ( Directory path, Analyzer analyzer, float similarity ) {&lt;br /&gt;&lt;br /&gt;        lucenePath = path;&lt;br /&gt;        minSimilarity = similarity;&lt;br /&gt;        this.analyzer = analyzer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param path&lt;br /&gt;     * @param analyzer&lt;br /&gt;     * @param similarity&lt;br /&gt;     * @throws IOException&lt;br /&gt;     */&lt;br /&gt;    public Suggestor ( Resource path, Analyzer analyzer, float similarity )&lt;br /&gt;            throws IOException {&lt;br /&gt;&lt;br /&gt;        this(FSDirectory.getDirectory(path.getFile(), false), analyzer, similarity);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param word&lt;br /&gt;     * @param field&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;Suggest&amp;gt; suggestsByFrequency( String word, String field ) {&lt;br /&gt;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = suggestsBySimilarity(word, field);&lt;br /&gt;&lt;br /&gt;        Collections.sort(suggests);&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param word&lt;br /&gt;     * @param field&lt;br /&gt;     * @param maxSuggestions&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;Suggest&amp;gt; suggestsByFrequency( String word, String field,&lt;br /&gt;            int maxSuggestions ) {&lt;br /&gt;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = suggestsByFrequency(word, field);&lt;br /&gt;&lt;br /&gt;        suggests = chopList(maxSuggestions, suggests);&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param word&lt;br /&gt;     * @param field&lt;br /&gt;     * @param maxSuggestions&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;Suggest&amp;gt; suggestsBySimilarity( String word, String field,&lt;br /&gt;            int maxSuggestions ) {&lt;br /&gt;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = suggestsBySimilarity(word, field);&lt;br /&gt;&lt;br /&gt;        suggests = chopList(maxSuggestions, suggests);&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param word&lt;br /&gt;     * @param field&lt;br /&gt;     * @return&lt;br /&gt;     * @throws IOException&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;Suggest&amp;gt; suggestsBySimilarity( String word, String field ) {&lt;br /&gt;&lt;br /&gt;        IndexReader reader = null;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;&lt;br /&gt;            synchronized (LuceneMonitor.LUCENE_MONITOR) {&lt;br /&gt;&lt;br /&gt;                reader = IndexReader.open(lucenePath);&lt;br /&gt;                Term term = new Term(field, word);&lt;br /&gt;&lt;br /&gt;                FuzzyTermEnum termEnum;&lt;br /&gt;                termEnum = new FuzzyTermEnum(reader, term, minSimilarity);&lt;br /&gt;&lt;br /&gt;                suggests = termEnumToList(word, termEnum);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;            throw new LuceneIndexException(ex);&lt;br /&gt;&lt;br /&gt;        } finally {&lt;br /&gt;&lt;br /&gt;            try {&lt;br /&gt;&lt;br /&gt;                if (reader != null) reader.close();&lt;br /&gt;&lt;br /&gt;            } catch (Exception ex) {&lt;br /&gt;&lt;br /&gt;                if (logger.isDebugEnabled()) {&lt;br /&gt;&lt;br /&gt;                    logger.debug("Could not close reader", ex);&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        filterSuggests(suggests, word);&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void filterSuggests( List&amp;lt;Suggest&amp;gt; suggests, String word ) {&lt;br /&gt;&lt;br /&gt;        Predicate predicate = new AvoidWordItseltPredicate(word);&lt;br /&gt;        CollectionUtils.filter(suggests, predicate);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param phrase&lt;br /&gt;     * @param field&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;Suggest&amp;gt; phrasalSuggest( String phrase, String field ) {&lt;br /&gt;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;&lt;br /&gt;        IndexReader indexReader = null;&lt;br /&gt;        TokenStream tokenStream = null;&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;&lt;br /&gt;            Reader reader = new StringReader(phrase);&lt;br /&gt;            tokenStream = analyzer.tokenStream(field, reader);&lt;br /&gt;&lt;br /&gt;            synchronized (LuceneMonitor.LUCENE_MONITOR) {&lt;br /&gt;&lt;br /&gt;                indexReader = IndexReader.open(lucenePath);&lt;br /&gt;&lt;br /&gt;                Token token;&lt;br /&gt;                while ((token = tokenStream.next()) != null) {&lt;br /&gt;&lt;br /&gt;                    Term term = new Term(field, token.termText());&lt;br /&gt;&lt;br /&gt;                    FuzzyTermEnum termEnum;&lt;br /&gt;                    termEnum = new FuzzyTermEnum(indexReader, term, minSimilarity);&lt;br /&gt;&lt;br /&gt;                    List&amp;lt;Suggest&amp;gt; temp = termEnumToList(token.termText(), termEnum);&lt;br /&gt;&lt;br /&gt;                    if (!temp.isEmpty()) {&lt;br /&gt;&lt;br /&gt;                        suggests.add(Collections.min(temp));&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;            throw new LuceneIndexException(ex);&lt;br /&gt;&lt;br /&gt;        } finally {&lt;br /&gt;&lt;br /&gt;            try {&lt;br /&gt;&lt;br /&gt;                if (indexReader != null) indexReader.close();&lt;br /&gt;&lt;br /&gt;            } catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;                if (logger.isDebugEnabled()) {&lt;br /&gt;&lt;br /&gt;                    logger.debug("Could not close reader", ex);&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        filterSuggests(suggests, phrase);&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;Suggest&amp;gt; termEnumToList( String word, TermEnum termEnum )&lt;br /&gt;            throws IOException {&lt;br /&gt;&lt;br /&gt;        List&amp;lt;Suggest&amp;gt; suggests = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;&lt;br /&gt;        while (termEnum.next()) {&lt;br /&gt;&lt;br /&gt;            Term term = termEnum.term();&lt;br /&gt;&lt;br /&gt;            String termValue = term.text();&lt;br /&gt;            int frequency = termEnum.docFreq();&lt;br /&gt;&lt;br /&gt;            suggests.add(new Suggest(termValue, word, frequency));&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;Suggest&amp;gt; chopList( int maxSuggestions, List&amp;lt;Suggest&amp;gt; suggests ) {&lt;br /&gt;&lt;br /&gt;        if (suggests.size() &amp;gt; maxSuggestions) {&lt;br /&gt;&lt;br /&gt;            suggests = suggests.subList(0, maxSuggestions);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return suggests;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @author Marcos Silva Pereira - marcos.pereira@vicinity.com.br&lt;br /&gt;     *&lt;br /&gt;     *&lt;br /&gt;     * @since 24/05/2005&lt;br /&gt;     * @version $Id$&lt;br /&gt;     */&lt;br /&gt;    static class AvoidWordItseltPredicate implements Predicate {&lt;br /&gt;&lt;br /&gt;        private Set words;&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * @param words&lt;br /&gt;         */&lt;br /&gt;        public AvoidWordItseltPredicate( String words ) {&lt;br /&gt;&lt;br /&gt;            this(makeSet(words));&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * @param words&lt;br /&gt;         */&lt;br /&gt;        public AvoidWordItseltPredicate( Set words ) {&lt;br /&gt;&lt;br /&gt;            this.words = words;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)&lt;br /&gt;         */&lt;br /&gt;        public boolean evaluate( Object obj ) {&lt;br /&gt;&lt;br /&gt;            boolean result = false;&lt;br /&gt;&lt;br /&gt;            if (obj instanceof Suggest) {&lt;br /&gt;&lt;br /&gt;                Suggest suggest = (Suggest) obj;&lt;br /&gt;                String word = suggest.getSuggest().toLowerCase();&lt;br /&gt;&lt;br /&gt;                result = !words.contains(word);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return result;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static Set makeSet( String words ) {&lt;br /&gt;&lt;br /&gt;            Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;            String[] strings = words.split(PUNCTUATION_SPLITER);&lt;br /&gt;&lt;br /&gt;            for (String string : strings) {&lt;br /&gt;&lt;br /&gt;                set.add(string.toLowerCase());&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O metodo phrasalSuggests usa o Analyzer para parsear as palavras e evitar que eu tente fazer sugestões para stop words, por exemplo. AvoidWordItseltPredicate é uma implementação simples de &lt;a href="http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_1/org/apache/commons/collections/Predicate.html"&gt;Predicate&lt;/a&gt;, interface do &lt;a href="http://jakarta.apache.org/commons/collections/"&gt;Jakarta Commons Collections&lt;/a&gt;, e é ele quem filtra o conjunto de sugestões para evitar que a propria palavra seja sugerida. Alteradas essas classes, criei uma helper para gerar codigo HTML a partir de uma frase e seu conjunto de sugestões, nada demais como vc pode ver abaixo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;public class HTMLPhrasalSuggest {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    private HTMLPhrasalSuggest () {&lt;br /&gt;&lt;br /&gt;        // private constructor to avoid instantiation...&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param phrase&lt;br /&gt;     * @param suggests&lt;br /&gt;     * @param tag&lt;br /&gt;     *&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static String htmlPhrasalSuggest( String phrase,&lt;br /&gt;            List&amp;lt;Suggest&amp;gt; suggests, String tag ) {&lt;br /&gt;&lt;br /&gt;        StringBuilder result = new StringBuilder();&lt;br /&gt;&lt;br /&gt;        String[] wordsInPhrase = phrase.split(Suggestor.PUNCTUATION_SPLITER);&lt;br /&gt;&lt;br /&gt;        int i = 0;&lt;br /&gt;        for (String string : wordsInPhrase) {&lt;br /&gt;&lt;br /&gt;            if (hasSuggest(string, suggests)) {&lt;br /&gt;&lt;br /&gt;                result.append(openTag(tag));&lt;br /&gt;                result.append(suggests.get(i++).getSuggest());&lt;br /&gt;                result.append(closeTag(tag));&lt;br /&gt;&lt;br /&gt;            } else {&lt;br /&gt;&lt;br /&gt;                result.append(string);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;            result.append(" ");&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return result.toString().trim();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param phrase&lt;br /&gt;     * @param suggests&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static String phrasalSuggest( String phrase, List&amp;lt;Suggest&amp;gt; suggests ) {&lt;br /&gt;&lt;br /&gt;        StringBuilder result = new StringBuilder();&lt;br /&gt;&lt;br /&gt;        String[] wordsInPhrase = phrase.split(Suggestor.PUNCTUATION_SPLITER);&lt;br /&gt;&lt;br /&gt;        int i = 0;&lt;br /&gt;        for (String string : wordsInPhrase) {&lt;br /&gt;&lt;br /&gt;            if (hasSuggest(string, suggests)) {&lt;br /&gt;&lt;br /&gt;                result.append(suggests.get(i++).getSuggest());&lt;br /&gt;&lt;br /&gt;            } else {&lt;br /&gt;&lt;br /&gt;                result.append(string);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;            result.append(" ");&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return result.toString().trim();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static boolean hasSuggest( String word, List&amp;lt;Suggest&amp;gt; suggests ) {&lt;br /&gt;&lt;br /&gt;        boolean result = false;&lt;br /&gt;&lt;br /&gt;        for (Suggest suggest : suggests) {&lt;br /&gt;&lt;br /&gt;            if (suggest.getOriginal().equalsIgnoreCase(word)) {&lt;br /&gt;&lt;br /&gt;                result = true;&lt;br /&gt;                break;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return result;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static String openTag( String tag ) {&lt;br /&gt;&lt;br /&gt;        return "&amp;lt;" + tag + "&amp;gt;";&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static String closeTag( String tag ) {&lt;br /&gt;&lt;br /&gt;        return "&amp;lt;/" + tag + "&amp;gt;";&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;No metodo privado hasSuggest dá para ver a utilidade de guardar a palavra original. Se ela está presente no conjunto de sugestões, é porque houve uma sugestão para ela. Por exemplo, "jakarta luceni" vai gerar um conjunto de sugestões apenas com "lucene" já que "jakarta" está grafada corretamente. E por fim, o uso dessa tralha toda é feito via uma tag que criei baseado no suporte do &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork&lt;/a&gt; com &lt;a href="http://www.opensymphony.com/webwork/wikidocs/OGNL.html"&gt;OGNL&lt;/a&gt; e tudo mais:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;public class LuceneSuggestTag extends WebWorkTagSupport {&lt;br /&gt;&lt;br /&gt;    private String query;&lt;br /&gt;    private String field;&lt;br /&gt;    private String url;&lt;br /&gt;    private String tag;&lt;br /&gt;&lt;br /&gt;    private Suggestor suggestor;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @see javax.servlet.jsp.tagext.BodyTagSupport#doEndTag()&lt;br /&gt;     */&lt;br /&gt;    public int doEndTag() throws JspException {&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;&lt;br /&gt;            List&amp;lt;Suggest&amp;gt; suggests = suggestor.phrasalSuggest(query, field);&lt;br /&gt;           &lt;br /&gt;            String htmlSuggest;&lt;br /&gt;            htmlSuggest = HTMLPhrasalSuggest.htmlPhrasalSuggest(query, suggests, tag);&lt;br /&gt;           &lt;br /&gt;            String textSuggest;&lt;br /&gt;            textSuggest = HTMLPhrasalSuggest.phrasalSuggest(query, suggests);&lt;br /&gt;&lt;br /&gt;            StringBuilder toShow = new StringBuilder();&lt;br /&gt;            toShow.append("&amp;lt;a href=\"").append(url).append(textSuggest);&lt;br /&gt;            toShow.append("\"&amp;gt;").append(htmlSuggest).append("&amp;lt;/a&amp;gt;");&lt;br /&gt;           &lt;br /&gt;            Writer writer = pageContext.getOut();           &lt;br /&gt;            writer.write(toShow.toString());&lt;br /&gt;&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;           &lt;br /&gt;            throw new JspException(ex.getMessage(), ex);&lt;br /&gt;           &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return EVAL_PAGE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @see javax.servlet.jsp.tagext.BodyTagSupport#doStartTag()&lt;br /&gt;     */&lt;br /&gt;    public int doStartTag() throws JspException {&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;           &lt;br /&gt;            ServletContext servletContext = pageContext.getServletContext();&lt;br /&gt;&lt;br /&gt;            suggestor = (Suggestor) servletContext.getAttribute("luceneSuggestor");&lt;br /&gt;           &lt;br /&gt;            query = String.valueOf(getStack().findValue(query, String.class));&lt;br /&gt;            field = String.valueOf(getStack().findValue(field, String.class));&lt;br /&gt;&lt;br /&gt;            return SKIP_BODY;&lt;br /&gt;&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;&lt;br /&gt;            throw new JspException(ex.getMessage(), ex);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // sets e gets para os atributos.&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;E o uso, no meu caso numa jsp:&lt;br /&gt;&lt;pre&gt;&amp;lt;%@ taglib prefix="ww" uri="webwork" %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="lucene" uri="lucene" %&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;lt;lucene:suggest field="'PageText'" query="query" tag="em" url="Search.pc?query="&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;Agora, coisas que preciso melhorar:&lt;br /&gt;1. Evitar que a view precise indicar o campo a ser buscado para as suggests (PageText);&lt;br /&gt;2. Suggests para palavras coladas (comunidadeblastemica -&amp;gt; comunidade blastemica);&lt;br /&gt;3. Tornar a tag library compativel com o metodo POST do HTTP;&lt;br /&gt;4. Escapes para HTML e evitar que algum mal intencionado envie queries como &amp;lt;javascript bla bla bla&amp;gt;&lt;br /&gt;&lt;br /&gt;É isso, sugestões e comentarios são muito bem vindos.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111877562016115634?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111877562016115634/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111877562016115634' title='17 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111877562016115634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111877562016115634'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/06/suggest-com-o-lucene-ii.html' title='Suggest com o Lucene II'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111835579839979078</id><published>2005-06-09T19:18:00.000-03:00</published><updated>2005-06-09T19:24:33.660-03:00</updated><title type='text'>Qualidade importa</title><content type='html'>&lt;div style="text-align: justify;"&gt;Um argumento recorrente de quem não tem tanta preocupação com qualidade de software em geral é: "O cliente não quer saber dos padrões e métricas usados, quer que funcione e pronto". Isso é mais do que verdade, até porque, para boa parte dos clientes, não faz sentido explicar como os &lt;a href="http://www.google.com/search?q=gof+patterns"&gt;padrões do GoF&lt;/a&gt;, por exemplo, ajudam, quando usados de acordo, a gerar software de maior qualidade. Os clientes geralmente querem que os requisitos sejam cumpridos dentro de prazos e custos e não que se use o mais novo e balado framework. Mais ainda, apenas em casos que implicam manter compatibilidade, os clientes se preocupam com as tecnologias usadas no desenvolvimento.&lt;br /&gt;&lt;br /&gt;Apesar de o argumento parecer extremamente lógico para boa parte dos casos, ele não é verdadeiro quando você olha para outro aspecto envolvido: a "empresa" que desenvolve. Em tempos de prazos cada vez mais apertados, desenvolver software sem se preocupar com seu futuro pode manter a empresa amarrada a um problema muito além do tempo necessário. É o típico caso de haver tempo para fazer duas (ou mais) vezes, mas não haver para fazer uma vez bem feita. Há, a meu ver, dois grandes problemas com software mal desenvolvido que, de uma maneira ou outra, irão criar outro conjunto de problemas. São eles:&lt;br /&gt;&lt;br /&gt;1. Você passará muito tempo literalmente remendando erros e, provavelmente, criando outros. Isso toma parte da força de trabalho para algo que simplesmente não gera o lucro esperado se a gama de usuários for pequena. Para grandes empresas os custos para consertar o problema podem ser altos não apenas pelo conserto em si mas também para a marca, a percepção que as pessoas têm do produto ou empresa. Que o diga a &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; com o grande numero de service packs e com a falta de credibilidade que permeou o Windows por um bom tempo. E, pode acreditar, se você não tem qualidade ou credibilidade, alguém terá. No fim das contas, qualquer pessoa envolvida seriamente com qualidade, sabe que manutenção toma mais tempo do que desenvolvimento. Isso é fato e nos leva ao seguinte: bom desenvolvimento leva a um período de manutenções mais leves;&lt;br /&gt;&lt;br /&gt;2. Outros projetos são afetados pela falta de qualidade do primeiro. Em especial, se algo não foi bem feito, provavelmente não será reusado, se for, o problema apenas aumenta já que temos uma propagação do erro. Se não é possível reusar, o tempo para desenvolvimento de novos projetos certamente crescerá e o retrabalho causado pela falta de reuso causará uma série de horas extras e daí para frente vc pode imaginar sozinho. Falta de reuso gera outro problema menos explicito que é o aumento na quantidade de erros e código a corrigir/refatorar;&lt;br /&gt;&lt;br /&gt;Projetos com qualidade, por outro lado, têm, claro, uma série de aspectos positivos para a empresa e no fim das contas para os clientes. Para emparelhar com os problemas acima e ser um pouco chato, vou citar os mais óbvios e importantes:&lt;br /&gt;&lt;br /&gt;1. Não passar meses corrigindo erros tem uma vantagem além da economia de tempo e dinheiro. Com bons produtos as chances de feedback e adesão de novos clientes crescem. Bom feedback é crucial para o amadurecimento não apenas do produto mas da empresa em si. Bom feedback lhe direciona para as necessidades mais importantes do cliente, lhe permite desenvolver funcionalidades não pensadas ou conhecidas antes e, então, estar hábil a conquistar novos clientes. Novos clientes, mais do que apenas mais grana, implicam mais popularidade, fortalecimento da marca e amadurecimento, agora especialmente da empresa que já pode pensar em lançar novos produtos com uma legenda do tipo "dos mesmos produtores de bla bla bla...";&lt;br /&gt;&lt;br /&gt;2. Os tipos de vantagem trazidos pelo reuso são geralmente claras, imagine iniciar um projeto com 20% de código pronto, bonitinho. Mas, mais ainda, quando vc reusa código, percebe pontos nos quais ele pode melhorar, o contato mais freqüente lhe faz pensar sobre melhorias possíveis. É menos codigo para testar/corrigir/refatorar tambem. Sem reuso seu codigo/produto simplesmente não evolui e, novamente, daqui para frente vc pode imaginar sozinho.&lt;br /&gt;&lt;br /&gt;Para finalizar, ficam algumas dicas simples:&lt;br /&gt;&lt;br /&gt;1. Planeje! Mesmo planejamento mínimo é melhor do que nenhum e até metodologias ágeis como XP têm etapas para planejar o jogo. Planejamento geralmente passa por decidir escopo, atividades, como usar tempo e recursos disponíveis entre outras coisas, qualquer bom livro de gerenciamento de projetos explica como planejar. Depois, decidir e justificar, não se esqueça, quais tecnologias usar. Justificar lhe ajuda a fundamentar a escolha e evitar mudanças desnecessárias no decorrer do desenvolvimento;&lt;br /&gt;&lt;br /&gt;2. Defina metas de qualidade reais baseadas nos recursos e tempo disponíveis. Metas irreais criarão atrasos e frustrações desnecessárias. Lembre-se da filosofia de não tentar "tirar leite de pedra". Tente criar metas gerais e, dentro destas, metas menores que devem ser alcançadas em etapas. Assim fica mais fácil...&lt;br /&gt;&lt;br /&gt;3. ... controlar a qualidade, o que significa criar padrões e convenções a serem seguidas e verificar de maneira efetiva se são seguidas. Uma "convenção" interessante são testes. Obrigue-se a escrever testes. Só essa dica já daria para escrever outro post, testes praticamente gritam: "ei, isso aqui funciona".&lt;br /&gt;&lt;br /&gt;4. Revise e tente fazer o codigo evoluir entre um projeto e outro. Só siga essa dica se vc seguir a 3 também. Procure identificar pontos fracos no código, pontos onde há tendencias de se usar um padrão e refatorar o que conseguir identificar. Uma boa maneira de se fazer isso é usar algumas ferramentas de inspeção de codigo como o &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, &lt;a href="http://findbugs.sourceforge.net/"&gt;Findbugs&lt;/a&gt;, Metrics e &lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;5. Faça todos os envolvidos pensarem em qualidades para não ocorrerem dissiparidades em partes do projeto. Mesmo que todos não estejam no mesmo nivel de conhecimento, boa comunicação entre os desenvolvedores pode garantir ou ao menos diminuir as chances de os menos experientes cometerem erros.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111835579839979078?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111835579839979078/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111835579839979078' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111835579839979078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111835579839979078'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/06/qualidade-importa.html' title='Qualidade importa'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111686949453283025</id><published>2005-05-23T14:21:00.000-03:00</published><updated>2005-05-23T14:31:34.543-03:00</updated><title type='text'>Suggest com o Lucene</title><content type='html'>&lt;div style="text-align: justify;"&gt;Um recurso bastante interessante nos &lt;a href="http://www.google.com.br"&gt;mecanismos de busca mais sofisticados&lt;/a&gt; é o de sugestões. Funciona assim: você, usuário, digita algo errado e o mecanismo lhe sugere a palavra correta. Ou, em alguns outros casos, sugere outra palavra parecida com a que digitada mas com um numero maior de resultados. Algo como sugerir "lucene" se você digitar "luceni". Criar um mecanismo de sugestão com o &lt;a href="http://lucene.apache.org"&gt;Lucene&lt;/a&gt; é algo bastante simples. A maior parte da complicação está em definir se a estratégia trará as palavras mais parecidas ou as palavras parecidas com maior numero de resultados. Outro aspecto considerado é o quanto as palavras devem ser parecidas, ou seja, o grau de similaridade entre elas. No Lucene esse grau varia entre no intervalo [0,1] e o valor default é 0.5. Geralmente ambas as decisões são tomadas depois de alguns testes para verificar qual abordagem melhor se adequa ao seu caso, mas, para o grau de similaridade, quanto menor a base de índices, menor deve ser o grau mínimo requerido, já que não há muitas palavras a disposição. Feitas as escolhas, vamos a um exemplo simples. Criamos uma classe Suggest que encapsulará os dados, palavra e quantidade de resultados, de uma sugestão:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class Suggest implements Comparable&amp;lt;Suggest&amp;gt; {&lt;br /&gt;&lt;br /&gt;   private String word;&lt;br /&gt;   private int occurrences;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param word&lt;br /&gt;    * @param occurrences&lt;br /&gt;    */&lt;br /&gt;   public Suggest ( String word, int occurrences ) {&lt;br /&gt;&lt;br /&gt;      this.word = word;&lt;br /&gt;      this.occurrences = occurrences;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @see java.lang.Object#equals(java.lang.Object)&lt;br /&gt;    */&lt;br /&gt;   public boolean equals( Object obj ) {&lt;br /&gt;&lt;br /&gt;      boolean result = false;&lt;br /&gt;&lt;br /&gt;      if (obj instanceof Suggest) {&lt;br /&gt;&lt;br /&gt;         Suggest suggest = (Suggest) obj;&lt;br /&gt;&lt;br /&gt;         String sWord = suggest.word.toLowerCase();&lt;br /&gt;         String thisWord = word.toLowerCase();&lt;br /&gt;&lt;br /&gt;         result = sWord.equals(thisWord)&lt;br /&gt;               &amp;and;&amp;and; occurrences == suggest.occurrences;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return result;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @see java.lang.Object#hashCode()&lt;br /&gt;    */&lt;br /&gt;   public int hashCode() {&lt;br /&gt;&lt;br /&gt;      return word.toLowerCase().hashCode() * occurrences;&lt;br /&gt;     &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @see java.lang.Object#toString()&lt;br /&gt;    */&lt;br /&gt;   public String toString() {&lt;br /&gt;&lt;br /&gt;      return word + " - " + occurrences;&lt;br /&gt;     &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param other&lt;br /&gt;    * @return&lt;br /&gt;    * @see java.lang.Comparable#compareTo(T)&lt;br /&gt;    */&lt;br /&gt;   public int compareTo( Suggest other ) {&lt;br /&gt;&lt;br /&gt;      return other.occurrences - occurrences;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @return Returns the occurrences.&lt;br /&gt;    */&lt;br /&gt;   public int getOccurrences() {&lt;br /&gt;&lt;br /&gt;      return occurrences;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @return Returns the word.&lt;br /&gt;    */&lt;br /&gt;   public String getWord() {&lt;br /&gt;&lt;br /&gt;      return word;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A classe é &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html"&gt;Comparable&lt;/a&gt; para permitir a ordenação de acordo com o numero de documentos nos quais o termo procurado aparece. E agora a classe que cria as sugestões a partir do seu índice:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.Reader;&lt;br /&gt;import java.io.StringReader;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Collections;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import org.apache.lucene.analysis.Analyzer;&lt;br /&gt;import org.apache.lucene.analysis.Token;&lt;br /&gt;import org.apache.lucene.analysis.TokenStream;&lt;br /&gt;import org.apache.lucene.index.IndexReader;&lt;br /&gt;import org.apache.lucene.index.Term;&lt;br /&gt;import org.apache.lucene.index.TermEnum;&lt;br /&gt;import org.apache.lucene.search.FuzzyQuery;&lt;br /&gt;import org.apache.lucene.search.FuzzyTermEnum;&lt;br /&gt;import org.apache.lucene.store.Directory;&lt;br /&gt;import org.apache.lucene.store.FSDirectory;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author Marcos Silva Pereira - marcos.pereira@vicinity.com.br&lt;br /&gt; *&lt;br /&gt; *&lt;br /&gt; * @since 21/05/2005&lt;br /&gt; * @version $Id$&lt;br /&gt; */&lt;br /&gt;public class Suggestor {&lt;br /&gt;&lt;br /&gt;   private Directory lucenePath;&lt;br /&gt;   private Analyzer analyzer;&lt;br /&gt;   private float minSimilarity = FuzzyQuery.defaultMinSimilarity;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param path&lt;br /&gt;    * @param analyzer&lt;br /&gt;    * @param similarity&lt;br /&gt;    */&lt;br /&gt;   public Suggestor ( Directory path, Analyzer analyzer, float similarity ) {&lt;br /&gt;&lt;br /&gt;      lucenePath = path;&lt;br /&gt;      minSimilarity = similarity;&lt;br /&gt;      this.analyzer = analyzer;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param word&lt;br /&gt;    * @param field&lt;br /&gt;    * @return&lt;br /&gt;    */&lt;br /&gt;   public List&amp;lt;Suggest&amp;gt; suggestsByFrequency( String word, String field ) {&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggests = suggestsBySimilarity(word, field);&lt;br /&gt;&lt;br /&gt;      Collections.sort(suggests);&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param word&lt;br /&gt;    * @param field&lt;br /&gt;    * @param maxSuggestions&lt;br /&gt;    * @return&lt;br /&gt;    */&lt;br /&gt;   public List&amp;lt;Suggest&amp;gt; suggestsByFrequency( String word, String field,&lt;br /&gt;         int maxSuggestions ) {&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggests = suggestsByFrequency(word, field);&lt;br /&gt;&lt;br /&gt;      suggests = chopList(maxSuggestions, suggests);&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param word&lt;br /&gt;    * @param field&lt;br /&gt;    * @param maxSuggestions&lt;br /&gt;    * @return&lt;br /&gt;    */&lt;br /&gt;   public List&amp;lt;Suggest&amp;gt; suggestsBySimilarity( String word, String field,&lt;br /&gt;         int maxSuggestions ) {&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggests = suggestsBySimilarity(word, field);&lt;br /&gt;&lt;br /&gt;      suggests = chopList(maxSuggestions, suggests);&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param word&lt;br /&gt;    * @param field&lt;br /&gt;    * @return&lt;br /&gt;    * @throws IOException&lt;br /&gt;    */&lt;br /&gt;   public List&amp;lt;Suggest&amp;gt; suggestsBySimilarity( String word, String field ) {&lt;br /&gt;&lt;br /&gt;      IndexReader reader = null;&lt;br /&gt;&lt;br /&gt;      try {&lt;br /&gt;&lt;br /&gt;         List&amp;lt;Suggest&amp;gt; suggests;&lt;br /&gt;&lt;br /&gt;         reader = IndexReader.open(lucenePath);&lt;br /&gt;         Term term = new Term(field, word);&lt;br /&gt;&lt;br /&gt;         FuzzyTermEnum termEnum;&lt;br /&gt;         termEnum = new FuzzyTermEnum(reader, term, minSimilarity);&lt;br /&gt;&lt;br /&gt;         suggests = termEnumToList(termEnum);&lt;br /&gt;&lt;br /&gt;         return suggests;&lt;br /&gt;&lt;br /&gt;      } catch (IOException ex) {&lt;br /&gt;&lt;br /&gt;         throw new SuggestException(ex);&lt;br /&gt;&lt;br /&gt;      } finally {&lt;br /&gt;&lt;br /&gt;         try {&lt;br /&gt;&lt;br /&gt;            if (reader != null)&lt;br /&gt;               reader.close();&lt;br /&gt;&lt;br /&gt;         } catch (Exception ex) {&lt;br /&gt;&lt;br /&gt;            // TODO log this exception...&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param phrase&lt;br /&gt;    * @param field&lt;br /&gt;    * @return&lt;br /&gt;    */&lt;br /&gt;   public List&amp;lt;Suggest&amp;gt; phrasalSuggest( String phrase, String field ) {&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggests = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;&lt;br /&gt;      TokenStream tokenStream = null;&lt;br /&gt;     &lt;br /&gt;      try {&lt;br /&gt;        &lt;br /&gt;         Reader reader = new StringReader(phrase);&lt;br /&gt;         tokenStream = analyzer.tokenStream(field,  reader);&lt;br /&gt;        &lt;br /&gt;         Token token;&lt;br /&gt;         while((token = tokenStream.next()) != null) {&lt;br /&gt;           &lt;br /&gt;            String tokenText = token.termText();&lt;br /&gt;            List&amp;lt;Suggest&amp;gt; temp = suggestsByFrequency(tokenText, field, 1);&lt;br /&gt;           &lt;br /&gt;            if(!temp.isEmpty()) {&lt;br /&gt;              &lt;br /&gt;               suggests.addAll(temp);&lt;br /&gt;              &lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;         }&lt;br /&gt;        &lt;br /&gt;      } catch (IOException ex) {&lt;br /&gt;        &lt;br /&gt;         throw new SuggestException(ex);&lt;br /&gt;        &lt;br /&gt;      } finally {&lt;br /&gt;        &lt;br /&gt;         try {&lt;br /&gt;           &lt;br /&gt;            if(tokenStream != null) tokenStream.close();&lt;br /&gt;           &lt;br /&gt;         } catch (IOException ex) {&lt;br /&gt;           &lt;br /&gt;            // TODO Logger this exception&lt;br /&gt;           &lt;br /&gt;         }&lt;br /&gt;        &lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private List&amp;lt;Suggest&amp;gt; termEnumToList( TermEnum termEnum )&lt;br /&gt;         throws IOException {&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggests = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;&lt;br /&gt;      while (termEnum.next()) {&lt;br /&gt;&lt;br /&gt;         Term term = termEnum.term();&lt;br /&gt;&lt;br /&gt;         String termValue = term.text();&lt;br /&gt;         int frequency = termEnum.docFreq();&lt;br /&gt;&lt;br /&gt;         suggests.add(new Suggest(termValue, frequency));&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private List&amp;lt;Suggest&amp;gt; chopList( int maxSuggestions, List&amp;lt;Suggest&amp;gt; suggests ) {&lt;br /&gt;&lt;br /&gt;      if (suggests.size() &amp;gt; maxSuggestions) {&lt;br /&gt;&lt;br /&gt;         suggests = suggests.subList(0, maxSuggestions);&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return suggests;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Os métodos suggestBySimilarity trazem as palavras mais parecidas com a buscada e não se preocupam com o numero de documentos com os quais o termo buscado está relacionado. Já os métodos suggestsByFrequency trazem primeiro as palavras parecidas e com maior numero de documentos. Nesse caso, o numero de documentos é determinante e a similaridade é usada apenas para retornar o conjunto de palavras. Infelizmente o Lucene não provê o grau de similaridade para que se pudesse criar uma media entre esse grau e o numero de documentos. O método phrasalSuggest gera um conjunto de sugestões baseado na frase indicada. Um analyzer é usado para que as palavras da consulta sejam tratadas do mesmo modo que são para a busca. Assim, stop words, palavras descartadas por serem muito comuns, não receberão uma sugestão e daí por diante. Usar a classes Suggestor nas classes clientes é bastante simples. Em uma action do &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork&lt;/a&gt;, por exemplo, bastaria fazer algo como a seguir:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class ActionSearch extends ActionSupport {&lt;br /&gt;&lt;br /&gt;   private Suggestor suggestor;&lt;br /&gt;   private List&amp;lt;Suggest&amp;gt; suggests;&lt;br /&gt;&lt;br /&gt;   private List searchResult;&lt;br /&gt;   private String query;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @return Action execute status&lt;br /&gt;    */&lt;br /&gt;   public String findByText() {&lt;br /&gt;&lt;br /&gt;      String result = Action.ERROR;&lt;br /&gt;&lt;br /&gt;      try {&lt;br /&gt;&lt;br /&gt;         // abstraia a busca, afinal o foco está em como fazer as sugestões&lt;br /&gt;         this.searchResult = Mystical.doSearch(query);&lt;br /&gt;&lt;br /&gt;         // recuperando conjunto de sugestões.&lt;br /&gt;         this.suggests = suggests();&lt;br /&gt;&lt;br /&gt;         result = Action.SUCCESS;&lt;br /&gt;&lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;&lt;br /&gt;         addActionError("Erro ao realizar a busca: " + e.getMessage());&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return result;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   private List&amp;lt;Suggest&amp;gt; suggests() {&lt;br /&gt;     &lt;br /&gt;      List&amp;lt;Suggest&amp;gt; suggestions = new ArrayList&amp;lt;Suggest&amp;gt;();&lt;br /&gt;     &lt;br /&gt;      try {&lt;br /&gt;        &lt;br /&gt;         // pode acreditar, a classe Mystical faz um café de primeira&lt;br /&gt;         suggestions = suggestor.suggestsByFrequency(query, Mystical.FIELD_TO_SEARCH, 2);&lt;br /&gt;        &lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;        &lt;br /&gt;         // TODO logger this exception&lt;br /&gt;        &lt;br /&gt;      }&lt;br /&gt;     &lt;br /&gt;      return suggestions;&lt;br /&gt;     &lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   // gets and sets&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O método suggests foi criado para realizar o tratamento de exceções, ou seja, se a recuperação das sugestões lançar alguma exception, a busca é feita, como é de se esperar. As sugestões ficam então disponíveis para serem usadas na pagina que mostra o resultado da busca. Por fim, os códigos acima estão sendo desenvolvidos para o projeto &lt;a href="http://www.javabb.org"&gt;JavaBB&lt;/a&gt; e não demora a estarem disponíveis (sem mágicas, ou quase) no CVS do projeto. Até lá!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111686949453283025?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111686949453283025/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111686949453283025' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111686949453283025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111686949453283025'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/05/suggest-com-o-lucene.html' title='Suggest com o Lucene'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111575948068758315</id><published>2005-05-10T18:00:00.000-03:00</published><updated>2005-05-10T18:11:20.703-03:00</updated><title type='text'>Lucene e Compass</title><content type='html'>&lt;div style="text-align: justify;"&gt;O meu esquema de criar anotações para o &lt;a href="http://lucene.apache.org/java/docs/index.html"&gt;Lucene&lt;/a&gt; ficou quase sem sentido quando descobri o &lt;a href="http://compass.sourceforge.net/"&gt;Compass&lt;/a&gt;, uma biblioteca que usa uma especie de mapeamento de campos de um objeto para campos do Lucene. Quase porque ele usa XML, num esquema parecido com o &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, para realizar o mapeamento e isso é algo que eu gostaria muito de evitar. Fora isso, o Compass possui um esquema de Template e Callback bastante familiar para quem já tentou usar o &lt;a href="http://www.springframework.org"&gt;Spring&lt;/a&gt;. Penso seriamente em ajudar no desenvolvimento do projeto, em especial, criar interceptors para tornar o compass menos intrusivo quando usado com o Spring, anotações baseadas na DTD deles e quem sabe um modulo &lt;a href="http://xdoclet.sourceforge.net/"&gt;XDoclet&lt;/a&gt;, só para manter o projeto compativel com versões antigas do Java.&lt;br /&gt;&lt;br /&gt;O dificil até agora tem sido entrar em contato com os desenvolvedores. Simplesmente não consegui assinar a lista de desenvolvedores. Vou tentar contato direto com o lider do projeto e ver como posso ajudar.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111575948068758315?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111575948068758315/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111575948068758315' title='31 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111575948068758315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111575948068758315'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/05/lucene-e-compass.html' title='Lucene e Compass'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111402122259621592</id><published>2005-04-20T15:18:00.000-03:00</published><updated>2005-04-20T15:41:53.756-03:00</updated><title type='text'>Anotações no Tiger</title><content type='html'>Comecei a usar com mais força alguns recursos do &lt;a href="http://java.sun.com/j2se/1.5.0/index.jsp"&gt;Tiger&lt;/a&gt;, a nova versão de Java, e apesar de à primeira vista algumas coisas terem jeitão de sugar syntax, a maioria das inovações deixou a linguagem bem mais prática. O loop for a lá foreach é um exemplo disso porque não chega a inovar, mas apenas melhorar, iterações sobre arrays ou coleções de objetos. Lembro que quando comecei a programar em Java eu detestava ter que fazer algo assim:&lt;br /&gt;&lt;pre&gt;List objects = ...&lt;br /&gt;...&lt;br /&gt;Iterator iterator = objects.iterator();&lt;br /&gt;while(iterator.hasNext()) {&lt;br /&gt;Something some = (Something)iterator.next();&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;Claro, depois que descobri a maneira "correta" de se fazer isso era:&lt;br /&gt;&lt;pre&gt;List objects = ...&lt;br /&gt;...&lt;br /&gt;for(Interator it = objects.iterator();it.hasNext();) {&lt;br /&gt;Something some = (Something)iterator.next();&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;Não chega a ser tão diferente do while, e também, não tem a legibilidade de um foreach:&lt;br /&gt;&lt;pre&gt;List&lt;something&gt; objects = ...&lt;br /&gt;for(Something some: objects) {&lt;br /&gt;...&lt;br /&gt;}&lt;/something&gt;&lt;/pre&gt;Bem melhor, não?! Mas, até agora a feature que tem sido mais útil para mim são annotations. Poder dar a uma classe, metodo, atributo, parametro, whatever mais informações do que apenas um nome e tipo é algo extremamente poderoso. Agora, por exemplo, estou trabalhando em um pequeno conjunto de anotações que me permita traduzir atributos de uma classe para campos de um documento do &lt;a href="http://lucene.apache.org/java/docs/index.html"&gt;Lucene&lt;/a&gt;. Já havia feito algo semelhante com reflexão apenas, mas o treco fica tão genérico que chega a não valer a pena já que trato todos os atributos de maneira completamente uniforme. Decidi então criar a seguinte anotação:&lt;br /&gt;&lt;pre&gt;@Documented&lt;br /&gt;@Target( ElementType.FIELD )&lt;br /&gt;@Retention( RetentionPolicy.RUNTIME )&lt;br /&gt;public @interface LuceneField {&lt;br /&gt;&lt;br /&gt;String name();&lt;br /&gt;boolean index() default true;&lt;br /&gt;boolean store() default false;&lt;br /&gt;boolean tokenize() default true;&lt;br /&gt;float boost() default 1.0f;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;Com ela posso descrever os atributos de uma classe num nível de granularidade impossível de ser alcançado apenas com reflection. Para exemplificar, vejamos a seguinte classe:&lt;br /&gt;&lt;pre&gt;public class People implements Serializable {&lt;br /&gt;&lt;br /&gt;@LuceneField(index=true,&lt;br /&gt;  tokenize=false,&lt;br /&gt;  store=true,&lt;br /&gt;  name="peopleid")&lt;br /&gt;private Long id;&lt;br /&gt;&lt;br /&gt;@LuceneField(index=true,&lt;br /&gt;  tokenize=true,&lt;br /&gt;  store=true,&lt;br /&gt;  name="peopleName")&lt;br /&gt;private String name;&lt;br /&gt;&lt;br /&gt;@LuceneField(index=true,&lt;br /&gt;  tokenize=false,&lt;br /&gt;  store=true,&lt;br /&gt;  name="peopleEmail")&lt;br /&gt;private String email;&lt;br /&gt;&lt;br /&gt;// some stuff&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;Depois, uma helper class traduz objetos dessa classe e de qualquer outra que use as anotações para um Document. Bem legal e relativamente fácil de implementar. Há ainda outras anotações, mas eu mostro depois quando a idéia estiver mais amadurecida. Para escrever essa tralha toda baixei o &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.1M6-200504011645/index.php"&gt;Eclipse3.1M6&lt;/a&gt; que também tem boas novidades e as incompatibilidades de sempre com plugins feitos para a versão anterior. Por falar em forward/backward compatibility, esse é um dos problemas com o código atual que estou produzindo, nem adianta MESMO tentar usar em uma versão anterior do Java. De qualquer modo, como estou em um ambiente muito controlado, não vale a pena esperar (mais ainda) para usar as novas features em aplicações reais.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111402122259621592?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111402122259621592/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111402122259621592' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111402122259621592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111402122259621592'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/anotaes-no-tiger.html' title='Anotações no Tiger'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111348786561160173</id><published>2005-04-14T10:19:00.000-03:00</published><updated>2005-05-10T17:58:19.040-03:00</updated><title type='text'>dois mil anos de invenções.</title><content type='html'>&lt;div style="text-align: justify;"&gt;"Qual é a mais importante invenção dos últimos dois mil anos?" Essa é a pergunta que uma série de "cientistas da terceira cultura" ligados ao &lt;a href="http://www.edge.org/"&gt;EDGE&lt;/a&gt; tentaram responder e deu origem ao livro "&lt;a href="http://www.objetiva.com.br/releases/280-9.htm"&gt;As Maiores Invenções dos Últimos 2000 Anos&lt;/a&gt;". Há algumas sugestões bastante peculiares como "a borracha de apagar", "a musica clássica ocidental" e outras. Ainda, detalhes interessantes como alguns darem sugestões completamente desligadas a area em que atual. Mas há também, respostas que indicam invenções mais ao alcance de todos, como a televisão, a imprensa e a Internet. E minha resposta para a pergunta passa por essas três ultimas. Para mim, a mais importante invenção dos últimos dois mil anos tem raízes em um espaço de tempo maior do que o proposto pela pergunta e não se trata de um objeto ou máquina, mas sim de um conceito. E a resposta é a "divulgação da informação" que, notadamente, surgiu, talvez por instinto ou não, nas pinturas rupestres. Alguns antropólogos e arqueólogos vêem as pinturas rupestres não como uma maneira de divertimento ou arte e sim como um registro das atividades e métodos para, por exemplo, realizar caçadas e rituais. É bem natural que o homem tenha percebido que era bem mais interessante registrar como se caça, como o fogo surge, ou como os rituais eram feitos do que ensinar tudo de maneira tácita.&lt;br /&gt;&lt;br /&gt;E depois, a necessidade de transmitir informação se desenvolveu das paredes para os papiros, destes até chegar ao papel, e da escrita à mão até à &lt;a href="http://inventors.about.com/library/inventors/blJohannesGutenberg.htm"&gt;imprensa de Gutenberg&lt;/a&gt;. E aí, a imprensa deu velocidade antes não imaginada a capacidade de divulgar informação. Ora, prensar livros em série ao invés de escrevê-los é algo infinitamente mais prático por uma série de motivos óbvios. Depois de todas as evoluções feitas à técnica, impressão em jornais, melhores papéis, impressão à cores, surge outro meio de informação: a tv! Claro, antes outros, o rádio e o telegrafo, mas nenhum com poderes próximos ao da televisão. E não conseguiriam, não com a televisão dando capacidade de ver e ouvir ao mesmo tempo, atingindo mais sentidos, o impacto do assistir, de ver, afinal, "o que eu escuto, eu esqueço; o que eu vejo, eu lembro". E eis que a velocidade para fazer a informação circular cresce em curva vertiginosa novamente. Com ela, a TV, foi possível saber, ver, alias, o que se passava em outros cantos do planeta. E criou-se, a meu ver, efetivamente, o que Pierre Levi chama de desterritorialização, você não pensa mais tão fortemente onde os fatos, a informação, ocorreu. Pensa, isso sim, "eu vi na televisão." Não pensa, a priori, de onde a informação está vindo, pensa para onde está indo, para a televisão. Pensa nos canais antes de pensar nos locais.&lt;br /&gt;&lt;br /&gt;E, por fim, depois das transmissões a satélite, das manchetes depois do jantar, surge a Internet, filha da &lt;a href="http://www.dei.isep.ipp.pt/docs/arpa.html"&gt;ARPANET&lt;/a&gt; (neta, ou a versão amadurecida da coisa, sei lá, ora bolas), com informações mais desterritorializadas ainda, eu não penso onde o Google está, fisicamente falando, claro, e sim no endereço que devo acessar, se está nos EUA, no Canadá ou na Conchinchina, não me importa, importa o endereço. Mas, mais do que isso, a Internet mudou também, ou melhor, deu maior velocidade, a geração da informação. Não são mais apenas escritores, repórteres, mulheres do tempo a me dizer o que se passa. Sou eu escrevendo em um blog, tenho minha página na Internet onde gero tanta informação (e lixo) quanto sou capaz. São, pelo menos 50 bilhões de páginas, e o numero aumento, lá vamos nós, vertiginosamente. Talvez como não se tenha visto na imprensa e na televisão. Nem poderia ser!&lt;br /&gt;&lt;br /&gt;Afinal, os tempos são outros, mas as razões, a meu ver ainda são as mesmas. Os meios evoluíram com a própria humanidade. Antes, apenas se preocupar com a caça e com o grupo, então para que diacho publicar livros? Depois, tribos, cidades, castas, hierarquias, não dava para dizer "ei, cruza o mar e vem aqui sacar o que escrevi na minha caverna", então, a escrita em papiro, papel, mais simples de transportar do que uma caverna (leitor, essa é a única certeza nesse texto, o resto são especulações de uma mente pouco saudável). Os livros supriram a necessidade dos países, nos continentes, a necessidade de bem mais gente no mundo. Escrever a mão era praticamente impossível já que não é um tipo de produção em série. A TV para um mundo já parcialmente globalizado, mais cidades, mais gente ainda. Era natural que surgisse um meio mais barato e rápido do que livros ou jornais impressos. E, por fim, a Internet, a &lt;a href="http://www.w3.org/"&gt;World Wide Web&lt;/a&gt;, com implicações, ainda não decidi, além da transmissão de informação. Escolho a "divulgação da informação" porque acredito ser o alicerce para muitas outras das invenções descritas no livro. Até mesmo para a borracha de apagar!&lt;br /&gt;&lt;br /&gt;ps.: Eu já até imagino Diego Salcedo vir aqui e dizer algo do tipo "Mas blá, a informação sempre esteve sobre o controle de alguem, do faraó, sei lá, e nem todos têm acesso." E eu digo, "porra bla, eu sei, quer dizer, lembrava mais não, mas sei. Escreve sobre então, carai!".&lt;br /&gt;&lt;br /&gt;valeuz...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111348786561160173?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111348786561160173/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111348786561160173' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111348786561160173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111348786561160173'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/dois-mil-anos-de-invenes.html' title='dois mil anos de invenções.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111330550770132616</id><published>2005-04-12T08:27:00.000-03:00</published><updated>2005-04-12T08:31:47.703-03:00</updated><title type='text'>Filosofia da informação</title><content type='html'>É parceiro blá...informar pra q e pra q informar...dizem q é uma necessidade humana...num sei não...informação na virada do século XX surge-nos mais como um produto imperativo à nossa sobrevivência...num sei não...surge com temática de estudo científico...num sei não...é...de tudo q sei...num sei não...na verdade quero ir surfar um pouco e depois deitar numa rede para sentir-me parte de uma metainformação potencial universal ou  (MIPU)...assina DS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111330550770132616?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111330550770132616/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111330550770132616' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111330550770132616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111330550770132616'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/filosofia-da-informao.html' title='Filosofia da informação'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111324821230067963</id><published>2005-04-11T16:35:00.000-03:00</published><updated>2005-04-11T16:37:04.073-03:00</updated><title type='text'>Meu nome é bla</title><content type='html'>Aê, finalmente viagens viajadas da vida viajada. Vou abrir, aqui, nesse momento, a faculdade dos doidões.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111324821230067963?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111324821230067963/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111324821230067963' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111324821230067963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111324821230067963'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/meu-nome-bla.html' title='Meu nome é bla'/><author><name>Diego Salcedo</name><uri>http://www.blogger.com/profile/09818114617807177410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111322385091289767</id><published>2005-04-11T09:42:00.000-03:00</published><updated>2005-04-11T09:50:50.913-03:00</updated><title type='text'>Lucene.</title><content type='html'>Para aproveitar um pouco melhor o pouco tempo livre das férias, resolvi escrever um artigo sobre o &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt;. Eu gosto bastante dessa API então, nada melhor do que aproveitar e escrever sobre. A idéia, na verdade, começou com &lt;a href="http://www.liber.ufpe.br/snipsnap/space/Jakarta+Lucene"&gt;um post na wiki&lt;/a&gt; de onde trabalho, mas eu confesso que não havia gostado do resultado. Aliás, escrevi na filosofia de wiki mesmo, "depois alguém melhora isso." Então, quando sugeri ao &lt;a href="http://www.javafree.com.br"&gt;JavaFree&lt;/a&gt; que poderia criar um tutorial a partir da entrada na Wiki alguém teve a ótima idéia de tentar publicar na revista &lt;a href="http://www.mundojava.com.br/"&gt;MundoJava&lt;/a&gt;, ao invés de apenas publicar no portal. Vamos ver, ainda não entrei em contato oficial com a revista, mas, espero conseguir a publicação e, se não conseguir, ao menos é um bom tutorial para o JavaFree.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111322385091289767?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111322385091289767/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111322385091289767' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111322385091289767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111322385091289767'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/lucene.html' title='Lucene.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111322330990650024</id><published>2005-04-11T09:41:00.000-03:00</published><updated>2005-04-11T09:41:49.906-03:00</updated><title type='text'>Meu código, meu precioso código... ou nem tanto.</title><content type='html'>É quase regra um programador não gostar do código de outros a menos que esse se pareça com o seu e, também, achar seus códigos antigos ruins, o que é completamente natural se vc considerar que evoluiu um bocado desde os tempos em que escreveu aquelas linhas de qualidade duvidosa. Foi justamente essa a sensação que tive quando, muito por acaso, encontrei alguns códigos de um projeto do qual participei em 2000. Os códigos não eram todos meus, mas vou assumir a culpa já que eu poderia ter ajudado a tornar as coisas melhores. Havia tantas más praticas que ativar o &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, &lt;a href="http://metrics.sourceforge.net/"&gt;Metrics&lt;/a&gt; e &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; fez o &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; travar.&lt;br /&gt;&lt;br /&gt;Os problemas mais comuns eram programação baseada em classes e não em interfaces, blocos condicionais complicados, métodos gritando por refactoring, quebra total do MVC, hierarquias de herança completamente desnecessárias, muito código sem qualquer conhecimento de &lt;a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt"&gt;YAGNI&lt;/a&gt;, singletons adoidados, checked exceptions aos montes e outras esquisitices que não vou citar sob o risco de ser apedrejado nas ruas. Mas não dá para negar, minha atenção se voltou principalmente para a total falta de uso de componentes, frameworks ou bibliotecas de classes prontas. Pool de conexões manual, MVC manual, persistência via plain JDBC (não me lembro de ter visto outras aplicações que permitiam tanto &lt;a href="http://www.securiteam.com/securityreviews/5DP0N1P76E.html"&gt;SQL Injection&lt;/a&gt;), sequer uma ferramenta de automação, como o &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;, por exemplo, era usada.&lt;br /&gt;&lt;br /&gt;Então, lá fui eu fazer algumas estatísticas superficiais: entre as minhas 401 classes (401 classe?! Meu Deus!), dividas em 60 pacotes, 131 eram... Exceptions, o que indica graves problemas. Não vou explicar o projeto, mas acreditem, 401 classes são demais e, quando mais de 30% das suas classes são Exceptions, pode acreditar, existe algo de muito errado. Pior ainda, NENHUMA era unchecked e, daí, o errado passa a podre. Outro erro crasso era a total falta de abstração. Mesmo onde existiam interfaces, e elas eram apenas 42, era fácil encontrar algo do tipo:&lt;br /&gt;&lt;pre&gt;MinhaInterface bla = new MinhaClasse();&lt;/pre&gt; Ou seja, sem uma abstração para criar os objetos, não adianta muito ter interfaces. Mas isso é fichinha perto do método abaixo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setValue() {&lt;br /&gt;if (value == null) {&lt;br /&gt;    throw new IllegalArgumentException();&lt;br /&gt;} else {&lt;br /&gt;    this.value = value;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Muito útil, não?! Bom, baseado no lixo que eram meus códigos, ficam algumas dicas: 1) Tente pensar de maneira simples; 2) Tenha em mente YAGNI (401 classes?! Humpf!); 3) Usar &lt;a href="http://sourceforge.net/"&gt;frameworks&lt;/a&gt; &lt;a href="http://java.net/"&gt;e libraries&lt;/a&gt; &lt;a href="http://jakarta.apache.org/"&gt;de terceiros&lt;/a&gt; não vai fazer mal algum, então pesquise antes de tentar implementar uma solução caseira; 4) pense um pouco antes de criar uma Exception filha que não acrescenta informação a Exception pai; 5) unchecked exceptions são geralmente uma alternativa interessante; 6) Cuidado com aquelas classes MinhasOperacoesMalucas ou similares, em especial quando elas contem comentários do tipo "LIXÃO DO CODIGO ANTERIOR". E ficam também algumas constatações: 1) Eu aprendi muito em fóruns, mas pesquisar me ensinou mais ainda; 2) mudar do JBuilder para o Eclipse e usar ferramentas para inspeção de codigo me fez bem; 3) ainda bem que inventaram container de IoC e AOP; 4) testes podem até parecer chatos, mas são legais; 5) não tive preguiça de ler documentações e livros como o &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201310058/002-9774816-2744048?v=glance"&gt;Effective Java&lt;/a&gt;, então, considere se tornar um bom leitor de bons livros.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111322330990650024?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111322330990650024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111322330990650024' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111322330990650024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111322330990650024'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/04/meu-cdigo-meu-precioso-cdigo-ou-nem.html' title='Meu código, meu precioso código... ou nem tanto.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111204575282360319</id><published>2005-03-28T18:30:00.000-03:00</published><updated>2005-03-28T18:41:05.563-03:00</updated><title type='text'>KISS</title><content type='html'>Simplicidade é um conceito que ganha pontos comigo a cada dia e em quase tudo que faço ultimamente me pergunto duas coisas: Isso é simples? Se não é o suficiente, eu preciso da complicação que criei? Alias, esse é o tipo de pergunta que surge na minha cabeça a cada cinco minutos enquanto estudo &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;. Sempre tento pensar sobre os paradigmas de Java e muitos deles não fazem sentido algum em Ruby. Mas, voltemos à simplicidades: é um tanto complicado dizer que algo é simples ou não porque isso depende, e muito, do ponto de vista e conhecimentos de quem julga. A combinação &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; + &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; + &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork&lt;/a&gt;, por exemplo, pode parecer um monstro se quem olha não tem conhecimento de nenhum dos três e, talvez, principalmente, se não conhece os padrões e idéias sobre as quais cada um destes foi construído. Abstração e independência de banco de dados, loose coupling com &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;IoC &lt;/a&gt;e &lt;a href="http://aosd.net/"&gt;AOP&lt;/a&gt;, &lt;a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html"&gt;MVC&lt;/a&gt; e Command simplesmente não têm utilidade se você nunca usou e, mais do que isso, se você nunca precisou usar.&lt;br /&gt;&lt;br /&gt;Enquanto lia o ótimo &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0596006764?v=glance"&gt;Better, Faster, Lighter Java&lt;/a&gt;, vi, ou melhor, revi simplicidade como um conceito fundamental no desenvolvimento de software, mas, revi também que ser simples está tão distante de ser simplista quanto possível. E é aí que mora o perigo. É muito comum confundir os dois conceitos e tentar criar coisas simplistas que ferem outros conceitos fundamentais de desenvolvimento como pouco acoplamento e extensibilidade apenas para ficar nos mais conhecidos. É comum não usar um determinado e emergente, e entenda por emergente adequado ao problema, padrão de projeto quando você decide que não vai pagar os custos em troca dos benefícios apenas porque usar o padrão lhe parece ferir demais a simplicidade. Ou seja, você tende ao simplista.&lt;br /&gt;&lt;br /&gt;Aqui onde trabalho a arquitetura passa pelos dois frameworks abordados no Better, Faster, Lighter Java: Hibernate e Spring e ainda pelo WW. Alguns projetos são feitos em &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; e o debate surgiu daí. PHP é sem sombra de duvidas mais simples (ou seria simplista?), configurá-lo para funcionar com o Apache, diferente do Tomcat, é moleza e a curva de aprendizado, maior trunfo da linguagem, é ridícula de tão pequena. Em um fim de semana aprendi o suficiente para desenvolver um dos pequenos projetos. Acontece que para os projetos maiores PHP não é satisfatório, ou ao menos não parece ser, pois precisamos da tal abstração ao banco de dados (Hibernate), melhor separation of concerns como a provida pelo MVC (WW) e um container de IoC (Spring) que nos ajude a pensar em componentes e maior capacidade de reuso.&lt;br /&gt;&lt;br /&gt;A meu ver, nenhum desses frameworks é extremamente complicado. Alias, por focarem bem nos problemas que se prestam a resolver, eles são até bem simples. Claro, Ã primeira vista, juntar todos e jogar na cabeça de alguém pode não ser a melhor das idéias, mas não se pode negar que os benefícios oferecidos por cada um deles pagam com folga as complicações iniciais que trazem.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111204575282360319?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111204575282360319/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111204575282360319' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111204575282360319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111204575282360319'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/03/kiss.html' title='KISS'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-111204420700653231</id><published>2005-03-28T18:04:00.000-03:00</published><updated>2005-03-28T18:12:41.203-03:00</updated><title type='text'>Jablo: Talvez mais tarde</title><content type='html'>Pois é, depois de insistir um bocado quanto a usar o &lt;a href="http://www.javablogs.com.br/"&gt;Jablo&lt;/a&gt;, descobri não era mais possível manter &lt;a href="http://www.javablogs.com.br/blogs/page/marcos"&gt;u&lt;/a&gt;&lt;a href="http://www.javablogs.com.br/blogs/page/marcos"&gt;m blog por lá&lt;/a&gt;. Isso porque em boa parte do tempo o sistema está fora do ar e ler "Server Error" ou "HTTP 404" não é algo lá muito instrutivo. Eu espero muito sinceramente que o Jablo consiga resolver as broncas com hosting e, se conseguir, volto a escrever com prazer. Por enquanto, vou tentar repaginar alguns dos textos que escrevi por lá e publicar aqui.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;a href="http://www.javablogs.com.br/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-111204420700653231?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/111204420700653231/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=111204420700653231' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111204420700653231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/111204420700653231'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/03/jablo-talvez-mais-tarde.html' title='Jablo: Talvez mais tarde'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-110727852884117912</id><published>2005-02-01T14:02:00.000-03:00</published><updated>2006-01-18T10:22:22.376-03:00</updated><title type='text'>Desenvolvimento do Conhecimento</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uma das muitas vantagens de tirar férias é que você lê apenas textos realmente interessantes. Eu, em hipótese alguma, pararia para ler uma bula de remédio, os livros do Sidney Sheldon ou aqueles artigos sobre o novo release do JSeiLáOQue. Mas uma edição da &lt;a href="http://www.continentemulticultural.com.br/"&gt;Continente Multicultural&lt;/a&gt;, gibis da Mônica e um caderno especial da &lt;a href="http://revistaescola.abril.com.br/home/home.shtml"&gt;Revista Escola&lt;/a&gt; chamaram minha atenção. Este último continha uma série de escritos rápidos sobre como o pensamento e práticas a respeito de ensinar se desenvolveram. Os textos iam de &lt;a href="http://revistaescola.abril.com.br/edicoes/0176/aberto/pensadores.shtml"&gt;Skinner&lt;/a&gt; a &lt;a href="http://www.paulofreire.org/"&gt;Paulo Freire&lt;/a&gt; passando por Russeau e outros dos quais já ouvi falar na universidade, como &lt;a href="http://www.google.com.br/search?q=Vygotsky"&gt;Vygostky&lt;/a&gt; e &lt;a href="http://www.google.com.br/search?q=Piaget"&gt;Piaget&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mas, como nerd em época de férias sempre arruma um jeito para ligar toda e qualquer coisa a computador, enquanto lia o texto sobre &lt;a href="http://www.conteudoescola.com.br/site/index.php?option=com_content&amp;task=view&amp;amp;amp;amp;amp;amp;id=85&amp;Itemid=39"&gt;Comenius&lt;/a&gt;, lembrei de alguns trechos do &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201633612/104-5302479-5685557"&gt;livro sobre padrões de projetos do GoF&lt;/a&gt;. Comenius foi um dos primeiros a pensar na criação de “padrões” para a educação e em como se deve considerar o aspecto psicológico das crianças ao invés de apenas tratá-las como um repositorio de conhecimentos. Como era um pensador da época das colonizações, seus tratados tentavam ser tão universais quanto possível e, para universalizar, Comenius achou que deveria criar algumas restrições. Em particular, desenvolveu a tese de que todo o conhecimento da humanidade é estático. Era uma maneira inteligente de tratar com o desconhecido que tanto afligia aquela época e, mais do que isso, criar um sistema de educação que pudesse ser empregado em qualquer lugar, visto que o conhecimento estava completamente estabelecido.&lt;br /&gt;&lt;br /&gt;Diferente disso, o livro do GoF traz alguns pontos contrários bem interessantes. Claro, boa parte deles se desenvolveu ao longo do tempo e não foram, acreditem, os caras do GoF que os criaram. Já na introdução o livro afirma que não catalogou todos os padrões e mostra como registrar novos, uma clara notação tanto de que outros padrões conhecidos podem ser catalogados quanto criados. Além disso, existe outro conceito bastante interessante, e agora não lembro exatamente se é algo dito nesse livro, de que modelagem de software sempre pode evoluir. Ou seja, em tese, é sempre possível melhorar o design de uma aplicação qualquer. Se é viável ou não é outra história.&lt;br /&gt;&lt;br /&gt;Em sistemas pequenos pode ser difícil enxergar isso ou a regra pode simplesmente falhar. Mas, em sistemas mais complexos, e se levarmos em conta todo o ciclo de vida, fica fácil perceber que muito provavelmente melhorias podem ser feitas em algum ponto. O melhor deste tipo de pensamento - o conhecimento se desenvolve - como vieram a concluir outros pensadores posteriores a Comenius também retratados na revista, é a ampliação do próprio conhecimento e, no fim das contas, do estudo e aprendizado. Basta perceber que preciso parar de escrever besteira e ir ler a documentação do &lt;span style="font-weight: bold;"&gt;novo&lt;/span&gt; release do JSeiLáOQue.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-110727852884117912?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/110727852884117912/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=110727852884117912' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/110727852884117912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/110727852884117912'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/02/desenvolvimento-do-conhecimento.html' title='Desenvolvimento do Conhecimento'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10449143.post-110687312666103374</id><published>2005-01-27T21:32:00.000-03:00</published><updated>2005-01-27T21:49:26.536-03:00</updated><title type='text'>O Inicio.</title><content type='html'>Como todo blog que se preze, este tem que começar com um daqueles posts do tipo "apenas para inaugurar" ou "teste". Mas, para não fazer feio, aliás, para não fazer muito feio, vou falar sobre meu interesse por blogs. Ele surgiu quando o &lt;a href="http://www.guj.com.br/"&gt;GUJ&lt;/a&gt; e o &lt;a href="http://www.portaljava.com.br/"&gt;PortalJava&lt;/a&gt; lançaram o &lt;a href="http://www.javablogs.com.br/blogs/index.jsp"&gt;JavaBlogs&lt;/a&gt; e boa parte da comunidade Java do Brasil decidiu apoiar e participar. Apesar da iniciativa extremamente interessante, o sistema de blogs passava mais tempo fora do ar do que qualquer um de nós parcipantes gostaria. Eu até poderia deixar blogs de lado, mas acho que é um bom mecanismo para me manter escrevendo além dos &lt;a href="http://www.javafree.com.br/"&gt;foruns&lt;/a&gt; e, como herança do Jablo, apelido do JavaBlogs, ficou meu interesse por blogs.&lt;br /&gt;&lt;br /&gt;É fácil ver alguns bons blogs por aí e também é fácil perder a paciência quando vc procurar por a letra de uma música e acaba dando de cara com aqueles blogs cheio de "xeiosssss", "bjoxxxx" e outras coisas que vcs já devem estar cansados de ver. Então, para evitar parecer com um adolescente dislexo de 15 anos que escreve num dialeto pouco compreensivel, tentarei escrever posts com um bom português, mas, para não parecer com o professor Pasquale, não serie chato o suficiente para evitar alguns verbetes típicos da internet. Enfim, esse blog será sobre tecnologia, especialmente linguagens de programação, banco de dados, metadados e fones de ouvido. Mas também postarei sobre assuntos menos... ehrm, deixa pra lá, e falarei sobre fotografia, cinema e impressões que tiver sobre alguma leitura. É isso.&lt;br /&gt;&lt;br /&gt;ps.: O nome comunidade blastêmica veio de um grupo de amigos que se reunia para falar bla bla blas. Não sei se a palavra blastêmica faz parte do dicionário, mas, fazer o que, neologismo existe para isso mesmo.&lt;br /&gt;&lt;br /&gt;valeuz...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10449143-110687312666103374?l=blastemica.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blastemica.blogspot.com/feeds/110687312666103374/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10449143&amp;postID=110687312666103374' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/110687312666103374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10449143/posts/default/110687312666103374'/><link rel='alternate' type='text/html' href='http://blastemica.blogspot.com/2005/01/o-inicio.html' title='O Inicio.'/><author><name>Marcos Silva Pereira</name><uri>http://www.blogger.com/profile/13495778936763528590</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://www.cin.ufpe.br/~msp/DSC01212_menor.JPG'/></author><thr:total>0</thr:total></entry></feed>
