<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A08CQH8zfip7ImA9WxBVGUo.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453</id><updated>2010-02-23T23:51:01.186-03:00</updated><title>PJ @ Work</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.paulojeronimo.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>36</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/paulojeronimo" /><feedburner:info uri="paulojeronimo" /><feedburner:emailServiceId>paulojeronimo</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DEcDRXg8eip7ImA9WxBVGUg.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7558924652309334591</id><published>2009-10-24T11:43:00.004-02:00</published><updated>2010-02-23T17:14:34.672-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T17:14:34.672-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FGSL" /><category scheme="http://www.blogger.com/atom/ns#" term="Eventos" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaVsDotNet" /><category scheme="http://www.blogger.com/atom/ns#" term="Artigos" /><title>Servidores de Aplicação Java EE Livres</title><content type="html">Hoje eu participei do evento &lt;a href="http://www.javaversusdotnet.com.br/"&gt;Plataforma Java x Plataforma .Net&lt;/a&gt; (edição DF 2009) ministrando uma palestra no &lt;a href="http://www.javaversusdotnet.com.br/Programacao.aspx#Tema1"&gt;Tema 1&lt;/a&gt;. O tema de minha palestra foi o mesmo da ministrada no &lt;a href="http://fgsl.aslgo.org.br/fgsl6/"&gt;6º FGSL&lt;/a&gt;. Eu escrevi &lt;a href="http://bit.ly/2Ghtmy"&gt;este artigo&lt;/a&gt; como base para minha apresentação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7558924652309334591?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/QbUF7eFav1I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7558924652309334591/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/10/servidores-de-aplicacao-java-ee-livres.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7558924652309334591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7558924652309334591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/QbUF7eFav1I/servidores-de-aplicacao-java-ee-livres.html" title="Servidores de Aplicação Java EE Livres" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/10/servidores-de-aplicacao-java-ee-livres.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4MRX06cCp7ImA9WxNQGEQ.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7081791761788430689</id><published>2009-09-21T17:49:00.002-03:00</published><updated>2009-09-25T14:16:24.318-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T14:16:24.318-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FGSL" /><category scheme="http://www.blogger.com/atom/ns#" term="Eventos" /><category scheme="http://www.blogger.com/atom/ns#" term="DevInRio" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaVsDotNet" /><category scheme="http://www.blogger.com/atom/ns#" term="Consegi" /><title>Dev In Rio 2009: eu fui!</title><content type="html">&lt;p&gt;O último evento em que estive presente foi o &lt;a href="http://www.devinrio.com.br/"&gt;Dev In Rio&lt;/a&gt;, na segunda-feira passada (dia 14/Nov). Este post trata de minhas impressões sobre como foi o  evento. O título dele é  inspirado nos &lt;a href="http://www.google.com.br/search?q=Dev+in+Rio+eu+vou"&gt;vários posts entitulados "Dev In Rio 2009: Eu vou!"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Então, vou começar pela conclusão:  &lt;a href="http://gc.blog.br/"&gt;Guilherme Chapiewski&lt;/a&gt; e &lt;a href="http://henriquebastos.net/"&gt;Henrique Bastos&lt;/a&gt; organizaram um bom evento! Com toda certeza, se eu tiver como ir nas próximas edições do mesmo, irei. Eu tive a chance de escutar boas frases dos palestrantes e conhecer algumas pessoas. Percebi que várias destas pessoas (&lt;a href="http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html"&gt;assim como eu&lt;/a&gt;) já não acreditam mais que a  linguagem Java seja a &lt;a href="http://en.wikipedia.org/wiki/Silver_bullet"&gt;bala de prata&lt;/a&gt; para todos os problemas, mas sim, que a plataforma Java está cada vez mais forte com relação a característica de termos, hoje, &lt;a href="http://www.is-research.de/info/vmlanguages/"&gt;mais de duzentas linguagens que podem rodar numa JVM&lt;/a&gt;, dentre as quais, as linguagens mais discutidas neste evento: PHP, Groovy, Python e Ruby. &lt;a href="http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html"&gt;Na minha opinião&lt;/a&gt;, e na de pessoas que escutei durante o evento, o uso destas linguagens dentro de uma VM já é uma realidade. Além disto, a programação na plataforma Java pode se tornar até mesmo uma tarefa poliglota na qual o uso de cada linguagem, no seu devido lugar, pode oferecer até uma solução melhor do que o uso de uma única linguagem (especialmente, a linguagem Java). Também escutei mensagens interessantes sobre o &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;, sobre o &lt;a href="http://blog.paulojeronimo.com/search/label/Django"&gt;Django&lt;/a&gt;, sobre métodos ágeis e no painel, última atividade "oficial" do evento, iniciado por &lt;a href="http://improveit.com.br/empresa/vinicius"&gt;Vinícius Manhães Teles&lt;/a&gt; e participado por diversos outros palestrantes e convidados numa "&lt;a href="http://twitter.com/paulojeronimo/statuses/3988231704"&gt;mesa redonda, sem mesa&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;Sobre os palestrantes e as palestras em que estive presente, comento a seguir:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://guilhermesilveira.wordpress.com/"&gt;Gilherme Silveira&lt;/a&gt;  e Niko Steppat, instrutores da &lt;a href="http://www.caelum.com.br/"&gt;Caelum&lt;/a&gt;. Eles falavam, &lt;a href="http://twitter.com/paulojeronimo/statuses/3982593525"&gt;quando cheguei ao evento&lt;/a&gt;, sobre otimização de performance numa JVM. Citaram parâmetros utilizados na VM HotSpot da Sun que podem influenciar na decisão da mesma de  compilar ou não um código que está sendo bastante chamado. Também demonstraram um exemplo  de código Ruby, rodando através do JRuby, sendo otimizado na HotSpot através da modificação de alguns parâmetros. A palestra foi interessante mas não me somou novidades em relação ao que já conheço e lido nesta área a algum tempo (&lt;a href="http://www.argonavis.com.br/cursos/java/j100/tiger.html"&gt;desde que atuava no mercado com o Helder da Rocha, da Argo Navis&lt;/a&gt;). Atualmente, em cursos fechados que ofereço  para alguns Clientes, cubro assuntos relativos a otimização ao falar sobre tuning de VMs e de servidores de aplicações. Na minha opinião, a melhor contribuição que a palestra da Caelum deixou para todos foi realmente a questão da plataforma Java ser hoje uma plataforma totalmente adequada a utilização de diversas linguagens citando seus casos na utilização do Ruby, Groovy, Scala, etc. Não poderia deixar de citar que Niko Steppat também nos divertiu com o termo "&lt;a href="http://search.twitter.com/search?q=devinrio+vudual"&gt;maguina vudual&lt;/a&gt;".
&lt;/li&gt;&lt;li&gt;&lt;a href="http://akitaonrails.com/"&gt;Fábio Akita&lt;/a&gt;, "evangelizador" de Ruby e de Rails que trabalha na LocaWeb. O Akita se destacou, no meu conceito, pela didática e clareza na transmissão de sua mensagem &lt;a href="http://twitter.com/vinnyrangel/statuses/3983879837"&gt;apesar de falar como uma metralhadora&lt;/a&gt;. O Rails, com toda a certeza, amplia as características do Ruby, através dos exemplos explicados e &lt;a href="http://twitter.com/paulojeronimo/statuses/3983888110"&gt;demonstrados pelo meta-apresentador do Akita&lt;/a&gt; (ele próprio, num vídeo) falando sobre meta-programação. Também foi muito divertida a metáfora "&lt;a href="http://twitter.com/paulojeronimo/statuses/3984378698"&gt;Cowboy x Profissional"&lt;/a&gt;. &lt;a href="http://twitter.com/gchapiewski/statuses/4109604480"&gt;A apresentação do Akita foi disponibilizada&lt;/a&gt;. Uma das coisas que me lembro sobre o Akita falar é como ele aproveita seu tempo, e que &lt;a href="http://twitter.com/rafaelbiriba/statuses/3988313710"&gt;todo programador deveria ser burro (julgar-se  assim) e buscar conhecimento constantemente&lt;/a&gt;. Eu, &lt;a href="http://twitter.com/paulojeronimo/status/4010871429"&gt;tenho lido sobre como gerir melhor o meu tempo&lt;/a&gt; e também procuro aproveitar meus minutos em deslocamentos (metrô, ônibus, vôos, ...) &lt;a href="http://blog.paulojeronimo.com/search/label/Livros"&gt;lendo&lt;/a&gt;, ouvindo e vendo coisas que possam me tornar melhor no que faço. Além disto, estou em constante busca por &lt;a href="http://blog.paulojeronimo.com/2009/08/o-fator-gente-boa.html"&gt;aperfeiçoamento até mesmo fora do trabalho&lt;/a&gt;. As palavras do Akita neste sentido devem ser bem lembradas e, por isto, eu as cito aqui.
&lt;/li&gt;&lt;li&gt;&lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt;, um dos líderes do desenvolvimento do Django, &lt;a href="http://www.slideshare.net/jacobian/django-introduction-dev-in-rio-2009"&gt;fez uma boa  introdução &lt;/a&gt;sobre este  framework. Eu acredito que, atualmente, trabalhar com Django seja realmente uma das formas mais ágeis de se produzir aplicações para a Web. Se assim não fosse, empresas como Globo.com, Google, SERPRO, dentre outras tantas, realmente não estariam investindo tanto tempo assim em soluções que envolvem seu uso. Também achei interessante a apresentação do software  &lt;a href="http://www.politifact.com/truth-o-meter/promises/"&gt;Obameter&lt;/a&gt; e dele ter sido desenvolvido em Django. Cheguei até mesmo a comentar, ao final da apresentação &lt;a href="http://twitter.com/paulojeronimo/statuses/3985486523"&gt;e no twitter&lt;/a&gt;, que um software desta espécie seria interessante para nós brasileiros, que estaremos em um ano eleitoral no ano que vem. Depois desta apresentação, fui instruído por um participante e pelo &lt;a href="http://gc.blog.br/"&gt;GC&lt;/a&gt; de que já existem alguns softwares nesta linha. Gostaria de ter um comentário neste post sobre aonde estão tais softwares!
&lt;/li&gt;&lt;li&gt;&lt;a href="http://twitter.com/paulojeronimo/statuses/3986527774"&gt;Jeff Patton&lt;/a&gt; trouxe uma apresentação interessante sobre Agile. Falou sobre a utilização de idéias ágeis, antes mesmo da confecção do software. Lembro-me de slides onde ele falou sobre a prototipação de telas utilizando caneta e papel mesmo e como isto é rápido para se conceber uma idéia inicial de como será uma navegação nas telas de um sistema. Também deu várias outras idéias interessantes relativas a desenvolvimento ágil, fora da questão da codificação.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;No intervalo entre a palestra do Jacob e do Jeff, eu conheci o &lt;a href="http://twitter.com/lucabastos"&gt;Lucas Bastos&lt;/a&gt;. Ele se apresentou para mim, falando que também é corredor, e eu fiquei empolgado por ter conhecido alguém neste evento que também compartilha comigo o &lt;a href="http://blog.eucorro.net/"&gt;gosto por corridas&lt;/a&gt;. Não deu tempo de conversarmos muito sobre o evento em si já que nosso foco foi completamente alterado para o assunto corridas ;-)! Ele me disse que também compartilhavamos uma amizade em comum: &lt;a href="http://www.claudius.com.br/blog/claudio/"&gt;Cláudio Miranda&lt;/a&gt; que irá correr na minha equipe (&lt;a href="http://blog.eucorro.net/"&gt;eucorro.net&lt;/a&gt;), no  &lt;a href="http://www.yescom.com.br/super40-df/2009/portugues/index.asp"&gt;Super 40&lt;/a&gt; em Brasília, no próximo domingo (27/Nov). &lt;a href="http://twitter.com/improveit_hq/statuses/4150766905"&gt;Vinícios Teles fez uma entrevista com o Luca Bastos&lt;/a&gt;. Assista!
&lt;/p&gt;

&lt;p&gt;Também tive o prazer de apertar a mão do &lt;a href="http://twitter.com/Maujor"&gt;Maurício Samy Silva (Maujor)&lt;/a&gt; e de lhe dizer que sou um grande admirador de seu trabalho. Quando crescer, quero ser igual a ele! :-D Falo isto, no que diz respeito a sua capacidade de atuar no que gosta, escrevendo livros e ainda tendo uma energia fora do comum para participar de eventos e fazer amigos!&lt;/p&gt;

&lt;p&gt;Bem, estas foram minhas impressões sobre o Dev In Rio 2009. E reforçando a conclusão (dada no início :-): FOI LEGAL MESMO! &lt;a href="http://gc.blog.br/2009/09/16/dev-in-rio-2009-fotos-e-videos-do-evento/"&gt;Neste post do GC, há links para fotos e vídeos do evento&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora não falo mais do Dev In Rio mas de outros eventos:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Mesmo já tendo ocorrido a quase um mês em Brasília, no período de 26 a 28 de agosto, num próximo post eu pretendo também comentar sobre o que achei do &lt;a href="http://www.consegi.gov.br/"&gt;Consegi&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Estarei em Goiânia, dia 03/Out no &lt;a href="http://fgsl.aslgo.org.br/fgsl6/"&gt;6º FGSL&lt;/a&gt;, e em Brasília (dia 24/Out), no &lt;a href="http://www.javaversusdotnet.com.br/Programacao.aspx"&gt;Plataforma Java x Plataforma .Net&lt;/a&gt;. Em ambos os eventos tratarei do mesmo assunto:  &lt;span style="font-weight: bold;"&gt;Servidores de Aplicações Java, Livres&lt;/span&gt;.
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7081791761788430689?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/nd8vEYFYXJA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7081791761788430689/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/dev-in-rio-2009-eu-fui.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7081791761788430689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7081791761788430689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/nd8vEYFYXJA/dev-in-rio-2009-eu-fui.html" title="Dev In Rio 2009: eu fui!" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/dev-in-rio-2009-eu-fui.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMNRHg_fSp7ImA9WxNQEkw.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-8365970771435297057</id><published>2009-09-17T09:30:00.023-03:00</published><updated>2009-09-17T16:58:15.645-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T16:58:15.645-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TweetDeck" /><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><title>Como eu uso o Twitter, parte 2</title><content type="html">&lt;p&gt;Quero complementar &lt;a href="http://blog.paulojeronimo.com/2009/09/como-eu-uso-o-twitter.html"&gt;meu post anterior&lt;/a&gt; que, como este, também é básico e "para pessoas comuns" falando sobre o &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;. Preciso passar algumas informações a mais sobre a forma como tenho trabalhado com ele e sobre algumas ferramentas que começei a utilizar para melhorar, ainda mais, minha forma de interagir com o Twitter, depois de ter escrito o post anterior.&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, quero destacar uma ferramenta que conheci, por acaso, durante &lt;a href="http://search.twitter.com/search?q=paulojeronimo+%23devinrio"&gt;minha participação no evento Dev In Rio&lt;/a&gt;. Um dos participantes sentou-se a minha frente e, num determinado momento, eu não pude deixar de notar que ele estava utilizando em seu notebook uma ferramenta diferente, das que eu utilizava naquele instante, para twittar. Ele estava executando o &lt;a href="http://tweetdeck.com/"&gt;TweetDeck&lt;/a&gt;, num &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;, a mesma &lt;a href="http://distrowatch.com/"&gt;distro Linux&lt;/a&gt; que eu utilizava em meu note, naquele momento.&lt;/p&gt;


