30 junho 2008

Cache do Wicket em Cluster: entenda o processo


Muita gente quando descobre que o Wicket guarda tudo na sessão do usuário, rapidamente lança duas perguntas de grande peso:

  1. Guardar tudo no HttpSession não estourará a memória do servidor?
  2. Não ficará lenta a replicação destes objetos entre os nodes de um Cluster?
Para começar, é verdade sim, que o Wicket guarda tudo... tudo... na sessão do usuário. O objeto HttpSession é alimentado a cada click do usuário com as instâncias das páginas (e toooodas as suas versões anteriores - Suporte Backbutton), assim como os dados destas páginas, de formulários, estados de componentes (visível, escondido, selecionado, etc) e tantas outras informações forem necessárias. Mas, não se preocupe. Assim como o Garbage Collector se encarrega de cuidar da memória da VM, o Wicket (>= 1.3) se encarrega de cuidar da sua "memória". Para isso, existe o DiskPageStore.

Antes de continuar, explicarei agora os motivos que levam o Wicket a funcionar desta forma (enxer a memória). Se você já sabe, então pule dois parágrafos. :-)

O Wicket armazena na HttpSession as instâncias da página primeiramente para que quando você, desenvolvedor, construir uma página ou um componente, sinta-se num ambiente verdadeiramente Orientado a Objetos. Diferentemente dos frameworks action-based, aqui é possível manter referências de objetos, variáveis locais e de instância, declaradas sem qualquer problema pois quando o usuário clicar, o objeto que receberá o evento, é o mesmo que foi criado no início. Ótimo não? Sem dúvida! Não precisa-se saber de "parâmetro do request" ou qualquer outra tranqueira Web. É Swing-like, Java puro, POJOs e até parece desktop de verdade.

Pois bem, com os objetos na HttpSession, foi possível implementar algo ainda mais bacana: suporte ao backbutton do browser. Cada vez que o usuário submete alguma coisa a um componente, o estado deste componente é guardado na Session, como uma versão. É como se fosse feito um snapshot. Se o usuário clicar em voltar, e submeter alguma coisa novamente, o Wicket tem como saber que alguma coisa ali está diferente e poderá evitar problemas como submissão duplicada de registro, ou atualização indevida de dados já existentes. Maravilha!

E então você pensa: "que ótimo, Wicket me dá várias funcionalidades a troco de uma sessão de 15Megabytes por usuário". É verdade que se não houver um cuidado, a sessão pode explodir sim. Aqui vão algumas regras então para minimizar os riscos de uma HttpSession Shrek:
Como funciona o SecondLevelCacheSessionStore?
Agora, a parte que nos interessa: Wicket's Garbage Collector!

O "lixo" que o Wicket precisa remover é basicamente, versões antigas das páginas/componentes criados pela navegação do usuário no site. É possível, mas pouco provável, que o usuário clique num Voltar e tente fazer algo. Por isso o framework elimina versões muito antigas (o padrão é manter somente as últimas 5 em deployment mode). Mas e se o desenvolvedor quiser armazenar mais versões, sem comprometer a memória do servidor, e conseqüentemente proteger sua aplicação de ataques Denial of Service? Para isso serve o SecondLevelCacheSessionStore.

Sua utilização depende do arquiteto do sistema em definir no Application do Wicket, que o framework deve utilizá-lo. Porém, antes de apresentar o código, vamos entender como os objetos são persistidos. A persistência é feita por algum objeto que implementa a interface IPageStore. Este objeto será responsável por persistir - storePage() - seja em banco de dados, arquivo flat ou qualquer outro meio, os objetos que o framework considerar não mais necessários na sessão, ou quando o usuário precisa ver algum dado mantido em versão anterior de algum componente - getPage().

A implementação padrão para a interface IPageStore, é a classe DiskPageStore. Nela, ocorre o processo de serializar as páginas e toda a árvore de objetos ali contida, para posteriormente salvar no disco do servidor. Problema de memória gigante resolvido! Mas... pera. Você possui um cluster? Hmm... Será que o Wicket vai funcionar sem problemas ali? Se ele arquivar as páginas no disco de um servidor, o que acontecerá em outro nó do cluster?!

