Mostrando postagens com marcador Java. Mostrar todas as postagens
Mostrando postagens com marcador Java. Mostrar todas as postagens

15 Julho 2008

Prepare-se para o JustJava 2008

Dicas10 a 12 de Setembro de 2008
São Paulo - SP
Chamada de Trabalhos
http://www.sucesusp.org.br/justjava2008/

Hoje o JustJava já está em sua 7a edição. E desde 2003, o evento é um sucesso no Brasil. Veja alguns pontos altos que se pode encontrar:

  • Muitas palestras técnicas e de boa qualidade (ok, já teve algumas ruins também)
  • Muita troca de experiência e cultura de trabalho (networking!)
  • Discussões sobre um tema nas muvucas, onde tinhamos até uma cerveja para acompanhar (hoje vai ser difícil com a nova lei de transito)
  • Aprender novidades, com outros feras no assunto

Então veja abaixo, um pouco mais sobre um PR do evento e o convite para submeter palestra.

O Evento

O JustJava é um evento técnico, feito por brasileiros, para brasileiros, e apresentado por desenvolvedores, para desenvolvedores!

O objetivo do evento é mostrar o que esta está acontecendo no mercado Java no Brasil, quais são os projetos Java mais importantes, como o desenvolvedor brasileiro tem usado a tecnologia, e principalmente, incentivar a integração daqueles que fazem a tecnologia Java crescer no Brasil - os desenvolvedores.

Você não pode ficar de fora do JustJava - o Evento Java da Comunidade Brasileira, e o grande evento de Java do ano no Brasil.

O JustJava, já na sua sétima edição, é o principal evento técnico realizado pela Sociedade de Usuários Java, um dos mais ativos grupos de usuarios Java do Brasil. Na primeira edição, o JustJava foi o maior
evento de Java realizado ate então no Brasil!

Venha ser um palestrante

Se você quer apresentar uma palestra no JustJava, o momento de submissao é agora. Ate o dia 18 de julho, estaremos recebendo e avaliando as palestras para compor e montar um evento técnico de alta qualidade.

Se você tem um projeto inovador e quer mostrar suas soluções criativas para os problemas encontrados, se você quer aprofundar as discussões sobre a tecnologia Java, seja um palestrante no JustJava.

Para submeter sua palestra, preencha o formulário que se encontra no site abaixo, na opção "Chamada de Trabalhos"

http://www.sucesusp.org.br/justjava2008/

Outras informações

http://www.soujava.org.br/display/v/JustJava+2008

Link para este post

25 Junho 2008

URLs simples no Wicket e o novo Eclipse

Uma das coisas bacanas no Wicket é a possibilidade (extremamente simples) de definir URLs RESTful, ou apenas "URLs simples" para as páginas do sistema.

No artigo Wicket Creating RESTful URLs é possível ver como o framework provê de forma bem objetiva, na API, esta funcionalidade. Mas, resumindo: se você quer definir URLs mais amigáveis, diferentemente dos padrões do framework, que são mais ou menos assim:

http://www.example.com/wui/?wicket:bookmarkablePage=%3Anl.stuq.demo.SomePage
É possível deixá-las assim:
  • http://example.com/users/
  • http://example.com/users/{user}
A facilidade de desenvolver, em puro Java, com este framework é o que faz a diferença dentre tantos frameworks Web. O padrão ZeXCo, ou apenas... Zero-XML-Configuration, mais uma vez mostra-se eficáz.
  public WicketApplication() {
Class pageClass = ProductDetailPage.class;
String[] params = new String[]{"id"};
MixedParamUrlCodingStrategy productURLS = new MixedParamUrlCodingStrategy("products", pageClass, params);
mount(productURLS);
...
Isto é o suficiente para acessar a página desta forma: http://example.com/products/23. Onde: "products" indica a página e "23" é o id passado via parâmetro para a classe. Agora, como interceptar este parâmetro? No construtor da página é preciso receber o objeto PageParameters:
  public ProductDetailPage(PageParameters params) {
String id = params.getString("id");
Product product = productService.loadById(id);
setModel(new CompoundPropertyModel(product));
...
}
Pronto! Agora as URLs estão beeeeem bonitinhas... :-P


E para terminar o post, recebi o e-mail agora sobre o anúncio do lançamento do Eclipse Ganymede (nome meio ... gay, não? - mas para os curiosos, Ganymede é uma lua de Júpiter). O pacote oferece um release único e integrado de 23 projetos da Eclipse Foundation.

Há também um concurso para os melhores blogs que postarem sobre o Ganymede; não adianta ser apenas um comentário; o que eles querem mesmo são reviews bem detalhadas... eu to fora! Mas se você quiser participar, acesse a página Ganymede Around The World.

É isso. Agora, é fazer o download do Eclipse Ganymede, do Apache Wicket 1.4m2 e desenvolver aplicações Web com maior produtividade, qualidade e diversão! :D

[]'s

Link para este post

19 Junho 2008

HP inicia desligamento de profissionais da EDS

Extra! Extra! HP compra a EDS! ... Você não soube disso?! Ora, em que mundo você vive? :-) O mercado de TI está super aquecido. É o Yahoo! com quedas consecutivas no valor de suas ações, a Microsoft tomando na cabeça com (outro tipo de) ações: anti-truste; o Google dominando o mundo (que logo logo, comprará o Yahoo! - só está à espera de um preço justo nas ações... aguarde).