&lt;p&gt;&lt;a href="http://tweetdeck.com/"&gt;&lt;img src="http://tweetdeck.com/assets/splashes/frontpage_12.png" /&gt;&lt;/a&gt;Só de bater o olho na tela do colega, percebi algumas coisas interessantes na ferramenta: ela mostra várias colunas e, dentro destas, os tweets. Percebi a existência de três colunas principais: "All Friends", "Mentions" e, como estavamos no evento seguindo a tag #devinrio, havia uma coluna que mostrava os &lt;a href="http://search.twitter.com/search?q=%23devinrio"&gt;tweets marcados com esta tag&lt;/a&gt;. Ferramentas com o &lt;a href="http://www.twittergadget.com/"&gt;TwitterGadget&lt;/a&gt; e o &lt;a href="http://twitterfox.net/"&gt;TwitterFox&lt;/a&gt;, citadas em meu post anterior, utilizam abas (ou "orelhas") ao invés de colunas. Desta forma, você não consegue ter uma visão tão completa como a apresentada pelo TweetDeck. Não tive dúvidas! Instalei imediatamente esta ferramenta em meu Ubuntu. A instalação foi tão simples que eu não sei detalhes sobre como ela foi realizada. Não utilizei o aptitude ou o apt-get, os gerenciadores de pacotes do Ubuntu. Simplesmente, cliquei no botão instalar, através da página aberta pelo Firefox no site do TweetDeck. O resto foi acontecendo de uma maneira quase "mágica". Terminada a instalação em minha máquina, e após fazer o login na aplicação com minha conta do twitter, notei algumas coisas a mais: quando clico em uma tag (#algumacoisa) ele abre automaticamente uma coluna, com todos os tweets que contém aquela tag. Além disto, a ferramenta: encurta URLs automaticamente utilizando o &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt; e a sua conta neste serviço (mas também se integra a outros serviços como o &lt;a href="http://tinyurl.com/"&gt;TinyURL&lt;/a&gt;, entre outros); ao clicar no perfil de uma pessoa,  abre todos os tweets e o seu profile em uma tela pop-up; ao clicar numa foto postada via &lt;a href="http://twitpic.com/"&gt;TwittPic&lt;/a&gt;, &lt;a href="http://tweetphoto.com/"&gt;TweetPhoto&lt;/a&gt; ou &lt;a href="http://yfrog.com/"&gt;yfrog&lt;/a&gt; ele também abre um pop-up com a foto,  etc. &lt;span style="font-weight: bold;"&gt;Enfim, o TweetDeck é realmente uma ferramenta para twitteiros profissionais, ou amadores, que buscam facilidades na experiência com o Twitter ;-).&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;O TweetDeck tem me possibitado estar ANTENADO em diversos assuntos de meu interesse, ao mesmo tempo. "As colunas" realmente são ótimas para isto. O que noto, com o uso desta ferramenta, é que o meu uso do Google para pesquisas sobre as coisas que realmente me importam, tem diminuído. Este comportamento é esperado já que, se formos fazer uma comparação, o Google é um filtro computadorizado para os assuntos que você deseja e o Twitter, é um filtro HUMANO! Seguindo as pessoas certas, você consegue obter as informações que lhe importam, sem a necessidade de pesquisar nada no Google. Daí, surgem previsões como a do post &lt;a href="http://www.twitip.com/twitter-destined-to-replace-google-search/"&gt;Twitter destined to replace Google Search&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Das diversas coisas que eu tenho aprendido no uso do Twitter, eu diria que uma das mais importantes talvez seja a questão de valorizar (e repassar) as informações que recebo, de quem eu sigo ou não, mas que acho importantes. O mecanismo do retweet (RT) é importantíssimo! Leiam o post &lt;a href="http://www.ruhanirabin.com/the-art-of-re-tweeting-in-twitter/"&gt;The art of ReTweeting in Twitter&lt;/a&gt; pois ele trata bem melhor deste assunto do que o que eu poderia escrever aqui. O TweetDeck faz o RT ser simples, fácil e rápido: 1 clicar de botão!
&lt;/p&gt;

&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://info.abril.com.br/edicoes/283/"&gt;&lt;img src="http://info.abril.com.br/edicoes/283/images/283.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;A revista Info deste mês traz dicas sobre mais algumas dezenas de ferramentas que se integram ou facilitam o uso do Twitter. Eu comprei o meu exemplar pois realmente não pude resistir a vontade de aprender mais sobre o ele, suas ferramentas e sobre como utilizá-lo em meu trabalho. O interessante nesta edição são as histórias de como as pessoas estão utilizando o Twitter para conseguir um emprego ou fazer marketing de algum produto ou serviço que oferecem. As dicas de como utilizar o twitter nesta edição também são legais.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Por fim, tenho somente uma última recomendação A REPETIR, pois já a fiz em meu primeiro post: &lt;b&gt;SEJAM RELEVANTES! &lt;/b&gt;Unam isto a CORDIALIDADE, sejam EMPATICOS e AUTENTICOS. &lt;a href="http://bit.ly/XQptG"&gt;Leiam "O Fator Gente Boa", de Tim Sanders&lt;/a&gt;, para entender um pouco mais sobre estes assuntos. Fazendo isto, vocês estarão ajudando as pessoas e atraindo ainda mais seguidores! As pessoas, ao lhe seguirem, esperam que você possa lhes informar alguma coisa interessante para suas vidas.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-8365970771435297057?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/pzvi3YwJttk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/8365970771435297057/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/como-eu-uso-o-twitter-parte-2.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/8365970771435297057?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/8365970771435297057?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/pzvi3YwJttk/como-eu-uso-o-twitter-parte-2.html" title="Como eu uso o Twitter, parte 2" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/como-eu-uso-o-twitter-parte-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUFR3kyeyp7ImA9WxNRFUQ.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-1604375017295999600</id><published>2009-09-10T07:54:00.026-03:00</published><updated>2009-09-10T12:56:56.793-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-10T12:56:56.793-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><title>Como eu uso o Twitter</title><content type="html">&lt;p&gt;Este é um post básico sobre o &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; e sobre como eu venho utilizando-o, seguindo algumas convenções e estabelecendo algumas regras pessoais que desejo compartilhar. Se você já utiliza ou acompanha &lt;a href="http://twitter.com/paulojeronimo"&gt;o que eu venho escrevendo no Twitter&lt;/a&gt;, este post talvez não lhe trará grandes novidades. Mas, se você é novato nesta ferramenta, espero poder lhe trazer algumas informações úteis. Eu senti necessidade de escrever este post para poder explicar a amigos, como eu venho trabalhando com esta ferramenta, que muitos julgam apenas ser mais um modismo.

&lt;p&gt;Em primeiro lugar, quando entrei no Twitter, eu coloquei minha foto. Tudo bem que alguém não queira fazer o mesmo e que queira utilizar um &lt;a href="http://pt.wikipedia.org/wiki/Avatar_%28realidade_virtual%29"&gt;avatar&lt;/a&gt; em seu lugar. Mas, manter a gravura padrão do twitter dá a impressão de que você simplesmente não está nem aí para ele e que simplesmente entrou para criar sua conta e nunca mais voltou.

&lt;p&gt;Eu gosto de utilizar o Twitter mais para repassar informações úteis do que para falar sobre mim. Isto inclui a divulgação de, até mesmo, meus próprios posts neste blog. Mesmo assim, a pergunta que o Twitter nos faz antes de enviarmos um post "What are you doing" sugere que repassemos alguma informação mais particular e, muitas vezes, eu faço isto. Mas, prefiro realmente ser mais relevante para as pessoas do que falar sobre o que estou fazendo. Indiretamente, esta informação pode ser inferida.

&lt;p&gt;Eu procuro evitar palavras de baixo escalão no Twitter. Entendo que a característica de um microblog com seus 140 caracteres seja, muitas vezes, emotiva e superficial. Mas, mesmo em minha vida fora da Internet, eu tento não falar palavrões perto de estranhos. Imagine o seguinte: você está em um local público e quer expressar sua raiva por algo. Se você se descontrola e grita alto um palavrão bem feio, que impressão você espera passar? Você deveria esperar que os leitores de teu Twitter tivessem a mesma impressão.

&lt;p&gt;No Twitter assim como em minha vida, eu procuro evitar críticas a qualquer pessoa ou grupo utilizando artigos indefinidos. Quando eu tenho alguma crítica a fazer sobre algo, pessoa ou empresa, eu as cito nominalmente. Também não vejo sentido em ficar postando ou repassando comentários como, por exemplo, sobre o desconhecimento de uma pessoa (ou grupo) sobre algo que eu julgo que ela deveria saber. Acho isto no mínimo "pouco elegante" por parte da pessoa que escreveu tal post, ou que o repassou. Seria bem mais construtivo guardar tal informação para si e ajudar tal pessoa (ou grupo). Informações deste tipo simplesmente não agregam nada a vida de ninguém. Pelo contrário, só demonstram que a pessoa que as produz é indelicada ou esta tentando ser engraçada, inutilmente.

&lt;p&gt;Eu procuro usar tags (Ex.: &lt;a href="http://twitter.com/search?q=%23maratonadecuritiba"&gt;#maratonadecuritiba&lt;/a&gt;) em meus microposts. Isto facilita a busca por determinadas palavras pois, para isto, basta clicar na tag que você verá quem está também está falando sobre aquele assunto. O Twitter possibilita que você recupere um &lt;a href="http://pt.wikipedia.org/wiki/Feed"&gt;feed&lt;/a&gt; a partir de uma determinada tag e, com isto, você possa incorporar as frases que contém aquela tag em teu blog, como eu faço na lateral direita do &lt;a href="http://blog.eucorro.net/"&gt;meu blog para corredores&lt;/a&gt; utilizando a tag &lt;a href="http://twitter.com/search?q=%23eucorronet"&gt;#eucorronet&lt;/a&gt;.

&lt;p&gt;Eu uso o RT para valorizar e repassar os bons posts (ou informações) que outras pessoas escrevem. Este recurso, para quem está iniciando o uso do Twitter, é utilizado para que você possa repassar alguma frase escrita por alguém, citando-a como a autora. Por exemplo, a frase "&lt;a href="http://twitter.com/paulojeronimo/status/3877913834"&gt;&lt;span&gt;RT @yaraachoa 74 dias para a Maratona de Curitiba! Preparação física e psicológica. #eucorronet&lt;/span&gt;&lt;/a&gt;" informa que eu estou repassando uma frase da &lt;a href="http://twitter.com/yaraachoa"&gt;Yara Achôa&lt;/a&gt;,  jornalista e maratonista que escreve para várias revistas, sobre corridas. Note que as frases que eu escrevo no Twitter são "linkáveis". Eu posso também, agregar alguma informação a frase dela, como fiz ao escrever a tag #eucorronet. Sendo assim, esta informação também irá aparecer nos blogs em que eu tiver agregado o &lt;a href="http://twitter.com/paulojeronimo"&gt;meu twitter&lt;/a&gt;.

&lt;p&gt;Eu procuro responder as citações que me são feitas. Quando alguém escreve um post em seu Twitter contendo na frase a palavra  @paulojeronimo, esta informação fica visível para mim, na página do Twitter (ou nos plugins que utilizo para trabalhar com ele) e eu costumo respondê-la.

&lt;p&gt;Eu costumo seguir no Twitter as pessoas que eu conheço pessoalmente e as que eu não conheço, mas que fornecem informações relevantes para mim. Também sigo  empresas ou grupos que sejam igualmente de meu interesse. Eu, assim como qualquer usuário que possui um perfil púbico no Twitter enfreto um problema, que são os &lt;a href="http://pt.wikipedia.org/wiki/Spammer"&gt;malditos spammers&lt;/a&gt; que utilizam robôs para me seguir. Mas, realmente não há muitas soluções para este problema e, a que eu mais utilizo mesmo, é clicar no botão block no Twitter do danado ;-).

&lt;p&gt;Eu também utilizo algumas das muitas ferramentas que integram o twitter a diversas outras coisas. Neste blog, utilizo o &lt;a href="http://twitthis.com/"&gt;TwitThis&lt;/a&gt; para que você possa twittar que está lendo ou que leu este post. Também utilizo o &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt; para encurtar uma URL grande e para ter uma noção de quantos cliques eu tive nesta URL. Uso o &lt;a href="https://addons.mozilla.org/pt-BR/firefox/addon/5081"&gt;TwitterFox&lt;/a&gt; (como plugin para o Firefox) e o &lt;a href="http://www.twittergadget.com/"&gt;TwitterGadget&lt;/a&gt; (que integro a minha página do iGoogle). O &lt;a href="http://tweetfeed.com/"&gt;TweetFeed&lt;/a&gt; também já me foi útil para gerar automaticamente um post no Twitter, toda vez que eu postava alguma informação neste blog. Além de tudo isto, uma ferramenta que irei passar a usar em breve, assim que anunciar um novo site que estou criando, é o &lt;a href="http://www.tweetray.com/"&gt;Tweetray&lt;/a&gt;.

&lt;p&gt;Bem, acho que já escrevi o bastante... Este post é apenas uma introdução que fala do meu modo de uso do Twitter. Para aprender ainda mais, leia os diversos &lt;a href="http://www.google.com/reader/shared/paulojeronimo"&gt;posts que compartilho através do Google Reader&lt;/a&gt; onde, em vários deles, o assunto é o Twitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-1604375017295999600?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/dAHUyGMccqo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/1604375017295999600/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/como-eu-uso-o-twitter.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1604375017295999600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1604375017295999600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/dAHUyGMccqo/como-eu-uso-o-twitter.html" title="Como eu uso o Twitter" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/como-eu-uso-o-twitter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYER3Y4eip7ImA9WxBVGUg.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-3722448978996817830</id><published>2009-09-03T21:11:00.004-03:00</published><updated>2010-02-23T17:15:06.832-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T17:15:06.832-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Seam" /><category scheme="http://www.blogger.com/atom/ns#" term="EJB3" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Caching" /><category scheme="http://www.blogger.com/atom/ns#" term="Artigos" /><title>Seam Caching - Parte I</title><content type="html">&lt;p&gt; Uma aplicação Seam suporta o uso de cache em várias camadas. Neste primeiro artigo da série &lt;b&gt;Seam Caching&lt;/b&gt;, irei tratar especificamene do cache de entidades em EJB 3.0. Nos próximos, falarei sobre o cache de resultados de consultas e por fim, sobre o cache de fragmentos de páginas. Todos eles trarão exemplos práticos e executáveis para que você possa baixar e testar em sua própria máquina. &lt;/p&gt; &lt;p&gt;Se estamos falando de uma aplicação Seam que trabalha com EJB 3.0, podemos fazer uso do cache de entidades. No caso de aplicações EJB 3.0 dentro do JBoss, o Hibernate é utilizado como implementação JPA e este possui suporte para um cache de segundo nível. A configuração utilizada para a implementação EJB 3.0 utiliza o JBoss Cache para implementar o mecanismo de cache. Este cache é ajustado no arquivo &lt;code&gt;$JBOSS_HOME/server/all/deploy/ejb3-entity-cache-service.xml&lt;/code&gt; que contem uma série de configurações explicadas  detalhadamente na documentação do JBoss Cache. &lt;/p&gt; &lt;p&gt; Com o cache habilitado, cada vez que é persistida uma entidade num banco de dados através do entity manager, a entidade será inserida no cache. Cada vez que a entidade for atualizada e suas mudanças forem persistidas através do entity manager, a entidade será atualizada no cache. E por fim, se você remover a entidade do banco, através do entity manager, a entidade será removida do cache. &lt;/p&gt; &lt;p&gt;O JBoss Cache permite que você especifique timeouts para as entidades no cache. Entidades não acessadas dentro de um certo período de tempo são removidas do cache para liberar memória. Além de tudo isto, o JBoss Cache suporta clustering. Se você está dentro de um cluster, e o cache é atualizado, mudanças em entradas de um nó serão replicadas para as entradas correspondentes nos outros nós do cluster. &lt;/p&gt;&lt;a href="http://bit.ly/1ebo5N"&gt;Continue a leitura...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-3722448978996817830?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/oX9i9CswE-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/3722448978996817830/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/seam-caching-parte-i.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3722448978996817830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3722448978996817830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/oX9i9CswE-0/seam-caching-parte-i.html" title="Seam Caching - Parte I" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/seam-caching-parte-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIERn47eCp7ImA9WxNSGEs.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-5227518950602424998</id><published>2009-09-02T00:23:00.003-03:00</published><updated>2009-09-02T00:35:07.000-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-02T00:35:07.000-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Virtualização" /><category scheme="http://www.blogger.com/atom/ns#" term="VirtualBox" /><title>Redimencionamento de disco virtual no VirtualBox</title><content type="html">&lt;P&gt;

Eu precisei de mais espaço na máquina virtual (VM) que utilizo para rodar o &lt;A HREF="http://www.ubuntu.com/"&gt;Ubuntu&lt;/A&gt; no desktop Windows de um de meus contratantes, através do &lt;A HREF="http://www.virtualbox.org/"&gt;VirtualBox&lt;/A&gt; (&lt;A HREF="http://blog.paulojeronimo.com/2009/08/como-tornar-o-windows-do-seu-trabalho.html"&gt;entenda porque eu o utilizo nestes casos&lt;/A&gt;). Ela tinha 4.5 GB de disco e eu queria expandí-la para 6 GB. Apesar da existência do comando &lt;CODE&gt;VBoxManage clonehd&lt;/CODE&gt;, não existe uma opção que possa ser utilizada para redimencionar um disco existente. Sendo assim, a alternativa que tomei para solucionar este problema foi criar um novo disco virtual (com os 6 GB) e copiar todo o conteúdo do disco existente para este novo. Eu resolvi este problema através dos procedimentos abaixo:
&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Criei o novo disco e chamei-o de &lt;CODE&gt;temp.vdi&lt;/CODE&gt;. Inclui este disco como "Primário Slave", na VM que eu queria configurar:
&lt;P&gt;&lt;/P&gt;

&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/e.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.e.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/f.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.f.png"/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/g.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.g.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Baixei um ISO do &lt;A HREF="http://gparted.sourceforge.net"&gt;GParted LiveCD&lt;/A&gt; que é pequeno e que me atenderia bem nas nas tarefas de redimensionamento de HD que eu precisaria, rodando os comandos &lt;CODE&gt;fdisk&lt;/CODE&gt; e &lt;CODE&gt;dd&lt;/CODE&gt; e &lt;CODE&gt;gparted&lt;/CODE&gt;. Eu também poderia utilizar outros LiveCDs alternativos como o &lt;A HREF="http://www.sysresccd.org"&gt;SystemRescueCD&lt;/A&gt; ou o Ubuntu. Configurei a VM para dar boot a partir deste ISO e então, iniciei a VM. Abri um terminal e, como root, executei o comando &lt;CODE&gt;fdisk -l&lt;/CODE&gt; para determinar as partições. Copiei a partição existente para a nova através do comando &lt;CODE&gt;dd if=/dev/hda of=/dev/hdb&lt;/CODE&gt;, levando em consideração a informação obtida como resultado comando &lt;CODE&gt;fdisk -l&lt;/CODE&gt;. Fui fazer algo mais importante pois este processo iria demorar bastante;

