A origem de todo o mal

Um dos recursos mais simples e práticos do uso de computadores pessoais é o Recortar/Copiar-e-Colar (em inglês, Cut, copy and paste). O conceito foi inventado no Centro de Pesquisas Xerox de Palo Alto (PARC) — celeiro de outras invenções fundamentais da computação moderna, como o mouse — em 1974 por Lawrence Tesler, originalmente para edição de textos.

A funcionalidade é tão essencial e unânime que, junto com o recurso de Desfazer (Undo), as teclas associadas às ações (combinadas a uma tecla de comando como Control) foram adotadas igualmente por todos os sistemas operacionais — começando por Apple no Macintosh/MacOS e Microsoft no DOS/Windows — em seqüência no teclado: Z (desfazer), X (recortar), C (copiar), V (colar).

Com o conceito definido como Área de Transferência (Clipboard), área temporária na memória do computador para onde um conteúdo pode ser recortado (movido) ou copiado, e de lá colado em outra posição ou documento, a ação de recortar/copiar-e-colar torna fácil o processo criativo e produtivo não só de texto, mas dos mais diversos tipos de conteúdo e informação manipulados em computadores.

A operação de recortar-e-colar é uma forma prática de se mover conteúdo de um local para outro.

Já o simples copiar-e-colar dá vazão a algo muito maior: a natureza expansiva da informação, onde o conteúdo criado uma vez deve ser usado, repassado, e reaproveitado, dando alto sentido e valor à informação original. Não é à toa que muitas vezes já escutei a paródia do Princípio de Lavoisier aplicado à tecnologia: “Na informática nada se perde, nada se cria, tudo se copia”.

Copiar conteúdo facilmente é muito útil. Mas o excesso de facilidade rapidamente traz também riscos. Por exemplo, quando o conteúdo em questão é um material com direito autoral, copiar-e-colar sem o devido crédito e autorização pode significar plágio ou outra violação de direitos.

Igualmente grave é o fato de que copiar-e-colar é perfeito para a cópia de conteúdo igual, mas ocorre que muitas vezes se precisa de um conteúdo similar, mas não idêntico. Aí, depois do copiar-e-colar é preciso modificar ou adaptar o que for necessário. E se não for tudo alterado adequadamente, surgem enganos, erros e inconsistências. Quem não sabe citar exemplos de algum conteúdo errado cuja causa foi um copiar-e-colar onde se esqueceu de mudar o que não se aplicava ao conteúdo destino?

Quando analisamos o copiar-e-colar na programação, aí a coisa fica mais séria. Quase sempre o copiar-e-colar de código-fonte é indício de que alguma boa prática de desenvolvimento/programação está sendo negligenciada.

Martin Fowler fala, sabiamente, o óbvio do bom senso em seu livro “Refatoração – Aperfeiçoando o projeto de código existente” (Bookman, 2004, ISBN 85-363-0395-6):

A Regra de Três

Aqui está uma diretriz que Don Roberts me deu: na primeira vez em que faz algo, você apenas faz. Na segunda vez em que faz algo parecido, você estremece diante da duplicação, mas a faz de qualquer forma. Na terceira vez em que faz algo parecido, você refatora.

De fato, se você for copiar um trecho de código, deveria antes de tudo se perguntar: Não seria o caso de encapsular este trecho de código em um método/função e promover o correto reuso? E se você for copiar e modificar um pouco, não seria o caso de fazer uma sobrecarga de método — nas linguagens de programação orientadas a objeto — ou parametrização, tratando a situação que varia?

Da inobservância a esses riscos na prática do copiar-e-colar surgem erros de conteúdo mal reaproveitado e bugs de código mal adaptado. É por isso que costumo brincar que, principalmente no desenvolvimento de software, copiar e colar é “a origem de todo mal”.

Ajax em Java – coletânea de referências

[Atualizado em 16 de agosto e 20 de dezembro de 2007, 27 de abril de 2008.]

Em meu artigo Novo impulso ao JavaScript, estive comentando como a onda de alta interatividade da Web 2.0 e o mecanismo AJAX estão impulsionando a evolução de componentes dinâmicos na web.

