25 outubro 2007

JSF Today: Standards versus OSS

It's true to say that JavaServer Faces came to standardize the way developers build user interface, defining a common API to facilitate the creation of components for web development (and other things). For those who don't know, JSF 1.0 (or JSR-127) had Craig McClanahan as Co-Spec Leader together with Ed Burns.

Let me address one point here: I know Ed and he is cool, and I had a cheap talk with Craig at BrasilOne 2005. Both are cool and their work with the community is great. But I must say: JSF was born with the wrong Co-Spec leader.

So, what's the problem of having McClanahan as spec leader? Well, as you may noticed if you had some time with JSF already, the View tier is basically... Struts (version 1). And what's the problem with that? The web development process with Struts is painful, and for large projects can achieve a high level of difficulty and maintainability, by dealing with huge struts-config.xml files, Action Forms and, let's not forget, JSPs bloated with tags (libraries). How do I call this? The Triple Alliance.

Let's understand, from the developer perspective, what this mean. (this will require a flashback of Struts 1)

While coding, the developer has to look and take care of, at least, three files at the same time. And how these three files are connected? With SOP - String Oriented Programming. Yeah. He/She has to create an ActionForm (Java) and/or an Action (Java), declare it in struts-config (XML) and code/maintain the webpage (JSP: Java, Tag Libraries, HTML, etc...). And all properties, names, etc, are binded by typing their names/ids in fields, like:
struts-config: [..] name="myProperty"
Java: getMyProperty()
JSP:
And this is the same process with JSF. You have to code JSP pages with Tag Libraries (XML), you have to code Managed Beans (Java) and you have to declare a lot of things within faces-config.xml. All that with SOP... Triple Alliance! Ok, you can develop JSF with tools, auto-completion, hints and many other features. But why should you need a tool to develop a JSF web application? We want simplicity in the first place, not toolability.

Why I say Struts is not cool anymore and why JSF followed the wrong idea? Because the developer has to know a lot of things, has to control a lot of artifacts, do SOP coding and been dependent of tools. The conclusion: Struts solved several issues but created new ones (JSF). But I must agree, Struts had market acceptance in the past because it was simple to start developing web applications with it. And addressed a hole of ideas and solutions (MVC) that were needed at that time. Craig, contratulations, really. You did an outstanding work here.

I liked Struts, I worked with it for 2,5 years. But, it wasn't a standard. So, let's recapitulate: if we need a standard [to sell tools, training, courses, books, facilitate the introduction of vendors, and not forgetting the ease of components customization], why not stick with what already is a [market] standard? That's why Struts is the base of JSF's View tier. Is this cool? No it isn't!

They took a market standard and turned that into a specification. Tapestry 3 was there, Echo 1 too and both with very cool ideas. Shouldn't Ed and Craig took a look at them? Yes for sure! If JSF 1.0 was a compilation of Struts 1, Tapestry 3 and Echo 1, I think I wouldn't be here. Now, let's talk about the present...

JSF 1.2 (JSR 252) is targeted for JavaEE 5.0. And I don't even see JEE 4 in every customer I go, just like JSE 5, so try to imagine when JSF 1.2 will be world wide deployed. Again, standards are cool, but they lose speed. This spec was delivered at December, 19, 2006 and alternatives like Tapestry, Echo and others, including Wicket, are improving faster than JSF since that time.

OSS frameworks, specially Web Frameworks, keeps demonstrating that the key for a good software is innovation. And from innovation, comes productiveness, because everybody wants to do more with less time. But, to get to innovation, speed is important. Bureaucracy is the enemy!

What JSF 2.0 (JSR 314) offers, and will deliver only next year (target: JavaEE 6, after April 2008), you can get from any framework today. Google Web Toolkit is an example of that. Wicket is another good example. These frameworks grown up faster than anything else, because they aren't standards. They doesn't has to wait for a series of other specs to be launched.