&lt;P&gt;&lt;/P&gt;
&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/h.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.h.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/1.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.1.png"/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/2.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.2.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Após a finalização do &lt;CODE&gt;dd&lt;/CODE&gt;, desliguei a VM. Antes de religá-la, tornei o disco &lt;CODE&gt;temp.vdi&lt;/CODE&gt; "Primário Master", removendo o disco anterior da configuração. Religuei a VM novamente dando boot, novamente, pelo LiveCD. Acionei o &lt;CODE&gt;gparted&lt;/CODE&gt; para redimensionar a partição existente ao tamanho máximo do novo disco:
&lt;P&gt;&lt;/P&gt;

&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/i.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.i.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/9.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.9.png"/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/a.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.a.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/b.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.b.png"/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Desliguei a VM após redimensionar a partição e dei boot novamente, desta vez pelo HD ao invés de pelo LiveCD. Abri um shell no Ubuntu, e notei que ele ainda não havia reconhecido os 6GB. Faltava só um &lt;CODE&gt;resize2fs /dev/sda1&lt;/CODE&gt; para completar esta tarefa:
&lt;P&gt;&lt;/P&gt;
&lt;a href="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/d.png"&gt;&lt;img src="http://dl.getdropbox.com/u/345266/artigos/vbox-resize/thumb.d.png"/&gt;&lt;/a&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Pronto... Agora estava com espaço que precisava!
&lt;/OL&gt;

&lt;P&gt;
Referências:
&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF="http://crookedspoke.wordpress.com/2008/03/15/resize-disk-image/"&gt;http://crookedspoke.wordpress.com/2008/03/15/resize-disk-image/&lt;/A&gt;
&lt;LI&gt;&lt;A HREF="http://virtualdebian.blogspot.com/2008/03/how-to-resize-virtualbox-virtual-disk.html"&gt;http://virtualdebian.blogspot.com/2008/03/how-to-resize-virtualbox-virtual-disk.html&lt;/A&gt;
&lt;/UL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-5227518950602424998?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/gkuOD6o_FYk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/5227518950602424998/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/redimencionamento-de-disco-virtual-no.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5227518950602424998?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5227518950602424998?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/gkuOD6o_FYk/redimencionamento-de-disco-virtual-no.html" title="Redimencionamento de disco virtual no VirtualBox" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/redimencionamento-de-disco-virtual-no.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQ3c6eip7ImA9WxNRFUw.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-354804119677883501</id><published>2009-09-01T13:53:00.014-03:00</published><updated>2009-09-09T14:03:22.912-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T14:03:22.912-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><title>Sobre a certificação JBCAA</title><content type="html">&lt;p&gt;
A Red Hat anunciou hoje (primeiro dia do &lt;a href="http://www.jbossworld.com/"&gt;JBoss World&lt;/a&gt;) a certificação &lt;a href="https://www.redhat.com/certification/jbcaa/"&gt;JBoss Certified Application Administrator (JBCAA)&lt;/a&gt;. Ela poderá ser obtida globalmente, segundo o anúncio, a partir do dia 1 de outubro.

&lt;/p&gt;
&lt;p&gt;
Sob o meu ponto de vista, se o conteúdo exigido na prova for o apresentando no &lt;a href="https://www.redhat.com/courses/jb336_jboss_for_administrators/"&gt;treinamento JB336&lt;/a&gt;, a certificação passará a cobrar então, aspectos relativos a implantação de aplicações em produção que trabalham, por exemplo, com o &lt;a href="http://labs.jboss.com/jbossjbpm/"&gt;jBPM&lt;/a&gt;, o &lt;a href="http://jboss.org/drools/"&gt;JBoss Rules&lt;/a&gt; e o &lt;a href="http://www.jboss.com/products/platforms/soa/"&gt;SOA-P&lt;/a&gt;. Além disto, deverá cobrir assuntos relacionados ao slimming do &lt;a href="http://www.jboss.com/products/platforms/application/"&gt;JBoss EAP&lt;/a&gt;, a identificação e o entendimento de potenciais problemas e as melhores práticas para a solução destes, a monitoração de problemas de performance através do &lt;a href="http://www.jboss.com/products/jbosson/"&gt;JON&lt;/a&gt;, a determinação das necessidades apropriadas para alta disponibilidade, escalabilidade e tolerância a falhas, a implantação de aplicações em clusters e a configuração do mod_jk para o balanceamento de carga. Também deverá ser cobrado um entendimento sobre o uso de SOA e de produtos JBoss para este mundo: &lt;a href="http://blog.jboss-portal.org/2008/07/jboss-portal-and-epp-releases.html"&gt;JBoss Enterprise Portal Platform (EPP)&lt;/a&gt;, &lt;a href="http://www.redhat.com/docs/en-US/JBoss_SOA_Platform/"&gt;JBoss Service Oriented Architecture Platform (SOA-P)&lt;/a&gt; e &lt;a href="http://jboss.org/jbossesb/"&gt;JBoss Enterprise Service Bus (ESB)&lt;/a&gt;.

&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://www.redhat.com/certification/jbcaa/"&gt;O anúncio&lt;/a&gt; informa que &lt;u&gt;é recomendável&lt;/u&gt; que a pessoa tenha feito o &lt;a href="https://www.redhat.com/courses/jb336_jboss_for_administrators/"&gt;treinamento JB336&lt;/a&gt; para se preparar para a prova. Para mim, não está claro ainda, se isto é mesmo &lt;u&gt;apenas recomendável&lt;/u&gt;  ou, se é obrigatório, como era antes. Quando obtive minhas certificações em JBoss, a política da Red Hat podava que elas pudessem ser obtidas por profissionais capazes de empenhar seu tempo num estudo próprio e que não tivessem grana para a participação num treinamento tão caro ($2.498 por pessoa). Pagar por um treinamento para obter o direito a testar seus conhecimentos sob determinados assuntos não é, na minha opinião, uma boa política. Mesmo acreditando que a maioria das certificações não comprovam grande experiência e que elas apenas indicam que a pessoa estudou previamente determinados assuntos, a obtenção de certificações como as da Sun e/ou IBM, por exemplo, demonstram o respeito destas empresas pela classe dos profissionais autodidatas e por aqueles que não desejam (ou possam) fazer os "treinamentos oficiais", por qualquer motivo que seja. Certificações como, por exemplo, as promovidas pelo &lt;a href="http://www.lpi.org/"&gt;LPI&lt;/a&gt; sempre foram, ao meu ver, muito mais democráticas do que as da Red Hat pois nunca exigiram que você fizesse um curso, neste ou naquele lugar, antes de testar seus conhecimentos.

&lt;/p&gt;
&lt;p&gt;
Mesmo já possuindo duas certificações em JBoss (&lt;a href="http://www.europe.redhat.com/training/jboss_admin.php3"&gt;Certified JBoss Administrator&lt;/a&gt; e &lt;a href="http://www.europe.redhat.com/training/jboss_developer.php3"&gt;Certified JBoss Developer&lt;/a&gt;), eu pretendo fazer esta prova e gostaria, sinceramente, que esta nova certificação tivesse um enfoque mais prático, real, e que avaliasse muito melhor a experiência das pessoas no cotidiano da administração do JBoss AS e das aplicações implantadas nele. Caso contrário, ela será apenas mais uma a entrar para o ramo do "negócio das certificações" que funciona mais ou menos assim: a Red Hat, cujo negócio é vender subscrições de seus produtos, faz parcerias com empresas que ela certifica. Algumas destas empresas "certificadas" fazem &lt;a href="http://pt.wikipedia.org/wiki/Grupo_de_press%C3%A3o"&gt;lobby&lt;/a&gt; para que editais e licitações para serviços no governo começem a exigir que os serviços tenham que ser realizados apenas por "profissionais certificados". E, este tipo de negócio é simplesmente nocivo pois, muitas vezes, é tomado erroneamente pelo contratante, como um fator determinante para a escolha do prestador de serviço. Lembrando que profissionais certificados não são, necessariamente, os que detem maior experiência prática, este tipo de exigência em editais deveria ter seu peso mas não poderia, de forma alguma, ser conclusivo e, deveria ser apenas somado a vivência prática do profissional em situações reais. Felizmente, contratações de serviços em empresas não públicas avaliam muito bem esta última questão e vários órgãos do governo já estão atentos a este fato.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-354804119677883501?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/1oH0sXirf7I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/354804119677883501/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/09/sobre-certificacao-jbcaa.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/354804119677883501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/354804119677883501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/1oH0sXirf7I/sobre-certificacao-jbcaa.html" title="Sobre a certificação JBCAA" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/09/sobre-certificacao-jbcaa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANQ388eSp7ImA9WxNSE00.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-1929079919150853499</id><published>2009-08-25T17:13:00.012-03:00</published><updated>2009-08-26T14:29:52.171-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-26T14:29:52.171-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title>Assinatura de feeds por assunto, no blogger</title><content type="html">Uma informação últil para os leitores que acompanham este blog e/ou assinam meus feeds: talvez, algumas pessoas se interessem apenas por um ou outro dos assuntos que eu escrevo e queiram acompanhar somente o que falo sobre estes assuntos. O &lt;a href="http://www.blogger.com/"&gt;blogger&lt;/a&gt;, que hospeda o meu blog, provê uma solução para isto. Supondo que você só queira ler o que tenho escrito sobre livros, você pode assinar somente o feed &lt;a href="http://blog.paulojeronimo.com/feeds/posts/default/-/Livros"&gt;http://blog.paulojeronimo.com/feeds/posts/default/-/Livros&lt;/a&gt;. Então, mais um exemplo para fixar: tudo o que eu escrevo sobre &lt;a href="http://blog.paulojeronimo.com/search/label/Python"&gt;Python&lt;/a&gt; pode ser lido pelo &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt; (por exemplo) através do acesso a URL &lt;a href="http://blog.paulojeronimo.com/feeds/posts/default/-/Python"&gt;http://blog.paulojeronimo.com/feeds/posts/default/-/Python&lt;/a&gt; para obtenção do feed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-1929079919150853499?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/wC18tlYfvP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/1929079919150853499/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/08/assinatura-de-feeds-por-assunto-no.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1929079919150853499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1929079919150853499?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/wC18tlYfvP4/assinatura-de-feeds-por-assunto-no.html" title="Assinatura de feeds por assunto, no blogger" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/08/assinatura-de-feeds-por-assunto-no.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UNRXw8eip7ImA9WxNSEk4.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-1455140588708306992</id><published>2009-08-25T16:28:00.009-03:00</published><updated>2009-08-25T19:28:14.272-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T19:28:14.272-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Livros" /><title>Livros</title><content type="html">Algumas vezes sou perguntado sobre os últimos livros que li ou que estou lendo, técnicos ou não técnicos. Tenho boas lembranças das últimas pessoas que me fizeram esta pergunta pessoalmente a alguns meses atrás:  &lt;a href="http://blog.bardusco.com/"&gt;Danilo Bardusco&lt;/a&gt; e &lt;a href="http://gc.blog.br/"&gt;Guilherme Chapiewski&lt;/a&gt;, da &lt;a href="http://www.globo.com/"&gt;Globo.com&lt;/a&gt;. Então, resolvi escrever este post apenas para divulgar que agora, toda vez que eu estiver lendo algum livro que eu considere relevante, ele terá o rótulo &lt;a href="http://blog.paulojeronimo.com/search/label/Livros"&gt;Livros&lt;/a&gt;. Eu atualizei os meus posts anteriores, quando eles citaram algum livro que li, incluindo este rótulo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-1455140588708306992?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/e3ynHmSmK1g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/1455140588708306992/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/08/livros.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1455140588708306992?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1455140588708306992?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/e3ynHmSmK1g/livros.html" title="Livros" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/08/livros.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGQXk-eip7ImA9WxNSEk8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-5247403210448533192</id><published>2009-08-23T20:17:00.028-03:00</published><updated>2009-08-25T15:57:00.752-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T15:57:00.752-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Liderança" /><category scheme="http://www.blogger.com/atom/ns#" term="Carisma" /><category scheme="http://www.blogger.com/atom/ns#" term="Simpatia" /><category scheme="http://www.blogger.com/atom/ns#" term="Livros" /><title>O Fator Gente Boa</title><content type="html">&lt;p&gt;Hoje comprei e começei a ler o &lt;a href="http://www.americanas.com.br/AcomProd/1472/2432275"&gt;O Fator Gente Boa&lt;/a&gt;, a tradução do &lt;a href="http://www.timsanders.com/books/likeability.html"&gt;The Likeability Factor&lt;/a&gt; de &lt;a href="http://www.timsanders.com/"&gt;Tim Sanders&lt;/a&gt; e que me chamou a atenção pelo título.&lt;/p&gt;
&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/k1SnLn7_vTA8Ske04Ru3ag?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_clnRWe0H8dc/SpIWRU21J_I/AAAAAAAAFpI/-GLCf-0W7K8/s144/23082009746.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/-94Cry4UwlE3zBddi86I-Q?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_clnRWe0H8dc/SpIWS6XfpqI/AAAAAAAAFpM/ycHZyN1B52c/s144/23082009747.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;O autor fala sobre o poder da simpatia para cativar as pessoas e crescer profissionalmente e explica como você pode elevar o seu Fator-GB (Gente Boa) ;-). Até o momento eu li os três primeiros capítulos (são seis ao todo): O que é o carisma; A antipatia não funciona; A simpatia funciona. Estou gostando desta leitura e por isto resolvi divulgá-la neste blog. Neste livro aprende-se um pouco mais sobre o quanto a simpatia e o carisma são necessários no trabalho e fora dele. A linguagem utilizada é clara, didática e enriquecida por vários estudos realizados sobre estes assuntos comprovando a eficácia do uso da simpatia em várias situações.&lt;/p&gt;
&lt;p&gt;O que me levou a comprar e ler este livro? Bem... Eu confesso que não sou um exemplo de pessoa muito simpática, mas admiro profundamente pessoas que tem esta característica. E justamente por isto, tenho procurado melhorar sob este aspecto e aprendido muito a respeito, no trabalho e fora dele. Eu posso dizer que, em vários momentos, já fiquei tentado a escrever posts neste blog que seriam no mínimo "pouco elegantes" como diria meu amigo &lt;a href="http://picasaweb.google.com/lh/photo/tm6526HBnKsHxuliyMdp7w?feat=directlink"&gt;Helder Moreira&lt;/a&gt; que inclusive já me ajudou a evitar este tipo de comportamento. E realmente, apenas pela leitura dos capítulos iniciais deste livro, já posso perceber pontos que eu devo melhorar. Fora do ambiente de trabalho, uma pessoa de minha convivência que sabe ser extremamente simpática e carismática é &lt;a href="http://picasaweb.google.com/lh/photo/IQuDBB489gaMJRq-hCQWRg?feat=directlink"&gt;minha sogra&lt;/a&gt;. Com tanta gente com problemas com sua sogra, eu a considero como uma segunda mãe. A simpatia e a autenticidade são duas características encontradas nela que atraem pessoas.&lt;/p&gt;
&lt;p&gt;Mas voltando ao livro...&lt;/p&gt;
&lt;p&gt;É fácil perceber que quando vendedores se vêem cercados pela concorrência, acabam se comportando de forma mais simpática e afável, não é verdade? Imagine que você tem um cargo de chefia e precisa decidir quem vai assumir aquele projeto especial que você vai coordenar. Por mais que queira se cercar de profissionais talentosos, você dará a vaga àquele que lhe é mais simpático. Isto é quase uma regra! A &lt;a href="http://www.boothresearch.com/"&gt;Booth Research&lt;/a&gt; fez um estudo para uma empresa de recolocação profissional que demonstra que a decisão de quem fica e de quem sai depende basicamente de quanto os supervisores gostam ou não de seus colaboradores. As coisas funcionam assim nestas situações: "Pessoas que não conquistam a simpatia de quem está no comando são sempre as primeiras a ser dispensadas. Não basta fazer um bom trabalho. É preciso encontrar maneiras de aumentar seu carisma". A simpatia tem a mesma importância na vida pessoal. Pesquisas mostram que pessoas simpáticas têm casamentos mais sólidos.&lt;/p&gt;
&lt;p&gt;A antipatia por outro lado é como um lixo tóxico. Insultar alguém é o mesmo que envenenar a atmosfera com produtos químicos. Gritar com uma pessoa é como entupi-la de agentes poluentes. É verdade que, ao se comportar desta forma, você pode conseguir o que deseja rapidamente - por puro medo. Entretanto, não é preciso ser um gênio para saber que &lt;span&gt;a antipatia troca um benefício imediato por um problema futuro&lt;/span&gt;. E hoje em dia, mesmo pessoas desagradáveis e antipáticas estão percebendo que seu dinheiro pode comprar várias coisas, menos afeto e lealdade.&lt;/p&gt;
&lt;p&gt;Pessoas simpáticas despertam o que há de melhor nos outros. As pessoas são mais generosas com quem as tratam bem. A recíproca é verdadeira. Eu me recordo de um fato interessante que acontece aqui no Rio de Janeiro em algumas lanchonetes da rede &lt;a href="http://dicasmastigadas.blogspot.com/2009/06/big-bi.html"&gt;Big Bi&lt;/a&gt;. O caixa da lanchonete, ao ser agraciado com a gorjeta de algum cliente, grita: "Caixinha!" ou "Caixinha gorda!" se a gorjeta for poupuda. Então, todos os funcionários da lanchonete pronunciam, em coro, um sonoro "Obrigado!!!!". Este simples fato parece motivar outras pessoas que escutam o agradecimento para que elas também ofereçam uma gorjeta. Nada melhor do que um coral de vozes lhe agradecendo por algo não é mesmo? Este gesto, junto com a atenção dispensada pelos funcionários, estimula a simpatia dos clientes.&lt;/p&gt;
&lt;p&gt;Pessoas simpáticas são reconhecidas. Quase todo mundo tem a capacidade de nos ensinar algo, seja o pai, um sócio ou um amigo. Mas sua qualidade como professor dependerá de sua capacidade de cativar as pessoas. Seja na sala de aula, em casa ou no trabalho, se você for simpático, alcançará reconhecimento.&lt;/p&gt;
&lt;p&gt;Pessoas simpáticas obtêm melhores resultados. Na luta contra o estresse diário, a simpatia ajuda a criar um contínuo feedback positivo - ou seja, os sentimentos positivos que você evoca em outras pessoas voltam para você, criando um incentivo constante e um antídoto para as tensões diárias da vida. Seja na linha de montagem ou na sala da diretoria, o desempenho melhora em ambientes positivos. As pessoas simpáticas não apenas dão conta do trabalho como motivam os demais a alcançar os mesmo resultados. Um líder agradável e atencioso faz com que a equipe se empenhe ao máximo.&lt;/p&gt;
&lt;p&gt;Pessoas simpáticas superam os desafios da vida. Alcançam um progresso extraordinário na carreira. Embora seja difícil competir com quem possui nível superior ou uma ampla rede de contatos, tudo fica mais fácil se a pessoa tiver carisma.&lt;/p&gt;
&lt;p&gt;Pessoas simpáticas são mais saudáveis. A auto estima é um dos principais motivos de as pessoas simpáticas serem mais saudáveis que às antipáticas. E uma boa auto-estima está associada a traços de personalidade como magnetismo pessoal. Pelo fato da simpatia trazer reciprocidade, isso aumenta nossa auto-estima e nos ajuda a lidar melhor com o estresse.&lt;/p&gt;

