Nos dias 20, 21 e 22 de Agosto aconteceu a 4a Edição do The Developers Conference, o TDC2010, evento de desenvolvedores para desenvolvedores, organizado pela Globalcode. Nesse ano a Globalcode inovou trazendo variedade de assuntos com 13 trilhas, em parceria com outras Empresas/Grupos/Profissionais Independentes, aumentando o "menu" tornando o evento completo a um valor simbólico. E de quebra com transmissão online, favorecendo principalmente o pessoal fora de SP.
O evento foi incrível, uma mistura fantástica de assuntos e comunidades em uma vibe bem interessante com muita troca de informação e networking, além da chance de rever vários amigos, quem foi sabe o que estou falando. Pra quem não foi pode ter uma idéia do que rolou nos diversos posts resumindo o que rolou no TDC2010.
Um detalhe que tornou nossa (eu e o Rafael Nunes) participação ainda mais especial é que esse foi a nossa primeira participação como YaW. Apoiamos e participamos de várias palestras em diferentes trilhas como ouvintes e palestrantes trocando um pouco de nossa experiencia com a galera. Outro ponto foi que no TDC2010 apresentamos mais 10 demonstrações, afinal evento de desenvolvedores nada melhor que código.
Na sexta logo após a abertura do evento, apresentei a primeira palestra da Trilha de JavaEE falando sobre a evolução do JSF, melhorias e o amadurecimento da versão 2.0 com a possibilidade de adotar suítes de componentes customizadas. Fiz demonstrações com as suites PrimeFaces, RichFaces e ICEFaces todas incorporadas ao ScrumToys. Na sequência o Rafael apresentou como desenvolver com JSF no Google App Engine.
A tarde, na Trilha de Spring, apresentei palestra falando sobre opções de desenvolvimento RIA com o Spring Framework junto com o Rafael. Comentei sobre o GWT, pontos fortes e fracos, e de como ele poderia ser integrado ao Spring em mais de uma opção de arquitetura com uma demonstração usando GwtRPCController. O Rafael demonstrou como é possível integrar Adobe Flex com Spring MVC.
Depois disso, na Trilha Mobile, assisti a palestra do amigo Fernando Ribeiro contando um pouco dos desafios e as oportunidades desenvolvimento BlackBerry para o mercado Corporativo com muito bom humor e riqueza de conteúdo, característico do Fribeiro. Ainda na trilha Mobile, no fim do dia, rolou um painel com representantes das principais plataformas mobile e o ponto de vista de cada um em relação a oportunidades e inovação.
Já no sábado pela manhã, assisti algumas palestras na Trilha de NOSQL, como leigo no assunto estou naquela fase de descoberta e novidades. Valeu muito para adquirir um pouco mais de conhecimento além de pegar várias dicas e referências para estudo. Depois do almoço, na Trilha Java, apresentei uma palestra sobre JavaFX partindo de um ponto de vista divertido, aonde destrinchei um jogo de Quebra-Cabeças aonde as peças são montadas dinâmicamente a partir de uma imagem. Não poderia faltar algo mais "corporativo", demonstrei um CRUD puro com JavaFX, um outro exemplo de CRUD usando JPA reaproveitando uma estrutura em Java e por fim um exemplo de integração com serviço na Web no Google App Engine acessado via REST.
Depois assisti uma ótima palestra sobre linguagens dinâmicas na JVM, onde fui apresentado ao Quercus uma alternativa de integrar PHP com Java, apresentado pelo Jefferson Prestes. Pra fechar o dia uma passada rápida na Trilha de Ruby, e mais bate-papo com amigos que encontrei no evento.
Já no Domingo não estive presente fisicamente acompanhei o TDC2010 pelo twitter. Aliás a hash #TDC2010 foi um sucesso no twitter, ficamos até no TrendsBR, um ótimo foto on-line do evento outra oportunidade para quem não foi acompanhar o que estava rolando!
O TDC2010 foi único, gostei a definição/analogia que o Jorge Diz fez aqui. Deixou saudades!
http://www.yaw.com.br
http://twitter.com/edermag
Thursday, September 02, 2010
Friday, June 18, 2010
i18n de Portlets em JSF e JSP com JSTL
Existem várias formas p/ internacionalizar labels no desenvolvimento de Portlets, no post comento sobre 2 alternativas: básico com JSP e JSTL, outra opção é JavaServer Faces.
No caso de JSP e JSTL é só usar as tags fmt:setBundle e fmt:message da taglib de formatação, da mesma forma que uma aplicação web comum (sem portlets).
E o JavaServer Faces?
O mecanismo nativo de i18n do JSF funciona para portlets, é só definir os idiomas suportados no faces-config.xml, usar a tag f:loadBundle e por fim outputText e/ou outputFormat indicando o bundle e chave da label.
Em ambas alternativas, JSF ou JSP/JSTL, existe uma limitação: o title do portlet, que normalmente é definido no descritor portlet.xml, não se encaixa nos modelos de i18n descritos.
A solução é bem simples, no caso do JSTL a alternativa que encontrei foi apelar para a própria API de Portlets. No portlet.xml mapeio como title a chave que corresponde ao título no arquivo de i18n, já no código java do portlet sobreescrevo o método getTitle (herança de GenericPortlet) pegando a informação do xml e na raça acessando o bundle indicando a chave, o código seria próximo a esse:
portlet.xml
messages_pt_BR.properties:
trecho do código java do Portlet:
A solução no JSF é mais simples! Coloque a chave javax.portlet.title com o respectivo valor dentro do arquivo de i18n do aplicativo. Mas existe um macete, no portlet.xml também é preciso indicar o arquivo i18n e os idiomas suportados. A seguir um exemplo de como isso é feito.
messages_pt_BR.properties:
portlet.xml
Importante: Sobre o que foi descrito em relação a JSF, o portlet roda no JBoss Portal com JBoss Portlet Bridge.
http://twitter.com/edermag
http://www.yaw.com.br
No caso de JSP e JSTL é só usar as tags fmt:setBundle e fmt:message da taglib de formatação, da mesma forma que uma aplicação web comum (sem portlets).
E o JavaServer Faces?
O mecanismo nativo de i18n do JSF funciona para portlets, é só definir os idiomas suportados no faces-config.xml, usar a tag f:loadBundle e por fim outputText e/ou outputFormat indicando o bundle e chave da label.
Em ambas alternativas, JSF ou JSP/JSTL, existe uma limitação: o title do portlet, que normalmente é definido no descritor portlet.xml, não se encaixa nos modelos de i18n descritos.
A solução é bem simples, no caso do JSTL a alternativa que encontrei foi apelar para a própria API de Portlets. No portlet.xml mapeio como title a chave que corresponde ao título no arquivo de i18n, já no código java do portlet sobreescrevo o método getTitle (herança de GenericPortlet) pegando a informação do xml e na raça acessando o bundle indicando a chave, o código seria próximo a esse:
portlet.xml
<portlet-app ... >
<portlet>
...
<portlet-info>
<title>meu.portlet.titulo</title>
</portlet-info>
</portlet>
...
</portlet-app>
messages_pt_BR.properties:
... meu.portlet.titulo=Testando i18n em Portlet c/ JSTL ...
trecho do código java do Portlet:
protected String getTitle(RenderRequest request) {
String key = super.getTitle(request);
try {
ResourceBundle bundle = ResourceBundle.getBundle("messages",
request.getLocale(),getClass().getClassLoader());
return bundle.getString(key);
} catch (Exception ex) {
//log4j
log.error("Valor ["+key+"] (i18n) p/ titulo nao encontrado", ex);
return key;
}
}
A solução no JSF é mais simples! Coloque a chave javax.portlet.title com o respectivo valor dentro do arquivo de i18n do aplicativo. Mas existe um macete, no portlet.xml também é preciso indicar o arquivo i18n e os idiomas suportados. A seguir um exemplo de como isso é feito.
messages_pt_BR.properties:
... javax.portlet.title=Testando i18n em Portlet c/ JSF ...
portlet.xml
<portlet-app ... >
<portlet>
...
<supported-locale>pt_BR</supported-locale>
<supported-locale>en_US</supported-locale>
<resource-bundle>messages</resource-bundle>
</portlet>
...
</portlet-app>
Importante: Sobre o que foi descrito em relação a JSF, o portlet roda no JBoss Portal com JBoss Portlet Bridge.
http://twitter.com/edermag
http://www.yaw.com.br
Wednesday, May 05, 2010
Aprendendo JSF 2.0 com ScrumToys na JavaMagazine - edição 78
Já esta nas bancas a Java Magazine edição numero 78 com artigo (da capa) JSF 2.0: Aprendendo JSF 2.0 com ScrumToys escrito por mim e pelo Vinicius Nunes, instrutor da Globalcode de Floripa.
A proposta do artigo é comentar sobre as mudanças do JSF 2, mas além disso uma preocupação nossa foi colocar conteúdo para quem ainda não teve contato com a tecnologia, seja profissional experinte ou iniciante. É que o artigo ficou um pouquinho grande (rs).
Para mostrar a implementação dos recursos do JSF utilizamos os fontes do ScrumToys, criado justamente para o aprendizado na tecnologia.
No blog da Globalcode fiz uma experiencia, usei o PrimeFaces com JSF 2. Na realidade configurei o PrimeFaces no ScrumToys e utilizei o datatable, fácil, simples e funcionou perfeitamente!
http://twitter.com/edermag
http://www.yaw.com.br
A proposta do artigo é comentar sobre as mudanças do JSF 2, mas além disso uma preocupação nossa foi colocar conteúdo para quem ainda não teve contato com a tecnologia, seja profissional experinte ou iniciante. É que o artigo ficou um pouquinho grande (rs).
Para mostrar a implementação dos recursos do JSF utilizamos os fontes do ScrumToys, criado justamente para o aprendizado na tecnologia.
No blog da Globalcode fiz uma experiencia, usei o PrimeFaces com JSF 2. Na realidade configurei o PrimeFaces no ScrumToys e utilizei o datatable, fácil, simples e funcionou perfeitamente!
http://twitter.com/edermag
http://www.yaw.com.br
Marcadores:
Artigo,
Globalcode,
JSF,
YaW
Sunday, April 25, 2010
Configurando o Hibernate 3.5 com Maven
No fim do mês de Março foi lançado o Hibernate 3.5 com novas funcionalidades e a partir dessa versão compatível a JPA2, agora um concorrente ao EclipseLink a implementação de referência. No ScrumToys - projeto da Globalcode exemplo no Netbeans 6.8 - utilizamos o EclipseLink como provider JPA.
O Maven simplifica bastante a vida do desenvolvedor java, isso é indiscutível afinal ficar controlando dependências na mão ficou fora de moda a um tempo. Mesmo quem esta começando usar Java pode tornar essa experiencia mais produtiva, mão na massa sem se preocupar com a burocracia dos jars.
A documentação do Hibernate mostra a configuração exemplo de projeto usando o maven, mas esse mapeamento não funciona por não definir a tag version na dependency, por isso montei um exemplo de pom.xml para utilizar o Hibernate 3.5:
Agora é só mandar bala com recursos do hibernate.
http://twitter.com/edermag
http://www.yaw.com.br
O Maven simplifica bastante a vida do desenvolvedor java, isso é indiscutível afinal ficar controlando dependências na mão ficou fora de moda a um tempo. Mesmo quem esta começando usar Java pode tornar essa experiencia mais produtiva, mão na massa sem se preocupar com a burocracia dos jars.
A documentação do Hibernate mostra a configuração exemplo de projeto usando o maven, mas esse mapeamento não funciona por não definir a tag version na dependency, por isso montei um exemplo de pom.xml para utilizar o Hibernate 3.5:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.globalcode</groupId>
<artifactId>hibernate-exemplo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>hibernate-exemplo</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<url>http://repository.jboss.com/maven2/</url>
<id>hibernate-support</id>
<layout>default</layout>
<name>Repository for library Library[hibernate-support]</name>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.0-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.0-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.0-Final</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Agora é só mandar bala com recursos do hibernate.
http://twitter.com/edermag
http://www.yaw.com.br
Sunday, January 24, 2010
2009 passou voando! Mas relembrando...
O começo de 2009 foi um tanto quanto apreensivo, a expectativa sobre os impactos da crise econômica por aqui eram preocupantes. Ainda bem que as previsões mais pessimistas ficaram pra trás e de uma forma geral conseguimos passar por essa turbulência.
Pra mim 2009 começou com mudança de emprego, quem me conhece sabe que isso é um pouco difícil mim. Novos desafios, ambiente mais complexo, tecnologias diferentes, uma equipe de alto nível técnico entre outros, foram os motivadores para encarar essa nova jornada na Superbid.
Mão na massa, trabalhei com as seguintes tecnologias em diversos projetos:
Na Globalcode 2009 foi um ano incrível, repleto de realizações. Trabalhei c/ muitas turmas, conheci pessoas de diferentes perfis e espectativas em relação tecnologia Java. Foram turmas de Academia Java, Academia Web Developer, hands-on e vários minicursos.
A Globalcode promoveu vários eventos para comunidade Java, estive presente em todos em alguns apresentei algum tema:
A Globalcode retomou o Casual Class, que promove um bate-papo descontraído sobre tecnologia c/ Pizza + Cerveja + Vinho. Uma oportunidade de aproximar e fomentar a comunidade! Vários assuntos em pauta, como JavaOne 2009, Robótica, Java EE 6 e Cloud Computing.
Foi no Casual Class de Java EE 6 que fui apresentado ao Scrum Toys, projeto open source da Globalcode demo de JSF2 dentro Netbeans 6.8. Conversei com a Yara sobre algumas coisas interessantes que poderiam ser feitas no projeto como o suporte a bookmarkable, c/ seu apoio abracei a causa colaborando com algumas features. Foi uma experiência enriquecedora, mais detalhes sobre minha participação aqui.
Bastante coisa, mas ainda tem mais. Em 2009 tive a oportunidade de criar e apresentar 2 minicursos:
Ainda mais próximo da comunidade de desenvolvimento, foi lançado o Globalcoders, o blog do time Globalcode. Um espaço democrático para Informação + Colaboração + Discussão. Posts relacionados a tecnologia, num formato objetivo, claro e prático em uma linguagem de fácil compreensão. Bloguei sobre Facelets com um post para uso de templates e outro para criação de componentes. Outro post foi um pouco de como funciona o compilador (mágico) do GWT.
Uma dica bem legal é a lista do time Globalcode no twitter. Ótima oportunidade pra ficar pro dentro das novidades que estão rolando e no que estamos trabalhando.
A Globalcode disponibilizou um vídeo bem legal com um resumo, ou melhor uma retrospectiva 2009 e de quão intenso foi esse ano.
E pra encerrar iniciamos a realização de um projeto que há tempos vinhamos planejando, a YaW! Unidade da Globalcode no Grande ABC. Mas isso eu vou descrever em outro post.
Expectativas para 2010 são as melhores, muita determinação e vontade pra enfrentar mais desafios! Trabalho e tesão não faltam.
http://twitter.com/edermag
http://www.yaw.com.br
Pra mim 2009 começou com mudança de emprego, quem me conhece sabe que isso é um pouco difícil mim. Novos desafios, ambiente mais complexo, tecnologias diferentes, uma equipe de alto nível técnico entre outros, foram os motivadores para encarar essa nova jornada na Superbid.
Mão na massa, trabalhei com as seguintes tecnologias em diversos projetos:
- Spring MVC
- GWT
- JBoss Portal
- JBoss Bridge
- JSF 1.2 c/ RichFaces
- Python - Genshi
- Alguns legados em PHP e PL-SQL.
Na Globalcode 2009 foi um ano incrível, repleto de realizações. Trabalhei c/ muitas turmas, conheci pessoas de diferentes perfis e espectativas em relação tecnologia Java. Foram turmas de Academia Java, Academia Web Developer, hands-on e vários minicursos.
A Globalcode promoveu vários eventos para comunidade Java, estive presente em todos em alguns apresentei algum tema:
- Profissão Java: primeiro evento sobre carreira voltado ao profissional que trabalha ou quer trabalhar com Java, com palestrantes apresentando conteúdo de ponta (ex.: TV Digital) em alto nível para comunidade. Evento gratuito!
- Open TDC: outro evento gratuito, que aconteceu em Sampa e Floripa! O evento contou com importantes figuras da comunidade de desenvolvimento, com palestras de diversos temas e qualidade de ponta. Apresentei junto com o Rafael Nunes e o Mauricio Leal uma Painel sobre opções RIA p/ Web: JavaFX, Adobe Flex e GWT. O Vinicius apresentou os projetos relacionados a Robótica da Globalcode, além do novo treinamento: Academia do Programador.
- TDC : o maior e principal evento Java do país, trouxe em sua terceira edição palestrantes internacionais de peso da Sun, Oracle, Google e JBoss. Apresentei uma Lightning Talk sobre as tecnologias open da Google para desenvolvimento Java: GWT e Google Guice. Aqui um resumo do evento que foi fantástico! Em 2009 além de São Paulo e Floripa, o TDC teve sua versão Guanabara, a estreia no Rio de Janeiro.
A Globalcode retomou o Casual Class, que promove um bate-papo descontraído sobre tecnologia c/ Pizza + Cerveja + Vinho. Uma oportunidade de aproximar e fomentar a comunidade! Vários assuntos em pauta, como JavaOne 2009, Robótica, Java EE 6 e Cloud Computing.
Foi no Casual Class de Java EE 6 que fui apresentado ao Scrum Toys, projeto open source da Globalcode demo de JSF2 dentro Netbeans 6.8. Conversei com a Yara sobre algumas coisas interessantes que poderiam ser feitas no projeto como o suporte a bookmarkable, c/ seu apoio abracei a causa colaborando com algumas features. Foi uma experiência enriquecedora, mais detalhes sobre minha participação aqui.
Bastante coisa, mas ainda tem mais. Em 2009 tive a oportunidade de criar e apresentar 2 minicursos:
- Introdução ao Google Web Toolkit: conteúdo necessário para quem quer saber o que é ou iniciar o desenvolvimento com essa ótima alternativa para Rich Internet Application criado pelo Google.
- Introdução ao Google GO: apresentando características da nova linguagem do Google, explorando alguns recursos interessantes. O GO seria uma mistura de C++ e Python.
Ainda mais próximo da comunidade de desenvolvimento, foi lançado o Globalcoders, o blog do time Globalcode. Um espaço democrático para Informação + Colaboração + Discussão. Posts relacionados a tecnologia, num formato objetivo, claro e prático em uma linguagem de fácil compreensão. Bloguei sobre Facelets com um post para uso de templates e outro para criação de componentes. Outro post foi um pouco de como funciona o compilador (mágico) do GWT.
Uma dica bem legal é a lista do time Globalcode no twitter. Ótima oportunidade pra ficar pro dentro das novidades que estão rolando e no que estamos trabalhando.
A Globalcode disponibilizou um vídeo bem legal com um resumo, ou melhor uma retrospectiva 2009 e de quão intenso foi esse ano.
E pra encerrar iniciamos a realização de um projeto que há tempos vinhamos planejando, a YaW! Unidade da Globalcode no Grande ABC. Mas isso eu vou descrever em outro post.
Expectativas para 2010 são as melhores, muita determinação e vontade pra enfrentar mais desafios! Trabalho e tesão não faltam.
http://twitter.com/edermag
http://www.yaw.com.br
Marcadores:
Globalcode,
Pessoal,
YaW
Sunday, December 06, 2009
Como Instalar Google GO no Ubuntu e Mac Os
Vou descrever quais são as etapas necessarias para instalação do Google GO, a nova linguagem de programação do Google, no Ubuntu 9.10 e no Mac OS 10.5 (Leopard).
Pré-requisitos para instalar e usar o GO:
O Python é pré-requisito para o Mercurial.
Uma vez que essas ferramentas tenham sido instaladas, a proxima etapa seria configurar algumas variáveis de ambiente que o GO usa:
Os comandos para instalação do Mercurial e GCC são:
Na sequencia é preciso criar a estrutura de diretórios e configurar as variáveis de ambiente (no arquivo ~/.bashrc):
Para baixar os fontes do GO, use o seguinte comando:
Para compilar os fontes do GO (a partir do dirétorio src):
Ambiente configurado no Ubuntu!
Baixe o Mercurial aqui, e instale o dmg.
Caso ainda não tenha o xCode, baixe aqui para resolver o GCC.
A seguir a criação das pastas e configuração das variáveis de ambiente no arquivo .bash_profile:
Para baixar os fontes do GO, use o seguinte comando:
Para compilar os fontes do GO (a partir do dirétorio src):
Pronto! Agora é só partir pro Hello World, veja um exemplo.
Pré-requisitos para instalar e usar o GO:
- Mercurial: ferramenta para controle de fontes (repositório) distribuído.
- GCC: compilador C.
O Python é pré-requisito para o Mercurial.
Uma vez que essas ferramentas tenham sido instaladas, a proxima etapa seria configurar algumas variáveis de ambiente que o GO usa:
- GOROOT: diretório raiz da instalação do GO.
- GOBIN: diretório com conteúdo binário.
- GOOS: sistema operacional.
- GOARCH: indica qual arquitetura para compilação.
No Ubuntu
Os comandos para instalação do Mercurial e GCC são:
$ sudo apt-get install mercurial $ sudo apt-get install bison gcc libc6-dev ed make
Na sequencia é preciso criar a estrutura de diretórios e configurar as variáveis de ambiente (no arquivo ~/.bashrc):
$ mkdir $HOME/go $ mkdir $HOME/go/bin $ mkdir $HOME/go/src export GOROOT=$HOME/go/src export GOBIN=$HOME/go/bin export GOOS=linux export GOARCH=386 export PATH=$PATH:$HOME/go/bin
Para baixar os fontes do GO, use o seguinte comando:
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
Para compilar os fontes do GO (a partir do dirétorio src):
$ cd $GOROOT/src $ ./all.bash
Ambiente configurado no Ubuntu!
No Mac OS
Baixe o Mercurial aqui, e instale o dmg.
Caso ainda não tenha o xCode, baixe aqui para resolver o GCC.
A seguir a criação das pastas e configuração das variáveis de ambiente no arquivo .bash_profile:
$ mkdir $HOME/go $ mkdir $HOME/go/bin $ mkdir $HOME/go/src export GOROOT=$HOME/go/src export GOBIN=$HOME/go/bin export GOOS=darwin export GOARCH=386 export PATH=$PATH:$HOME/go/bin
Para baixar os fontes do GO, use o seguinte comando:
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
Para compilar os fontes do GO (a partir do dirétorio src):
$ cd $GOROOT/src $ ./all.bash
Pronto! Agora é só partir pro Hello World, veja um exemplo.
Marcadores:
GO,
Google,
Programação
Saturday, November 21, 2009
The Developers Conference 2009 simplesmente incrivel!
Nos dias 06 e 07 de Novembro em São Paulo aconteceu The Developers Conference 2009, terceira edição do maior e melhor evento Java do Brasil promovido e organizado pela Globalcode. As 2 edições anteriores foram excelentes, mas esse ano o evento foi fantástico, com uma grade e palestrantes de altíssimo nível, como por exemplo Rod Johnson o pai/guru do Spring.
O TDC 09 foi realizado também na Guanabara prestigiando o galera do Rio de Janeiro (UFF), depois de passar por Florianópolis (V.Office).
Outra novidade foram os Lightning Talks, apresentações rápidas (+ ou - 15 minutos) com demonstrações práticas que aconteceram no decorrer das palestras. Tive a oportunidade de apresentar sobre GWT e Guice, bem introdutório mas focando no quanto o Google aposta na comunidade Java.
Falando um pouco mais sobre os palestrantes, além de Rod Johnson também tivemos a oportunidade de ver Mike Keith (Oracle) co-líder da especificação de JPA, Ed Burns (Sun) líder da especificação de JSF 2, Alejandro Guizer engenheiro de Software da Red Hat e Francisco da Google substituindo Chris Schalk, e outras personalidades da comunidade nacional. Foi uma oportunidade ímpar para fazer networking.
As palestras superaram as expectativas! No primeiro dia, Rod Johnson em seu Keynote comentou sobre o Futuro do Java EE como plataforma e as linguagens mais alto nível operando por cima, outra tendência é o Java como plataforma no universo Cloud Computing. Na sequência Ed Burns, Mike e Rod comentaram um pouco sobre o início de suas vidas profissionais, depois passaram valiosas dicas para quem esta começando a traçar carreira.
Na volta do almoço Mike Keith apresentou detalhes sobre o Java EE 6, a plataforma cada vez mais robusta, madura e simples para o desenvolvimento dia-a-dia. Ed Burns apresentou a padronização da nova forma de criar telas com JSF2 abusando de reutilização e composição, Composite Components. Na sequência Yara e Spock apresentaram o projeto demonstração do NetBeans e GlassFish mantido pela Globalcode, o Scrum Toys, uma case mostrando a força da comunidade brasileira!
Já no sábado fiquei muito empolgado com a palestra do Rod sobre o Spring 3.0, a evolução da consagrada suite de tecnologias para desenvolvimento, o que mais me chamou a atenção foi Spring Roo como uma alternativa para Rails. Depois do almoço Mike apresentou detalhes da especificação JPA 2.0, mostrou os novos recursos dessa JSR.
Francisco (Google) e Rafael apresentaram sobre a plataforma Cloud do Google o App Engine. Francisco comentando sobre a nova possibilidade de desenvolvimento de software com Cloud e um pouco da estratégia do Google nesse segmento. Rafael apresentou exemplo de como rodar JSF2 no Cloud, algo novo até então, outro ponto positivo pra comunidade brasileira!
Fechando o evento tivemos o Debate Cloud Computing na visão dos Players: Google (Francisco) + Oracle (Mike) + Sun (Ed) + Spring Source (Rod) + Yahoo (Bene) + JBoss Red Hat (Alejandro) mediado pelo Júlio (Globalcode). Esse bate-papo bem descontraído teve como objetivo mostrar do ponto de vista de cada um qual é a expectativa sobre o Cloud Computing, o que isso pode trazer como solução e/ou serviços para nós desenvolvedores.
Gostei muitos dos Lightning Talks, principalmente "Boas práticas com Spring" apresentado pelo Jun, "WebBeans/Context Dependency Injection na prática com Weld" - novo Seam - da JBoss e "Melhorando performance de JPA com Spring Web Flow" do Spock com dicas preciosas para o desenvolvimento com JSF.
Durante o evento o Vinicius Senger despertou o lado Prof. Pardal da galera, apresentando vários Robôs usando o Arduíno, mostrando um pouco do que a Globalcode pretende realizar: como pode ser simples e divertido usar robótica, fique por dentro no blog Elétron Livre!
O evento foi incrível, além de muito conteúdo, networking e diversão tive a oportunidade de rever velhos amigos e conhecer pessoalmente grandes figuras como o Bene (Benedicto Franco) da Yahoo. Conheci o pessoal do Rio (Universidade Federal Fluminense) e uma galera de Uberlândia. No ano que vem vou estar presente nas versões do TDC!
O TDC 09 foi realizado também na Guanabara prestigiando o galera do Rio de Janeiro (UFF), depois de passar por Florianópolis (V.Office).
Outra novidade foram os Lightning Talks, apresentações rápidas (+ ou - 15 minutos) com demonstrações práticas que aconteceram no decorrer das palestras. Tive a oportunidade de apresentar sobre GWT e Guice, bem introdutório mas focando no quanto o Google aposta na comunidade Java.
Falando um pouco mais sobre os palestrantes, além de Rod Johnson também tivemos a oportunidade de ver Mike Keith (Oracle) co-líder da especificação de JPA, Ed Burns (Sun) líder da especificação de JSF 2, Alejandro Guizer engenheiro de Software da Red Hat e Francisco da Google substituindo Chris Schalk, e outras personalidades da comunidade nacional. Foi uma oportunidade ímpar para fazer networking.
As palestras superaram as expectativas! No primeiro dia, Rod Johnson em seu Keynote comentou sobre o Futuro do Java EE como plataforma e as linguagens mais alto nível operando por cima, outra tendência é o Java como plataforma no universo Cloud Computing. Na sequência Ed Burns, Mike e Rod comentaram um pouco sobre o início de suas vidas profissionais, depois passaram valiosas dicas para quem esta começando a traçar carreira.
Na volta do almoço Mike Keith apresentou detalhes sobre o Java EE 6, a plataforma cada vez mais robusta, madura e simples para o desenvolvimento dia-a-dia. Ed Burns apresentou a padronização da nova forma de criar telas com JSF2 abusando de reutilização e composição, Composite Components. Na sequência Yara e Spock apresentaram o projeto demonstração do NetBeans e GlassFish mantido pela Globalcode, o Scrum Toys, uma case mostrando a força da comunidade brasileira!
Já no sábado fiquei muito empolgado com a palestra do Rod sobre o Spring 3.0, a evolução da consagrada suite de tecnologias para desenvolvimento, o que mais me chamou a atenção foi Spring Roo como uma alternativa para Rails. Depois do almoço Mike apresentou detalhes da especificação JPA 2.0, mostrou os novos recursos dessa JSR.
Francisco (Google) e Rafael apresentaram sobre a plataforma Cloud do Google o App Engine. Francisco comentando sobre a nova possibilidade de desenvolvimento de software com Cloud e um pouco da estratégia do Google nesse segmento. Rafael apresentou exemplo de como rodar JSF2 no Cloud, algo novo até então, outro ponto positivo pra comunidade brasileira!
Fechando o evento tivemos o Debate Cloud Computing na visão dos Players: Google (Francisco) + Oracle (Mike) + Sun (Ed) + Spring Source (Rod) + Yahoo (Bene) + JBoss Red Hat (Alejandro) mediado pelo Júlio (Globalcode). Esse bate-papo bem descontraído teve como objetivo mostrar do ponto de vista de cada um qual é a expectativa sobre o Cloud Computing, o que isso pode trazer como solução e/ou serviços para nós desenvolvedores.
Gostei muitos dos Lightning Talks, principalmente "Boas práticas com Spring" apresentado pelo Jun, "WebBeans/Context Dependency Injection na prática com Weld" - novo Seam - da JBoss e "Melhorando performance de JPA com Spring Web Flow" do Spock com dicas preciosas para o desenvolvimento com JSF.
Durante o evento o Vinicius Senger despertou o lado Prof. Pardal da galera, apresentando vários Robôs usando o Arduíno, mostrando um pouco do que a Globalcode pretende realizar: como pode ser simples e divertido usar robótica, fique por dentro no blog Elétron Livre!
O evento foi incrível, além de muito conteúdo, networking e diversão tive a oportunidade de rever velhos amigos e conhecer pessoalmente grandes figuras como o Bene (Benedicto Franco) da Yahoo. Conheci o pessoal do Rio (Universidade Federal Fluminense) e uma galera de Uberlândia. No ano que vem vou estar presente nas versões do TDC!
Marcadores:
Globalcode,
Java,
TDC
Saturday, October 17, 2009
Client Subversion com Python
Existem vários clients e plugins disponíveis para acessar e manipular o respositório do subversion. Uma categoria de clients chamada Subversion Language Bindings permite o acesso ao svn via API, com suporte a linguagens como Java, Python, C++, veja mais detalhes aqui.
Abaixo um exemplo de código em Python usando o extensão pysvn que faz uso desse mecanismo e monta um relatório da quantidade de recursos manipulados agrupados por Desenvolvedor/Autor e por Data.
Na realidade usei esse script python como base, nesse script além dos filtros por Autor e/ou Dias a contagem é realizada por resources no(s) commit, a saída é agrupada por autor e data de commit.
Abaixo um exemplo de código em Python usando o extensão pysvn que faz uso desse mecanismo e monta um relatório da quantidade de recursos manipulados agrupados por Desenvolvedor/Autor e por Data.
import sys, pysvn, re
from datetime import date
import datetime
def repos(work_path):
"Get the svn repository url"
info = pysvn.Client().info(work_path)
if info.repos:
return info.repos
# special case - checked out the trunk
if info.url.endswith("/trunk"):
return re.sub(r"/trunk$", "", info.url)
# default to the current dir's url
return info.url
def arg(index):
# find argument, if doesnt exists return None
args = sys.argv[1:]
try:
return args[index]
except IndexError:
return None
def dayBeforeToday(d):
try:
diff = datetime.timedelta(days=int(d))
return date.today() - diff
except:
return None
def query(repos, author, days):
print "get in: "+repos
logs = []
for l in pysvn.Client().log(repos, discover_changed_paths=True):
logs.append({"author": l["author"], "date": date.fromtimestamp(l["date"]), "changed_count": len(l["changed_paths"])})
if not (author in [None, "-", "." ]):
logs = list(filter_logs(logs, lambda k, v: k == "author" and v == author))
dt = dayBeforeToday(days)
if not (dt in [None, "-", ".", "0"]):
logs = list(filter_logs(logs, lambda k, v: k == "date" and v >= dt))
return logs
def filter_logs(logs, where=lambda k, v: True):
#apply filter in log results
for l in logs:
for k, v in l.items():
if where(k, v):
yield l
def format2cols(items):
if len(items) == 0:
return "\n"
max_width = max(len(str(x)) for (x,y) in items)
template = "%%%ds %%s" % max_width
return "\n".join(template % (x, y) for (x, y) in items)
def sort_uniq_c(seq):
"Duplicate unix's 'sort | uniq -c | sort -nr'"
count_first = ((y,x) for (x,y) in histogram(seq, ["author", "date"]).items())
return format2cols(sorted(count_first, reverse=True))
def histogram(logs, groupBy):
result = {}
for l in logs:
k = ""
for s in groupBy:
k += str(l[s])+" "
result.setdefault(k,0)
result[k] += l["changed_count"]
return result
if __name__ == "__main__":
_author = arg(1)
_days = arg(2)
print sort_uniq_c(query(repos(work_path = "."), _author, _days))
Na realidade usei esse script python como base, nesse script além dos filtros por Autor e/ou Dias a contagem é realizada por resources no(s) commit, a saída é agrupada por autor e data de commit.
Saturday, August 29, 2009
JSF e Portlets no JBoss Portal
Dias atrás estive envolvido em um "projeto case", com o propósito de experimentar a arquitetura de Portais e Portlets. O software portal escolhido foi o JBoss Portal versão 2.7, que além do Portlet Container possui elementos bem interessantes, como o modulo de CMS e Portlet Bridge.
É possível instalar o JBoss Portal em JBoss AS existente. Fiz isso na versão 4.2, a única configuração necessária no meu caso foi o datasource do portal, mas isso pode ser mais complexo dependendo de como esta configuração de bibliotecas do servidor! A documentação é boa, existem vários exemplos de portlet e o próprio fonte do portal - implementado sob JSF e Hibernate - de fácil customização.
Um recurso que me chamou a atenção foi o JBoss Portlet Bridge, que permitir criar portlets utilizando JavaServer Faces (v 1.2) + Seam + RichFaces, com suporte Facelets. Com isso é possível criar um aplicação composta por portlets com todos os benefícios do JSF, sem se preocupar com a API e curva de aprendizado de Portlet, PortletContainer e Portais.
Montei um aplicativo relativamente simples, utilizando Facelets + RichFaces c/ JBoss Bridge, gerenciado pelo JBoss Portal dentro do JBoss AS 4.2. Nessa estrutura a programação é a mesma de um aplicativo MVC comum, ou seja, criação de telas com Facelets usando as tags JSF e RichFaces, o Managed Bean resolvendo a integração do View com Model. Na camada model utilizei Pojos com Hibernate. O único portlet utilizado na aplicação foi o javax.portlet.faces.GenericFacesPortlet, e no JSF o ViewHandler org.jboss.portletbridge.application.PortletViewHandler.
Encontrei pequenos problemas nessa integração, principalmente com alguns componentes do RichFaces, mas todos foram revertidos. Acredito que mistura tenha funcionado justamente por todos os componentes serem JBoss.
Java EE define 2 especificações para portlet: JSR 168, JSR 286. O JBoss Portlet Bridge é um draft para outras 2 especificações a JSR 301 e a JSR 329 que visam padronizar a integração entre Portlet e JSF.
É possível instalar o JBoss Portal em JBoss AS existente. Fiz isso na versão 4.2, a única configuração necessária no meu caso foi o datasource do portal, mas isso pode ser mais complexo dependendo de como esta configuração de bibliotecas do servidor! A documentação é boa, existem vários exemplos de portlet e o próprio fonte do portal - implementado sob JSF e Hibernate - de fácil customização.
Um recurso que me chamou a atenção foi o JBoss Portlet Bridge, que permitir criar portlets utilizando JavaServer Faces (v 1.2) + Seam + RichFaces, com suporte Facelets. Com isso é possível criar um aplicação composta por portlets com todos os benefícios do JSF, sem se preocupar com a API e curva de aprendizado de Portlet, PortletContainer e Portais.
Montei um aplicativo relativamente simples, utilizando Facelets + RichFaces c/ JBoss Bridge, gerenciado pelo JBoss Portal dentro do JBoss AS 4.2. Nessa estrutura a programação é a mesma de um aplicativo MVC comum, ou seja, criação de telas com Facelets usando as tags JSF e RichFaces, o Managed Bean resolvendo a integração do View com Model. Na camada model utilizei Pojos com Hibernate. O único portlet utilizado na aplicação foi o javax.portlet.faces.GenericFacesPortlet, e no JSF o ViewHandler org.jboss.portletbridge.application.PortletViewHandler.
Encontrei pequenos problemas nessa integração, principalmente com alguns componentes do RichFaces, mas todos foram revertidos. Acredito que mistura tenha funcionado justamente por todos os componentes serem JBoss.
Java EE define 2 especificações para portlet: JSR 168, JSR 286. O JBoss Portlet Bridge é um draft para outras 2 especificações a JSR 301 e a JSR 329 que visam padronizar a integração entre Portlet e JSF.
Marcadores:
Hibernate,
JBoss Seam,
JSF,
Portlets,
RichFaces
Thursday, July 09, 2009
Seam Component x Contextos
Complementando o ótimo post do Dr. Spock, na sequência coloco os tipos de Seam Component e quais contextos do Seam podem ou devem ser usados:
- Session Stateful (EJB) - por default é mantido em APPLICATION. Nunca devem ser associados a STATELESS ou PAGE.
- Session Stateless (EJB) - sempre mantido em STATELESS. Toda cada vez que requisitado o Seam busca uma instância (lookup).
- JPA Entity class - por default é mantido em CONVERSATION, nunca devem ser usados em STATELESS já que em algum momento devem ser sincronizados na base de dados.
- JavaBean / POJO - por default ficam em EVENT.
- Message Driven Bean - atua como uma listerner para Topic ou Queue, não é mantido em contexto Seam.
Marcadores:
JBoss Seam
Sunday, July 05, 2009
Testando Google Wave
Essa semana fui um dos vários convidados para testar o Google Wave. A ferramenta esta em fase de testes, vários ajustes e melhorias devem ser efetuados, na minha opnião o conceito da ferramenta eh show de bola. Principalmente a ideia de plataforma aonde vc consegue criar/estender elementos e rodar no wave.
Veja essa página que comenta sobre extensões do Wave:
Vc tem 2 alternativas para criar elementos para o Wave:
Veja essa página que comenta sobre extensões do Wave:
Vc tem 2 alternativas para criar elementos para o Wave:
- Robots - robô que atua como um participante/convidado de uma determinada Wave, como por exemplo um corretor ortográfico.
- Gadgets - pequenos aplicativos que rodam dentro da Wave, e compartilham seu estado para todos os participantes da mesma Wave, como por exemplo um mapa com a rota para uma balada.
Marcadores:
Google
JBoss Seam Timeout Conversation
Essa semana estava fussando bastante no Seam, e de repente pintou uma questão:
Qual é o timeout default do conversation caso o usuário não aciona uma requisição para o método @End? Será a mesma da Session?
A resposta é 10 minutos por default, encontrei isso no livro Seam In Action (pag. 300), ótimo por sinal!
Vc pode sobreescrever no component.xml, usando a tag:
core:manager timeout="600000"
Uma outra opção é usar a property timeout da tag page no mapeamento de view's (pages.xml):
page id="/cadastro.xhtml" timeout="300000"
Qual é o timeout default do conversation caso o usuário não aciona uma requisição para o método @End? Será a mesma da Session?
A resposta é 10 minutos por default, encontrei isso no livro Seam In Action (pag. 300), ótimo por sinal!
Vc pode sobreescrever no component.xml, usando a tag:
core:manager timeout="600000"
Uma outra opção é usar a property timeout da tag page no mapeamento de view's (pages.xml):
page id="/cadastro.xhtml" timeout="300000"
Marcadores:
JBoss Seam
Sunday, June 21, 2009
Hibernate Performance
Ótima apresentação do Emmanuel Bernard - co-autor de Hibernate Search in Action - mostrando algumas práticas e observações para escalar c/ Hibernate.
Marcadores:
Hibernate
Sunday, June 14, 2009
Concorrência - Iterar HashSet
Na sequência um exemplo de código que encapsula acesso a um HashSet de forma segura (nem tanto...):
O detalhe fica no método print, o compilador implicitamente cria código para navegar na coleção usando o Iterator, para realizar o print dos elementos.
Durante a iteração no elementos ninguém garante que uma outra thread acione o método addPalavra. Caso isso aconteça uma java.util.ConcurrentModificationException será lançada!
Para evitar isso o recomendado seria sincronizar a coleção, veja.
Interessante observação do livro Java Concurrency in Practice.
public class IteracaoVulneravel {
private Set palavras = new HashSet();
public synchronized void removePalavra(String palavra) {
palavras.remove(palavra);
}
public synchronized void addPalavra(String palavra) {
palavras.add(palavra);
}
//pode lançar java.util.ConcurrentModificationException
public void print() {
System.out.println("Palavras = "+palavras);
}
}
O detalhe fica no método print, o compilador implicitamente cria código para navegar na coleção usando o Iterator, para realizar o print dos elementos.
Durante a iteração no elementos ninguém garante que uma outra thread acione o método addPalavra. Caso isso aconteça uma java.util.ConcurrentModificationException será lançada!
Para evitar isso o recomendado seria sincronizar a coleção, veja.
Interessante observação do livro Java Concurrency in Practice.
Sunday, May 31, 2009
Extensões GWT
Essa semana estava finalizando a estrutura para o mini-curso de Gwt, já esta quase fechado!
Um outro detalhe interessante a respeito dessa tecnologia eh a possibilidade de criar ou usar bibliotecas/extensões de Componentes Visuais (UI), tornando o desenvolvimento bem mais produtivo.
Desenvolvendo com gwt tive experiência com a extensão GXT, Gwt Ext através do gwt usa o framework javascript Ext, que sem duvida é uma suite bem completa e "rica". Veja o show case aqui.
Essa semana encontrei uma outra alternativa um concorrente chamado SmartGwt. Os componentes são bem parecidos com o GXT, mas na minha opinião a grande vantagem é a licença, além de open-source o SmartGwt eh LGPL. Compare, acesse o show case aqui.
Gosto muito do conceito de bibliotecas visuais, provavelmente por usar essa ideia quando trabalhava com Delphi. Um outro exemplo que dispensa comentarios é o JSF que no seu core foi projeto para isso, confira aqui.
Um outro detalhe interessante a respeito dessa tecnologia eh a possibilidade de criar ou usar bibliotecas/extensões de Componentes Visuais (UI), tornando o desenvolvimento bem mais produtivo.
Desenvolvendo com gwt tive experiência com a extensão GXT, Gwt Ext através do gwt usa o framework javascript Ext, que sem duvida é uma suite bem completa e "rica". Veja o show case aqui.
Essa semana encontrei uma outra alternativa um concorrente chamado SmartGwt. Os componentes são bem parecidos com o GXT, mas na minha opinião a grande vantagem é a licença, além de open-source o SmartGwt eh LGPL. Compare, acesse o show case aqui.
Gosto muito do conceito de bibliotecas visuais, provavelmente por usar essa ideia quando trabalhava com Delphi. Um outro exemplo que dispensa comentarios é o JSF que no seu core foi projeto para isso, confira aqui.
Sunday, May 24, 2009
GWT no OpenTDC
OpenTDC foi demais, só pra variar a Globalcode detonando em mais um evento. Curti a palestra de Arquiteturas JSF, principalmente pela abordagem na visão de sistemas corporativos, maiores. As palestras sobre Agile e TV Digital foram show de bola!
No fim do eventou rolou um painel de JavaFX(Maurício Leal), Flex(Rafael Nunes) e GWT(Eu). Foi interessante falar do GWT apesar do tempo ter ficado apertado.
Parabéns pra Globalcode!
No fim do eventou rolou um painel de JavaFX(Maurício Leal), Flex(Rafael Nunes) e GWT(Eu). Foi interessante falar do GWT apesar do tempo ter ficado apertado.
Parabéns pra Globalcode!
Marcadores:
Globalcode,
Google,
Gwt
RIA pra cá, RIA pra lá...
Faz um certo tempo que venho me dedicando bastante em soluções RIA, principalmente em pesquisa e experimento das principais alternativas. Trabalhei em projetos c/ JSF (RichFaces - Facelets), Flex, e nos últimos dias com GWT, sem contar nas pesquisas e testes com JavaFx (nada em produção).
Na minha opinião classifico o Flex e JavaFx trazem um conceito de RIA muito mais "rich" do que boa parte das aplicações corporativas de hoje. Essas tecnologias tem um poder de iteratividade incrível, me questiono em relação a sistemas comuns, CRUD, "precisam dessa riqueza"? Acho que o JavaFX venha pra substituir a proposta Swing + Java WebStart, abraçando o mobile.
Nenhuma dessas tecnologias resolve tudo (silver bullet), mas é interessante ter experiência aonde nossa tecnologia preferida, no meu caso especificamente o JSF, pode não ser a melhor solução para tal cenário. No ultimo projeto que atuei o escolhido foi o GWT, a equipe já tinha uma experiência com Swing, só pra variar o tempo era curto o risco grande e não tinha como cobrir o risco em adotar JSF sem nenhum contado anterior.
Essa experiência foi interessante, além de aumentar o conhecimento, o melhor foi enxergar do outro lado do muro. Adquirir mais argumentos para comparações e levantar pontos fracos e fortes de ambos os lados. Um ponto interessante, precisa de um outro post, é qtde de legados e diversas opções que vão ficar por ai... Já pensou daqui uns 10 anos?
Na minha opinião classifico o Flex e JavaFx trazem um conceito de RIA muito mais "rich" do que boa parte das aplicações corporativas de hoje. Essas tecnologias tem um poder de iteratividade incrível, me questiono em relação a sistemas comuns, CRUD, "precisam dessa riqueza"? Acho que o JavaFX venha pra substituir a proposta Swing + Java WebStart, abraçando o mobile.
Nenhuma dessas tecnologias resolve tudo (silver bullet), mas é interessante ter experiência aonde nossa tecnologia preferida, no meu caso especificamente o JSF, pode não ser a melhor solução para tal cenário. No ultimo projeto que atuei o escolhido foi o GWT, a equipe já tinha uma experiência com Swing, só pra variar o tempo era curto o risco grande e não tinha como cobrir o risco em adotar JSF sem nenhum contado anterior.
Essa experiência foi interessante, além de aumentar o conhecimento, o melhor foi enxergar do outro lado do muro. Adquirir mais argumentos para comparações e levantar pontos fracos e fortes de ambos os lados. Um ponto interessante, precisa de um outro post, é qtde de legados e diversas opções que vão ficar por ai... Já pensou daqui uns 10 anos?
Sunday, May 10, 2009
Friday, May 01, 2009
Open TDC 2009
Inscrições Abertas para o OpenTDC 2009 - Um Evento Java Gratuito realizado pela Globalcode com o objetivo de difundir o conhecimento e fortalecer ainda mais a comunidade de profissionais que trabalham com Java.
O evento vai abordar algumas tendências em desenvolvimento como TV Digital, JavaFX e Flex, Arquiteturas Java EE com JSF, JBoss Seam e Spring e, também, uma palestra muito interessante sobre o uso de Java e Robótica aplicados à automação residencial e ao ensino de programação.
Não perca tempo, inscreva-se e participe !
Data: 17/05/2009 (Domingo)
Local: Universidade Anhembi Morumbi Campus Vila Olímpia. Rua Casa do Ator, 275, Itaim Bibi, São Paulo-SP
Outras informações: http://www.globalcode.com.br
Não perca!
Não perca!
Marcadores:
Globalcode
Sunday, April 26, 2009
Saturday, April 18, 2009
Salvando entidades além do convencional
Outro dia encontrei algumas referencias comentando/procurando uma solução simples a respeito da persistência de entidades que possuem relacionamentos com certa complexidade (além do CRUD básico) com JPA/Hibernate, algo normal ao usar "domain model".
Pra não voltar aos DTO's, uma abordagem - questionável é claro - seria usar o id do objeto de origem para resgatar uma outra instância sob o escopo do EntityManager/Session e setar os "pedaços"/dados modificados no objeto origem na referencia gerenciada.
Ao encerrar a transação ou acionar o flush as alterações serão propagadas ao Banco.
Pra não voltar aos DTO's, uma abordagem - questionável é claro - seria usar o id do objeto de origem para resgatar uma outra instância sob o escopo do EntityManager/Session e setar os "pedaços"/dados modificados no objeto origem na referencia gerenciada.
... //recuperando instância gerenciada Pedido pedidoGerenciado = getPedidoById(pedidoOrigem.getId()); //passando informações desejadas... pedidoGerenciado.setDataEntrega(pedidoOrigem.getDataEntrega()); ...
Ao encerrar a transação ou acionar o flush as alterações serão propagadas ao Banco.
Marcadores:
jpa
Sunday, April 12, 2009
Sunday Reference
Domingão resolvi dar uma revisada na API do Java que trata referencias de objetos (Heap + GC). Semana passada me deparei com algumas delas nos testes que estava fazendo (post anterior).
Na realidade brinquei um pouco as especializações de java.lang.ref.Reference. Representam o modelo de referencia de objetos do Java e influenciando a execução do Garbage Collector (GC). São elas:
Além dessas 3, temos outras classes nessa API:
Acesse o javadoc e confira.
Na realidade brinquei um pouco as especializações de java.lang.ref.Reference. Representam o modelo de referencia de objetos do Java e influenciando a execução do Garbage Collector (GC). São elas:
- WeakReference: um wrapper de uma referencia (qualquer objeto) "fraca", quando necessario o GC ira eliminar.
- SoftReference: outro wrapper, mas numa situação intermediaria nem tao fraca e nem tao forte. Na pratica tem uma durabilidade maior do que weak, mas qdo necessario - se necessário - o GC vai eliminar. Uma alternativa interessante para cache.
- PhantomReference: o wrapper mais "frágil", o objeto já recebeu sua doze letal sem chance de escapar da pena de morte. Não há recuperação, o método get sempre retorna null.
Além dessas 3, temos outras classes nessa API:
- ReferenceQueue: mantém as referencias elegíveis enfileiradas.
- WeakHashMap: Map composto pela chave WeakReference e valor a referencia, que sabe eliminar a chave
qdo o valor for coletada pelo GC. Em outras coleções o WeakReference (ou os outros) não são removidos, apenas a referencia encapsulada.
Acesse o javadoc e confira.
Saturday, April 11, 2009
JVM - "Caixa Preta"
Gerenciar e monitorar os componentes e recursos utilizados por uma aplicação é uma tarefa complexa. Descobrir a causa de OutOfMemory não é algo simples, vc pode encontrar varios sites comentando sobre o problema e tentando apresentar uma solucao. O óbvio seria fazer uma analise da sua aplicação, mas como fazer um "top" para o Java?
Pra isso temos o "profile", ferramente que monitora "de cabo a rabo" o que o aplicativo esta fazendo e consumindo. Na teoria a ferramenta é perfeita, mas na pratica o uso pode ser inviável. Alguns colegas até brincam dizendo que "profile é perfeito, desde que vc não use em produção"! Por mais que vc tenha replicas do ambiente de produção, uma ótima cobertura de testes de stress/utilização, infelizmente alguns comportamentos só ocorrem no ambiente real! E agora?
Junto com a evolução da linguagem Java, a JVM também vem evoluindo bastante no quesito rastreabilidade e monitoramento, no Java 6 foram incorporadas algumas ferramentas com essas características. Na semana passada gastei um tempo estudando e testando algumas dessas ferramentas:
- jmap: faz um dump dos objetos da memória em arquivo físico: > jmap -dump:file=heap.bin
- jhat: ferramenta usada para fazer analise do dump: > jhat -J-mx512m heap.bin
- VisualVM: ferramenta gráfica para acompanhar/monitorar sua aplicação durante a execução. Mais funcionalidades do que o JConsole.
A partir da versão 6, é possível usar um parâmetro solicitando um "dump automático" da memória no caso de um OutOfMemory. Adicione o parâmetro -XX:HeapDumpPath=path_to_file no comando java (avalie o custo).
Tomara que com a evolução da plataforma no geral, essas ferramentas continuem melhorando, simplificando a vida de quem desenvolve e cuida do ambiente Java.
Mas, em casos mais complexos talvez vc tenha que apelar para o Profile, pagando o preço. Atualmente estou trabalhando com o Introscope da CA, uma ferramenta bem completa com consumo razoável, funciona sem "derrubar" o servidor.
Tive algumas experiencias com JProfile e YourKit.
Pra isso temos o "profile", ferramente que monitora "de cabo a rabo" o que o aplicativo esta fazendo e consumindo. Na teoria a ferramenta é perfeita, mas na pratica o uso pode ser inviável. Alguns colegas até brincam dizendo que "profile é perfeito, desde que vc não use em produção"! Por mais que vc tenha replicas do ambiente de produção, uma ótima cobertura de testes de stress/utilização, infelizmente alguns comportamentos só ocorrem no ambiente real! E agora?
Junto com a evolução da linguagem Java, a JVM também vem evoluindo bastante no quesito rastreabilidade e monitoramento, no Java 6 foram incorporadas algumas ferramentas com essas características. Na semana passada gastei um tempo estudando e testando algumas dessas ferramentas:
- jmap: faz um dump dos objetos da memória em arquivo físico: > jmap -dump:file=heap.bin
- jhat: ferramenta usada para fazer analise do dump: > jhat -J-mx512m heap.bin
- VisualVM: ferramenta gráfica para acompanhar/monitorar sua aplicação durante a execução. Mais funcionalidades do que o JConsole.
A partir da versão 6, é possível usar um parâmetro solicitando um "dump automático" da memória no caso de um OutOfMemory. Adicione o parâmetro -XX:HeapDumpPath=path_to_file no comando java (avalie o custo).
Tomara que com a evolução da plataforma no geral, essas ferramentas continuem melhorando, simplificando a vida de quem desenvolve e cuida do ambiente Java.
Mas, em casos mais complexos talvez vc tenha que apelar para o Profile, pagando o preço. Atualmente estou trabalhando com o Introscope da CA, uma ferramenta bem completa com consumo razoável, funciona sem "derrubar" o servidor.
Tive algumas experiencias com JProfile e YourKit.
Marcadores:
vm
Thursday, April 02, 2009
JSessionId em múltiplos contextos
Quando 2 aplicações dentro de um mesmo host/domínio usam sessão, se permitido, um cookie que armazena o jsessionid será gerado na maquina do cliente. Apenas um cookie ja que a criação é por dominio e não por contexto. Aparentemente nenhum problema, mas isso pode gerar um comportamento estranho e difícil de identicar.
No server-side (container) para as 2 aplicações teremos 2 instâncias de HttpSession um por contexto, da forma que deve ser. O jboss sabe mapear a request com o HttpSession do contexto correto, sem problemas.
Mas e se ...? O problema:
Ficamos quase uma semana de cabelo em pé, para descobrir o porque do "sumiço" da session Demorou pra se ligar nesse detalhe.
No server-side (container) para as 2 aplicações teremos 2 instâncias de HttpSession um por contexto, da forma que deve ser. O jboss sabe mapear a request com o HttpSession do contexto correto, sem problemas.
Mas e se ...? O problema:
- A aplicação X, com o erro intermitente, tem um time-out de session de 5 minutos.
- X possui uma tela faz busca em outro contexto, a aplicação Y.
- O host de Y eh o mesmo de X, e o seu time-out é de 2 minutos por exemplo.
- O usuario ao autenticar em X e abrir a tela que aciona Y, sem saber possui 2 sessions, uma para cada aplicação, mas somente um cookie!
- Caso o usuário depois ficasse 2 minutos trocando uma idéia no msn ou tomando um cafézinho, ao voltar pra tela que aciona Y, uma nova session seria gerada, já que a anterior expirou. Nova session, novo jsessionid, novo cookie!
- Ao fazer uma request para X, o container ira receber um jsessionid desconhecido para o contexto, e ai adivinha? Session "perdida".
Ficamos quase uma semana de cabelo em pé, para descobrir o porque do "sumiço" da session Demorou pra se ligar nesse detalhe.
Marcadores:
web
Sunday, March 22, 2009
Wednesday, March 11, 2009
Spring Rich Client
Essa é a bola da vez...
Aqui a documentação, muito superficial por sinal. Nao imagina que o spring tinha "uma extensão" pra isso. Bem legal a swingueira!
Aqui a documentação, muito superficial por sinal. Nao imagina que o spring tinha "uma extensão" pra isso. Bem legal a swingueira!
Marcadores:
Swing
Importar certificado JVM
Pra guardar...
Abaixo comando de import do certificado digital para jvm:
mycert=nome do certificado.
Abaixo comando de import do certificado digital para jvm:
$ keytool -import -trustcacerts -keystore <%JAVA_HOME%>\jre\security\lib\
cacerts -storepass changeit -noprompt -alias mycert -file mycert.cer
mycert=nome do certificado.
Friday, March 06, 2009
Class x Prototype
Ótima comparação entre conceito de Classes (O.O.) versus Prototipação, mozilla.
Marcadores:
OO
Saturday, February 28, 2009
Thursday, February 26, 2009
Wednesday, February 25, 2009
JEE c/ Produtividade
Já faz um tempo que me dedico (pesquisa + trabalho) na construção aplicações web em Java c/ produtividade e qualidade. Trabalho com JSF desde 2006, no início como qualquer tecnologia foi bem complicado, mas com o passar do tempo a "coisa" evoluiu.
Definindo o túnel tempo, nos primórdios tinhamos o Servlet para gerar o "html dinâmico", depois veio JSP com a flexibilidade de custom tags, que na verdade não pegou. O sucesso do Struts, Webwork, Spring MVC e outros, vem com a demanda de produtividade, qualidade e a experiência do mercado e da comunidade.
Depois de um tempo chegou o JSF, que na minha opnião traz conceitos bem interessantes, não só em padronizar o MVC mas tambem no apelo de componentes U(ser) I(nterface). Conceito adotado antigamente por ferramentas como Delphi (velhos tempos) e VB (.NET), com foco na produtividade. Fico com a impressão que JSF e JSP, numa abordagem inicial mais simples, não "alavanca" a tal produtividade.
Dos últimos 2 projetos que liderei com JSF, o primeiro usando JSP e o segundo c/ Facelets (xhtml), foi realmente notável aumento de produtividade e qualidade no 2 projeto. Alem dos templates, que trazem uma grande agilidade e reuso, o que mais me impressionou foi a simplicidade de criação de componentes, like tag file, que o Facelets prove. Inicialmente vc "perde" um tempo customizando os componentes, mas depois a agilidade acaba valendo muito a pena.
Alguns dos varios componetes que customizamos:
Na Globalcode temos um ótimo mini-curso falando sobre o assunto, "JSF e Facelets um casamento perfeito".
Definindo o túnel tempo, nos primórdios tinhamos o Servlet para gerar o "html dinâmico", depois veio JSP com a flexibilidade de custom tags, que na verdade não pegou. O sucesso do Struts, Webwork, Spring MVC e outros, vem com a demanda de produtividade, qualidade e a experiência do mercado e da comunidade.
Depois de um tempo chegou o JSF, que na minha opnião traz conceitos bem interessantes, não só em padronizar o MVC mas tambem no apelo de componentes U(ser) I(nterface). Conceito adotado antigamente por ferramentas como Delphi (velhos tempos) e VB (.NET), com foco na produtividade. Fico com a impressão que JSF e JSP, numa abordagem inicial mais simples, não "alavanca" a tal produtividade.
Dos últimos 2 projetos que liderei com JSF, o primeiro usando JSP e o segundo c/ Facelets (xhtml), foi realmente notável aumento de produtividade e qualidade no 2 projeto. Alem dos templates, que trazem uma grande agilidade e reuso, o que mais me impressionou foi a simplicidade de criação de componentes, like tag file, que o Facelets prove. Inicialmente vc "perde" um tempo customizando os componentes, mas depois a agilidade acaba valendo muito a pena.
Alguns dos varios componetes que customizamos:
- botões
- colunas
- colunas c/ links
- links
- datatable
- modal message
Na Globalcode temos um ótimo mini-curso falando sobre o assunto, "JSF e Facelets um casamento perfeito".
Saturday, November 15, 2008
largado...
Tanta coisa legal pra postar... mas estou sem tempo e saco! So um resumo:
- yahoo blueprint
- facelets
- python
quem sabe...
- yahoo blueprint
- facelets
- python
quem sabe...
Sunday, October 14, 2007
MacBook na Internet c/ Nokia 5200(Claro) via BlueTooth
Adquiri a pouco tempo um Nokia 5200, ótimo aparelho, e quebrei um pouco a cabeça pra conectar meu macbook na net pelo Nokia (Claro) via bluetooth. Na realidade esse link mostra todos os passos necessários, o único problema eh o tal do CID. Na tentativa e erro consegui conectar mas com o seguinte CID: *99***1#
Não encontrei nenhuma informação pertinente ao CID na operadora e na Nokia.
Não encontrei nenhuma informação pertinente ao CID na operadora e na Nokia.
mac - alfabetizacao parte 2
Aqui ótimas dicas para mac.
download do ruby: www.ruby-lang.org/en/downloads
download do gem (facilita muito no mac): rubyforge.org/frs/?group_id=126
com o gem instalado, pra instalar o rails eh soh executar a seguinte linha:
gem install rails
pra terminal indico o iTerm
download do ruby: www.ruby-lang.org/en/downloads
download do gem (facilita muito no mac): rubyforge.org/frs/?group_id=126
com o gem instalado, pra instalar o rails eh soh executar a seguinte linha:
gem install rails
pra terminal indico o iTerm
Thursday, September 20, 2007
mac - alfabetizacao parte 1
Agora adepto a macmania, vou registrar (tentar) as descobertas e quebras de vícios:
Teclado
-> tecla command: desenho da apple, antes do space.
-> tecla option depois da ctrl antes da command.
atalhos:
-> encerrar aplicacao: command + q
-> caso vc tenha dual boot para selecionar na inicialização eh soh manter option pressionada no start da maquina.
-> abrir killer de aplicacoes rodando (menos o finder): command + option + esc
-> tirar uma foto da tela atual: command + shift + 3
-> ir para uma pasta diretor sem abrir o Find normal, como /etc: shift + command + G (no escopo do Finder!) + path da pasta
VirtueDesktops: app show de bola que permite o trabalho com múltiplos desktops, com o esquema de movimentos das telas parecido com o ubuntu.
-> movimentacao do desktop via teclado: shift + ctrl + direcao (esquerda-direita-norte-sul)
-> tela de manipulação do VirtueDesktops no desktop atual: command + option + O
-> mostrar um agrupador dos desktops centralizado: fn + option + tab
em bash:
-> $ system_profiler -detailLevel -2 : mostra conteudo da pagina sobre do apple via mesa.
-> $ open ~/Library/Preferences/com.apple.finder.plist : abre o OmniOutline pra customizar as opções do Finder.
Obs.: '+' igual a 'e'
Teclado
-> tecla command: desenho da apple, antes do space.
-> tecla option depois da ctrl antes da command.
atalhos:
-> encerrar aplicacao: command + q
-> caso vc tenha dual boot para selecionar na inicialização eh soh manter option pressionada no start da maquina.
-> abrir killer de aplicacoes rodando (menos o finder): command + option + esc
-> tirar uma foto da tela atual: command + shift + 3
-> ir para uma pasta diretor sem abrir o Find normal, como /etc: shift + command + G (no escopo do Finder!) + path da pasta
VirtueDesktops: app show de bola que permite o trabalho com múltiplos desktops, com o esquema de movimentos das telas parecido com o ubuntu.
-> movimentacao do desktop via teclado: shift + ctrl + direcao (esquerda-direita-norte-sul)
-> tela de manipulação do VirtueDesktops no desktop atual: command + option + O
-> mostrar um agrupador dos desktops centralizado: fn + option + tab
em bash:
-> $ system_profiler -detailLevel -2 : mostra conteudo da pagina sobre do apple via mesa.
-> $ open ~/Library/Preferences/com.apple.finder.plist : abre o OmniOutline pra customizar as opções do Finder.
Obs.: '+' igual a 'e'
Thursday, May 31, 2007
Jmeter com JSF
Quebrei um pouco a cabeça pra fazer o jmeter "testar" uma aplicação feita em JavaServer Faces. Esse site indicou o caminho das pedras... Mas mesmo assim precisei seguir alguns passos, pra resumir:
1º Criar um HTTP Proxy Server abaixo de WorkBench, configurar a porta e indicar o proxy no navegador. Este proxy deve rodar no server!
2º Ao requisitar uma pagina que passe pelo proxy, todos os dados enviados do client para o server são armazenados, como HTTP Request, com o respectivo método http e parametros enviados.
3º Ainda não é suficiente... Com as requisições na mão (na sequencia que foram solicitadas) é necessário criar XPath Extractor dentro da primeira request para descobrir qual o valor do controle de estado do faces, o "javax.faces.ViewState". Este cara é armazenado em um inputHidden em cada página. A query para descobrir o valor é //input[@id='javax.faces.ViewState']/@value. Além da query é necessário definir Reference Name, o qual valor será utilizado por outras request's um exemplo seria view.
4º Agora é o momento de usar a variável definida no XPath. Isso na segunda request feita para um mesma página (via post). Para isso é colocar o parametro javax.faces.ViewState com o valor ${view} na configuração do HTTP Request.
5º Por fim é necessário criar uma HTTP Cookie Manager abaixo do Thread Group, e nele adicionar um valor de cookie, neste caso o JSessionID. O name deve ficar com o valor jsessionid, um valor default e o domínio devem ser preenchido.
Depois é rodar o teste.
1º Criar um HTTP Proxy Server abaixo de WorkBench, configurar a porta e indicar o proxy no navegador. Este proxy deve rodar no server!
2º Ao requisitar uma pagina que passe pelo proxy, todos os dados enviados do client para o server são armazenados, como HTTP Request, com o respectivo método http e parametros enviados.
3º Ainda não é suficiente... Com as requisições na mão (na sequencia que foram solicitadas) é necessário criar XPath Extractor dentro da primeira request para descobrir qual o valor do controle de estado do faces, o "javax.faces.ViewState". Este cara é armazenado em um inputHidden em cada página. A query para descobrir o valor é //input[@id='javax.faces.ViewState']/@value. Além da query é necessário definir Reference Name, o qual valor será utilizado por outras request's um exemplo seria view.
4º Agora é o momento de usar a variável definida no XPath. Isso na segunda request feita para um mesma página (via post). Para isso é colocar o parametro javax.faces.ViewState com o valor ${view} na configuração do HTTP Request.
5º Por fim é necessário criar uma HTTP Cookie Manager abaixo do Thread Group, e nele adicionar um valor de cookie, neste caso o JSessionID. O name deve ficar com o valor jsessionid, um valor default e o domínio devem ser preenchido.
Depois é rodar o teste.
Friday, May 25, 2007
JMeter em um diretório com espaços...
Outro dia estava aplicando um teste de stress em um EJB, mas ao fazer o lookup do bean o jmeter lançava a seguinte exception:
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
ception is:
java.net.MalformedURLException: no protocol: de
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:282)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
66)
...
Quebrei um pouco a cabeça, e foi ai que caiu a ficha, o jmeter estava instalado em:
C:\Arquivos de Programas\...
Pronto tai o problemas, o espaço no nome do diretório! Coloquei o jmeter em outro dir, sem espaço no nome, e teste foi executado com sucesso.
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
ception is:
java.net.MalformedURLException: no protocol: de
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:282)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
66)
...
Quebrei um pouco a cabeça, e foi ai que caiu a ficha, o jmeter estava instalado em:
C:\Arquivos de Programas\...
Pronto tai o problemas, o espaço no nome do diretório! Coloquei o jmeter em outro dir, sem espaço no nome, e teste foi executado com sucesso.
Thursday, May 17, 2007
Informações da VM em jmx-console (jboss)
O jmx-console do jboss disponibiliza algumas informações sobre a VM, similar ao jconsole.
Pra isso é só logar no jmx-console:
--> em jboss.system selecionar type=Serverinfo
--> no JMX MBean View além dos atributos da VM, podemos invocar operações como por exemplo listMemoryPools, que exibe as informações de uso de memória.
Pra isso é só logar no jmx-console:
--> em jboss.system selecionar type=Serverinfo
--> no JMX MBean View além dos atributos da VM, podemos invocar operações como por exemplo listMemoryPools, que exibe as informações de uso de memória.
Marcadores:
vm
Tuesday, May 08, 2007
jconsole no jboss
Pra acessar o jconsole no jboss, siga os passos:
1º colocar as seguintes propriedades no run do jboss
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port={nroPorta} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
2º no jconsole informar o host e o nroPorta que vc definiu no jboss.
jmx é bala.
1º colocar as seguintes propriedades no run do jboss
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port={nroPorta} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
2º no jconsole informar o host e o nroPorta que vc definiu no jboss.
jmx é bala.
Wednesday, February 21, 2007
Tuesday, November 14, 2006
Ágil por MF
UML Essencial:
"São processos voltados às pessoas. As estratégias ágeis presumem que o fator mais importante no sucesso de um projeto é qualidade das pessoas que estão envolvidas nele e o quão bem elas trabalham juntas, em termos humanos. Os processos e ferramentas que utilizam são estritamente efeitos de segunda ordem."
Monday, November 06, 2006
JSF and JS
Apesar de ser conhecer bem pouco de javascript, ñ posso negar que esse negócio faz coisas incriveis com informações no browser. Ultimamente tenho pesquisado um pouco sobre criação de telas mais "ricas" na web, e tenho visto coisas fantasticas com o bendito do javascript! Uma delas é o dojo, um framework bem legal de javascript, permitindo fazer verdadeiras macumbas de uma forma mais simples. Senão me engano parece que é a galera do google que manda neste negócio.
Achei mais legal ainda o esquema do Tomahawk ,conjunto de componentes e utilitários do JSF que a especificação ñ cobre, agora tem um componente que permite a carga das libs do dojo na page, facilitando bastante a vida. Se já ñ existe, é bem provavel novos componentes tomahawk utilizem na sua renderização o dojo, para facilitar a vida e trazer novos recursos visuais com html.
Achei mais legal ainda o esquema do Tomahawk ,conjunto de componentes e utilitários do JSF que a especificação ñ cobre, agora tem um componente que permite a carga das libs do dojo na page, facilitando bastante a vida. Se já ñ existe, é bem provavel novos componentes tomahawk utilizem na sua renderização o dojo, para facilitar a vida e trazer novos recursos visuais com html.
Marcadores:
JSF
Saturday, October 21, 2006
JSF: Stateful
O protocolo HTTP de certa forma é limitado, e uma dessas limitações é justamente ser stateless não mantém o estado com o cliente, ou seja, não possível somente com o protocolo reconhecer um determinado cliente além de um processo de requisição (request).
Em muitos sistemas web devemos driblar esta limitação, e usar alternativas do ambiente. Bom mas o que importa para este post, é que o faces trabalha mantendo o estado da view de um cliente, ou seja, é stateful. Justamente para efetuar todo o trabalho com Conversores + Validadores + Event / Action Listener. O faces tem 2 abordagens para stateful:
Em muitos sistemas web devemos driblar esta limitação, e usar alternativas do ambiente. Bom mas o que importa para este post, é que o faces trabalha mantendo o estado da view de um cliente, ou seja, é stateful. Justamente para efetuar todo o trabalho com Conversores + Validadores + Event / Action Listener. O faces tem 2 abordagens para stateful:
- server-side: usando o HttpSession para manter os dados.
- client-side: campos hidden para guardar as informações. Esta abordagem é menos segura que a outra.
Marcadores:
JSF
Sunday, October 15, 2006
JSF - Request Lifecycle
Continuando na "brincadeira" com faces, resolvi postar algo interessante do frame, o ciclo de vida da request, que é quem permite que várias features do frame tenham funcionalidade. Um detalhe importante, é que todo o esquema descrito abaixo, é possível pq o faces é stateful com seus componetes.
No geral, o ciclo de vida é executado de 2 formas:
a) Primeira requisição da página (View), o faces executa 2 fases:
No geral, o ciclo de vida é executado de 2 formas:
a) Primeira requisição da página (View), o faces executa 2 fases:
- Restore View: verifica que ainda não existe árvore de componentes UI para a View, portanto cria todos os componentes UI (javabean) e passa para a fase de renderização.
- Render Response: baseado na estado (dados) dos componentes na tree monta a renderização no formato esperado pelo cliente.
- Restore View: retorna a árvore vinculada a View, passa para próxima fase.
- Apply Request Values: captura os dados de input do cliente (param na request) e seta nas devidas properties dos componentes UI. Passa para a próxima fase.
- Process Validations: cada componente UI poderá ser validado, portanto nessa fase a árvore de componentes da view e percorrida, componente a componente, verificando se o componente UI tem validador, caso tenha o mesmo é executado. Se algo estiver errado pula para a fase de renderização, senão para a próxima.
- Update Model Values: os componentes UI já possuem as properties atualizadas, mas os "dados de modelo", ou seja, atributos dos managed bean ainda não! É importante relembrar que todos os param da request são String, e as properties dos compoentes UI tbém. Nessa fase serão aplicados os conversores, qdo existirem, na mesma forma que os validadores. Se algo estiver errado pula para a fase de renderização, senão para a próxima.
- Invoke Application: nesta fase são executados os actions listener registrados para os componentes Command (botões, links, ...) , e depois as actions normais (managed bean). Executada a fase de renderização.
- Render Response: a mesma política, renderiza o conteúdo para o cliente.
Marcadores:
JSF
Thursday, September 21, 2006
Loucura total...
Tem gente que fala que nesse mundo Java temos várias siglas formando uma saborosa sopa de letrinhas. Bom e o pior é que realmente a coisa é feia! Estou fazendo uma pesquisa sobre o que adotar em novo projeto no trampo?
O conceito de web 2.0 é bem interessante, e cada dia que passa fico de boca mais aberta com as soluções em web que aparecem por ae...
Bom mas o que eu queria dizer mesmo era que estou pesquisando vaaaaaarias dessas siglas bontinhas:
JSF + AJAX + XHTML + AOP + Facelets + GWT + Ajax4jsf + DWR + JBoss SEAM...
Qdo chegar a alguma definição concreta posto algo mais detalhado sobre aonde vou adotar alguma, se é que vou adotar, dessas letrinhas.
O conceito de web 2.0 é bem interessante, e cada dia que passa fico de boca mais aberta com as soluções em web que aparecem por ae...
Bom mas o que eu queria dizer mesmo era que estou pesquisando vaaaaaarias dessas siglas bontinhas:
JSF + AJAX + XHTML + AOP + Facelets + GWT + Ajax4jsf + DWR + JBoss SEAM...
Qdo chegar a alguma definição concreta posto algo mais detalhado sobre aonde vou adotar alguma, se é que vou adotar, dessas letrinhas.
Thursday, August 31, 2006
Frase do Dia
"Qualquer tolo escreve código que o computador enteda. Bons programadores escrevem códigos que humanos possam entender."Martim Fowler
Sunday, August 20, 2006
Pq Java ?
Muitas vezes vejo pessoas comentando, que o desenvolvimento java é muito complicado. Ñ só a respeito das linhas de código, e sintaxe da linguagem, mas também em outros assuntos como Orientação à Objetos, Design Patterns, UML, Framework, Arquitetura, Camadas, etc...
Normalmente as pessoas que fazem esses comentários vivam um paradigma bem diferente de desenvolvimento de software, aonde as coisas eram um pouco mais simples, ñ existia uma preocupação com processo de desenvolvimento, reutilização, componentização, flexibilidade.
O mundo evolui, TI evolui... As pessoas precisam evoluir!
Comentários como: em php, ou até delphi, era muito mais fácil de fazer, me deixam um pouco incomodado. Concordo em que alguns cenários, a utilização do php poderia ser bem mais simples do que o Java com JSP e Servlets. O problema, na realidade, é saber reconhecer o cenário, a situação, e tentar aplicar a melhor solução.
Um faz de contas:
Construção de um sistema, permitindo que o cliente faça pedidos a uma lanchonete na web. O sistema é bem simples, existem algumas restrições, o cliente deve possuir o cadastro na lanchonete com um código pessoal para poder efetuar o pedido, código esse que deverá ser informado na conclusão do pedido.
Para este cenário o uso do php, seria perfeito. Ñ precisaria de java (jsp e servlets), e muito menos do uso de J2EE (EJB ...), talvez não necessite nem me preocupar com uma definição de domain model, oo, uml, o sistema é tão básico...
Mas e se essa lanchonete, após alguns anos viesse a se tornar um McDonald's? Essa abordagem simplista (ao extremo) atenderia?
Esse é um tema complexo para apenas um post, mas de qualquer forma o importante é ressaltar que as pessoas precisam evoluir, tentar acompanhar o que está acontecendo no mundo, e ñ apenas no seu dia-a-dia!
Normalmente as pessoas que fazem esses comentários vivam um paradigma bem diferente de desenvolvimento de software, aonde as coisas eram um pouco mais simples, ñ existia uma preocupação com processo de desenvolvimento, reutilização, componentização, flexibilidade.
O mundo evolui, TI evolui... As pessoas precisam evoluir!
Comentários como: em php, ou até delphi, era muito mais fácil de fazer, me deixam um pouco incomodado. Concordo em que alguns cenários, a utilização do php poderia ser bem mais simples do que o Java com JSP e Servlets. O problema, na realidade, é saber reconhecer o cenário, a situação, e tentar aplicar a melhor solução.
Um faz de contas:
Construção de um sistema, permitindo que o cliente faça pedidos a uma lanchonete na web. O sistema é bem simples, existem algumas restrições, o cliente deve possuir o cadastro na lanchonete com um código pessoal para poder efetuar o pedido, código esse que deverá ser informado na conclusão do pedido.
Para este cenário o uso do php, seria perfeito. Ñ precisaria de java (jsp e servlets), e muito menos do uso de J2EE (EJB ...), talvez não necessite nem me preocupar com uma definição de domain model, oo, uml, o sistema é tão básico...
Mas e se essa lanchonete, após alguns anos viesse a se tornar um McDonald's? Essa abordagem simplista (ao extremo) atenderia?
Esse é um tema complexo para apenas um post, mas de qualquer forma o importante é ressaltar que as pessoas precisam evoluir, tentar acompanhar o que está acontecendo no mundo, e ñ apenas no seu dia-a-dia!
Wednesday, August 16, 2006
Monday, August 14, 2006
Setando var's de ambiente no Ubuntu
Pra quem teve problema com o apt-get do ubuntu e ñ conseguiu atualizar a versão do java, assim como eu, aqui vai a dica pra fazer na "unha" :
O arquivo aonde informamos as var's de ambiente é o /etc/bash.bashrc, portanto entre via terminal e digite: sudo gedit /etc/bash.bashrc
No fim do arquivo informe as var's de ambiente (mais ou menos assim):
JAVA_HOME="caminho" CLASSPATH="$JAVA_HOME:JAVA_HOME/lib:$."
PATH="$JAVA_HOME/bin:$PATH" export JAVA_HOME CLASSPATH PATH
O arquivo aonde informamos as var's de ambiente é o /etc/bash.bashrc, portanto entre via terminal e digite: sudo gedit /etc/bash.bashrc
No fim do arquivo informe as var's de ambiente (mais ou menos assim):
JAVA_HOME="caminho" CLASSPATH="$JAVA_HOME:JAVA_HOME/lib:$."
PATH="$JAVA_HOME/bin:$PATH" export JAVA_HOME CLASSPATH PATH
Saturday, August 12, 2006
An Architect's Perspective on Application Quality: Part 2
Continuação, o artigo enfatiza a questão do "processo". Gerenciar as exigências (funcionais e ñ funcionais) que o projeto deve satisfazer, é uma questão fundamental e deve ser avaliada com muita atenção. Conversar com o cliente sobre a estratégia na busca por qualidade, justificando a questões envolvendo custo, estar bem preparado para avisar sobre os riscos e eventuais problemas caso o cliente ñ concorde em pagar por qualidade. Um outro ponto tocado (novamente), foi a questão de comunicação entre o time!
Saturday, August 05, 2006
Faces no JBoss
Algum tempo atrás encontrei alguns problemas ao rodar faces no JBoss, sofri um pouco com este problema. A versão do JBoss era 4.0.2, e desenvolvimento faces com myfaces. Mesmo empacotando o aplicativo com todas as lib's necessárias, ao rodar ñ funcionava. O problema é que para rodar faces no JBoss (Tomcat) é necessário a pasta instance..\deploy\jbossweb-tomcat55.sar\jsf-libs com os jars da implementação faces que vc estiver rodando, no meu caso myfaces. Senão me engano a partir da versão 4.0.4 do JBoss, esta estrutura é default, mas com os jars do myfaces.
Atualmente estou desenvolvendo com somente com o WTP do Eclipse 3.2, e até o momento esta atendendo perfeitamente ao esperado.
Atualmente estou desenvolvendo com somente com o WTP do Eclipse 3.2, e até o momento esta atendendo perfeitamente ao esperado.
Thursday, August 03, 2006
Trabalho em equipe
Depois de ler este post no blog do Helder, sobre a Catedral de Colônia, fiquei impressionado com o processo de construção desse monumento. As obras foram iniciadas em 1248 e concluídas em 1880! Mais de 600 anos envolvendo este processo... muita coisa aconteceu, muito tempo se passou, mas mesmo assim o projeto foi concluído, com pequenas mudanças (acredito que não tão significativas) no projeto inicial.
Fantástico, isso muda o meu conceito de trabalho em equipe, organização, fé e vontade na conclusão de algo que se considera importante. Se Deus quiser, algum dia caminharei sobre estes lugares.
Fantástico, isso muda o meu conceito de trabalho em equipe, organização, fé e vontade na conclusão de algo que se considera importante. Se Deus quiser, algum dia caminharei sobre estes lugares.
Wednesday, August 02, 2006
2 instâncias de jboss...
Rodar o JBOSS mais de uma instância na mesma máquina, simulando 2 ambientes, em um cenário distribuído ou não, não é tão complicado.
Normalmente as 2 estruturas server's estarão abaixo de um mesmo %JBOSS_home%\server. A grande sacada é adicionar mais um endereço IP para a máquina, além do atual. Imagine que já exista o IP 10.0.0.1, no windows xp, vc iria até Conexões Rede -> Conexão Local -> Propriedades -> (selecione) Protocolo TCP/IP -> Avançado ! Pronto, agora vc adiciona um novo IP, por exemplo 10.0.0.2.
Depois disso é só informar em cada uma das instâncias (server) qual IP ela vai estar atuado, por exemplo:
>%JBOSS_home%\bin\run -c instancia1 --host=10.0.0.1
>%JBOSS_home%\bin\run -c instancia2 --host=10.0.0.2
Bem melhor do que ter de mudar cada porta dos serviços do jboss, para subir em um mesmo ip...
Normalmente as 2 estruturas server's estarão abaixo de um mesmo %JBOSS_home%\server. A grande sacada é adicionar mais um endereço IP para a máquina, além do atual. Imagine que já exista o IP 10.0.0.1, no windows xp, vc iria até Conexões Rede -> Conexão Local -> Propriedades -> (selecione) Protocolo TCP/IP -> Avançado ! Pronto, agora vc adiciona um novo IP, por exemplo 10.0.0.2.
Depois disso é só informar em cada uma das instâncias (server) qual IP ela vai estar atuado, por exemplo:
>%JBOSS_home%\bin\run -c instancia1 --host=10.0.0.1
>%JBOSS_home%\bin\run -c instancia2 --host=10.0.0.2
Bem melhor do que ter de mudar cada porta dos serviços do jboss, para subir em um mesmo ip...
Wednesday, July 26, 2006
Modelo de Domínio ...
Um breve resumo:
"Um modelo de domínio é uma representação de classes conceituais do mundo real, não de componentes de Software."
Essa é a idéia-chave, aonde o modelo é um dicionário visual de abstrações que representem o negócio, sem detalhes voltados a implementação, em nível de software.
Qdo falamos de negócio, ñ falamos de "Telas", ñ falamos de "Tabelas no Banco de Dados", esses são artefatos de software, ñ deveria ser uma preocupação inicial, ñ construímos um software para atender uma tela bonita e ou para efetuar SQL's eficientes, a intenção é (ou deveria ser) atender a uma necessidade de negócio. Parece um assunto estranho, pois todo munda acha que pensa certo. Mas na prática ñ é bem assim! O Modelo de Domínio mantem o foco no modelo de representação do negócio.
O modelo contém:
- classes de conceito
- associações entre as classes
- atributos das classes
Métodos normalmente ñ são expostos a esse modelo, a ñ ser que seja bem específico ao negócio, como uma pessoa realizando algum comportamento que seja importante ao negócio.
No geral existem 2 formas para identificar as classes conceituais:
1ª - Usar lista de categoria. (como lugares, transações, eventos, ...)
2ª - Identificar substantivos ou frases que substituem substantivos. (abordagem menos segura)
É comum colocar "coisas" a menos em uma primeira representação do modelo, mas com o tempo ele pode ser reajustado tentando evoluir a representação do sistema. Deve ser considerada boa prática incrementar com objetos à mais do que o necessário, partindo do princípio que é melhor ter um modelo rico que pode ser diluído do que um modelo pobre.
Bom por enquanto é isso...
"Um modelo de domínio é uma representação de classes conceituais do mundo real, não de componentes de Software."
Essa é a idéia-chave, aonde o modelo é um dicionário visual de abstrações que representem o negócio, sem detalhes voltados a implementação, em nível de software.
Qdo falamos de negócio, ñ falamos de "Telas", ñ falamos de "Tabelas no Banco de Dados", esses são artefatos de software, ñ deveria ser uma preocupação inicial, ñ construímos um software para atender uma tela bonita e ou para efetuar SQL's eficientes, a intenção é (ou deveria ser) atender a uma necessidade de negócio. Parece um assunto estranho, pois todo munda acha que pensa certo. Mas na prática ñ é bem assim! O Modelo de Domínio mantem o foco no modelo de representação do negócio.
O modelo contém:
- classes de conceito
- associações entre as classes
- atributos das classes
Métodos normalmente ñ são expostos a esse modelo, a ñ ser que seja bem específico ao negócio, como uma pessoa realizando algum comportamento que seja importante ao negócio.
No geral existem 2 formas para identificar as classes conceituais:
1ª - Usar lista de categoria. (como lugares, transações, eventos, ...)
2ª - Identificar substantivos ou frases que substituem substantivos. (abordagem menos segura)
É comum colocar "coisas" a menos em uma primeira representação do modelo, mas com o tempo ele pode ser reajustado tentando evoluir a representação do sistema. Deve ser considerada boa prática incrementar com objetos à mais do que o necessário, partindo do princípio que é melhor ter um modelo rico que pode ser diluído do que um modelo pobre.
Bom por enquanto é isso...
Friday, July 21, 2006
An Architect's Perspective on Application Quality
Interessante alguns aspectos levantados no artigo. Citando alguns pontos chave, sobre a espectativa e o significado de "qualidade". Comunicação entre o time, testes, monitorição são abordados como conjunto de pontos chaves para ter qualidade.
"Quality begins in the team - not the application. " Leia mais...
"Quality begins in the team - not the application. " Leia mais...
Monday, July 10, 2006
Head Rush Ajax
Terminei a leitura hoje, depois de quase um mês (vagabundo...) . Head Rush Ajax é muito bom, assim como os outros da série Head First, além do ótimo conteúdo abordando o uso de Ajax de uma forma simples e prática, possui uma ótima didática.
Vale muita a pena, afinal não é caro, veja.
Vale muita a pena, afinal não é caro, veja.
Friday, July 07, 2006
Visão...
Um breve momento de reflexão...
“Um engenheiro, um físico e um matemático estão viajando de trem pela Escócia quanto vêem uma ovelha negra passar lá fora.
‘Interessante!’ diz o engenheiro. ‘As ovelhas escocesas eram negras.’
‘Você quer dizer que algumas ovelhas escocesas são negras, não?’ replica o físico.
‘Não’, responde o matemático. ‘Tudo o que sabemos é que há pelo menos uma ovelha na Escócia e que pelo menos um lado dessa ovelha referida é preto.’”
Wednesday, July 05, 2006
Eclipse 3.2 + Callisto
Já estou usando o Eclipse 3.2 com Callisto. Muito bom, o Callisto é uma mão na roda, já agrupando alguns dos principais plugins (open) para desenvolvimento web. A instalação foi bem rápida, nem se compara com os primórdios, aonde era uma treta encontrar compatibilidade dos plugins em novas versões do eclipse.
O Urubatan blogou um passo a passo bem legal de como resolver possíveis problemas com a instalação.
O Urubatan blogou um passo a passo bem legal de como resolver possíveis problemas com a instalação.
Tuesday, July 04, 2006
Comunidade Ruby
Foi criado o RubyOnBr, uma comunidade Ruby made in Brasil!!! Preciso deixar de ser preguiçoso e começar a brincar com a criança.
Muito bom...
Muito bom...
Sunday, June 25, 2006
JBoss Seam
Entrei no no JDJ, e encontrei um artigo interessante sobre o JBoss Seam, esse aqui. Muito legal o autor da um exemplo interessante do uso desse framework, com a utilidade de unificar outras soluções como Faces e EJB 3.0 de uma maneira bem prática. Muito bom!!!
Sunday, June 18, 2006
Caso de Uso
É um assunto que muito já ouvi falar, mas ultimamente tem se tornado mais necessário sua utilização no meu dia-a-dia. Confesso que acho a construção de casos de uso muito chato, descrever os atores e as funcionalidades que software provê, de uma maneira prática e direta, nem sempre é fácil. Devido ao cenário ao qual atuamos, algumas vezes descrever algo uma maneira simples, é complicado! Nos últimos dias, como sempre, tenho buscado literatura sobre o assunto, cheguei a conclusão de 2 guias, um é especificamente para Casos de Uso, o Writting Effective Use Cases (Cockburn) e o segundo: Applying UML and Design Patterns (Larman).
Atualmente estou lendo o segundo, que traz uma visão geral do desenvolvimento (R)UP, da fase de concepção a elaboração (com iterações). Muito bom o conteúdo do livro, no desenrolar dos assuntos são apontadas várias idéias de outros autores, como o próprio tio "Fowler". Vai aqui uma definição interessante de caso de uso (do livro):
Casos de uso são um mecanismo para que visa tornar simples a maneira dos usuários (Clientes finais) enxergarem "seus" objetivos no sistema. A essência é descobrir e registrar requisitos funcionais do sistema, satisfazendo os objetivos dos interessados. Requisitos funcionais indicam o que o sistema fará, em um ponto de vista de negócio.
Atualmente estou lendo o segundo, que traz uma visão geral do desenvolvimento (R)UP, da fase de concepção a elaboração (com iterações). Muito bom o conteúdo do livro, no desenrolar dos assuntos são apontadas várias idéias de outros autores, como o próprio tio "Fowler". Vai aqui uma definição interessante de caso de uso (do livro):
Casos de uso são um mecanismo para que visa tornar simples a maneira dos usuários (Clientes finais) enxergarem "seus" objetivos no sistema. A essência é descobrir e registrar requisitos funcionais do sistema, satisfazendo os objetivos dos interessados. Requisitos funcionais indicam o que o sistema fará, em um ponto de vista de negócio.
Friday, June 09, 2006
SOA
Nos últimos dias muito tem se falado sobre SOA, é um + uma sigla do mundo TI - Service Oriented Architecture. A itenção é resolver um "grande tabu" (pelo menos na minha visão) de desenvolvimento modularizado.
A idéia é muito interessante, vc deixa de pensar em software como um todo, e começa a pensar em serviços. O software é "quebrado" em serviços (módulos) com fraco acoplamento, ou seja, os módulos ñ tem dependência estrutural um entre o outro.
Um exemplo (idéia...) seria um sistema Contábil, com serviços de Contas a Pagar, Contas a Receber, Emissão de Faturas, e outros. Tendo um outro software gerenciando esses serviços, para agregar vinculo entre esses módulos.
Uma técnologia que prove isso, é Web Services. No cenário acima poderiamos ter cada módulo implementado com uma Linguagem, ou seja, Contas a Pagar e Receber em Java e Emissão de Faturas em C++, e o "gerenciador" tbém em Java.
Web Service, é muito interessante, mas seu uso deve ser estudado com cautela! Em um cenário aonde serviços pertencentes a empresa, feitos em uma mesma tecnologia, como Java, talvez ñ seja interessante a integração com Web Services. O custo de parsing de XML em Web Services é alto, e deve ser considerado! Talvez a adoção do puro RMI, com EJB (principalmente o 3) seja interessante.
A idéia é muito interessante, vc deixa de pensar em software como um todo, e começa a pensar em serviços. O software é "quebrado" em serviços (módulos) com fraco acoplamento, ou seja, os módulos ñ tem dependência estrutural um entre o outro.
Um exemplo (idéia...) seria um sistema Contábil, com serviços de Contas a Pagar, Contas a Receber, Emissão de Faturas, e outros. Tendo um outro software gerenciando esses serviços, para agregar vinculo entre esses módulos.
Uma técnologia que prove isso, é Web Services. No cenário acima poderiamos ter cada módulo implementado com uma Linguagem, ou seja, Contas a Pagar e Receber em Java e Emissão de Faturas em C++, e o "gerenciador" tbém em Java.
Web Service, é muito interessante, mas seu uso deve ser estudado com cautela! Em um cenário aonde serviços pertencentes a empresa, feitos em uma mesma tecnologia, como Java, talvez ñ seja interessante a integração com Web Services. O custo de parsing de XML em Web Services é alto, e deve ser considerado! Talvez a adoção do puro RMI, com EJB (principalmente o 3) seja interessante.
Tuesday, May 30, 2006
Dicas de Performance Java 5
Aqui vai algumas dicas para performance, mais especificamente no Java 5:
Fazer comparação ignorando maiúsculas e minúsculas...
ao invés de Code:
usamos Code:
nesta versão não é necessário criar uma nova string (toUpperCase) disperdiçando CPU.
A mesma regra vale para:
ao invés de Code:
usamos Code:
(isso vale para os outros wrappers de primitivos)
Adicionando conteúdo a uma StringBuilder
ao invés de Code:
usamos Code:
além de mais bonito, ecomiza recursos passando a responsabilidade da separação de conteúdo para o StringBuilder, que por si só já é bem otimizado.
Imagine uma situação aonde temos uma lista já pronta e carregada, e queremos torna-la imutável.
ao invés de de criarmos uma implementação de collection (no caso arrayList) e tratarmos os métodos lançando excessão...
usamos Code:
dessa forma colocamos uma wrapper sobre nosso objeto, evitando criação de "mutretas" e código complexo. Essa técnica de Wrapper é muito interessante, e pode ser usada em várias situações, como para código thread-safe por exemplo.
É sempre importante a leitura do JavaDoc. As dicas de performance são sempre bem definidas.
Fazer comparação ignorando maiúsculas e minúsculas...
ao invés de Code:
s1.toUpperCase().equals(s2);
s1.equalsIgnoreCase(s2);
A mesma regra vale para:
ao invés de Code:
new Integer(s).intValue();
Integer.parseInt(s);
Adicionando conteúdo a uma StringBuilder
ao invés de Code:
stringBuilder.append(s.substring(x,y));
stringBuilder.append(s,x,y);
Imagine uma situação aonde temos uma lista já pronta e carregada, e queremos torna-la imutável.
ao invés de de criarmos uma implementação de collection (no caso arrayList) e tratarmos os métodos lançando excessão...
usamos Code:
Collections.unmodifiableList(minhaLista);
É sempre importante a leitura do JavaDoc. As dicas de performance são sempre bem definidas.
Thursday, May 25, 2006
Strategy Pattern
Mais um padrão comportamental, em relação ao Business, assim como o Visitor.
Muito interessante: a idéia é usar Composição ao invés de Herança, ou seja, ao invés de ser é melhor ter.
Quando você tem um representação (objeto de domínio) que possui um comportamento muito váriavel, ao invés de hierarquia de herança para resolver o problema com a variação, seria mais interessante passar essa responsabilidade para um outro objeto (objeto terceiro), deixando sua estrutura mais simples e focada no negócio.
Em alguns casos, ter é melhor do que ser!
Muito interessante: a idéia é usar Composição ao invés de Herança, ou seja, ao invés de ser é melhor ter.
Quando você tem um representação (objeto de domínio) que possui um comportamento muito váriavel, ao invés de hierarquia de herança para resolver o problema com a variação, seria mais interessante passar essa responsabilidade para um outro objeto (objeto terceiro), deixando sua estrutura mais simples e focada no negócio.
Em alguns casos, ter é melhor do que ser!
Friday, May 19, 2006
SESINFO - IMS
Fazia tempo que não postava nada... Tava na correria com o Evento na Mêto, o 3º SESTINFO, no qual participei dando curso e palestra.
Foi muito legal, descobri um lado interessante e que gostei muito. Quem sabe não começoa a levar a idéia de dar aula à sério???
Muito legal, coloquei as fotos no meu flickr.
Foi muito legal, descobri um lado interessante e que gostei muito. Quem sabe não começoa a levar a idéia de dar aula à sério???
Muito legal, coloquei as fotos no meu flickr.
Tuesday, May 02, 2006
Dica: StringBuilder
A partir do java 5 temos a classe StringBuilder . A utilização é bem similar a da já conhecida StringBuffer. Com a vantagem de ñ ser thread-safe, trazendo uma melhor performance. Na maioria dos cenários, é possível essa substituição !
Aqui vai um simples implementação teste:
import static java.lang.System.out;
import java.io.IOException;
public class TesteStringBuffer {
public static void main(String[] args) throws IOException {
final Appendable buf = new StringBuilder();
for (int i=0; i<1024; i++) {
buf.append(Integer.toString(i));
}
out.print(buf);
}
}
As 2 classes implementam Appendable, CharSequence.
Aqui vai um simples implementação teste:
import static java.lang.System.out;
import java.io.IOException;
public class TesteStringBuffer {
public static void main(String[] args) throws IOException {
final Appendable buf = new StringBuilder();
for (int i=0; i<1024; i++) {
buf.append(Integer.toString(i));
}
out.print(buf);
}
}
As 2 classes implementam Appendable, CharSequence.
Subscribe to:
Posts (Atom)