Bem, notícias antigas e previsões deixadas de lado, a última notícia é que o óbvio aconteceu: a HP ordenou o fechamento de escritórios da EDS. Por enquanto, o primeiro de que tenho notícias é aqui no Brasil. O escritório da EDS em Florianópolis encerrará suas atividades nos próximos 2 meses. Bom para a HP, bom para o mercado, péssimo para os profissionais de Florianópolis, que irão saturar o mercado local que hoje conta com pouca oferta de trabalho. Resultado: salários baixos para a área de TI na Ilha da Magia. Mas será que isso é realmente bom para o mercado?

É triste ver a cidade com o maior potencial tecnológico hoje no Brasil, ter ótimos profissionais sendo mal remunerados por empresas que instalam na ilha somente as equipes de desenvolvimento, enquanto negociam em São Paulo, Rio de Janeiro, Brasília e no exterior, contratos exorbitantes sem valorizar justamente seus profissionais. Se você não conhece, o mercado de Florianópolis oferece hoje uma média salarial de R$ 2.500,00 para desenvolvedores Java Pleno. Achou muito? Talvez se você acabou de sair da faculdade e possui 1 ano de experiência com a tecnologia, pode parecer. Mas acredite, em outras cidades com custo de vida similar ao de Florianópolis (Rio, Sampa e Brasília), este profissional atinge salários de até R$ 5.000,00, com média de R$ 4.500,00. Hmmm... quase 100% a mais!! Isso significa que se você trabalhar para uma empresa em Floripa que fecha contrato em São Paulo, esta empresa possui um faturamento quase 100% maior que as outras. Acha justo? Ilegal não é, é verdade. Mas se o profissional sabe que recebe um salário injusto, trabalhará desmotivado e estará constantemente em contato com outras empresas para melhorar seu salário: emprego temporário foi o que você, empresário, deu a ele.

Estas empresas com frequência reclamam da dificuldade de encontrar bons profissionais, e quando encontram querem oferecer salários de mercado ou até mesmo abaixo disso. Pessoal do RH, aqui vai uma dica: ofereçam salários justos para os profissionais e vocês não terão que anunciar a vaga novamente após 6 meses, quando este profissional receber uma oferta melhor. Outra dica ao pessoal de RH: dêem reajustes salariais anualmente, quando vocês possuem dinheiro em caixa para uma nova contratação com teto salarial superior autorizado pela gerência: é melhor manter um bom profissional do que ter que adaptar um novo ao ambiente da empresa.

Os profissionais da EDS atendem um nicho de mercado aquecido: desenvolvedores Java, Cobol, .NET; DBAs Oracle, gerentes de projetos e analistas. É possível ter um time completo para um novo projeto com estes profissionais - todos muito bem qualificados. Se você que lê este blog é de algum RH, entre em contato comigo que farei ótimas indicações. Se você é profissional da área e está em Florianópolis, cuidado com as ofertas: não aceite qualquer barganha. =)

[]'s!

Link para este post

18 Junho 2008

Simplifique SOA com Apache CXF


Então você quer simplificar o desenvolvimento da sua arquitetura SOA? Apesar de já ser possível, agora ficou mais seguro. O projeto Apache CXF - união entre os projetos XFire e Celtix - se torna hoje um projeto maduro na Apache Foundation, deixando a Incubadora de lado para se tornar um dos frameworks mais completos para a operabilidade de Web Services, principalmente para arquiteturas SOA.

A facilidade de integrar o Apache CXF em ESBs como o Mule e seu primo Apache ServiceMix, o torna a principal opção na hora de optar pelos produtos em uma arquitetura SOA.

Àqueles que ainda não conheciam, o CXF existe já a algum tempo, graças a empresa IONA que decidiu unir seu código, cujo suporte a JAX-WS, WS-* e CORBA preenchia as lacunas que o XFire possuia, para dar vida a um stack completo, robusto e maduro para um dos melhores Web Service Frameworks do mercado.

Os trabalhos que realizei com o XFire para implementar Web Services foram bem sucedidos e rapidamente implementados. Agora, é garantido dizer que com o Apache CXF, soluções SOA podem ser atingidas com custo zero, confiança, escalabilidade e grande facilidade de implementação, customização e otimização.

Talvez gastar com aquele produto mágico que se diz pronto para implantar não seja a sua única saída para injetar SOA na comunicação entre seus projetos e produtos.

Dúvidas? Clique aqui!

PS: prometo, num próximo post, apresentar um exemplo de ServiceMix ou Mule com o Apache CXF... :-)