&lt;p&gt;Alguns textos que encontrei sobre Tim Sanders e/ou seus livros aqui no Brasil:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://webinsider.uol.com.br/index.php/2009/05/20/o-fator-gente-boa-para-o-trabalho-em-equipe/"&gt;Webinsider - O fator gente boa para o trabalho em equipe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://vocesa.abril.com.br/edicoes/61/pgart_05_23072003_5216.shl"&gt;Você S/A - Só o amor constrói&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;E só uma dica para quem se interessou por este livro: eu o comprei por R$ 9,90 numa promoção do &lt;a href="http://www.extra.com.br/"&gt;Extra&lt;/a&gt; da Tijuca. Livrarias que anunciam este livro o vendem por R$ 19,90.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-5247403210448533192?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/1tVQZwJXYI4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/5247403210448533192/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/08/o-fator-gente-boa.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5247403210448533192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5247403210448533192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/1tVQZwJXYI4/o-fator-gente-boa.html" title="O Fator Gente Boa" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_clnRWe0H8dc/SpIWRU21J_I/AAAAAAAAFpI/-GLCf-0W7K8/s72-c/23082009746.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/08/o-fator-gente-boa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcGQXo6eCp7ImA9WxNTF0U.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7032480065604958036</id><published>2009-08-13T02:59:00.002-03:00</published><updated>2009-08-20T13:00:20.410-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-20T13:00:20.410-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JDK" /><title>Porque migrar do JDK 5 para o 6?</title><content type="html">&lt;p&gt;Eu acredito que este post possa ser útil para equipes Java que atuam no desenvolvimento ou no suporte de aplicações para esta plataforma e que desejam justificar uma migração de versão do JDK em ambientes mais conservadores ou que exijam um grande esforço para esta tarefa. Muitas empresas que trabalham com tecnologia Java talvez ainda não tenham realizado este processo e meu objetivo aqui é apenas dar alguns motivos e referenciar alguns documentos que talvez ajudem a justificar uma troca do J2SE 1.5 para o Java SE 6.&lt;/p&gt;

&lt;p&gt;O documento &lt;a href="http://java.sun.com/javase/6/webnotes/adoption/adoptionguide.html"&gt;JDK 6 Adoption Guide&lt;/a&gt; (da Sun) é um guia para desenvolvedores Java que criaram aplicações que estão sendo executadas no J2SE 1.5 e estão considerando uma atualização para a plataforma Java SE 6. Ele apresenta as mudanças relativas a API, a código construído no J2SE 1.5 que não compila no Java SE 6, a dependências em relação a mecanismos de implementação, a APIs que estão caindo em desuso, a palavras chaves e novas funcionalidades. Em seguida,  cobre mudanças na forma em que a plataforma Java SE é mapeada para o ambiente de implantação, incluindo instalação, configuração e a disponibilidade de serviços. Por último, fala sobre questões interessantes e avançadas para desenvolvedores que irão suportar o desenvolvimento de aplicações no JDK 6 construindo ferramentas que irão trabalhar em conjunto com ele.&lt;/p&gt;

&lt;p&gt;O &lt;a href="http://java.sun.com/performance/reference/whitepapers/6_performance.html"&gt;Java SE 6 Performance White Paper&lt;/a&gt; por sua vez, é um guia para os avanços na performance e na escalabilidade das aplicações de aplicações no Java SE 6 que demonstra vários benchmarks e o impacto destes avanços. Ele apresenta os diversos avanços em tempo de execução obtidos através de otimizações de performance nas primitivas de sincronização, na compilação, no coletor de lixo, no mecanismo de ergonomia e no tempo de inicialização. Também fala das novas plataformas suportadas e por fim dá dicas sobre como se aprofundar mais nos aspectos relativos a performance, melhores práticas, documentação, ferramentas, FAQs e exemplos de códigos.&lt;/p&gt;

&lt;p&gt;Além dos avanços relativos a performance, várias novas ferramentas foram incorporadas ao Java SE 6 visando o gerenciamento de uma JVM, a monitoração da performance e o diagnóstico de problemas. Tais ferramentas, suas características e aprimoramentos no Java SE 6 são resumidas &lt;a href="http://weblogs.java.net/blog/mandychung/archive/2006/12/java_se_6_monit_1.html"&gt;neste post de Mandy Chung&lt;/a&gt;. Dentre as ferramentas citadas neste documento, estão o &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jconsole.html"&gt;jconsole&lt;/a&gt;, o &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html"&gt;jhat&lt;/a&gt;, o &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html"&gt;jmap&lt;/a&gt;, o &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html"&gt;jstack&lt;/a&gt; e o &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jinfo.html"&gt;jinfo&lt;/a&gt;. Com o JDK 6, não é mais necessária a passagem de nenhuma opção na inicialização de uma aplicação para que estas ferramentas possam atuar na JVM desta. Além disto, a &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/attach/index.html"&gt;Atach API&lt;/a&gt; possibilita a criação de suas próprias ferramentas. O JDK 6 também traz significantes avanços na habilidade de se diagnosticar problemas de memória. A VM HotSpot provê a a habilidade de se requisitar um heap dump sob demanda a partir da ferramenta jmap, assim como também de maneira programatica. A ferramenta de análise de memória (jmap) adicionada ao JDK 6 possibilita a navegação sob os dados obtidos no heap dump. O &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/OutOfMemoryError"&gt;OutOfMemoryError&lt;/a&gt; é um erro conhecido de programadores Java que, a partir do JDK 6, passa a obter um melhor suporte em seu diagnóstico. Este erro agora inclui um stack trace de onde ocorreu a falha. Outro avanço é a opção &lt;code&gt;-XX:+HeapDumpOnOutOfMemoryError&lt;/code&gt; que diz a VM HotSpot para gerar um heap dump quando uma alocação de memória no heap ou na geração permanente não puder ser ocorrer. Além disto, a opção &lt;code&gt;-XX:OnOutOfMemoryError=&amp;lt;comando&amp;gt;&lt;/code&gt; foi adicionada para que você possa especificar um comando a ser executado quando um &lt;code&gt;OutOfMemoryError&lt;/code&gt; ocorrer. Para quem está executando aplicações Java num Solaris, também é possível agora, utilizar o &lt;a href="http://www.sun.com/bigadmin/content/dtrace/index.jsp"&gt;DTrace&lt;/a&gt; para obter mais informações a respeito do comportamento de uma JVM 6 neste S.O. Alguns outros detalhes sobre as novas características de monitoração e de gerenciamento incluídas no Java SE 6 podem ser encontrados no documento &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/management/enhancements.html"&gt;Java SE 6 Monitoring and Management Enhancements&lt;/a&gt;. Dois guias para um aprofundamento na resolução de problemas no Java SE 6 são o &lt;a href="http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/index.html"&gt;Troubleshooting Guide for Java SE 6 with HotSpot VM&lt;/a&gt; e o &lt;a href="http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/index.html"&gt;Troubleshooting Guide for Java SE 6 Desktop Technologies&lt;/a&gt; citados na página &lt;a href="http://java.sun.com/javase/6/webnotes/trouble/"&gt;Troubleshooting Java SE&lt;/a&gt;. Eles são úteis para que você possa obter detalhes sobre os procedimentos de uso das novas ferramentas incluídas no JDK 6, tanto para a solução de problemas na VM HotSpot quanto na ocorrência de problemas em aplicações gráficas para desktop.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://visualvm.dev.java.net/"&gt;VisualVM&lt;/a&gt; (&amp;lt;jdk&amp;gt;/bin/jvisualvm), também é uma das novas ferramentas disponibilizadas a partir do Java SE 6. Ele é uma ferramenta visual que integra várias ferramentas de linha de comando do JDK e características de profile. Projetado para o uso tanto em tempo de desenvolvimento quando de produção, ele amplia a capacidade de monitoração e de análise de performance para a plataforma Java SE. &lt;a href="http://e.blip.tv/scripts/flash/showplayer.swf?file=http://blip.tv/rss/flash/1591181&amp;amp;showplayerpath=http://blip.tv/scripts/flash/showplayer.swf&amp;amp;feedurl=http://kg.blip.tv/rss/flash&amp;amp;brandname=blip.tv&amp;amp;brandlink=http://blip.tv/%3Futm_source%3Dbrandlink&amp;amp;enablejs=true"&gt;Este vídeo&lt;/a&gt; apresenta algumas de suas características.&lt;/p&gt;

