Archive for December, 2005

Servidores de Aplicação Para Interface?

Friday, December 16th, 2005

Esta thread no GUJ me deixou pensando um pouco sobre o papel dos browsers hoje em dia. Será que um browser é um ambiente bom para uma interface de um sistema de transações utilizado diariamente por um profissional (”aplicação comercial”), o que seria melhor que isso?

Há alguns anos atrás (uns 7 anos) eu programava em linguagens desktop como VisualBasic, Delphi e o bom C-zão, mas comecei a estudar tecnologias web. Primeiro o desastre de CGI com PERL, depois ASP/PHP/ColdFusion e só fui largar definitivamente esta vida ingrata com Java, 4 anos depois.

Outro dia eu estava vendo um velho computador do vizinho que eu usei muito por algum tempo (lembro que meu modem queimou minha placa-mãe e fiquei sem computador quase um ano neste período) e achei uns textos antigos que eu usava para marketing dos meus serviços de freelancer (emprego com 15-16 anos só de freela mesmo). Em todos eles eu defendia a praticidade e facilidade de uma aplicação rodando num browser.

Hoje em dia eu tenho minhas dúvidas. HTML é uma grande porcaria para aplicações (é muito legal para sites publicitários, portais, jornais on-line e outras publicações, mas não aplicações). HTTP é uma grande porcaria para aplicações (protocolo sem estado cheio de gambiarras para contornar isso, impossibilidade do cliente deixar um callback para o servidor, request/response apenas). Mas porque esta dobradinha é tão importante até hoje?

É onipresente. Todo mundo tem um browser.

É simples. É fácil. É portável. Você não precisa aprender 30 biblitoecas diferentes para fazer interfaces, se você conhece HTML pode projetar interfaces para CGI, PHP, Java, Ruby on Rails ou qualquer outra coisa. No máximo você tem que cuidar dos 2 ou 3 browsers mais populares.

É extensível. Toda vez que alguém acha dificuldades em fazer uma aplicação cria alguma coisa nova: ActiveX, Flash, AJAX, SVG, Applets, blablabla… em vez de partir para outra alternativa.

E assim o bom o velho dueto HTTP+HTML sobreviveu, inclusive gerando híbridos estranhos. WebServices são guiados por HTTP, mas misturado à um dos sabores de RPC em XML. Algumas pessoas rodam aplicações em HTML (quase) sem HTTP, com páginas estáticas ou geradas por algum script. O próprio fato de muitos sistemas instalarem um servidor web na máquina do cliente mostra que tem algo errado.

Mas voltemos ao tema central do post… HTTP+HTML envolve o uso de um browser. Do antigo MOSAIC que apenas gerava uma visualização gráfica do HTML até hoje, os browsers evoluíram muito.

Todos os browsers modernos possuem uma arquitetura de plugins. Vamos analisar o Firefox. Este browser permite que se escrevam extensões em JavaScript, uma linguagem simples e que todo mundo conhece um pouquinho, e a linguagem de templates XUL. Se você quiser algo mais leve pode ainda utilizar uma extensão chamada Greasemonkey que permite que você rode scripts nas páginas visitadas.

Utilizando estes recursos você pode construir uma aplicação dentro do browser. Não, não é uma aplicação HTML, é uma aplicação dentro do browser (claro que funcionaria apenas no Firefox/Mozilla, ao contrário de HTML puro que teoricamente rodaria em qualquer browser).

O browser se tornou um Servidor de Aplicações para a Camada Física do cliente. Leve, portável, nativo, gratuito e amplamente disponível. Ele oferece serviços a suas aplicações que você teria que implementar sozinho, sua aplicação roda dentro dele.

Isso é bem legal, mas não resolve os problemas originais. Browsers foram feitos para HTTP e HTML, e estes protocolos não foram feitos para aplicações, mas para hipertexto.

O que eu gostaria de ver era algo funcional que oferecesse as mesmas facilidades que alguém tem ao desenvolver uma aplicação no servidor no cliente. Para isso existem alguns problemas:

Protocolo:
Tem que ser algo simples, independente de plataforma e que resolva os problemas mais comuns do HTTP

Linguagem de Templates:
Tão simples quanto HTML, mas poderoso e extensível para criação de widgets novos e manipulação destes

E o principal:

Vencer HTML+HTTP:
Difícil. Milhões de aplicações elgadas, milhões de dólares de investimento anual, milhões de opções para servidores, linguagens, browsers, e tudo mais…