Wicket em ambiente Clusterizado
A grande sacada...

Serialização é um processo complicado e lento. Não falei antes, mas é importante lembrar que todos os objetos que ficarem na HttpSession, devem implementar Serializable. Isto é importantíssimo; se houver um não serializável, o Wicket vai gritar no log. Agora, se tudo correr bem, os objetos serão serializados e persistidos no disco pelo objeto DiskPageStore, estando o aplicativo Wicket em cluster ou não.

Num ambiente Cluster regular - que segue os padrões das configurações simples e funcionais (ex: Tomcat em Cluster) - o framework inteligentemente coloca as páginas já serializadas no processo de replicação, para que quando o objeto HttpSession chegar no outro nó, não há perda de processamento em realizar a tarefa de serialização duas vezes. As páginas também não são de-serializadas; vão direto para o DiskPageStore que as armazena para uso futuro, se necessário. Este mecanismo é o que garante a performance do framework neste tipo de deploy.

Espero poder ter desmistificado agora a idéia de que Wicket estoura com a memória dos servidores, nem tão pouco que não suporta ambientes clusterizados.

Hands-On: Configurar a aplicação para utilizar SecondLevelCacheSessionStore
Mão na massa...

Para encerrar, veja como é simples configurar o SecondLevelCache com o DiskPageStore:
public class MyApp extends WebApplication {
   @Override
   protected ISessionStore newSessionStore() {
      return new SecondLevelCacheSessionStore(this, new DiskPageStore());
   }
}
E agora, que tal? É fácil ou não é?! :-D

PS: o Anjo Negro ataca novamente... desta vez, com gol de letra!

[]'s!

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

22 junho 2008

Aspirante de fotografia nas horas livres

Trago a público uma seleção fotográfica das imagens que realizei nos últimos 6 meses, a partir do momento que adquiri a minha querida Aganov. Apesar de serem poucas imagens, a verdade é que por trás disso há um acervo com mais de 4 mil fotos. Às vezes chego a fazer 15 fotos da mesma cena, até acertar a imagem (que considero) ideal, tudo isso para seguir um estilo 98% purista, sem Photoshop ou filtros de lente (às vezes, aplico um Sharpen, devido às limitações da câmera). O engraçado é que geralmente é a primeira tentativa que sai melhor (meu amigo Pablo percebeu isso quando fomos à Europa em Dezembro de 2007.)

Bem, a intenção de mostrar as fotos é, na verdade, de solicitar aos amigos que visitam este blog, e aos estranhos que corajosamente clicam nos links de outros sites até chegar aqui, para que comentem as imagens. Peço somente por gentileza, que os comentários sejam diretamente nas fotos, armazenadas no Picasa Web (abaixo de cada imagem há um espaço dedicado para comentários.) Caso alguém não consiga comentar lá (ou não queira), também pode fazer pelos comentários deste post, ou então por e-mail. Gostaria muito de saber a opinião de vocês.

Seleção Fotográfica


Quem sabe um dia abraço a idéia e viro fotógrafo? :-)

[]'s!

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!

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!

11 junho 2008

Claro 3G sem modem, Parte 2

No meu primeiro post, falei que era possível utilizar a rede da Claro 3G sem ter de adquirir o modem deles: basta utilizar seu próprio celular 3G, ou não, como modem! Porém, algumas pessoas me questionaram a respeito do meu celular e além disso, a Claro entrou em contato atrás de informações sobre a minha situação (e satisfação) com o seu serviço.