[]'s!

Link para este post

04 Junho 2008

Java Generics chateia desenvolvedores: muito código!


Aos que acompanham o framework web Apache Wicket, devem ter notado que o branch 1.4 progrediu para ser compatível somente com Java 5 e superior. Isto significa uma evolução, não apenas na minha opinião mas na de muitos outros usuários da Wicket User List e é claro a dos committers. Deste modo, novos métodos, classes e sintaxes podem ser utilizadas pelo framework, reduzindo seu código no Core e facilitando o seu uso. Até a versão 1.3.x, o framework era dividido entre módulos com suporte até Java 1.4, e outros somente para Java 5 e superiores, como o Wicket Spring Annotations. Hoje, todos os módulos que eram separados desta forma, foram unidos e hoje temos somente, por exemplo, Wicket Spring (já com as anotações lá dentro.) Veja as novidades aqui.

Fora as novidades comuns do Java 5, praticamente todo o framework foi generalizado, pois devido a duas classes importantes, a Component e a IModel, serem diretamente relacionadas e sendo esta última, a que provê os dados para a Component, o uso de Generics foi aplicado, tornando estas como: IModel<T> e Component<T>. Isto implicou em mudanças em diversas partes do código é lógico. Métodos como:


  • T IModel.getObject();
  • T Component.getModelObject();
  • Model<T> Component.getModel();
introduziram o conceito de Generics de forma elegante, pois agora o tipo do objeto contido no IModel, e consequentemente no Component, era conhecido - type-safe. Porém, após muitos migrarem seus aplicativos para a nova versão, começou-se uma longa discussão a respeito das reais vantagens do uso do Java Generics. Muita gente começou a reclamar da quantidade de vezes que era necessário declarar o tipo, como no exemplo abaixo:

TextField<String> txtNome = new TextField<String>("nome", new PropertyModel<String>(usuario, "primeiroNome"));

Tudo isso para ter estas facilidades:

String nome = txtNome.getModelObject(); // type safe cast
String nome2 = txt.getModel().getObject(); // type safe cast

Generics começou então a torrar a paciência de muita gente que até então, adorava o framework pela sua simplicidade e modelo Java puro que nos levava até a obter uma certa diversão na codificação. Conclusão: Generics deixou o framework chato de codificar. Ter que indicar 3 vezes que o component vai mostrar uma String, é insano.

A discussão começou na Wicket Dev List no dia 07 de Março deste ano, pelo Eelco que questionou justamente o que coloquei de exemplo aqui, como vocês podem ler aqui. Sua preocupação não foi em vão, entretanto. Outras discussões nasceram sobre diversos outros casos onde a redundância de tipagem chateava o desenvolvedor. O assunto tomou proporções absurdas quando decidiram questionar os usuários do framework na User List. A discussão iniciada em 01 de Junho pelo próprio Eelco, entitulada "users, please give us your opinion: what is your take on generics with Wicket" já consta com mais de 180 respostas de todos os tipos: usuários chateados, contentes, com sugestões ou desaprovações totais ao uso de Generics.

No dia 2 de Junho, Jonathan Locke postou em seu blog o artigo "Wicket and generics and the end of Java" que causou uma repercusão absurda no The Server Side, com mais de 100 respostas, até algumas calorosas, sobre o uso ou mau uso de Generics.

Hoje, não se tem ainda a conclusão do quê a galera do Wicket vai fazer a respeito de Generics no Core, mas se lermos as discussões citadas acima, fica claro o descontentamento dos desenvolvedores Java com a verbosidade absurda que Generics introduziu no código. A última que lí é que pelo menos no Java 7, isto já será possível:

Bar<Foo> bar = new Bar(fooObject);
Foo foo = bar.getObject();

Se resolve todos os problemas? Definitivamente não. Ainda tem muita coisa para ser discutida. Talvez no Java 9 fica pronto! :-)

[]'s!

Link para este post

08 Maio 2008

'org.apache.maven.plugins:maven-archetype-plugin' does not exist

http://maven.apache.org/images/maven-logo-2.gif O dia começa, e preciso iniciar um projeto. De costume, chamo o archetypedo Maven e o bendito me apresenta um erro dizendo que não encontra o plugin. WTF ?!

$ mvn -e archetype:generate
+ Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] The plugin 'org.apache.maven.plugins:maven-archetype-plugin' does not exist or no valid version could be found
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: The plugin 'org.apache.maven.plugins:maven-archetype-plugin' does not exist or no valid version could be found

Solução: apague o repositório local do Maven. :D Achou uma solução pesada, porque terá que fazer o download dos artefatos novamente? Bem, nesse caso "adivinhe" onde o jar do plugin deveria estar, e apague pelo menos esta pasta.

$ rm -rf ~/.m2/repository/org/apache/maven

[]'s!

Link para este post

07 Maio 2008

Nexus: repositório inteligente para Maven

Finalmente, um gerenciador de repositórios Maven inteligente! :D

