sábado, 24 de outubro de 2009

Servidores de Aplicação Java EE Livres

Hoje eu participei do evento Plataforma Java x Plataforma .Net (edição DF 2009) ministrando uma palestra no Tema 1. O tema de minha palestra foi o mesmo da ministrada no 6º FGSL. Eu escrevi este artigo como base para minha apresentação.

segunda-feira, 21 de setembro de 2009

Dev In Rio 2009: eu fui!

O último evento em que estive presente foi o Dev In Rio, 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 vários posts entitulados "Dev In Rio 2009: Eu vou!".

Então, vou começar pela conclusão: Guilherme Chapiewski e Henrique Bastos 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 (assim como eu) já não acreditam mais que a linguagem Java seja a bala de prata para todos os problemas, mas sim, que a plataforma Java está cada vez mais forte com relação a característica de termos, hoje, mais de duzentas linguagens que podem rodar numa JVM, dentre as quais, as linguagens mais discutidas neste evento: PHP, Groovy, Python e Ruby. Na minha opinião, 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 Rails, sobre o Django, sobre métodos ágeis e no painel, última atividade "oficial" do evento, iniciado por Vinícius Manhães Teles e participado por diversos outros palestrantes e convidados numa "mesa redonda, sem mesa".

Sobre os palestrantes e as palestras em que estive presente, comento a seguir:

  • Gilherme Silveira e Niko Steppat, instrutores da Caelum. Eles falavam, quando cheguei ao evento, 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 (desde que atuava no mercado com o Helder da Rocha, da Argo Navis). 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 "maguina vudual".
  • Fábio Akita, "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 apesar de falar como uma metralhadora. O Rails, com toda a certeza, amplia as características do Ruby, através dos exemplos explicados e demonstrados pelo meta-apresentador do Akita (ele próprio, num vídeo) falando sobre meta-programação. Também foi muito divertida a metáfora "Cowboy x Profissional". A apresentação do Akita foi disponibilizada. Uma das coisas que me lembro sobre o Akita falar é como ele aproveita seu tempo, e que todo programador deveria ser burro (julgar-se assim) e buscar conhecimento constantemente. Eu, tenho lido sobre como gerir melhor o meu tempo e também procuro aproveitar meus minutos em deslocamentos (metrô, ônibus, vôos, ...) lendo, ouvindo e vendo coisas que possam me tornar melhor no que faço. Além disto, estou em constante busca por aperfeiçoamento até mesmo fora do trabalho. As palavras do Akita neste sentido devem ser bem lembradas e, por isto, eu as cito aqui.
  • Jacob Kaplan-Moss, um dos líderes do desenvolvimento do Django, fez uma boa introdução 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 Obameter e dele ter sido desenvolvido em Django. Cheguei até mesmo a comentar, ao final da apresentação e no twitter, 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 GC de que já existem alguns softwares nesta linha. Gostaria de ter um comentário neste post sobre aonde estão tais softwares!
  • Jeff Patton 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.

No intervalo entre a palestra do Jacob e do Jeff, eu conheci o Lucas Bastos. 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 gosto por corridas. 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: Cláudio Miranda que irá correr na minha equipe (eucorro.net), no Super 40 em Brasília, no próximo domingo (27/Nov). Vinícios Teles fez uma entrevista com o Luca Bastos. Assista!

Também tive o prazer de apertar a mão do Maurício Samy Silva (Maujor) 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!

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! Neste post do GC, há links para fotos e vídeos do evento.

Agora não falo mais do Dev In Rio mas de outros eventos:

  • 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 Consegi.
  • Estarei em Goiânia, dia 03/Out no 6º FGSL, e em Brasília (dia 24/Out), no Plataforma Java x Plataforma .Net. Em ambos os eventos tratarei do mesmo assunto: Servidores de Aplicações Java, Livres.

quinta-feira, 17 de setembro de 2009

Como eu uso o Twitter, parte 2

Quero complementar meu post anterior que, como este, também é básico e "para pessoas comuns" falando sobre o Twitter. 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.

