quinta-feira, 13 de agosto de 2009

Represando execução de métodos Java através de Reflection

A Reflection API é um poderoso recurso da JVM que torna possível invocação de métodos de objetos em memória através de forma programática.
Quando bem utilizado, esse recurso pode executar tarefas extremamente arrojadas.


Requisito:

Represar todos os métodos DAOs em uma sessão web, e executá-los todos de uma vez dentro de uma transação ao final da sessão
JVM 5 + Spring + Jetty 1.6


Solução:

Interceptando todas as chamadas dos métodos DAOs, armazeno uma sequência de invocações em uma Collection em um Statefull Session Bean, de forma que fiquem represados em memória.

StatefullBeanInterface:

addCallStack(Object target, String methodName, Object... args);


ExampleDAO:

@Transactional(propagation = Propagation.MANDATORY)
addUser(User user) {
/* real persistence operation */
}

addUser(StatefullBean s, User user) {
/* interceptor operation */
s.addCallStack(this, "addUser", user);
}


Ao final da sessão, o usuário confirma a execução dos métodos. Agora entra em ação a Reflection.

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void execCallStack()throws CallStackException {
for (Object o : callStack.keySet()) {
List call = callStack.get(o);
for (MethodCall method : call) {
Object[] args = method.getArgs();
Method[] allMethods = o.getClass().getDeclaredMethods();
for (Method m : allMethods) {
if (m.getName().equals(method.getMethodName()) && m.getGenericParameterTypes().length == args.length) {
try {
m.invoke(o, args);
break;
} catch (Exception e) {
throw new CallStackException(e);
}
}
}
}
}
}

