sexta-feira, 4 de dezembro de 2009

Apache Proxy

Geralmente, todo servidor de aplicação vem com um servidor HTTP embutido.
Por exemplo, se vc subir um Tomcat, na porta 8080, ele por si só vai responder HTTP.

O que acontece é que o Apache é mais rápido para servir conteúdo (cache, etc) portanto, muitos utilizam colocar o Apache na frente dos servidores HTTP dos aplications servers, servindo conteúdo estático (html, js, css, etc) diretamente, e somente redirecionando para o app server quando necessario.

Nesse caso, o Apache atua como um proxy, interceptando todas as conexões TCP na porta que estiver ouvindo, e encaminhando para a porta TCP do application server:

CLIENT ---- ---- APACHE ----- ----- APP SERVER

Segue um exemplo abaixo, à ser aplicado dentro de um do Apache, redirecionando todas as URLs para um aplication server rodando na propria maquina, na porta 8080:

RewriteEngine on
RewriteLogLevel 1
RewriteLog /logs/rewrite.log
RewriteRule /(.*)$ http://127.0.0.1:8080/$1 [P,L]
ProxyRequests Off
ProxyVia Block
ProxyPreserveHost On
ProxyTimeout 10

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.