Em primeiro lugar, quero destacar uma ferramenta que conheci, por acaso, durante minha participação no evento Dev In Rio. 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 TweetDeck, num Ubuntu, a mesma distro Linux que eu utilizava em meu note, naquele momento.

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 tweets marcados com esta tag. Ferramentas com o TwitterGadget e o TwitterFox, 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 bit.ly e a sua conta neste serviço (mas também se integra a outros serviços como o TinyURL, 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 TwittPic, TweetPhoto ou yfrog ele também abre um pop-up com a foto, etc. Enfim, o TweetDeck é realmente uma ferramenta para twitteiros profissionais, ou amadores, que buscam facilidades na experiência com o Twitter ;-).

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 Twitter destined to replace Google Search.

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 The art of ReTweeting in Twitter 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!

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.

Por fim, tenho somente uma última recomendação A REPETIR, pois já a fiz em meu primeiro post: SEJAM RELEVANTES! Unam isto a CORDIALIDADE, sejam EMPATICOS e AUTENTICOS. Leiam "O Fator Gente Boa", de Tim Sanders, 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.

quinta-feira, 10 de setembro de 2009

Como eu uso o Twitter

Este é um post básico sobre o Twitter 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 o que eu venho escrevendo no Twitter, 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.

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 avatar 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.

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.

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.

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.

Eu procuro usar tags (Ex.: #maratonadecuritiba) 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 feed 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 meu blog para corredores utilizando a tag #eucorronet.

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 "RT @yaraachoa 74 dias para a Maratona de Curitiba! Preparação física e psicológica. #eucorronet" informa que eu estou repassando uma frase da Yara Achôa, 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 meu twitter.

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.

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 malditos spammers 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 ;-).

Eu também utilizo algumas das muitas ferramentas que integram o twitter a diversas outras coisas. Neste blog, utilizo o TwitThis para que você possa twittar que está lendo ou que leu este post. Também utilizo o bit.ly para encurtar uma URL grande e para ter uma noção de quantos cliques eu tive nesta URL. Uso o TwitterFox (como plugin para o Firefox) e o TwitterGadget (que integro a minha página do iGoogle). O TweetFeed 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 Tweetray.

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 posts que compartilho através do Google Reader onde, em vários deles, o assunto é o Twitter.

quarta-feira, 9 de setembro de 2009

quinta-feira, 3 de setembro de 2009

Seam Caching - Parte I

Uma aplicação Seam suporta o uso de cache em várias camadas. Neste primeiro artigo da série Seam Caching, 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.

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 $JBOSS_HOME/server/all/deploy/ejb3-entity-cache-service.xml que contem uma série de configurações explicadas detalhadamente na documentação do JBoss Cache.

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.

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.

Continue a leitura...

quarta-feira, 2 de setembro de 2009

Redimencionamento de disco virtual no VirtualBox

Eu precisei de mais espaço na máquina virtual (VM) que utilizo para rodar o Ubuntu no desktop Windows de um de meus contratantes, através do VirtualBox (entenda porque eu o utilizo nestes casos). Ela tinha 4.5 GB de disco e eu queria expandí-la para 6 GB. Apesar da existência do comando VBoxManage clonehd, 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:

  1. Criei o novo disco e chamei-o de temp.vdi. Inclui este disco como "Primário Slave", na VM que eu queria configurar:

  2. Baixei um ISO do GParted LiveCD que é pequeno e que me atenderia bem nas nas tarefas de redimensionamento de HD que eu precisaria, rodando os comandos fdisk e dd e gparted. Eu também poderia utilizar outros LiveCDs alternativos como o SystemRescueCD 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 fdisk -l para determinar as partições. Copiei a partição existente para a nova através do comando dd if=/dev/hda of=/dev/hdb, levando em consideração a informação obtida como resultado comando fdisk -l. Fui fazer algo mais importante pois este processo iria demorar bastante;

  3. Após a finalização do dd, desliguei a VM. Antes de religá-la, tornei o disco temp.vdi "Primário Master", removendo o disco anterior da configuração. Religuei a VM novamente dando boot, novamente, pelo LiveCD. Acionei o gparted para redimensionar a partição existente ao tamanho máximo do novo disco:

  4. 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 resize2fs /dev/sda1 para completar esta tarefa:

  5. Pronto... Agora estava com espaço que precisava!