[I can't forget to show you why I think Wicket is cool]

To have productiveness, there must be simplification in the development process and, from the developer perspective, simplification of coding. There's no Triple Alliance in Wicket. There is some SOP, yes, but not in the same way. There aren't tag libraries and no XMLs. It's pure Java and pure HTML. Take a look.

Ed, one advice: invite Eelco, Matijn and the hole crowd of Wicket commiters to a small talk! :D

Post note:
You may think this post is just FUD, you may even think it's just to promote other frameworks like Wicket, which I post about sometimes. But believe me, it's not.

The purpose of this post is to share with you, my ideas and thoughts of why JSF is not cool [yet], why it doesn't has the productiveness I want [and need] and why you should consider moving to some Non-Standard OSS Web Framework. Still, I hope newer releases of JSF, like 2.0, brings ideas from the frameworks I mentioned here.

23 outubro 2007

Filosofia do Wicket

Eelco Hillenius, um dos Core Commiters do framework web Wicket, em um de seus insights sobre desenvolvimento Web:
"Imagine being told that you can use Java as your programming language, but at the same time being told not to create your own classes. [...]
I fail to understand why that has to be different for UI development, and Wicket proves it doesn't have to be so."
Em português:
"Imagine ouvir que você pode usar Java como linguagem de programação, mas ao mesmo tempo ouvir para não criar suas próprias classes. [...]
Não consigo entender porque precisa ser diferente para o desenvolvimento de UIs, e Wicket prova que não precisa ser."
Artigo completo

[]'s!!
miojo

21 outubro 2007

Java BOPE v2.0

Alguns já devem ter visto esta versão. Eu particularmente prefiro esta abaixo, com algumas adaptações e acréscimos (além da censura, é claro):
  1. Homem de preto, qual é a sua missão?!!
    - É aprender Java sem precisar de certificação!!
    Homem de preto, o que é que você faz?!!
    - Eu faço código que assusta o Satanás!!

  2. "Um de vocês é o car****! Um de vocês é o car****! Quem apagou todo o banco de dados foi você! Você que financia essa mer**, seu vi***!"
    -- Programador, revoltado com gerente que pediu em uma semana trabalho de um mês e reclamou quando os bugs surgiram.

  3. - Em Brasília existem 7 empresas de TI. Todas elas dominadas por gerentes burocratas armados de processos ineficientes até os dentes. O programador tem 3 opções: ou passa num concurso, ou começa a fazer POG, ou vai pra guerra. Eu já tava naquela guerra fazia tempo, meu parceiro. E precisava arranjar um substituto...

  4. ... na maior parte dos projetos, só chamam a gente quando a própria equipe do projeto não dá conta de resolver pois é, só que aqui no projeto, isso acontece o tempo todo.

  5. Conversa entre estagiário e gerente Nascimento
    Nas.: "Quem fez isso aqui?"
    Oreia.: "Não sei!"
    Nas.: "Foi você!! Você que mantém essa por**! ... Seu vi***!"
    Nas.: "Agora eu tenho que vir aqui e limpar a ME*** que você fez!"

  6. Aula de Engenharia de Software com o Capitão Nascimento:

    - O Processo Unificado foi criado por Phillip Kurtchen, e começa na concepção, do inglês Inception, que define escopo, que vai para a Elaboração, do inglês, Elaboration, que mitiga os riscos arquiteturais, que vai para a construção, do inglês Construction, que implementa os casos de uso, que vai para a transição, do inglês Transition, que vai para...

    Coordenador: - Capitão, o recurso 23 dormiu, capitão!

    - Sr. 23, segura essa por** desse projeto prioritário aqui, sr. 23. Se você dormir de novo, sr. 23, a por** do Grupo de Garantia da Qualidade vai te explodir, vai explodir seus colegas, vai me explodir, você não quer isso, não é sr. 23, o sr. não vai dormir de novo, não é sr. 23?

    Rec. 23: - Não, senhor! ...

  7. Capitão Nascimento chegando pra resolver problema de build para produção:
    Todo mundo quietinho aí, não vai subir nada não!!!

  8. Cap. Nascimento para o Analista que fez decomposição funcional no caso de uso:
    Você não é analista, você é muleque!!

  9. "Trinta horas pra resolver um bug de mer**? O senhor é um fanfarrão, senhor zero-meia! 30 minutos... Eu disse 30 minutos pra resolver essa mer**!"

  10. "Sr. Designer 32, tira esse preto desse layout por**!!!! Você é muleque!!!"

  11. "Capitão, o aspira 07 não quer fazer POG senhor!!!!"

    "Ah, não quer fazer
    POG não é? Tá com nojinho é? O que você esperava, um diagrama de atividades, diagrama de sequência, caso de uso, documentação do projeto, wireframe e HTML? Pede pra sair!!! Pede pra sair!!!"



    *** Segue a minha contribuição:



  12. Capitão Nascimento e seus colegas avaliam a lista dos candidatos ao BOPE:

    - E esse aqui? No currículo diz Desenvolvedor .NET...

    - Esse eu conheço capitão! Vive deixando código lixo por ae! Aceita qualquer grana pra trabalhar com aqueles produtos...

    - Esse já perdeu antes de começar... Vai sair no primeiro dia!

PS: Quem quer rir, tem que fazer rir!!! :D

13 outubro 2007

Combos com Ajax no Wicket

Fiquei com medo quando tive que alterar uma tela para que ela não fizesse refresh, pra atualizar os dados de uma combo quando uma anterior tinha sua seleção alterada. Qual foi minha surpresa, quando... o código do método refresh era, na verdade, maior que o código
que utiliza o método Ajax?!?! Sensacional!!

HTML
<select id="estados">
<option>Bar</option>
</select>

<select id="cidades">
<option>Foo</option>
</select>

Java
Map cidades = listCidades(); // Mapa de cidades para RJ, SC e SP
List estados = Arrays.asList(new String[]{"RJ", "SC", "SP"});
DropDownChoice ddCidades = new DropDownChoice("cidades", Collections.EMPTY_LIST);

Quem deve receber notificações de seleção para atualizar a combo ddCidades, é a combo ddEstados, criada logo abaixo. Veja o comparativo, entre o código que executa um refresh completo, e o segundo, que utiliza Ajax.

* Código que utiliza Synchronous Server Roundtrip (refresh no browser)
DropDownChoice ddEstados = new DropDownChoice("estados", estados) {
protected boolean wantOnSelectionChangedNotifications() {
return true;
}

protected void onSelectionChanged(final Object newSelection) {
String estado = (String) newSelection;
ddCidades.setChoices((List) cidades.get(estado));
}
};


O método wantOnSelectionChangedNotification deve retornar true, para que o Wicket possa saber que deve gerar um Javascript no HTML de saída, para que seja feito um submit do formulário, sem executar o ciclo de vida do Form. O framework nem atualiza os Models dos componentes, mas mantém o estado da página. Por fim executa o metodo onSelectionChanged(Object) do objeto que sofreu a alteração.

* Código que utiliza Asynchronous Server Roundtrip (AJAX)
DropDownChoice ddEstados = new DropDownChoice("estados", estados);
ddEstados.add(new AjaxFormComponentUpdatingBehavior("onchange") {
protected void onUpdate(AjaxRequestTarget target) {
String estado = (String) ddEstado.getModelObject();
ddCidades.setChoices((List) cidades.get(estado));
target.add(ddCidades);
}
});


Aqui é dito que o componente ddEstados recebe um IBehavior, que será disparado no evento onchange do componente. É importante lembrar que o onchange é do Javascript, e não algo específico do framework.
Quando o Wicket submete a chamada Ajax, ele atualiza a nova seleção, antes de executar o método onUpdate. Por esta razão, é possível acessar o novo valor pelo getModelObject(). Feito isto, as cidades daquele estado são filtradas e a nova lista, atualizada na combo de Cidades. A chave para esta funcionalidade, está na linha
target.add(ddCidades);
Esta chamada indica que este componente deve ser renderizado e atualizado, via Ajax, no HTML. O próprio framework se encarrega de todo o trabalho! Qual a dificuldade? Conhecer a API do Framework... :)

