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

17 dezembro 2007

Slides do Wicket

Eu sabia que haveria uma palestra no Javapolis deste ano sobre o Wicket, então fui atrás e caí de paraquedas no site SlideShare. O legal é que, não apenas encontrei os slides da palestra Wicket in Action, apresentada pelo Martijn Dashorst (um dos Core Commiters.) Aproveitei também para fazer o upload da minha palestra deste ano e incrementar ainda mais a quantidade de slides sobre o framework!

Com pressa em ver a palestra que o Martijn deu no Javapolis? Confere logo abaixo:



[]'s!

13 novembro 2007

Beowulf: 3D nas telonas!

Para quem nunca ouviu falar, Beowulf é um filme em IMAX 3D e isto significa usar aqueles óculos bizarros no cinema! O legal disso? Ter a sensação de estar dentro da tela. O filme estréia nos EUA dia 16 de Novembro, nesta Sexta-feira.

Não sei quando chega ao Brasil, nem se tem algum cinema com alta qualidade para este filme, mas sei que quero ver! Assista ao novo trailler:



Finalmente um filme 3D que não é para criancinhas!! Aquele "A Família do Futuro" é legalzinho, mas Beowulf é do caceta!

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?

25 outubro 2007

JSF Today: Standards versus OSS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

23 outubro 2007

Filosofia do Wicket

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

[]'s!!
miojo

21 outubro 2007

Java BOPE v2.0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



    *** Segue a minha contribuição:



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

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

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

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

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

13 outubro 2007

Combos com Ajax no Wicket

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

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

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

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

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

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

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


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

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


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

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

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

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

10 outubro 2007

Avisos WWF

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

Clique na imagem para ver mais...

09 outubro 2007

Wicket in Action: Primeiro Capítulo


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

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

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

08 outubro 2007

SOA is not just WebServices



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

Skates Invisiveis

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



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

from: GoogTube

Ubuntu Countdown

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

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

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

[]'s!

06 outubro 2007

Wicket aguenta peso pesado

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

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



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

[]'s !
miojo

02 outubro 2007

Ubuntu Weekly Newsletter

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

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

[]'s !

Como alterar o MAC Address?

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

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

Divirtam-se!

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

01 outubro 2007

Motorolas Voadores

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

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



Fonte: Engadget

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!

22 setembro 2007

Pensamento Sarcástico do Dia

Sendo um bom fã do Chandler, do seriado Friends, e um devoto do sarcasmo sadio, começo aqui uma seção de pensamentos sarcásticos para uma vida feliz. :D

"Sempre se case na parte da manhã. Desta forma, se não der certo a relação, você não perdeu o dia inteiro."


E tem gente que ainda pensa em se casar tão longe da cidade-natal que precisa alugar um ônibus para levar a família toda (do noivo AND da noiva!) e ainda reservar hotel. :)

[]'s!!

13 setembro 2007

SuperTube: Broadcast Your Sales!


O conceito do portal nasceu da necessidade de um espaço que fortalecesse a relação entre comprador e vendedor. Nos sites de venda atuais, o procedimento é confuso e limitado, oferecendo poucas condições para que o vendedor possa apresentar seus produtos e, conseqüentemente, um número reduzido de informações disponíveis ao comprador.

No Super Tube, além de produzir o conteúdo de seus próprios comerciais, o vendedor se torna dono de uma loja online totalmente gratuita, seleciona outros vendedores para sua lista de interesses, tem a chance de segmentar a sua área de atuação e uma privacidade maior na hora de fechar seus negócios.

Isso tudo para simplificar a vida de quem precisa comprar ou vender.

SuperTube - A maior comunidade de negócios em vídeo da internet.

Foi-se o tempo do Mercado Livre!!
SuperTube suas vendas!! :D

06 agosto 2007

Recentes pesquisas que vão mudar a sua vida, Parte 1

Boa postura evita dor causada pelo uso do PC

Manter-se reto e com apoios adequados é essencial para não ter dores.
Especialistas também recomendam pausas, alongamentos e cuidado com o estresse.

