quinta-feira, 22 de outubro de 2009

Reflexão em Flex

Como diz um amigo meu:
Opa,

ainda estou apanhando com o flex, mas sei que no começo é assim mesmo
igual a irmão mais novo, despois que cresce ja viu ne...

para fazer reflexao em flex é mais ou menos assim:

flash.utils.getQualifiedClassName(obj:Object); // para pegar o qualify name de um obejto

e getDefinitionByName(name:String); // para pegar um objeto a partir de uma string;

exemplos:

var methodRef:Function = Function(flash.utils.getDefinitionByName(method));
methodRef.call(this);

var classReference:myClass;
var klas:Class=getDefinitionByName("myClass") as Class;



então a dica é a seginte: para elaborar um menu eu passava como parametro o objeto da janela que queria abrir para uma funcao showForm, no meu caso. So que mesmo passano o caminho correto recebia o erro:

Variable List is not defined. at global/flash.utils::getDefinitionByName()....

então, o esquema é criar uma variavel do tipo que vc vai instanciar por reflexao para o copilador nao se perder. ( eu sei que no Java isso nao precisa :p)

ex:


var formUsuario:usuario.List;
var formPassaro:passaro.List;
var formAlterarSenha:usuario.AlterarSenha;
new Util().showForm(this, getDefinitionByName(item) as Class);

segunda-feira, 19 de outubro de 2009

Conversao latin1 para utf-8

Uma dica rapida para outubro nao passar em branco.

como uso o postgres desde a versao 6.4
no inicio para aceitar os caracteres do brasil utilizava o latin1
como enconding.

hoje na versao 8.4 o suporte a utf-8 esta se tornando padrao, entao o
que fazer para migrar as bases antigas?

Resposta esta na utilizacao de conversores de codificaçao do arquivo de backup.

para linux faça o seguinte:

- Gere um backup normal com pg_dump:
pg_dump -i banco > backup.sql

- utilize recodificadores de caracteres, no meu caso escolhi o recode (http://www.gnu.org/software/recode/recode.html):
recode l1..utf8 backup.sql

- por final, edite o arquivo para retirar o SET client_encoding = 'LATIN1'; que o pg_dump gera:
vim backup.sql

- feito isso basta importa o backup para o novo banco ja criado com a codificaçao UTF-8
psql banco < backup.sql

sexta-feira, 11 de setembro de 2009

Palestra sobre Java Mobile com Roger Brinkley (Sun Microsystems)

Opa,

Dia 10 de setembro em maringa, mais precisamente no Cesumar, foi realizado uma palestra : "O futuro do desenvolvimento móvel com JavaME", com Roger Brinkley.

Roger Brinkley é o Líder da Comunidade Móvel & Embarcados da Sun Microsystems. É responsável pelo desenvolvimento comunitário relacionado a tecnologias Java ME. Roger possui mais de 30 anos de experiência profissional, sendo mais de 14 na Sun. É um palestrante asssíduo em conferências técnicas ao redor do mundo.

Estive la, com a ajuda (leia-se carona) do pessoal da unimake, e pude conferir de perto, estava na primeira fila, mais sobre o assunto.

O cara é estranho, começou lançando duas bolinhas de brinde da sun, com taco de golf,
pensei, hoje eu ganho brinde, que nada, foram os unicos de todo o encontro.

A desculpa foi que o tudo foi arranjado na hora, e ate o datashow e a tradução falharam.

Roger basicamente comentou sobre tres aspectos: mobile, tv digital, e embarcados.

Em relação a parte movel, ele comentou de um novo projeto chamado phoneME, que vai começar a vir no celulares para daqui uns 6 meses, esse projeto traz recursos avançados para o desenvolvedor inventar moda no celular. Assim ele pode programar para um e rodar em qualquer dispositivo com phoneME e tera o mesmo resultado, a mesma cara no caso. Comentou tambem sobre o lwuit (https://lwuit.dev.java.net/) que é um conjunto de componente para trabalhar com java me.

Na parte da tv digital o fato importante esta que a tecnologia brasileira esta toda em java, ele falou de projeto nos EUA o que pra mim ainda nao vem ao caso.

Por final, os embarcados (brinquedinhos caros), foi a que o pessoal gostou mais. Ele demonstrou o SUN SPOT, uns cubinhos que rodam aplicações java, que da pra inventar um monte de coisa, exemplo que ele demonstrou:

- um spot jogando bola com outro
- um carinho robo que desvia de obstaculos e ate de buraco
- um luva do tipo minority report, que ele usou para manipular imagens
- um dipositivo do tamnaho de uma carteira aberta que recebe dispositivos plug-play

Ja no no pinga-fogo, onde era proibido fazer pergunta sobre a oracle, o destaque foi para a resposta sobre o phoneME em relação o Java FX, a ide nova para programar para java mobile, e o suporte a multi-touch e android.

Do mais, o evento foi muito bom pois revi amigos e professores, e é bom ficar interado um pouco sobre novas tecnologias :)

terça-feira, 18 de agosto de 2009

replicaçao postgres morna quase pelando

Voltamos!

E hoje num dia chuvoso nada melhor que escrever um tutorial
- Ta loko!
- Por que?
- Bom mesmo e´ se funcionar :)

