Ah, essas crianças de hoje...

Joel Spolsky comenta sobre os perigos de ensinar apenas Java nas universidades, e por que você deve aprender ponteiros e programação funcional para ser um bom programador.

Pequeno trecho para atiçar os ânimos:
The recruiters-who-use-grep, by the way, are ridiculed here, and for good reason. I have never met anyone who can do Scheme, Haskell, and C pointers who can't pick up Java in two days, and create better Java code than people with five years of experience in Java, but try explaining that to the average HR drone.



Ajustem seus relógios: na virada do ano 2005 para 2006, teremos um minuto com 61 segundos!
Como será que os computadores vão se comportar...?


Python for PSP

(o que vem agora? Ruby on Rails para o Nintendo DS?)


On Rails!

Pra quem ainda não conhece Ruby (e seu "filho" mais famoso, o framework Ruby on Rails), talvez seja hora de dar uma olhada. O videozinho introdutório do Ruby on Rails é impressionante (salvas as medidas proporções de hype, show business e exibicionismo explícito)...



O REST, ou Representational State Transfer, é um modelo arquitetural para sistemas distribuídos que vem ganhando popularidade na Web. A idéia do REST é representar recursos como URLs únicas, substituindo parâmetros por estruturas "directory-like". Assim, aquele velho site de sua livraria virtual favorita, que usava uma notação algumas vezes ilegível (http://www.jungle.com/exec/booksearch.pl?a=2142312&t=532908 ?!?!?!) pode estruturar suas informações de maneira mais adequada (http://www.jungle.com/books/jkhowlings/harrypotter6/ soa muito melhor). Não vai mudar o mundo. Mas com certeza, é um primeiro passo na direção de sistemas Web mais intelingíveis (especialmente por seus maiores usuários, os humanos)...

Alguns papers de referência aqui e aqui. Enjoy!


Os piores bugs da história do software

Erros acontecem. Erros de proporções astronômicas também. :)


A Sintaxe ao longo dos tempos...

Uma comparação da sintaxe de diversas linguagens de programação, da maneira como se escrevem os comentários à declaração de variáveis.


Totally Gridbag...

Ah, os Layouts do Java... Todos tão úteis e fáceis de usar!


The amorality of Web 2.0

From the start, the World Wide Web has been a vessel of quasi-religious longing. And why not? For those seeking to transcend the physical world, the Web presents a readymade Promised Land. On the Internet, we're all bodiless, symbols speaking to symbols in symbols. The early texts of Web metaphysics, many written by thinkers associated with or influenced by the post-60s New Age movement, are rich with a sense of impending spiritual release; they describe the passage into the cyber world as a process of personal and communal unshackling, a journey that frees us from traditional constraints on our intelligence, our communities, our meager physical selves. We become free-floating netizens in a more enlightened, almost angelic, realm.

But as the Web matured during the late 1990s, the dreams of a digital awakening went unfulfilled. The Net turned out to be more about commerce than consciousness, more a mall than a commune. And when the new millenium arrived, it brought not a new age but a dispiritingly commonplace popping of a bubble of earthly greed. Somewhere along the way, the moneychangers had taken over the temple. The Internet had transformed many things, but it had not transformed us. We were the same as ever.

The New New Age

But the yearning for a higher consciousness didn't burst with the bubble. Web 1.0 may have turned out to be spiritual vaporware, but now we have the hyper-hyped upgrade: Web 2.0. In a profile of Internet savant Tim O'Reilly in the current issue of Wired, Steven Levy writes that "the idea of collective consciousness is becoming manifest in the Internet." He quotes O'Reilly: "The Internet today is so much an echo of what we were talking about at [New Age HQ] Esalen in the '70s - except we didn't know it would be technology-mediated." Levy then asks, "Could it be that the Internet - or what O'Reilly calls Web 2.0 - is really the successor to the human potential movement?"

Levy's article appears in the afterglow of Kevin Kelly's sweeping "We Are the Web" in Wired's August issue. Kelly, erstwhile prophet of the Long Boom, surveys the development of the World Wide Web, from the Netscape IPO ten years ago, and concludes that it has become a "magic window" that provides a "spookily godlike" perspective on existence. "I doubt angels have a better view of humanity," he writes.

But that's only the beginning. In the future, according to Kelly, the Web will grant us not only the vision of gods but also their power. The Web is becoming "the OS for a megacomputer that encompasses the Internet, all its services, all peripheral chips and affiliated devices from scanners to satellites, and the billions of human minds entangled in this global network. This gargantuan Machine already exists in a primitive form. In the coming decade, it will evolve into an integral extension not only of our senses and bodies but our minds ... We will live inside this thing."

The revelation continues:

There is only one time in the history of each planet when its inhabitants first wire up its innumerable parts to make one large Machine. Later that Machine may run faster, but there is only one time when it is born.

You and I are alive at this moment.

We should marvel, but people alive at such times usually don't. Every few centuries, the steady march of change meets a discontinuity, and history hinges on that moment. We look back on those pivotal eras and wonder what it would have been like to be alive then. Confucius, Zoroaster, Buddha, and the latter Jewish patriarchs lived in the same historical era, an inflection point known as the axial age of religion. Few world religions were born after this time. Similarly, the great personalities converging upon the American Revolution and the geniuses who commingled during the invention of modern science in the 17th century mark additional axial phases in the short history of our civilization.

Three thousand years from now, when keen minds review the past, I believe that our ancient time, here at the cusp of the third millennium, will be seen as another such era. In the years roughly coincidental with the Netscape IPO, humans began animating inert objects with tiny slivers of intelligence, connecting them into a global field, and linking their own minds into a single thing. This will be recognized as the largest, most complex, and most surprising event on the planet. Weaving nerves out of glass and radio waves, our species began wiring up all regions, all processes, all facts and notions into a grand network. From this embryonic neural net was born a collaborative interface for our civilization, a sensing, cognitive device with power that exceeded any previous invention. The Machine provided a new way of thinking (perfect search, total recall) and a new mind for an old species. It was the Beginning.

This isn't the language of exposition. It's the language of rapture.

The Cult of the Amateur

Now, lest you dismiss me as a mere cynic, if not a fallen angel, let me make clear that I'm all for seeking transcendence, whether it's by going to church or living in a hut in the woods or sitting at the feet of the Maharishi or gazing into the glittering pixels of an LCD screen. One gathers one's manna where one finds it. And if there's a higher consciousness to be found, then by all means let's get elevated. My problem is this: When we view the Web in religious terms, when we imbue it with our personal yearning for transcendence, we can no longer see it objectively. By necessity, we have to look at the Internet as a moral force, not as a simple collection of inanimate hardware and software. No decent person wants to worship an amoral conglomeration of technology.

And so all the things that Web 2.0 represents - participation, collectivism, virtual communities, amateurism - become unarguably good things, things to be nurtured and applauded, emblems of progress toward a more enlightened state. But is it really so? Is there a counterargument to be made? Might, on balance, the practical effect of Web 2.0 on society and culture be bad, not good? To see Web 2.0 as a moral force is to turn a deaf ear to such questions.

Let me bring the discussion down to a brass tack. If you read anything about Web 2.0, you'll inevitably find praise heaped upon Wikipedia as a glorious manifestation of "the age of participation." Wikipedia is an open-source encyclopedia; anyone who wants to contribute can add an entry or edit an existing one. O'Reilly, in a lucid new essay on Web 2.0, says that Wikipedia marks "a profound change in the dynamics of content creation" - a leap beyond the Web 1.0 model of Britannica Online. To Kevin Kelly, Wikipedia shows how the Web is allowing us to pool our individual brains into a great collective mind. It's a harbinger of the Machine.

In theory, Wikipedia is a beautiful thing - it has to be a beautiful thing if the Web is leading us to a higher consciousness. In reality, though, Wikipedia isn't very good at all. Certainly, it's useful - I regularly consult it to get a quick gloss on a subject. But at a factual level it's unreliable, and the writing is often appalling. I wouldn't depend on it as a source, and I certainly wouldn't recommend it to a student writing a research paper.