Referências:

terça-feira, 1 de setembro de 2009

Sobre a certificação JBCAA

A Red Hat anunciou hoje (primeiro dia do JBoss World) a certificação JBoss Certified Application Administrator (JBCAA). Ela poderá ser obtida globalmente, segundo o anúncio, a partir do dia 1 de outubro.

Sob o meu ponto de vista, se o conteúdo exigido na prova for o apresentando no treinamento JB336, 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 jBPM, o JBoss Rules e o SOA-P. Além disto, deverá cobrir assuntos relacionados ao slimming do JBoss EAP, 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 JON, 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: JBoss Enterprise Portal Platform (EPP), JBoss Service Oriented Architecture Platform (SOA-P) e JBoss Enterprise Service Bus (ESB).

O anúncio informa que é recomendável que a pessoa tenha feito o treinamento JB336 para se preparar para a prova. Para mim, não está claro ainda, se isto é mesmo apenas recomendável 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 LPI 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.

Mesmo já possuindo duas certificações em JBoss (Certified JBoss Administrator e Certified JBoss Developer), 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 lobby 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.

terça-feira, 25 de agosto de 2009

Assinatura de feeds por assunto, no blogger

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 blogger, 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 http://blog.paulojeronimo.com/feeds/posts/default/-/Livros. Então, mais um exemplo para fixar: tudo o que eu escrevo sobre Python pode ser lido pelo Google Reader (por exemplo) através do acesso a URL http://blog.paulojeronimo.com/feeds/posts/default/-/Python para obtenção do feed.

Livros

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: Danilo Bardusco e Guilherme Chapiewski, da Globo.com. 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 Livros. Eu atualizei os meus posts anteriores, quando eles citaram algum livro que li, incluindo este rótulo.

domingo, 23 de agosto de 2009

O Fator Gente Boa

Hoje comprei e começei a ler o O Fator Gente Boa, a tradução do The Likeability Factor de Tim Sanders e que me chamou a atenção pelo título.

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.

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 Helder Moreira 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 é minha sogra. 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.

Mas voltando ao livro...

É 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 Booth Research 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.

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 a antipatia troca um benefício imediato por um problema futuro. 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.

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 Big Bi. 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.

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.

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.

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.

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.

Alguns textos que encontrei sobre Tim Sanders e/ou seus livros aqui no Brasil:

E só uma dica para quem se interessou por este livro: eu o comprei por R$ 9,90 numa promoção do Extra da Tijuca. Livrarias que anunciam este livro o vendem por R$ 19,90.

quinta-feira, 13 de agosto de 2009

Porque migrar do JDK 5 para o 6?

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.