Notaram que... o código HTML não sofreu alteração? ;)

Vejamos alguns números:
  • Código HTML: não sofreu alteração.
    6 linhas escritas pelo programador (LEPP).
  • Código JavaScript: gerado pelo framework; (programador não precisa conhecer JS).
  • Código Java: plain Java. Exige apenas conhecimento da linguagem Java, POO e a API do Framework (como qualquer outro framework)
    Non-Ajax: 9 LEPPs
    Ajax: 8 LEPPs
  • Código XML: zero
  • Uso de Tag Libraries: zero. Wicket não usa essa tecnologia. =)
  • Uso de outros frameworks: zero. Desenvolver Ajax com Struts, por exemplo, geralmente exige integração com DWR, ou outros frameworks similares.

"Welcome to Wicket... Plain Java, Plain HTML... this is Web Development!"

10 outubro 2007

Avisos WWF

Recebi por um amigo e achei sensacional estes avisos do WWF. Acho que conseguiram transmitir bem o recado: "Cuide deste planeta, ou sofra as consqüências!"

Clique na imagem para ver mais...

09 outubro 2007

Wicket in Action: Primeiro Capítulo


Já encontra-se disponível (a algum tempo...) gratuitamente o primeiro capítulo do livro Wicket in Action, série essa de livros técnicos de alta qualidade da Editora Manning.