Rápida instalação, configuração e customização. O mais importante: independente de qualquer outro produto (não precisa de uma instalação de Tomcat, ou Apache, nada...)

Além disso, possui uma interface administrativa muito intuitiva, simples e agradável aos olhos, diferente do Archiva e de outros... :D Está ae a dica aos que usam massivamente o Maven!

Nexus Homepage

[]'s


Link para este post

28 Abril 2008

NetBeans 6.1 lançado

http://www.netbeans.org/images/v5/nb-logo2.gif
Apenas para deixar registrado que a liberação ocorreu as 7:00 desta manhã de segunda-feira. :-)


http://www.netbeans.org/images/v6/dl-nb-ide.gif


[]'s!

Link para este post

24 Abril 2008

Modularize seu projeto com Maven

Postei isso no Blog da Summa Technologies, onde ainda trabalho, mas gostaria de manter estas informações registradas no meu blog, e por esta razão duplico-o aqui... :)


Organizar um projeto em módulos não é uma má idéia. Colocar um pacote em outro projeto, gerar um jar e fazer a dependência deste num projeto maior, agregador dos módulos, realmente não é complicado (se você entendeu tudo que escrevi!). O desafio aqui está em definir um modelo de release para o projeto e automatizar este processo. O Maven permite isto de uma forma inteligente, descomplicada e organizada. O sofrimento? A documentação de como obter e implantar este processo é pobre.

Após implantarmos este processo em um de nossos projetos, optei por compartilhar aqui o desafio que atravessamos, algo que é de conhecimento aberto a todos, mas que a documentação do Maven não apresenta com clareza.

Preparação


Antes de vermos com detalhe as definições dos POMs, é importante que haja uma noção da arquitetura do Maven e como é o seu funcionamento. Vamos tomar um exemplo quase igual com o que consta na pequena documentação:
-+ myProject/
-|- pom.xml
-+- common/
-|-- pom.xml
-+-- src/
-+--- main/
-+---- java/
-+- web/
-|-- pom.xml
-+-- src/
-+--- main/
-+---- webapp/

Repare que, além do POM principal, para cada módulo existe um POM (pom.xml). No POM raiz, é onde definimos quais os módulos do projeto:
<project>
..
<groupId>summatech</groupId>
<artifactId>myProject</artifactId>
<version>1.0-SNAPSHOT</version>
<name>My Maven Project</name>
<modules>
<module>common</module>
<module>web</module>
</modules>
..
</project>

Desta forma, ao compilarmos, através do Maven, o projeto myProject, este identifica módulos que também devem ser compilados. O processo então será o de executar o mesmo Goal executado em myProject nos subseqüêntes módulos. Caso o goal chamado install seja executado, será gerado pelo Maven os jars dos projetos e ainda o war do projeto web. Temos a partir de agora, uma única chamada para compilar todos os módulos e sub-módulos (sim, é possível definir sub-módulos, mas esse tópico fica para outro post.)

Herança de Dependências Comuns


Outro ponto importante na utilização de módulos, é a possibilidade de poder-se definir no POM principal, configurações de dependências (de outros projetos - como Hibernate) comuns a todos os módulos. Para definir as dependências comuns, vamos tomar um exemplo. No POM principal, inserimos a dependência ao Hibernate assim como em qualquer outro projeto Maven:
<project>
..
<name>My Maven Project</name>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
</dependency>
</dependencies>
..
</project>

Além das dependências, configurações de plugins e outros dados podem ser herdados; mas não entrarei em detalhes agora.

Para que os módulos herdem esta dependência do Hibernate, ainda falta um último passo: é necessário que seus POMs façam referência ao parent - ao POM principal. Tomemos por exemplo o POM do módulo common:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<name>Common Classes for My Project</name>
<parent>
<groupId>summatech</groupId>
<artifactId>myProject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<packaging>jar</packaging>
</project>


Repare que não foi necessário incluir a tag groupId, já que este atributo será herdado do POM raiz e, afinal de contas, é um módulo e por esta razão, não faz sentido pertencer a outro grupo diferente do de myProject. Além disso, o módulo common também herdou a dependência do Hibernate automaticamente.

Este é o primeiro passo para a modularização de projetos com Maven. Em outro post, apresentarei detalhes sobre como, no módulo web haver uma dependência do módulo common, sem ter que alterar a version manualmente quando há nova versão do módulo. Em um terceiro post, apresentarei o processo para gerar uma versão do projeto modularizado através do Maven.

Até!

Link para este post

16 Janeiro 2008

Sun compra a MySQL AB

Aos desinformados, MySQL AB é o braço comercial do banco de dados livre mais famoso, o MySQL. A Sun adquiriu a compania pela bagatela de 1 bilhão de dólares e certamente, encontrar-se-á numa posição privilegiada, visto que este é o banco de dados mais utilizado na Web e principalmente por grandes portais como Facebook, Google, Nokia e muitos outros.

Maiores informações:

[]'s!
miojo

Link para este post