&lt;p&gt;Em resumo, o JDK 6 é realmente superior ao 5 no que diz respeito aos aspectos performance, gerenciamento, monitoração e diagnóstico de problemas. &lt;a href="http://lingpipe-blog.com/2009/03/30/jdk-7-twice-as-fast-as-jdk-6-for-arrays-and-arithmetic/"&gt;Testes atuais&lt;/a&gt; também já começaram a indicar que o &lt;a href="http://java.sun.com/features/jdk/7/"&gt;JDK 7&lt;/a&gt; (ainda não lançado) chega a ser até duas vezes superior ao JDK 6, quando se trata do processamento aritmético e de arrays.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7032480065604958036?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/a-8PIMCJumU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7032480065604958036/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/08/porque-migrar-do-jdk-5-para-o-6.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7032480065604958036?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7032480065604958036?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/a-8PIMCJumU/porque-migrar-do-jdk-5-para-o-6.html" title="Porque migrar do JDK 5 para o 6?" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/08/porque-migrar-do-jdk-5-para-o-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ABRHs5eyp7ImA9WxJaGEU.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-5960638844363501003</id><published>2009-08-07T16:08:00.026-03:00</published><updated>2009-08-10T02:22:35.523-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-10T02:22:35.523-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VMware" /><category scheme="http://www.blogger.com/atom/ns#" term="Virtualização" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="VirtualBox" /><category scheme="http://www.blogger.com/atom/ns#" term="cygwin" /><title>Como tornar o Windows do seu trabalho melhor?</title><content type="html">&lt;p&gt;Como tornar o Windows do seu trabalho melhor? A resposta curta: instale um produto de virtualização e rode um Linux! Quer uma outra alternativa? Utilize o &lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;! :-)
&lt;/p&gt;
&lt;p&gt;Este post é para explicar os motivos que me levam a utilização de softwares de virtualização nos desktops que uso para trabalho, em meus contratantes. Antes de prosseguir na leitura deste post, &lt;a href="http://pt.wikipedia.org/wiki/Virtualiza%C3%A7%C3%A3o"&gt;leia este artigo sobre virtualização&lt;/a&gt; caso deseje ter um melhor embasamento sobre este assunto.&lt;/p&gt;
&lt;p&gt;Uma regra comum em várias empresas é: Windows nos desktops e Linux nos servidores. E eu já fui e sou contratado por empresas aonde esta regra é aplicada. A questão é que eu já utilizo Linux a muitos anos. E atualmente, o Linux está tão maduro em termos de desktop que, no meu entendimento, não há porque não utilizá-lo neste ambiente a não ser pelo fato do aprisionamento que determinados softwares impõe e/ou pela diretriz da empresa.&lt;/p&gt;
&lt;p&gt;Desde que trabalhei como funcionário da Brasil Telecom, em Brasília em 2002, começei a utilizar softwares de virtualização para me sentir mais confortável no trabalho e utilizar ainda menos o Windows e os softwares que os contratantes acreditam serem mais práticos ou eficientes para mim. Na época, eu utilizava o &lt;a href="http://www.vmware.com/"&gt;VMware&lt;/a&gt; e a virtualização, me abriu um caminho sem precedentes para isto pois, desta forma, eu conseguia manter o desktop com os softwares padronizados pelo contratante e, mesmo assim, ser feliz utilizando o Linux e os softwares que gosto e que me tornam mais produtivo em diversas atividades. Pelo uso da virtualização, eu inicio meu Linux de dentro do Windows, instalo os programas que preciso e os que gosto, e tenho controle total da minha máquina virtual (VM). Com esta solução, eu acredito não estar  saindo dos padrões do contratante e nem perdendo produtividade já que eu sou mais rápido desenvolvendo minhas tarefas no Linux e, para utilizar a virtualização num desktop Windows, eu não preciso de modificar nada nele. O Windows irá ficar lá, só servindo de hospedeiro (Host) para uma VM através de um software de virtualização. Quando eu precisar de utilizar algum software do contratante, ele estará lá. E ultimamente, exceto pelas pessoas que tem restrições ao uso de software livre, ninguém tem motivos para não utilizar o &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, que é o produto que tenho instalado nos desktops de contratantes, quando necessito de virtualização em Hosts Windows.&lt;/p&gt;
&lt;p&gt;Sob o ponto de vista de um administrador que precisa se preocupar com a segurança, o VirtualBox é apenas mais uma aplicação instalada no Windows. E, pelo fato de eu estar acessando a rede do contratante através de uma NAT interna entre o Host (Windows) e a VM (Linux), todas as regras de segurança aplicadas a esta rede são observadas já que o IP utilizado para acessar qualquer computador é o do Host. O VirtualBox também possibilita que eu tenha um IP válido na rede da corporação e/ou que haja um IP interno no Host que seja de uso exclusivo para a comunicação entre o Host e a VM formando uma rede privada entre ambos. Mas esta configuração é utilizada somente caso seja preciso estabelecer uma conexão do Host para a VM pois, no caso da conexão partir desta para o Host, o acesso via NAT já está pronto e configurado.&lt;/p&gt;
&lt;p&gt;Outro aspecto importante para mim, na utilização de uma VM é a questão da portabilidade da mesma. Eu, em muitas situações, levo trabalho para casa. Realizo configurações na VM fora do meu ambiente de trabalho e as trago prontas no outro dia. Seria mais complicado e lento eu ter que acessar remotamente a rede do contratante e fazer este trabalho. Além disto, grande parte do meu trabalho atual está relacionado ao desenvolvimento de scripts e ao acerto de configurações de servidores. Minha máquina virtual é o laboratório que utilizo para a realização de experiências e é fácil fazer uma cópia de uma VM e retoná-la a um estado consistente, caso ocorra algum erro. Executar uma VM em outro Host não altera em nada a VM e esta característica é ótima para a portabilidade de um ambiente inteiro de trabalho.&lt;/p&gt;
&lt;p&gt;Hoje em dia, vários processadores suportam recursos de virtualização. E este é também o caso do processador instalado no desktop do meu contratante. Isto torna ainda mais rápida e eficiente a execução da VM. O desktop atual que utilizo em um contratante, possui 2GB de memória e um processador AMD 64 com o suporte a algumas características que tornam ainda melhor o uso da virtualização. E eu aproveito estas características para extrair o máximo desta máquina. Outra forma de não quebrar as regras do contratante e, mesmo assim, ter a liberdade para utilizar o Linux é realizando a instalação do mesmo em outra partição (ou num disco externo) e utilizar dual-boot. Desta forma, o Windows fica ali, quietinho. O problema desta abordagem é que, quando preciso utilizar algum software daqueles que só rodam no Windows, eu preciso reinicializar a máquina ou instalar o software de virtualização no Linux e tornar o Windows uma VM. Esta é uma boa saída, mas exige configurações no Windows. A virtualização acaba com o problema do dual-boot, quando os software necessários conseguem rodar tranquilamente, com a memória alocada para a VM. E este é o inconveniente da execução de programas numa VM: pode faltar memória. Seria interessante que meu desktop de trabalho neste contratante tivesse mais memória pois, desta forma, tudo o que rodo no Windows poderia também ser executado no Linux ao mesmo tempo, na VM, sem preocupações a este respeito.&lt;/p&gt;
&lt;p&gt;Em um de meus contratantes, um projeto que estou desenvolvendo é uma  VM Linux para o ambiente de desenvolvimento de aplicações Java. Como eu já utilizo virtualização no desktop que uso, este projeto já existe e esta praticamente pronto nesta VM, atendendo aos requisitos da equipe de desenvolvimento e contendo as ferramentas mais utilizadas por ela no ambiente Windows (grande parte Java). Nos cursos que ministro eu levo outra VM Linux já preparada com tudo o que será necessário para o treinamento. E veja o custo disto em termos de instalação/configuração de ambiente do Cliente: apenas a instalação do software de virtualização nas máquinas do laboratório e a cópia da VM. Todo o restante, já está pronto. E, em se tratando de uma equipe de desenvolvimento, os ganhos com a utilização de uma máquina virtual padronizada são claros.
&lt;/p&gt;Para concluir então, a virtualização para mim é excelente solução. Ela me deixa muito contente em poder utilizar o meu Linux sem efetuar alterações significativas nos ambientes de meus contratantes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-5960638844363501003?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/kAcILiHHfQU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/5960638844363501003/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/08/como-tornar-o-windows-do-seu-trabalho.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5960638844363501003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5960638844363501003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/kAcILiHHfQU/como-tornar-o-windows-do-seu-trabalho.html" title="Como tornar o Windows do seu trabalho melhor?" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/08/como-tornar-o-windows-do-seu-trabalho.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQCRXcyfyp7ImA9WxJVGUQ.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-4902424418264916050</id><published>2009-07-07T15:12:00.011-03:00</published><updated>2009-07-07T16:52:44.997-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T16:52:44.997-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><category scheme="http://www.blogger.com/atom/ns#" term="Seam" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Mojarra: agora sem erros no GAE</title><content type="html">&lt;p&gt;Na semana que vem eu irei comentar alguns tópicos de &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JavaServer Faces (JSF)&lt;/a&gt; em um treinamento que irei ministrar em Brasília. Uma das coisas que irei explicar no treinamento e que irei postar aqui, será como implantar aplicações no &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine (GAE)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E &lt;a href="https://javaserverfaces.dev.java.net/servlets/NewsItemView?newsItemID=7403"&gt;como ontem saiu uma atualização do Mojarra&lt;/a&gt; (a implementação de referência do JSF) visando, dentre outras coisas, &lt;a href="https://javaserverfaces.dev.java.net/nonav/rlnotes/1.2_13/changelog.html"&gt;facilitar a implantação de aplicações JSF no GAE&lt;/a&gt;, achei que esta informação valeria este post pois esta versão corrige, dentre outros bugs, &lt;a href="https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=1079"&gt;este&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas sinceramente, mesmo com o lançamento do GAE para aplicações Java eu ainda estou inclinado a desenvolver em Python para ele, por uma única questão: na minha opinião, é mais simples! De qualquer forma, a comunidade Java agora conta com o suporte do GAE para rodar aplicações escritas em JSF, &lt;a href="http://code.google.com/webtoolkit/tutorials/1.6/appengine.html"&gt;GWT&lt;/a&gt;, &lt;a href="http://briccetti.blogspot.com/2009/04/my-first-scala-web-app-on-google-app.html"&gt;Scala&lt;/a&gt;, &lt;a href="http://ctpjava.blogspot.com/2009/04/jboss-seam-on-google-app-engine-first.html"&gt;Seam&lt;/a&gt;, &lt;a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/"&gt;Groovy&lt;/a&gt; e &lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails&lt;/a&gt;. E realmente o &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; é tão bom que até alguns que odeiam o &lt;a href="http://www.springsource.com/"&gt;Spring Framework&lt;/a&gt; por sua concorrência com produtos JBoss hoje se rendem indiretamente aos seus encantos. Me diga: Grails é ou não impressionante? E mais: é da &lt;a href="http://www.springsource.com/training/spr001/spo-20090811"&gt;Spring Source, que estará em São Paulo ministrando um treinamento de 11 a 14 de agosto&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-4902424418264916050?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/dUpUYHyPygc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/4902424418264916050/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/07/mojarra-agora-sem-erros-no-gae.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/4902424418264916050?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/4902424418264916050?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/dUpUYHyPygc/mojarra-agora-sem-erros-no-gae.html" title="Mojarra: agora sem erros no GAE" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/07/mojarra-agora-sem-erros-no-gae.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYBQ3g5eip7ImA9WxJWF00.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-3721878328569512925</id><published>2009-06-22T16:16:00.007-03:00</published><updated>2009-06-22T17:22:32.622-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-22T17:22:32.622-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GlassFish" /><category scheme="http://www.blogger.com/atom/ns#" term="TorqueBox" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Django" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Quer rodar Django num servidor de aplicações Java?</title><content type="html">&lt;p&gt;O GlassFish 3 acomoda a execução de Python, Ruby e Groovy de maneira automática. &lt;a href="http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html"&gt;Eu venho escrevendo sobre linguagens dinâmicas para Java&lt;/a&gt; e testando um pouco a execução destas em alguns servidores de aplicações. Em breve publico alguns exemplos e um post a respeito. Mas por enquanto, para que você possa saber um pouco mais sobre o suporte do GlassFish a respeito destas linguagens, leia o artigo &lt;a href="http://java.sun.com/javaone/2009/articles/gen_dynamicglassfish.jsp"&gt;&lt;span class="breadcrumb"&gt;Dynamic Languages Powered by GlassFish v3 Application Server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se você também se interessa em rodar o Ruby on Rails num JBoss AS, uma alternativa também pode ser o projeto &lt;a href="http://torquebox.org/"&gt;TorqueBox&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-3721878328569512925?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/wN3UeBchR-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/3721878328569512925/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/06/quer-rodar-django-num-servidor-de.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3721878328569512925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3721878328569512925?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/wN3UeBchR-0/quer-rodar-django-num-servidor-de.html" title="Quer rodar Django num servidor de aplicações Java?" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/06/quer-rodar-django-num-servidor-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEBSH4_cCp7ImA9WxNSEk8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-5190934127282005159</id><published>2009-06-16T10:19:00.016-03:00</published><updated>2009-08-25T15:57:39.048-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T15:57:39.048-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Vim" /><category scheme="http://www.blogger.com/atom/ns#" term="Livros" /><title>Vim porque quero...</title><content type="html">&lt;ul&gt;
&lt;li&gt;Rapidez&lt;/li&gt;
&lt;li&gt;Simplicidade&lt;/li&gt;
&lt;li&gt;Facilidade&lt;/li&gt;
&lt;li&gt;Inteligência&lt;/li&gt;
&lt;li&gt;Eficiência &amp;amp; Eficácia&lt;/li&gt;
&lt;/ul&gt;

&lt;center&gt;&lt;a href="http://www.vim.org/"&gt;&lt;img src="http://files.getdropbox.com/u/345266/imagens/vim-editor_logo.png" height="72" width="72" /&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Sim... O &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; oferece tudo isto e muito mais, quando se trata de edição de textos...&lt;/p&gt;

&lt;p&gt;Eu só faço propaganda do que eu gosto, uso e realmente acredito que é bom por experiência própria. Então, pode acreditar: você vai ter tudo isto utilizando o Vim. Talvez alguns me critiquem comentando: "Vim é simples, fácil? Hahahahah..." Outros, fans de &lt;a href="http://en.wikipedia.org/wiki/Chuck_Norris"&gt;Chuck Norris&lt;/a&gt;, vão dizer que Vim é só para ele ou para &lt;a href="http://en.wikipedia.org/wiki/Ninja"&gt;Ninjas&lt;/a&gt;. Mas eu rebato: você achava simples e fácil andar de bicicleta antes de começar e levar alguns tombos? E hoje, após aprender? É prazeroso? Esta é a filosofia!&lt;/p&gt;

&lt;p&gt;Só estou escrevendo este post hoje porque estava vindo para o meu trabalho lendo o &lt;a href="http://code.google.com/p/vimbook/"&gt;EXCELENTE LIVRO NACIONAL, GRATUITO E QUE VOCÊ TAMBÉM PODE COLABORAR NA ESCRITA&lt;/a&gt; desenvolvido por &lt;a href="http://vivaotux.blogspot.com/"&gt;Sérgio Luiz&lt;/a&gt;, &lt;a href="http://eustaquiorangel.com/"&gt;Eustáquio Rangel&lt;/a&gt; e mais diversas pessoas que, como eu, gostam de tudo o que o Vim proporciona na edição de textos.&lt;/p&gt;

&lt;p&gt;Além deste livro, sugiro que você também busque mais informações nos &lt;a href="http://delicious.com/paulojeronimo/vim"&gt;links que disponibilizo sobre o Vim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eu também estou escrevendo um livro! E agora pergunto: você advinharia qual é o meu editor de textos neste trabalho???&lt;/p&gt;

&lt;span style="font-weight: bold;"&gt;:x&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-5190934127282005159?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/37Bm0w4rvWc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/5190934127282005159/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/06/vim-porque-quero.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5190934127282005159?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/5190934127282005159?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/37Bm0w4rvWc/vim-porque-quero.html" title="Vim porque quero..." /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/06/vim-porque-quero.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08CQH8yeip7ImA9WxBVGUo.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-1863241366876678365</id><published>2009-05-29T21:17:00.015-03:00</published><updated>2010-02-23T23:51:01.192-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T23:51:01.192-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Hacking" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Artigos" /><title>Hackeando o JBoss AS</title><content type="html">&lt;p&gt;O &lt;a href="http://www.jboss.org/jbossas/"&gt;JBoss AS&lt;/a&gt; é o servidor de aplicações que utilizo em meu trabalho e nos cursos que ministro relativos a Java EE e JBoss. Por isto mesmo, quero que ele esteja sempre seguro e que as informações de segurança a respeito dele, sejam as mais divulgadas o possível. Quero compartilhar com vocês neste e nos próximos posts, um trabalho que venho desenvolvendo, relativo ao &lt;a href="http://en.wikipedia.org/wiki/Hardening_%28computing%29"&gt;hardening&lt;/a&gt; do JBoss no meu ambiente de trabalho.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/paulojeronimo.com/Turma1DoRH336"&gt;Nos&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Turma2DoRH336"&gt;diversos&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/TurmaDeJBossDaB2Br"&gt;cursos&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Turma3DoRH336"&gt;de&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Turma4DoRH336"&gt;JBoss&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Pjatwork_turmafechada_rio_dataprev_jboss"&gt;que&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Pjatwork_turmafechada_florianopolis_pixeon_jboss"&gt;já&lt;/a&gt; &lt;a href="http://picasaweb.google.com/paulojeronimo.com/Pjatwork_turmafechada_florianopolis_digitro_jboss"&gt;ministrei&lt;/a&gt;, eu sempre demonstrei aos meus alunos que o JBoss, sem um ajuste mínimo de segurança, permite que qualquer um tenha acesso a suas funcionalidades administrativas. No fim do ano passado, eu escrevi &lt;a style="font-weight: bold;" href="http://bit.ly/ayyUn"&gt;ESTE ARTIGO&lt;/a&gt;, que atualizei hoje e que trata de aspectos básicos relativos a configuração de segurança de algumas aplicações administrativas do JBoss e de como implantar uma aplicação qualquer, num servidor que esteja sem estas configurações realizadas.&lt;/p&gt;
&lt;p&gt;Em próximos posts irei falar sobre diversas outras configurações que são necessárias em ambientes de produção. Acompanhe-me e boa leitura!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-1863241366876678365?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/m_M05RQ74GM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/1863241366876678365/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/hackeando-o-jboss-as.html#comment-form" title="6 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1863241366876678365?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1863241366876678365?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/m_M05RQ74GM/hackeando-o-jboss-as.html" title="Hackeando o JBoss AS" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/hackeando-o-jboss-as.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ANRXk_fip7ImA9WxJQFE4.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-3468525745604788705</id><published>2009-05-27T11:48:00.001-03:00</published><updated>2009-05-27T11:49:54.746-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-27T11:49:54.746-03:00</app:edited><title>Hoje é Dia do Desafio! Eu me desafiei... E você?</title><content type="html">Leia &lt;a href="http://blog.paulojeronimo.net/2009/05/hoje-e-dia-do-desafio-eu-me-desafiei-e.html"&gt;aqui&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-3468525745604788705?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/fDsXbgJJYr4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/3468525745604788705/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/hoje-e-dia-do-desafio-eu-me-desafiei-e.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3468525745604788705?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/3468525745604788705?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/fDsXbgJJYr4/hoje-e-dia-do-desafio-eu-me-desafiei-e.html" title="Hoje é Dia do Desafio! Eu me desafiei... E você?" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/hoje-e-dia-do-desafio-eu-me-desafiei-e.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCRH89cSp7ImA9WxJQE00.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-556501014968390691</id><published>2009-05-25T23:34:00.001-03:00</published><updated>2009-05-25T23:37:45.169-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-25T23:37:45.169-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Geek" /><title>Geek Gang Signs</title><content type="html">&lt;img src="http://dl.getdropbox.com/u/345266/imagens/geek-gang-signs.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-556501014968390691?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/5b5g7kjixWY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/556501014968390691/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/geek-gang-signs.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/556501014968390691?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/556501014968390691?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/5b5g7kjixWY/geek-gang-signs.html" title="Geek Gang Signs" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/geek-gang-signs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAERX4zeyp7ImA9WxNSEk8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7754566463058497686</id><published>2009-05-15T11:49:00.017-03:00</published><updated>2009-08-25T15:58:24.083-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T15:58:24.083-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Livros" /><category scheme="http://www.blogger.com/atom/ns#" term="Erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Haskell" /><title>Scala</title><content type="html">&lt;p&gt;Eu não falei de &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; em &lt;a href="http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html"&gt;meu último post&lt;/a&gt;, que foi enriquecido com alguns comentários nas listas &lt;a href="http://tech.groups.yahoo.com/group/xprio/message/5680"&gt;xprio&lt;/a&gt; e &lt;a href="http://groups.google.com/group/AgilDF/browse_thread/thread/ad690cc9b2b25c5a"&gt;agildf&lt;/a&gt;, um na lista &lt;a href="http://www.grupos.com.br/group/dfjug/"&gt;DFJUG&lt;/a&gt; e nenhum no &lt;a href="http://tech.groups.yahoo.com/group/riojug/message/21883"&gt;RioJUG&lt;/a&gt; (até 15/05/09). Mas, como citei as linguagens Groovy, Ruby e Python, sinto que fiquei em falta com para com o Scala, como uma boa alternativa de linguagem para execução na &lt;a href="http://en.wikipedia.org/wiki/Java_Platform"&gt;plataforma Java&lt;/a&gt;. E, apenas para não ser injusto com outras linguagens, você pode ver uma lista de linguagens suportadas pela plataforma java, &lt;a href="http://www.is-research.de/info/vmlanguages/"&gt;neste link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Scala é uma linguagem que integra características de linguagens funcionais como o Python, &lt;a href="http://erlang.org/"&gt;Erlang&lt;/a&gt; e &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; mas é estaticamente tipada, como o Java.&lt;/p&gt;
Bill Vennners, co-autor do livro &lt;a href="http://www.artima.com/shop/programming_in_scala"&gt;Programming in Scala&lt;/a&gt;, comenta como a programação em Scala alterou seu estilo de programação. Eu li &lt;a href="http://www.artima.com/scalazine/articles/programming_style.html"&gt;seu artigo&lt;/a&gt; e digo: é realmente interessante notar o quanto nosso estilo de programação é alterado em função da aprendizagem de novas linguagens.&lt;p&gt;&lt;/p&gt;