O documento JDK 6 Adoption Guide (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.

O Java SE 6 Performance White Paper 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.

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 neste post de Mandy Chung. Dentre as ferramentas citadas neste documento, estão o jconsole, o jhat, o jmap, o jstack e o jinfo. 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 Atach API 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 OutOfMemoryError é 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 -XX:+HeapDumpOnOutOfMemoryError 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 -XX:OnOutOfMemoryError=<comando> foi adicionada para que você possa especificar um comando a ser executado quando um OutOfMemoryError ocorrer. Para quem está executando aplicações Java num Solaris, também é possível agora, utilizar o DTrace 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 Java SE 6 Monitoring and Management Enhancements. Dois guias para um aprofundamento na resolução de problemas no Java SE 6 são o Troubleshooting Guide for Java SE 6 with HotSpot VM e o Troubleshooting Guide for Java SE 6 Desktop Technologies citados na página Troubleshooting Java SE. 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.

O VisualVM (<jdk>/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. Este vídeo apresenta algumas de suas características.

Em resumo, o JDK 6 é realmente superior ao 5 no que diz respeito aos aspectos performance, gerenciamento, monitoração e diagnóstico de problemas. Testes atuais também já começaram a indicar que o JDK 7 (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.

sexta-feira, 7 de agosto de 2009

Como tornar o Windows do seu trabalho melhor?

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 cygwin! :-)

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, leia este artigo sobre virtualização caso deseje ter um melhor embasamento sobre este assunto.

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.

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 VMware 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 VirtualBox, que é o produto que tenho instalado nos desktops de contratantes, quando necessito de virtualização em Hosts Windows.

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.

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.

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.

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.

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.

terça-feira, 28 de julho de 2009

De férias!

Até o dia 4 de agosto (meu aniversário) estou de férias de meu trabalho na Andima.

Segue abaixo, algumas de minhas atividades neste momento.

Assistindo a era do gelo 3, em 3D:



Passeando e correndo em Caldas Novas... Indo à festa de aniversário do Tio Oliveira (80 anos) em Cumari:



Depois escrevo mais... Agora vou voltar pras minhas férias :-D

terça-feira, 7 de julho de 2009

Mojarra: agora sem erros no GAE

Na semana que vem eu irei comentar alguns tópicos de JavaServer Faces (JSF) 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 Google App Engine (GAE).

E como ontem saiu uma atualização do Mojarra (a implementação de referência do JSF) visando, dentre outras coisas, facilitar a implantação de aplicações JSF no GAE, achei que esta informação valeria este post pois esta versão corrige, dentre outros bugs, este.

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, GWT, Scala, Seam, Groovy e Grails. E realmente o Grails é tão bom que até alguns que odeiam o Spring Framework por sua concorrência com produtos JBoss hoje se rendem indiretamente aos seus encantos. Me diga: Grails é ou não impressionante? E mais: é da Spring Source, que estará em São Paulo ministrando um treinamento de 11 a 14 de agosto.

domingo, 5 de julho de 2009

Minha norinha sapateando na novela

Puxa... Eu não esperava ter uma norinha tão cedo!



Ainda mais artista de novela! Veja ela sapateando no fim deste capítulo da novela Caras & Bocas:

segunda-feira, 22 de junho de 2009

Quer rodar Django num servidor de aplicações Java?

O GlassFish 3 acomoda a execução de Python, Ruby e Groovy de maneira automática. Eu venho escrevendo sobre linguagens dinâmicas para Java 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 Dynamic Languages Powered by GlassFish v3 Application Server.

Se você também se interessa em rodar o Ruby on Rails num JBoss AS, uma alternativa também pode ser o projeto TorqueBox.

O blog eucorro.net

Eu iniciei o blog eucorro.net para deixar este mais focado em outros assuntos que não sejam corridas, assim como fiz também para o blog relativo a coisas do meu trabalho. Sendo assim, neste blog você não irá mais ler tanto a respeito de corridas, que fazem parte da minha vida fora do trabalho (non-work life) mas que começam a tomar uma importância maior para mim sobre outros aspectos. Já no blog eucorro.net, o assunto será completamente voltado para corridas e coisas relacionadas a elas.

O eucorro.net é um projeto pessoal que eu pretendo evoluir para algo maior. A idéia é que ele se torne uma rede social que irá integrar diversos corredores, treinadores, equipes e organizadores de corridas através de algumas ferramentas. Mas por enquanto ele é apenas um blog que eu irei utilizar para falar sobre minhas corridas (e idéias) e que aceitará a participação de novos autores que também corram e que queiram compartilhar com os leitores suas informações relativas a corridas.

Você corre ou está começando? Gostaria de escrever a respeito? Ainda não possui um blog para escrever mas quer utilizar o eucorro.net para isto? Terei imenso em convidá-lo a fazer parte deste projeto. Deixe seu comentário neste post que eu entrarei em contato!

Se você já escreve sobre corridas em um blog, saiba que eu irei disponibilizar em breve o planeta.eucorro.net agregando um monte de sites de corredores que já fazem isto. E o seu vai estar nele! Mas se isto não ocorrer ou se você não quiser esperar por isto, contacte-me!

quarta-feira, 17 de junho de 2009

Continuo correndo... Não parei não!

Hoje eu fiz o meu melhor tempo nos 8Km, do forte do Leme até o de Copacabana, ida/volta. Meus filhos me acompanharam de bicicleta durante todo o percurso, das 07:56 às 08:42. Ou seja, o tempo total para os 8Km, desta vez, foi de 46 minutos. O mais importante de tudo nesta corrida, foi o meu bem estar físico durante a mesma. Eu corri 46min sem me estressar na respiração e no batimento cardiáco que variou muito pouco durante todo a corrida.

Eu deixei de registrar algumas corridas passadas (estava utilizando meu twitter para isto) que foram as seguintes:

Nesta semana (14 a 20) (totalizando 32Km até agora):
17/Jun (Qua) - 8Km, Forte do Leme (FL) ao Forte de Copacabana (FC) (ida/volta), 46min
15/Jun (Seg) - 8Km, FL-FC (ida/volta), 48min
14/Jun (Dom) - 16Km, FL ao Mirante do Leblon (ida/volta), 2h

Na semana anterior (7 a 13) (20Km):
12/Jun (Sex) - 8Km, FL-FC (ida/volta), 52min
11/Jun (Qui) - 8Km, FL-FC (ida/volta), 51min
08/Jun (Seg) - 4Km, FL + 2Km (ida/volta), 25min

E as que estão abaixo, registradas no meu Twitter (após as 10 Milhas Mizuno e incluindo esta, totalizando 32Km no período de 31 de Maio a 6 de junho):
04/Jun (Qua) - 4Km, FL-FC (ida/volta), 48min
03/Jun (Qua) - 4Km, FL + 2Km (ida/volta), 25min
01/Jun (Seg) - 8Km, FL-FC (ida/volta), 52min

terça-feira, 16 de junho de 2009

Vim porque quero...

  • Rapidez
  • Simplicidade
  • Facilidade
  • Inteligência
  • Eficiência & Eficácia

Sim... O Vim oferece tudo isto e muito mais, quando se trata de edição de textos...

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 Chuck Norris, vão dizer que Vim é só para ele ou para Ninjas. 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!

Só estou escrevendo este post hoje porque estava vindo para o meu trabalho lendo o EXCELENTE LIVRO NACIONAL, GRATUITO E QUE VOCÊ TAMBÉM PODE COLABORAR NA ESCRITA desenvolvido por Sérgio Luiz, Eustáquio Rangel e mais diversas pessoas que, como eu, gostam de tudo o que o Vim proporciona na edição de textos.

Além deste livro, sugiro que você também busque mais informações nos links que disponibilizo sobre o Vim.

Eu também estou escrevendo um livro! E agora pergunto: você advinharia qual é o meu editor de textos neste trabalho???

:x

domingo, 31 de maio de 2009

10 Milhas Mizuno - 2009 - Etapa Rio de Janeiro

Hoje eu participei da corrida título deste post. Foi muito bom! Quando sai daqui do Leme para pegar o ônibus até o Flamengo, local da corrida, conheci o Pedro, outro corredor daqui que também estava indo participar. Conversamos bastante até chegarmos ao local da corrida. Chegando lá, encontrei o Adolfo, colega de trabalho do BC. Largamos e corremos juntos as três primeiras milhas. Em seguida, o Adolfo disparou e foi embora! Amanhã eu pergunto como ele terminou a corrida...

Eu fiz os dez primeiros kilômetros junto com o Pedro. O tempo para mim, que estou acima do peso, foi pra lá de bom neste trecho: 1 hora e 1 minuto. Mas em seguida, meu rendimento caiu e só fui terminar a prova (10 milhas ou 16,09Km) em 1 hora e 48 minutos. O Pedro sentiu a perna e chegou um pouquinho depois de mim. Mas é isto aí... agora é continuar os treinos!

sábado, 30 de maio de 2009

E o bronzeado na areia, pelo esporte na orla

Hoje eu fechei a semana com 40Kms de corridas concluídos, no período da manhã. Amanhã vou participar da corrida Mizuno 10 Milhas 2009. Por acaso, já próximo a minha chegada no Leme, a Globo estava fazendo uma reportagem, que foi mostrada na primeira edição do RJTV. Eu apareci correndo no momento em que a repórter cita a frase do título deste post! Veja no vídeo abaixo e/ou clique neste link para ler a reportagem completa:



sexta-feira, 29 de maio de 2009

Hackeando o JBoss AS

O JBoss AS é 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 hardening do JBoss no meu ambiente de trabalho.

Nos diversos cursos de JBoss que ministrei, 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 ESTE ARTIGO, 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.

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!

quarta-feira, 27 de maio de 2009

Hoje é Dia do Desafio! Eu me desafiei... E você?

Eu fui correr hoje, como de costume, antes de ir para o trabalho. Ao chegar ao forte do Leme, o Exército estava fazendo alongamento na praia, com uma faixa na frente de seu pessoal, dizendo: Dia do Desafio!

Eu não entendi o que isto significava. Mas sei que fiquei, como sempre, extremamente motivado, ao ler esta frase. Minha intenção ao sair de casa, era correr os 8Km (ida/volta) entre o forte do Leme e de Copacabana em 50 minutos. Mas, após ler a faixa, me senti desafiado a fazer mais com menos, ou seja, correr os 8Km em menos tempo. Começei a corrida às 07:46 e terminei às 08:33. Sendo assim, meu tempo melhorou em 3 minutos em relação a corrida de ontem. 8KM EM QUARENTA E SETE MINUTOS!!!!

Quando passei dos 7Km, corri alguns metros junto com um militar (do Exército também) que me explicou que este era um dia diferente. E eu, disse a ele o quanto havia me sentido motivado durante a corrida, em função de ter visto aquela faixa.

O Dia do Desafio foi criado no Canadá e vem sendo difundido mundialmente pela TAFISA - Trim & Fitness International Sport for All Association, entidade alemã de promoção do esporte para todos. Com um conceito simples, o evento incentiva cidades dos cinco continentes a promover a prática da atividade física diária, ressaltando a importância do esporte e do lazer para a manutenção da saúde.

Realizado anualmente, sempre na última quarta-feira do mês de maio, o Dia do Desafio propõe que as pessoas interrompam suas atividades rotineiras e pratiquem, qualquer tipo de atividade física.



Durante a corrida, eu não pude deixar de pensar no que a palavra desafio significa para mim, no momento atual de minha vida. E este post, é para que eu possa sempre me lembrar dos desafios que estou me propondo.

Eu estou estendendo o conceito do Dia do Desafio (leia mais sobre ele aqui, aqui e aqui, ou procure mais no Google) e me desafiando a:
  • Perder 5Kg, chegando aos 77Kg, até o dia 28 de junho, quando irei participar da meia maratona do Rio;
  • Cumprir minhas metas no SELIC durante este semestre e a dar o melhor de mim durante o próximo semestre;
  • Terminar de ler os seguintes livros:
  • Namorar muito no dia 12 de junho;
  • Dar um excelente treinamento em Brasília, no período de 13 a 16 de julho;
  • Descansar, passear com minha família e brincar muito com meus filhos, durante minhas férias em julho, no período de 17 de julho a 4 de agosto;
  • Codificar de vez o projeto eucorro.net e lançar a primeira versão no final de agosto;
  • Finalizar a escrita do meu livro até o dia 30 de novembro;
  • Participar novamente da Corrida de São Silvestre este ano e baixar muito o meu tempo em relação a minha última vez nesta prova, em 31/12/2006;
Vou conseguir concluir estes desafios!!!
E você? Quais são os seus?

segunda-feira, 25 de maio de 2009

Geek Gang Signs

48Km de corridas na última semana

Aumentei um dia a mais de corrida em relação a semana anterior! O único dia em que não corri na semana passada (de domingo até sábado) foi a sexta-feira pela manhã, quando me exercitei de outra forma, para relaxar ;-). Foram 8Kms diários, ida/volta entre os fortes do Leme e de Copacabana, levando em média o tempo de 52 minutos. No sábado, corri um pouco mais rápido, em 50 minutos.

Minha semana de corridas, desta vez, começou hoje. O tempo entretanto, no mesmo percurso habitual, foi de 49 minutos.

Deverei participar da Meia Maratona do Rio, dia 28 de junho. Mas, se eu for, irei na "pipoca" já que as inscrições online com preços razoáveis para simples mortais como eu, se esgotaram. Ainda restam inscrições para a categoria Elite VIP, com o preço iniciando em R$ 240,00. Fora de cogitação para mim! Quem sabe, com muuiiiito treinamento, eu algum dia me anime a participar desta categoria e pagar este preço...

sexta-feira, 15 de maio de 2009

Scala

Eu não falei de Scala em meu último post, que foi enriquecido com alguns comentários nas listas xprio e agildf, um na lista DFJUG e nenhum no RioJUG (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 plataforma Java. E, apenas para não ser injusto com outras linguagens, você pode ver uma lista de linguagens suportadas pela plataforma java, neste link.

Scala é uma linguagem que integra características de linguagens funcionais como o Python, Erlang e Haskell mas é estaticamente tipada, como o Java.

Bill Vennners, co-autor do livro Programming in Scala, comenta como a programação em Scala alterou seu estilo de programação. Eu li seu artigo e digo: é realmente interessante notar o quanto nosso estilo de programação é alterado em função da aprendizagem de novas linguagens.

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.

Quando utilizar uma linguagem estática ou dinamicamente tipada é um assunto interessante de ser lido nesta thread, citada por este post.

Outros textos sobre Scala:

40Km de corridas nesta semana

Sim... Corri de segunda a sexta, 8Km diários, totalizando 40Km. Amanhã é dia de descanso e domingo de recomeço. Em breve você poderá me acompanhar, ver meus tempos de corrida e percursos no projeto que comanda meus pensamentos enquanto corro. Aguarde! Darei notícias ;-)

quinta-feira, 7 de maio de 2009

Java e linguagens dinâmicas

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 Python, Groovy, Ruby, Bash 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 meu blog.

Eu, estive palestrando no FISL em 2006 (baixe a apresentação). 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 Groovy, JRuby ou frameworks como o Grails, Trails, 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 Groovy, Rhino, Jython, JRuby. Excelentes frameworks Java como o Spring e o Seam fazem uso do Groovy. A SpringSource (dona do Spring) foi ainda mais longe e adquiriu a G2One (que era a dona do Groovy). O lista de usuário do Grails 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 utilizá-lo junto com o Groovy.

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 novo projeto 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 Gant + Ivy ou o Gradle) seria uma das melhores alternativas. Outra alternativa, talvez em segundo lugar, seria a adoção do Maven.

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!".

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 (Helder Moreira), 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.

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):

  1. 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!";
  2. Imprimir os argumentos;
  3. Criar uma lista de strings contendo nomes de linguagens nesta ordem: JavaScript, Bash, Java, Python, Groovy
  4. Imprimir a lista de linguagens de maneira ordenada;
  5. 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;
  6. O mapa deverá ser impresso por ordem de prioridade, com a linguagem menos usada sendo impressa primeiro;
  7. Imprimir as cinco primeiras linhas do código do programa, lendo-as de seu arquivo fonte;

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.

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:

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<String> linguagens = new ArrayList<String>();
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 + " ");