19 Dezembro 2007

Whiteboard dos frameworks Web

Neste post do Enter The Jboss Matrix, o autor Shaun Connolly apresenta o resultado de um whiteboard poll, sobre o uso de Application Servers e Web Frameworks. O resultado apresenta forte liderança pelo JBoss e JSF.


Vou falar aqui sobre os resultados da votação de Web Frameworks. Vendo este whiteboard, levanto algumas questões:

  • Porque JSF é lider?
  • Porque tem gente que ainda utiliza Struts e Struts 2?
  • Quem são os malucos que utilizam Spring MVC?
  • Que tipo de desenvolvedores utilizam Tapestry?
  • Porque em tão pouco tempo, o uso do Wicket cresceu a ponto de ultrapassar Tapestry, Grails e Rails?
Perguntas pertinentes, que me arrisco a dar algumas respostas neste post que, sem dúvida será bem controverso. :)

Porque JSF é lider?
Para mim, o principal motivo é simples: JSF é uma especificação definida pelo JCP. Isto favorece a adoção por grandes empresas e projetos que preferem algo padronizado e que possui uma grande oferta de cursos, livros e produtos.

Mas me questiono: o JavaServer Faces puro (Reference Implementation) não tem nada demais. A produtividade com ele é baixa, o suporte das IDEs só é bom quando amarrado a componentes de terceiros e como comentei num post anterior, usa-se muito SOP (String Oriented Programing.) A solução para torná-lo verdadeiramente produtivo é sempre abraçar algum framework JSF mais robusto (leia-se: mais componentes e uma arquitetura engessada), como o JBoss Seam, Oracle ADF Faces ou o da Sun (experimente o NetBeans 6 e notará que vários componentes são específicos da Sun... não sei exatamente de onde vem, qual o projeto, mas sei que tem.)

Abraçar um produto JSF implica em se amarrar a este produto e seus componentes customizados, não podendo mudar de Vendor assim como é prometido pela especificação e tantos desenvolvedores, gerentes e arquitetos ainda, sendo enganados pelo marketing, acreditam.

Sei, e concordo, que há espaço para o JavaServer Faces, mas vamos parar com o euforismo de que JSF é produtivo, padronizado e livre de implementação, ok? Ninguem mais vai trabalhar com JSF RI. A solução será sempre escolher entre uma especialização ou outra (Seam, ADF, etc ...) para tornar essa máxima verdadeira.

Porque tem gente que ainda utiliza Struts e Struts 2?
Desenvolvi em Struts 1.x durante boa parte da minha carreira, e assim como postei da outra vez, acredito que foi-se o seu tempo. Entramos numa era de programação baseada em componentes, e não actions. Reutilização de código na composição de paginas agrupando componentes: este sim é o modelo de hoje (visto no JSF, no Tapestry, Wicket e alguns outros).

Então porque tem gente que ainda utiliza Struts e Struts 2? O primeiro é simples: manutenção. Tem muito sistema que foi feito em Struts e por falta de tempo ($$) não existe o interesse em migrar para outro framework (nem que fosse o Struts 2). O segundo fica difícil de dizer exatamente o porque, mas me arrisco a dizer que é pelo simples fato de ser a junção de duas fortes comunidades (Struts e WebWork) que são devotos do modelo Action-based. Esta comunidade está presa a um modelo de construção Web, onde se sintam confortáveis e confiantes na hora de construir suas telas. Eu entendo. Já me senti assim um dia... :) Mas só por um dia.

Acho que o número de projetos em Struts e Struts 2 diminuirá com o tempo. Minha previsão é que, assim que JSF 2.0 sair oficialmente, teremos uma queda drástica na adoção de Struts 2 como framework web para novos projetos. Deste modo, dois frameworks irmãos irão se encontrar no limbo da manutenção.


Quem são os malucos que utilizam Spring MVC?

Alguém ae utiliza Spring MVC? Por favor, comenta aqui quais os motivos que o levaram a adotá-lo! Porque eu não faço a menor idéia. Na minha opinião, é apenas um Action-based amarrado ao Spring. O que ele tem que outros frameworks neste modelo não oferecem?

Deixo a resposta desta pergunta para os comentários... :)

Que tipo de desenvolvedores utilizam Tapestry?
O tipo que quer correr riscos e gosta de seguir um Pastor. O risco de sair uma versão nova com mudanças tão grandes na API que o forçam a duas únicas opções: ficar largado na versão anterior ou migrar para a última. Se você não sabe, o Tapestry é escrito praticamente, por um único desenvolvedor chamado Howard Lewis Ship. Isso implica que, se o cara decidir (como já fez entre as versões T3, T4 e T5) ter idéias novas e implementá-las, ele o fará sem dó nem piedade da comunidade que utiliza o framework.

Minha sugestão: fique longe de frameworks sem compromisso com seus usuários.