Take, for instance, this section from Wikipedia's biography of Bill Gates, excerpted verbatim:

Gates married Melinda French on January 1, 1994. They have three children, Jennifer Katharine Gates (born April 26, 1996), Rory John Gates (born May 23, 1999) and Phoebe Adele Gates (born September 14, 2002).

In 1994, Gates acquired the Codex Leicester, a collection of writings by Leonardo da Vinci; as of 2003 it was on display at the Seattle Art Museum.

In 1997, Gates was the victim of a bizarre extortion plot by Chicago resident Adam Quinn Pletcher. Gates testified at the subsequent trial. Pletcher was convicted and sentenced in July 1998 to six years in prison. In February 1998 Gates was attacked by Noël Godin with a cream pie. In July 2005, he solicited the services of famed lawyer Hesham Foda.

According to Forbes, Gates contributed money to the 2004 presidential campaign of George W. Bush. According to the Center for Responsive Politics, Gates is cited as having contributed at least $33,335 to over 50 political campaigns during the 2004 election cycle.

Excuse me for stating the obvious, but this is garbage, an incoherent hodge-podge of dubious factoids (who the heck is "famed lawyer Hesham Foda"?) that adds up to something far less than the sum of its parts.

Here's Wikipedia on Jane Fonda's life, again excerpted verbatim:

Her nickname as a youth—Lady Jane—was one she reportedly disliked. She traveled to Communist Russia in 1964 and was impressed by the people, who welcomed her warmly as Henry's daughter. In the mid-1960s she bought a farm outside of Paris, had it renovated and personally started a garden. She visited Andy Warhol's Factory in 1966. About her 1971 Oscar win, her father Henry said: "How in hell would you like to have been in this business as long as I and have one of your kids win an Oscar before you do?" Jane was on the cover of Life magazine, March 29, 1968.

While early she had grown both distant from and critical of her father for much of her young life, in 1980, she bought the play "On Golden Pond" for the purpose of acting alongside her father—hoping he might win the Oscar that had eluded him throughout his career. He won, and when she accepted the Oscar on his behalf, she said it was "the happiest night of my life." Director and first husband Roger Vadim once said about her: "Living with Jane was difficult in the beginning ... she had so many, how do you say, 'bachelor habits.' Too much organization. Time is her enemy. She cannot relax. Always there is something to do." Vadim also said, "There is also in Jane a basic wish to carry things to the limit."

This is worse than bad, and it is, unfortunately, representative of the slipshod quality of much of Wikipedia. Remember, this emanation of collective intelligence is not just a couple of months old. It's been around for nearly five years and has been worked over by many thousands of diligent contributors. At this point, it seems fair to ask exactly when the intelligence in "collective intelligence" will begin to manifest itself. When will the great Wikipedia get good? Or is "good" an old-fashioned concept that doesn't apply to emergent phenomena like communal on-line encyclopedias?

The promoters of Web 2.0 venerate the amateur and distrust the professional. We see it in their unalloyed praise of Wikipedia, and we see it in their worship of open-source software and myriad other examples of democratic creativity. Perhaps nowhere, though, is their love of amateurism so apparent as in their promotion of blogging as an alternative to what they call "the mainstream media." Here's O'Reilly: "While mainstream media may see individual blogs as competitors, what is really unnerving is that the competition is with the blogosphere as a whole. This is not just a competition between sites, but a competition between business models. The world of Web 2.0 is also the world of what Dan Gillmor calls 'we, the media,' a world in which 'the former audience,' not a few people in a back room, decides what's important."

I'm all for blogs and blogging. (I'm writing this, ain't I?) But I'm not blind to the limitations and the flaws of the blogosphere - its superficiality, its emphasis on opinion over reporting, its echolalia, its tendency to reinforce rather than challenge ideological extremism and segregation. Now, all the same criticisms can (and should) be hurled at segments of the mainstream media. And yet, at its best, the mainstream media is able to do things that are different from - and, yes, more important than - what bloggers can do. Those despised "people in a back room" can fund in-depth reporting and research. They can underwrite projects that can take months or years to reach fruition - or that may fail altogether. They can hire and pay talented people who would not be able to survive as sole proprietors on the Internet. They can employ editors and proofreaders and other unsung protectors of quality work. They can place, with equal weight, opposing ideologies on the same page. Forced to choose between reading blogs and subscribing to, say, the New York Times, the Financial Times, the Atlantic, and the Economist, I will choose the latter. I will take the professionals over the amateurs.

But I don't want to be forced to make that choice.

Scary Economics

And so, having gone on for so long, I at long last come to my point. The Internet is changing the economics of creative work - or, to put it more broadly, the economics of culture - and it's doing it in a way that may well restrict rather than expand our choices. Wikipedia might be a pale shadow of the Britannica, but because it's created by amateurs rather than professionals, it's free. And free trumps quality all the time. So what happens to those poor saps who write encyclopedias for a living? They wither and die. The same thing happens when blogs and other free on-line content go up against old-fashioned newspapers and magazines. Of course the mainstream media sees the blogosphere as a competitor. It is a competitor. And, given the economics of the competition, it may well turn out to be a superior competitor. The layoffs we've recently seen at major newspapers may just be the beginning, and those layoffs should be cause not for self-satisfied snickering but for despair. Implicit in the ecstatic visions of Web 2.0 is the hegemony of the amateur. I for one can't imagine anything more frightening.

In "We Are the Web," Kelly writes that "because of the ease of creation and dissemination, online culture is the culture." I hope he's wrong, but I fear he's right - or will come to be right.

Like it or not, Web 2.0, like Web 1.0, is amoral. It's a set of technologies - a machine, not a Machine - that alters the forms and economics of production and consumption. It doesn't care whether its consequences are good or bad. It doesn't care whether it brings us to a higher consciousness or a lower one. It doesn't care whether it burnishes our culture or dulls it. It doesn't care whether it leads us into a golden age or a dark one. So let's can the millenialist rhetoric and see the thing for what it is, not what we wish it would be.

- Nick Carr, October 03, 2005


Groovy Development

Artigo explicadinho sobre a linguagem de scripting Groovy, uma das linguagens desenvolvidas para rodar em cima da VM do Java.


Video Games Reloaded

A tecnologia evolui. E com a evolução, as grandes "revoluções" do passado viram brinquedo. Que tal um remake do Super Mario todo em Javascript/html? Ou quem sabe, Lemmings DHTML Edition!


C#: uma linguagem funcional?

Há algum tempo que eu digo que várias inovações em linguagens de programação que surgiram da pesquisa com linguagens funcionais estão se tornando mainstream. Nos últimos anos a comunidade C++ vem namorando cada vez mais com a programação funcional, como prova a existência de bibliotecas de templates como FC++ e boost.lambda. Agora a linguagem C# está adicionando várias características antes conhecidas apenas em linguagens funcionais, como detalhado nesta página na MSDN. Alguns destaques (via PLNews):

  • Implicitly typed local variables, which permit the type of local variables to be inferred from the expressions used to initialize them.
  • Extension methods, which make it possible to extend existing types and constructed types with additional methods.
  • Lambda expressions, an evolution of anonymous methods that provides improved type inference and conversions to both delegate types and expression trees.
  • Object initializers, which ease construction and initialization of objects.
  • Anonymous types, which are tuple types automatically inferred and created from object initializers.
  • Implicitly typed arrays, a form of array creation and initialization that infers the element type of the array from an array initializer.
  • Query expressions, which provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.
  • Expression trees, which permit lambda expressions to be represented as data (expression trees) instead of as code (delegates).
Inferência de tipos apareceu com a linguagem ML original, na década de 70. Expressões lambda vêm do cálculo-lambda de Alonzo Church, mas foram incorporados pela primeira vez numa linguagem de programação com a Lisp original de John McCarthy. As expressões de consulta fazem parte do LINQ, a tentativa da MS de integrar uma sub-linguagem de consulta e acesso a bancos de dados dentro de C# e Visual Basic. Sobre esse projeto, veja este post de Erik Meijer no Lambda the Ultimate para se ter uma idéia de como a teoria está indo direto para a prática. Resta saber se a salada toda, no final, vai ser boa ou não.