depois de algumas pesquisas(google) de como fazer replicaçao com bando de dados
postgres chegamos a alguns resultados:

Com slony, ´e legal quando voce quer replicar determinadas partes do banco,
e tem o pgadmin que ajuda muito na configuracao. Contras nao replica
objetos largos. qualquer coisa que mexer no master ex. alterar tipo de campo, criar tabela
tem que fazer a mesma coisa no slave, o replicador nao faz automatico.

Com pgcluter precisa de no minimo tres maquinas, em algums casos com maquina virtual
vc coloca pra funcionar tudo na mesma maquina, mas dai nao tem vantagem :(

Ai foi que nosso amigo Edson (unimake), sugeriu o modo standby, no qual o slaver fica sendo atualizado
pelo master em um determinado tempo e no que precisa esta pronto para entrar em produçao.

Em busca de mais detalhes desse modo, descobrimos que existe o modo hot, e warm,
o hot o slave fica no ar e esta apto para consultas, no modo war o slave fica baixado

E com base nesse tutorial (http://www.gulbf.com.br/?q=node/33) estamos fornecendo um modo
de fazer isso.

O ambiente testado foi ubuntu e a versao do postgresql 8.3.

Para facilitar vamos utilizar simbolos para descrever onde o comando deve ser executado:
* na maquina master @
* na maquina slave #

- instalar o postgres:
# @ apt-get install postgresql

- instalar o rsync
# @ apt-get install rsync

- parar o banco
# invoke-rc.d postgresql-8.3 stop

- habilitar a conexao do ssh por chave publica
@ ssh-keygen

- copiar a chave publica para a slave
@ scp .ssh/id_rsa.pub root@192.168.1.x:/root/

- copiar o arquvio para .ssh/authorized_keys se nao existir
# cp /root/id_rsa.pub /root/.ssh/authorized_keys
- ou ediar se exister e colar o conteudo do id_rsa.pub para dentro
# vim .ssh/authorized_keys

- igualar o UID do usuario e do grupo postgres de ambas as maquinas

# vim /etc/group
# find / -group 109 -exec /bin/chown -v .125 {} \;
- onde o 109 era o uid antigo e 125 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

# vim /etc/passwd
- lembrar de alterar o uid do group caso foi alterado acima
# find / -user 104 -exec /bin/chown -v 113 {} \;
- onde o 104 era o uid antigo e 113 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

- mover o diretorio da instalacao e preparar um novo para recever os arquivo do master
# mv main/ main-old/
# mkdir main
# chown postgres:postgres main -R

Tudo pronto so sincronizar e rezar

@ /usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/

Funciono? Graças a Deus?

agora so colocar um scrpt prar a cada intervalo sincronizar


#!/bin/bash
echo 'Iniciando sincronizacao de arquivos...'
/usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/
echo 'Finalizado.'
echo 'Aguardando proxima sincronizacao...'
sleep 60
exec $(pwd)/replica.sh




Entao vou acrescentar mais algumas dicas como forma de melhoria do post

a primeira dela é simples, para poder configurar o rsync para poder conectar em uma porta diferente do ssh. Deve-se utilizar o parametro:
/usr/bin/rsync -Cravzp --rsh='ssh -p2220'

a segunda é tambem relacionada ao rsync. Em alguns casos o servidor slave pode executar o comando de sincronismo sem problemas, assim varias maquinas podem ser sincronizadas ou tambem, por algum motivo de segurança o servidor nao pode acessar o ssh do slave.

a terceira é importante! nao foi colocado nesse post mas é recomendavel habilitar os archives do postgres, assim se o db no master corromper, a replicação é repassada mas pelo logs da pra recuperar

sexta-feira, 29 de maio de 2009

Margem espelho ireport (jasper para os leigos)

Trata-se de uma POG utiliza para gerar relatorios com margem espelhos:
o esquema ´e o seginte:
- cria-se dois relatorios iguais no conteudo, um com a margem certa e outro com a margem recuada
- depois passa pegando uma folha de cada para gerar o relatorio final



Report report = new Report(txDateInitial.getText(), txDateFinal.getText());
report.setBeginBefore(beginBefore);
report.setIsVerso((rbFrente.isSelected() ? Boolean.FALSE: Boolean.TRUE));
report.setFolha(folha);


String pathReportRecto = Util.getResource().getProperty("pathReportRecto");
JasperPrint printRecto = report.getReport(pathReportRecto);

String pathReportVerso = Util.getResource().getProperty("pathReportVerso");
report.setFolha((rbFrente.isSelected() ? folha-1: folha));
JasperPrint printVerso = report.getReport(pathReportVerso);

JasperPrint jasperPrint = new JasperPrint();
jasperPrint.setOrientation(JasperReport.ORIENTATION_LANDSCAPE);
jasperPrint.setName("Protocolo");

if (rbFrente.isSelected()) {
jasperPrint.setPageWidth(printRecto.getPageWidth());
jasperPrint.setPageHeight(printRecto.getPageHeight());
} else {
jasperPrint.setPageWidth(printVerso.getPageWidth());
jasperPrint.setPageHeight(printVerso.getPageHeight());
}

int i = 0;
Iterator<jrprintpage> iterator = printRecto.getPages().iterator();
Iterator<jrprintpage> iterator2 = printVerso.getPages().iterator();

if (rbFrente.isSelected()) {

while ( iterator.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
} else {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
}
i++;
}

} else {
while ( iterator2.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
} else {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
}
i++;
}

}