Porque em tão pouco tempo, o uso do Wicket cresceu a ponto de ultrapassar Tapestry, Grails e Rails?
Foi uma surpresa para muitos, quando o framework foi incorporado pela Apache rapidamente. O processo na incubadora foi rápido, o que demonstra a maturidade e o compromisso dos desenvolvedores. Além disso, é notável ver que este compromisso é diário visto o número de dúvidas respondidas (muitas até instantâneas via IRC) pelos commiters e usuários avançados.

Não há como negar que a comunidade Wicket já está consolidada, ao ponto de ultrapassar a do Tapestry e Grails. Mas não basta ter comunidade (voltemos ao exemplo do Struts), é preciso mais que isso. Aos que já colocaram seus dedos em algum exemplo de Wicket, viram o quanto é produtivo e rápido a construção de telas e componentes genéricos. Mas ainda, não é isso que atrai novos adeptos ao framework. É divertido desenvolver com Wicket.

Foi-se o tempo de apanhar para XMLs e Strings escritas por engano. Ou de taglibs monstruosas cheias de parâmetros. O conceito de POJO + POH é o que faz a diferença em relação aos outros frameworks. Some isso a uma API bem moldada a ponto de ser comparada com a do Swing, e você terá uma facilidade incrível para entender os métodos e classes do framework.

Para 2008, o plano é apresentar ainda mais a capacidade do Wicket a vocês que frequentam este blog. Não que eu queira iniciar uma religião com isso, mas apenas mostrar que existem alternativas mais produtivas. :)

[]'s
miojo

Link para este post

12 Novembro 2007

Java 7 with Chained Invocation

This weekend Claudio Miranda, a friend and co-worker of mine from Brasília, came to São Paulo to assist give a presentation about "Tools and Tips to Solve Performance Issues in Java Applications" (yes, this is his presentation name) at Conexão Java. After some beers and talks about Java, I introduced him an idea I have been thinking about for a few days.

In Ruby, the return statement is implicit. In Java, we always have to declare which return type the method has. But what's happening is that this kind of method declaration is becoming common these days:

class Foo {
public Foo doSomething() {
...
return this;
}
...
}

This gives us a shortcut to do some chained invocations, for example:
Foo foo = new Foo().doSomething().doAnotherThing();

To give developers a better shortcut, my idea is to let them code methods with return type declared as "this":
    public this doSomething() {
...
}

After I showed Claudio my idea, he told me somebody already thought something like that, and there's a lot more suggestions than just this one. So don't think this is a worthless improvement. Somebody else thinks the same as I do :D

The difference between my suggestion and the one from Matthias Ernst, is that void would continue to be void. No return. The use of this, which has the concept of the current object,
would be convenience and not something magic, as declaring void and expect that to return the object itself. Another great interesting point to look is the integration with Covariant Types.

Let's take the Bar example:
class Bar extends Foo {}

// with current JSL and explicit return this; this would not compile
Bar bar = new Bar().doSomething();

// to fix, you must explicitly cast the returning object
Bar bar = (Bar) new Bar().doSomething();

Mixing implicit return this and covariant types, no cast is needed and we would have chained invocations easily! Besides, this is a small change into Java Compiler. The generated bytecode should be compatible with Java 1.3. Comments?

Link para este post

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.

Link para este post

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

Link para este post

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)

Link para este post

27 Setembro 2007

Salvando arquivos no BD com JPA

Para aplicativos gigantescos, que armazenarão grande quantidade de arquivos, tenho uma opinião formada: guarde no banco apenas o local em disco do arquivo! Mas, para algumas pessoas, ou para projetos pequenos, a opção de guardar binário no banco parece ser um tanto quanto... interessante. É verdade dizer que facilita o back-up. Basta fazer um dump e pronto.

Para que uma entidade persista um arquivo binário no banco de dados, basta que a coluna seja mapeada com o tipo byte[] e a anotação @Lob, como no exemplo abaixo:

@Entity
public class Attachment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Basic(nullable=false)
private String fileName;

@Lob
private byte[] content;
// getters and setters
}

O problema que encontrei nesta configuração básica, é que o tipo da coluna gerada pelo export do Hibernate, é BLOB. Este tipo está limitado a apenas 64K (65.536 bytes) no MySQL. Para aumentar este limite, foi preciso especificar um tipo DDL (específico por Banco de Dados). Que ficou assim:

@Lob
@Column(columnDefinition="MEDIUMBLOB")
private byte[] content;

Este tipo está limitado a 16 MBytes (16.777.216 bytes), o que no meu caso é mais do que o suficiente :)

[]'s!

Link para este post

28 Julho 2007

Summa-Tech.com oportunidades!



Pensando em "novos desafios"? Ou talvez mudar de time? Envia o curriculo para a Thais e vem trabalhar com a gente... :) Dá uma olhada:

Estágio

Curso:
  • Engenharia da Computação e afins
  • Ciências da Computação
  • Sistemas de Informação
Requisitos Técnicos:
  • Desenvolvimento de aplicações em JAVA

Mandatório:

  • Conhecimento em OO
  • Lógica e programação e Conhecimento de Algoritmos