AtomChip® Quantum® II

O primeiro computador solid-state - i.e., sem HD ou outras peças mecânicas móveis que possam quebrar facilmente. Todo o armazenamento é feito em memória flash (como os cartões de memória de câmeras digitais). A "coisinha" será lançada no começo do ano que vem, e tem preço sugerido de aproximadamente 10.000 dólares.

Processor: 6.8GHZ CPU (AtomChip® Quantum® II processor / System Compliance: Two Operating Systems with Voice Command (Microsoft® Windows® XP Professional and Linux®)
Memory: 1TB Quantum-Optical non-volatile RAM (NvIOpSRAM-SODIMM 200-pin)
Storage: 2TB non-volatile Quantum RAM (NvIOpRAM-ATA IDE)
Optical Drive: DVD Super Multia
LCD Display: 12.1” WXGA (1280 x 800, 16:10) TFT Glare Type LCD display with 1.3 Mega pixel CMOS camera
Video & Graphics: Two Integrated graphic controllers [Intel®855GME internal graphics, support Intel® DVMT (Dynamic Video Memory Technology) and AtomChip® DVM (Dynamic Video Memory)]
Communication: 10/100 Base-T LAN on board, MDC Fax/Modem V.90/V.92 on Board, 802.11a/802.11b/802.11g WLAN, Intel® PRO/Wireless 2100/2200BG/2915ABG network connection, WiFi, Bluetoth, GPRS -with Bluetoth antena, CMOS camera with USB


Roubo de celular

Nunca roube um celular de um desenvolvedor ;)


Acegi Security

Um framework de segurança impressionante e muito bem documentado para uso com o Spring Framework.

Summary: Acegi Security is an open source project that provides comprehensive authentication and authorisation services for enterprise applications based on The Spring Framework. Acegi Security can authenticate using a variety of pluggable providers, and can authorise both web requests and method invocations. Acegi Security provides an integrated security approach across these various targets, and also offers access control list (ACL) capabilities to enable individual domain object instances to be secured. At an implementation level, Acegi Security is managed through Spring's inversion of control and lifecycle services, and actually enforces security using interception through servlet Filters and Java AOP frameworks. In terms of AOP framework support, Acegi Security currently supports AOP Alliance (which is what the Spring IoC container uses internally) and AspectJ, although additional frameworks can be easily supported.


Torvalds licencia e cobra pelo uso do nome Linux

Aprendam, crianças: é assim que se ganha com software livre! :)
(já pensou se ele decide cobrar royalties de todo mundo...?)

When to use XML (again)

A moda do "XML everywhere" parece estar diminuindo, depois do modismo que tomou conta dos últimos anos (e levou à construção de milhares de sistemas lentos e mal estruturados, mundo afora). Para evitar novos erros básicos de utilização de uma tecnologia que já se consolida como um dos "building blocks" essenciais em diversas arquiteturas de sistemas, a pergunta nunca deve ser esquecida: quando usar XML?


Os erros da versão 1.0

Por que projetos novos falham? Por que é tão comum jogar-se a versão 1.0 fora e refazer tudo do zero, quando um projeto entra em produção ou começa a sua evolução? Alguns dos erros mais comuns são fáceis de detectar, e (espera-se) corrigir.


Drivers JDBC

Uma lista com os mais comuns drivers JDBC disponíveis, e instruções de uso. Um bookmark interessante!


Criptografia Quântica

O Diretor Executivo, Sr.Leonardo icciardi, ministrará no 1º Congresso de Segurança da Informação na UFRJ, no dia 23 desse mês às 11 da manhã, a primeira apresentação de um sistema em pleno funcionamento com o uso da Criptografia Quântica.

Mais de detalhes sobre a Criptografia Quântica em http://www.dsc.ufcg.edu.br/~gmcc/mq/criptografia.html

A guerra contra o terrorismo...

...Em uma versão Bourne shell. Para o bom geek que não entende direito de política internacional, mas adora compilar um kernel.

$ cd /middle_east
$ ls
Afghanistan Iraq Libya Saudi_Arabia UAE
Algeria Israel Morrocco Sudan Yemen
Bahrain Jordan Oman Syria
Egypt Kuwait Palestine Tunisia
Iran Lebanon Qatar Turkey

$ cd Afghanistan
$ ls
bin Taliban
$ rm Taliban
rm: Taliban is a directory
$ cd Taliban
$ ls
$ rm soldiers
$ cd ..
$ rmdir Taliban
rmdir: directory "Taliban": Directory not empty
$ cd Taliban
$ ls -a
. .. .insurgents
$ chown -R USA .*
chown: .insurgents: Not owner
$ cd ..
$ su
Password: *******
# mv Taliban /tmp
# exit
$ ls
$ cd bin
$ ls
$ cd ..
$ rm -r bin/laden
bin/laden: No such file or directory
$ find / -name laden
$ su
Password: *******
# mv bin /tmp
# exit
$ pwd
$ cd /opt/UN
$ ln -s /Bad_Guys/Al_Qaeda /middle_east/Iraq/.
ln: cannot create /middle_east/Iraq/Al_Qaeda: Permission denied
$ su
# ln -s /Bad_Guys/Al_Qaeda /middle_east/Iraq/.
# cd /middle_east/Iraq/Al_Qaeda
Al_Qaeda: does not exist
# rm /middle_east/Iraq/Al_Qaeda
# mkfile 100g /middle_east/Iraq/Al_Qaeda
mkfile: No space left on device
# rm /middle_east/Iraq/Al_Qaeda
# cd /opt/Coalition/Willing
# mkfile 1b /middle_east/Iraq/Al_Qaeda
# chown -R USA:Proof /middle_east/Iraq/Al_Qaeda
$ cd /middle_east/Iraq
$ ls
$ ls
$ ls
$ ls -a
. .. saddam
$ find / -name [Ww][Mm][Dd]
$ wall Propaganda.txt
Broadcast Message from USA (pts/1) on USS_Abraham_Lincoln Th May 1st
Mission Accomplished!
$ rm saddam
saddam: No such file or directory
$ find / -name saddam
$ wall NewsWorthy.txt
Broadcast Message from USA (pts/1) on Time.Magazine Sat Dec 13
We Got Him!
$ mv /var/opt/dictators/spiderhole/saddam /opt/jail
$ cd /opt/USA
$ cp -Rp Democracy /middle_east/Iraq
$ cd /middle_east/Iraq/Democracy
$ ./install
Install Error: Install failed. See install_log for details.
$ more install_log
Installed failed!
Prerequisite packages missing
Conflicting package Wahhabism found in /midde_east/Saudi_Arabia
Packages Church and State must be installed separately
File System /PeakOil nearing capacity
Please read the install guide to properly plan your installation.


John Carmack e o J2ME

Falando nele, encontrei este post no seu blog que fala sobre a experiência de desenvolver jogos para celulares, principalmente usando Java. Tanto os pontos positivos quanto negativos são ressaltados, além de alguns comentários sobre as diferenças entre o desenvolvimento de jogos megalomaníacos para PC e os bem limitados que cabem nas plataformas móveis atuais. Ele também fala um pouco de como surgiu a idéia do DoomRPG.

Alguns trechos para atiçar os ânimos:

The biggest problem is that Java is really slow. On a pure cpu / memory / display / communications level, most modern cell phones should be considerably better gaming platforms than a Game Boy Advanced. With Java, on most phones you are left with about the CPU power of an original 4.77 mhz IBM PC, and lousy control over everything.


Write-once-run-anywhere. Ha. Hahahahaha. We are only testing on four platforms right now, and not a single pair has the exact same quirks. All the commercial games are tweaked and compiled individually for each (often 100+) platform. Portability is not a justification for the awful performance.

Quake 3 GPL

Os desenvolvedores de jogos e pretendentes no mundo inteiro estão de pulso acelerado por causa dessa notícia: John Carmack anunciou que o código-fonte de Quake 3 será liberado, licenciado pela GPL, assim como foi feito antes com os jogos anteriores da Id.