Quem passa muito tempo na frente do computador, seja trabalhando, estudando ou por lazer, já deve ter sentido dores nas costas, ombros, braços e pescoço depois de horas em frente à máquina -- situação que pode se agravar com o passar dos dias. São necessárias medidas simples, mas muito importantes, para mudar essa situação –- segundo especialistas ouvidos pelo G1, manter uma postura correta e efetuar pausas regulares para levantar ajudam bastante a prevenir e atenuar essas dores.
Link

Incrível.... :) Não saiu na página, mas os mesmos especialistas afirmam que ficar mais de 18h por dia no computador reduz a sua vida social. É preciso muito estudo mesmo para tais conclusões... ;)

03 agosto 2007

Dica rápida e rasteira... :)

A operação é simples...

~$ sudo cat id_rsa.pub >> /home/tunnel/.ssh/authorized_keys
-bash: /home/tunnel/.ssh/authorized_keys: Permission denied
~$


Agora, vai entender porque ocorre isso! :) Deduzi que são dois processos bash rodando, por isso que a operação >> não funciona, porque não rodou com sudo.

Depois de um tempo martelando a cabeça na parede, lendo tutoriais do sed, pearl e outros métodos altamente avançados para editar um simples arquivo com um único comando, cheguei a uma solução ridicularmente simples:

~$ sudo bash -c "cat id_rsa.pub >> /home/tunnel/.ssh/authorized_keys"
~$

É isso...

[]'s!
miojo

02 agosto 2007

Monitore seu Laptop/Desktop: Conky

O Conky é um monitorador de processos e recursos da máquina, útil e leve para Desktops e Laptops. A instalação para distribuições Debian é simples:
$ sudo apt-get install conky

Para rodar é fácil também:
$ conky

Mas recomendo colocar na sessão do Gnome/KDE. No caso do Gnome, execute:
$ gnome-session-properties

E adicione o conky como novo item. A configuração do conky fica em ~/.conkyrc e o que vocês podem ver no screenshot, é uma versão customizada.

[]'s!
miojo

29 julho 2007

Customize a MOTD do Linux

Não conheço uma distribuição Linux que já venha com um MOTD (Message Of The Day) customizado e realmente: diário. Então apresento-lhes, o Cowsay:MOTD!
Ubuntu Gutsy
nissim login: miojo
password:
______________________________________
/ Diplomacy is the art of saying "nice \
\ doggy" until you can find a rock. /
--------------------------------------
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/

[miojo@nissim:~]$ (0) (29.07 17:17)
Curtiu?
O que gera isso é um script que combina o programa cowsay e o fortune. Para instalar ambos, execute:
[miojo@nissim:~]$ sudo apt-get install cowsay fortune-mod fortunes         (0) (29.07 17:31)
E agora, o script na pasta /etc/cron.daily/
[miojo@nissim:~]$ cat /etc/cron.daily/motd                                 (0) (29.07 17:34)
#!/bin/sh
FORTUNE=`/usr/games/fortune`
cowsay -f tux $FORTUNE > /etc/motd
Não esqueça de tornar o script motd executável:
[miojo@nissim:~]$ sudo chmod a+x /etc/cron.daily/motd                      (0) (29.07 17:31)
Pronto! :)

[]'s
miojo

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

08 julho 2007

Não sou nerd... Geek é melhor =)

Se você não sabe o que é um GeekCode, leia o post do Urubatan!

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GIT d- s: a- C++ UL+ P-- L++ E--- W++ N* o-- K- w--
O-- M- V-- PS+ PE- Y-- PGP- t 5 X R tv- b+ DI+ D+
G e h- r y+
------END GEEK CODE BLOCK------

PS: nota-se a minha vontade de escrever hoje, não? :)

[]'s !
miojo

04 julho 2007

Rio 1 x 0 Violencia

Pode parecer babação de ovo... pode parecer propaganda... mas é impressionante, acreditem.