Desenvolvedor Junior

Experiência:
Acadêmica ou profissional nos desenvolvimento de aplicações Java

Recém-formado:

  • Engenharia da Computação e afins
  • Ciências da Computação
  • Sistemas de Informação

Requisitos Técnicos:

  • Conhecimento de OO
  • Linguagem Java
  • Lógica de programação, Conhecimento de Algoritmos e Estrutura de dados
  • SQL Básico

Desejável:

  • Tecnologias Java JEE
  • Tecnologias Web
  • Unix (Linux, BSD, Solaris...)
  • IDEs Java: Eclipse, Netbeans etc.

Diferencial:

  • Sun Certified Java Programmer

Desenvolvedor Pleno

Experiência:
Profissional nos desenvolvimento de aplicações Java JSE

Formação:

  • Engenharia da Computação e afins
  • Ciências da Computação
  • Sistemas de Informação

Requisitos Técnicos:

  • Conhecimento avançado em Java SE
  • Sockets
  • IO / NIO
  • Multi-threading
  • Protocolos de Rede
  • Programação Concorrente
Desejável:
  • Java 2D/3D
  • Flash
  • Tecnologias Java EE
  • Tecnologias Web
  • Sistemas Operacionais: Windows e Unix
  • Bancos de Dados Relacionais

Diferencial:

  • Sun Certified Java Programmer
  • Sun Certified Java Developer
É isso... :)

[]'s
miojo

Link para este post

12 Junho 2007

Wicket: Highlight current Menu with Generics!

Yeah! The title sounds weird, but it's something really cool. The idea is to do less if/else as possible to select the current menu.

This is what my Template.html looks like:

        <!-- menu -->   
<div id="menu">
<ul>
<li wicket:id="system">
<a wicket:id="link" href="System.html">System</a>
</li>
<li wicket:id="about">
<a wicket:id="link" href="About.html">About</a>
</li>
</ul>
</div>

So, yes there is some CSS behind to show a cool layout, but that is not the point. Just note that if a <li> has an id of "current" like this:
    <li id="current">...</li>

Imagine that the CSS setup will do the rest, throwing out some cool stuff to highlight the current/selected menu.

So, how any pages under System's menu tells Template that they belong to it? As simple as this:
class UsersCRUD extends Template<System> {
}

Done! How this works? Let's check what's happening inside Template's default constructor:
public abstract class Template<M> extends WebPage {
public Template() {
Class<M> clazz = (Class<M>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];

add(new MenuItem("system", System.class, clazz));
add(new MenuItem("about", About.class, clazz));
}
}

And here goes the code for MenuItem:
public class MenuItem extends WebMarkupContainer {
/* Here the magic happens with CSS... */
public String getMarkupId() { return "current"; }

public MenuItem(String id, Class<? extends Template> linkTo,
Class<? extends Template> currentGeneric) {
super(id);

boolean isCurrentPage = currentGeneric.equals(linkTo);
setOutputMarkupId(isCurrentPage);
add(new BookmarkablePageLink("link", linkTo));
}
}

How about that? One simple equals and the conditional menu is done!

Oh, don't forget that Template is an abstract page and so, it has somewhere a <wicket:child/> so UserCRUD can be a subclass and do a composite page through inheritance.

Have fun Wicketers!!

Link para este post

09 Maio 2007

Herança em Anotações Java

Brincando com o Hibernate Validator hoje, notei que seria uma ótima idéia ter herança de anotações em Java. Algo que atualmente não é permitido. Realmente, senti falta dessa funcionalidade.

Comecei escrevendo um POJO simples para configurar algumas validações de @Range, quando notei a repetição. Esta anotação recebe dois parametros min e max, ficando assim:

class User {
@Range(min=6, max=20)
private String password;
...
}

Mas, obviamente este é o mais simples dos simplérrimos exemplos onde quero demonstrar apenas o uso da anotação e porque herança seria algo útil. Em muitos outros atributos, inclusive de outras classes, gostaria de aplicar o mesmo @Range e atualmente a única solução é copiando/colando a definição.

E se eu pudesse fazer isso:
public @interface Range6to20 extends @Range(min=6, max=20) {}

Não seria ótimo? Bastaria um @Range6to20 nos atributos que quero, e tenho apenas um ponto para alterar o range, caso seja necessário futuramente. (Ok, o nome da classe iria ficar em desacordo com os valores, mas e daí? é um exemplo!... e também, o refactor do Eclipse renomeia as referencias... então... não é um problema).

Quem já viu as anotações do Struts 2 para o Validator? Ficam enormes não é? E se você pudesse estender e colocar separadamente a configuração numa anotação especializada, e de quebra ainda poder reutilizá-la em outros lugares? :D Seria ótimo, não?

Pesquisei na web algo sobre herança de anotações, mas o máximo que encontrei foi alguém comentando que também gostaria de ter, e que soube que o assunto foi discutido pelo Expert Group da respectiva JSR, só não soube dizer porque essa funcionalidade não foi incorporada. Talvez alguém saiba?