&lt;p&gt;O Scala é estaticamente tipado (ao contrário do Python por exemplo) e, em função de suas características funcionais (dentre outras), oferece uma boa performance para a escrita de programas e uma performance de execução similar a de aplicações Java. E apenas para me lembrar, ainda vou falar este assunto: performance na execução de aplicações x performance na escrita de programas.&lt;/p&gt;

&lt;p&gt;Quando utilizar uma linguagem estática ou dinamicamente tipada é um assunto interessante de ser lido &lt;a href="http://www.artima.com/forums/flat.jsp?forum=106&amp;amp;thread=253855"&gt;nesta thread&lt;/a&gt;, citada por &lt;a href="http://www.scala-lang.org/node/1660"&gt;este post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Outros textos sobre Scala:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;Twitter on Scala&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/news/Scala--combing-the-best-of-Ruby-"&gt;Scala: combining the best of Ruby and Java?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-scala01228.html"&gt;The busy Java developer's guide to Scala: Functional programming for the object oriented&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7754566463058497686?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/G9BvsLPbmHo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7754566463058497686/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/scala.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7754566463058497686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7754566463058497686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/G9BvsLPbmHo/scala.html" title="Scala" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/scala.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMQnk9fCp7ImA9WxJQEE8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-6587191476591314417</id><published>2009-05-07T22:16:00.008-03:00</published><updated>2009-05-22T16:24:43.764-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-22T16:24:43.764-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JRuby" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="FISL" /><category scheme="http://www.blogger.com/atom/ns#" term="Rhino" /><category scheme="http://www.blogger.com/atom/ns#" term="Trails" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="Gant" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Seam" /><category scheme="http://www.blogger.com/atom/ns#" term="Jython" /><category scheme="http://www.blogger.com/atom/ns#" term="Maven" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><category scheme="http://www.blogger.com/atom/ns#" term="Ivy" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Bash" /><category scheme="http://www.blogger.com/atom/ns#" term="Grails" /><title>Java e linguagens dinâmicas</title><content type="html">&lt;p&gt;
Ontem andei conversando com um amigo que tem a opinião que eu tinha em 2004/5: ele acredita que HOJE, Java está tão evoluído que não há necessidade de se utilizar alguma outra linguagem para solucionar qualquer problema na empresa em que estamos trabalhando. Eu fui contra e defendi a minha opinião atual do uso de &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;, &lt;a href="http://www.gnu.org/software/bash"&gt;Bash&lt;/a&gt; ou de qualquer outra linguagem e/ou framework que for necessária para entregar uma boa solução para um problema, rapidamente e com qualidade. Escrevo este post para ele e para todos os outros amigos Javaneses que tenho e que talvez, tenham uma opinião/visão similar. Eu também gostaria muito de ter seu comentário sobre este assunto em &lt;a href="http://blog.paulojeronimo.com/"&gt;meu blog&lt;/a&gt;.

&lt;/p&gt;
&lt;p&gt;
Eu, estive palestrando no FISL em 2006 (&lt;a href="http://dl.getdropbox.com/u/345266/eventos/fisl/2006/palestra-fisl-7.0.pdf"&gt;baixe a apresentação&lt;/a&gt;). Ele ocorreu em Porto Alegre, e eu pude ver o quanto a comunidade open source do Brasil é mista. Naquela época, o Ruby on Rails estava começando a aparecer mundialmente como um framework altamente produtivo para a produção de aplicações Web 2.0. Meu intuito era falar sobre como o Java poderia estar mais próximo do que o Ruby fazia utilizando linguagens dinâmicas como o &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; ou frameworks como o &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;, &lt;a href="http://www.trailsframework.org/"&gt;Trails&lt;/a&gt;, etc e, a conclusão final era que Java, para se tornar melhor, não deveria mais ser vista como a LINGUAGEM Java, mas sim, como a PLATAFORMA Java. Pois bem, isto foi em 2006. Três anos depois, eu ainda defendo esta opinião. Estão aí no mercado produtos como &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;, &lt;a href="http://www.jython.org/Project/"&gt;Jython&lt;/a&gt;, &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;. Excelentes frameworks Java como o &lt;a href="http://www.springsource.com/"&gt;Spring&lt;/a&gt; e o &lt;a href="http://seamframework.org/"&gt;Seam&lt;/a&gt; fazem uso do &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;. A &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt; (dona do &lt;a href="http://www.springsource.com/"&gt;Spring&lt;/a&gt;) foi ainda mais longe e &lt;a href="http://www.springsource.com/g2one"&gt;adquiriu a G2One&lt;/a&gt; (que era a dona do &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;). O lista de usuário do &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; no Brasil cresceu muito de uns tempos para cá. E até mesmo o Ruby on Rails roda no JRuby, se você quiser. Ou seja, Java está realmente consolidando o conceito de PLATAFORMA, e a LINGUAGEM Java é apenas mais uma que roda nela. E eu digo mais: você consegue ser mais efetivo e programar mais, com menos código, se for utilizar linguagens dinâmicas como o Groovy ou o Python. Se você tiver a necessidade de se aproveitar de algum legado Java, utilize a PLATAFORMA Java e tente ser mais "dinâmico" utilizando o Groovy, por exemplo. Se você acha o Seam produtivo e gosta de utilizá-lo, eu lhe digo que você pode ser ainda mais produtivo com o seu uso, se &lt;a href="http://www.google.com.br/search?q=Seam+Groovy"&gt;utilizá-lo junto com o Groovy&lt;/a&gt;.

&lt;/p&gt;
&lt;p&gt;
Em 2006 eu conhecia Groovy e Ruby de leitura e testes caseiros. Não sabia nada de Python e tinha muita experiência em Java, C/C++ e Pascal. Do início do ano passado até hoje, eu posso dizer que me aprofundei muito em Bash e Groovy para solucionar meus problemas, e que Python tem sido a minha diversão neste momento. Utilizei o Bash para a automação da implantação de aplicações em diversas instâncias de JBoss do meu trabalho e, apesar da solução ter ficado legal, hoje eu acredito que se eu eu a tivesse desenvolvido em Python, por exemplo, teria escrito muito menos. Foi por isto que resolvi adotá-lo agora, num &lt;a href="http://blog.paulojeronimo.com/2009/05/python-subversion.html"&gt;novo projeto&lt;/a&gt; que precisará de integração com o Subversion e com diversas aplicações do Linux. Outro processo que estou conduzindo neste momento, é a definição de uma estrutura legal para o build de diversas aplicações Java, hoje construídas com o Ant. Penso que a utilização do Groovy (ou de ferramentas que o utilizem como linguagem, como o &lt;a href="http://gant.codehaus.org/"&gt;Gant&lt;/a&gt; + &lt;a href="http://ant.apache.org/ivy"&gt;Ivy&lt;/a&gt; ou o &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt;) seria uma das melhores alternativas. Outra alternativa, talvez em segundo lugar, seria a adoção do &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Na minha opinião, bons desenvolvedores devem trabalhar com metodologias ágeis e utilizar as linguagens/ferramentas certas para cada ocasião. E as empresas devem incentivar esta característica. É claro que há um custo nisto e que talvez, possa até ser verdade que o gerenciamento seja mais difícil numa situação como esta. Mas, eu conheço algumas empresas no Brasil (algumas com mais de 100 desenvolvedores) que parecem não se preocupar com isto e adotam esta filosofia. Ou seja, elas utilizam as melhores soluções para os problemas, escolhendo a melhor linguagem para resolvê-lo. E, para mim, meu amigo tem sido um pouco controverso quando me diz, de vez em quando, uma frase que ele ouviu de outra pessoa: "Se você só tem um martelo como ferramenta, todos os parafusos são vistos como pregos!".
&lt;/p&gt;
&lt;p&gt;
Atualmente, após me aventurar por linguagens tão dinâmicas quanto o Groovy e o Python, eu fico me perguntando porque ainda utilizo o Java. Eu tenho um outro amigo (&lt;a href="http://www.executivosdacidade.com.br/"&gt;Helder Moreira&lt;/a&gt;), do trabalho também, que diz para mim que ainda é o mainframe que paga o meu salário. Pode até ser, neste momento. E posso dizer também, que ainda vou depender do Java, por muito tempo, assim como meu amigo depende do mainframe. Mas, aprendendo outras linguagems, eu agora tenho um leque maior de alternativas para solucionar meus problemas. Eu sei de todas as características que tornaram Java, o sucesso que ele é, ainda hoje. Ministro cursos de Java e JBoss e de uma porção de frameworks e ferramentas para Java. Possuo algumas certificações da Sun e da Red Hat que, para mim, simplesmente comprovam que eu tinha estudado para uma prova e que talvez tivesse alguma experiência. Atualmente, programo com a LINGUAGEM Java criando extensões para o JBoss no ambiente do meu trabalho. Não tenho dúvida que ele é a melhor ferramenta em casos como este e em diversas outras situações. Mas, o que eu quero dizer com este texto é que Java, como linguagem, pode não ser a única e nem mesmo a melhor opção, em muitos casos.
&lt;/p&gt;
&lt;p&gt;
Vou exemplificar com um programa ridículo e inútil, o que estou escrevendo. Daí então, você terá alguma base para comentar comigo, qualquer programa mais sério. Implementarei um programa, com os requisitos a seguir, em três linguagens diferentes (Java, Python e Groovy):
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Verificar se argumentos foram passados na linha de comando. Se nenhum for passado, a lista de argumentos deverá ser populada com três strings: "Nenhum", "argumento", "foi passado!";
&lt;/li&gt;&lt;li&gt;Imprimir os argumentos;
&lt;/li&gt;&lt;li&gt;Criar uma lista de strings contendo nomes de linguagens nesta ordem: JavaScript, Bash, Java, Python, Groovy
&lt;/li&gt;&lt;li&gt;Imprimir a lista de linguagens de maneira ordenada;
&lt;/li&gt;&lt;li&gt;Utilizar esta lista de linguagens para popular um mapa (chave=linguagem/valor=prioridade) das linguagens utilizadas no próximo projeto, por prioridade. A prioridade terá seu valor (de 0 a 10) obtido aleatoriamente;
&lt;/li&gt;&lt;li&gt;O mapa deverá ser impresso por ordem de prioridade, com a linguagem menos usada sendo impressa primeiro;
&lt;/li&gt;&lt;li&gt;Imprimir as cinco primeiras linhas do código do programa, lendo-as de seu arquivo fonte;

&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;
Antes de implementar este programa bobão, e de você me criticar dizendo que um programa idiota como este não deveria nem ser considerado por ser tão inútil, quero que você entenda que o meu objetivo é apenas comparar a sintaxe das linguagens e a facilidade de codificação para o desenvolvedor. Além disto, muitos programas são tão simples e idiotas como este. Não estou preocupado com qualquer outro tipo de requisito neste momento. Eu, como administrador de servidores de aplicações, sei muito bem que características uma aplicação real deve suportar num ambiente de produção, clusterizado, tolerante a falhas e não estou levando isto em consideração neste momento. Vou discutir isto em outro post.
&lt;/p&gt;
&lt;p&gt;
Vou desconsiderar o cabeçalho dos programas (imports do Java, do Python e do Groovy) e começar em Java, a implementar os requisitos acima descritos, da maneira mais simples possível. No método main de uma classe Teste, o código a seguir implementa os requisitos 1, 2, 3 e 4:
&lt;/p&gt;&lt;pre class="brush: java;"&gt;
if (args.length == 0) args = new String[] { "Nenhum", "argumento", "foi passado!" };
System.out.print("Lista dos argumentos passados: ");
for (String arg : args)
 System.out.print(arg + " ");
List&amp;lt;String&amp;gt; linguagens = new ArrayList&amp;lt;String&amp;gt;();
linguagens.add("JavaScript");
linguagens.add("Bash");
linguagens.add("Java");
linguagens.add("Python");
linguagens.add("Groovy");
System.out.print("\nLista ordenada de linguagens: ");
Collections.sort(linguagens);
for (String linguagem : linguagens)
 System.out.print(linguagem + " ");
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;

O mesmo código poderia ser implementado em Python assim:
&lt;/p&gt;&lt;pre class="brush: python;"&gt;
argv = sys.argv[1:]
if argv == []: argv = ["Nenhum", "argumento", "foi passado!"]
print 'Lista dos argumentos passados:', " ".join(argv)
linguagens = ["JavaScript", "Bash", "Java", "Python", "Groovy"]
print 'Lista ordenada de linguagens:', ' '.join(sorted(linguagens))
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
E, em Groovy, o código seria o seguinte:
&lt;/p&gt;&lt;pre class="brush: groovy;"&gt;
if (args.size() == 0) args = [ "Nenhum", "argumento", "foi passado!" ]
println "Lista dos argumentos passados: ${args.join(" ")}"
def linguagens = ["JavaScript", "Bash", "Java", "Python", "Groovy"]
linguagens.sort()
println "Lista ordenada de linguagens: ${linguagens.join(" ")}"
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Alguns comentários:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Em Java, como dito anteriormente, o código precisa estar dentro do método main de uma classe. Python e Groovy não tem esta limitação.
&lt;/li&gt;&lt;li&gt;Em Python, o módulo sys contém o array argv. A questão é que o primeiro argumento deste array é sempre o nome do programa Python que está sendo executado. A sintaxe &lt;code&gt;argv = sys.argv[1:]&lt;/code&gt; indica que a variável argv receberá uma cópia do array, mas iniciando pela posição 1, ao invés de 0.

&lt;/li&gt;&lt;li&gt;Em Python, uma string tem um método &lt;code&gt;join&lt;/code&gt;. Este método recebe uma lista e faz o contrário do &lt;code&gt;split&lt;/code&gt;, ou seja, ele insere o contéudo da string " " entre os elementos do vetor recebido como parâmetro. Em Java, eu estou imprimindo um espaço a mais após o nome do argumento. O problema disto, é que se no lugar do espaço, fosse uma vírgula, ela iria sobrar após a impressão do último argumento. Se eu não quisesse que isto ocorresse, eu teria que trocar a sintaxe do for e testar se estou no último elemento. Caso estivesse, não concatenaria a string.
&lt;/li&gt;&lt;li&gt;Em Groovy, a sintaxe é semelhante a do Python. Também estou utilizando o método &lt;code&gt;join&lt;/code&gt;. Mas ele não é o método de uma string e sim de uma lista. Ele retorna uma string que terá, entre os elementos da lista de strings, o espaço informado como parâmetro. No Groovy utilizamos uma &lt;a href="http://groovy.codehaus.org/Strings+and+GString"&gt;GString&lt;/a&gt; ao invés de uma String do Java e isto torna as coisas muito mais simples, como você viu.
&lt;/li&gt;&lt;li&gt;Tanto Python quanto Groovy possuem uma sintaxe mais amigável para o trabalho com listas e mapas. Java não. Além disto, listas nestas duas linguagens possuem o método sort e o Python, suporta ainda, o build-in &lt;code&gt;sorted&lt;/code&gt; que estou utilizando. No Java é necessário o uso do método &lt;code&gt;sort&lt;/code&gt; de outra classe (&lt;code&gt;Collections&lt;/code&gt;).

&lt;/li&gt;&lt;li&gt;Sei que a quantidade de linhas não é uma boa métrica para indicar a facilidade de codificação, mas através da comparação desta métrica nas três linguagens, nós ficamos realmente tentados a pensar sobre isto.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
Agora, vamos para a implementação dos requisitos 5 e 6:
&lt;/p&gt;
&lt;p&gt;
Em Java:
&lt;/p&gt;&lt;pre class="brush: java;"&gt;
Map&amp;lt;String, Integer&amp;gt; map = new LinkedHashMap&amp;lt;String, Integer&amp;gt;();
for (String linguagem : linguagens)
 map.put(linguagem, (int) ((Math.random() * 10)));
List&amp;lt;Map.Entry&amp;lt;String, Integer&amp;gt;&amp;gt; list = new Vector&amp;lt;Map.Entry&amp;lt;String, Integer&amp;gt;&amp;gt;(map.entrySet());
Collections.sort(list, new Comparator&amp;lt;Map.Entry&amp;lt;String, Integer&amp;gt;&amp;gt;() {
 public int compare(Map.Entry&amp;lt;String, Integer&amp;gt; entry, Map.Entry&amp;lt;String, Integer&amp;gt; entry1) {
     return (entry.getValue().equals(entry1.getValue()) ? 0 :
         (entry.getValue() &amp;gt; entry1.getValue() ? 1 : -1));
 }
});
map.clear();
for (Map.Entry&amp;lt;String, Integer&amp;gt; entry : list)
 map.put(entry.getKey(), entry.getValue());
System.out.print("\nLinguagens do proximo projeto (ordem por prioridade, de 0 a 10): ");
for (Map.Entry&amp;lt;String, Integer&amp;gt; entrySet : map.entrySet())
 System.out.print(String.format("%s (%d) ", entrySet.getKey(), entrySet.getValue()));