Bem, vou esclarecer então algumas dúvidas que surgiram em comentários e conversas com meus amigos:
  1. Meu celular não é 3G mas possui modem interno. Posso utilizar o Claro 3G por ele?
    Sim! Você pode. A própria Claro avisa: se na sua região não há cobertura 3G, então a conexão pode ser estabelecida através das redes EDGE ou GPRS.

  2. Eu comprei um patcha Smartphone, daqueles que custam mais de R$ 1.500,00, mas não sei se tem Modem nele. Como saberei que posso utilizar meu celular, e não ter que comprar o modem super-hiper-caro da Claro?
    Primeiro, consulte o manual do celular. Todos indicam se possuem modem interno ou não. Em geral, todo smartphone possui modem. Então aviso: quem tem Smartphone, não compre o modem da Claro! É besteira e desperdício de dinheiro: você já gastou demais num celular de última geração e ainda tem que comprar uma peça só pra conectar na Internet?! Fala sério... :)

  3. Como saber o(s) tipo(s) de rede(s) que meu celular suporta, e as velocidades?
    Eu encontrei um site bem bacana sobre celulares, que mostra a especificação de diversos modelos, nos mais íntimos detalhes: GSMArena. Um exemplo: o modelo do meu celular é o Sony Ericsson K790i. Se você ver aqui a especificação, notará que ele suporta EDGE Class 10, uma classificação da rede EDGE, que atinge a velocidade de até 236,8kbps. Ou seja, meu celular atende 94,62% do plano de 250kbps. Preciso mesmo comprar o Modem? :-)

  4. Qual plano da Claro 3G devo contratar?
    Essa resposta é fácil: compre o plano mais barato!! O motivo é simples. A Claro oferece os seguintes planos, todos com a mesma franquia mensal de download de 1GB:
    • 250 kbps - R$ 49,90
    • 500 kbps - R$ 69,90
    • 1 mbps - R$ 99,90
    E a regra geral é a seguinte: se você ultrapassar a franquia, independente do plano que contratou, a sua velocidade será limitada a 128 kbps. E convenhamos: quanto mais rápida a conexão, mais cedo você ultrapassará o limite. Com 2 mbps de Vírtua, eu baixava 1GB em 1 tarde. Outro detalhe importante: se seu celular não suporta mais que 250 kbps, não adianta contratar o plano de 500kbps ou 1mbps.
Então é isso, fica ae a dica: se você já possui um celular carrancudo, não compre o modem da Claro, pois não há a necessidade. Se você contratar o plano de 250 kbps e não comprar o Modem, terá uma economia, comparada com o plano de 1 mbps + modem, de aproximadamente R$ 1500,00 em 1 ano (carência do contrato).

Ainda restam dúvidas? Envie um comentário e fique de olho neste artigo.

[]'s!

07 junho 2008

VIPConnectz e o golpe estilo Omni International

Como pode alguém acreditar nesses papos de Dinheiro Fácil? Na série "A Grande Família", mostrou-se a grande besteira que é participar destas redes de mercado que funcionam, na maior cara de pau, no modelo pirâmide. Seja Herbalife, Natura, Omni International e agora a mais recente: VIPConnectz. Qualé?!

Muitos até ganham dinheiro de forma honesa e ética através da Natura, Herbalife e algumas outras. Mas essas pessoas trabalham muito! Ou, compram os produtos para vender somente como complemento de renda ou até mesmo, passa-tempo. Até aí tudo bem. Mas o caso da Omni International (também conhecida como Mega Omni) e agora a da VIPConnectz, são absurdos demais.

Para quem não conhece a Omni, leia um pouco aqui, aqui, aqui, aqui e aqui (posso ter repetido algum 'aqui' - ignorem). Enfim, resumindo: a Omni é uma mentira (duh!! quem ainda não percebeu isso, é porque ainda está dormindo), é golpe no estilo pirâmide (proibido por lei, ok?) e a única coisa que eles dão mesmo é Prejuízo Fácil.

Dito isto, venho agora avisar a vocês: evitem qualquer relação com uma empresa chamada VIPConnectz. Eles oferecem algo similar ao serviço da Omni, mas direcionado para VoIP. Nem quis saber muito, mas quando lembrei, durante a conversa com um infeliz da VIPConnectz, da história da Omni, abortei qualquer educação durante o papo. Também... o cara não sabia nem escrever em português... Patético. Segue o log da conversa:

juvenciomariano@hotmail.com: BOA TARDE BRUNO
juvenciomariano@hotmail.com:
TUDO BEM?
Bruno B:
falae
Bruno B:
tudo bem e voce?
juvenciomariano@hotmail.com:
POSSO TER UM MINUTO DE SUA ATENÇÃO?
Bruno B:
se voce usar letras minusculas, sim
juvenciomariano@hotmail.com:
como queiras
Bruno B:
e entao...
Bruno B:
:)
juvenciomariano@hotmail.com:
quero lhe convidar a partecipar de apresentação de oportunidade de negócio
Bruno B:
eh da Omni?
juvenciomariano@hotmail.com:
amanhã domingo via internet
juvenciomariano@hotmail.com:
vc já ouvio falar de uma multi-macional vipconnectz
juvenciomariano@hotmail.com:
?
Bruno B:
eu ainda nao entendi muito bem os erros de portugues que voce comete. é normal?
Bruno B:
"ouvio" esta completamente errado!
juvenciomariano@hotmail.com:
não teclado c/ problemas
Bruno B:
entendi
Bruno B:
bem, jah ouvi falar nessa empresa, e nao tenho o menor interesse... :)
juvenciomariano@hotmail.com:
não vamos nos ater nisse detalhe
juvenciomariano@hotmail.com:
ok
juvenciomariano@hotmail.com:
deixa te perguntar
Bruno B:
hhmm
juvenciomariano@hotmail.com:
vc já ganha de vários países do mundo?
Bruno B:
como assim ganhar?
juvenciomariano@hotmail.com:
bom, vc tem a oportunidade de ganhar de vários países nesse negócio
juvenciomariano@hotmail.com:
é só vc dar uma chance a vc mesmo
Bruno B:
sim, claro...
Bruno B:
quando tenho que gastar de inicio ?
juvenciomariano@hotmail.com:
e entrar em nossa sala de conferencias e treinamento amanhã
Bruno B:
ok...
Bruno B:
quanto tenho que gastar de inicio ?
juvenciomariano@hotmail.com:
vc vai entender que vc nãovai gastar nada
Bruno B:
nao quero entender
Bruno B:
quero saber quanto
Bruno B:
:)
juvenciomariano@hotmail.com:
mas, sim terá um envestimento em que logo de início terá de volta
Bruno B:
aaahhh
Bruno B:
entao vou ter que gastar no inicio
Bruno B:
:P
Bruno B:
ok, de quanto eh o "investimento" inicial?
juvenciomariano@hotmail.com:
depende de como vc procurar saber como se faz isso
juvenciomariano@hotmail.com:
sim, pois vc é dono de seu negócio e o único responssável pelo seu sucesso
Bruno B:
cara, ou voce me diz o valor do investimento, ou encerrarei esta conversa... :)
juvenciomariano@hotmail.com:
que lhe pedir permição a lhe enviar um e-mail para lhe colocar na sala como meu convidado
Bruno B:
de quanto eh o investimento inicial? qual o valor?
juvenciomariano@hotmail.com:
pois são muitas as informações
juvenciomariano@hotmail.com:
299.50
juvenciomariano@hotmail.com:
dólares
Bruno B:
uns 500 reais entao
Bruno B:
bem, nao tenho essa grana
Bruno B:
:)
juvenciomariano@hotmail.com:
isso
Bruno B:
ok, nao tenho dinheiro
Bruno B:
tchau
juvenciomariano@hotmail.com:
vc lógo de início terá retorno desse valor
Bruno B:
nao tenho 500 reais
Bruno B:
vc me empresta
Bruno B:
?
juvenciomariano@hotmail.com:
vejo que não estou conversanndo c/ uma pessoa bem informada
juvenciomariano@hotmail.com:
me desculpa
Bruno B:
ateh +
juvenciomariano@hotmail.com:
e vc que queria me corregir um pequeno erro de portugues
Bruno B:
corrigir
Bruno B:
corrigir
Bruno B:
com i!
juvenciomariano@hotmail.com:
não entende que isso pode estar acontecendo por problemas internet
juvenciomariano@hotmail.com:
vc tem muito oque aprender meu amigo
Bruno B:
ah... claro... a letra i foi trocada pela letra e
Bruno B:
a Internet alterou a letra
juvenciomariano@hotmail.com:
lhe pesso mil desculpas
Bruno B:
entendi...
Bruno B:
peço!!
Bruno B:
com CEDILHA
juvenciomariano@hotmail.com:
mas, vc está muito atrazado
Bruno B:
PEÇO
Bruno B:
ATRASADO
Bruno B:
COM S
Bruno B:
pqp, vc eh muito burro
juvenciomariano@hotmail.com:
por isso vc não tem dinheiro
juvenciomariano@hotmail.com:
vc é um quadrado
Bruno B:
beleza
Bruno B:
:)
Bruno B:
tchau!
juvenciomariano@hotmail.com:
tenho dinheiro para comprar a sua vida meu amigo
Bruno B:
entao faça uma oferta
Bruno B:
:)
juvenciomariano@hotmail.com:
vc nãosabe c/quemestá falando
Bruno B:
estou falando com alguem que mal sabe português
Bruno B:
isso já basta para provar para mim, que é uma pessoa de baixo calão
juvenciomariano@hotmail.com:
pessoa como vc , já perdi interece a muito tempo
juvenciomariano@hotmail.com:
tchau
Bruno B:
interesse!!
Bruno B:
COM DOIS S!!
Bruno B:
INTERESSE
Bruno B:
pqp
Bruno B:
volta pra escola!