Quando será que nos livraremos da gambiarra?

Caucho Resin Suporta PHP

Thursday, December 15th, 2005

Por enquanto foi no blog do Cameron Purdy (que não é relacionado com a Caucho AFAIK) mas a coisa parece grande:

Parece que o Caucho Resin, uma solução bem mais famosa para Container Web há alguns anos atrás do que hoje (naquela época que o Tomcat era piada) agora suporta PHP. E seis vezes mais rápido do que o mod_php do Apache.

Claro que não existme dados ainda, mas considerando que a JSR 223 (Scripting for the Java Platform que eu tanto cito aqui, trazendo PHP como implementação de referência) já está quase final, é algo esperado.

Eu acabo de ler um livro sobre PERL 6 e Parrot que apesar de meio velinho me trouxe algumas idéias que devo estar escrevendo aqui em breve. Uma coisa é certa: preparem-se. Já começou.

Update: O Dion fala mais sobre o assunto

Ruby on Rails 1.0

Tuesday, December 13th, 2005

O Diego tinha me avisado hoje cedo e o GUJ sai na frente com a notícia do lançamento do Ruby on Rails 1.0.

Para quem não usa um software antes de sair uma versão final (sim, eu conheço pessoas que fazem isso mesmo com software livre) é só fazer o download. Para quem já tem Ruby instalado basta fazer um:

$ gem install rails --include-dependencies

O anúncio no Blog oficial dá mais detalhes e informa uma coisa muito legal sobre este lançamento:

The only thing you need to do to upgrade from 0.14.x is update your Javascripts using “rake update_javascripts”. You’ll be rocking along with Scriptaculous 1.5 and Prototype 1.4.

Spring 2.0 e ActiveRecords

Tuesday, December 13th, 2005

Algumas das funcionalidades do Spring 2.0 foram anunciadas na Spring Experience, uma conferência que eu e você deveríamos ter ido mas não fomos. A novidade que vou comentar aqui é a estrutura de persistência a la ActiveRecord.

Ainda agora a notícia foi postada no GUJ, mas desde cedo venho dando uma olhada na lista do Domain-Driven Design onde as pessoas estão comentando as novidades. A lista do DDD é meio cheia de altos e baixos, mas isso é importante para o público do livro já que a relação entre os Padrões Repository e Entity é sempre debatida.

Já faz algum tempo eu tenho utilizado ActiveRecords em projetos de menor porte, mas não o ActiveRecord puro e sim uma variação que eu apresento na palestra sobre Camadas (e que mês que vem vai estar disponível em forma de artigo).

Vamos a algumas diferenças.

O ActiveRecord original não é nada mais que um objeto que conhece sua representação no Banco de Dados (geralmente uma tabela) e sabe se persistir. Muita gente usa POJOs assim (acreditando, inclusive, que faz parte dos tais “JavaBeans”). isso funciona bem para sistemas *muito* simples.

Falando um pouco do badalado Rails, a implementação de ActiveRecord da RubyForge é uma adaptação do padrão original mas aproveitando o dinamismo de Ruby. Este framework te proporciona facilidades para usar Herança, validação, busca e tudo mais. Também é limitando na escolha do modo como classes são mapeadas para o BD, mas ainda é mais escalável que a implementação original.

A minha implementação em java geralmente se baseia em ter um objeto que conhece seu Repository.

A interface do Repository é da Camada de Negócios, então é algo como ListaUsuarios em vez de UsuarioDao. O que isto implica? Para seus objetos de negócio, aquilo é uma lista, não importa se é persistida ou não. Lembre-se que para objetos de negócio não deve existir (ou pelo menos deve-se esconder ao máximo) a questão da persistência e volatilidade dos objetos. Para a Camada de Negócios ideal os objetos são sempre persistentes.

Essa interface é implementada por um DataMapper em Java EE isto quase sempre significa um DAO.

Então nós temos um objeto que possui métodos como save() e delete(). Isso facilita muito a manipulação destes pela Camada de Aplicação do seu sistema, que precisa apenas chamar os métodos desejados e depois o método de persistência, save() ou delete() (sim, a presença de um método save() é vazamento de lógica de persistência, mas neste caso não existem muitas alternativas viáveis). Toda consulta é feita ao DataMapper, como no modo tradicional.

O grande problema desta abordagem é que ela só funciona com um mapeador O-R decente por trás, como Hibernate. Fazer isto ser performático em JDBC é muito complexo, mas para sistemas que não vão crescer pode valer a pena. Meus planos incluem em um futuro próximo implementar ou pesquisar uma bibliotequinha para estes casos simples onde LazyLoading e atualizações seletivas são um luxo desnecessário.