AJAX, acrônimo para Asynchronous Javascript And XML (JavaScript Assíncrono e XML), é a técnica de uso combinado de tecnologias existentes — JavaScript, XML e o objeto XMLHttpRequest — que visa propiciar mais dinamismo a páginas web, de forma a melhorar a experiência da interação do usuário. Assim, não chega a ser uma nova tecnologia em si, mas uma ampliação das técnicas de HTML Dinâmico (DHTML) no cliente web, agora interagindo também com o lado servidor.

O princípio de AJAX é, a partir de uma página web no navegador, submeter assincronamente pequenas requisições adicionais ao servidor web, e utilizar seu resultado em manipulações dinâmicas na página atual, sem a necessidade do usuário navegar para uma página inteiramente nova.

A organização OpenAjax Alliance, que reúne mais de 80 dos principais fornecedores e projetos de software livre relacionados a tecnologias para web, é dedicada a promover a adoção de AJAX de forma aberta e interoperável.

No campo estrito do HTML dinâmico com JavaScript, aplicável a páginas web independente da tecnologia no servidor, há excelentes frameworks — livres e gratuitos — de componentes web com suporte a AJAX:

Destaque também para as bibliotecas de apoio jQuery (dica do leitor Renato Silva; veja também docs, blog, refcard, tutorial, jQuery Brasil, exemplos) e Scriptaculous (veja Wiki com documentação e demos). Veja também Other Frameworks (mootools, Prototype, jQuery, YUI Library, MochiKit, Tibco General Interface, Scriptaculous, Dojo Toolkit, Base2, ExtJS), por Qooxdoo.

Falar de AJAX em aplicações web dinâmicas implica rapidamente em avaliar quais ferramentas no lado servidor se adequam melhor e mais facilmente ao tratamento de páginas e componentes dinâmicos. Este já foi tema de artigo meu em novembro de 2006, AJAX cresce rápido em Java.

Partindo dos componentes do Dojo Toolkit e outros, já existem plataformas e frameworks abertos e flexíveis para o suporte a AJAX em Java. As seguintes referências de destaque são software livre:

Diversos frameworks web MVC oferecem suporte a componentes Ajax. Em Java, uma das primeiras iniciativas de porte neste sentido foi o do Google Web Toolkit (GWT), poderoso, prático e livre, que já nasceu com foco em Ajax. Frameworks como Wicket — veja Interview: How Wicket Does Ajax, Javalobby, 2008-04-25 –, Struts 2 (WebWork) e NextApp Echo2, entre outros, incorporaram suporte a Ajax ao longo de suas evoluções. Para Tapestry, existe a biblioteca Tacos de componentes Ajax.

Contudo, creio que o uso dos componentes dinâmicos AJAX está atingindo o seu auge quando aplicado ao padrão JavaServer Faces (JSF), que tem como fundamento exatamente a programação web em Java orientada a componentes e eventos. Estão surgindo componentes JSF cada vez mais ricos e com melhor suporte a AJAX. Cito as principais bibliotecas/frameworks JSF livres que conheço, com suporte a AJAX:

Uma tabela comparativa de várias bibliotecas pode ser encontrada em AJAX JSF Comparison Matrix.

Veja também as indicações em Uma centena de sugestões para programação Ajax e Javascript, por Cid Andrade, 2008-04-16.

Para saber mais (em inglês):

Atualizações Jakarta

Turbine, framework para desenvolvimento de aplicações web surgido dentro do Projeto Apache Jakarta, tornou-se ontem projeto de primeiro nível (Top Level Project – TLP) da Fundação Apache, atingindo assim o estágio de projeto autônomo por seu grau de relevância e maturação. Com isso, o endereço do Projeto Apache Turbine passa a ser turbine.apache.org.

Atualmente no release estável 3.2.2, Turbine é um framework baseado em servlet para desenvolvedores Java experientes construirem rapidamente aplicações web. Inclui funcionalidades como sistema de gerenciamento de segurança de acesso, um serviço de agendamento, servidor de validação definido por XML, e serviço XML-RPC para web services. É uma boa escolha para aplicações que usam arquitetura orientada a serviços (SOA). O Turbine suporta tanto JavaServer Pages (JSP) e JSTL quanto o mecanismo de templates Velocity como tecnologia de apresentação web.