report.closeConnection();


if (jasperPrint.getPages().size()>0) {
Preview preview = new Preview(jasperPrint);
preview.setVisible(true);
preview.setExtendedState(MAXIMIZED_BOTH);
} else {
JOptionPane.showMessageDialog( this, "Os parametros informados não geraram nenhum relatório.", "Erro", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
ex.printStackTrace();
}

quarta-feira, 1 de abril de 2009

iBatis + Spring + Flex = uau

Acho que fiquei loko de vez, em plena ferias to aproveitando pra aprender ibatis
e to fazendo isso convertendo um sistema simples, desenvolvido em um esquema velho
em MVC.

a ideia é aproveitar e fazer a jogadinha iBatis+spring +flex
mas como diz Jack, vamos por parte.

ate agora ta divertido e estou postando algumas dicas sobreo ibatis que estou encontrando:

1- cuidade em usar $xxx$, isso é bom pra gerar sql dinamico mas conforme a implementação abre espaço para um ataque sqlinjection, ex: voce colocar pra ordenar dinamicamente a tabela passando como paramentro o campo atravez de um lik na coluna /servlet?allCliente&orderBy=nome , e la na sql vc usa
order by $orderBy$ o cara pode mandar um comendo junto com a url.
nesses casos melhor usar alguma hash map ou ate mesmo enum para pega o paramentro e trocar pelo nome da coluna.

2 - result property="estado.id" column="estado_id" . isso serve para mapear uma bean que tenha como atributo uma outra bean e vc vai fazer um select so com join.

3 - Como fazer like com % já que no ibatis ele vai trocar? simples no sql vc usa o recurso de concatenar string do banco de dados ex. postgres where nome like '%' || #valuee# || '%'

4- typeAlias alias="Passaro" isso serve para colocar um apelido para a classe. assim vc nao precisa ficar passando sempre br.com.suaempresa.bean.Obejeto
nos depais tags sql vc so passa Passaro.

5 - sql id="fragmentWherePassaro". Esse é sem duvida o recurso mais interesante do ibatis. imagina que vc tem dois select um com count e outro o select normal. os dois utilizan a mesma clausula where. vc faz o where em uma tag separada e pode usar nos dois ou outros sql, lembrando sempre que o where pode ser dinamico

6 - nome dos parametro ex. #cliente.id# coloque #clienteID# se nao ele nao acha no map, para o ibatis o cliente.id ele vai tentan procurar por um objeto cliente com atributo id e nao um parametro "cliente.id"

o proximo post vou mostar algus configurações para usar spring com anotaçlões e com um service e dao generica e o terceiro e o Flex

segunda-feira, 23 de março de 2009

WEB SERVICES SEGUROS EM JAVA

Estou de ferias meio periodo (problemas no software), mas para o blog não ficar muito parado estou disponibilizando minha monografia do curso de pos-graduação que fiz em java.
Segue o resumo:

No momento, a arquitetura orientada a serviços encontra-se no radar de muitos
gerentes de TI, e um numero maior de empresas passam a dedicar cada vez mais
recursos à SOA. Se a SOA é a arquitetura, os Web Services são os blocos de
construção (IBM, 2008). Desta forma, Web Services estão em destaque no mundo
da computação distribuída como uma tecnologia que resolve os problemas de
interoperabilidade dos sistemas, pois utilizam padrões abertos e independentes de
plataforma, como HTTP e XML. Porem, por possuir uma infra-estrutura publica
oferece, também, uma maior preocupação no tocante a segurança. Neste presente
trabalho pretende-se demonstrar o funcionamento de Web Services seguros
utilizando a tecnologia Java abordando conceitos da arquitetura orientada a
serviços. Através de um estudo de caso será implementado Web Services, com o
auxilio de frameworks como Apache Axis e CXF, utilizando os padrões de protocolos
adotados pela industria demonstrando a especificação WS-Security.

download

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

Call Procedure Oracle with Java and Param Out

Segue um exemplo de como executar uma procedure com parametro de entrada e saida no oracle.


public static void main(String[] args) {
try {

Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
Connection con = DriverManager.getConnection(url, db_user, password);
System.out.println("Connected to database");

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date now = new java.sql.Date(simpleDateFormat.parse("12/02/2001").getTime());

String command = "{call SALDOS(?,?)}";
CallableStatement cstmt = con.prepareCall (command);
cstmt.registerOutParameter(2, Types.DECIMAL);

cstmt.setDate(1, now);
cstmt.execute();
Double str = cstmt.getDouble(2);

cstmt.close();

System.out.println("Retorno: "+str);

} catch (Exception e) {
e.printStackTrace();
}
}


isso foi testado com oracle 9 e 10 xe
usando driver jdbc oracle
ojdb14.jar
ojdb14_g.jar

sexta-feira, 27 de fevereiro de 2009

Welcome.blog

Este é o meu primeiro post, e quero aqui compartilhar algumas idéias em relação ao meu trabalho e se for interessante algum fato da minha vida tambem.

Espero que o que for colocado aqui seja util à alguem, assim como muitas coisas que encontrei na internet e que já me ajudo e ajudam muito.

A internet hoje tornou-se um grande mundo virtual, o lado b da realidade, onde encontra-se te tudo! Mas se formos analisar, ela pode ser muito mais, afinal quantas coisas vc já compartilhou na rede?

Bom... se sua resposta limita-se a um perfil no orkut ta na hora de pelo menos começar a responder a algum forum ou então fazer iqual eu e criar um blog. Vamos lá, comece vc tambem! Não doi nada :)

Algumas razões que me motivaram:

pessoas mediocres discutem pessoas
pessoas médias dicutem fatos
pessoas grandes dicutem ideias

Um pouco de publicidade não faz mal a ninguem.

Imagine um jornalista que sabe onde Osama Bin Ladem esta escondido, mas guarda essa informação so pra ele...

Perder no varejo para ganhar no atacado.