O livro é assinado por dois dos principais commiters do framework, Eelco Hillenius e Martijn Dashorst. Conferi e posso dizer que o nível de informação está acima das minhas expectativas. Para quem não conhece o framework, esta leitura já elimina muitas dúvidas (mas criam-se novas! a curiosidade mata...).

Outros 4 capítulos já estão prontos, mas estes somente à venda pelo site da Manning.

08 outubro 2007

SOA is not just WebServices



Essa eu dedico a todos os profissionais que exaustivamente tentam mostrar que SOA não é apenas WebServices. "Vai muito mais além disto!" (by Edgar Silva)

Skates Invisiveis

Não sou skatista, mas devo confessar que gosto de ver alguns vídeos. Só não esperava ver um vídeo tão bom como esse, onde skatistas mostram suas habilidades... sem skate! :)



Esta é a cena "Invisible Board" do filme de skate chamado "Yeah Right!". Os skaters foram filmados com skates verdes e estes removidos digitalmente.

from: GoogTube

Ubuntu Countdown

Contagem regressiva para o lançamento da versão mais esperada pela comunidade Linux: faltam 10 dias para a chegada do Ubuntu Gutsy Gibbon.

A versão 7.10 (padrão que diz: Outubro de 2007) apresenta diversas novidades, algumas esperadas a um bom tempo, como:
  • Ambiente 3D - video
  • Configuração visual do X (finalmente!)
  • Suporte a escrita NTFS
  • Troca Rápida de Usuário
Tem mais informação no site sobre este release, em inglês é claro... ;)

PS: coloquei aqui no blog a imagem da contagem, aqui do lado direito superior -->

[]'s!

06 outubro 2007

Wicket aguenta peso pesado

Parece que o mito de que Wicket não serve para sites de grande porte começou a ser desmistificado. O site Thoof.com lançado recentemente e que veio para concorrer com o Digg.com, deve servir como prova de que Wicket está maduro e robusto o suficiente para suportar grande quantidade de usuários, assim como conteúdo.

E parece que o pessoal do Thoof acredita mesmo nisso, pois já criaram até uns vídeos para pegar no pé do pessoal do Digg...



A atenção que a comunidade começou a dar ao framework é tanta que a IBM preparou um tutorial de como desenvolver aplicações Wicket no Apache Gerônimo. Vale lembrar que o framework já é um projeto graduado na própria Apache!

[]'s !
miojo

02 outubro 2007

Ubuntu Weekly Newsletter

Aos interessados, traduzi (ainda que não 100%) a última edição da UWN (Ubuntu Weekly Newsletter) para o português. Quem usa Ubuntu pode ver as novidades através do link:

https://wiki.ubuntu.com/UbuntuWeeklyNewsletter/Issue58/PtBR

[]'s !

Como alterar o MAC Address?

Já me encontrei em alguns lugares, onde a conectividade da Internet era limitada a apenas um MAC Address específico. Como por exemplo, uma Internet a Cabo que associa a conexão ao MAC Address de uma máquina, me impede de utilizar o laptop na rede.

Para resolver este problema, é possível alterar temporariamente o MAC Address da interface de rede. Não sei como nem se é possível no Windows, mas no Ubuntu Linux é simples assim:
# /etc/init.d/networking stop
# ifconfig eth0 hw ether 01:02:03:04:05:06
# /etc/init.d/networking start
É possível efetuar esta troca em qualquer distribuição Linux, mas existem algumas diferenças, como o script networking, que no caso do Fedora, se chama /etc/init.d/network.
Porém, a idéia é a mesma. :)

Divirtam-se!

PS: claro que alterar o MAC Address possui finalidades não muito... digamos... bem intencionadas ;)

01 outubro 2007

Motorolas Voadores

É legal assistir a migração dos Motorolas Razrs durante a primavera. Voando por ae livres pelo ar, em perfeita formação.

Ruim é quando um cai na sua Mercedez... ;)



Fonte: Engadget
Contato

Email:bruno.borges(at)gmail.com

LinkedIn: www.linkedin.com/in/brunocborges
Twitter: www.twitter.com/brunoborges
Comprei e Não Vou
Rio de Janeiro, RJ Brasil
Oracle
São Paulo, SP Brasil