O mesmo código poderia ser implementado em Python assim:

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))

E, em Groovy, o código seria o seguinte:

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(" ")}"

Alguns comentários:

  • 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.
  • 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 argv = sys.argv[1:] indica que a variável argv receberá uma cópia do array, mas iniciando pela posição 1, ao invés de 0.
  • Em Python, uma string tem um método join. Este método recebe uma lista e faz o contrário do split, 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.
  • Em Groovy, a sintaxe é semelhante a do Python. Também estou utilizando o método join. 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 GString ao invés de uma String do Java e isto torna as coisas muito mais simples, como você viu.
  • 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 sorted que estou utilizando. No Java é necessário o uso do método sort de outra classe (Collections).
  • 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.

Agora, vamos para a implementação dos requisitos 5 e 6:

Em Java:

Map<String, Integer> map = new LinkedHashMap<String, Integer>();
for (String linguagem : linguagens)
 map.put(linguagem, (int) ((Math.random() * 10)));
List<Map.Entry<String, Integer>> list = new Vector<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
 public int compare(Map.Entry<String, Integer> entry, Map.Entry<String, Integer> entry1) {
     return (entry.getValue().equals(entry1.getValue()) ? 0 :
         (entry.getValue() > entry1.getValue() ? 1 : -1));
 }
});
map.clear();
for (Map.Entry<String, Integer> 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<String, Integer> entrySet : map.entrySet())
 System.out.print(String.format("%s (%d) ", entrySet.getKey(), entrySet.getValue()));