O uso de Depedency Injection também faz muito sentido neste cenário. Existem duas alternativas básicas: mapear suas entidades como beans gerenciados pelo Spring ou utilizar uma Factory.

Quando o objeto é um serviço, eu mapeio no Spring, quando é uma classe de negócios normal, como Usuario, Pedido, etc., eu uso factories. É apenas uma questão pessoal de odiar mexer em XML, na verdade as duas opções usam Factories. Usando Spring você usa uma Factory genérica do framework que você tem que configurar, na segunda você cria uma Factory que precisa setar os valores do objeto criado (note que sua Factory deve ser um bean do Spring).

Voltando ao Spring, agora você pode marcar uma classe com uma annotation

@SpringConfigured("“)

indicando ao AspectJ que esta é uma classe gerenciada, mas que vai ser inicializada fora da BeanFactory. Note que " deve ser obviamente o id de um bean configurado no seu arquivo XML.

Traduzindo: em vez de utiliza o Spring com ApplciationContext/BeanFactory, você pode simplesmente fazer um :

Meubean b = new MeuBean();

Automaticamente seu Bean já estará configurado.

Muito bom isso, especialmente porque um dos grandes problemas que enfrento com Spring é o “entry point”. Se você não utilizar uma (das muitas) tecnologia(s) como Struts, WebWork, JMS ou qualquer coisa que já seja integrado ao framework, vaia cabar utilizando ApplicationContext.getBean() mais do que deveria.

Problemas? AspectJ. Para que funcio, é preciso que o pós-compilador do AspectJ rode antes nas classes. Isso realmente é *muito* ruim, mas a menos que exista um meio de obtêr um hook na JVM para a chamada ao new, não tem como ser evitado, creio.

Uma coisa engraçada de notar sobre o Spring é que agora que IoC atingiu a massa, nos círculos mais fechados de tecnologia não se tem falado muito dele, mas de outras coisas. É o ciclo sem fim da tecnologia de ponta…

Meu medo hoje é ele seguir exatamente o esquema do EJB 3.0 para configuração. Eu gostaria muito de ter uma alternativa que não enche meu código de negócios com configuração de aspectos. Espero que o Rod Johnson e cia continuem utilizando annotations como tags sempre. Se você está se perguntando “por que me importar com que rumo este framework toma? que venha o EJB3!” lembre-se que o Spring e as idéias que foram documentadas no livro do Rod Johnson mudaram a forma como as aplicações Java EE são escritas há alguns meses atrás, e provavelmente se você pensa isso agora pensava o mesmo antes.

Ainda estou lendo sobre o novo release e vou psotando aqui impressões mais itneressantes, mas é muito elgal saber que mais gente fora do mundo Rails acha que classes com save() e delete() podem ser legais…

Reações Adversas

Friday, December 9th, 2005

Eu não sou um grande admirador do estilo gratuitamente ofensivo e bobo de escrever do Marc Fleury, mas neste último post ele se mostra bastante coerente.

Bea e IBM estão propondo um novo padrão para SOA, e não submeteram este ao JCP. Ora, que mal tem? O JCP não é o único nem o melhor órgão de padrões, não é mesmo?

Claro, mas os produtos mais importantes de IBM/Bea são em Java. O que eles estão fazendo é criar um comitê paralelo. E por que?

Veja quem está no pacote: BEA, IBM, SAP, Oracle e Siebel. Todas empresas de software proprietário. Será uma tentativa de evitar a concorrência do software livre?

Se for, isso já não deu certo diversas vezes. Geralmente o que acontece é que surge uma opção livre melhor e/ou mais acessível que toma o mercado.

Se realmente eles estiverem apenas querendo um órgão não ligado diretamente a paltaforma Java (já que estamso falando de SOA puro), pode ser interessante, mas como serão estes padrões? Quem poderá implementar?

Hoje eu posso ir no site do JCP, baixar uma especificação e implementála. Se eu quiser poder dizer que meu projeto é compatível eu pego uma licença do TCK (Technology Compatibility Kit) que pode ser adquirida com a Sun e geralmente é concedida gratuitamente para projetos livres. Pronto. Exceto o gasto com o TCK, meu produto implementando os padrões está pronto para ser vendido ou disponibilizado gatuitamente.

Será que esse novo comitê vai ter essa liberdade?

Considerando que as reais inovações em Java nos últimos tempos vieram de projetos livres como Hibernate e Spring, essa manobra é perigosa. Você não possui os melhores técnicos do mundo na sua empresa, nem a IBM, Bea ou SAP possuem. Existem pessoas que não trabalhariam para a IBM por dinheiro nenhum (ou quase…), mas aceitariam estar numa mesma JSR.

Eu não sei onde isso vai e atualmente nem está me preocupando tanto. Me parece que é mais um movimento furado para manter os modelos antigos de licenciamento de software.

Como o Fleury mencionou na entrada anterior a que comentei no início, a Sun anunciou ha dois anos que seria um BigPlayer no ramo de osftware proprietário. Acaba de anunciar que vai tornar open-source a grande grande mairia dos seus softwares. O mundo da voltas. E pára no mesmo lugar.

Classes de dados e classes de lógica II: A missão

Thursday, December 8th, 2005

Ha muito tempo atrás, houve uma thread no GUJ sobre Classes de Dados separadas de classes de lógica. O ponto era comentar um arquivo e o autor inclusive foi chamado, porém não pode participar.

Um dos participantes, o já famoso neste blog Renato, mandou uma carta para a revista em questão, que foi respondida. Isso acaba de gerar outra thread sobre o assunto e sem dúvida vale a pena conferir: Classes de dados e classes de lógica II: A missão

RioWUG Explica o WebSphere CE

Wednesday, December 7th, 2005

Se você não sabe das novas vindas da BigBlue, o WebSphere CE não é a versão para você rodar no Pocket PC (piada infame…) mas o geronimo que a IBM resolveu chamar de WebSphere (mais informação aqui).

Se você, como eu, tem diversas coisas apra perguntar para a IBM, tem uma oportunidade chegando. Dia 14 de Dezembro (quarta) é dia da reunião de aniversário do Rio WebSphere User Group e o tema da reunião é o WSCE.

Vou descobrir hoje se vou poder ir ou não (a tendência é que não possa) mas é um evento muito interessante…

Mais detalhes no RioJUG.

Jammin’ Around

Monday, December 5th, 2005

Vou poupar voces de muito mais tietice em cima do pearl Jam, mas vou dizer que valeu cada centavo e esforço e pernas cansadas e tempo e tudo mais. Me arrependi de nao ter visto o show sexta.

SouthAmericanTour

Alugamos um carro e partimos para Sao Paulo (onde desenvolvemos uma tecnica de andar em espiral para conseguir chegar a qualquer lugar). A noite de Sabado foi fechada no Morrison Rock Bar, voltamos domingo e fomos pro show na Apoteose. O melhor setlist foi de Sabado (de sexta, na verdade, mas nao conta), mas o melhor show, com mais energia, foi no Rio.

Hoje de manha eu ja tinha entrado no site da banda e comprado os dois CDs. Alias, tentando voltar para o assunto principal do blog, esta forma de distribuiçao de musicas merece aplausos. Voce vai ao show e no outro dia pela manha baixa todas as musicas em MP3, a capa do CD, fotos e tudo mais. Simplesmente fantastico e tudo isso por R$20,00, bem menos que um CD bootleg oficial normal (que vira MP3, vai pro iPod e depois junta poeria eternamente na estante).

VedderHailsSaoPaulo

Schwartz Explica a Sun Livre

Monday, December 5th, 2005

John Schwartz falou no seu blog sobre a liberaçao de software como OpenSource.

O ponto dele eh claro e pode ser resumido assim:

The point being, Sun doesn’t have a single customer, worldwide, that will run an unsupported product in their datacenter. Do such customers exist? Surely. They’re called developers. Or startups. Or companies or economies that want to build their own internal support teams…

Opening up Solaris and giving it away for free has led to the single largest wave of adoption Solaris has ever seen - some 3.4 million licenses since February this year (most on HP, curiously). It’s been combined with the single largest expansion in its revenue base. I believe the same will apply to the Java Enterprise System, its identity management and business integration suites specifically. Why?

Because no Fortune 2000 customer on earth is going to run the heart of their enterprise with products that don’t have someone’s home number on the other end. And no developer or developing nation, presented with an equivalent or better free and open source product, is going to opt for a proprietary alternative.

Let’s get out of here…get out of here fast…

Friday, December 2nd, 2005

Em alguns minutos estarei deixando o Rio em direção ao show de amanhã no Pacaembu. Volto domingo direto para o show na Apoteose.