&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Em Python:
&lt;/p&gt;&lt;pre class="brush: python;"&gt;
map = sorted(dict([nome, random.randint(0, 10)] for nome in linguagens).items(), key=lambda x: x[1])
print 'Linguagens do proximo projeto (ordem por prioridade, de 0 a 10):', \
 " ".join(["%s (%s)" % (item[0], item[1]) for item in map])
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Em Groovy:
&lt;/p&gt;&lt;pre class="brush: groovy;"&gt;
def map = [:]
linguagens.each{ map.put(it, new Random().nextInt(10)) }
print 'Linguagens do proximo projeto (ordem por prioridade, de 0 a 10): '
map.sort{ a, b -&amp;gt; a.value &amp;lt;=&amp;gt; b.value }.each{ k, v -&amp;gt; print "$k ($v) " }

&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Meus comentários:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Novamente, se eu fosse pensar em quantidade de linhas, comparando com Python ou Groovy, eu não utilizaria Java. Mas, como disse anteriormente, esta não é uma boa métrica. Vou então passar para a observação da clareza de sintaxe destas linguagens;
&lt;/li&gt;&lt;li&gt;Generics é bom em Java até o momento em que a sintaxe começa a ficar estranha como a utilizada nesta solução. Eu pressuponho que você, leitor deste post, seja um programador Java mas, caso não seja, eu lhe peço: não se assuste! Muitos programadores Java quase chegam a ter um "orgasmo" ao ver um código como este que eu escrevi e acham ele lindo. Não os culpo. Eu também já passei por esta fase. Vou tentar explicar o que está ocorrendo no código Java:
 &lt;ol&gt;
 &lt;li&gt;Crio um mapa cuja chave é uma string (nome da linguagem) e cujo valor é um inteiro (a prioridade);
 &lt;/li&gt;&lt;li&gt;Populo o mapa, utilizando o for estendido do Java, a partir dos elementos da lista e obtendo o valor da prioridade como um número aleatório;
 &lt;/li&gt;&lt;li&gt;Estruturas de dados como mapas podem ter elementos inseridos em ordem, se a implementação do mapa for uma árvore (TreeMap, por exemplo). Entretanto, a ordenação em mapas neste caso é realizada através da chave e não do valor. E eu preciso ordenar em função do valor. Sendo assim, meu próximo passo é criar uma lista onde, cada entrada do mapa, é um elemento. Daí então eu ordeno a lista com o método &lt;code&gt;sort&lt;/code&gt; da classe &lt;code&gt;Collections&lt;/code&gt;. Para realizar esta ordenação, eu utilizo um comparador que vai testar o valor de cada entrada e não a chave.
 &lt;/li&gt;&lt;li&gt;O próximo passo é limpar o conteúdo da lista e populá-la novamente, com os elementos da lista ordenada. Como o mapa foi implementado como uma lista ligada, a ordem de inclusão será preservada ao percorrer a lista com o último for.
 &lt;/li&gt;&lt;/ol&gt;

&lt;/li&gt;&lt;li&gt;A sintaxe do Python é mais interessante e inteligente. Vou explicá-la:
 &lt;ol&gt;
 &lt;li&gt;Montamos uma lista de tuplas "(linguagem, prioridade)" a partir da lista de linguagens utilizando uma característica do python chamada &lt;a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions"&gt;List Comprehensions&lt;/a&gt;
 &lt;/li&gt;&lt;li&gt;O valor (de 0 a 10) da prioridade é obtido randomicamente a partir da função randint
 &lt;/li&gt;&lt;li&gt;O build-in &lt;code&gt;dict&lt;/code&gt; recebe esta lista e a transforma num mapa
 &lt;/li&gt;&lt;li&gt;O build-in &lt;code&gt;sorted&lt;/code&gt; recebe como parâmetros o mapa e um outro parâmetro. Este parâmetro é uma função anônima (lambda) que informa qual o campo (dentro dos elementos da lista) que será utilizado como chave para comparação. Neste caso, o segundo campo (prioridade);
 &lt;/li&gt;&lt;li&gt;Os elementos do mapa são impressos, novamente utilizando a sintaxe de "List Comprehensions";
 &lt;/li&gt;&lt;/ol&gt;

&lt;/li&gt;&lt;li&gt;A sintaxe do Groovy é tão interessante quanto a do Python:
 &lt;ol&gt;
 &lt;li&gt;Como em Groovy, listas e mapas estão entre &lt;code&gt;[]&lt;/code&gt;, um mapa, para ser inicializado vazio deve receber &lt;code&gt;[:]&lt;/code&gt;;
 &lt;/li&gt;&lt;li&gt;Groovy, assim como Ruby, utiliza clousures, que lembram as funções anônimas do Java em termos de funcionalidade. Na linha &lt;code&gt;linguagens.each{ algumacoisa }&lt;/code&gt; o código &lt;code&gt;algumacoisa&lt;/code&gt; será executado para cada elemento da lista. Em nosso código, o mapa será populado com cada elemento (&lt;code&gt;it&lt;/code&gt;) da lista e um valor randômico para a prioridade;
 &lt;/li&gt;&lt;li&gt;Os elementos do mapa são ordenados através da clousure passada para sort. &lt;code&gt;a&lt;/code&gt; e &lt;code&gt;b&lt;/code&gt; são parâmetros passados pelo sort para a clousure. Indicamos então que a comparação destes elementos deve ser realizada pelo atributo value. O operador &lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt; equivale a escrevermos &lt;code&gt;a.value.compareTo(b.value)&lt;/code&gt;. Como não precisamos especificar um return, o valor desta expressão será retornado para a função sort. Cada clousure retorna o próprio objeto. Sendo assim, o método each pode então ser chamado e recebendo outra clousure que imprime cada um dos elementos do mapa (k=key, v=value).
 &lt;/li&gt;&lt;/ol&gt;

