30.6.05

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.

29.6.05

XUL

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.

Laszlo???

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.

28.6.05

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
assertTrue(corr.enviar(mensagem));
meio.verify();//4
}
}

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

27.6.05

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 ?

http://news.com.com/2060-10808_3-0.html?tag=nefd.bl

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 ?

http://jcp.org/en/jsr/detail?id=198

26.6.05

iBatis

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'):


<sqlmapconfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128"/>

<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">
</datasource>
</transactionmanager>

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

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#
</select>
</sqlmap>
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...).

24.6.05

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... :))

23.6.05

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.

22.6.05

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?

21.6.05

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...

19.6.05

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
Technologies.

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!