Em Python:

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])

Em Groovy:

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 -> a.value <=> b.value }.each{ k, v -> print "$k ($v) " }

Meus comentários:

  • 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;
  • 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:
    1. Crio um mapa cuja chave é uma string (nome da linguagem) e cujo valor é um inteiro (a prioridade);
    2. 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;
    3. 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 sort da classe Collections. Para realizar esta ordenação, eu utilizo um comparador que vai testar o valor de cada entrada e não a chave.
    4. 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.
  • A sintaxe do Python é mais interessante e inteligente. Vou explicá-la:
    1. Montamos uma lista de tuplas "(linguagem, prioridade)" a partir da lista de linguagens utilizando uma característica do python chamada List Comprehensions
    2. O valor (de 0 a 10) da prioridade é obtido randomicamente a partir da função randint
    3. O build-in dict recebe esta lista e a transforma num mapa
    4. O build-in sorted 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);
    5. Os elementos do mapa são impressos, novamente utilizando a sintaxe de "List Comprehensions";
  • A sintaxe do Groovy é tão interessante quanto a do Python:
    1. Como em Groovy, listas e mapas estão entre [], um mapa, para ser inicializado vazio deve receber [:];
    2. Groovy, assim como Ruby, utiliza clousures, que lembram as funções anônimas do Java em termos de funcionalidade. Na linha linguagens.each{ algumacoisa } o código algumacoisa será executado para cada elemento da lista. Em nosso código, o mapa será populado com cada elemento (it) da lista e um valor randômico para a prioridade;
    3. Os elementos do mapa são ordenados através da clousure passada para sort. a e b 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 <=> equivale a escrevermos a.value.compareTo(b.value). 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).

E, por fim, a implementação do último requisito (7):

Em Java:

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 && i++ < 5)
     System.out.println(i + ": " + line);
} finally {
 br.close();
}

Em Python:

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 > 5: break
     print "%s: %s" % (i, line[:-1])

E em Groovy:

def fn = 'Teste.groovy'
println "\nPrimeiras cinco linhas de ${fn}:"
File f = new File(fn)
f.withReader{ reader ->
 i = 0
 for (line in reader.iterator()) {
     println "${++i}: $line"
     if (i == 5) break
 }
}

Novamente, meus comentários:

  • 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 readLine de BufferedReader.
  • 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 with, 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.
  • O versão Groovy do programa, passa uma clousure para o método withReader que, após a execução da clousure, fecha o arquivo, automaticamente.
  • 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.

Baixe o código completo da versão Java, Python e Groovy deste programa.

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 Groovy, o Jython, o JRuby ou o Rhino. Você só tem a ganhar com isto.