&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
E, por fim, a implementação do último requisito (7):
&lt;/p&gt;
&lt;p&gt;
Em Java:
&lt;/p&gt;&lt;pre class="brush: java;"&gt;
String fn = "Teste.java";
System.out.printf("\nPrimeiras cinco linhas de %s:\n", fn);
BufferedReader br = new BufferedReader(new FileReader(fn));
try {
 int i = 0;
 String line;
 while ((line = br.readLine()) != null &amp;amp;&amp;amp; i++ &amp;lt; 5)
     System.out.println(i + ": " + line);
} finally {
 br.close();
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Em Python:

&lt;/p&gt;&lt;pre class="brush: python;"&gt;
fn = 'Teste.py'
with open(fn, 'r') as f:
 print 'Primeiras cinco linhas de %s:' % fn
 i = 0
 for line in f:
     i += 1
     if i &amp;gt; 5: break
     print "%s: %s" % (i, line[:-1])
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
E em Groovy:
&lt;/p&gt;&lt;pre class="brush: groovy;"&gt;
def fn = 'Teste.groovy'
println "\nPrimeiras cinco linhas de ${fn}:"
File f = new File(fn)
f.withReader{ reader -&amp;gt;
 i = 0
 for (line in reader.iterator()) {
     println "${++i}: $line"
     if (i == 5) break
 }
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
Novamente, meus comentários:

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python utiliza um iterator implicitamente na navegação das linhas do arquivo. Mas, no meu entendimento, um programador Java faz um bom trabalho com o uso método &lt;code&gt;readLine&lt;/code&gt; de &lt;code&gt;BufferedReader&lt;/code&gt;.
&lt;/li&gt;&lt;li&gt;Tanto em Java, quanto em Python, o uso do bloco finally é utilizado para garantir o fechamento de um arquivo, caso ocorra alguma exceção durante o processamento do arquivo aberto. Mas, do Python 2.5 em diante, é possível utilizar a palavra chave &lt;code&gt;with&lt;/code&gt;, que simplifica a escrita da linguagem e, garante o fechamento do arquivo, automaticamente, na saída do bloco ou na ocorrência de uma exceção.
&lt;/li&gt;&lt;li&gt;O versão Groovy do programa, passa uma clousure para o método &lt;code&gt;withReader&lt;/code&gt; que, após a execução da clousure, fecha o arquivo, automaticamente.
&lt;/li&gt;&lt;li&gt;Sendo assim, tanto o Python, quanto o Groovy, tem recursos de linguagem que auxiliam o programador a não se esquecer de liberar recursos, coisa que não ocorre no Java de maneira tão natural.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
Baixe o código completo da versão &lt;a href="http://dl.getdropbox.com/u/345266/artigos/java-e-linguagens-dinamicas/Teste.java"&gt;Java&lt;/a&gt;, &lt;a href="http://dl.getdropbox.com/u/345266/artigos/java-e-linguagens-dinamicas/Teste.py"&gt;Python&lt;/a&gt; e &lt;a href="http://dl.getdropbox.com/u/345266/artigos/java-e-linguagens-dinamicas/Teste.groovy"&gt;Groovy&lt;/a&gt; deste programa.
&lt;/p&gt;
&lt;p&gt;
Concluo este post, deixando a seguinte mensagem: Vá além do Java! Se você deseja ou precisa utilizar a plataforma Java, explore linguagens alternativas para ela, como o &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, o &lt;a href="http://www.jython.org/Project/"&gt;Jython&lt;/a&gt;, o &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; ou o &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;. Você só tem a ganhar com isto.

&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-6587191476591314417?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/zp0gUbTTC7w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/6587191476591314417/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html#comment-form" title="10 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/6587191476591314417?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/6587191476591314417?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/zp0gUbTTC7w/java-e-linguagens-dinamicas.html" title="Java e linguagens dinâmicas" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/java-e-linguagens-dinamicas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFR388eip7ImA9WxJSFUk.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7067772033950801574</id><published>2009-05-05T13:39:00.007-03:00</published><updated>2009-05-05T14:15:16.172-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T14:15:16.172-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Bazaar" /><category scheme="http://www.blogger.com/atom/ns#" term="Subversion" /><category scheme="http://www.blogger.com/atom/ns#" term="pysvn" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Mercurial" /><category scheme="http://www.blogger.com/atom/ns#" term="Bash" /><title>Python + Subversion</title><content type="html">&lt;p&gt;Estou envolvido no trabalho de criação de alguns scripts que, além de atualizar um repositório do &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;, também precisam realizar algumas atividades extras. Hoje estive em uma reunião falando que se eu estivesse desenvolvendo tais scripts utilizando o &lt;a href="http://pt.wikipedia.org/wiki/Bash"&gt;Bash&lt;/a&gt;, estaria codificando muito mais (em termos de linhas de código) do que estou agora. Eu me amarro em Bash mas, para este trabalho, &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; é a melhor opção. Ele possui integração com o Subversion através do &lt;a href="http://pysvn.tigris.org/"&gt;projeto pysvn&lt;/a&gt;. Para ter uma boa idéia de suas funcionalidades, leia o &lt;a href="http://pysvn.tigris.org/docs/pysvn_prog_guide.html"&gt;pysvn Programmer's Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Só pra constar: sei que, em termos de integração com o Python, o Mercurial (ou o Bazaar) seriam ótimas alternativas em relação ao Subversion pois estes dois DVCS foram escritos em Python! A integração com o Python pode ser apenas um motivo para a adoção do Mercurial (por exemplo). Mas, eu também posso citar &lt;a href="http://blog.paulojeronimo.com/2009/04/implante-um-dvsc.html"&gt;diversos outros motivos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Algumas referências extras para trabalho de integração do Python ao Subversion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jtauber.com/python_subversion_binding/"&gt;Python Subversion Binding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pronus.eng.br/blog/http:/pronus.eng.br/blog/script-simples-de-backup-do-servidor-trac-e-subversion"&gt;Script Simples de Backup do Servidor Track e Subversion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7067772033950801574?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/ZYEn17spebM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7067772033950801574/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/python-subversion.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7067772033950801574?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7067772033950801574?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/ZYEn17spebM/python-subversion.html" title="Python + Subversion" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/python-subversion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMFRH45eyp7ImA9WxJQFk8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-6288715863418976288</id><published>2009-05-02T21:56:00.019-03:00</published><updated>2009-05-29T15:06:55.023-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T15:06:55.023-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AppFuse" /><category scheme="http://www.blogger.com/atom/ns#" term="Ant" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Eventos" /><category scheme="http://www.blogger.com/atom/ns#" term="JustJava" /><category scheme="http://www.blogger.com/atom/ns#" term="Maven" /><category scheme="http://www.blogger.com/atom/ns#" term="Groovy" /><category scheme="http://www.blogger.com/atom/ns#" term="EJB3" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Gant" /><category scheme="http://www.blogger.com/atom/ns#" term="Gradle" /><title>Trabalho submetido ao JustJava 2009</title><content type="html">&lt;p&gt;Dia 30 de abril (quinta-feira) foi o último dia de submissão de trabalhos para a &lt;a href="http://www.sucesusp.org.br/eventos2009/justjava/"&gt;oitava edição do JustJava&lt;/a&gt;, que está prevista para ocorrer entre os dias 15 e 17 de setembro deste ano.&lt;/p&gt;

&lt;p&gt;Eu submeti a apresentação do trabalho: &lt;span style="font-weight: bold;"&gt;"Construindo e implantando aplicações Java com o Groovy"&lt;/span&gt;. Recebi ontem um email confirmando que o trabalho está sendo avaliado pela comissão organizadora do evento.&lt;/p&gt;

&lt;p&gt;Neste trabalho, pretendo falar sobre como o &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; pode auxiliar na construção de aplicações Java, desde o processo de build, até a implantação remota de pacotes em servidores. Ou seja, esta palestra, caso seja aprovada, irá falar sobre automação: um importante e complexo assunto quando existem várias aplicações e ambientes para implantá-las. Ultimamente, eu tenho trabalhado muito neste assunto e falo sobre isto &lt;a href="http://dl.getdropbox.com/u/345266/artigos/builds/index.html"&gt;nestes artigos&lt;/a&gt;. O resumo da palestra é o seguinte:

"Esta apresentação explora as soluções e problemas relativos a construção de aplicações Java através do uso do Ant (+Ivy) e do Maven e mostra ferramentas alternativas que utilizam o Groovy. Por se tratar de uma linguagem dinâmica, simples e totalmente OO, o build de aplicações Java com o uso do Groovy pode reduzir e simplificar drasticamente scripts Ant que fazem este trabalho. A substituição de código do Ant por Gant por exemplo, traz mais clareza e poder na criação dos builds. Além disto, ferramentas como o Gradle, seguem princípios consolidados no Maven como convenção ao invés de configuração, aproveitando-se ainda, de todo o poder e flexibilidade oferecidos por ferramentas como o Ant. Utilizando ferramentas Groovy, esta palestra tem, como objetivo principal, lhe trazer conhecimento para a automação de processos como a construção e a implantação de aplicações Java em ambientes complexos."&lt;/p&gt;

&lt;p&gt;Já participei do JustJava duas vezes, como palestrante:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Em 2004 minha palestra teve o título "&lt;a href="http://dl.getdropbox.com/u/345266/eventos/justjava/2004/ImplementandoJavaComQualidade.zip"&gt;Implementando Java com Qualidade&lt;/a&gt;". Falei sobre o &lt;a href="https://appfuse.dev.java.net/"&gt;AppFuse&lt;/a&gt; e sobre diversas ferramentas utilizadas por ele, naquela época.&lt;/li&gt;
&lt;li&gt;Em 2005, falei sobre EJB3 no JBoss. Naquela tempo, EJB3 estava começando a ser suportado por versões do JBoss e eu &lt;a href="http://dl.getdropbox.com/u/345266/eventos/justjava/2005/tutorial-ejb3/documentos/tutorial-ejb3-jboss4.pdf"&gt;apresentei&lt;/a&gt; vários tópicos deste &lt;a href="http://docs.jboss.org/ejb3/app-server/tutorial/"&gt;EJB 3.0 Tutorial&lt;/a&gt;. Em 24 de Junho de 2005, alguns dias após o evento, eu criei &lt;a href="http://dl.getdropbox.com/u/345266/eventos/justjava/2005/tutorial-ejb3/videos/index.html"&gt;estes vídeos&lt;/a&gt; e os publiquei para a comunidade Java. Se você tiver interesse, ainda pode baixar os &lt;a href="http://dl.getdropbox.com/u/345266/eventos/justjava/2005/tutorial-ejb3/arquivos-de-configuracao.zip"&gt;arquivos de configuração&lt;/a&gt; que utilizei nos vídeos, e os &lt;a href="http://dl.getdropbox.com/u/345266/eventos/justjava/2005/tutorial-ejb3/exemplos.zip"&gt;exemplos&lt;/a&gt;. &lt;u&gt;Informo que este material está antigo e talvez precise de adaptações se você for testá-lo com ferramentas em versões diferentes das apresentadas.&lt;/u&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se minha palestra for aprovada, ficarei contente em poder dividir com vocês, pessoalmente, o conhecimento que estou obtendo sobre este assunto.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-6288715863418976288?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/tyHM8Af9CGE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/6288715863418976288/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/trabalho-submetido-ao-justjava-2009.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/6288715863418976288?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/6288715863418976288?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/tyHM8Af9CGE/trabalho-submetido-ao-justjava-2009.html" title="Trabalho submetido ao JustJava 2009" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/trabalho-submetido-ao-justjava-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAFQHY8eip7ImA9WxJSE0w.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-7889347903672129022</id><published>2009-05-02T21:02:00.009-03:00</published><updated>2009-05-02T23:11:51.872-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-02T23:11:51.872-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="Bash" /><title>Pequenos ajustes em meu blog</title><content type="html">&lt;p&gt;Fiz alguns pequenos ajustes em &lt;a href="http://blog.paulojeronimo.com/"&gt;meu blog&lt;/a&gt; (gerenciado com o &lt;a href="http://www.blogger.com/"&gt;Blogger&lt;/a&gt;) hoje:
&lt;ol&gt;
&lt;li&gt;Estou usando um template ainda mais simples (o "Simple II" de Jason Hunter). Agora só utilizo uma coluna: &lt;span style="font-weight: bold; font-style: italic;"&gt;É O SUFICIENTE!&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fiz um segundo cabeçalho pro blog (através da adição de um gadget HTML/JavaScript), contendo links para coisas do meu blog e serviços que utilizo, que são as seções: &lt;span style="font-weight: bold;"&gt;"Eu!"&lt;/span&gt; (&lt;a href="http://www.blogger.com/profile/11112842956903586636"&gt;Meu Profile&lt;/a&gt;); &lt;span style="font-weight: bold;"&gt;"Compartilho Contigo:"&lt;/span&gt; ("&lt;a href="http://www.google.com/reader/shared/user/00512636081325437123/state/com.google/broadcast"&gt;Shared Items&lt;/a&gt;" que compartilho através do meu leitor de feeds: o &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt;); &lt;span style="font-weight: bold;"&gt;"Coisas que escrevi:"&lt;/span&gt; (&lt;a href="http://dl.getdropbox.com/u/345266/artigos/index.html"&gt;Artigos&lt;/a&gt;, &lt;a href="http://dl.getdropbox.com/u/345266/wikis/gnu-linux/index.html"&gt;PJ's GNU/Linux short hints&lt;/a&gt;, &lt;a href="http://twitter.com/paulojeronimo"&gt;Eu no Twitter&lt;/a&gt; e quaisquer outros textos que publicar); &lt;span style="font-weight: bold;"&gt;"Diversos"&lt;/span&gt; (&lt;a href="http://delicious.com/paulojeronimo"&gt;Meus Links&lt;/a&gt;, &lt;a href="http://blog.paulojeronimo.net/"&gt;Minha vida fora do trabalho&lt;/a&gt;, &lt;a href="http://picasaweb.google.com/paulojeronimo"&gt;Fotos&lt;/a&gt;, etc.) e o fundamental &lt;a href="http://feeds2.feedburner.com/paulojeronimo"&gt;&lt;span style="font-weight: bold;"&gt;"Assine!"&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;Porque estou escrevendo isto se está visível no meu blog? Se você está se perguntando isto, é porque você está lendo o texto diretamente a partir do meu blog não é? Mas, eu tenho alguns leitores que, como eu, lêem blogs a partir de ferramentas como Google Reader. Ou seja, eles não se importam com qualquer mudança no visual do meu blog, mas sim com o conteúdo dele. Sendo assim, este post é apenas para informar a estes leitores, esta mudança (que com certeza, não fará diferença alguma na vida deles... Dahhhh! ;-)&lt;/p&gt;

&lt;p&gt;As atividades que descrevi aqui, fazem do &lt;a href="http://blog.paulojeronimo.com/2009/04/recuperando-meu-site.html"&gt;processo de recuperação do meu site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Só para aproveitar este post com uma única informação útil ;-): &lt;a href="http://www.shell-fu.org/lister.php?id=767"&gt;Twitar via shell&lt;/a&gt; é muito simples e, como o &lt;a href="http://www.gnu.org/software/bash/"&gt;Bash&lt;/a&gt; é o principal "IDE" de muita gente (inclusive eu), achei legal &lt;a href="http://www.google.com/reader/shared/user/00512636081325437123/state/com.google/broadcast"&gt;compartilhar esta dica&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-7889347903672129022?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/5XKVT4ye278" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/7889347903672129022/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/05/pequenos-ajustes-em-meu-blog.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7889347903672129022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/7889347903672129022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/5XKVT4ye278/pequenos-ajustes-em-meu-blog.html" title="Pequenos ajustes em meu blog" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/05/pequenos-ajustes-em-meu-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYCRX8ycCp7ImA9WxJSFUk.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-2916707810263960433</id><published>2009-04-30T14:23:00.025-03:00</published><updated>2009-05-05T14:56:04.198-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T14:56:04.198-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SourceForge" /><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="DVCS" /><category scheme="http://www.blogger.com/atom/ns#" term="CVS" /><category scheme="http://www.blogger.com/atom/ns#" term="Bazaar" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="Mercurial" /><title>Implante um DVCS!</title><content type="html">&lt;p&gt;Enquanto vejo grandes projetos e empresas adotarem o uso de um DVCS &lt;span style="font-style: italic;"&gt;(d&lt;/span&gt;&lt;i&gt;istributed version control system&lt;/i&gt;) como &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; ou &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt;, e muitos estarem até mesmo substituindo o &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; gradualmente, fico intrigado sobre o motivo pelo qual várias empresas ainda estão querendo passar por um atrasado processo de migração do &lt;a href="http://www.cvshome.org/"&gt;CVS&lt;/a&gt; para o Subversion&lt;a href="http://subversion.tigris.org/"&gt;&lt;/a&gt;. Ignorância? Medo? Este post é para elas.&lt;/p&gt;Com certeza o Subversion é uma boa opção de VCS. Mas a adoção de um DVCS traz alguns benefícios:
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Todo munto tem seu próprio repositório.&lt;/strong&gt; Você pode fazer mudanças e roll backs em sua máquina. Acabam-se os checkins gigantes e todo o histório de mudanças está disponível em seu repositório. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Trabalho offline.&lt;/strong&gt; Você precisa estar online somente para compartilhar mudanças. Desta forma, você pode estar com sua máquina em qualquer local e fazer seus checkings e undos, sem se preocupar se um servidor está parado ou se você está num avião.
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rapidez.&lt;/strong&gt; Diffs, commits e reversões são feitos localmente. Como não há necessidade de rede, tudo é mais rápido.
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Mudanças bem gerenciadas.&lt;/strong&gt; As mudanças em DVCSs são construídas pelo compartilhamento de mudanças. Cada mudança tem um identificador (guid) que é fácil de ser rastreada.
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Branching e merging mais fáceis.&lt;/strong&gt; Pelo fato de cada desenvolvedor "ter seu próprio branch", cada mudança é como uma integração ao reverso. Mas guids tornam fácil combinar automaticamente o código e evitar duplicações.
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Menos gerenciamento.&lt;/strong&gt; Distributed &lt;span class="caps"&gt;VCS&lt;/span&gt; são simples de serem instalados, não há o conceito de cliente servidor, mas sim o de local/remoto. Mesmo assim, nada impede que você crie este conceito (mas a instalação do software é da mesma forma). Também, como não há servidor, não há o requisito de que você crie novos usuários nele.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;Hoje eu andei fazendo testes com o &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt;, após ler a mensagem de que o &lt;a href="http://google-code-updates.blogspot.com/2009/04/mercurial-support-for-project-hosting.html"&gt;Google Code também passou a suportá-lo&lt;/a&gt;. Achei ele simples e também mais fácil do que o &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, que também já venho utilizando em algums projetos pessoais.
&lt;p&gt;Como venho estudando o Python e acompanhando de perto a sua comunidade, também li a notícia de que o Mercurial será utilizado por seus desenvolvedores. Luciano Ramalho do grupo Python Brasil &lt;a href="http://blog.ramgarlic.com/2009/04/python-vai-migrar-para-mercurial-uebaaa.html"&gt;comenta a respeito&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://code.google.com/p/support/wiki/DVCSAnalysis"&gt;Leia a comparação que o Google fez do Git com o Mercurial&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://br-linux.org/2009/sourceforge-anuncia-suporte-a-git-bazaar-e-mercurial/"&gt;O SourceForge também já suporta, além do CVS e do Subversion, o Git, o Bazaar e o Mercurial&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Para saber mais sobre DVCS, Git e Mercurial e conhecer a opinião de alguns desenvolvedores no mercado, recomendo as seguintes leituras:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/"&gt;Intro do Distributed Version Control (Illustrated)&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.thiagoarrais.com.br/2008/07/23/por-um-controle-de-versao-menos-insano/"&gt;Por um controle de versão menos insano&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.thiagoarrais.com.br/2008/09/15/4-respostas-sobre-controle-de-versao-distribuido/"&gt;4 respostas sobre controle de versão distribuído&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git"&gt;Pragmatic Version Control using Git&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://gitready.com/"&gt;Git Ready&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hgbook.red-bean.com/"&gt;Mercurial: The Definitive Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/ProjectsUsingMercurial"&gt;Some projects that use Mercurial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.itexto.net/devkico/?p=119"&gt;Mercurial aposenta o Subversion (pelo menos pra mim)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-09-2007/jw-09-versioncontrol.html"&gt;Subversion or CVS, Bazaar or Mercurial?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-2916707810263960433?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/t7625Mf5eo4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/2916707810263960433/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/04/implante-um-dvsc.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/2916707810263960433?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/2916707810263960433?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/t7625Mf5eo4/implante-um-dvsc.html" title="Implante um DVCS!" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/04/implante-um-dvsc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMHSHgzfyp7ImA9WxJQFk8.&quot;"><id>tag:blogger.com,1999:blog-8781967406482036453.post-1897230915904369411</id><published>2009-04-28T17:45:00.013-03:00</published><updated>2009-05-29T15:07:19.687-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T15:07:19.687-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Django" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>O @ do Phyton parece com o do Java, mas não é!</title><content type="html">&lt;p&gt;
Como desenvolvedor experiente em Java (e usando &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;anotações&lt;/a&gt; a vários anos) mas iniciante em &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, eu andei um pouco intrigado com a sintaxe &lt;code&gt;@algumacoisa&lt;/code&gt; encontrada em alguns códigos de aplicações &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;. Estudei Python pelo &lt;a href="http://docs.python.org/tutorial/"&gt;Python Tutorial&lt;/a&gt; e pelo livro &lt;a href="http://diveintopython.org/"&gt;Dive in Python&lt;/a&gt; mas, em momento algum, notei esta sintaxe. Então, procurando saber mais a respeito, descobri que ela foi &lt;a href="http://www.python.org/doc/2.4.4/whatsnew/node6.html"&gt;inserida no Python 2.4&lt;/a&gt;. O &lt;u&gt;Dive in Python&lt;/u&gt; foi escrito com o Python 2.3 e está desculpado... Mas, o &lt;u&gt;Python Tutorial&lt;/u&gt; que li, foi para a versão 2.6 do Python. Eu realmente não me lembro de ter visto uma explicação para esta característica da linguagem neste tutorial. De qualquer forma, além da explicação do &lt;a href="http://www.python.org/doc/2.4.4/whatsnew/node6.html"&gt;What's New in Python 2.4&lt;/a&gt;, também gostei das explicações de David Mertz em seu artigo &lt;a href="http://www.ibm.com/developerworks/linux/library/l-cpdecor.html"&gt;Charming Python: Decorators make magic easy&lt;/a&gt; e de Phillip Eby &lt;a href="http://www.ddj.com/web-development/184406073"&gt;no DDJ&lt;/a&gt;. Para se aprofundar, e entender porque eu estou curtindo a bessa o Python, leia estes artigos. Mesmo assim, vou dar uma explicação básica sobre o &lt;code&gt;@algumacoisa&lt;/code&gt;:
&lt;/p&gt;
&lt;p&gt;
A explicação para esta sintaxe no Python é a seguinte...
&lt;/p&gt;
&lt;p&gt;
Antes do Python 2.2, não existiam métodos estáticos. Isto significa, que não era possível criar uma classe como a definida no código abaixo e executar "metodo", sem criar uma instância, como fazemos em Java. Ou seja, o código &lt;code&gt;Classe.metodo("argumento")&lt;/code&gt; daria erro pois não existia o conceito de método estático.
&lt;/p&gt;
&lt;pre class="brush: py;"&gt;
class Classe:
  def metodo(arg):
    print 'arg =', arg
&lt;/pre&gt;
&lt;p&gt;
Entretanto, o código acima está sintaticamente correto e pode ser executado através da construção &lt;code&gt;Classe().metodo()&lt;/code&gt;, mesmo no Python 2.2. A questão é que ele não vai estar fazendo o que gostaríamos, pois nosso intuito era poder passar um parâmetro para o método. Bem... O Python, como eu disse, segue uma FORTE convenção de que o primeiro parâmetro se chame "self". Mas isto é apenas uma convenção! Então, o que ele interpreta na execução do código acima? Ele simplesmente aceita que você está querendo imprimir o próprio objeto (através de print), mas não aceita você passar um parâmetro para a função como numa chamada a &lt;code&gt;Classe().metodo("teste")&lt;/code&gt;. Ele vai dizer que o método está esperando apenas 1 argumento e 2 foram passados (self e "teste", para clarear sua mente...).
&lt;/p&gt;
&lt;p&gt;
Com a introdução das funções build-in &lt;a href="http://docs.python.org/library/functions.html#classmethod"&gt;classmethod&lt;/a&gt; e &lt;a href="http://docs.python.org/library/functions.html#staticmethod"&gt;staticmethod&lt;/a&gt; no Python 2.2, foi possível a modificação do código para o apresentado abaixo e, consequentemente, a execução do código a seguir:
&lt;/p&gt;
&lt;pre class="brush: py;"&gt;
class Classe:
  def metodo(arg):
    print 'arg =', arg

  metodo = staticmethod(metodo)

Classe.metodo("teste1")
Classe().metodo("teste2")
&lt;/pre&gt;
&lt;p&gt;
Ou seja, surgiram os nossos conhecidos métodos estáticos! O código semelhante em Java seria:
&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
class Classe {
  static void metodo(String arg) {
    System.out.println("arg = " + arg);
  }

  public static void main(String[] args) {
    Classe.metodo("teste1");
    (new Classe()).metodo("teste2");
  }
}
&lt;/pre&gt;
&lt;p&gt;
Quando surgiu, no Python 2.4, o conceito de &lt;a href="http://www.python.org/dev/peps/pep-0318/"&gt;decorators&lt;/a&gt;, passamos a simplificar a linguagem da classe acima, reescrevendo-a da seguinte forma:
&lt;/p&gt;
&lt;pre class="brush: py;"&gt;
class Classe:
  @staticmethod
  def metodo(arg):
    print 'arg =', arg

  Classe.metodo("teste1")
  Classe().metodo("teste2")
&lt;/pre&gt;
&lt;p&gt;
Entendeu o que é um decorator em sua essência? Não? Então vamos a mais um exemplo que talvez esclareça mais algumas coisas...
&lt;/p&gt;
&lt;p&gt;
O que o buildin staticmethod faz é pegar um método, e modificar seu comportamento... Isto é parecido com o código abaixo:
&lt;/p&gt;
&lt;pre class="brush: py;"&gt;
def olamundo(metodo):
  def mundo(self):
    return " ".join([metodo(self), 'mundo!'])
  return mundo

class OlaMundo:
  def ola(self):
    return 'Ola'
  ola = olamundo(ola)

print OlaMundo().ola()
&lt;/pre&gt;
&lt;p&gt;
A função &lt;code&gt;olamundo&lt;/code&gt; recebe um método como parâmetro. Internamente, ela cria um outro método (&lt;code&gt;mundo&lt;/code&gt;) que retorna uma string concatenando o resultado da execução do método passado com a string "mundo!". Em seguida, ela retorna esta nova versão do método.
&lt;/p&gt;
&lt;p&gt;
Poderíamos reescrever o código acima, da seguinte forma:
&lt;/p&gt;
&lt;pre class="brush: py;"&gt;
def olamundo(metodo):
  def mundo(self):
    return " ".join([metodo(self), 'mundo!'])
  return mundo

class OlaMundo:
  @olamundo
  def ola(self):
    return 'Ola'

print OlaMundo().ola()
&lt;/pre&gt;
&lt;p&gt;
Isto são os decorators do Python... Num outro post, eu falo mais sobre anotações em Java!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8781967406482036453-1897230915904369411?l=blog.paulojeronimo.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/paulojeronimo/~4/J_OtLweVpOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.paulojeronimo.com/feeds/1897230915904369411/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://blog.paulojeronimo.com/2009/04/o-do-phyton-parece-com-o-do-java-mas.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1897230915904369411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8781967406482036453/posts/default/1897230915904369411?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/paulojeronimo/~3/J_OtLweVpOI/o-do-phyton-parece-com-o-do-java-mas.html" title="O @ do Phyton parece com o do Java, mas não é!" /><author><name>PJ</name><uri>http://www.blogger.com/profile/11112842956903586636</uri><email>pj@paulojeronimo.com</email><gd:extendedProperty name="OpenSocialUserId" value="09053250173684273893" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.paulojeronimo.com/2009/04/o-do-phyton-parece-com-o-do-java-mas.html</feedburner:origLink></entry></feed>