Graças a Deus, foram 10 dias seguidos no Rio de Janeiro e não vi qualquer tipo de más intenções nas ruas. E não, não fiquei somente entre Hotel-Trabalho. Acreditem, caminhei pelo Centro da cidade a pé, entre 23h00 e 01h00 para conhecer e não vi qualquer tipo de bandidagem. Fui da Lapa ao Arco do Teles e voltei para a Rua do Lavradio, tranquilamente.

O que posso concluir disso? Faço dos meus pensamentos, a seguinte sitação:

"Times have not become more violent. They have just become more televised."
- Marylin Manson
Traduzindo: "Os tempos (de hoje) não estão mais violentos. Apenas se tornou mais televisionado."

É claro que não é para sair na rua com uma camera digital pendurada no pescoço, contando notas de $50,00 e perguntando para qualquer um, como chegar na Praia de Ipanema, mas convenhamos, a violência sempre existiu por aqui, desde os tempos da Cidade de Deus. Ela apenas virou notícia constante na televisão e nos jornais (ok, a proporção aumentou, acompanhando a população... mas isso é discussão para os sociólogos...)

O Rio continua excelente, com suas praias maravilhosas, o Pão de Açúcar dando sua graça e o Cristo abraçando a cidade todo dia pela manhã. Copacabana sempre será "Copa" e de Ipanema vocês sempre poderão vir à Copa pelo "Corte".

No segundo dia já usei o Metrô para me locomover. Ônibus para visitar um amigo em São Cristóvao, e táxi para os destinos com limite de chegada (leia-se: "estou atrasado!"). Com certeza voltarei para mais jornadas de trabalho. E se Deus quiser, a Cidade Maravilhosa continuará assim: sem medo de deixar a gente feliz!

A propósito, quem vier para o Pan, não se assuste com as esculturas de areia à beira da praia de Copacabana... algumas são um pouco... "fortes".



[]'s!!
miojo

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

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

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!

03 maio 2007

Apache Wicket: agora é oficial!

Tenho o prazer em anunciar o primeiro lançamento do Apache Wicket. Este release atende a todos os requisitos do Incubator PMC, e por isso, podemos considerar este o primeiro grande passo para o amadurecimento do framework, que a partir de agora, receberá maior atenção pela comunidade Java e Open Source. :)

Antes de anunciar para os brasileiros, um pouco da introdução (para aqueles que não leram meu primeiro post:

-= Apache Wicket =-
Apache Wicket é um framework web orientado a componentes, no momento sob os cuidados da Apache Software Foundation e sua incubadora. Com distinção entre lógica e código HTML, um modelo de dados em POJOs e ser livre de XML, o Apache Wicket simplifica e diverte o desenvolvimento de aplicações Web. Facilite seu desenvolvimento trocando complexidade por um poderoso mecanismo de reutilização de componentes escritos em puro Java e HTML.

Vocês podem encontrar outras informações aqui: http://incubator.apache.org/wicket

-= Este lançamento =-
Este é o primeiro de uma série de betas antes de uma confiança maior do time para finalizar o Apache Wicket 1.3 e lançá-lo sem bugs. Considere-o um Release Candidate.

- Migrando do Wicket 1.2 -
Aos que já utilizam o Wicket 1.2, o guia de migração para Wicket 1.3 encontra-se disponível no seguinte endereço: http://cwiki.apache.org/WICKET/migrate-13.html

- Download -
Este lançamento pode ser baixado no seguinde endereço:
http://people.apache.org/dist/incubator/wicket/apache-wicket-1.3.0-incubating-beta1/dist/

- Download com Maven -
Repositório:
http://people.apache.org/dist/incubator/wicket/apache-wicket-1.3.0-incubating-beta1/m2-repo/

- Bugs -
No caso de bugs serem encontrados, pedimos que submetam os mesmos no JIRA:
http://issues.apache.org/jira/browse/WICKET

Caso queira contribuir enviando patches de bugs, utilize a seguinte tag:
http://svn.apache.org/repos/asf/incubator/wicket/tags/wicket-1.3.0-incubating-beta-1/

-= Incubadora Apache Wicket =-
Maiores informações sobre o andamento do processo na incubadora:
http://incubator.apache.org/projects/wicket

[]'s!!
miojo

28 abril 2007

Wicket: Paginando listagens em 3 passos

Um dos pontos que mais se apanha para implementar quando do desenvolvimento de aplicações Web, é a paginação de lista de dados. Lembro-me dos tempos de Struts, onde a grande dúvida era usar ou não usar a antiga Display Tag. Infelizmente, trabalhando com frameworks action-based e código view em JSP/Taglib, implementar paginação é uma das tarefas mais chatas para a interface Web, pois exige uma cacetada de configuração na página e principalmente: suja todo o HTML e pronto, lá se foi o protótio do cliente e o designer não pode mais editar com um preview em mãos.

Algumas pessoas comentaram no primeiro post sobre Wicket pedindo que eu desse maiores detalhes de como funciona ou como se utiliza. Pensei bastante e achei melhor primeiro apresentar como o desenvolvedor utiliza o framework, antes de se preocupar em como o mesmo funciona "por trás das cortinas".

Para começar a enteder a paginação, primeiramente é importante entendermos o funcionamento do componente básico de repetição: ListView. Vejam o exemplo a seguir:

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>
</table>


Pessoas.java
public class Pessoas extends WebPage {
public Pessoas() {
List listaPessoas; /* obtem de algum lugar (Spring talvez) */
add(new ListView("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());
}
});
}
}