O que vocês acham? :)

[]'s!!
miojo

Link para este post

08 Maio 2007

Wicket: AJAXiando a Paginação

No penúltimo post, mostrei como implementar paginação de listas com o framework Wicket. Agora, visando maior produtividade e usabilidade na interface, apresento-lhes o que é preciso para implementar a mesma paginação ajaxiada.

O processo é o mesmo, já que o framework é component-based. As alterações no HTML são mínimas e mesmo em Java, o que será preciso modificar é qual componente instanciar para tratar a ListView. Mas por se tratar de uma implementação Ajax, algumas considerações e explicações devem ser feitas antes.

  • Ao implementar algo em Ajax, as vezes é preciso de uma área (div) para ser atualizada pelas requisições assíncronas com novo código HTML produzido dinâmicamente no servidor.
  • No caso da ListView, é importante que a tabela fique dentro de uma área como esta.
  • Em Wicket, é possível referenciar uma área qualquer div através do componente WebMarkupContainer.
Uma das enormes vantagens de utilizar o framework Wicket, é poder desenvolver diversas funcionalidades sem escrever uma linha de Javascript qualquer. Seu suporte a Ajax está muito estável para funcionalidades básicas, e ainda existe o projeto Wicket Extensions que provê muitos outros componentes 100% plugáveis a qualquer aplicação Wicket. Cada componente expõe no HTML de alguma forma, o Javascript necessário para que o mesmo funcione, como os de Ajax por exemplo. Em outro post, mostrarei como implementar componentes reutilizáveis (e aí sim, teremos que escrever Javascript se for o caso).

Seguindo o assunto do post, vamos ao que interessa: ajaxiar uma paginação. Abaixo, está o código da tela utilizada na explicação anterior:

Pessoas.html
<table>
<tr>
<td>nome</td>
<td>idade</td>
</tr>
<tr wicket:id="lista">
<td><span wicket:id="nome">foo</span></td>
<td><span wicket:id="idade">12</span></td>
</tr>
<tr>
<td colspan="2">
<span wicket:id="navegacao">Aqui vai a barra de navegacao</span>
</td>
</tr>
</table>

A única alteração que devemos fazer, é colocar esta tabela dentro de uma área atualizável por requisição Ajax: um div. Ou seja, ficará assim:

<div wicket:id="ajaxTable">
<table>
<tr>
...
</tr>
</table>
</div>


Feito isto, é preciso que o componente ajaxTable seja reconhecido pelo Wicket na classe Pessoas. E é agora que utilizaremos a classe WebMarkupContainer:

Pessoas.java
public class Pessoas extends WebPage {
public Pessoas() {
List listaPessoas; /* obtem de algum lugar (Spring talvez) */
PageableListView view = new PageableListView("lista", listaPessoas) {
protected void populateItem(ListItem item) {
Pessoa p = (Pessoa) item.getModelObject();
item.add(new Label("nome", p.getNome());
item.add(new Label("idade", p.getIdade());
}
};

WebMarkupContainer ajaxTable = new WebMarkupContainer("ajaxTable");
ajaxTable.setOutputMarkupId(true); // obrigatorio pq nao tem o
// atributo id com mesmo
// nome no html
add(ajaxTable);

// O componente PageableListView está dentro do

// entao deve ser adicionado ao WebMarkupContainer, não à página.
ajaxTable.add(view);

// O componente-chave para paginação-ajax, está aqui:
ajaxTable.add(new AjaxPagingNavigator("navegacao", view));
}
}
Pronto! Paginação ajax habilitada com sucesso! :)
Desta forma, ao navegar na lista somente a tabela com os dados será atualizada, através de requisições Ajax. Esta funcionalidade é muito útil quando se tem telas pesadas com diversos componentes, e não queremos atualizar a página inteira, ou quando simplesmente queremos dizer que a aplicação é Web 2.0 compliant.

Explicando um pouco o que foi feito:
  • Não foi preciso alterar qualquer trecho de código na table html, mas é necessário que a mesma esteja numa área atualizável div.
  • Não existe um AjaxPageableListView. O mesmo que utilizamos no primeiro exemplo foi utilizado aqui.
  • Como existe um div para ser atualizado assíncronamente, este precisa ser referenciado por um WebMarkupContainer, que conterá o novo código HTML após a requisição Ajax e substituirá o código anterior.
  • Qualquer componente que esteja dentro do div, deve ser adicionado no MarkupContainer, respeitando a árvore de componentes.
  • Configurei a propriedade
    outputMarkupId
    porque no HTML, nao coloquei o atributo id manualmente. Este método faz apenas isto. Utiliza o nome do componente para o atributo id.
  • Tanto a ListView como o Navigator, são adicionados no MarkupContainer.
  • Para a paginação efetivamente funcionar, deve-se utilizar o componente
    AjaxPagingNavigator
  • Pronto!
Até a próxima!

Link para este post