No mais, é isso. Ouviu a palavra Omni ou VIPConnectz, ou recebeu um "convite para uma palestra ou conferência para uma oportunidade de negócio"... corra rápido!! Pois lá vem o golpe!! :D

[]'s

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!

Fui entrevistado, e agora?


A Ana Paula, grande amiga em Floripa e não muito distante de se tornar grande jornalista, me procurou para uma entrevista a respeito de viagens, mudanças de cidade, fotografia e vida em geral.

Além da entrevista, ela me pediu algumas fotos das minhas viagens por ae. Por isso, também selecionei algumas fotos do meu arquivo para mostrar o trabalho de gafanhoto que tenho feito nos últimos tempos. A entrevista foi publicada no seu blog dedicado à arte, chamado Fotografe Floripa.

Interessados, por favor não hesitem! Visitem! :-D E aos menos interessados, tenham um pouco de consideração... Fui entrevistado poxa! Nem sei mais o que fazer agora, se contrato um empresário, uma secretária para receber ligações. Vai que o Jô Soares quer saber o que eu penso, ou talvez a Ana Maria Braga me convida para um café da manhã?!?!

To quase emocionado a respeito disso! Se eu começar a bitolar demais, vou considerar essa entrevista como um divisor de águas. Minha vida antes e depois da primeira entrevista. :D

[]'s!

01 junho 2008

Orkut de verdade: CouchSurfing

Observe a imagem ao lado, que roubei na maior cara de pau do album de um membro do CouchSurfing. O texto:
"Be not inhospitable to strangers lest they be angels in disguise"
É o que disse George Whitman a algum tempo atrás. George é o dono da livraria Shakespeare & Co em Paris, França. O significado da frase é melhor traduzido desta forma:
"Não seja inóspito para estranhos sob pena de serem anjos disfarçados"
Apesar desta filosofia já fazer parte da minha vida, pude compreender melhor a visão de George ao ler mais sobre a sua vida numa entrevista com o próprio. Na sua loja ele oferecia hospedagem a viajantes, poetas, artistas e todo o tipo de estranho que ali batia a porta. Em troca ele pedia algumas horas de ajuda na limpeza e organização da livraria e aos domingos ainda oferecia um belo café da manhã com panquecas e outras iguarias da culinária francesa. Não consigo discordar do modo como George vive (ou vivia - ainda não achei informação na Internet se ele já faleceu). Ele deposita nas pessoas total confiança e as convida para passarem a noite, ou a ficarem para o jantar, como se fossem velhos amigos. Ora, tem coisa melhor do que poder passar o tempo com um total estranho e saber que "existe vida lá fora"? Saber das suas histórias, ou poder compartilhar as suas próprias? Talvez aprender um novo idioma ou conhecer mais sobre outro país, outra cidade. Ou vai dizer que você nunca se questionou ao andar pelas ruas da sua cidade, ao olhar para algum estranho, para onde aquela pessoa está indo, de onde veio ou o que faz à noite na sua casa? Acredito que todos possuem um certo interesse pela vida dos outros (é o que dá audiência às novelas!), mas a verdade é que temos medo de estranhos. E é neste momento que devemo-nos todos lembrar: eles podem ser anjos disfarçados.