Entendendo o funcionamento do ListView:
  • O bind foi feito com a tag <tr>, então para cada iteração na List, o ListView vai processar um ListItem para aquela tag.
  • O framework possui hierarquia de componentes, então vejam que o Label é adicionado no ListItem e não na ListView. Isto porque no HTML, temos e nome e idade dentro da lista.
  • Para cada objeto na lista, o framework coloca ele como ModelObject do ListItem. (farei um post futuramente sobre Models, explicando seu funcionamento e os diversos tipos).
O interessante aqui é enteder o básico do funcionamento da ListView, que pode ser aplicado a praticamente qualquer tag html que se deseja iterar e repetir.

Agora, vamos adicionar paginação nesta ListView. Para isto, precisamos executar alguns passos:
  1. Editar o HTML e acrescentar a barra de navegação.
  2. Converter a ListView para uma PageableListView.
  3. Adicionar em Java o componente PagingNavigator, realizando binding entre ele e a barra de navegação.
Passo 1
Utilizaremos aqui uma barra de navegação default do Wicket, sem customização. Deve-se adicionar na tabela a seguinte TR:
<tr>
<td colspan="2">
<span wicket:id="navegacao">aqui vai a barra de navegacao</span>
</td>
</tr>
Passo 2
Alterar a instanciação de uma ListView para uma PageableListView. Feito isto, é preciso informar no construtor, quantos itens serão apresentados por página:
PageableListView listView = null;
add(listView = new PageableListView("lista", listaPessoas, 2) { ...

Passo 3
Agora, falta apenas colocar o componente de navegação na classe Java:

     add(new PagingNavigator("navegacao", listView));

Pronto! Só reparem que no construtor de PagingNavigator, é preciso passar a referência para o PageableListView que será paginado por ele.

O que aprendemos?
Que utilizando Wicket, não sujamos nosso código HTML, nem mesmo para fazer paginação! É possível manter o HTML limpo para que os designers possam trabalhar sem problemas, e também, que nós programadores tenhamos apenas um ponto para modificar, como neste exemplo onde alteramos de uma simples listagem para uma listagem paginada, o controle dinâmico das telas: a classe Java! Pois em Wicket não existe configuração em XML. Este é todo o código necessário para que esta paginação funcione.

Confiram mais exemplos aqui:
Wicket Repeater Views

Até a próxima!

[]'s!
miojo

26 abril 2007

Wicket - Apresentação SouJava

Ano passado fiz uma apresentação sobre Wicket no SouJava em São Paulo, mas infelizmente não teve uma audiência muito grande, devido provavelmente ao pequeno público interessado em conhecer um framework Web com nome tão estranho. :)

(se eu fizer outra agora hoje, acredito que irá mais gente!)

Então, publico aqui os slides que mostrei na época, para dar uma idéia melhor do funcionamento e espero que acompanhem mais de perto o crescimento do Wicket!



[]'s!!!
miojo

23 abril 2007

Wicket! ... Hein?

Muitos dos meus amigos estranharam ao pronunciar essa palavra, Wicket. E até concordo que é estranha, mas apesar do nome, que agora mudou para... Apache Wicket, acredito que a credibilidade só de ouvir o nome aumentará consideravelmente.

O que é o Wicket?

Resumindo: é tudo o que queríamos que um framework Web fosse! :D Pode parecer um exagero, mas depois de desenvolver algumas telas, vocês verão que não estou mentindo aqui. É realmente divertido, rápido e prático, desenvolver aplicativos Web 2.0 com ele. Tão fácil quanto desenhar tela Swing no Matisse! O framework tem alguns conceitos parecidos com o Tapestry, então quem é familiar com este (também mantido na Apache ), vai pegar rápido a idéia.

É parecido com o Struts/JSF?

Graças a Deus... não!! Trabalhei com Struts durante 2 anos e meio, e recentemente me arrisquei a usar JSF para uma ferramenta interna, e minha conclusão? Struts == JSF = true; Ou seja, se eu já não gostava de Struts, JSF definitivamente não me agrada muito. Apesar disso, essas duas tecnologias são fortes e devem ser respeitadas. Agora, quanto ao Wicket, devo dizer que ele preenche lacunas que antes Struts/JSF nos deixavam extremamente irritados.

Conhecem o termo SOP? Não, não digitei errado SOAP. Acontece que desenvolver aplicativos Web com Struts/JSF, a gente acaba entrando numa metodologia chamada String Oriented Programming. Onde temos que localizar num arquivo xml o retorno de um método, para saber para onde vai aquele maldito... return "success";. Não apenas isso, mas em muitos outros casos como bind de componentes da página, atributos e campos, com o que você está codificando em Java.

Então, o que ganho?

Um desenvolvimento prático e 99,9% separando o que é código dinâmico e o que é código estático (leia-se: Java, HTML, JavaScript). Essa é apenas uma das inúmeras vantagens que se obtém utilizando Wicket para desenvolver aplicações Web. Mas de início, comento aqui esta vantagem.

O seu designer terá total liberdade para mexer no design, layout e estrutura (no caso da estrutura, existem limites, claro), sem ferrar com o código dinâmico, pois este fica em um arquivo separado. Que tipo de arquivo é esse? Adivinha: .java! Sim, para cada página existe uma classe Java para controlar os componentes dinâmicos e estado que esta terá durante o fluxo do site. Isso dá ao designer, preview direto no browser, sem aquelas tags malucas de Struts/JSF ou Velocity, que detonam com o Dreamweaver, Nvu e outros WYSIWYG. Tudo isso graças a um HTML limpo de tags. É possível desenvolver um website, utilizando o protótipo que o cliente enviou, fazendo algo em torno de 5% a 15% de alterações no código HTML, e mantendo-o totalmente funcional direto no browser.


Vamos ver um exemplo de uma página Wicket (aquele infernal Hello World):


<html>

<head><title>Hello Wicket</title></head>

<body>

<span wicket:id="usuario">Bruno Borges</span>

</body>

</html>


E aqui, a classe Java colocando um valor diferente no componente usuario:


public class UsuarioPage extends WebPage {

public UsuarioPage() {

add(new Label("usuario", "Nissim Miojo"));

}

}


Abrindo o arquivo UsuarioPage.html temos um preview puro de uma página estática com o conteúdo Bruno Borges. Agora, se executarmos através do framework Wicket, o conteúdo Nissim Miojo substituirá o valor de protótipo do componente usuário. No que isso é bom? Manter um protótipo funcional e facilitar que o designer faça alterações sem ferrar com o código! :D

E o que mais?

Tem muito mais! Mas agora está tarde, e vou dormir. Quando me inspirar outra vez, posto mais coisas!


[]'s!!
miojo

22 abril 2007

Atualizando minha "second life"

Não, não tem nada a ver com o jogo Second Life, que aliás eu também tenho conta para brincar de vez enquando. Mas vi que minha vida online estava bem bagunçada, então aproveitei esta tarde de Domingo para dar uma geral. Dêem uma olhada no changelog da minha second life:
  • Mudei o layout e acrescentei/removi algumas informações e componentes deste blog;
  • Desbaguncei todas as fotos que estão no meu computador;
  • Criei meu album online no Picasa Web e publiquei algumas já;
  • Criei uma Wiki para manter online um tipo de base de conhecimento próprio sobre softwares e outras coisas, para lembrar algo do tipo "como que fiz aquela instalação mesmo?"
  • Registrei o domínio brunoborges.com.br e utilizarei ele como raiz para meus sites pessoais (blog, wiki, album);
  • Atualizei minha rádio no Last.FM (vejam que existe um componente na lateral para ver o que ando escutando recentemente);
  • Publiquei no IMDb.com a lista de filmes que já assisti (ainda faltam muitos outros, mas já é um começo);
  • E tem também aqui a lista de livros que já lí. Talvez eu coloque elas num post próprio aqui no Blogspot, mantendo-o atualizado;
Por enquanto é isso, mas que fique registrado que pretendo manter essa vida online atualizada com maior freqüência agora.

[]'s!

21 fevereiro 2007

Fatboy Slim 2007

Sim, Fatboy Slim! Incrível como o cara consegue cativar qualquer público. Não é só a música, mas a euforia que ele dispara a partir das pick-ups, envolvendo todos a dançarem com animação e entusiasmos dignos de pura diversão. O carnaval por aqui começou com esse show, e não parou por ae!


Início do show!



They know what is what!



E o carnaval continua!!

21 janeiro 2007

TAM


TAM = Transtorno Aéreo Massivo.... Meu vôo foi cancelado, queriam que eu fosse no vôo da BRA, depois mudaram pra outro vôo da própria TAM... Atraso no domingo até vai, mas vôo cancelado é foda!

Ben Harper em Floripa

O meu primeiro, e na minha opinião o melhor, show de 2007! Quem não foi ainda há chances para assistir em outras cidades. Quem foi, pôde ver de perto e em primeira mão, a vibração e o entusiasmo que Ben Harper possui para transmitir sua música ao público.

No vídeo abaixo, os momentos finais do show que agitou e tremeu a cidade!




Foi realmente excelente poder assistir, cantar e curtir Ben Harper and the Innocent Criminals de perto, com direito à Bandeira do Brasil e e vários "Obrigado" arranhados em português. Burn one down com a ótima percurssão não pôde ser esquecida! Fora outras excelentes músicas como With my Own Two Hands, Steal My Kisses e até um cover de Bob Marley. Foi demais!!!

Para aqueles que foram, o que acharam do show? Comentem!

09 janeiro 2007

Ponte...


Passamos a vida toda acreditando que seremos felizes um dia. A verdade? É que ficaremos tristes diversos dias durante nossa vida. Então, a lição é que não devemos plantar vegetais podres para colhermos apenas alguns bons mas sim desconsiderar os poucos podres que encontrarmos no meio da colheita. Felicidade não é feita de momentos mas sim de estado de espírito. 
A ponte é símbolo de união, conexão, ligacao... E não deixa de possuir um caminho. Que todos possam um dia encontrar suas pontes rumo à sua colheita...
Um ótimo 2007 para todos...

01 janeiro 2007

Dois Mil e Sete! :D


2007 chegou! Após longos 365 (ou 366?) dias, começamos tudo outra vez... Promessa de sobra, ressaca a vontade... Que mais? Ah sim, felicidade! E no meio da virada, o retrato da explosão que trará alegria! :D

Fui!
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