Monday 15 September 2008

Problema com o Skype for Windows CE 6 ou superior

Se voce como eu tem um celular que usa o Windows Mobile versao 6 ou superior e tentou instalar o Skype no seu cartao de memoria, com certeza ele nao funcionou!!!!
Isto acabei de descobrir... o aquivo de instalacao que e fornecido tem um bug e NAO INSTALA todos os arquivos no cartao me memoria, ele somente ira funcionar a contento se voce instalar no aparelho.

Problema com legacy systems

Ola pessoal, mais uma vez estou aqui para falar sobre um problema em que sofri muito para descobrir.
Estou trbalhando em alguns sistemas antigos de uma telecom implementando novas funcionalidades e me deparei com erros no ejb-jar.xml, usando ejb2.0, jms com Weblogic 8.14 no Eclipse Ganymede.
Para o Weblogic funcionar no Eclipse voce vai precisar baixar um plugin que o reconhece, mas isto e simples. O que "apanhei" e muito foi com esse arquivo .xml pois ele me mostrava um pseudo erro, pois nao aparecia a bolinha com o X em vermelho, mas somente um grifado em vermelho em baixao da tag , e o engracado e que nao aparecia erro em nehuma parte do sistema, somente esse. Juro que nao entendi o que podia ser. Afinal estou acostumado ao Eclipse mostrar os erros ou a falta dos imports...
Mas desta vez nada, e o pior e que ele compilava tudo de boa. O erro so aparecia quando ia fazer o deploy no WL 8.14, que ele acusava que precisava bater o ejb-jar.xml com (session|... entao cheguei a achar que o problema era de configuracao do WL, pois na empresa ele me falavam que faziam o build e o deploy acontecia sem erros.
Entao tive uma ideia que me parecia totalmente fora... baixara e instalar o J2EE 1.4, pois e essa a versao que o WL aceita.
Baixei, instalei e criei uma jar de usuario no Eclipse e inclui o J2EE... afinal se alguem o usa e desde que os .jar estejam no path ou no \lib do app server o software roda, faz deploy e tudo mais mas o meu caso era o segundo, e eles me garantiam que so com os .jars fornecidos deveria rodar. Mas nao foi o caso estava realmente faltando os jars do J2EE 1.4.2!
Isso me mostrou tambem que eles nao sabem o que esta ocorrendo em seus ambientes de desnvolvimento/ homologacao e producao. Visto que fiquei sabendo depois que o responsavel pelo desenvolvimento ja havia deixado a empresa a algum tempo.
Bom fica ae a dica.... se estiverem usando J2EE 1.4.2 com Eclipse 3.4 e nao verem erros, mas somente alguns grifados nos .XML, fiquem atentos pois e muito provavel que seja a falta das bibliotecas java.

Saturday 30 August 2008

Portlets

Ola voce que esta lendo este post. Gostaria de falar aqui sobre os Portlets, uma tecnologia bem interessante, disseminada e ao mesmo tempo com coisas controversas. Ainda nao li sobre s jsr-286, portanto vou somente falar do que estou vendo em projetos e a minha impressao, que e baseada no jsr168.
Nao sei se muitos de voces aqui ja tiveram que trabalhar com os JSP's cheios de scriptlets, codigo java, que a muito nao via, mas de uns 4 meses para ca estou pegando alguns projetos que usam e abusam de Portlets, mas sem divisao alguma de camadas... a sensacao que tive e de uma volta ao tempo em que o JSP foi lancado, codigo que somente quem o fez sabe realmente o que esta acontecendo. Vejo portlets com regras de negocio, pesquisas e persistencia tudo dentro de uma classe so!!!!! Talvez eu esteja errado em discutir isso, mas para que serve entao os Patterns, arquitetura MVC e os frameworks como o saudoso e muito vivo ainda Struts, JSF e todos action baseds ???? A ideia de Portlets e interessante mas ao meu ver e uma faca de dois gumes, do mesmo jeito que ela encapsula todas as regras em uma area de tela, o que poderia ser feito com servlets e jsp e com muito mais facilidade de manutencao do que com o que ando vendo. Ao meu ver para se criar ficou como era nos anos 80/90... uma bagunca, tudo junto onde voce tinha um programa que fazia tudo!!!! Acho que pelo menos poderiamos fazer como com JSP & Servlets (com padronizacao e separacao em camadas), tentarmos fazer separacoes, aplicacao de Patterns, sei la facilitar a manutencao, pois como voces estao carecas de saber a manutencao e 90% da vida de um sistema...
Para finalizar deixo aqui meu repudio a esses programadores que so porque conseguiram "entender" a grosso modo como funciona um framework, ja saem produzindo codigos sem qualidade, sem pesquisar muito... e olha que em 20 anos de TI sei do que esotu falando... ta cheio de gente assim por ai...
Bom gente vamos por a mao na consciencia e pensar que nao vamos viver para sempre e que muito provavelmente nao estaremos nos 90% restantes junto ao sistema
Desculpe se alguem se sentiu ofendido, mas isso e um blog e esta e a minha opniao. Sinta-se livre para comentar.

Tuesday 5 August 2008

Usando ClassLoaders... extendendo... hot-deploy

Ae pessoal, se voces um dia precisarem fazer um hot-deploy, aqui vai umas dicas e um programa de hot-deploy bem simpes, sem seguranca.
Primeiro vamos criar a classe que ira ser carregada, ira se chamar Hello para nao perdermos o vicio. rsss
Hello.java
public class Hello {
public Hello() {
System.out.println("Hello versão 3 Turbinada!!!!!!");
}
}

Para voce conseguir fazer este funcionar, e necessario que voce exporte a classe como um .jar, que no meu exemplo se chama Hello.jar. Se preferir coloque em outro projeto a classe que ira extender a ClassLoader, para que voce possa ficar alterando a Hello.java e regerando o Hello.jar, fazendo isso voce ira conseguir ver a classe sendo carregada. O que fiz foi ficar mudando a string do println() para ficar vendo quando era carregado a nova classe.
Basicamente a voce ira precisar sobre-escrever o metodo findClass, que devera "ler" o arquivo como binario o aquivo, e dar um super.defineClass... para dizer a JVM que ira carregar aquele arquivo binario que vc leu e esta armazenado no Class.
Mas para voce "ler" o arquivo binario e necessario escrever um metodo que ira suprir o metodo findClass com o arquivo em modo binario.
Aqui esta o exemplo que fiz:
ClassLoaderTest.java
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClassLoaderTest {
public static void main(String args[]) {
try {
URL url = new URL("file:///C://dev//projects//TestClassLoader//bin//test//Hello.jar");
while(true) {
Thread.sleep(10000);
ClassLoader cl = URLClassLoader.newInstance(new URL[] {url});
Object obj = cl.loadClass("test.Hello").newInstance();
System.out.println(obj.toString());
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}

So isto ja serviria para carregar a classe, agora o correto seria voce extender a classe, ClassLoader ou URLClassLoader e sobreescrever o metodo findClass, para que ele carregue a(s) sua(s) classe(s). Mas lembre-se que para se fazer isso e necessario que voce "leia" o arquivo como binario, aqui vai um exemplo desses dois metodos

@Override
public Class findClass(String nameClass) throws ClassNotFoundException {
// lança ClassNotFoundException se o download falhar:
byte[] bytes;
Class c = null;
try {
bytes = readBinaryClass(nameClass);
c = super.defineClass(nameClass, bytes, 0, bytes.length);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
Logger.getLogger(ClassLoaderTest.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
ex.printStackTrace();
Logger.getLogger(ClassLoaderTest.class.getName()).log(Level.SEVERE, null, ex);
}
return c;
}

public byte[] readBinaryClass(String nameClass) throws FileNotFoundException, IOException {
int n = 0;
Byte singleByte = 0;
byte[] readedBytes = null;
Integer byteBin = 0;
List fileBin = new ArrayList();
File classBin = new File(nameClass);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(classBin));
while ((byteBin = in.read()) != -1) {
readedBytes[n] = Byte.parseByte(byteBin.toString());
if (in.read() != -1) {
n++;
}
}
return readedBytes;
}
}

Desculpem mas aqui nao foi possivel fazer a identacao.
Mas seguindo, voces poderao notar que leio o arquivo, que podera ser um .jar ou um .class como binario e retorno para o Class c = ... a classe e que por sua vez o ira carregar a nova classe no heap da JVM, descartando a antiga.
E um procedimento simples, mas que encontrei muita dificuldade em encontra-lo na web, algo simples assim. Achei alguns tutoriais um no GUJ muito bom, mas falta um exemplo pronto para que possamos testar e irmos adaptando ao que queremos.
Espero ter ajudado, e aceito comentarios... bons e ruins.

Thursday 26 June 2008

Problemas usando JPA com DB2 iZ Series (os/390)

Se voce como eu acessa o DB2 no mainframe usando JPA-Hibernate e enfrentou problemas com o entity manager, aqui vai a dica...
O problema nao e no Java ou no JPA e sim a falta de PTF's que a grosso modo sao como services packs do windows, que deixam o DB2 pronto para uso do JDBC tipo 4.
Aqui vai os links que lhe serao uteis para a configuracao do DB2, sao todos diretos do site da IBM :

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.apdv.java.doc/doc/r0023708.html

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.apdv.java.doc/doc/rjvxindt.html

Com a informacao destes links voce sabera o PTF certo para cada versao do DB2 e tambem para o ambiente iZ/390.
Apos a instalacao e configuracao dos mesmos e so rodar o seu sistema, ou mesmo conectar via IDE que tudo funciona perfeitamente.

Sunday 1 June 2008

Algumas dicas para configuracoes no JBOSS para desenvolvimento

Bom pessoal, se voces quiserem testar o seu sistema usando o JBOSS 4.2.2 em outro pc, voce precisara liberar ele para que outros PCs o enxerguem, para que as portas sejam escutadas.
voce necessitara adcionar na seguinte linha :
"%JAVA%" %JAVA_OPTS% "-Djava.endorsed.dirs=%JBOSS_ENDORSED_DIRS%" -classpath "%JBOSS_CLASSPATH%" org.jboss.Main %*
isto :
-b seu IP aqui na frente

So que com isso voce nao conseguira mais acessar o JBOSS do seu PC chamando localhost ou 120.0.0.1 , mas devera ser feito chamando o seu IP

Agora para voce nao ter problemas de PermSize com o JBOSS, como parametros para incializado da JVM colocar :
-Xmx512m -XX:MaxPermSize=128m
Espero ter ajudado a voce que estava tendo problemas com configuracoes do JBOSS

Friday 2 May 2008

Criando um Data Source no JBOSS 4.2.2 com JPA

Estou postando aqui essas dicas pois tive muita dificuldades em criar um Data Source (DS) no JBOSS 4.2.2. E mesmo procurando em varios forums e lendo a documentacao da propria JBOSS nao me foi muito clara.
Primeira coisa a ser feita e a copia do seu driver JDBC para o diretorio $JBOSS_PATH\server\default\lib,
no meu caso era o do MySQL : mysql-connector-java-5.0.4-bin.jar
Depois disso vamos criar o DS propriamente dito. Va em
$JBOSS_PATH\docs\examples\jca, copie o -ds.xml referente ao seu Servidor de Bando de Dados (BD), Eu usei o mysql-ds.xml, e coloque-o em $JBOSS_PATH\server\default, e edite-o para as suas configuracoes.
Este e o meu :

< ?xml version="1.0" encoding="UTF-8"? >
< !-- $Id: mysql-ds.xml 63175 2007-05-21 16:26:06Z rrajesh $ -- >
< !-- Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-- >
< datasources >
< local-tx-datasource >
< jndi-name >MySqlDS< /jndi-name >
< use-java-context >false< /use-java-context >
< connection-url >jdbc:mysql://< seu ip >:3306/teste< /connection-url >
< driver-class >com.mysql.jdbc.Driver< /driver-class >
< user-name >user< /user-name >
< password >12345678< /password >

< !-- should only be used on drivers after 3.22.1 with "ping" support
< valid-connection-checker-class-name >
org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker
< /valid-connection-checker-class-name >
-- >
< !-- sql to call when connection is created -- >
< new-connection-sql >select p.* from pm p;< /new-connection-sql >
< !-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
< check-valid-connection-sql >some arbitrary sql< /check-valid-connection-sql >
-- >
< !-- corresponding type-mapping in the standardjbosscmp-jdbc.xml -- >
< metadata >
< type-mapping>mySQL
< /metadata >
< /local-tx-datasource >
< /datasources >

Depois voce tem que copiar o arquivo < seu BD >-jdbc2-service.xml que esta em $JOBSS_PATH\docs\examples\jms, para o diretorio $JBOSS_PATH\server\default\deploy\jms, como estou testando com o MySQL copiei o arquivo mysql-jdbc2-service.xml.
Apos isso va em $JBOSS_PATH\server\default\lib, e remova ou altere a extencao dos seguintes arquivos : hsqldb.jar e hsqldb-plugin.jar
So com isso o JBOSS ja ira fazer o start sem erros, mas ainda falta o principal, fazer o seu sistema achar o DS do JBOSS.
Aqui esta o meu persistence.xml :

< ?xml version="1.0" encoding="UTF-8"? >
< persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0" >
< persistence-unit name="SPEPU" transaction-type="JTA" >
< provider >org.hibernate.ejb.HibernatePersistence< /provider >
< jta-data-source >MySqlDS< /jta-data-source >
< /persistence-unit >
< /persistence >

Eu uso a IDE MyEclipse 6.0.1, mas tambem ja teste com o NetBeans 6.0 e as duas IDE's quando geram o projeto, colocam as libs que o JBOSS ja possui, o que causa a "confusao".
Portanto faca uma lista de todas as libs que o JBOSS possui, de uma olhada em todos os diretorios lib, e depois remova do seu projeto.
As primeiras etapas foi facil chegar so lendo os foruns e a documentacao, mas essa de remover os libs do meu projeto que o JBOSS ja possui, foi a que deu mais trabalho para chegar.
Bom espero ter ajudado voce que esta com dificuldade em criar o DS para o JBOSS 4.2.2

Monday 31 March 2008

JSF configurando Datas com o MySQL

Se voce como eu usa o MySQL para desenvolver, acho que ja teve problema em inicializar campos data na view do JSF pelo faces-config.xml. Se voce for um desses e quiser configurar, esqueca de setar a data no faces-config.xml, porque ira dar sempre erro na hora de inicializar a view, porque o MySQL usa a formatacao de data diferente e pode ser setada usando um String data = "yyyy-MM-dd". Para isso eu simplemente nao inicializo o campo no faces-config.xml, e so uso a tag dentro do inputText
< value="#{cadastroAcesso.dateCreate}" required="true">

< type="date" pattern="dd/MM/yyyy">

< /f:convertdatetime>

Sunday 30 March 2008

Inicio

Ola, sou mais um entre milhares desenvolvedores Java, e vou usar este blog para ir colocando codigos que espero que ajude a quem o ler. Sao solucoes que usei e ainda faco uso. Bem como comentarios sobre lancamentos tecnologicos voltado para area de TI. Como voces vao perceber nao faco uso do cedilha e nem de acentuacao, pois meu note e importado e com teclado e windows Britanico, nao ha como configurar para isso. Se fosse Americano daria!
Atualmente trabalho com a metodologia SCRUM e sou o team leader de um time de 5 pessoas. Meus ultimos projetos foram feitos com JSF com Ajax4jsf e Richfaces, JPA/Hibernate e sempre que possivel para aquelas classes que sao sempre reusadas, crio ou coloco junto a um web server.
Em 90% dos casos irei postar os exemplos feito com a IDE Eclipse que uso atualmente a 3.3, mas tambem irei postar alguns exemplos com o Netbeans 5.5 ou 6.x.
Gostaria tambem que comentem sempre que possivel, com criticas construtivas e dicas tambem.
Obrigado