Passo a passo:


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void execCallStack()throws CallStackException {

Solicitamos ao container que crie uma nova transação ao iniciar a execução dos métodos DAO represados.
Os métodos são anotados com propagação de transação mandatória (Propagation.MANDATORY). Dessa forma, se forem invocados foram de uma transação, uma exceção será gerada.


for (Object o : callStack.keySet()) {
List call = callStack.get(o);
for (MethodCall method : call) {
Object[] args = method.getArgs();

Estamos percorrendo a Collection com os objetos alvo da invocação, o nome dos métodos e seus respectivos argumentos.


Method[] allMethods = o.getClass().getDeclaredMethods();
for (Method m : allMethods) {

Aqui começa a reflection. getDeclaredMethods retorna todos os métodos de uma classe. A classe Method encapsula suas declarações, como argumentos, exceções, encapsulamento, entre outros.


if (m.getName().equals(method.getMethodName()) && m.getGenericParameterTypes().length == args.length) {

Procuramos o método correspondente através do nome e a quantidade de argumentos, para minimizar eventuais problemas com sobrecarga.
Checagens adicionais podem ser feitas, porém no caso acima não houve necessidade.


m.invoke(o, args);

Finalmente o método invoke executa o código. O primeiro argumento é uma instância Object que implemente a Classe alvo, e o segundo argumento é um vetor com os métodos.
A CallStackException é uma exceção Runtime criada especificamente para essa situação, para efetuar o rollback das operações em banco em caso de algum método falhar.

Mais informações:

http://java.sun.com/docs/books/tutorial/reflect/
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

sexta-feira, 13 de março de 2009

GOMS - Metrificação de usabilidade

Para se medir qualquer coisa, é necessário uma métrica adequada.
Para metrificação de usabilidade, gostaria de apresentar padrão GOMS, e gostei muito dos resultados, principalmente no quesito "mostrar ao cliente".
Na prática, funciona assim:

1) Estabelecer custos para determinadas ações de usabilidade:

Mover o ponteiro do mouse até determinado ponto = 1
Clicar e arrastar um item = 4
Localizar um botão = 2
Tomar uma decisão booleana = 3
Preencher um form aprox 10 campos = 10
...

2) Listar os casos de uso seu sistema

Cadastrar um usuário
Preencher uma nota fiscal
Alterar dados de um usuário
...

3) Para cada caso de uso, pontue o custo de acordo com a primeira tabela

Dessa forma, você terá como identificar e aprimorar a usabilidade de seu sistema, utilizando uma metrificação numérica.

terça-feira, 3 de março de 2009

Criptografia de cookies

Criptografia de cookies é um requisito de segurança quando se armazenam informações críticas nos navegadores dos clientes de seu portal.
Em Java, os algorítimos de criptografia populares (AES, DES3) trabalham com vetores de bytes, o que demanda certa atenção no momento de convertê-los para uma String para se salvar em um cookie, em relação à codificação de caracteres (UNICODE UTF-8 e URLEncode).
Pode-se utilizar Base64 para converter a informação binária para String, porém é possível encarar problemas de padding de bytes.
A melhor solução encontrada foi a codificação dos bytes em Hexadecimal. Fica um pouco maior que o Base64, porém, totalmente bugfree, pois o output só terá caracteres "naturais", de 0 a 9 e A a F. Nada de / = + e outros caras estranhos pra quebrar a codificação de sua string. O pacote Apache Commons Codec implementa ambas as conversões.

http://java.sun.com/javase/technologies/security/
http://pt.wikipedia.org/wiki/Base64
http://commons.apache.org/codec/

sexta-feira, 21 de novembro de 2008

Curriculum

MARCIO HENRIQUE GHIRALDELLI
--------------------------------------
Brasileiro, solteiro, 30 anos
Residente em São Paulo-SP Pinheiros
marcio.gh@gmail.com (11) 8473-0200

OBJETIVO: Arquiteto / Programador Sênior


SÍNTESE DE QUALIFICAÇÕES
--------------------------------------

Liderança e iniciativa;
Auto-didata;
Fácil adaptação em diferentes ambientes;
Visão sistêmica e focada em processos;
Inglês fluente;

Java JEE (Struts / Hibernate / Weblogic / NetBeans Tomcat / EJB / BPM / Spring)
SGDBs relacionais (Oracle / MySQL / Firebird)
PHP 5 OO
Flash / ActionScript 3
XML / XHTML / CSS
Linux (Apache / Qmail / Bind / Bash / Perl)
Controle de versão (CVS / SVN)


EXPERIÊNCIA PROFISSIONAL
--------------------------------------
PROGRAMADOR SENIOR - UOL (12/2008 - atual)
- Desenvolvimento e manuteção de sistema de ROI de publicidade para apoio à equipe de negócios.
- JBoss / Jetty / Perl / Oracle / SAP BW

PROGRAMADOR PLENO - ACCURATE SOFTWARE (4/2008 a 12/2008)
- B2W Inc Desenvolvimento de projetos JAVA WebLogic
- Evolução contínua no carrinho de compras da Americanas.com e Shoptime.com (Weblogic)
- Integração das listas de casamento Java da Americanas.com com Submarino.com (Weblogic - ambiente SOA)
- Padrões ITIL (chamados/service desk/SLA) e XP (Extreme Programming)
- Referência: Thiago Buchler thiago.buchler@accurate.com.br

DIRETOR DE TECNOLOGIA - KAÉREA AGÊNCIA DE INTERNET (9/2006 a 3/2008)
- Administração executiva e análise de negócios
- Desenvolvimento de CMS - Sistema de Gerenciamento de Conteúdo
(PHP), gerando oportunidades de negócios com agências de publicidade, manutenção de conteúdo
- Desenvolvimento e gestão de ERP e CRM próprios (PHP)
- Integração de conteúdo dinâmico com aplicações em Flash (
XML /ActionScript / PHP)
- Treinamento de programadores (PHP e ActionScript)
- Referência: André Cupini andre.cupini@kaerea.com.br

COORDENADOR DE TECNOLOGIA - NEOBIZ TECNOLOGIA DA INFORMAÇÃO (7/2000 a 9/2006)
- Desenvolvimento de aplicações web
- Coordenação e treinamento de programação JEE (Struts/Hibernate) e PHP
- Implantação e administração de redes VPN e wireless
- Desenvolvimento de aplicativo Java para equipamento portátil para leitura e emissão de cointa água (LIES/Correios) - conexões sockets com backend, interface com usuário e regras de negócio da concessionária de água.
- Integração web para CRM, e desenvolvimento de framework próprio de persistência de dados ORM em PHP
- Membro do comitê de implantação NBR ISO9001:2000
- Referência: Airton Caetano airton.caetano@neobiz.com.br

WEBDESIGNER - NETALFA TECNOLOGIA DA INFORMAÇÃO (1/1999 a 9/2000)
- Desenvolvimento e vendas de websites
- Referência: Mauricio mauricio@netalfa.com.br


FORMAÇÃO ACADÊMICA
--------------------------------------

SUPERIOR COMPLETO (1/2000 a 12/2004)
Ciência da Computação - UNIP Universidade Paulista


CURSOS ADICIONAIS / CERTIFICAÇÕES
--------------------------------------

Curso Oratória e Apresentação
Mantovani 1.o semestre 2006

Curso Programação Java
Mygra Informática 2.o semestre 2005

Curso Gerenciamento da Tecnologia da Informação
Intel / NextG 2.o semestre 2004

Palestra Engenharia de Software
UNESP, 1.o Semestre 2004

Curriculum EN

MARCIO HENRIQUE GHIRALDELLI
--------------------------------------
Brazilian, Single, 29 years
Living at São Paulo-SP, near Congonhas Airport
marcio.gh@gmail.com +55 (11) 8473-0200

OBJECTIVE: IT Architect / Senior Developer


QUALIFICATIONS
--------------------------------------

Leadership and initiative;
Self-learn;
Easy adaptation on differentes enviroments;
Sistematic view and focused in proccess;
English speaking;

Java JEE (Struts / Hibernate / Weblogic / NetBeans Tomcat / EJB / BPM / Spring)
Oracle / MySQL / Firebird
PHP 5 OO
Flash / ActionScript 3
XML / XHTML / CSS
Linux (Apache / Qmail / Bind / Bash / Perl)
Versioning System (CVS / SVN)


PROFESSIONAL EXPERIENCE
--------------------------------------
SENIOR PROGRAMMER - UOL (12/2008 - actual)
- Development and maintenance of ROI publicity system for business staff support.
- JBoss / Jetty / Perl / Oracle / SAP BW

PROGRAMMER - ACCURATE SOFTWARE (4/2008 - 12/2008)
- B2W Inc JAVA WebLogic development - Americanas.com Submarino.com Shoptime.com
- ITIL and XP (Extreme Programming) Standards
- Reference: Thiago Salgado

IT MANAGER - KAÉREA AGÊNCIA DE INTERNET (9/2006 at 3/2008)
- CEO and Business Analyst
- Development of CMS - Content Management System (PHP)
- Development and management of ERP e CRM (PHP)
- XML Integrations (PHP and ActionScript)
- Programmers training (PHP and ActionScript)
- Reference: André Cupini

IT COORDINATIOR - NEOBIZ TECNOLOGIA DA INFORMAÇÃO (7/2000 at 9/2006)
- Development of web applications
- Coordination and training of Java web programming (JEE/Struts/Hibernate) and PHP
- Deployment and administration of VPN and Wireless nets
- Mobile Solution (Java J2ME) for reading and account of residencial water and eletricity consuption (LIES / Correios)
- Development of CRM solutions and persistence ORM (PHP)
- Member of NBR ISO9001:2000 development and deployment
- Reference: Airton Caetano

WEBDESIGNER - NETALFA TECNOLOGIA DA INFORMAÇÃO (1/1999 at 9/2000)
- Websites development
- Reference: Mauricio


ACADEMIC FORMATION
--------------------------

GRADUATED (1/2000 a 12/2004)
Computer Science - UNIP Universidade Paulista


ADITIONALS COURSES / CERTIFICATIONS
-----------------------------------------------

Oratory and Presentations
Mantovani 1.o semestre 2006

Java Programmer
Mygra Informática 2.o semestre 2005

IT Tecnology Management Intel / NextG
2.o semestre 2004

Software Engineering
Palestra Engenharia de Software
UNESP, 1.o Semestre 2004

sexta-feira, 12 de setembro de 2008

Eclipse TPTP

Através de um plugin do Eclipse é possível coletar dados runtime de uma aplicação Java (um dominio WebLogic por exemplo) e monitorar a utilização de memória por instâncias de objetos, timing de execução de threads entre outras informações, dando a informação precisa do que está acontecendo com uma aplicação, ajudando a localizar vazamentos de memórias e gargalos de processamento.

Eclipse Test & Performance Tools Platform Project

http://www.eclipse.org/tptp/

Tutorial

Baixando pacotes

http://www.eclipse.org/tptp/home/downloads/?ver=4.5.0

TPTP all-in-one package - Eclipse Ganymede + Todos os plugins TPTP ou All TPTP plugins - Somente os plugins para instalar em seu Eclipse (O plugin precisa de um SDK >= 1.5)

Agent Controller - Servidor TCP para coleta de dados de profile - Descompactar o pacote: - copiar os bin/*.dll para o diretório bin/ da JRE da JVM à ser monitorada - executar o bin/RAServer.exe (ficará ouvindo em uma porta TCP)

Configurando o WebLogic

Configurar startWebLogic.cmd para conectar no RAServer.exe no startup: Adicione o argumento -XrunpiAgent:server=enabled na linha de comando do WebLogic

Monitorando dados

Com o RAServer e sua aplicação Java rodando (WebLogic), inicie o Eclipse com o plugin, mude para o Workspace Profiling. Configure um novo profile buscando localhost, e ative os dados à serem coletados.

sexta-feira, 6 de junho de 2008

Adicionando e removendo data no Java

A API Java Calendar oferece maneiras práticas para manipulação de datas.
Quando precisamos adicionar meses ou anos em uma determinada data, podemos utilizar o método Calendar.add, que recebe como parâmetros a unidade desejada (dia do mês, ano, semanas, etc) e a quantidade à adicionar.
Segue um exemplo abaixo:

Calendar cal;

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

for (int i = 0; i <>
cal = Calendar.getInstance(); // seta cal na data atual
cal.add(Calendar.MONTH, i); // adiciona meses na data
System.out.println(df.format(cal.getTime()));
}

A saída desse código, supondo que hoje seja 06/06/2008 é:

06/06/2008
...
06/11/2008
06/12/2008
06/01/2009
06/02/2009
...

Note a virada do ano. Sem gambiarras no código.