O Orkut pergunta a você: "Who do you know?". E você começa então a ir atrás de todos os seus amigos, colegas de trabalho ou até mesmo pessoas com quem você apenas trocou umas palavras no bar, na balada. A meu ver, o que muitas pessoas buscam no Orkut é apenas aumentar o número de "amigos" até ter a necessidade de criar um segundo profile. Me pergunto o que essas pessoas ganham com isso. Ter um registro numa rede social das pessoas que eu conheço, definitivamente não me agrega valor nenhum, somente um informativo virtual para marketizar aos outros "quem você conhece". Bem, as que realmente valem a pena eu ter contato, pode ter certeza: estão na agenda do meu celular ou na lista de contatos do meu e-mail. O que seria uma rede social de verdade então? Uma onde você terá troca cultural, experiências de vida, conhecerá gente de diversas etnias, uma onde há um objetivo real e tangível. Acredite, esta era a intenção do Sr. Whitman ao abrir a sua porta para estranhos. Não a porta da sua loja, mas a porta da sua vida.

E é graças a filosofia do excêntrico George Whitman que o Projeto CouchSurfing surgiu. Casey Fenton, o fundador do projeto, faria uma viagem à Islândia mas não queria ficar no hotel ou albergue sem o que fazer, sem com quem conversar ou alguém para apresentá-lo ao país. Ora, idéia brilhante não foi descolar uma lista de estudantes e enviar um e-mail a muitos deles perguntando: "Estou indo ae, posso dormir na sua casa?". Surpreso foi ao receber diversas respostas "claro!" e difícil então foi escolher onde ficar. Sorte a do Casey que existem pessoas lá fora como o grande Sr. Whitman. E então nasceu a idéia de Casey Fenton, juntamente com a filosofia de George Whitman. Seja como eles: ofereça um lugar para um total estranho ou procure um total estranho para hospedá-lo numa viagem.

Enquanto o Orkut pergunta "Who do you know?", o CouchSurfing é muito mais poético, verdadeiro, convidativo e caloroso: "Got Couch?". E o legal é que não é apenas para viajantes. Nos grupos locais é possível encontrar CouchSurfers marcando algum encontro num bar, restaurante, balada ou mesmo uma festa do pijama. Me encontrei com a turma de São Paulo a um tempo atrás, antes de vir para o Rio de Janeiro, onde conheci pessoas como o Alberto, a Vanessa, Tiago, Airton e muitos outros. Na ocasião um dos presentes levou dois israelenses. Ao chegar no Rio de Janeiro não hesitei quando surgiu um encontro dos CouchSurfers daqui. Anunciei minha participação e fui o primeiro a chegar. Alguns minutos depois o pessoal começou a aparecer. Estrangeiros e brasileiros, todos sentados à mesa, compartilhando histórias, opiniões e cultura. Alguns estrangeiros queriam aprender português, outros brasileiros (como eu) queriam praticar o inglês. A experiência não poderia ter sido melhor.

E é isto que torna o CouchSurfing uma rede social de verdade. Mas se você quiser conhecer mais sobre o projeto, assista a entrevista que o Alberto (embaixador do CouchSurfing em São Paulo) deu ao programa Urbano, do Multishow.



E você não precisa ir longe para encontrar alguém disposto a hospedá-lo por um tempo. No Brasil já são mais de 12 mil CSers (CouchSurfers). É possível que haja algum na sua cidade. Vai viajar pelo Brasil? Procure alguém! Nada como chegar numa cidade nova e ter alguém prestativo ao seu lado para mostrar-lhe a cidade da vista de um local. Nada de guias turísticos ou mapas para se atrapalhar. Procure no site e encontrará alguém disposto a acompanhá-lo durante a visita aos pontos turísticos, ou até mesmo poder levá-lo a lugares desconhecidos, presentes somente no mapa do povo local.

Se vier para o Rio de Janeiro, entre em contato. Estarei disposto a abrir minha porta com a confiança de um irmão e oferecer a melhor hospitalidade que posso dar. CouchSurfing não é apenas hospedagem, é experiência de vida!

[]'s!
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