<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUINR30zeip7ImA9WhRaFE0.&quot;"><id>tag:blogger.com,1999:blog-27777000</id><updated>2012-02-16T12:46:36.382-02:00</updated><category term="linux" /><category term="domínio" /><category term="gtd" /><category term="testes" /><category term="javascript" /><category term="web" /><category term="paternidade" /><category term="livro" /><category term="selenium" /><category term="programação" /><category term="fedentina" /><category term="busca" /><category term="seo" /><category term="firefox" /><category term="meta" /><category term="design de interação" /><category term="política" /><category term="css" /><category term="sql" /><category term="python" /><category term="browser" /><category term="video" /><category term="design" /><category term="livros" /><category term="aprendizagem" /><category term="backup" /><category term="produtividade" /><category term="e-commerce" /><title>Não Tem Mosquito</title><subtitle type="html">As aventuras de se desenvolver software no nosso Patropi.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.mosquito.pro.br/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/NaoTemMosquito" /><feedburner:info uri="naotemmosquito" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>-22.57</geo:lat><geo:long>-43.12</geo:long><entry gd:etag="W/&quot;DkUNRnY-cSp7ImA9WxBXFUg.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-4436476219057668945</id><published>2010-01-26T23:02:00.001-02:00</published><updated>2010-01-26T23:04:57.859-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-26T23:04:57.859-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="aprendizagem" /><category scheme="http://www.blogger.com/atom/ns#" term="livros" /><title>Aprendendo a aprender, estudando o estudo</title><content type="html">Pra não ficar pra atrás no mundo da computação é preciso estudar sempre. Não existe este negócio de terminar a faculdade e parar de estudar. Parece que você é um hamster, que corre sem sair do lugar. &amp;nbsp;Para muitos é assustador.&lt;br /&gt;
&lt;br /&gt;
Já para mim, isto é o que mais gosto. Sempre há coisas novas para aprender e conhecer. Maneiras melhores de trabalhar. E se você está condenado a fazer isto toda sua vida, &lt;b&gt;por que não &lt;i&gt;aprender como se aprender&lt;/i&gt; e &lt;i&gt;estudar como se estuda&lt;/i&gt;?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A mais legal introdução sobre o assunto é o artigo &lt;a href="http://headrush.typepad.com/creating_passionate_users/2006/01/crash_course_in.html" title="Learning Theory (em inglês)"&gt;Curso rápido em Teoria da Aprendizem&lt;/a&gt; da Kathy Sierra, cujo ponto de vista é mais para quem ensina. Para me aprofundar mais, acabo de ler dois livros sobre o assunto: &lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050?ie=UTF8&amp;amp;tag=agenddosambachor&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Pragmatic Thinking and Learning: Refactor Your Wetware&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1934356050" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;, de Andy Hunt, e &lt;a href="http://www.amazon.com/How-Become-Straight-Student-Unconventional/dp/0767922719?ie=UTF8&amp;amp;tag=agenddosambachor&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;How to Become a Straight-A Student&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0767922719" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;, de Cal Newport.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050?ie=UTF8&amp;amp;tag=agenddosambachor&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 0.5em;" target="_blank"&gt;&lt;br /&gt;
&lt;img alt="Pragmatic Thinking and Learning: Refactor Your Wetware (Pragmatic Programmers)" height="300" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SS500_&amp;amp;ASIN=1934356050&amp;amp;tag=agenddosambachor" width="300" /&gt;&lt;/a&gt;Andy Hunt é co-autor do &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X?ie=UTF8&amp;amp;tag=agenddosambachor&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=020161622X" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;, um dos melhores livros sobre desenvolvimento de software. Seu novo livro &lt;a href="http://pragprog.com/titles/ahptl" title="Página oficial do livro"&gt;Pragmatic Thinking and Learning&lt;/a&gt; é inteiramente dedicado a como aprender de forma mais eficiente.&lt;br /&gt;
&lt;br /&gt;
Discute desde modelos de aprendizagem à importância da concentração. Pelo caminho a gente encontra várias dicas e técnicas para aperfeiçoar a aprendizagem. Vão desde o resultado de pesquisas científicas a duvidosas auto-ajudas. Como o próprio autor diz, é pra testar e passar a usar o que funcionar para você. &lt;br /&gt;
&lt;br /&gt;
O livro apresenta assuntos como o &lt;a href="http://www.mosquito.pro.br/2009/06/de-aprendiz-expert-uma-palestra-de-dave.html"&gt;&lt;b&gt;Modelo Dreyfus&lt;/b&gt;&lt;/a&gt; de aprendizagem, que é ótimo para conter a ansiedade quando se está aprendendo um assunto novo; &lt;b&gt;hemisférios direito e esquerdo do cérebro&lt;/b&gt;, mostrando a importância de alternar entre visões holísticas e específicas sobre o que se está estudando; objetivos de estudo &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/SMART_criteria"&gt;SMART&lt;/a&gt; (&lt;/b&gt;Specific, Measurable, Achievalbe, Relevant e Timeboxed); da necessidade de estudar constantemente e de forma deliberada; da eficiência de &lt;b&gt;grupos de estudo&lt;/b&gt;; técnicas de &lt;b&gt;leitura ativa&lt;/b&gt; de livros como a &lt;a href="http://www.studygs.net/portuges/txtred2.htm"&gt;&lt;b&gt;SQ3R&lt;/b&gt;&lt;/a&gt;; do uso de &lt;a href="http://en.wikipedia.org/wiki/Mind_map"&gt;&lt;b&gt;Mind Maps&lt;/b&gt;&lt;/a&gt;; e de &lt;b&gt;documentar e ensinar&lt;/b&gt; para aprender melhor; e até da importância da &lt;b&gt;concentração&lt;/b&gt; e como a &lt;b&gt;meditação&lt;/b&gt; pode ajudar a aprimorá-la. &lt;br /&gt;
&lt;br /&gt;
Ao contrário do Pragmatic Programmers, o estilo de escrita é meio seco e pouco fluente. Comparando a &lt;a href="http://www.mosquito.pro.br/2009/06/de-aprendiz-expert-uma-palestra-de-dave.html"&gt;divertida palestra do Dave Thomas&lt;/a&gt; e o monocórdio tom do vídeo de apresentação do autor na Amazon, dá ver quem é o extrovertido da dupla. Outra coisa que atrapalha é o uso excessivo de metáforas relacionadas a computador. Tá certo que o livro é voltado a desenvolvedores, mas falar coisas como que &lt;i&gt;"O cérebro tem uma CPU dual"&lt;/i&gt; acaba emprobecendo alguns conceitos. Quando entra na parte de &lt;i&gt;preconceitos culturais&lt;/i&gt;, o livro fica americano-cêntrico demais. Vale até pular o capítulo. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.amazon.com/How-Become-Straight-Student-Unconventional/dp/0767922719?ie=UTF8&amp;amp;tag=agenddosambachor&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="How to Become a Straight-A Student: The Unconventional Strategies Real College Students Use to Score High While Studying Less" border="0" src="http://3.bp.blogspot.com/_uthE5NsxV9A/S1-L_Vzo_3I/AAAAAAAAAOs/q2tKAjDhLIk/s320/straightA.JPG" /&gt;&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0767922719" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;O outro livro similar é o &lt;a href="http://www.calnewport.com/books/howtobecome.html" title="Straight-A Student (página oficial)"&gt;How to Become a Straight-A Student: The Unconventional Strategies Real College Students Use to Score High While Studying Less&lt;/a&gt;. Se no livro do &lt;i&gt;Programador Pragmático&lt;/i&gt; a preocupação é aprender, este aqui é ainda &lt;i&gt;mais&lt;/i&gt; pragmático: o objetivo é tirar notas altas na faculdade. As dicas vão desde organização de tempo a como puxar o saco do professor de forma eficiente. Gostaria de tê-lo lido há 20 anos atrás:-).&lt;br /&gt;
&lt;br /&gt;
Seu ponto forte é que se baseia em entrevistas que o autor fez com alguns dos melhores estudantes de universidades americanas. São dicas que funcionam para alguém no mundo real. Técnicas de como, onde e quando estudar, como preparar um trabalho, como tomar notas em aula, quando pedir orientação ao professor. Eu nem tinha idéia que existiam &lt;a href="http://sas.calpoly.edu/asc/ssl/notetaking.systems.html"&gt;diversas técnicas para tomar notas&lt;/a&gt;. Deve ser por isto que para mim nunca funcionou fazer anotações em sala de aula. Descobri até que existem &lt;a href="http://www.teach12.com/ttcx/CourseDescLong2.aspx?cid=140"&gt;cursos para se tornar um bom aluno&lt;/a&gt; além de &lt;a href="http://www.amazon.com/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Astudy+skills&amp;amp;keywords=study+skills&amp;amp;ie=UTF8&amp;amp;qid=1264441869"&gt;vários livros sobre &lt;i&gt;study skills&lt;/i&gt;&lt;/a&gt;. De um modo geral as dicas são puro bom senso, mas sempre é bom ver outros pontos de vista.&lt;br /&gt;
&lt;br /&gt;
No final das contas, gostei especialmente do &lt;i&gt;Refactoring your Wetware&lt;/i&gt;. Ajudou a pensar a respeito de várias técnicas que já usei, como — o que estou fazendo agora — escrever um post de blog para assimilar um assunto. Me ajudou a entender por que aprendi muito bem algum assunto que dei uma aula a respeito. Porque fico namorando um livro, lendo o índice e folheando, antes de começar a ler de verdade. No fundo, muita coisa é só bom senso. O bom é ver alguém dizendo que o que você achava que era superstição é importante, ou mostrando formas sistemáticas de fazer o que você aprendeu por tentativa e erro.&lt;br /&gt;
&lt;br /&gt;
Gostaria de tê-los lido há anos atrás. Teria aprendido mais estudando menos.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=1934356050&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0767922719&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=1592577997&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-4436476219057668945?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=HPxMXttbWYA:NIyD3OaGr1A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/HPxMXttbWYA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/4436476219057668945/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=4436476219057668945" title="3 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/4436476219057668945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/4436476219057668945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/HPxMXttbWYA/aprendendo-aprender-estudando-o-estudo.html" title="Aprendendo a aprender, estudando o estudo" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_uthE5NsxV9A/S1-L_Vzo_3I/AAAAAAAAAOs/q2tKAjDhLIk/s72-c/straightA.JPG" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2010/01/aprendendo-aprender-estudando-o-estudo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YEQXgzfSp7ImA9WxBQEk0.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-4100330393454614854</id><published>2009-11-18T07:42:00.003-02:00</published><updated>2010-01-11T09:25:00.685-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-11T09:25:00.685-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="domínio" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Registrando seu próprio sítio virtual em uma hora por R$30,00</title><content type="html">&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/jesse_menn/3164739580/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1221/3164739580_283e38f035_m.jpg" alt="" style="border: solid 1px #999;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/jesse_menn/3164739580/"&gt;Hourglass&lt;/a&gt;&lt;br /&gt;Uploaded by &lt;a href="http://www.flickr.com/people/jesse_menn/"&gt;darque9&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; Em apenas uma hora criei e coloquei no ar um domínio próprio para este sítio. Custou só R$30,00, o preço do domínio. Foi mais rápido do que eu pensava, mas isto porque eu já sabia tudo que tinha que fazer. &lt;br /&gt;&lt;br /&gt;São tantos pequenos detalhes, tanta coisa que tem saber a priori, que eu teria demorado dias se tivesse que aprender como fazer. É o tipo de conhecimento legal de compartilhar. Para fazê-lo, é só seguir os passos abaixo. &lt;br /&gt;&lt;h2&gt;Crie um blogue no Blogger.com&lt;/h2&gt;Visite &lt;a href="http://www.blogger.com"&gt;Blogger.com&lt;/a&gt; e crie um blogue para você. Escolha nome, template, configurações etc. Cheguei a pensar em hospedar meu próprio blogue com o excelente &lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt;, mas seria mais uma encheção de saco para configurar, manter, atualizar etc. O pouco tempo que tenho para o blogue quero gastar produzindo conteúdo, mas, nerd que sou, é difícil me conter para não ficar um tempão futucando a tecnologia.&lt;br /&gt;&lt;h2&gt;Escolha seu domínio&lt;/h2&gt;Considerando que você quer um domínio .br, vá no &lt;A href="http://registro.br"&gt;Registro.BR&lt;/a&gt; e na caixa de busca que tem lá, vá entrando os domínios que deseja. &lt;br /&gt;&lt;br /&gt;Há &lt;a href="http://registro.br/info/dpn.html"&gt;várias terminações&lt;/a&gt; possíveis, cada uma significa uma coisa que ninguém sabe o que é. A dica é: se o nome que deseja estiver disponível, escolha a &lt;i&gt;.COM.BR&lt;/i&gt; pois é a mais usada. Este meu .PRO.BR, escolhi porque parece de &lt;B&gt;pro&lt;/b&gt;fissional, mas oficialmente é de &lt;b&gt;pro&lt;/b&gt;fessor.&lt;br /&gt;&lt;br /&gt;Neste ponto em que estamos, você ainda não registrou o domínio, apenas verificou que ele está disponível.&lt;br /&gt;&lt;h2&gt;Configure o DNS para seu domínio&lt;/h2&gt;O Domain Name Server (DNS) é um tipo de servidor na internet que mapeia um nome, como mosquito.pro.br, para o computador específico onde ficam as páginas. Você não precisará colocar um servidor no ar. Como tudo na Internet, há uma opção 0800.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.everydns.com"&gt;EveryDNS&lt;/a&gt; é um servidor DNS gratuito, onde você pode registrar qualquer domínio. Crie uma conta lá e registre seu domínio. O que você tem que fazer mesmo é criar um campo CNAME associando o endereço &lt;code&gt;www.seudominio.xxx.br&lt;/code&gt; ao &lt;code&gt;ghs.google.com&lt;/code&gt;. É importante iniciar com &lt;code&gt;www&lt;/code&gt;. Opcional é criar um campo do tipo A apontando para um endereço IP qualquer. Ficaria assim:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uthE5NsxV9A/Svly7u7rv3I/AAAAAAAAALc/WeAUl84RdDQ/s1600-h/everydns.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_uthE5NsxV9A/Svly7u7rv3I/AAAAAAAAALc/WeAUl84RdDQ/s400/everydns.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402475598543830898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Registre seu domínio&lt;/h2&gt;Volte ao &lt;a href="http://registro.br"&gt;Registro.BR&lt;/a&gt; e compre de verdade seu nome de domínio. Caso ainda não tenha uma conta lá, precisará criar uma. Ao registrar, entre no campo de "&lt;i&gt;name server&lt;/i&gt;" com os endereços &lt;code&gt;ns1.everydns.com&lt;/code&gt;, &lt;code&gt;ns2.everydns.com&lt;/code&gt;, ... Depois eles vão te mandar a cobrança por email. Será seu &lt;i&gt;único&lt;/i&gt; custo.&lt;br /&gt;&lt;h2&gt;Associe seu domínio ao blogue&lt;/h2&gt; Este é mole. Volte no &lt;a href="http://blogger.com"&gt;Blogger.com&lt;/a&gt;, entre em &lt;code&gt;Settings -&gt; Publishing&lt;/code&gt; e selecione "Hospedar no meu próprio domínio". Preencha lá com &lt;code&gt;www.seudominio.xxx.br&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;Aí que fiquei impressionado com a rapidez de tudo. Cerca de meia hora depois de fazer isto, meu domínio novo já estava valendo. Tá certo que eu já tinha o blogue criado e contas em todos os serviços, teria demorado mais caso fosse tudo do zero. O fato é que mais tempo demorei para escrever este texto do que para colocar um domínio novo no ar:-).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Extras&lt;/h2&gt;O principal acabou, agora é um adendo avançado. Acho que já passa do ponto de coisas que pessoas não técnicas, mas inteligentes e motivadas, conseguem fazer.&lt;br /&gt;&lt;br /&gt;Brinco que uma maneira boa de saber se uma empresa é tecnicamente competente é ver se é possível acessar o site dela sem colocar &lt;code&gt;www.&lt;/code&gt; no endereço. Isto indicará pelo menos que eles têm alguém que entende das coisas cuidando da infra-estrutura. &lt;br /&gt;&lt;br /&gt;Com esta configuração, eu não sei como configurar direto o &lt;code&gt;mosquito.pro.br&lt;/code&gt; para o blogue. O EveryDNS não deixa o domínio principal ser um CNAME, o que tem sentido. Minha solução foi apontar para um endereço IP onde tenho um servidor, e lá configurar um host virtual do Apache para fazer um &lt;a href="http://www.mosquito.pro.br/2009/08/site-em-manutencao-503-apache-google.html"&gt;redirect permanente&lt;/a&gt; para o endereço com o &lt;code&gt;www&lt;/code&gt;. De qualquer forma, eis como ficou minha configuração do Apache:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;   ServerName mosquito.pro.br&lt;br /&gt;&lt;br /&gt;   RewriteEngine on&lt;br /&gt;   RewriteRule ^/(arquivos/.*)$ /mosquito/$1 [last]&lt;br /&gt;&lt;br /&gt;   RewriteRule ^(.*)$ http://www.mosquito.pro.br$1 [R=permanent,last]&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;A última linha é uma expressão regular boba que faz o redirect permanente de todas as chamadas para o mesmo endereço com &lt;code&gt;www&lt;/code&gt;. O macete fica por conta da outra regra de rewrite que me dá algo muito útil que o Blogger não deixa. Agora posso publicar meus próprios arquivos, basta colocá-los em uma pasta específica e acessar em uma URL com &lt;code&gt;/arquivos/&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-4100330393454614854?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=2qaICgkALWE:f3ob8BYJq44:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/2qaICgkALWE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/4100330393454614854/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=4100330393454614854" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/4100330393454614854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/4100330393454614854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/2qaICgkALWE/registrando-seu-proprio-sitio-virtual.html" title="Registrando seu próprio sítio virtual em uma hora por R$30,00" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm2.static.flickr.com/1221/3164739580_283e38f035_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/11/registrando-seu-proprio-sitio-virtual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IHQ3Y5eCp7ImA9WxNbEU4.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-6988477256660207988</id><published>2009-11-12T07:18:00.001-02:00</published><updated>2009-11-13T16:05:32.820-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T16:05:32.820-02:00</app:edited><title>Desenvolvimento de software: O que sabemos que funciona?</title><content type="html">O que não falta em desenvolvimento de software é &lt;b&gt;achismo&lt;/b&gt;. Fulano acha isso. A nova moda de desenvolvimento diz aquilo. É um alívio ver destacado o que sabemos de verdade. Achei duas ótimas referências sobre fatos em Engenharia de Software.&lt;br /&gt;&lt;br /&gt;Uma é esta apresentação abaixo, onde o autor começa discutindo o método científico, e depois lista vários fatos realmente conhecidos sobre desenvolvimento de software:&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_2338367"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/gvwilson/bits-of-evidence-2338367" title="Bits of Evidence"&gt;Bits of Evidence&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=devdays-2009-091024190903-phpapp01&amp;stripped_title=bits-of-evidence-2338367" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=devdays-2009-091024190903-phpapp01&amp;stripped_title=bits-of-evidence-2338367" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/gvwilson"&gt;Greg Wilson&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Outro artigo excelente é esta &lt;a href="http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx"&gt;reportagem sobre pesquisas de engenharia de software&lt;/a&gt; feitas na Microsoft. O pesquisador Nachi Nagappan tem acesso livre a todos os grupos de desenvolvimento dentro da Microsoft. Cada um tem um jeito diferente de trabalhar: alguns usam asserções, outros testes unitários, outros trabalham distribuídos pelo mundo. Como a Microsoft registra cada modificação em seu sistema de controle de versões a cada bug aberto e a cada módulo modificado, Nagappan tem dados maravilhosos a seu dispor. E ele tira conclusões surpreendentes. Tá certo que talvez nem todo lugar tenha programadores da qualidade dos da Microsoft, mas acredito que dá para generalizar suas descobertas.&lt;br /&gt;&lt;br /&gt;Como brinde, vale lembrar que outra fonte de fatos sobre experimentos é a coluna "&lt;i&gt;Voz da Evidência&lt;/i&gt;" publicada na revista &lt;a href="http://naotemmosquito.blogspot.com/2009/06/assinando-ieee-software-com-desconto.html"&gt;IEEE Software&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-6988477256660207988?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=AsR_7O-OvyI:VZJRXwLzQqo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/AsR_7O-OvyI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/6988477256660207988/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=6988477256660207988" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6988477256660207988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6988477256660207988?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/AsR_7O-OvyI/desenvolvimento-de-software-o-que_12.html" title="Desenvolvimento de software: O que sabemos que funciona?" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/11/desenvolvimento-de-software-o-que_12.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENQ3kzfyp7ImA9WxNUGEs.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-6003575433317878848</id><published>2009-11-10T10:22:00.005-02:00</published><updated>2009-11-10T13:24:52.787-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-10T13:24:52.787-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Agora em novo endereço!</title><content type="html">Seja bem-vindo a nosso novo endereço:&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.mosquito.pro.br"&gt;www.mosquito.pro.br&lt;/a&gt;&lt;/h2&gt;Agora que resolvi dar um gás neste blogue, nada melhor que um domínio de verdade. Todos os links antigos continuarão a funcionar, assim como o RSS com as atualizações.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-6003575433317878848?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=IC1VhgHxQQw:YhK5CFtBRO8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/IC1VhgHxQQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/6003575433317878848/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=6003575433317878848" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6003575433317878848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6003575433317878848?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/IC1VhgHxQQw/agora-em-novo-endereco.html" title="Agora em novo endereço!" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/11/agora-em-novo-endereco.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUBQ3kyeyp7ImA9WxNUGEo.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-3811915502690545613</id><published>2009-11-10T07:30:00.004-02:00</published><updated>2009-11-10T16:04:12.793-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-10T16:04:12.793-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="selenium" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="testes" /><title>Selenium, a melhor ferramenta para testes de aplicações web</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uthE5NsxV9A/SvhI9EaYWkI/AAAAAAAAALQ/eQeCN-BzRgY/s1600-h/selenium-big-logo.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 181px;" src="http://3.bp.blogspot.com/_uthE5NsxV9A/SvhI9EaYWkI/AAAAAAAAALQ/eQeCN-BzRgY/s400/selenium-big-logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402147967024519746" /&gt;&lt;/a&gt;&lt;br /&gt;Avançando no Terceiro Milênio, não dá mais para conceber a construção de uma aplicação Web sem ter testes automatizados. Não fazendo testes automáticos, você estará jogando na mão de seu cliente a responsabilidade de testar a aplicação. Este é um trabalho que deveria ser seu. Não fazê-lo é um desrespeito com quem te paga. Estará também jogando dinheiro fora, pois quanto mais tempo você demora para descobrir um erro, mais custoso é consertá-lo. &lt;br /&gt;&lt;br /&gt;E pra fazer testes &lt;i&gt;funcionais&lt;/i&gt; de aplicações web, a ferramenta é uma só: &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;. É tudo de bom: grátis, open source e bem feito. Um dos melhores projetos de código aberto que existem por aí. &lt;br /&gt;&lt;br /&gt;O Selenium te permite testar um sítio virtual em vários browsers e sistemas operacionais. Testa Javascript e ajax. Nada melhor para achar problemas de incompatibilidade.&lt;br /&gt;&lt;br /&gt;O Selenium na verdade não é um único projeto, mas um ecossistema de diferentes softwares que interagem entre si. Os principais projetos são:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href="http://seleniumhq.org/projects/core/"&gt;Selenium Core&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;O núcleo do Selenium é uma biblioteca Javascript que te dá basicamente dois tipos de comandos. Um para comandar um browser: clicar em links, preencher formulários, fazer uma ação depois de aparecer algo na tela etc. Outro tipo é para fazer asserções, como se há um texto presente, se tal elemento está sendo exibido, se a página foi corretamente carregada etc. É a pedra fundadora do Selenium. Inspirado nos &lt;a href="http://fit.c2.com"&gt;Testes Fit&lt;/a&gt;, você define os seus passos de testes em uma tabela &amp;ndash; no caso em HTML &amp;ndash; que é interpretada, executada e um relatório final com sucessos e erros é gerado.&lt;/dd&gt; &lt;br /&gt;&lt;dt&gt;&lt;a href="http://seleniumhq.org/projects/ide/"&gt;Selenium IDE&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Fazer as tabelas de teste do Selenium IDE é muito trabalhoso. Inventaram então este sensacional plugin para o Firefox. Com ele você pode gravar toda uma sessão de navegação e dar playback nela depois. Durante a gravação vários comandos extras são adicionados ao menu de contexto (botão direito) do Firefox. Estes comandos lhe permitem fazer asserções sobre o que está sendo gravado, como, por exemplo, selecionar um texto na tela e incluir uma asserção para verificar se o texto selecionado está presente. &lt;br /&gt;&lt;br /&gt;É um barato ver seu navegador funcionando sozinho, como se fosse controlado por um fantasma. Chefes e clientes adoram. Apesar de serem gravados no Firefox, os testes podem ser executados em qualquer navegador e sistema operacional.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://seleniumhq.org/projects/core/"&gt;Selenium Remote Control&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Aqui o negócio começa a ficar sério. O Selenium Remote Control te permite controlar um browser e fazer asserções de dentro de uma linguagem de programação. Você passa a ter acesso a loops, funções (para não repetir código de testes) e, o melhor, às bibliotecas da linguagem. Dá para rodar um teste e depois conectar direto à base de dados para verificar se os dados foram corretamente modificados. &lt;br /&gt;&lt;br /&gt;Um workflow comum é você gravar um teste inicial no Selenium IDE, dar um "Save As" para ser gerada uma versão para a sua linguagem de programação favorita (Python, Ruby, Java ...) e então criar testes mais sofisticados. Seus testes podem ser executados dentro de um framework de testes, como os da família &lt;a href="http://www.martinfowler.com/bliki/Xunit.html"&gt;xUnit&lt;/a&gt;, e rodar dentro de seu processo de &lt;a href="http://martinfowler.com/articles/continuousIntegration.html" title="O que é Integração Contínua? Por Martin Fowler"&gt;Integração Contínua&lt;/a&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://selenium-grid.seleniumhq.org/"&gt;Selenium Grid&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Uma coisa temos que assumir: fazer testes comandando um browser é lento. Muito lento. Especialmente depois que se começa a ter mais de uma centena de testes. Tá certo que são testes funcionais, ninguém está esperando que obedeça às &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=126923" title="Como deve ser um teste para ser chamado de unitário? Por Michael Feathers"&gt;regras de velocidade de testes unitários&lt;/a&gt;, mas pegar um erro dias depois, é demais. O Selenium Grid vem resolver isto, ele distribui os testes para executarem em paralelo em vários computadores diferentes. É chato de configurar, mas a recompensa é grande quando os testes começam a demorar muito.&lt;br /&gt;&lt;br /&gt;Já usei o Grid até mesmo para realizar testes de stress em uma aplicação. Tá certo que não é a ferramenta mas apropriada, mas dependendo de aplicação web é (mal) feita, pode ser a única alternativa. &lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;E a boa notícia é que uma das melhores referências sobre o Selenium é em Português! É o &lt;a href="http://www.SeuEnium.com.br/"&gt;excelente Blogue do Seu Enium&lt;/a&gt;. Lá você aprende do beabá a usar o Selenium Grid, passando pela &lt;a href="http://www.seuenium.com.br/2009/04/25/por-que-o-nome-selenium/"&gt;divertida explicação&lt;/a&gt; do porquê do nome Selenium.&lt;br /&gt;&lt;br /&gt;Outra coisa muito legal que se pode fazer com o Selenium é automatizar sua vida. Sabe as aplicações Web com uma terrível interface e que você é obrigado a usar? Aquelas que você tem que clicar em um milhão de lugares e preencher um monte de campos para chegar onde quer? Basta gravar um script no Selenium IDE que faz tudo pra você. O macete é nos momentos que preencher um dado específico (como uma senha), colocar um comando para o Selenium esperar um texto da tela seguinte para continuar a executar. Nada melhor para evitar uma tendinite.&lt;br /&gt;&lt;br /&gt;Por fim, vale deixar o aviso de que o Selenium não é nenhuma &lt;a href="http://www.virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html" title="Artigo clássico de Fred Brooks que argumenta não existir balas de prata no desenvolvimento de software"&gt;bala de prata&lt;/a&gt;. É uma ferramenta fundamental para se entregar aplicações web de qualidade, mas não é trivial usá-lo bem. É preciso bons testers para pegar os casos que podem dar problemas e não testar apenas o caminho de execução principal. Colocar os comandos certos para que erros intermitentes não aconteçam é mais uma arte do que uma ciência. Se sua empresa tiver a mentalidade de que testers são imbecis (sim, isto existe), não vai funcionar. É preciso que os desenvolvedores trabalhem junto com os testers para que as aplicações sejam fáceis de testar. Testar widgets de algumas bibliotecas Javascript pode ser bem enrolado. &lt;br /&gt;&lt;br /&gt;Não é por estar fazendo testes com uma super-ferramenta é que você poderá prescindir de seu cérebro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-3811915502690545613?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=7NlcspogPOM:dDNVj8wTS6g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/7NlcspogPOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/3811915502690545613/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=3811915502690545613" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3811915502690545613?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3811915502690545613?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/7NlcspogPOM/selenium-melhor-ferramenta-para-testes.html" title="Selenium, a melhor ferramenta para testes de aplicações web" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_uthE5NsxV9A/SvhI9EaYWkI/AAAAAAAAALQ/eQeCN-BzRgY/s72-c/selenium-big-logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/11/selenium-melhor-ferramenta-para-testes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMESHk7fip7ImA9WxNUF0o.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-6074065462938749459</id><published>2009-11-09T09:21:00.007-02:00</published><updated>2009-11-09T11:46:49.706-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T11:46:49.706-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="seo" /><title>Navegação e SEO, ajude o Google a encontrar suas páginas</title><content type="html">&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/lajoso/2459883457/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3014/2459883457_e205dd4526_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/lajoso/2459883457/"&gt;Caravel&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/lajoso/"&gt;Lajoso&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;Nesta &lt;a href="http://naotemmosquito.blogspot.com/search/label/seo"&gt;SEOgunda&lt;/a&gt; aprenderemos sobre o &lt;i&gt;terceiro&lt;/i&gt; aspecto mais importante para seu sítio virtual ficar bem na fita com o Google: a &lt;b&gt;navegação&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;Navegar pelos sítios virtuais pode ser assustador. Serpentes marinhas gigantescas podem devorar seu browsers. O mar ferverá quando se atravessar a linha do Equador. Do ponto de vista de SEO, a função da navegação é guiar seguramente o Google pelo seu sítio, permitindo que ele não só encontre &lt;b&gt;todas&lt;/b&gt; suas páginas, como descubra quais são as mais importantes.&lt;br /&gt;&lt;br /&gt;Primeira coisa é entender como os mecanismos de busca descobrem as páginas que irão catalogar. Cada buscador tem um software que funciona como se fosse um browser, chamado de &lt;b&gt;robô&lt;/b&gt;. Ao visitar uma página, ele &lt;i&gt;automaticamente&lt;/i&gt; grava a página e clica em todos os links presentes. Para cada nova página visitada, ele clica nos links e visita todas as novas páginas. Vai assim até visitar &lt;i&gt;todas&lt;/i&gt; as páginas de seu site.&lt;br /&gt;&lt;br /&gt;A principal característica deste robô é que ele é burro. Ele não preenche nenhum formulário, não entende Javascript e (quase) não entende Flash. A única coisa que ele faz é ver o texto de suas páginas e clicar em links. &lt;br /&gt;&lt;br /&gt;O que nos leva à &lt;b&gt;&lt;i&gt;Primeira regra SEO de navegação:&lt;/i&gt; toda página de seu sítio virtual tem que poder ser acessada apenas clicando em links a partir da página principal.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Se o robô do Google não puder chegar na sua página apenas clicando, ela não será indexada e nunca poderá ser o resultado de nenhuma busca (tá bom, tá bom, falaremos de &lt;a href="http://www.sitemaps.org/"&gt;sitemaps&lt;/a&gt; no futuro). O robô não preencherá um simples campo de busca para poder achar suas páginas antigas. Se você, por exemplo, publica notícias que expiram, mantenha um link para toda notícia expirada. Uma delas pode ter exatamente aquela palavra usada em um busca e ser responsável por lhe trazer um novo usuário. &lt;br /&gt;&lt;br /&gt;Cada vez mais os sites criam esquemas de navegação mais espertos, cheios de animações e guéri-gueris. Apesar de divertidas, estas navegações podem destruir o ranking de seu site nos mecanismos de busca. O robô não entende Javascript nem Flash, as principais tecnologias destas animações. Se não entende, ele não conseguirá navegar nem catalogar suas páginas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Segunda regra SEO de navegação:&lt;/i&gt; seu sítio virtual tem que ter uma barra de navegação para suas principais seções feita em HTML simples, usando apenas a tag &amp;lt;A HREF&amp;gt;.&lt;/b&gt; Se você tiver uma navegação para seções em Javascript, é preciso que ela degrade graciosamente e continue a funcionar mesmo ao desligar o Javascript do browser. Se tiver uma navegação em Flash, faça uma outra em HTML puro no pé de cada página. &lt;br /&gt;&lt;br /&gt;Tome cuidado se você usa um Content Management System (CMS) que lhe gera automaticamente uma navegação. Ainda outro dia fiz uma consultoria SEO e me deparei com &lt;a href="http://www.dotnetnuke.com/" title="Dot Net Nuke"&gt;um CMS&lt;/a&gt; cuja navegação de seções padrão era toda em Javascript. O CMS tentava ser esperto, tinha um código para identificar se era o robô do Google que estava visitando. Se fosse, era mostrada uma navegação em HTML simples em vez da em Javascript. Só que mostrar uma página diferente para o robô e para o ser humano é uma das práticas mais abominadas pelos mecanismos de busca. É chamada de &lt;a href="http://en.wikipedia.org/wiki/Cloaking"&gt;Cloaking&lt;/a&gt; e é muito fácil de ser descoberta. &lt;i&gt;Nunca faça isto.&lt;/i&gt; Mesmo que os desenvolvedores do CMS estejam fazendo o cloaking de &lt;a href="http://blog.theaccidentalgeek.com/post/2008/11/18/DNN-Tips-amp3b-Tricks-7-DotNetNuke-Menu-and-SEO.aspx" title="Artigo em que um desenvolvedor acha legal a servir uma versão diferente da página para os robôs"&gt;boa fé&lt;/a&gt;, não tem como o Google saber disto. Uma bobagem assim pode remover &lt;i&gt;todo seu site&lt;/i&gt; das buscas do Google!!!&lt;br /&gt;&lt;br /&gt;Estas barras com links também permitem que o mecanismo de busca identifique as principais seções de seu site. Estas seções serão links a mais que você terá direito na página de resultados de busca. Veja por exemplo o excelente trabalho que o Google faz para achar as seções do jornal New York Times:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uthE5NsxV9A/SvgTvNXiQxI/AAAAAAAAALA/N0emIQv0A5Y/s1600-h/navegacao-nyt.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;" src="http://1.bp.blogspot.com/_uthE5NsxV9A/SvgTvNXiQxI/AAAAAAAAALA/N0emIQv0A5Y/s400/navegacao-nyt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402089454794064658" /&gt;&lt;/a&gt;&lt;br /&gt;Claro que nem sempre o Google acerta. Por isto você precisa ajudá-lo com uma boa navegação e arquitetura de informação. Ou você acha mesmo que &lt;b&gt;Naruto&lt;/b&gt; é uma das seções mais importantes da Wikipédia? :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uthE5NsxV9A/SvgUWSxYjJI/AAAAAAAAALI/0P4Qf94vlOI/s1600-h/navegacao-wikipedia.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 371px; height: 126px;" src="http://4.bp.blogspot.com/_uthE5NsxV9A/SvgUWSxYjJI/AAAAAAAAALI/0P4Qf94vlOI/s400/navegacao-wikipedia.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402090126259555474" /&gt;&lt;/a&gt;&lt;br /&gt;Você não pode dizer explicitamente pro Google as seções de seu site, apenas sugerí-las através dos links de navegação. Se acontecer contigo alguma tragédia como esta das seções da Wikipédia, não precisa ficar desesperado. Crie uma conta gratuita no serviço de &lt;a href="https://www.google.com/webmasters/tools/home?hl=en"&gt;Webmaster Tools do Google&lt;/a&gt; e remova as seções que você não quer que apareça. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aguarde agora nossa próxima emocionante e informativa SEOgunda. Semana passada aprendemos sobre &lt;a href="http://naotemmosquito.blogspot.com/2009/11/seo-e-sem-artigos-search-engine.html" title="a tag title"&gt;o mais importante elemento HTML para SEO&lt;/a&gt;, hoje foi terceiro aspecto mais importante. O que falta?&lt;br /&gt;&lt;br /&gt;E se você for ansioso demais para esperar o desenrolar da série para otimizar seu site, lembro  que já fiz e estou fazendo consultorias SEO/SEM. Entre em contato no email &lt;code&gt;PauloNeves(arroba)gmail.com&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-6074065462938749459?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=1TfN-GIDASs:3CV4nxEXGHw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/1TfN-GIDASs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/6074065462938749459/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=6074065462938749459" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6074065462938749459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6074065462938749459?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/1TfN-GIDASs/seo-navegacao-google.html" title="Navegação e SEO, ajude o Google a encontrar suas páginas" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3014/2459883457_e205dd4526_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/11/seo-navegacao-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDRnszcCp7ImA9WxNUF0s.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8544381179456277850</id><published>2009-11-02T16:15:00.010-02:00</published><updated>2009-11-09T09:31:17.588-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T09:31:17.588-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="seo" /><title>SEOgunda, pois segunda é dia de SEO e SEM</title><content type="html">&lt;div style="float: right; margin-left: 10px; margin-bottom: 15px;"&gt;&lt;a href="http://www.flickr.com/photos/santoposmoderno/3444063292/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3598/3444063292_92449af37a_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/santoposmoderno/3444063292/"&gt;Charo y su lupa [abr 11]&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/santoposmoderno/"&gt;JavierPsilocybin&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;Gastar uns trocados em Search Engine Optimization (SEO) e Search Engine Marketing (SEM) é um dos dinheiros mais bem gastos para o dono de um website. Todo sítio virtual é no fundo um investimento em marketing. De que vale este investimento se seus clientes não te acham?&lt;br /&gt;&lt;br /&gt;Para que seus clientes te achem na Internet, é preciso que antes agradar a outro visitante: Mr. Google. Suas páginas têm que ser feitas para que o mecanismo de busca as entenda e tire o máximo de informações delas. Não é difícil, nem tem mágica. É só não deixar o cara que desenvolveu seu site fazer muita bobagem.&lt;br /&gt;&lt;br /&gt;O problema é que tem muito enganador por aí. O sujeito que promete colocar &lt;span style="font-weight:bold;"&gt;seu site no primeiro lugar do Google&lt;/span&gt; está te enrolando. Resolvi então iniciar uma série de &lt;span style="font-style:italic;"&gt;posts&lt;/span&gt; para contar os "segredos" de SEO e SEM.  Como publicarei um artigo toda segunda-feira, intitularei a série: "&lt;span style="font-style:italic;"&gt;Segunda é dia de SEO&lt;/span&gt;". Serão nossas &lt;span style="font-weight:bold;"&gt;SEOgundas!&lt;/span&gt;(Ai!)&lt;br /&gt;&lt;br /&gt;Vou começar com a &lt;span style="font-weight:bold;"&gt;mais importante dica de SEO&lt;/span&gt;. É uma coisa simples, mas que pode fazer a grande diferença para acharem seu sítio pelos mecanismos de busca. &lt;br /&gt;&lt;br /&gt;É a tag &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; do HTML. Nela você coloca o &amp;ndash; supresa! &amp;ndash título de sua página. O problema dela é que ninguém presta atenção neste título. Quando vê a página, ele só aparece na barrinha da janela do navegador. É fácil passar desapercebido que não foi corretamente preenchido. Veja por exemplo como aparece o título desta página:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uthE5NsxV9A/SvCISvnMU0I/AAAAAAAAAK4/iTTieaKIj0k/s1600-h/seo-sem-title.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 39px;" src="http://1.bp.blogspot.com/_uthE5NsxV9A/SvCISvnMU0I/AAAAAAAAAK4/iTTieaKIj0k/s400/seo-sem-title.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5399965808817099586" /&gt;&lt;/a&gt;&lt;br /&gt;A tag &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; é importante porque:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;As palavras que estão ali têm um peso maior para o mecanismo de busca. Se o usuário buscar por uma palavra presente no &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, sua página tem mais chances de ser retornada.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O texto do &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; aparecerá na página de resultados do Google. Coloque ali termos que convencerão ao usuário a clicar na sua página. Nada adianta sua página estar em primeiro lugar se o usuário clica na segunda.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; é importante para &lt;b&gt;usabilidade&lt;/b&gt;. Ele que permite  diferenciar sua página entre as várias que estão abertas no seu desktop. O &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; também especifica como a página ficará guardada nos seus Favoritos.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Isto quer dizer que você vai colocar todo seu texto no &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; e sua página aparecerá no resultado de todas as buscas, certo? Errado. Somente os 65 primeiros caracteres são considerados pelo Google. Qualquer coisa depois será ignorada. &lt;br /&gt;&lt;br /&gt;Uma boa regra para construir seu &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; é dividí-lo em 3 partes:&lt;pre&gt;&lt;br /&gt;Título do conteúdo da página | Seção do site | Nome do site&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na primeira, vem o título da página mesmo. Por exemplo, se for uma notícia de um evento, você coloca aí a manchete. Se for um produto em um sítio de compras, coloque o nome do produto. Se for uma página sobre um pessoa, coloque o nome dela. A melhor maneira é fazer isto automaticamente no próprio sistema que gera as páginas. Algumas páginas mais importantes valem o esforço de fazer isto manualmente. Preencha o &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; com as palavras que o usuário pode usar para buscar pelo assunto da página. Lembre-se de colocar as palavras mais importantes sempre no início, pois estas são levadas mais em conta pelo Google.&lt;br /&gt;&lt;br /&gt;Feche o &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; com o nome da seção de seu sítio onde está a página, isto pode dar um pista do assunto para o Google. Por fim coloque o nome do seu site no final, especialmente se ele tiver palavras que as pessoas usam para buscar.&lt;br /&gt;&lt;br /&gt;Vamos fazer isto com um exemplo. Digamos que você está vendendo uma TV Sony Bravia. Você deve colocar o nome Sony Bravia, o nome do modelo, a seção e por fim o nome da loja:&lt;br /&gt;&lt;pre&gt;Sony Bravia KDL-52V5100 - 52" LCD - 1080p (FullHD) | TV | Casas Maria&lt;/pre&gt;E aí tem um dos detalhes mais importantes. Na hora de preencher as palavras chave, é preciso se colocar no ponto de vista do usuário. Talvez &lt;i&gt;Eletrodomésticos&lt;/i&gt; seja o nome do seu departamento que vende o produto. Só que ninguém busca por "Eletrodoméstico" no Google. O sujeito está querendo é uma TV. O nome de sua seção deve ser "TV" no singular. &lt;br /&gt;&lt;br /&gt;Tentar pensar como seu usuário é um dos aspectos mais importantes para otimização SEO. Só que isto daí já é assunto para um outro post...&lt;br /&gt;&lt;br /&gt;E se você for ansioso demais para esperar o desenrolar da série, aviso que já fiz e estou fazendo consultorias SEO/SEM. Entre em contato no email &lt;code&gt;PauloNeves(arroba)gmail.com&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8544381179456277850?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=RCSIr0Zf3NU:aDNk4oMTPkE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/RCSIr0Zf3NU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8544381179456277850/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8544381179456277850" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8544381179456277850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8544381179456277850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/RCSIr0Zf3NU/seo-e-sem-artigos-search-engine.html" title="SEOgunda, pois segunda é dia de SEO e SEM" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3598/3444063292_92449af37a_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/11/seo-e-sem-artigos-search-engine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYMRXY_fyp7ImA9WxNVGUQ.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-954950744506678465</id><published>2009-10-30T14:36:00.012-02:00</published><updated>2009-10-31T11:36:24.847-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-31T11:36:24.847-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="fedentina" /><title>Dicas para seu SQL não feder</title><content type="html">&lt;div style="clear:all;text-align:center;"&gt;&lt;a href="http://www.flickr.com/photos/richardsummers/201711552/" title="No shit by Banalities, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/72/201711552_0f6f5662c7.jpg" width="400" height="300" alt="No shit" /&gt;&lt;/a&gt;&lt;/div&gt;Pra mim, a melhor tradução de &lt;a href="http://c2.com/xp/CodeSmell.html"&gt;code smells&lt;/a&gt; é &lt;b&gt;fedentina&lt;/b&gt; de código. &lt;br /&gt;&lt;br /&gt;A idéia de fedentina em código foi popularizada pelo ótimo livro &lt;a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0201485672" title="Refactoring: Improving the Design of Existing Code"&gt;Refactoring&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;l=as2&amp;o=1&amp;a=0201485672" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, do Martin Fowler. É uma indicação de que algo no código não está bem e merece ser analisado mais de perto. É como você andando na rua, sente um cheiro desagradável e olha a sola de seu sapato para checar se está tudo certo.&lt;br /&gt;&lt;br /&gt;Tive que rever milhares de linhas de código SQL. Depois de um tempo, você deixa de tentar entender cada detalhe de comando e começa a funcionar por &lt;i&gt;reconhecimento de padrões&lt;/i&gt;. Basta passar os olhos pelo código e logo vem aquele cheiro que tem algo mal feito por ali. Ao contrário do exemplo da sola de sapato, na maior parte das vezes há uma grande imundície.&lt;br /&gt;&lt;br /&gt;Compartilho então com você, minha &lt;b&gt;coleção de fedentinas em SQL&lt;/b&gt;:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;DISTINCT&lt;/dt&gt;&lt;dd&gt;Uma vez, estava eu no departamento de TI de uma grande empresa e ouvi comentarem: &lt;i&gt;"Já fiz o select, o único problema é que está vindo com alguns dados duplicados."&lt;/i&gt;, logo alguém respondeu: &lt;i&gt;"É fácil resolver, basta usar o DISTINCT."&lt;/i&gt;. Argh! São raro os casos em que um DISTINCT é necessário. E normalmente o são por alguma falta de normalização no modelo de dados. &lt;br /&gt;&lt;br /&gt;Ao usar o DISTINCT sem entender a query, você pode estar escondendo um lentíssimo &lt;i&gt;produto cartesiano&lt;/i&gt;, ou mesmo um &lt;i&gt;erro&lt;/i&gt; no seu código. Já vi códigos como este: &lt;code&gt;SELECT DISTINCT P.Nome FROM pessoas P, equipe e WHERE e.id=123&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;Parece estar tudo muito bom na sua base de testes quando você tem apenas uma única equipe e uma dúzia de pessoas. Quando entrar em produção: CABOOOM!!! Tudo vai estourar. &lt;br /&gt;&lt;br /&gt;O mais provável é que o &lt;b&gt;DISTINCT esteja acobertando a inexistência de um join na sua query&lt;/b&gt;. É preciso analisar a query com cuidado e checar não precisa acrescentar um join a mais entre as tabelas. Talvez seja o caso até de remodelar o projeto do banco de dados. &lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;LIMIT 1, TOP 1, ou RowNum &amp;lt;=1 &lt;/dt&gt;&lt;dd&gt;Esta é outra forma de esconder uma falta de join. O LIMIT é do MySql, o TOP 1 do SqlServer, e o RowNum do Oracle.&lt;br /&gt;&lt;br /&gt;De vez em quando, sua consulta vai retornar mais de um elemento e você não entende o porquê. Qual a solução mais fácil? Ora, pegar só o primeiro e continuar correndo para entregar as coisas no prazo. Só terá é um bug sinistro pra pegar em produção. Afinal de contas, parar, pensar e olhar qual join poderia fazer a mais, ou que tabela está faltando incluir é muito difícil. &lt;br /&gt;&lt;br /&gt;E tem o caso em que isto está &lt;b&gt;100% errado: é quando você usa um TOP 1 e não usa um ORDER BY&lt;/b&gt;. Como o SQL só trabalha com conjuntos, pegar o primeiro elemento sem ordenar antes, quer dizer que você está pegando um elemento &lt;i&gt;aleatório&lt;/i&gt;. Pode até ser que seu SGBD seja sempre retornado o que você deseja, mas pequenas modificações no banco, como a criação de um novo índice, podem fazer com que um valor errado seja retornado de uma hora pra outra.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GROUP BY sem funções de agregação&lt;/dt&gt;&lt;dd&gt;Este é outro truque para evitar resultados repetidos e garantir um código desnecessariamente lento. Se nos resultados da query não tem nenhuma função COUNT, MAX, MIN ou similares, tem um erro aí. Certamente é mais um caso de join faltando que precisa ser investigado. &lt;br /&gt;&lt;br /&gt;O caso mais inócuo é quando é usado no lugar de um DISTINCT. Tem gente que acha que o GROUP BY seria mais eficiente. Isto não é verdade. Qualquer que seja seu SGBD, ele será esperto o bastante para fazer o mesmo plano para as duas consultas. O GROUP BY apenas deixará seu código mais difícil de entender e manter, pois todas colunas do resultado precisarão ser repetidas no final.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Subselects&lt;/dt&gt;&lt;dd&gt;Neste caso, uma das colunas de retorno da query é uma outra query, isto é, um subselect. Ou pior, várias colunas são subselects parecidos, talvez retornando apenas um COUNT. Isto pode ser a coisa mais lerda do mundo.&lt;br /&gt;&lt;br /&gt;Tem que pensar que cada subselect será executado para cada registro retornado. Se você retorna 100 registros, estará fazendo 101 consultas! A solução costuma ser mais complicada, normalmente usando condicionais e GROUP BY. Só que vale o preço. O tempo da consulta pode diminuir ordens de grandeza. &lt;br /&gt;&lt;br /&gt;O fato de SQL ser uma linguagem declarativa às vezes disfarça processamentos custosos. Somente incluir um comando ali não parece que sua consulta está ficando duas ordens de grandeza mais lenta. Pode até ser que seu BD seja esperto o bastante para otimizar estas queries. Acredito até que isto já tenha salvo muitos sistema sem produção. Mas pra que confiar?&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Outer joins&lt;/dt&gt;&lt;dd&gt;Esta fedentina aqui acontece mais em código procedural. O sujeito faz um loop nos resultados de um select. Para cada elemento retornado, processa alguma coisa e faz um outro select para checar se existe algo em outra tabela. Se existir faz um processamento a mais. Se você tiver 10 elementos, serão 11 selects. 11 idas à base para pegar dados.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Um Outer join resolveria isto com uma única consulta!&lt;/b&gt; Caso não existisse relação entre as tabelas, os elementos da tabela secundária viriam como NULL. Somente isto pode fazer a diferença entre um banco de dados stressado e um tranquilo.&lt;br /&gt;&lt;br /&gt;Por outro lado, Outer joins são mais caros que os inner joins tradicionais. Já vi gente fazendo um left join "&lt;i&gt;só pra garantir&lt;/i&gt;". Confira sempre se é mesmo necessário fazê-lo em vez de um inner join normal.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;texto LIKE '%:nome%'&lt;/dt&gt;&lt;dd&gt;Se a string com o que o LIKE compara começa com %, significa que o texto pode casar em qualquer ponto. O SBGD ê terá não só que varrer não só toda sua tabela, como todo o texto do atributo analisado. &lt;b&gt;É um algoritmo de complexidade quadrática!&lt;/b&gt; Sim, isto é lento praca.&lt;br /&gt;&lt;br /&gt;Este é mais um caso em que na base de testes, que tem pouco dados, tudo ficará uma beleza. Alguns meses (ou anos) depois que o sistema entrar em produção, tudo emperrará. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A solução para este problema é usar um &lt;i&gt;índice textual&lt;/i&gt;.&lt;/b&gt; Mas aí é assunto para outro post.&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;Ver estas e outras em códigos de produção me leva a divagar sobre dois grandes sucessos da informática, o MySql e os frameworks de mapeamento Objeto-Relacional. &lt;br /&gt;&lt;br /&gt;Até outro dia o MySql não tinha subselects. Isto era chato, pois tornava necessário codificar coisas que uma única consulta mais sofisticada resolve. Só que por outro lado, ficava claro pra todo mundo que você estava fazendo loop dentro de loop. Nenhum problema ficava "escondido" no código. A falta de features mais avançadas, deixava claro tudo que estava sendo feito.&lt;br /&gt;&lt;br /&gt;Os frameworks Objeto-Relacional por outro lado fazem tudo pra você. Eles não esquecem dos joins, nem inventam gambiarras pra retornar o que desejam. Alguns até criam todos os índices pra você, um outro problema que nem mencionei. No mundo da produção de código industrial, isto é um aumento de produtividade tremendo. Vai ser chato quando quiser fazer um relatório mais complicado, mas aí basta ter alguém que entenda como o mapeamento é feito e faça a consulta "na unha", com SQL de verdade. &lt;br /&gt;&lt;br /&gt;As limitações destas tecnologias, acabam sendo uma grande vantagem. Elas resolvem a maior parte dos problemas. Sem elas, fica muito fácil dar um tiro pé. Putz! O tiro ainda foi no pé que tava todo sujo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-954950744506678465?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=gzeAstkRkOM:exlewIYl-Ws:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/gzeAstkRkOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/954950744506678465/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=954950744506678465" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/954950744506678465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/954950744506678465?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/gzeAstkRkOM/dicas-para-seu-sql-nao-feder.html" title="Dicas para seu SQL não feder" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm1.static.flickr.com/72/201711552_0f6f5662c7_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/10/dicas-para-seu-sql-nao-feder.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08FSXY7cCp7ImA9WxNVGEk.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8809334876381322686</id><published>2009-10-28T22:53:00.003-02:00</published><updated>2009-10-29T16:43:38.808-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T16:43:38.808-02:00</app:edited><title>Código de ética do engenheiro de software</title><content type="html">&lt;ol&gt;&lt;li&gt;&lt;b&gt;Público:&lt;/b&gt; Engenheiros de Software devem agir de forma consistente com o interesse público.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cliente e empregador:&lt;/b&gt; Engenheiros de Software devem agir de modo que atenda aos melhores interesses de seus clientes e empregadores, sempre consistente com o interesse público&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Produto&lt;/b&gt;: Engenheiros de Software devem garantir que seus produtos atendem ao mais alto padrão de qualidade profissional.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Julgamento&lt;/b&gt;: Engenheiros de Software devem manter integridade e independência em seus julgamentos profissionais.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gerência&lt;/b&gt;: Engenheiros de Software que sejam gerentes e líderes devem subscrever e promover uma abordagem ética à gerência de desenvolvimento e manutenção de software.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Profissão&lt;/b&gt;: Engenheiros de Software devem avançar a integridade e reputação da profissão, sempre de forma consistente com o interesse público.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Colegas&lt;/b&gt;: Engenheiros de Software devem ser justos com seus colegas e sempre apoiá-los.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sobre si próprio&lt;/b&gt;:Engenheiros de Software devem, durante toda sua vida,  estar sempre aprendendo as práticas de sua profissão, e promoverem uma abordagem ética à profissão.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Sempre é bom de ler e saber que existe. &lt;br /&gt;&lt;br /&gt;Em português o texto, que já era mal escrito em inglês, ficou ainda pior. Leia o documento original: &lt;a href="http://www.acm.org/about/se-code"&gt;Código de Ética do Engenheiro de Software&lt;/a&gt;, onde cada item é detalhado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8809334876381322686?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=KmYfG524_5w:GByeMzUrSpw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/KmYfG524_5w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8809334876381322686/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8809334876381322686" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8809334876381322686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8809334876381322686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/KmYfG524_5w/codigo-de-etica-do-engenheiro-de.html" title="Código de ética do engenheiro de software" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/10/codigo-de-etica-do-engenheiro-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cERnc-cSp7ImA9WxNQE0U.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8247948888942994184</id><published>2009-09-19T15:50:00.005-03:00</published><updated>2009-09-19T16:36:47.959-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-19T16:36:47.959-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="meta" /><title>Por que "Não tem mosquito"?</title><content type="html">He, he, achei uma explicação sucinta &lt;a href="www.corensp.org.br/072005/noticias/revista/anteriores/74/13.pdf" title="PDF! Cuidado!!!!"&gt;neste artigo&lt;/a&gt;, e não dá pra deixar de transcrever:&lt;blockquote&gt;Essa expressão “não tem mosquito” é tão antiga quanto Oswaldo Cruz, o doutor Mata Mosquito, um sanitarista de primeira linha que se bateu para acabar com os mosquitos que infestavam o Rio de Janeiro, no início do século passado, quando a então capital do Brasil a anunciada aos quatro cantos do mundo como um lugar para se evitar por causa das doenças tropicais.&lt;br /&gt;&lt;br /&gt;Um vexame, ou um enxame, não se sabe bem. O fato é que só quando a mosquitada foi colocada a nocaute é que a imagem da cidade começou a melhorar. Por isso, o malandro carioca quando queria dizer que tudo estava sob controle dizia “‘Dotô’, não tem mosquito!”&lt;/blockquote&gt;Acho que não é preciso explicitar a relação com os bugs nossos de dia a dia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8247948888942994184?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=NOXlt0mByoQ:Ck2xe9FzL2Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/NOXlt0mByoQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8247948888942994184/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8247948888942994184" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8247948888942994184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8247948888942994184?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/NOXlt0mByoQ/por-que-nao-tem-mosquito.html" title="Por que &quot;Não tem mosquito&quot;?" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/09/por-que-nao-tem-mosquito.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8GR3o8eyp7ImA9WxNQE0U.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-7965475726606554104</id><published>2009-09-14T23:11:00.008-03:00</published><updated>2009-09-19T16:33:46.473-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-19T16:33:46.473-03:00</app:edited><title>Dev in Rio 2009, eu fui!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.devinrio.com.br/img/central_conteudo_topo_devinrio.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px; background-color:black;" src="http://www.devinrio.com.br/img/central_conteudo_topo_devinrio.png" border="0" alt="" /&gt;&lt;/a&gt;Fui na &lt;a href="http://www.devinrio.com.br/"&gt;primeira edição do Dev in Rio&lt;/a&gt;. O evento foi de primeira. Depois de descobrir que foi praticamente organizado só por &lt;a href="http://gc.blog.br/"&gt;dois&lt;/a&gt; &lt;a href="http://henriquebastos.net/"&gt;caras&lt;/a&gt;, fiquei realmente impressionado.&lt;br /&gt;&lt;br /&gt;As palestras foram de alto nível. No Dev in Rio pessoal sabia do que estava falando. Somente havia ido a um outro evento desta natureza, um da Locaweb, e achei um saco. Eram apresentações tecnicamente rasteiras, quase sempre fazendo propaganda de alguma coisa. Em troca de um lanchinho me amarraram frente a uma TV que só passava comerciais. Fiquei com a má impressão que no Brasil bom conteúdo só existe (às vezes) em eventos acadêmicos.&lt;br /&gt;&lt;br /&gt;Vale a pena comentar as palestras. Depois da abertura, o primeiro a se apresentar foi o &lt;a href="http://www.picnet.net/blog/author/cozimek"&gt;Ryan Ozimek&lt;/a&gt;. Ele ficou todo o tempo falando do &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt;, um &lt;a href="http://en.wikipedia.org/wiki/Content_management_system" title="Definição de Content Management System"&gt;CMS&lt;/a&gt; de código aberto. Foi quase nada técnico, falando mais da história e da evolução da comunidade. Não tenho a menor intenção de usar o software e cheguei a duvidar se o evento seria proveitoso. Achei a mais fraca palestra do dia. &lt;br /&gt;&lt;br /&gt;A seguir o tema foi a Máquina Virtual Java (JVM) e como está sendo usada por outras linguagens. Uma dupla de apresentadores, &lt;a href="http://blog.caelum.com.br/"&gt;Guilherme Silveira e Nico Steppat&lt;/a&gt;, deixou a palestra bem mais dinâmica e divertida, especialmente no início quando eles fizeram um &lt;a href="http://www.sacred-texts.com/cla/plato/index.htm" title="Por que Platão escrevia em diálogos?"&gt;diálogo bem platônico&lt;/a&gt;. Eles argumentaram que apesar de Java ter uma sintaxe verborrágica e ultrapassada, a JVM é tudo de bom. Rápida, segura, com um monte de bibliotecas, multi-plataforma, multithread etc. e tal. Terminaram dando um exemplo de um código Java chamar um código em ruby. Aí que achei que faltou completar. O exemplo que acho mais legal é exatamente o contrário. A linguagem dinâmica chamar Java e toda sua rica biblioteca. Encaixa bem no espírito da clássica &lt;a href="http://wiki.tcl.tk/9865"&gt;Dicotomia de Ousterhout&lt;/a&gt;, em que uma linguagem mais flexível cuida da lógica principal de uma aplicação, funcionando como "cola" de uma camada inferior mais eficiente e rígida.&lt;br /&gt;&lt;br /&gt;Depois do almoço, &lt;a href="http://www.akitaonrails.com"&gt;Fabio Akita&lt;/a&gt; fez a melhor apresentação do dia. Talvez por eu não conhecer muito de Ruby, foi onde mais aprendi. O vídeo com ele mostrando meta-programação em Ruby é excelente e provavelmente está lá no sítio dele. É o que uma informação técnica deve ser, repleta de informação. E o Google tá aí pra quem quiser se aprofundar nos assuntos mencionados. &lt;br /&gt;&lt;br /&gt;Veio a palestra que eu mais aguardava, a do &lt;a href="http://www.jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt;, um dos criadores do &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;. Gostei. Deu para conhecer mais a cultura e história deste framework web em que muito programarei ainda. Ele tem um jeito bem nerd e simpático dos rincões norte-americanos.  Perdeu em ritmo e em conteúdo pro Akita, mas só esta palestra já valia a ida. &lt;br /&gt;&lt;br /&gt;Fui dali para o dojo em Python. Apesar de já ter lido a respeito, nunca havia participado de um. Apresentaram o esquema do dojo e decidiram o problema. O importante é todo mundo aprender alguma coisa. O que foi aprendi foi que você não deve fazer sua primeira participação em um dojo sendo o primeiro a sentar no teclado:-) O primeiro teste é sempre idiota. Espere as coisas pegarem o ritmo para só então levantar a mão. Acabou meu tempo assim que comecei a esquentar. Depois achei o treco meio lento. Quando uma dupla fez seu terceiro teste que passou sem precisar de qualquer alteração no código, me deu uma angústia danada e saí correndo para a palestra.&lt;br /&gt;&lt;br /&gt;Pena eu ter perdido mais da metade da apresentação do &lt;a href="http://www.agileproductdesign.com/"&gt;Jeff Patton&lt;/a&gt;. Ele é responsável por uma das minhas colunas preferidas da &lt;a href="http://naotemmosquito.blogspot.com/2009/06/assinando-ieee-software-com-desconto.html"&gt;revista IEEE Software&lt;/a&gt;. Não pareceu ter grandes novidades, mas sempre é bom ter novos argumentos para design focado no usuário e desenvolvimento interativo. &lt;br /&gt;&lt;br /&gt;Depois do bate-papo, todos foram convidados ao Lapa 40º para o #HoraExtra, isto é, o chopp. Mais uma bola dentro do evento, ter um chopp oficialmente divulgado. Mas amarelei:-( Estava cansado e ter ido sozinho me desanimou. Sinto falta de um convívio social para falar nerdices. Mas não tem problema, pelo visto não faltarão oportunidades nos próximos Dev in Rio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-7965475726606554104?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=1yQTaHib58s:MAwNbp-Aj0w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/1yQTaHib58s" height="1" width="1"/&gt;</content><link rel="related" href="http://gc.blog.br/2009/09/16/dev-in-rio-2009-fotos-e-videos-do-evento/" title="Dev in Rio 2009, eu fui!" /><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/7965475726606554104/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=7965475726606554104" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7965475726606554104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7965475726606554104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/1yQTaHib58s/dev-in-rio-2009-eu-fui.html" title="Dev in Rio 2009, eu fui!" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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>1</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/09/dev-in-rio-2009-eu-fui.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcFQH44fyp7ImA9WxNTFUo.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-3555761207766294470</id><published>2009-08-18T02:46:00.006-03:00</published><updated>2009-08-18T03:13:31.037-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-18T03:13:31.037-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>CSS e semântica: dando (bons) nomes aos bois</title><content type="html">No tempo da Internet a Vapor, ao se escrever cada elemento HTML era preciso especificar como ele seria formatado. A tag mais usada era a &amp;lt;font&amp;gt;. Quer colocar um título grande e vermelho? Fácil:&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;font size=+2 color=red&amp;gt;Meu Título&amp;lt;/font&amp;gt;&lt;/code&gt;&lt;/pre&gt;O design de seu sítio virtual se espalhava por de todas as páginas. Trocou de idéia? Quer agora que seu título seja verde? Beleza, agora terá que editar todas as páginas de seu sítio e fazer &lt;code&gt;color=green&lt;/code&gt;. Não só vai dar um trabalhão, como você vai esquecer-se de mudar em alguns lugares. Seu design ficará inconsistente: umas páginas de um jeito, outras de outro. &lt;br /&gt;&lt;br /&gt;O Cascading Style Sheets (Folhas de Estilo em Cascata) foi criado exatamente para resolver este problema. O CSS permite que o estilo de formatação de um elemento seja definido em uma página separada. Todas as páginas de um sítio passam a ter seus estilos definidos em um único lugar.  &lt;br /&gt;&lt;br /&gt;Se você quiser mudar o design, um único arquivo precisará ser modificado. As páginas ficam menores e carregam mais rápido, pois não é preciso enchê-las de informações para formatação. O estilo é carregado uma única vez e fica cacheado pelo browser. &lt;br /&gt;&lt;br /&gt;Muita gente acha que o CSS existe para que se tenha novas opções de formatação. Não é esta a sua principal vantagem.  &lt;br /&gt;&lt;br /&gt;Com o CSS é possível dizer: todos meus elementos &amp;lt;H1&amp;gt; são formatados deste jeito, todos meus campos &amp;lt;INPUT&amp;gt; são daquele. E o grande poder do CSS vem com dois novos atributos para os elementos HTML, o class e o id. Uma classe ou id representa um conjunto de formatações. Todo elemento que tiver aquela classe ou id terá estas formatações.   &lt;br /&gt;&lt;br /&gt;As diferenças entre os dois é que todo elemento pode ter várias classes e apenas um id, e que não podem existir dois elementos com o mesmo id numa página.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Para se ter boas definições de estilo, uma das coisas mais importantes é dar bons nomes à  suas classes.&lt;/b&gt; Pode até parecer bobagem, mas na prática, o nome que você der definirá que estilos sua classe representará.  &lt;br /&gt;&lt;br /&gt;Um exemplo de um estilo com &lt;b&gt;nome ruim&lt;/b&gt; seria &lt;pre class="prettyprint"&gt;&lt;code&gt;textoGrandeVermelho {color: red; font-size: 3em;}&lt;/code&gt;&lt;/pre&gt; Fazendo isto, apesar de estar usando CSS, você estará programando como quando não existia. Caso resolva mudar o design de suas páginas para ter uma fonte verde, ou ficará com uma definição assim: &lt;pre class="prettyprint"&gt;&lt;code&gt;textoGrandeVermelho {color: green; font-size: 3em;}&lt;/code&gt;&lt;/pre&gt; ou terá que, como nos velhos tempos, editar todas as páginas de seu site. Não é raro preferirem a &lt;a href="http://www.skepdic.com/brazil/dissonancia.html"&gt;dissonância cognitiva&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bons nomes são semânticos&lt;/b&gt;, isto é, devem definir alguma coisa. Você deve definir um nome que represente um objeto de seu design, ou uma qualidade dele. Eis um bom nome: &lt;pre class="prettyprint"&gt;&lt;code&gt;titulo {color: red; font-size: 3em;}&lt;/code&gt;&lt;/pre&gt; Assim você pode mudar os estilos de todos seus títulos sem precisar editar outras páginas, nem correr o risco de deixar seu sítio inconsistente. Ao ler o arquivo CSS, fica muito mais fácil identificar o que você precisa mudar se quiser que seu título apareça de maneira diferente. Se você quiser aproveitar suas páginas para outro cliente, bastará editar o arquivo CSS para ter um novo design.  &lt;br /&gt;&lt;br /&gt;Exemplos de bons nomes seriam: .titulo, .cabecalho, .rodape, .erro, .obrigatorio, .aviso, .filtro, .relatorio. Como cada elemento HTML pode ter mais uma classe, você pode combiná-las para ter definições como: &lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;H1 class="titulo erro"&amp;gt;Título de página de erro&amp;lt;/H1&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;div class="aviso erro"&amp;gt;Aviso de preenchimento de form&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;input class="filtro obrigatorio" value="Filtro de preenchimento obrigatório" /&amp;gt;&lt;/code&gt;&lt;/pre&gt; &lt;br /&gt;Nomes ruins seriam: .centralizado, .padding-esquerda, .width-td-full. E por que estes nomes são ruins? É porque se você quiser modificar seu site no futuro, será caro e trabalhoso. Se suas páginas tiverem títulos assim: &lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;H1 class="textoGrandeVermelho centralizado"&amp;gt;Meu Titulo&amp;lt;/H1&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;E você não quiser mais que sejam centralizados, continuará tendo que editar todas as páginas. E será difícil achar no CSS quais são os estilos aplicados apenas a seus títulos. Eles provavelmente se aplicarão também a elementos que nada têm a ver.&lt;br /&gt;&lt;br /&gt;Pensar um pouco para ter bons nomes para seus estilos CSS não é frescura. É apenas se preocupar com o futuro, com o tempo que você gastará com a manutenção de seu sítio. Não fazê-lo, é se prender ao passado. É programar como se ainda estivéssemos em 1995.&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-3555761207766294470?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=AFTpZ61laU4:32D4baIxE1E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/AFTpZ61laU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/3555761207766294470/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=3555761207766294470" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3555761207766294470?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3555761207766294470?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/AFTpZ61laU4/css-e-semantica-dando-bons-nomes-aos.html" title="CSS e semântica: dando (bons) nomes aos bois" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/08/css-e-semantica-dando-bons-nomes-aos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAEQHgyfSp7ImA9WxJaF0Q.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-6112872548026104060</id><published>2009-08-08T01:39:00.004-03:00</published><updated>2009-08-09T03:01:41.695-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-09T03:01:41.695-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="seo" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><title>Não deixe o Google bravo quando seu sítio virtual for para manutenção</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uthE5NsxV9A/Snz-nv3oGGI/AAAAAAAAAKw/F4nXwn2IlQA/s1600-h/homens-trabalhando.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 228px; height: 154px;" src="http://1.bp.blogspot.com/_uthE5NsxV9A/Snz-nv3oGGI/AAAAAAAAAKw/F4nXwn2IlQA/s400/homens-trabalhando.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5367444814736922722" /&gt;&lt;/a&gt;&lt;br /&gt;Vai tirar seu sítio virtual do ar? Vai colocá-lo em manutenção? Seja bem educado e avise claramente a dois importantes usuários :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ao Google&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ao resto&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Se o Google visitar seu sítio quando ele estiver fora do ar e não encontrar suas páginas, você será penalizado no ranking das buscas. Para que isto não aconteça, siga as &lt;a href="http://googlewebmastercentral.blogspot.com/2006/08/all-about-googlebot.html"&gt;orientações oficiais do Google&lt;/a&gt;: acesso a &lt;i&gt;todas&lt;/i&gt; suas páginas deve retornar um &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" title="Lista dos códigos de status HTTP"&gt;código de status HTTP&lt;/a&gt; &lt;b&gt;503&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Isto é mais fácil falar do que fazer. Mas fique tranquilo. Vou te ensinar a configurar o Apache pra fazer isto. Ah! Isto é pra Linux, claro!&lt;br /&gt;&lt;br /&gt;O objetivo é redirecionar todo mundo que tentar visitar seu sítio para uma página que avisa a seus usuários humanos que está fora do ar. O Google terá seu querido status 503. Nada de especial precisará estar instalado no servidor.&lt;br /&gt;&lt;br /&gt;Vamos fazer, ou melhor, &lt;a href="http://www.dotcomunderground.com/blogs/2006/08/31/return-503-status-with-apache-webserver/" title="dando os créditos ao primeiro ladrão"&gt;roubar&lt;/a&gt; e adaptar, um shell script para retornar o 503 e avisar aos usuários. Eis o arquivo 503.sh:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;echo Status: 503&lt;br /&gt;echo Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;echo Retry-After: 3600&lt;br /&gt;#echo Retry-After: Sat, 8 Ago 2009 23:59:59 GMT&lt;br /&gt;echo &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;cat &amp;lt;&amp;lt;EOF&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD HTML 3.2//EN&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Estamos em manutenção&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Estamos em manutenção&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Foi mal! Estamos com problemas.&lt;br /&gt;&amp;lt;p&amp;gt;Em breve voltaremos.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Coloque-o na raiz de seu servidor e dê permissão de execução e acesso a todos: &lt;code&gt;chmod a+rx /var/www/503.sh&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O texto entre o &lt;code&gt;cat &amp;lt;&amp;lt; EOF&lt;/code&gt; e o &lt;code&gt;EOF&lt;/code&gt; é o código HTML que aparecerá para o usuário. O macete aí está nos comandos &lt;code&gt;echo&lt;/code&gt; que configuram o código de status da página e manda o cabeçalho &lt;code&gt;Retry-After&lt;/code&gt;. Este cabeçalho avisa ao Google quando ele pode novamente tentar visitar suas páginas. Pode ter um valor em segundos (tente daqui a uma hora) ou uma data exata. &lt;br /&gt;&lt;br /&gt;Agora é a vez de escalpelar o pele vermelha. Vá ao diretório de configuração do Apache e crie um arquivo chamado &lt;i&gt;manutencao.conf&lt;/i&gt;. No arquivo de configuração de seu sítio escreva esta linha: &lt;code&gt;#Include /etc/apache2/manutencao.conf&lt;/code&gt;. Na hora que o circo pegar fogo, bastará descomentá-la.&lt;br /&gt;&lt;br /&gt;Precisaremos do mais legal módulo do Apache, o &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html" title="Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo."&gt;mod_rewrite&lt;/a&gt;. Certifique-se que ele está sendo carregado no seu apache vendo se "rewrite_module" aparece no output do comado &lt;code&gt;/usr/sbin/apache2ctl -t -D DUMP_MODULES&lt;/code&gt;. Costuma ser instalado por default.&lt;br /&gt;&lt;br /&gt;Eis a versão final do arquivo &lt;b&gt;manutencao.conf&lt;/b&gt;:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;RewriteCond %{REMOTE_HOST} !^201\.37\.52\.58&lt;br /&gt;RewriteRule . /503.sh [passthrough]&lt;br /&gt;&lt;br /&gt;ScriptAlias /503.sh /var/www/503.sh&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Sugiro que vá fazendo este arquivo aos poucos e testando a cada passo que der. Eis um passo a passo:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Coloque a linha do ScriptAlias. Tente acessar: http://dominio.com.br/503.sh e veja se aparece a página de aviso de manutenção. Pra ter certeza mesmo, cheque na aba NET do Firebug se o código de retorno é mesmo 503.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Agora ligue o RewriteEngine e coloque a RewriteRule. &lt;i&gt;Toda&lt;/i&gt; página do seu sítio deve agora apresentar a mensagem de manutenção. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;A cereja no bolo é permitir o acesso normal ao IP da sua máquina com o RewriteCond. Se você tem um IP dinâmico, cheque seu &lt;a href="http://www.whatismyip.com/"&gt;valor de seu IP corrente&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Não esqueça de reinicializar o Apache a cada passo: &lt;br /&gt;&lt;code&gt;/usr/sbin/apache2ctl restart&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Prontinho. Sua configuração está feita. &lt;br /&gt;&lt;br /&gt;O ideal é fazer isto tudo com calma. Quando todo o esquema estiver pronto, bastará descomentar uma linha do arquivo de configuração. Não deixe pra aprender isto quando o circo estiver pegando fogo. Com calma dá até pra bolar até &amp;emdash; quem diria &amp;emdash; uma &lt;a href="http://www.smashingmagazine.com/2009/06/12/effective-maintenance-pages-examples-and-best-practices/" title="Exemplos de páginas de navegação divertidas"&gt;página de manutenção divertida&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-6112872548026104060?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=njYDxHS0kTc:Uu2DZPsEckM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/njYDxHS0kTc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/6112872548026104060/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=6112872548026104060" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6112872548026104060?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6112872548026104060?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/njYDxHS0kTc/site-em-manutencao-503-apache-google.html" title="Não deixe o Google bravo quando seu sítio virtual for para manutenção" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_uthE5NsxV9A/Snz-nv3oGGI/AAAAAAAAAKw/F4nXwn2IlQA/s72-c/homens-trabalhando.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/08/site-em-manutencao-503-apache-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUMQ3g4eip7ImA9WxJaF00.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-9018492726856037510</id><published>2009-08-08T01:35:00.003-03:00</published><updated>2009-08-08T01:38:02.632-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-08T01:38:02.632-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="livros" /><title>Pirataria sinistra</title><content type="html">Caraca, estou chocado. Após &lt;a href="http://www.pdfchm.net/" rel="nofollow"&gt;logar neste site&lt;/a&gt; aparece um link para baixar cada livro. Será o Kindle e a pirataria vão acabar com os livros técnicos, como o Napster e o iPod acabaram com a indústria da música?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-9018492726856037510?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=DvA_Op6Livo:qladVM8xGPQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/DvA_Op6Livo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/9018492726856037510/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=9018492726856037510" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/9018492726856037510?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/9018492726856037510?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/DvA_Op6Livo/pirataria-sinistra.html" title="Pirataria sinistra" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/08/pirataria-sinistra.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUMR349cCp7ImA9WxJWE0U.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8431940239043816944</id><published>2009-06-19T01:18:00.003-03:00</published><updated>2009-06-19T01:38:06.068-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-19T01:38:06.068-03:00</app:edited><title>Minha própria livraria de informática</title><content type="html">Sempre quis ter uma livraria, graças à Amazon, agora tenho minha própria com &lt;a href="http://astore.amazon.com/agenddosambachor"&gt;meus livros técnicos preferidos&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Compre lá que eu ganharei uma comissão que será devidamente gasta em mais livros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8431940239043816944?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=jta7YS14H88:m5PpGweSCEQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/jta7YS14H88" height="1" width="1"/&gt;</content><link rel="related" href="http://astore.amazon.com/agenddosambachor" title="Minha própria livraria de informática" /><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8431940239043816944/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8431940239043816944" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8431940239043816944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8431940239043816944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/jta7YS14H88/minha-propria-livraria-de-informatica.html" title="Minha própria livraria de informática" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/06/minha-propria-livraria-de-informatica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cASXw_fyp7ImA9WxJWE0o.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-3555705341575423048</id><published>2009-06-18T23:12:00.003-03:00</published><updated>2009-06-18T23:37:28.247-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T23:37:28.247-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="livro" /><category scheme="http://www.blogger.com/atom/ns#" term="aprendizagem" /><title>De aprendiz a expert, uma palestra de Dave Thomas</title><content type="html">Excelente o &lt;a href="http://www.infoq.com/presentations/Developing-Expertise-Dave-Thomas"&gt;vídeo da palestra do Dave Thomas&lt;/a&gt; sobre como se aprimorar como um desenvolvedor de software, ou melhor, em qualquer assunto. O mais divertido (ou desesperador) de ser um desenvolvedor é estar sempre aprendendo. A palestra dá várias dicas de como aprender mais rápido.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dave Thomas é famoso pelo seu livro &lt;a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=020161622X"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;l=as2&amp;o=1&amp;a=020161622X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, em co-autoria com Andy Hunt. O Andy acabou de lançar um livro que estava em um dos primeiros lugares de minha lista de desejos, o &lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1934356050&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;. &lt;br /&gt;Depois de ver o vídeo, acho que nem preciso comprar o livro tanto assim.&lt;br /&gt;&lt;br /&gt;E além de tudo, o Dave é um palestrante bem divertido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-3555705341575423048?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=mZb3v-S61gE:676EVodAZrI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/mZb3v-S61gE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/3555705341575423048/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=3555705341575423048" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3555705341575423048?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/3555705341575423048?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/mZb3v-S61gE/de-aprendiz-expert-uma-palestra-de-dave.html" title="De aprendiz a expert, uma palestra de Dave Thomas" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/06/de-aprendiz-expert-uma-palestra-de-dave.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMEQHw6eip7ImA9WxJXEE4.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-6388280483287458527</id><published>2009-06-03T09:00:00.001-03:00</published><updated>2009-06-03T09:00:01.212-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-03T09:00:01.212-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="livros" /><category scheme="http://www.blogger.com/atom/ns#" term="programação" /><title>Assinando a IEEE Software com desconto</title><content type="html">&lt;img src="http://www.computer.org/portal/cms_docs_software/software/homepage/2009/S309/cover.gif" style="float:right; padding:5px;"&gt;Uma das coisas mais legais (ou desesperadoras) do desenvolvimento de software é que sempre há mais para aprender. Entre livros e o &lt;a href="http://www.reddit.com/r/programming/"&gt;Proggit&lt;/a&gt; há um espaço que está definhando mas ainda é muito legal. O das revistas. Minha preferida é a &lt;a href="http://www.computer.org/portal/site/software/"&gt;IEEE Software&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Trazendo um bom balanço entre o mundo acadêmico e a indústria, há sempre artigos interessantes para ler. Tem um bom número de artigos &lt;i&gt;peer-reviewed&lt;/i&gt;, algumas colunas de opinião e seções específicas como de requisitos, carreira e usabilidade. O mais legal é que há sempre bons artigos de assuntos que eu não leria normalmente. Descobre-se até áreas de pesquisa que você nem imagina que exista. Acaba-se entendendo melhor todos aspectos de desenvolvimento de software. Confira o link ali em cima, toda edição traz uns artigos gratuitos.&lt;br /&gt;&lt;br /&gt;Gosto do formato. É leve o bastante para carregar na mochila e fácil de levar para os lugares. As colunas são de um tamanho bom para ler na hora do almoço ou em uma espera de dentista. Os artigos em 2 ou 3 almoços são lidos. O pior defeito é que acabamos com ainda mais coisas interessantes a ler. Assim, só mesmo seguindo as &lt;a href="http://www.stevemcconnell.com/ieeesoftware/eic02.htm"&gt;dicas de como ler um artigo técnico&lt;/a&gt; do Steve McConnell. &lt;br /&gt;&lt;br /&gt;Achei um &lt;a href="https://newton.computer.org/sssubs.nsf/application?openform&amp;code=softcn2"&gt;link para assinar com 25% desconto&lt;/a&gt;, saindo a US$62,00 anuais. O preço de 2 livros por 6 revistas. Ótimo custo benefício. Pena só que esta assinatura não dá acesso aos artigos antigos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-6388280483287458527?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=L920KMvT-WM:HgZAduPX3Qw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/L920KMvT-WM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/6388280483287458527/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=6388280483287458527" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6388280483287458527?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/6388280483287458527?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/L920KMvT-WM/assinando-ieee-software-com-desconto.html" title="Assinando a IEEE Software com desconto" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/06/assinando-ieee-software-com-desconto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08FQ34_eip7ImA9WxJQFkk.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8689771602524184545</id><published>2009-05-27T21:58:00.006-03:00</published><updated>2009-05-29T23:16:52.042-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T23:16:52.042-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="busca" /><title>Wolfram|Alpha e a velocidade das andorinhas</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uthE5NsxV9A/Sh3qryCSofI/AAAAAAAAAJg/dA3HquUUVf0/s1600-h/montypythongrail.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://1.bp.blogspot.com/_uthE5NsxV9A/Sh3qryCSofI/AAAAAAAAAJg/dA3HquUUVf0/s400/montypythongrail.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5340682771017933298" /&gt;&lt;/a&gt;&lt;br /&gt;A última da novidade da Internet é o &lt;a href="www.WolframAlpha.com"&gt;Wolfram|Alpha&lt;/a&gt;. O bicho se intitula um &lt;i&gt;mecanismo de conhecimento computacional&lt;/i&gt;. Se também previsse o futuro, uma melhor definição seria &lt;a href="http://en.wikipedia.org/wiki/Oracle" title="O que é oráculo? (em inglês)"&gt;oráculo&lt;/a&gt;. Acessando várias bases de conhecimento, promete ter ou calcular respostas para tudo. &lt;br /&gt;&lt;br /&gt;Já está todo mundo achando &lt;a href="http://mashable.com/2009/05/19/wolfram-alpha-better-than-google/"&gt;coisas&lt;/a&gt; &lt;a href="http://royal.pingdom.com/2009/05/25/useful-wolfram-alpha-tips-for-webmasters-and-sysadmins/"&gt;interessantes&lt;/a&gt; para &lt;a href="http://www.powerhousemuseum.com/dmsblog/index.php/2009/05/16/fiddling-with-wolfram-alpha/"&gt;fazer&lt;/a&gt; com o Wolfram|Alpha, mas tenho que confessar o que eu achei mais legal.&lt;br /&gt;&lt;br /&gt;Se você perguntar a velocidade de uma andorinha sem carga, ele te perguntará de volta: mas uma andorinha africana ou européia? :-) Tente: &lt;a href="http://www99.wolframalpha.com/input/?i=velocity+of+an+unladen+swallow"&gt;velocity of an unladen swallow&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Muito bom! Catando referências para este post achei outras &lt;a href="http://mashable.com/2009/05/17/wolfram-easter-eggs/"&gt;brincadeiras&lt;/a&gt; &lt;a href="http://mashable.com/2009/05/17/better-wolfram-easter-eggs/"&gt;divertidas&lt;/a&gt; com o Wolfram.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8689771602524184545?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=ZLwyJgYEopk:B5fEzvKKSkM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/ZLwyJgYEopk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8689771602524184545/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8689771602524184545" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8689771602524184545?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8689771602524184545?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/ZLwyJgYEopk/wolframalpha-e-velocidade-das.html" title="Wolfram|Alpha e a velocidade das andorinhas" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_uthE5NsxV9A/Sh3qryCSofI/AAAAAAAAAJg/dA3HquUUVf0/s72-c/montypythongrail.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2009/05/wolframalpha-e-velocidade-das.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4MSHc9fSp7ImA9WxNRE0U.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-2053807733220319781</id><published>2009-03-22T02:00:00.004-03:00</published><updated>2009-09-08T01:09:49.965-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T01:09:49.965-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="livros" /><title>Javascript: 3  livros para adquirir superpoderes</title><content type="html">Javascript é um dos mais bem sucedidos bacalhaus da história da informática. Foram misturando funcionalidades de outras linguagens, ignorando a criação de um todo coeso. A implementação foi feita às pressas, sem o necessário tempo de maturação das boas linguagens de programação. Pra terminar de estragar, junte a isto o marqueting infeliz no nome de uma linguagem que não tem nada a ver com Java. &lt;br /&gt;&lt;br /&gt;A linguagem sempre foi promovida como uma "programação para não-programadores". Desde então, é uma dificuldade encontrar livros que prestam. Dá-lhe livrecos ensinando o que é uma variável e um loop, ou dando receitas de bolo. Saco! Comprei meu primeiro livro baseado em recomendações da Amazon. Um lixo. Insisti e comprei um livro que era mal recomendado por ser &lt;i&gt;"muito difícil"&lt;/i&gt;. Foi uma das melhores compras de livro que já fiz.&lt;br /&gt;&lt;br /&gt;&lt;iframe style="float:right;width:120px;height:240px;" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0596101996&amp;fc1=000000&amp;IS2=1&amp;lt1=_top&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt; &lt;a href="http://www.amazon.com/gp/product/0596101996?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0596101996"&gt;JavaScript: The Definitive Guide&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;l=as2&amp;o=1&amp;a=0596101996" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; de &lt;i&gt;David Flanagan&lt;/i&gt; é tudo que um livro de referência tem que ser. Primeiro vem uma rápida introdução à linguagem para quem já sabe programar. A maior parte do livro é referência da linguagem e da API do browser, onde cada método é dissecado. Tudo preciso e sucinto. As diferenças de implementação nos browsers é explicada, o que era fundamental naquele tempo em que as incompatibilidades chegavam ao ponto de os arrays no IE começarem em 1 e no Netscape em 0. &lt;br /&gt;&lt;br /&gt;O trabalho de edição da O'Reilly é um show. Há várias maneiras de achar a informação. A organização das informações é tão boa, que é mais rápido achar o que se quer no livro do que buscar na Internet. Hoje, a linguagem se padronizou e a incompatível API dos clientes cresceu uma ordem de grandeza. O livro também cresceu. A 5ª edição é um calhamaço de mais de 1000 páginas. Ótimo para vencer discussões jogando-o na cabeça de seu adversário. Nestes tempos de  &lt;a href="http://jquery.com/"&gt;poderosas&lt;/a&gt; &lt;a href="http://developer.yahoo.com/yui/"&gt;bibliotecas&lt;/a&gt; &lt;a href="http://www.prototypejs.org/"&gt;javascript&lt;/a&gt;, talvez não seja tão necessário quanto antes. A qualidade do livro permanece. É o alfarrábio onde se esclarece as minúcias da linguagem.&lt;br /&gt;&lt;br /&gt;&lt;iframe style="float: left;width:120px;height:240px;" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0596517742&amp;md=10FE9736YVPPT7A0FBG2&amp;fc1=000000&amp;IS2=1&amp;lt1=_top&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt; &lt;a href="http://www.crockford.com/" title="Sítio pessoal de Douglas Crockford"&gt;Douglas Crockford&lt;/a&gt; é o principal arquiteto da &lt;a href="http://developer.yahoo.com/yui/" title="YUI sítio oficial"&gt;biblioteca javascript do Yahoo&lt;/a&gt; e conhecido como &lt;i&gt;Sr. Javascript&lt;/i&gt;. Inventou o &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt; e o &lt;a href="http://jslint.com/"&gt;JSLint&lt;/a&gt;. A impressão que tenho dele é que um velhinho cheio de manias e opiniões fortes, além de ser um pouco ranzinza. Ao ler &lt;a href="http://www.amazon.com/gp/product/0596517742?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596517742"&gt;JavaScript: The Good Parts&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;l=as2&amp;o=1&amp;a=0596517742" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; mudei de idéia. As manias viraram sabedoria. &lt;br /&gt;&lt;br /&gt;O foco do livro é o núcleo da linguagem, portanto nada de DOM, eventos ou CSS. Na verdade é menos do que o núcleo, mas sim o subconjunto das features que o autor considera as "&lt;i&gt;boas partes&lt;/i&gt;". O livro tem uma grande qualidade: é sucinto. Apenas 170 páginas para descrever o que Javascript tem de bom e apontar suas armadilhas. A gozação, irresistível, é que bastam estas poucas páginas para descrever tudo o que Javascript tem de bom. &lt;br /&gt;&lt;br /&gt;As atrocidades da linguagem são devidamente esculhambadas para que sejam evitadas. Aprende-se um monte de técnicas avançadas, como closures, currying, protótipos e herança. Boas práticas são recomendadas.&lt;br /&gt;&lt;br /&gt;Gostei de detalhes como a notação "em trilhos": &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uthE5NsxV9A/SVmSfxYVMlI/AAAAAAAAAFk/JNCY4xILpZo/s1600-h/js_integer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 73px;" src="http://4.bp.blogspot.com/_uthE5NsxV9A/SVmSfxYVMlI/AAAAAAAAAFk/JNCY4xILpZo/s400/js_integer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5285416712224977490" /&gt;&lt;/a&gt; O divertido dos diagramas é que eles descrevem apenas a parte boa da linguagem. No exemplo acima inteiros são proibidos de começar com zero. Na verdade a linguagem aceita, mas interpreta o número como um &lt;a href="http://pt.wikipedia.org/wiki/Sistema_octal"&gt;octal&lt;/a&gt;. Uma tenebrosa fonte de bugs, já que quando o sujeito entra 09 como o mês de setembro e a linguagem diz que é um número inválido. &lt;br /&gt;&lt;br /&gt; A O'Reilly ficou a dever na produção editorial. Como cada exemplo de código é baseado nos exemplos anteriores, eles bem que poderiam ter indexado os nomes das funções. &lt;br /&gt;&lt;br /&gt;&lt;iframe  src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;o=1&amp;p=8&amp;l=as1&amp;asins=1590597273&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" style="width:120px;height:240px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;a hre="http://ejohn.org/"&gt;John Resig&lt;/a&gt; é o superprogramador que criou a biblioteca &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;. Escreveu o &lt;a href="http://www.amazon.com/gp/product/1590597273?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1590597273"&gt;Pro JavaScript Techniques&lt;/a&gt;, que foca no uso de javascript para interagir com os browsers. É &lt;b&gt;o&lt;/b&gt; livro para se atualizar com as mais modernas tecnologias Web. Você vai aprender sobre o DOM, CSS, eventos e ajax, Dá todos os macetes para dominar as incompatibilidades entre navegadores e as deficiências de APIs como o DOM. Este foco no cliente o torna o complemento ideal ao livro do Crockford. &lt;br /&gt;&lt;br /&gt;&lt;iframe style="float:left;width:120px;height:240px;" src="http://rcm.amazon.com/e/cm?t=agenddosambachor&amp;o=1&amp;p=8&amp;l=as1&amp;asins=193398869X&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;nou=1" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;Apesar das origens do autor, o livro é agnóstico em matéria de bibliotecas, descrevendo detalhes de várias. Lendo o livro você verá por que hoje em dia é fundamental usar uma biblioteca para não ter que perder tempo lidando com as manias de cada navegador. Resig promete para este ano um livro ainda mais avançado, o &lt;a href="http://www.amazon.com/gp/product/193398869X?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=193398869X"&gt;Secrets of the Javascript Ninja&lt;/a&gt;. O nome do livro mostra bem como o sujeito é nerd:-)&lt;br /&gt;&lt;br /&gt;Lendo estas recomendações, você terá &lt;i&gt;superpoderes&lt;/i&gt; (ei, eu também sou nerd). Você não só será capaz de criar aplicações modernas como o Gmail, como de entender os sofisticados códigos das bibliotecas. Javascript é falsamente fácil e cheia de armadilhas. Para ter um um código limpo e fácil de manter é preciso conhecer bem o que e como fazer. Estes livros serão seus melhores mentores.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Atualização:&lt;/b&gt; Bom, o livro do Ninja ainda não saiu, mas o próprio Resig &lt;a href="http://ejohn.org/blog/50-off-secrets-of-the-javascript-ninja/"&gt;disse&lt;/a&gt; que o livro introdutório de Javascript que ele recomenda é o &lt;a href="http://www.amazon.com/gp/product/047022780X?ie=UTF8&amp;tag=agenddosambachor&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=047022780X"&gt;Professional JavaScript for Web Developers (Wrox Programmer to Programmer)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=agenddosambachor&amp;l=as2&amp;o=1&amp;a=047022780X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. Eu não sei. Pelo que vi do índice, me parece que seria um bom livro para substituir todos estes três. Só que você não teria a referência do Definitive Guide, a inteligência do Good Parts, nem o pragmatismo do Javascript Pro. Mais barato é com certeza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-2053807733220319781?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=ozTs0WzumcM:YLnGS55vQeg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/ozTs0WzumcM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/2053807733220319781/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=2053807733220319781" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/2053807733220319781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/2053807733220319781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/ozTs0WzumcM/javascript-3-livros-que-prestam.html" title="Javascript: 3  livros para adquirir superpoderes" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_uthE5NsxV9A/SVmSfxYVMlI/AAAAAAAAAFk/JNCY4xILpZo/s72-c/js_integer.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2008/12/javascript-3-livros-que-prestam.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIAQn05eyp7ImA9WxVXEk4.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-7884226108864197666</id><published>2009-02-10T01:11:00.005-02:00</published><updated>2009-02-10T02:02:23.323-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T02:02:23.323-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="backup" /><title>Backup automático no linux em casa</title><content type="html">Tá bom, estas coisas acontecem. De repente meu HD deixa de funcionar. Eu ter um sistema de arquivos não muito tradicional, não ajuda. Pior ainda, o fato do criador do sistema de arquivos ter &lt;a href="http://blog.wired.com/27bstroke6/2008/04/reiser-guilty-o.html"&gt;assassinado a mulher&lt;/a&gt; e estar na cadeia, me preocupa um pouco mais. Mas na Internet sempre há uns anjos que nos dão dicas de como &lt;a href="http://www.titov.net/2005/12/31/how-to-restore-reiserfs-partition-from-crashed-disk"&gt;salvar o dia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Não era o disco de dados mais importantes, tinha minhas fotos e minhas músicas. Quase todas as fotos têm uma cópia no computador da minha mulher. O backup das músicas é minha coleção de CDs (isto mesmo, crianças, aqueles disquinhos prateados). Só que ao ver o HD morrendo, fiquei tremendo só de pensar que teria que digitalizar novamente mais de 70Gb de músicas. Até hoje não consegui ripar nem metade de minha coleção. Voltar ao zero seria aterrorizador. Ah! E pra piorar descobri que minha mulher não tinha as cópias de todas minhas fotos.&lt;br /&gt;&lt;br /&gt;Comprei um novo HD maior. Aproveitei para mudar de distribuição linux (outro post para isto). Com meus dados recuperados resolvi montar um esquema de backup de verdade. Eis como fiz.&lt;br /&gt;&lt;br /&gt;Comprei um HD extra de 500Gb (caraca, isto é meio terabyte!!!). Comprei um case (ou enclosure) de HD externo SATA to USB2.0 da Coolermaster modelo X Craft 310. Aqui ficará meu backup. Formatei-o como ext3. Li recomendações de que o melhor filesystem seria o XFS. Só que quando caos baixar, o ext3 tem melhores drivers para ser lido de dentro do Windows. Melhor ser conservador nestes assuntos.&lt;br /&gt;&lt;br /&gt;Agora tenho que montar os discos. O de backup e o Meus Documentos do computador Windows de minha mulher. Ela vai ganhar um backup de brinde também.  Aprendi uma coisa legal, que agora posso &lt;a href="http://www.cyberciti.biz/faq/linux-finding-using-uuids-to-update-fstab/"&gt;montar discos por UUID&lt;/a&gt;. É ótimo para discos USB. Meu disco USB será sempre montado em /mnt/backup. O da chefe será montado via samba em /mnt/chris após ter sido compartilhado sem senha no windows. Ficaram assim suas entradas no /etc/fstab:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;UUID=33f7417a-88ff-4570-80f2-3e57731fbb42 /mnt/backup  ext3      noatime,users  0  0&lt;br /&gt;//chris/samba-choro     /mnt/chris          smbfs    exec,users,_netdev,rw,b,uid=neves,iocharset=utf8,password= 1 2&lt;/code&gt;&lt;/pre&gt; O resto agora é mole pro Linux. Só usar o &lt;b&gt;cron&lt;/b&gt;, daemon que executa comandos periodicamente, e o &lt;b&gt;rsync&lt;/b&gt;, que copia apenas arquivos que foram modificados. São ferramentas padrão do sistema.&lt;br /&gt;&lt;br /&gt;Um problema é que o computador da patroa podia estar desligado. Outro é que o disco de backup poderia não estar montado (tive problemas com a montagem automática no Kubuntu). No primeiro caso, pareceria que o diretório estava vazio e todo o backup seria apagado. No segundo, copiaria tudo para meu próprio HD que seria devidamente esmagado pelo peso de tantos arquivos.&lt;br /&gt;&lt;br /&gt;Descobri outro prático utilitário, o mountpoint. Ele testa se uma partição está corretamente montada e acessível. Meu simples script de backup ficou assim:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;#/bin/sh&lt;br /&gt;&lt;br /&gt;if  mountpoint -q /mnt/backup&lt;br /&gt;then&lt;br /&gt;   #-v verbose&lt;br /&gt;   #-a archive (recursivo, permissões, links etc)&lt;br /&gt;   #-x no cross filesystem boundaries&lt;br /&gt;   #-E mantém executáveis&lt;br /&gt;   #--delete apaga os que sumiram&lt;br /&gt;   rsync -vaxE --delete --ignore-errors /home/neves/ /mnt/backup/neves/ &lt;br /&gt;&lt;br /&gt;   if mountpoint  -q /mnt/chris&lt;br /&gt;   then&lt;br /&gt;       rsync -vaxE --delete --ignore-errors /mnt/chris/ /mnt/backup/chris/ &lt;br /&gt;   fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;exit 0&lt;/code&gt;&lt;/pre&gt; Prontinho. Agora é só dar permissão de execução à ele: "chmod +x backup.sh". Colocá-lo no crontab do root "sudo crontab -e" com: &lt;br /&gt;&lt;pre&gt;0 12 * * * /home/neves/bin/backup.sh&lt;/pre&gt; &lt;i&gt;Voilá&lt;/i&gt;. Backup automático configurado. Todo dia ao meio-dia será feita a cópia de meus dados novos. A primeira é meio demorada, as outras são impressionantemente rápidas. &lt;br /&gt;&lt;br /&gt;Ainda não é um sistema à prova de meteoros. Para isto teria que ter mais um HD e um case e guardar as cópias longe. Isto fica quando entrar um dinheirinho. Mas o negócio de backup é probabilidade e Murphy. Por enquanto estou melhor do que estava.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-7884226108864197666?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=35Jb26x72n4:fl80sLJ0xyg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/35Jb26x72n4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/7884226108864197666/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=7884226108864197666" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7884226108864197666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7884226108864197666?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/35Jb26x72n4/backup-automatico-no-linux-em-casa.html" title="Backup automático no linux em casa" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/02/backup-automatico-no-linux-em-casa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MASXg-eSp7ImA9WxVXEk4.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-5760368210277490544</id><published>2009-02-10T00:53:00.003-02:00</published><updated>2009-02-10T01:10:48.651-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T01:10:48.651-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><title>Impressora no Linux com o roteador D-Link 704D</title><content type="html">Tenho um roteadorzinho D-Link para compartilhar a conexão Internet. Gosto deste D-Link. É simplezinho, as aplicações pré-configuradas são muito desatualizadas (desconhece torrent), mas tem umas features bem interessantes. Dá pra fazer um QoS para priorizar conexões web e ssh, dá pra usar serviços de DynDNS para conetar de fora de casa, e tem um servidor de impressão. &lt;br /&gt;&lt;br /&gt;Isto significa que, em vez de ligar a impressora em um dos computadores, ligo-a direto nele. Os dois computadores podem imprimir sem precisar deixar sempre ligado o "computador da impressora". E ainda economiza uma porta usb do micro.&lt;br /&gt;&lt;br /&gt;O roteador funciona como um host LPD padrão do linux. Configurar no Kubuntu é mole&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Abra a aplicação "Printer Configuration"&lt;/li&gt;&lt;br /&gt;&lt;li&gt; New printer&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Selecione "LPD/LPR Host or Printer"&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Escolha seu modelo de impressora e use o driver recomendado &lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;span style="font-weight:bold;"&gt;Agora vem o macete. No Device URI coloque: lpd://192.168.0.1/lp&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Marque a impressora como Default, imprima uma página de testes e seja feliz.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-5760368210277490544?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=1-W34eQF1sY:LPrwtO8mP7o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/1-W34eQF1sY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/5760368210277490544/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=5760368210277490544" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/5760368210277490544?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/5760368210277490544?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/1-W34eQF1sY/impressora-no-linux-com-o-roteador-d.html" title="Impressora no Linux com o roteador D-Link 704D" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2009/02/impressora-no-linux-com-o-roteador-d.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHSX87eCp7ImA9WxRbEks.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-7800052166221591202</id><published>2008-12-02T22:08:00.004-02:00</published><updated>2008-12-02T22:20:38.100-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-02T22:20:38.100-02:00</app:edited><title>Flagrante</title><content type="html">Vejam vocês que incrível flagrante. Na véspera eu havia visto notícias sobre a frente fria que invadiam o Rio de Janeiro e o temporal que tudo alagava. Fiquei com saudades de meus queridos amigos e colegas no trabalho e de suas vidas cheias de problemas e preocupações.&lt;br /&gt; &lt;br /&gt;É impressionante como algumas fotografias são capazes de registrar nossas emoções interiores. Vejam como a foto abaixxo conseguiu capturar toda tristeza e saudades que eu estava sentido de meus amigos.&lt;br /&gt; &lt;br /&gt;Abraços pernambucanos,&lt;br /&gt;Paulo Eduardo Neves&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uthE5NsxV9A/STXO10p8QgI/AAAAAAAAAFE/GovPEYHBuQU/s1600-h/a+praia+dos+carneiros.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 284px;" src="http://3.bp.blogspot.com/_uthE5NsxV9A/STXO10p8QgI/AAAAAAAAAFE/GovPEYHBuQU/s400/a+praia+dos+carneiros.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5275349962597351938" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-7800052166221591202?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=Tn6WmjkljGo:y6dbbxJtoHE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/Tn6WmjkljGo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/7800052166221591202/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=7800052166221591202" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7800052166221591202?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/7800052166221591202?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/Tn6WmjkljGo/flagrante.html" title="Flagrante" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_uthE5NsxV9A/STXO10p8QgI/AAAAAAAAAFE/GovPEYHBuQU/s72-c/a+praia+dos+carneiros.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2008/12/flagrante.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4DQXo7cCp7ImA9WxJaF00.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-8456539392022344696</id><published>2008-10-08T22:40:00.010-03:00</published><updated>2009-08-08T00:59:30.408-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-08T00:59:30.408-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="browser" /><title>Como copiar notícias do O Globo</title><content type="html">Algumas publicações insistem em brigar com a Web. Isto é mais drástico naquelas cuja principal forma de distribuição são árvores mortas. E tome encheção de saco para cima dos navegantes:&lt;ul&gt;&lt;li&gt;Páginas que não se pode fazer bookmark (&lt;span style="font-style:italic;"&gt;como mandar para amigos por email?&lt;/span&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;URLs que expiram (&lt;span style="font-style:italic;"&gt;não adianta guardar para referência&lt;/span&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Textos escondidos atrás de páginas de login (&lt;span style="font-style:italic;"&gt;não se pode fazer buscas pois o Google não as enxerga&lt;/span&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Impressão é proibida (&lt;span style="font-style:italic;"&gt;deve ser por motivos ecológicos&lt;/span&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Proibido aumentar a fonte (&lt;span style="font-style:italic;"&gt;quem mandou usar óculos?&lt;/span&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy'n paste proibido (&lt;span style="font-style:italic;"&gt;"Vamos neste filme hoje? Copio abaixo os detalhes"&lt;/span&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;O jornal &lt;a href="http://oglobo.globo.com"&gt;O Globo&lt;/a&gt; é um dos culpados pela última ofensa da lista. &lt;br /&gt;&lt;br /&gt;Só que na Web dos &lt;a href="http://spreadfirefox.com"&gt;navegadores open-source&lt;/a&gt; totalmente &lt;A href="http://diveintogreasemonkey.org/"&gt;customizáveis&lt;/a&gt;, a gente pode se rebelar. Aproveitando meus recém adquiridos super-poderes de Javascript, fiz um &lt;a href="http://en.wikipedia.org/wiki/Bookmarklet"&gt;bookmarklet&lt;/a&gt; que após clicado permite copiar notícias do sítio do O Globo.&lt;br /&gt;&lt;br /&gt;Pra quem não sabe, Bookmarklet é um link especial que ao ser clicado executa um pequeno programa que interage com a página que se está lendo. O link se guarda como um bookmark no browser, por isto o nome. &lt;br /&gt;&lt;br /&gt;São mil e uma utilidades. Existem bookmarklets para mudar as cores de telas ilegíveis para ficar com texto &lt;a href="https://www.squarefree.com/bookmarklets/zap.html#zap_colors"&gt;preto no branco&lt;/a&gt;, permitir &lt;a href="http://www.themaninblue.com/experiment/FormTextResizer/"&gt;aumentar caixas de texto&lt;/a&gt; mínimas e se tenha espaço decente para escrever, ou para ver uma &lt;a href="http://www.gyford.com/misc/wayback.html"&gt;versão arquivada&lt;/a&gt; de uma página que deixou de existir. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Bom, fiz meu primeiro bookmarklet. Após clicar nele, você poderá copiar e colar as páginas do sitio do O Globo sem ficar recebendo mensagens chatas. Para tê-lo sempre consigo, &lt;span style="font-style:italic;"&gt;arraste e solte&lt;/span&gt; para a barra de ferramentas do seu browser este link: &lt;a href="javascript:(function(){document.onkeypress=null;copyright=function(){};var%20mat=document.getElementById('materia');if(mat)mat.oncopy=null;})()"&gt;Globo copiável&lt;/a&gt;. Só testei no Firefox 3.0, mas deve funcionar no Internet Explorer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ele foi feito com a mão na roda da ferramenta &lt;a href="http://subsimple.com/bookmarklets/jsbuilder.htm"&gt;Bookmarklet Builder&lt;/a&gt;, que transforma um código compreensível em um javascript de uma só linha. Eis o código formatado direito:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;(function(){&lt;br /&gt;  document.onkeypress=null;&lt;br /&gt;  copyright=function(){&lt;br /&gt;  }&lt;br /&gt;  var mat=document.getElementById('materia');&lt;br /&gt;  if(mat)&lt;br /&gt;    mat.oncopy=null;&lt;br /&gt;}&lt;br /&gt;)()&lt;/code&gt;&lt;/pre&gt; Ele desativa os dois avisos de proibido copiar que aparecem. Desliga os eventos para Firefox e IE e, desnecessariamente, também redefine a função &lt;code&gt;copyright&lt;/code&gt; para não fazer nada. &lt;br /&gt;&lt;br /&gt;Boa cópia!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-8456539392022344696?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=ubbK04L8OAU:R9y6D5Rjg8w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/ubbK04L8OAU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/8456539392022344696/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=8456539392022344696" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8456539392022344696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/8456539392022344696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/ubbK04L8OAU/como-copiar-textos-do-o-globo.html" title="Como copiar notícias do O Globo" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2008/10/como-copiar-textos-do-o-globo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDRHs6fyp7ImA9WxRRFkU.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-5491219276004100165</id><published>2008-09-26T22:57:00.006-03:00</published><updated>2008-09-29T09:01:15.517-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T09:01:15.517-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Processando textos em Português usando Python</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uthE5NsxV9A/SN3EJnQOSOI/AAAAAAAAAEg/VVE1JQE8W1Q/s1600-h/lusiadas.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_uthE5NsxV9A/SN3EJnQOSOI/AAAAAAAAAEg/VVE1JQE8W1Q/s400/lusiadas.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5250568410018760930" /&gt;&lt;/a&gt;&lt;br /&gt;Minha mulher arrumou um bico em um livro a ser publicado. Tem que fazer uma pequena descrição de cada pessoa mencionada. Precisa ler todo o livro, marcar todos os nomes e só então fazer a pesquisa sobre cada um. Então me pergunta: "&lt;span style="font-style:italic;"&gt;É fácil fazer um programa de computador para extrair todos os nomes próprios de um texto?&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Pausa dramática.&lt;br /&gt;&lt;br /&gt;Na minha face apenas um riso besta e superior de quem sabe Python e expressões regulares. Vem então a resposta: "&lt;span style="font-style:italic;"&gt;É mole!&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Sento no micro, faço umas pesquisas pra ver se já há algo pronto e desisto &lt;a href="http://nltk.sourceforge.net" title="Natural Language Toolkit"&gt;do que encontro&lt;/a&gt;. Abro o .doc no OpenOffice e salvo como texto. Faço umas perguntas para que ela me confirme o que será satisfatório. Começo a fazer de verdade e meia hora depois já tenho uma prova de conceito. Já estou "&lt;a href="http://www.processimpact.com/articles/essays.shtml#ninety" title="A síndrome dos 90% pronto (em inglês)"&gt;90% pronto&lt;/a&gt;"! &lt;br /&gt;&lt;br /&gt;Estava certo que só faltava mais uns 90% e acabei gastando mais uns 360%. E tudo devido a pequenas pentelhações do Python. A cada obstáculo tinha que parar, googlar o problema ou ler a documentação da linguagem. Melhor compartilhar aqui as barreiras e soluções.&lt;br /&gt;&lt;h3&gt;Locale&lt;/h3&gt;Palavra que começa com maiúsculas que não está no início de uma frase é um nome próprio. Este é quase todo o algoritmo. Funcionou até que me deparei um nome que começa com acento:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print 'Água' == 'água'.capitalize()&lt;br /&gt;False&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print 'água'.capitalize()&lt;br /&gt;água&lt;code&gt;&lt;/pre&gt;Ops! Aí eu lembro que pra que funcione direito precisamos do módulo locale. Na verdade este bicho de locale me morde há tanto tempo que por causa dele postei minha &lt;a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/1cab99fd07bbcc9a/d7c6c9d3331d49ef?lnk=st&amp;q=paulo+eduardo+neves#d7c6c9d3331d49ef"&gt;primeira mensagem&lt;/a&gt; na lista de discussão do Python. Foi há 10 anos! E o Guido em pessoa me respondeu. Tou mesmo ficando velho. &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import locale&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; locale.setlocale(locale.LC_CTYPE, ('pt_BR', 'iso8859-1'))&lt;br /&gt;'pt_BR.ISO8859-1'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print 'água'.capitalize()&lt;br /&gt;Água&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Unicode&lt;/h3&gt;Agora no terceiro milênio, existe um novo tipo de dados nos programas: o &lt;code&gt;texto&lt;/code&gt;. Aquele velho array de bytes, também chamado de &lt;code&gt;string&lt;/code&gt;, ainda tem seus usos. Processamento de textos não é mais um deles. Para se ler dados deste novo tipo precisamos de um metadado, uma informação extra, que é o &lt;span style="font-style:italic;"&gt;encoding&lt;/span&gt;. Sabendo o encoding, podemos usá-lo para converter qualquer cadeia de bytes e entrar no &lt;span style="font-style:italic;"&gt;Maravilhoso Mundo do Unicode &amp;trade;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para usar Unicode, os programas modernos devem sempre trabalhar da seguinte forma:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Lê os dados de input e os decodifica para Unicode usando o encondig;&lt;/li&gt;&lt;li&gt;Faz todo o processamento interno manipulando o texto em Unicode;&lt;/li&gt;&lt;li&gt;Na hora de fazer o output (escrever na tela, disco, transmitir) codifica o texto no enconding de output.&lt;/li&gt;&lt;/ol&gt; Assim seu software funcionará com todas a linguagens (humanas) do mundo, basta que sua linguagem (de programação) tenha suporte ao encoding.&lt;br /&gt;&lt;br /&gt;E de onde vem o diabo deste metadado? Aí vai depender de onde você leu o texto. Se é um arquivo que você leu pela rede usando HTTP, será informado no header do protocolo. Se é digitado pelo usuário, usa-se a configuração padrão do sistema. Às vezes está escrito dentro do arquivo. Muitas vezes ninguém sabe. Para isto existem complexas &lt;a href="http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html" title="lista e comparação de bibliotecas"&gt;bibliotecas de detecção de encoding&lt;/a&gt;. Outra alternativa é chutar.&lt;br /&gt;&lt;br /&gt;Para nós brasileiros, há dois encodings que realmente importam: &lt;span style="font-weight:bold;"&gt;iso8859-1&lt;/span&gt; e &lt;span style="font-weight:bold;"&gt;UTF-8&lt;/span&gt;. Aí é só testar. Se você abrir um arquivo e em toda letra acentuada tiver uma letra Ã com outro caracter, signfica que o arquivo está em UTF-8. &lt;br /&gt;&lt;br /&gt;Para descobri em que enconding o OpenOffice gravou o arquivo, tentei decodificá-lo com o 8859-1 e o UTF-8:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; texto = open('arquivo.txt').read().decode('utf-8')&lt;br /&gt;------------------------------------------------------------&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;ipython console&gt;", line 1, in &lt;module&gt;&lt;br /&gt;  File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode&lt;br /&gt;    return codecs.utf_8_decode(input, errors, True)&lt;br /&gt;UnicodeDecodeError: 'utf8' codec can't decode bytes in position 10-12: invalid data&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; texto = open('arquivo.txt').read().decode('iso8859-1')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; texto &lt;br /&gt;u'texto com \xe1\xe7\xeant\xf5s'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print texto&lt;br /&gt;texto com áçêntõs&lt;/code&gt;&lt;/pre&gt;Tentei primeiro decodificar usando o UTF-8. Falhou. Foi a vez do iso8859-1. Este nunca dá erro, por isto é preciso conferir se os acentos foram corretamente interpretados. Tentando ver o valor de texto, aparece a letra u antes do plics, isto indica que é uma variável unicode. Com o comando &lt;code&gt;print&lt;/print&gt; aparecem os acentos corretamente. A conversão foi feita com sucesso. Se não há letras acentuadas, o UTF-8, o iso8859-1 e o ASCII geram exatamente o mesmo arquivo. &lt;br /&gt;&lt;h3&gt;Expressões Regulares&lt;/h3&gt;Agora é simples. Dividimos o texto em frases, quebramos cada frase em palavras e pegamos as palavras que começam com maiúsculas que não começam a frase. Quebrar um texto em palavras é trivial com a função &lt;code&gt;split&lt;/code&gt; do poderoso módulo de expressões regulares do Python. Vamos usar a sequência especial \W, que casa com qualquer caracter que não seja palavra (\w casa com as palavras):&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;import re&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; re.split('\W+', u'açaí do bom')&lt;br /&gt;[u'a', u'a', u'do', u'bom']&lt;/code&gt;&lt;/pre&gt;Falhou! Vendo a documentação descobrimos que &amp;mdash; claro! &amp;mdash; para o \w e \W funcionarem de acordo com a linguagem, temos que construir a expressão regular informando que o locale deve ser levado em consideração:&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;locale.setlocale(locale.LC_CTYPE, ('pt_BR', 'iso8859-1'))&lt;br /&gt;'pt_BR.ISO8859-1'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; palavrasRE = re.compile('\W', re.LOCALE)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; palavrasRE.split(u'açaí do bom')&lt;br /&gt;[u'a\xe7a\xed', u'do', u'bom']&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Ordenação&lt;/h3&gt;Agora tá tudo pronto. Estamos trabalhando com Unicode. O locale está para Português. Vamos listar os nomes que achamos e... A ordem vem errada!&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;print ''.join(sorted(u'cbáa'))&lt;br /&gt;abcá&lt;/code&gt;&lt;/pre&gt;Descubro então que existe um tipo de locale para caracteres (LC_CTYPE) que é usado para tornar uma string maiúscula, e um outro tipo de locale (LC_COLLATE) usado para ordenação. E enquanto o de string é usado automaticamente ao setar o locale, o de ordenação não. Precisamos passar a obscura função de comparação de locale na hora de fazer o sort:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print ''.join(sorted(u'cbáa', cmp=locale.strcoll))&lt;br /&gt;aábc&lt;/code&gt;&lt;/pre&gt;Caraca! Que coisa não-pythonica.&lt;br /&gt;&lt;h3&gt;O Código&lt;/h3&gt;Agora que já sabemos escapar de todas as armadilhas, é só programar e correr para o abraço, beijos e carinhos que vamos ganhar de pagamento pelo sistema. &lt;br /&gt;&lt;br /&gt;Como todo programa que faz qualquer tipo de parse, alguns testes unitários são absolutamente fundamentais. Para isto uso o doctest. Eles rodam quando qualquer parâmetro é passado.&lt;br /&gt;&lt;br /&gt;Eis como ficou o código final:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;#!/bin/env python&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import textwrap&lt;br /&gt;import sys&lt;br /&gt;import re&lt;br /&gt;import locale&lt;br /&gt;locale.setlocale(locale.LC_CTYPE, ('pt_BR', 'ISO8859-1'))&lt;br /&gt;locale.setlocale(locale.LC_COLLATE, ('pt_BR', 'ISO8859-1'))&lt;br /&gt;&lt;br /&gt;pontuacaoRE = re.compile(r'[.!?:"\n]')&lt;br /&gt;def divideFrases(texto):&lt;br /&gt;  return [frase.strip() for frase in pontuacaoRE.split(texto) if frase.strip()]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;palavrasRE = re.compile('(\W+)', re.LOCALE) #o grupo fará que o split retorne os separadores&lt;br /&gt;def dividePalavras(frase):&lt;br /&gt;  return palavrasRE.split(frase)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def isNome(palavra):&lt;br /&gt;  return (palavra == palavra.capitalize() and&lt;br /&gt;          palavra.isalpha())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def extraiNomes(frase):&lt;br /&gt;  """&lt;br /&gt;  #estou ignorando: 'Paulo Eduardo de Almeida' e 'DeWitt'&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Tem um Nome')&lt;br /&gt;  [u'Nome']&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Tem um Nome Composto')&lt;br /&gt;  [u'Nome Composto']&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Nome Composto começa frase')&lt;br /&gt;  [u'Nome Composto']&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Nome simples começa frase')#dispenso este caso&lt;br /&gt;  []&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'O Nome Composto com preposicao')&lt;br /&gt;  [u'Nome Composto']&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Eles são Fulano, Sicrano, Beltrano')&lt;br /&gt;  [u'Fulano', u'Sicrano', u'Beltrano']&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Aqui tem O título ')&lt;br /&gt;  []&lt;br /&gt;  &gt;&gt;&gt; extraiNomes(u'Aqui tem Um título ')&lt;br /&gt;  []&lt;br /&gt;  """&lt;br /&gt;  nomes = []&lt;br /&gt;  pos = 1 #pulo primeira palavra&lt;br /&gt;  palavras = dividePalavras(frase)&lt;br /&gt;  while pos &lt; len(palavras):&lt;br /&gt;    nome = '';&lt;br /&gt;    while (pos &lt; len(palavras) and&lt;br /&gt;           palavras[pos] and &lt;br /&gt;           (isNome(palavras[pos]) or palavras[pos].isspace()) ):&lt;br /&gt;      if not palavras[pos].isspace():&lt;br /&gt;        nome += ' ' + palavras[pos]&lt;br /&gt;        if pos == 2 and len(palavras[0]) &gt; 2: #inclui primeira quando segunda palavra começa com maiúscula&lt;br /&gt;          nome = palavras[0] + nome&lt;br /&gt;      pos += 1&lt;br /&gt;    if len(nome.strip()) &gt; 2: #ignoro nomes muito curtos&lt;br /&gt;      nomes.append(nome.strip())&lt;br /&gt;    pos += 1&lt;br /&gt;  return nomes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def processaTexto(nomeArq):&lt;br /&gt;  todasFrases = divideFrases(open(nomeArq).read())&lt;br /&gt;  todosNomes = {};&lt;br /&gt;  for frase in todasFrases:&lt;br /&gt;    nomes = extraiNomes(frase)&lt;br /&gt;    for nome in nomes:&lt;br /&gt;      todosNomes.setdefault(nome, []).append(frase)&lt;br /&gt;  return todosNomes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def printNomes(todosNomes):&lt;br /&gt;  """Imprime nomes e as frases em que eles são mencionados para termos o contexto"""&lt;br /&gt;  nomes = todosNomes.keys()&lt;br /&gt;  nomes.sort(cmp=locale.strcoll)&lt;br /&gt;  for nome in nomes:&lt;br /&gt;    print nome&lt;br /&gt;    for frase in todosNomes[nome]:&lt;br /&gt;      print textwrap.fill('- ' + frase, initial_indent=' '*8, subsequent_indent=10*' ')&lt;br /&gt;    print&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def agregaDicts(d1, d2):&lt;br /&gt;  agregado = d1.copy()&lt;br /&gt;  for chave, valor in d2.items():&lt;br /&gt;    agregado.setdefault(chave, []).extend(valor)&lt;br /&gt;  return agregado&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;  import glob&lt;br /&gt;  arquivos = glob.glob('depoimentos/*.txt')&lt;br /&gt;  todosNomes = {}&lt;br /&gt;  for arquivo in arquivos:&lt;br /&gt;    todosNomes = agregaDicts(todosNomes, processaTexto(arquivo))&lt;br /&gt;  printNomes(todosNomes)&lt;br /&gt;&lt;br /&gt;def _test():&lt;br /&gt;  import doctest&lt;br /&gt;  doctest.testmod()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;  if len(sys.argv) == 1:&lt;br /&gt;    main()&lt;br /&gt;  else:&lt;br /&gt;    _test()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-5491219276004100165?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=EQV0eQd3jfg:NOob2aATs-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/EQV0eQd3jfg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/5491219276004100165/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=5491219276004100165" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/5491219276004100165?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/5491219276004100165?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/EQV0eQd3jfg/processando-texto-em-portugus-usando.html" title="Processando textos em Português usando Python" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_uthE5NsxV9A/SN3EJnQOSOI/AAAAAAAAAEg/VVE1JQE8W1Q/s72-c/lusiadas.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.mosquito.pro.br/2008/09/processando-texto-em-portugus-usando.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AASXc4cSp7ImA9WxdaGE0.&quot;"><id>tag:blogger.com,1999:blog-27777000.post-9164848693392478104</id><published>2008-08-26T23:55:00.001-03:00</published><updated>2008-08-26T23:55:48.939-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-26T23:55:48.939-03:00</app:edited><title>Divertidos os testes da ODesk</title><content type="html">&lt;a href="http://www.odesk.com/users/~~38fbccaaffddbb08"&gt;&lt;img src="http://www.odesk.com/api/exams/178568/image" alt="oDesk Certified Search Engine Optimization Consultant"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27777000-9164848693392478104?l=www.mosquito.pro.br' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NaoTemMosquito?a=xygNuBs3cak:L7bmTyYYXlI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NaoTemMosquito?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NaoTemMosquito/~4/xygNuBs3cak" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.mosquito.pro.br/feeds/9164848693392478104/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=27777000&amp;postID=9164848693392478104" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/9164848693392478104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/27777000/posts/default/9164848693392478104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NaoTemMosquito/~3/xygNuBs3cak/divertidos-os-testes-da-odesk.html" title="Divertidos os testes da ODesk" /><author><name>Paulo Eduardo Neves</name><uri>http://www.blogger.com/profile/15553962420090400995</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><feedburner:origLink>http://www.mosquito.pro.br/2008/08/divertidos-os-testes-da-odesk.html</feedburner:origLink></entry></feed>