Já é possível antecipar os milhares que baixarão o código-fonte inteiro, para nunca olhar para ele (bom talvez uma ou duas vezes, rapidamente). Mas também devem aparecer vários projetos interessantes aproveitando o código, como os que já existem baseados em Q2, o Quake original e até mesmo Doom.

Do ponto de vista da engenharia de software, Quake 3 é um sistema enorme e de grande complexidade. É interessante notar que a indústria de jogos não é muito conhecida por usar os métodos da moda, e que John Carmack é menos "antenado" ainda, apesar da qualidade inegável dos jogos da empresa.


Calculando Estimativas: o Método de Pontos de Caso de Uso

Estimar o porte - e conseqüentemente, o custo de produção - de um sistema não é uma tarefa fácil. Na grande maioria dos casos, as estimativas costumam ser lançadas sem qualquer preocupação com uma medição formal, resultando em cronogramas imprecisos - e algumas vezes, desastrosos.
A análise de sistemas Orientados a Objetos já utiliza, comumente, os diagramas de Casos de Uso (Use Cases) para descrever as funcionalidades do sistema de acordo com a forma de utilização por parte dos usuários. A técnica de análise de dimensão por Casos de Uso foi criada para permitir que seja possível estimar o tamanho do sistema ainda na fase de levantamento de Casos de Uso, utilizando-se dos próprios documentos gerados nesta fase de análise como subsídio para o cálculo dimensional.
Artigo completo aqui!


Ruby + Eclipse

Pra quem anda se aventurando no Ruby on Rails e não é habituado com Ruby, existe um plugin interessante para a IDE Eclipse: o RDT faz syntax highlighting, code completion, teste de expressões regulares... Nice!


Upgrading to Hibernate 3

Certo dia você acorda, inspirado, temerário e sentindo-se o mais confiante dos geeks.

- Já sei! Vou fazer um upgrade na camada de persistência de nosso sistema! Deixa eu só baixar o Hibernate 3...

Nem tudo são flores. O último release do Hibernate agregou tantas mudanças arquiteturais e conceituais que a equipe do projeto achou por bem eliminar a compatibilidade (backward compatibility). Para o desespero dos desinformados...

O artigo Upgrading to Hibernate 3 - a war story é um relato de quem já teve que passar pela atualização e sobreviveu. Sem maiores traumas, e sem noites sem dormir.


'Write once, run anywhere' not working for phones

O padrão J2ME foi definido e proposto para evitar que a grande variedade de form factors dos dispositivos móveis tornasse o desenvolvimento de aplicações um inferno de incompatibilidades e versões dedicadas. O resultado: um padrão muitíssimo limitado (MIDP 1.0), seguido por um padrão visualmente mais flexível, mas com severas restrições de acesso a recursos de hardware (MIDP 2.0). O MIDP 3.0 vem por aí, e (mais uma vez) promete ser a solução de todos os problemas. Mas com os dispositivos móveis evoluindo mais rápido do que qualquer outro dispositivo computacional da história, será que o padrão vai chegar a tempo?

Este artigo do cnet.com debate o problema e, como sempre, joga lenha na eterna (e cansativa) discussão "Java versus qualquer outra coisa"...


J2ME Polish

Uma ferramenta de build que permite "polir" aplicações J2ME, adaptando-as a dispositivos com características específicas, com um mecanismo meio estranho de tags (macros?) espalhadas pelo código da aplicação.
O site também inclui uma relação de devices J2ME, incluindo as APIs que eles implementam.


Syndromes of Forgotten Programmers

Quanto mais você cospe linhas de código (e inevitavelmente, acaba esbarrando nas linhas de código cuspidas por outros desenvolvedores mundo afora), mais percebe como pessoas diferentes pensam diferente - e acabam por criar software que reflete suas mentes (maníacas, complicadas, pouco criativas, preguiçosas...). As "síndromes de programador" são tão comuns que deveriam ser ensinadas em faculdade.

The Rube Goldberg Syndrome
Rube Goldberg was a cartoonist famous for incredibly complex solutions to life’s simpler problems. His programming counterparts never tire of demonstrating to everyone what incredibly complex and talented programmers they are...even in simple situations that don’t call for it.

The Mother Hen Syndrome
Mother Hens have a bad case of nesting instinct, at least when it comes to IF..THEN..ELSE constructs. I recently had to debug a program with 14 levels of nested IFs. These probably do not occur as often as they seem. It’s just that if over-nested IFs exist in a program a debugging trail generally leads to them.

The Garbage Collector Syndrome
Garbage Collectors are incapable of deleting a line of code, no matter how useless or obsolete it might be. The programs they work on resemble mazes, full of commented-out code and unused modules. Imagine what these programs will be like in another 10-20 years!

E tem muito mais no artigo "Syndromes of Forgotten Programmers".


MIDP 3 Use Cases - Java ME Developer community input

The MIDP3 Expert Group (EG) is currently in the process of defining use cases to be used as the basis for the MIDP3 requirements definition.

The EG considers your feedback/input on use cases important.

To capture your input, a new bucket has been created on the J2ME Devcommunity Wiki. Use cases that are captured will be passed on to theMIDP3 Expert Group for consideration.

Before posting your use cases, please read existing entries to avoid duplicates. Also, please followed the specified format.

You can find the "JSR 271 MIDP3 Developer Community Use-CasesRepository" on the main Wiki clone page @ http://www.j2medeveloper.com/wiki.


Mentawai 1.1

Foi lancado uma nova versão deste framework WEB "made in Brazil". As novas features vão desde autorização, IoC e file upload até diversas melhorias e ajustes.

Para quem não conhece, o Mentawai vem com uma proposta de ser um framework com uma curva de apredizagem bem pequena para aquelas pessoas que não tem tempo a perder aprendendo um framework novo. Só para ter uma ideia, ele chegou a abolir o uso de XML para as suas configurações.


As 7 Fases de um Projeto

1. Entusiasmo
2. Desilusão
3. Confusão
4. Pânico
5. Caçada aos culpados
6. Punição dos inocentes
7. Promoção dos não participantes


Programming in Haskell

Um livro introdutório sobre a linguagem de programação Haskell - uma linguagem "puramente funcional de propósito geral". Além de um preview do livro, o site disponibiliza também slideshows (powerpoint) de cada um dos capítulos do livro. Um "kickstart" interessante para quem não conhece nada da linguagem.
O próprio site do haskell (da haskell??) tem uma boa quantidade de manterial interessanste, inclusive aplicações desenvolvidas na linguagem. O site também tenta desmistificar algumas idéias sobre a programação funcional e faz comparações com o modelo procedural/imperativo.

E pra quem simplesmente não acredita em programação "puramente funcional", apresentamos a O'Haskell!! :D

f [] = []
f (x:xs) = f ys ++ [x] ++ f zs
ys = [a | a  xs, a  x]
zs = [b | b  xs, b > x]


Genéricos: Mais críticas

Como eu sou o principal responsável por evitar que esse site se torne uma espécie de "Java Partyline", aqui vai mais um artigo criticando a implementação de genéricos na linguagem. É um comentário de Bruce Eckel sobre o artigo de Ken Arnold do qual eu falei neste post. Um trecho para abrir o apetite:

As much as Java people like to dis C++ for just about everything, C++ templates are much more straightforward than Java generics, because they are consistent. With erasure, you have to constantly remind yourself that you only think you know what a particular parameterized type is. But because you don't really (except sometimes), it causes all kinds of confusion. And a programming language is supposed to be an abstraction to reduce confusion, so Ken's comment about complexity: "I don't see that the value is there to justify the cost," is legitimate.

Vale lembrar que Eckel e Arnold são dois famosos expoentes da comunidade Java, autores de livros importantes sobre a linguagem (Arnold é co-autor do oficial "The Java Programming Language"), e não outsiders.