Dia 6 foi lançada a versão 1.3 do sistema de cache distribuído em Java Jakarta JCS – Java Cache System. É o primeiro release oficial do JCS dentro do Projeto Jakarta. Fonte e binários estão disponíveis na página de download do JCS.


Em 18 de maio havia sido disponibilizada o Jakarta POI 3.0, TLP Apache que também já foi projeto dentro do Jakarta. POI é uma API Java para acesso e manipulação de arquivos em formatos Microsoft: Microsoft OLE 2 Compound Document, Word, Excel e, neste novo release, suporte inicial a PowerPoint. POI 3.0 traz também muitas correções de bugs e novos recursoscomo avaliação de fórmulas Excel. Detalhes da atualização estão no Change Log. Obtenha o POI em um dos mirrors de download.


Retornando a abril, dois componentes do utilíssimo projeto Jakarta Commons haviam sido atualizados:

Commons Configuration 1.4 (8 de abril) — componente para fácil manipulação de configurações/preferências de aplicações suportando diversos formatos de arquivo. A versão 1.4 corrige vários bugs e adiciona novidades como suporte a arquivos Windows INI e nova estratégia de recarga acionável por JMX, entre outros. Para mais detalhes, veja Change Log e Release Notes da versão. Download do Commons Configuration.

Jakarta Commons DBCP 1.2.2 (3 de abril) — excelente e super estável serviço de pool de conexão a bancos de dados, baseado no Commons Pool. É utilizado na implementação de datasources JNDI do Apache Tomcat e por muitos outros produtos. A versão 1.2.2 corrige muitos bugs, passa a utilizar o Pool 1.3 e elimina a dependência do Commons Collections (classes LRUMap e SequencedHashMap do Collections 2.1 usadas foram embutidas no DBCP). Veja mais no Release Notes. Download do Commons DBCP.

Eclipse cada vez mais amigável – EPP e Europa

Lendo ontem a postagem Eclipse – Cada vez mais User Friendly no weblog de Rodrigo Urubatan, vi que, além das iniciativas que citei para o Eclipse em meu artigo Melhores IDEs Java gratuitos, estão chegando outras importantes novidades para melhorar a facilidade de instalação e uso do IDE Eclipse: Projeto de Empacotamento do Eclipse (EPP) e Esforço de Lançamento Simultâneo Europa 2007.

O novo projeto Eclipse Packaging Project (EPP) foi criado em fevereiro de 2007, por iniciativa principal da empresa Innoopract — criadora da distribuição independente Yoxos — e com contribuições da Instantiations e da Xored Software. A primeira proposição do projeto é uma nova página de downloads para o Eclipse (protótipo em avaliação) já oferecendo pacotes prontos para diversos perfis iniciais de uso. Visa também desenvolver um instalador para o Eclipse e ferramentas para criação de pacotes a partir de um site de atualização, algo provavelmente inspirado no inovativo Yoxos On Demand.

O Europa Simultaneous Release é o novo esforço de lançamento simultâneo dos principais projetos da Fundação Eclipse para 2007, centrados na versão 3.3 da Plataforma Eclipse, assim como o Callisto foi o esforço de lançamento simultâneo de 10 projetos com o Eclipse 3.2 em 2006. Desta vez, o audacioso esforço Europa planeja englobar 20 sub-projetos, incluindo o Eclipse 3.3 base (Equinox, Platform, JDT, PDE), WTP 2.0, Mylar 2.0, TPTP 4.4, BIRT 2.2, AJDT 1.5 e vários outros.

A nova versão do Eclipse 3.3 — também comentada no blog do Urubatan — está em estágio avançado de desenvolvimento. Em 1º de junho saiu o Release Candidate 3 (RC3). O Web Tools Plataform (WTP) 2.0, cujo RC2 foi lançado ontem, 6 de junho, trará finalmente um editor visual para HTML e JSP.