Eu acho que os genéricos foram implementados da melhor maneira possível considerando o requerimento de não quebrar a compatibilidade, e para conseguir isso foi necessária tanta teoria que um programador médio não faz nem idéia. Mas teria sido provavelmente melhor se a Sun não tivesse se preocupado tanto com compatibilidade e planejado uma forma de transição para que o código antigo continuasse a interoperar com o novo. Vai saber, evoluir um sistema muito utilizado é complicado de qualquer forma.

O Hibernate está enrolando a sua cabeça?

O "Road to Hibernate" é um tutorial introdutório sobre o Hibernate (se não o melhor framework Objeto-Relacional Java, pelo menos o mais "buzz word" já há um bom tempo).
O tutorial cobre muitos pontos críticos da tecnologia (como os problemas causados pela definição errada de caches e modelo de transaçao, que só são percebidas "tarde demais").


WEP Cracking

Continuando no tópico Wardriving, uma ferramenta muito interessante (ou não, dependendo de que lado da rede wireless você está). Ela quebra uma chave WEP rapidinho, permitindo entrar em redes privadas/criptografadas. E é open-source.
(o link é colaboração do Rafael Torres! :))


Significa andar por ai com um laptop equipado com uma placa de rede wireless para tentar detectar redes wi-fi com brechas de seguranças. Um aparelho de GPS também pode ser utilizado p/ marcar a posição, latitude e longitude, onde a rede é encontrada. Já existe até uma versão do KNOPPIX (Linux Live CD) para esse fim, o Auditor. Esta versão traz várias ferramentas para este tipo de prática como wi-fi scanners além de scripts de força bruta para quebrar senha WEP. ;)


Biscoito da Sorte do Dia

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."

- Rich Cook

O Jdeveloper agora é grátis. Que m*, ein ?

Depois da Borland ter aberto o código-fonte do Jbuilder para a comunidade Eclipse, a Oracle jogou pesado e anunciou que a IDE Java da Oracle (Jdeveloper) poderá ser totalmente utilizada sem a necessidade de licenciamento, observando as regras no Site OTN da Oracle.

O pessoal da Oracle e os amantes do Jdeveloper (existe algum?) que me perdoem, mas não sei o que tem de tão bom nessa notícia, que só tende a piorar ainda mais o Jdev (e tem como?). Ao meu ver, a Oracle está tirando um peso dos seus ombros tornando o Jdev gratuito. Afinal, a partir de agora, se houverem mais reclamações que a ferramenta é ruim, a Oracle simplemente vai responder: "Tá reclamando de que? A IDE é de graça".

Já que estamos falando da Oracle, ela se ofereceu para liderar o projeto JavaServer Faces (JSF) dentro da comunidade open-source Eclipse Foundation e também irá participar do projeto Apache MyFaces como contribuidor.

StringBuffer ou StringBuilder?

A classe StringBuilder foi introduzida no Java 5.0. Trata-se de uma versão non-thread-safe (portanto, mais rápida) da velha e boa StringBuffer. As operações da StringBuilder são iguais às de sua prima. Então, se antes você fazia:
StringBuffer bf = new StringBuffer();
Agora você faz:
StringBuilder bf = new StringBuilder();

(O que? Você faz concatenação de strings usando a classe String??? Bad, bad developer. No donuts for you...)


Mapeamento Objeto-Relacional: Técnicas e Implementações

Outro artigo da série de artigos velhos. Conceitos básicos e estratégias para o mapeamento objeto entre objetos e bases de dados relacionais. Versão online aqui ou PDF aqui.


Você sofre de GeekBlock?

Just as writers are prone to writer's block, programmers are prone to GeekBlock.

Maybe we can't find the cause of a particular bug,or maybe we just can't stop surfing the web when we know there's things we should be doing.

Having found myself in the clutches of GeekBlock more than once, I've put together some notes from the inside.


Java Generics

Artigo véeeeelho sobre a introdução dos Generics no Java 1.5 (ops, falha nossa...). Pode ainda servir de referência, though.


A Microsoft Certified Professional mais jovem do planeta!

"Meet Arfa, a promising young software programmer from Faisalabad, Pakistan, who is believed to be the youngest Microsoft Certified Professional in the world. She received the certification when she was 9. During a recent meeting with Bill Gates, she presented him with a poem she wrote that celebrated his life story."



Se você usa algum dispositivo sem teclado completo (PDA, por exemplo) ou só quer usar uma mão e mesmo assim escrever em uma velocidade razoável, pode valer a pena dar uma olhada no Dasher, um software para entrada de texto baseado em gestos contínuos de apontar.

Segundo o site é possível chegar tranquilamente a 25 palavras por segundo, e os usuários experientes chegam até 39 palavras por segundo; além disso, funciona em qualquer língua.

No endereço tem demonstrações de usuários entrando texto com o bicho; realmente, parece um jogo de videogame. Isso porque uma das idéias principais da interface é usar zoom; tenho certeza que Jef Raskin aprovaria.


Mbooster - Compilador J2ME

Com o aumento da demanda por desenvolvimento J2ME, começam a surgir novas ferrramentas no horizonte para auxiliar no desenvolvimento. Este é a proposta do MBooster, um compilador especifico para J2ME que promete reduzir o byte code. Quando será que teremos o "JikesME" ?



RSS Screensaver

Um screensaver interessante, que permite exibir RSS Feeds no seu desktop. Por enquanto, disponível somente para Windows (com o Not Yet Framework instalado).

Momento Dilbert...


Will RFID-guided robots rule the world?

Os robôs guiados por RFID são uma das novas tendências mecatrônicas.

Enquanto isso, teóricos da conspiração, malucos, religiosos e jornalistas discutem se o RFID não é, na verdade, um sinal do apocalipse...


A Máquina de Turing

Que tal uma Máquina de Turing toda feita de LEGO?

Introduzida por Alan M. Turing em 1936, a Máquina de Turing é uma abstração usada no estudo da Teoria da Computação: o que um computador pode ou não fazer.

O processo computacional foi graficamente mostrado no artigo de Turing quando ele pediu ao leitor que considerasse em dispositivo que pudesse ler e escrever símbolos em uma fita que estava dividida em quadrados. Uma cabeça de leitura/gravação se moveria em qualquer direção ao longo da fita, um quadrado por vez, e uma unidade de controle poderia interpretar uma lista de instruções simples sobre leitura e gravação de símbolos nos quadrados, movendo-se ou não para a direita ou esquerda. O quadrado que é "lido" em cada etapa é conhecido como "quadrado ativo". A regra que está sendo executada determina o que se convencionou chamar 'estado' da máquina. A fita é potencialmente infinita.



Todo programador já teve aqueles dias em que não tem saco para fazer nada. Imagina então que em um destes dias você tem de implementar um DAO para acessar o banco de dados com Interface para lá, implementacao para cá e uma Factory no meio de brinde. Bem, pensando nisso surgiu o projeto DAOGen, que simplesmente faz todo o "trabalho sujo" para você (que eu gosto, Mas sou minoria no meio). Basta gerar as classes seguindo o passo a passo e dentro de segundos... Voilá, um DAO quentinho saindo do forno. Agora é só utilizar o famoso ctrl + xupis e ctrl + cuspis.


Palm's new logo

A Palm (antiga PalmOne, que um dia já se chamou Palm Inc), a empresa que mais sofre de crise de identidade no mundo da tecnologia, mudou de nome e de logo. Mais uma vez. Novamente.

O software e os carros...

Numa conferência sobre software (COMDEX), Bill Gates disparou:

"Se a GM tivesse desenvolvido sua tecnologia como a Microsoft, todos nós estaríamos dirigindo carros de 25 dólares que fariam 1.000 milhas com um galão de gasolina"

Eis a resposta da GM:

"Se a GM tivesse desenvolvido sua tecnologia como a Microsoft, todos teríamos carros com as seguintes características:
1 - Sem nenhuma razão aparente, o carro bateria num poste duas vezes por dia.
2 - Eventualmente, seu carro morreria na estrada sem razão aparente. Você aceitaria o fato, daria nova partida e continuaria dirigindo.
3 - Toda vez que as faixas da estrada fossem repintadas, você teria de comprar um novo carro.
4 - Eventualmente, executando uma manobra como uma conversão a esquerda, seu carro deixaria de funcionar e você teria de mandar reinstalar o motor.
5 - Uma única pessoa por vez poderia usar o carro, a menos que você optasse pelo modelo "CarNT". Ainda assim você teria de adquirir mais bancos.
6 - A Macintosh produziria um carro movido a energia solar, mais confortável, cinco vezes mais rápido e duas vezes mais fácil de dirigir, mas que funcionaria apenas em 5% das rodovias.
7 - Luzes indicadoras de óleo, água, temperatura e alternador seriam substituídas por uma simples luz de "falha geral do veículo".
8 - Os bancos exigiriam que todos tivessem as mesmas medidas corporais.
9 - O airbag perguntaria "Você tem Certeza?" antes de disparar.
10 - Eventualmente, sem razão aparente, o carro trancaria o dono fora e não deixaria entrar, a menos que este simultaneamente puxasse a maçaneta, girasse a chave e segurasse na antena do rádio.
11 - A GM exigiria de todos os compradores a aquisição de uma coleção de mapas rodoviários em encadernação de luxo, produzidos por uma subsidiária da GM, mesmo que eles não quisessem os mapas ou precisassem deles.
A tentativa de não adquirir este acessório reduziria o desempenho de veículo em 50%.
12 - Toda vez que a GM lançasse um novo modelo, os motoristas teriam de reaprender a dirigir, porque nenhum dos seus comandos seria operado da mesma maneira que no modelo anterior.
13 - Você teria de pressionar o botão Iniciar para desligar o Motor."

Will computing flow like electricity?

A "computação pervasiva" é a última moda da TI. Computadores em todo lugar? Casas inteligentes? Roupas que sabem quantas vezes foram lavadas? Geladeiras que só deixam você comprar leite desnatado?
Let the software set the flow...

"Industry executives respond to Nicholas G. Carr's contention that utility computing will evolve in much the same way electricity did a century ago."



Uma ferramenta de geração de documentos em Python. Você escreve seus documentos em arquivos txt com uma marcação simples (i.e.: **negrito**, //itálico//, etc, etc), E o txt2tags converte o documento para formatos específicos (html, sgml, pagemaker, manpage, latex). 300% geeky.


Engenharia de Software ?

Publiquei em meu outro blog um artigo relativamente longo (para blogs) e opinativo sobre o estado atual da engenharia de software. Ele reúne algumas idéias e impressões minhas com as de um paper de John Allen que está linkado lá. Claro que ainda assim é muito curto para um assunto complexo, e como não é uma opinião muito comum, pouca gente deve concordar, mas esta lá para quem quiser pensar sobre o assunto. Comentários são bem vindos.


C Family Interview

Dennis Ritchie, Bjarne Stroustrup e James Gosling criadores do C, C++ e Java respectivamente, foram entrevistados e responderam uma série de perguntas respectivas à criação de suas linguagens e previsões para o futuro. O resultado desta entrevista foi publicado no Java Report, 5(7), de Julho de 2000 e no C++ Report, 12(7), de Julho/Agosto de 2000, e pode ser visto em http://www.gotw.ca/publications/c_family_interview.htm. Vale a pena conferir!!!

Quanto se ganha trabalhando com TI?

Pesquisa da ComputerWorld. Enquanto os profissionais da área nem sequer conseguem se organizar para criar regulamentos para a profissão, continuam as pesquisas com números irreais (seja para cima, seja para baixo). Aliás, num país do tamanho do nosso, com cidades tão diferentes em potencial econômico, 'médias' se tornam um troço tão certeiro quanto as pesquisas estatísticas da equipe da marketing da Companhia Cibernética de Sírius...

Momento Dilbert

Palavras sábias! Qualquer semelhança com a realidade é mera coincidência... ;)


Marc Fleury fala sobre o Open Source

Entrevista interessante com o criador do JBoss (e de uma das mais importantes empresas "Open Source-based" do mundo). Ele fala das pessoas que contribuem com o Open Source como um "hobby", dá seu ponto de vista a respeito do sonho de "liberdade, igualdade e fraternidade" pregado por alguns alienados do movimento Open Source e afirma: "ninguém pode trabalhar de graça". Worth reading!


Definições Geniais: "Software detestável"

Detestável (adjetivo): software que não é testável.

Definição do site do Martin Fowler

Nova Versão C++ (C++0x)

Bjarne Stroustrup, criador do C++, publicou um artigo no C/C++ Users Journal em maio deste ano, comentado sobre sugestões quem vem recebedo desde a última release do C++ em 1998 (C++98) . O artigo na verdade é um guia de desenvolvimento de uma nova linguagem, quase 100% compatível com C++, o C++0x. Além de abordar tópicos de grande importância como Type Safety, Generic Programming e Performance, Bjarne saliente que diferente de outras linguagens não gostaria de ver o C++0x rotulando como uma linguagen para "windows" ou "web", mas sim como uma linguagem robusta de propósito geral.

Ruby on Rails no FISL 6.0

Mais uma sobre Ruby on Rails (veja post anterior). David Hansson, o principal responsável pela framework para aplicações web com mais hype no momento, esteve no Fórum Internacional de Software Livre este ano (edição 6.0), fazendo mais uma apresentação que impressionou muita gente.


Assertions e Annotations

Capítulo do livro "Agile Java", sobre dois dos mais interessantes recursos do Java 1.4/1.5


Context-Free Design Grammar

Uma linguagem de programação para geração de fractais, com a sintaxe similar ao Logo! Uh???


Como vai se chamar o Java 8?

O Java 5 foi batizado de Tiger. Java 6 vai se chamar Mustang. Java 7 também já tem nome: Dolphin. E o pessoal já está pensando no Java 8...

O mais interessante é que um dos candidatos a nome é 'Brazil'!



"Web Services" foram a tecnologia da moda por algum tempo, até que todos perceberam que (como quase todas as tecnologias da moda), não serviam para muita coisa. Depois de muitos estudos (e experimentalismos arquiteturais), os Web Services estão voltando a tona, mais maduros e fáceis de usar (quem disser que se sentia confortável trabalhando com SABONETE está mentindo!!)
O REST é um padrão de implementação de Web Services que vem ganhando adeptos (como o flickr e o google, dentre outros.
Definições, exemplos e origem do tal REST você encontra aqui, aqui, aqui e aqui...


Struts Shale

Um novo projeto do Craig McClanahan (pai do Struts), o Struts Shale será composto de 8 subprojetos - core, taglibs, tiles, el, faces, scripting, application e shale. O objetivo principal do projeto vai ser prover um framework de desenvolvimento para 'facilitar e padronizar' o desenvolvimento de aplicações no padrão JSF.



Greasemonkey is a Firefox extension which lets you to add bits of DHTML ("user scripts") to any web page to change its behavior. In much the same way that user CSS lets you take control of a web page's style, user scripts let you easily control any aspect of a web page's design or interaction.

Java Plugin Framework 0.6

O JPF é um 'runtime engine' que permite a descoberta, localização e carga dinâmica de plugins, provendo uma infra-estrutura padrão de plugins para projetos. Se você trabalha naquele grande projeto cheio de módulos com carga dinâmica e atualização online, o JPF pode ajudar.
Este artigo no theServerSide.com fala um pouco a respeito do JPF.


AJAX: A Fresh Look at Web Development

Um artigo interessante sobre a tecnologia AJAX - Asynchronous Javascript and XML - com bons exemplos de utilização prática.


Celulares com CDC a caminho...

Nokia's next generation of Series 60 devices will offer the Connected Device Configuration (CDC), providing a flexible and modular device environment. With CDC incorporated into the Series 60 Platform, Nokia and other Series 60 device manufacturers will be able to offer mobile devices that easily allow the addition and customization of functionality after their deployment. Nokia's vision of the future of mobile Java technology for the Series 60 Platform centers on a platform that is a standards-based, service-oriented, managed, and secure computing environment. The new features will be aligned with two Java™ Specification Requests (JSRs) currently being defined: Mobile Service Architecture for CLDC (JSR-248) and Mobile Service Architecture for CDC (JSR-249). New developer tools supporting CDC on the Series 60 Platform will be made available in the second half of this year by Forum Nokia.



Aproveitando o mote dos rich clients ou como queiram chamar, o projeto Mozilla já vem trabalhando em um padrão aberto para isso há um tempo: XUL. Baseado em XML, obviamente (o que não é baseado em XML hoje em dia?), o padrão define controles "ricos" para usar em aplicações web que não requerem o sacrifício do seu primogênito para o deus JavaScript/DHTML nem exigem o uso de frameworks pesadas.

Vejam um exemplo simples de interface para a Amazon.com e me digam se não é mais impressionante que o do Laszlo. Essa é realmente uma aplicação rica, sem firulas mas que funciona do jeito que você espera que uma aplicação no seu desktop funcione. Claro que o exemplo só roda nos browsers do projeto Mozilla. Mas quem ainda não usa o FireFox já está deixando de usar o melhor browser do mercado mesmo.

Para quem se interessar, a entrada para XUL na Wikipedia também tem mais algumas informações.


Fast. Scalable. Open.

O Laszlo é uma 'plataforma' que permite o desenvolvimento de aplicações web com 'rich interface' (a última moda no desenvolvimento web: aplicações cada vez mais interativas e com 'cara' de desktop).
Como o JSF, o Laszlo agrega um grande conjunto de 'widgets' gráficos, que vão desde os prosaicos text-fields até componentes avançados que abusam de recursos de animação, dhtml, flash (e outras tecnologias igualmente abusivas). Abusam MESMO. Os exemplos de aplicações são de deixar qualquer um de queixo caído.

Como no caso do JSF, aconselha-se o uso de alguma IDE RAD para desenvolvimento das telas, já que desenhar componentes baseados em XML (e tudo mais) não é uma das tarefas mais simples. Para a alegria dos pobres desenvolvedores a IBM já lançou um plugin para o Eclipse para ajudar nesta tarefa: o IDE4Laszlo

O site (e todo o material do projeto) é muito bem acabado, se comparado com a grande maioria dos projetos open-source. A documentação é extensa e inclui exemplos, tutoriais, e tudo mais que pode se esperar de um bom produto comercial (o Lazslo é um produto 'open-source with commercial support'). O Laszlo foi concebido como um produto fechado, mas teve seu código aberto depois que a Laszlo Systems recebeu um grande aporte de capital, há alguns meses. A tecnologia está sendo testada no Japão, e provavelmente será utilizada na produção de conteúdo para TV interativa no país. E tem muito mais gente usando...

Quer mais? O site onjava.com disponibilizou um bom tutorial sobre a tecnologia, há alguns dias. Quentinho como pão de padaria! Outra ótima referência (menos quente, como pão de supermercado) aqui.

Are generics evil ?

Ken Arnold pergunta se a inclusão de tipos genéricos em Java não foi um engano. Na verdade, ele argumenta que tipos genéricos são um engano, seja em Java, C++ ou C#, por adicionarem pouca coisa à linguagem ao custo de muita complexidade.

Muitas coisas interessantes no artigo. O modelo de tipos genéricos em Java, baseado em apagamento, é bastante controverso. Mas foi uma forma de colocar genéricos na linguagem sem quebrar a compatibilidade. O artigo menciona dificuldades relacionadas à teoria dos tipos, como a definição recursiva das Enums. Também toca no ponto sensível das arrays polimórficas, coisa que tem a ver com covariância/contravariância em linguagens OO. Mas que programadores Java ouviram falar disso ?

O pessoal que gosta da teoria das linguagens de programação no Lambda the Ultimate (excelente blog, por sinal) está discutindo o assunto também.

Map J2ME Applications to Content Types with JSR-211 (CHAPI)

If you've been frustrated when trying to write J2ME apps that communicate with other applications, help is at hand. This brand new J2ME API improves the way mobile devices handle content.


Mock objects

Imagine que vc queira criar testes unitários para uma classe Correio, que envia mensagens através de meios de envio especificados pela interface MeioEnvio. Vamos supor que as implementações disponíveis de MeioEnvio dependam de hardware para funcionar, como comunicação com um dispositivo externo, por exemplo.

Como testar a classe Correio isoladamente e sem escrever muito código? Veja no exemplo abaixo um caso de teste utilizando MockObjects.

public class Correio {

private MeioEnvio meio;

public Correio(MeioEnvio meio) {
this.meio = meio;

public boolean enviar(String mensagem) {
return (meio.enviar(mensagem) == mensagem.length());

public interface MeioEnvio {
public int enviar(String mensagem);

public class Teste extends TestCase {

public void testEnvio() throws Exception {
final String mensagem = "Macarrão";
Mock meio = new Mock(MeioEnvio.class); //1
Correio corr = new Correio((MeioEnvio) meio.proxy()); //2
meio.expectAndReturn("enviar", mensagem,
mensagem.length()); //3

A classe Mock gera uma implementação "falsa" de nossa interface (1), que é passada como parâmetro ao construtor (2).

Devemos então informar ao nosso objeto "falso" o que fazer. Nesse caso, dizemos a ele para aguardar uma chamada ao método enviar, com a string mensagem como parâmetro e retornar o comprimento de mensagem (3).

Por fim, pedimos ao objeto para verificar se as chamadas realizadas foram feitas da maneira correta (4).

Maiores informações podem ser obtidas em Mock Objects.

Veja também este guia de como portar testes da versão 0.08 para a versão 0.09.

Wicket 1.0

Um 'framework de desenvolvido para facilitar a criação de aplicações web com interface complexa'. Páginas construídas com o framework utilizam XHTML simples (de forma que a edição em editores como o Dreamweaver é possível, diferente de algumas novas tecnologias, como a JSF). Mais um framework no (talvez já superlotado) campo dos frameworks web.
De qualquer forma, o site é bonitinho. :P


Java EE e Java SE ?

Despois da mudança de java 1.5 para java 5.0, a SUN gostou tanto da ideia e vai estar mudando o nome de J2EE para Java EE e o J2SE para Java SE. Será esta mais uma tentativa frustrada ?


Ruby on Rails !

Ruby é uma "linguagem dinâmica" orientada a objetos com forte influência de Python e Smalltalk. Apesar de relativamente pouco conhecida, conseguiu fãs com um certo nome na indústria de IT, como os Pragmatic Programmers Andy Hunt e Dave Thomas. É geralmente considerada limpa, expressiva e elegante.

Mas se tem uma coisa que dá para aprender estudando a história das linguagens de programação é que a popularidade delas tem muito pouco a ver com suas qualidades intrínsecas, e muito mais com o seu uso em alguma aplicação que ela torna muito mais simples de usar que as outras.

Agora Ruby já tem sua killer application, e ela se chama Ruby on Rails: um sistema completo para criação de aplicações web que vem ganhando adeptos rapidamente, a maioria dos quais sequer tinha ouvido falar da linguagem antes. Enquanto isso, a comunidade Perl se digladia em torno da versão 6 da linguagem e os pythonistas se mordem de inveja por causa do Rails (não, Zope não conta). Talvez o balanço de poder dessas linguagens se altere significantemente no futuro próximo e, se isso acontecer, o rubi nos trilhos deve ter sido o responsável.

Don't repeat yourself

Acho muito bonitinhos aqueles templates para fontes em que o pessoal coloca nome do projeto, nome do pacote, nome da classe e outras informações no cabeçalho.

Pena que após alguns refactorings aquilo fica tão verdadeiro quanto uma nota de três reais...

Standard Extension API for IDEs

Já esta disponível para revisão incial a tão polemica JSR 198 que visa definir um padrão para os Plug-ins das IDEs. Com isso quando implementarmos um plug-in para o Eclipse ele também poderá ser utilizado no Jbuilder ou no NetBeans. Vale a pena dar uma conferida. Agora fica no ar a dúvida : Será que esta API será necessária, uma vez que o Jbuilder vai passar a usar a engine do Eclipse ?




Um framework de mapeamento O-R e de geração de camadas de DAO (Data Access Objects, uma camada para separar a implementação do mecanismo de acesso a dados do restante da aplicação) bem simples e poderoso. Com o iBatis, você centraliza todas as queries (inserts, updates, selects) de banco de dados em arquivos XML, e utiliza-as na aplicação através de uma classe de gerenciamento de conexões (que também pode controlar transações, pooling, etc, etc). Um framework muito interessante para aplicações que não podem fazer uso de ferramentas de mapeamento O-R direto (como o Hibernate), por qualquer razão (necessidade de queries otimizadas, banco não normalizado, existência de um DBA que é primo do dono da empresa e que não pode perder o emprego.....)

iBatis em 72 segundos

1. XML... (segundos 1 a 63)
A configuração do iBatis é simples, e feita à base de arquivos XML. Para usar apenas o módulo de SQLMapping (i.e., a parte do iBatis responsável por fazer acessos ao banco), você precisa de um descritor XML com as configurações de acesso ao banco. Abaixo, o nosso arquivo ('sql-map-config.xml'):


<transactionmanager type="JDBC">
<datasource type="SIMPLE">
<property value="meu_JDBC_Driver" name="JDBC.Driver">
<property value="URL_do_banco" name="JDBC.ConnectionURL">
<property value="meu_username" name="JDBC.Username">
<property value="shhh_its_secret" name="JDBC.Password">
<property value="15" name="Pool.MaximumActiveConnections">
<property value="15" name="Pool.MaximumIdleConnections">
<property value="1000" name="Pool.MaximumWait">

<!-- pode ter mais de um deste -->
<sqlmap resource="database-queries.xml">

Todas as consultas (e inserts, e updates e todo o resto) ficam nos 'sqlMaps', referenciados por esta configuraçao. No exemplo, definimos uma só query, que retorna um string. O nosso database-queries.xml fica assim:

<sqlmap namespace="database-queries">
<select id="getCustomerName" resultclass="string" parameterclass="int">
select name from CUSTOMER c where id=#id#
O mecanismo de mapeamento do iBatis é bem flexível, e permite, entre outras coisas, mapear result sets para objetos POJO automaticamente, utilizar recursos como iterações ou cláusulas condicionais no meio do SQL mapeado, e por aí vai.

2. Código Java! (segundos 63 a 72)
Juntar os pedaços é uma tarefa igualmente 'no-brainer'. Primeiramente, inicializamos a camada do iBatis:
String resource = "sql-map-config.xml";
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);

Feito isto, fazemos a consulta chamando o <select> mapeado a partir de seu nome, e fornecendo os parâmetros necessários:

String res = (String) sqlMap.queryForObject ("getCustomerName", new Integer(2));

Para mais detalhes e recursos avançados (mapeamento para POJOs, mecanismo de DAOs, transações), o site do iBatis oferece uns bons tutoriais no seu site.
Ah! O iBatis também tem uma implementação disponível em .net (vai ver por isso não chama 'jBatis'. hohohoho...).


Sun Java Wireless Toolkit 2.3 beta

O novo release do toolkit de desenvolvimento J2ME (que antes se chamada WTK, Wireless Toolkit) inclui suporte (beta) a 3 novos JSRs: JSR-179 (Location API), JSR-177 (Security and Trust Services) e JSR-211 (Content handling API). Interessante, muito interessante.
(só não sei quando teremos aparelhos com suporte real a tanta novidade no mercado... :))


Jogos J2ME Open Source

Referência interessante para os interessados em aprender a programar jogos em J2ME...

Regular Expressions

Suponha que você tenha uma string contendo pares nome/valor e alguma formatação e deseje extrair esses dados. Utilizando o pacote java.util.regex, incluso no JVM desde a versão 1.4 é possível realizar essa operação de maneira simples (sim, aquela matéria chata da aula de compiladores serve para alguma coisa!).

Observe o código abaixo. Note que a string content possui dados formatados de maneira aleatória, com quantidade variável de espaços, quebras de linha e tabulações.
String exp = "([A-Z]\\w{1,3}):\\s*(\\S*)(?:\\s||\\z|\\t])";
1 String content = "Val1: 1 Val2: 2 \tVal3: 3 " +
"\rVal4: 4 Val5: 5.5 Val6: 6 Val7: 7";

2 Pattern pattern = Pattern.compile(exp);
3 Matcher matcher = pattern.matcher(content);

4 while (matcher.find()) {
//uma das coisas mais cool do C agora em java! \o/
5 System.out.printf("Match:'%s'\tAttrib:'%s'\tValue:'%s'\n",
matcher.group(0), matcher.group(1), matcher.group(2));
6 }

O primeiro passo para o uso de regular expressions é compilar a sua expressão em um pattern (2). O pattern então é aplicado ao conteúdo, obtendo-se um objeto Matcher, que é o mecanismo de operação (3). A chamada de método da linha 4 procura a próxima ocorrência da expressão dentro do conteúdo. Caso seja encontrada, o parser a armazena em grupos.

Para visualizar melhor o funcionamento dos grupos, vamos considerar o primeiro par. O grupo de índice 0 contém a ocorrência inteira, no caso 'Val1: 1 '. Os grupos são denotados na expressão regular pelo uso de parênteses e são numerados da esquerda para a direita. Ou seja: o grupo 1 contém 'Val1' e o grupo 2 contém '1'. Nesse exemplo apenas 2 grupos são capturados, uma vez que o prefixo '?:' indica um grupo que não gera captura.

A execução do código gera o seguinte output:

Match:'Val1: 1 ' Attrib:'Val1' Value:'1'
Match:'Val2: 2 ' Attrib:'Val2' Value:'2'
Match:'Val3: 3 ' Attrib:'Val3' Value:'3'
Match:'Val4: 4 ' Attrib:'Val4' Value:'4'
Match:'Val5: 5.5 ' Attrib:'Val5' Value:'5.5'
Match:'Val6: 6 ' Attrib:'Val6' Value:'6'
Match:'Val7: 7' Attrib:'Val7' Value:'7'

E todo o parsing é executado em módicos 4,5 ms em um Pentium M 1,6 GHz, em média.

Obs: para detalhes sobre a sintaxe de expressões regulares veja o javadoc da classe Pattern.


Design Patterns Gone Bad

Será que o jargão dos Design Patterns e a implementação de soluções 'rebuscadas', 'escaláveis', 'flexíveis' e 'desacopladas' é mesmo a solução para todos os problemas - mesmo os pequenos e mais simples?


Java Module System

Um novo mecanismo proposto pela JSR-277 pretende substituir o modelo de distribuição de JARs por um novo modelo com melhores capacidades de versionamento, descoberta e carga de dependências e testes de integridade em tempo de execução...


GPL Violations of Miranda IM

Fico me perguntando quantas outras milhões de empresas existem por aí usando projetos open-source por aí e violando as ditas 'licenças' de copyleft...

Open source changing course

It was a big week for open-source news, kicking off with the announcement Monday of partnerships intended to make the LAMP stack more attractive.

The LAMP stack of open-source software--which includes the Linux operating system, Apache Web server, MySQL database and scripting languages PHP, Perl or Python--is pushing its way into mainstream corporate computing.

Start-up ActiveGrid, one of several smaller companies betting on the LAMP stack, on Monday announced partnerships that could help expand LAMP's appeal among big companies. Partners include MySQL, Apache management provider Covalent, Linux company Novell and PHP tool maker Zend

The efforts of companies such as these to make LAMP more of an industrial-strength package--combined with growing interest among corporate customers in open source--are making LAMP a more cohesive and competitive offering to Java and Microsoft's .Net products, analysts say.

fonte: cnet

Java 6.0 on it's way

Poucos meses depois do lançamento do Java 5.0 (Tiger), a Sun já anuncia os primeiros 'public snapshots' do Mustang (um 'minor' release do J2SE). O código do novo release jã pode ser acessado no java.net. Go for it!