terça-feira, 16 de dezembro de 2008

Configurando o Log4j para gerar múltiplas saídas

Configurando o Log4j para gerar múltiplas saídas.

Uma explicação rápida.
Enquanto estudava o hibernate vi a necessidade de criar mensagens de log para melhor acompanhar o funcionamento do sistema. Vi que já tinha importado a biblioteca do log4j e resolvi entender o mesmo.
Para que o hibernate funcione corretamente é necessária a importação da biblioteca log4j, a versão utilizada por mim “log4j-1.2.11”. Para configurar o funcionamento do log4j a forma mais fácil e comum é atravéz de um arquivo “properties” o nome padrão é “log4j.properties” e deve estar de preferência na raiz da sua aplicação.
Vou colocar aqui um exemplo de configuração do arquivo, serve como fonte de pesquisa.

log4j.rootLogger= stdout, erros, info
### ordem || levels ALL <>

#mostra o log4j se configurando no console...
#log4j.debug=true

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=ERROR
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file erros.log ###
log4j.appender.erros=org.apache.log4j.DailyRollingFileAppender
log4j.appender.erros.File=./logs/erros.log
log4j.appender.erros.DatePattern='.'yyyy-MM-dd
log4j.appender.erros.layout=org.apache.log4j.PatternLayout
log4j.appender.erros.layout.ConversionPattern=%5p %d{dd MMM HH:mm:ss} [%t] %c - %m%n
log4j.appender.erros.Threshold=ERROR
log4j.appender.erros.FILE.MaxFileSize=10000KB

### direct messages to file info.log ###
log4j.appender.info=org.apache.log4j.FileAppender
log4j.appender.info.File=./logs/info.log
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.info.FILE.MaxBackupIndex=4
log4j.appender.info.Threshold=info
log4j.appender.info.FILE.MaxFileSize=5KB

Explicando o arquivo:

Na primeira linha são criadas tres saidas de informações os “appenders”, eu dei os nomes de stdout, erros e info.

Na segunda linha deixei um comentário tendo a ordem dos levels dos logs:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
Caso queira testar se o seu arquivo de configuração do log4j esteja sendo carregado com sucesso habilite o debug do log4j “#log4j.debug=true”;

Aqui estou gerando saídas no console para todos os logs de level ERROR ou superior, notem o começo de cada linha especificando qual appender esta sendo configurado” log4j.appender.(stdout)”. O ConversionPattern pode ser alterado de acordo com a necessidade.

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=ERROR
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

Aqui estou gerando um arquivo de logs com o nome erros.log dentro do diretório logs, netem que o tipo desse appender e “org.apache.log4j.DailyRollingFileAppender”. Esse arquivo será salvo diariamente com a data no formato especificado no DatePattern. Após a virada do dia quando ocorrer algum log será renomeado o arquivo erros.log acrecentando-se a data e será criado um novo arquivo erros.log.

### direct messages to file erros.log ###
log4j.appender.erros=org.apache.log4j.DailyRollingFileAppender
log4j.appender.erros.File=./logs/erros.log
log4j.appender.erros.DatePattern='.'yyyy-MM-dd
log4j.appender.erros.layout=org.apache.log4j.PatternLayout
log4j.appender.erros.layout.ConversionPattern=%5p %d{dd MMM HH:mm:ss} [%t] %c - %m%n
log4j.appender.erros.Threshold=ERROR
log4j.appender.erros.FILE.MaxFileSize=10000KB

E por ultimo crio um arquivo de log para todas as mensagens de level “INFO” geradas pelo sistema.

### direct messages to file info.log ###
log4j.appender.info=org.apache.log4j.FileAppender
log4j.appender.info.File=./logs/info.log
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.info.FILE.MaxBackupIndex=4
log4j.appender.info.Threshold=info
log4j.appender.info.FILE.MaxFileSize=5KB

Tentei controlar o tamanho do arquivo colocando 5KB para ver o que o log4j faria, mas realmente ele não fez nada. Caso descubra algo crio um novo post aqui.

segunda-feira, 15 de dezembro de 2008

GeneratedValue com Hibernate no Firebird

Estou desenvolvendo um novo sistema em java e estou utilizando o Hibernate annotations, tive muitas dificuldades para aprender a utilizar as funcionalidades disponibilizadas pelo Hibernate, uma delas foi a utilização de autoincremento (Generators) do Firebird. Por isso estou postando aqui um exemplo.

Digamos que você queira criar uma tabela que ira salvar dados de uma conexão.

DDL do ibExpert:

CREATE TABLE TCPIP (

CODTCPIP INTEGER NOT NULL,

IP VARCHAR(100),

PORTA INTEGER,

GATEWAY VARCHAR(23),

MASCARA VARCHAR(30),

EQUIPSERIAL INTEGER,

MAC VARCHAR(30)

);

ALTER TABLE TCPIP ADD CONSTRAINT PK_TCPIP PRIMARY KEY (CODTCPIP);

Lembre de gerar o Generator para o CODTCPIP. O nome padrão gerado pelo ibExpert seria “GEN_TCPIP_ID”

A sua classe modelo devera ficar parecida com a seguinte:

@Entity

@Table(name = "TCPIP", catalog = "", schema = "")

@SequenceGenerator(name = "INC_TCPIP", sequenceName = "GEN_TCPIP_ID")

public class Tcpip implements Serializable {

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.AUTO, generator = "INC_TCPIP")

@Column(name = "CODTCPIP")

private Integer codtcpip;


Dois detalhes importantes das anotações feitas são @SequenceGenerator e @GeneratedValue, lembrando que o type do generator deve ser AUTO, pra utilizar o generator criado no Firebird.

sexta-feira, 5 de setembro de 2008

Problema Intel 965

Problemas que enfrentei com o glscene no meu notebook Dell, também com os drives de vídeo, placa de vídeo Intel 965, que possui um acelerador de vídeo.... apresentava erros na hora de compilar a aplicação, erros nas texturas dos meus objetos e chegava a travar o sistema. Não encontrei solução completa para o problema, simplesmente desinstalei os drivers de vídeo e da aceleradora, e instalei os genéricos que vem com o Windows Vista, e o sistema voltou a funcionar normalmente.

quarta-feira, 18 de junho de 2008

GET e SET das variáveis no Netbeans

Criar os métodos GET e SET das variáveis no Netbeans é muito fácil.

Clique com o botão direito do mouse e va na opção “Encapsulate fields..”, ira abrir uma janela :

Marque tanto os Getters e os Setters das variáveis que você deseja e clique em Refactor. A IDE Netbeans irá criar automaticamente para você.

terça-feira, 18 de março de 2008

Utilizando um Timer

Criei esses dias uma classe para auxiliar na utilização de alguns timers, com ela eu vou poder dar stop e play para abilitar ou desabilitar um timer.


import java.util.Timer;
import java.util.TimerTask;

/**
*
* @author homisinho
*/
public class ControlTime {
Timer timer;
boolean Estado;
int Delay;
int Time;
/**
*
* @param func type TimerTask Function to be executed;
* @param d Time before running timer, in second;
* @param t Time to run, in second;
*/
public ControlTime(int d,int t) {
Estado=false;
Delay = d;
Time = t;
}

public void Stop(){
timer.cancel();
Estado = false;
}

public void Play(TimerTask func){
timer = new Timer();
timer.schedule(func,Delay*1000, Time*1000);
Estado = true;
}
/**
*
* @return if time is in use;
*/
public boolean getState(){
return(Estado);
}
}

Para utilizar basta criar o objeto da classe:

public ControlTime tmr_2 = new ControlTime(60, 60);

E depois criar o timetask e passar como parametro:

TimerTask tt = new TimerTask() {
public void run() {
getDados(eq);///metodo qualquer q vc quer q execute
}
};
tmr_2.Play(tt);

E depois pra parar:

tmr_2.Stop();


quarta-feira, 12 de março de 2008

ParallelPort no Netbeans 6

Tive problemas ao utilizar o ParallelPort no Netbeans 6, na realidade o Netbeans acusa um erro mas a comunicação com a porta parelela funciona da mesma forma. Postei minha dificuldade no GUJ e até o presente momento não fui respondido. estou postando aqui o q eu coloquei no GUJ, a fim de compartilhar esse conhecimento.

++++++++++++++++++++++++++++++++++GUJ+++++++++++++++++++++++++++++
Pessoal estou com um problema na utilização da ParallelPort....
Na versão 5.5 do netbeans estava funcionando blz....
Quando instalei o netbeans 6

Product Version: NetBeans IDE 6.0 (Build 200711261600)
Java: 1.6.0_02; Java HotSpot(TM) Client VM 1.6.0_02-b05
System: Windows XP version 5.1

e abri o mesmo projeto q funcionava no netbeans 5.5 agora acusa um erro...

"package parport does not exist" no import parport.ParallelPort;

mas me certifiquei de ter colocado o arquivo parport.dll junto a pasta jre1.6.0_02/bin e na jre1.6.0_03/bin

e tbm coloquei a pasta "parport" com o arquivo "ParallelPort.class" dentro da pasta build/classes/ do meu project.

Alguem ja utilizou o parallelPort no netbeans 6 ???
Alguem tem alguma idéia do q possa estar acontecendo?


===================================================================

O Netbeans acusa o erro na linha do import....

import parport.ParallelPort;

o erro é: "package parport does not exist"

Mas a comunicação com a porta paralela funciona!
Acredito que o Netbeans acuse esse erro pq não existe a seguinte pasta e arquivo:

/src/parport/ParallelPort.java

somente coloquei dentro de

/build/classes/parport/ParallelPort.class


Estou certo?
Isto não irá trazer problemas ao meu sistema?

sexta-feira, 29 de fevereiro de 2008

Utilisando um jList

Na sua aplicação crie um jList. Nome padrão jList1.

Crie um DefaultListModel e adicione no jList.

listaModel = new DefaultListModel( );

jList1.setModel( listaModel );

Para adicionar itens na lista você deve adicionar elementos no listaModel criado.

listaModel.addElement( new String("ITEM 01"));

quarta-feira, 13 de fevereiro de 2008

Bug da ATI radeon...

Me deparei com um erro em um PC, ao fechar a aplicação que tinha criado utilizando a GLSene apresentava o seguinte erro:

Context activation failed: C0070006 

Pesquisei no google e encontrei em um fórum em inglês o suposto problema, que seria nos drives da placa de vídeo ATI 1100, é uma placa de vídeo onboard, entrei no site http://ati.amd.com/support/driver-pt.html e fiz o download do catalyst "Drives e software da ATI" mais atual. Fiz a instalação no computador “demorada até instalou o steam” , e por incrível que pareça solucionou o meu problema, o erro não apareceu mais.

sexta-feira, 1 de fevereiro de 2008

Colocar textura no GLMaterialLibrary via linha de comando

Muito simples, crie uma variável do tipo TBitmap, passe imagem ou como no exemplo parte de uma para o bmp e depois adicione a variável ao material texture do componente.

try
///cria a variavel
Bmp := TBitMap.Create;
///seta o tamanho da imagem
Bmp.Height := 300;
Bmp.Width := 498;
//recorta parte de uma imagem
Bmp.Canvas.CopyRect(Rect(0,0,500,300),img3d.Canvas,Rect(0,470-300,500,470));
//passa a imagem para a textura
texturas.Materials[2].Material.Texture.Image.Assign(Bmp);
finally
Bmp.Free;
end;

quinta-feira, 17 de janeiro de 2008

Criando TGLHudText em tempo de execução no GLSCene

Um pequeno exemplo de como criar uma TGLHudText em run time e posicionar a mesma.

Primeiro abra ou crie uma aplicação que contenha o cenário que desejar GLSceneViewer1, TGLCamera,etc...
Adicione um GLStoredBitmapFont e selecione a configuração de fonte que desejar.
Adicione uma HUDlabel, configure da forma que achar melhor, nesse exemplo alterei as seguintes configurações:

Bitmapfont : GLStoredBitmapFont; ///configuração de fonte escolhida
ModulateColor : clrBlack; ///cord a fonte
Visible : false; ///essa será a fonte padrão, as criadas em run time serão iguais a essa

Agora crie um vetor de labels e uma variável de controle.

Vlabel_Temp : array [1..100]of TGLHudText;//armazena as label criadas em run time...
Numlabelcriada : integer; //armazena quantas labels foram criadas pra destruir as mesmas

No evento que vc quiser, onkeypress, onclick de um button, etc vamos criar as labels....

if Numlabelcriada < 100 then ////testamos o numero Maximo de labels
begin
Numlabelcriada := Numlabelcriada+1; // Numlabelcriada inicia = 0 e Vlabel_Temp =1
Vlabel_Temp[Numlabelcriada]:= TGLHudText.Create(Self); //Criamos a label
Vlabel_Temp[Numlabelcriada].SetSubComponent(True);
GLCylinder1.AddChild(Vlabel_Temp[Numlabelcriada]);// de addchild de algum ///componente do plano q vc quizer, lembre q dependendo do plano q vc colocar a label ///pode ficar atrz de outros objetos da Scene....

Vlabel_Temp[Numlabelcriada].FreeNotification(Self);
///posicionando a label na Scene....
Vlabel_Temp[Numlabelcriada].Position.Y := y+15;
Vlabel_Temp[Numlabelcriada].Position.X := x+15;
///pegando as propriedades da label padrão, caso um dia deseja alterar a fonte fica mais fácil
Vlabel_Temp[Numlabelcriada].BitmapFont := lbl_Temp.BitmapFont;
Vlabel_Temp[Numlabelcriada].ModulateColor := lbl_Temp.ModulateColor;
/////texto q ira aparecer nas labels
Vlabel_Temp[Numlabelcriada].Text := ‘tessssssste';
Vlabel_Temp[Numlabelcriada].Visible := true;
end;


Seria isso.

No próximo post irei fazer elas se movimentarem de acordo com o mouse.

segunda-feira, 14 de janeiro de 2008

Códigos em JAVA

Olha pessoal nos próximos posts vou tentar fazer em forma de artigo, mas como eu somente vou postar aqui alguns códigos que eu utilizei em Java,não há necessidade de explicar cada um.... já vou falando desde agora que sou iniciante em Java e esses códigos foram todos testados, todos eles eu utilizei em alguns testes que eu fiz.....espero q ajude um pouco....


Este post sempre será atualizado com pequenos códigos que eu utilizo, claro q por enquanto estou parado na programação Java, mas logo retomarei meus testes.


DECLARAÇÕES

int tabela[] = {0x0000,0xC0C1,0xC181};///vetor hexadecimal

javax.swing.JCheckBox[] meuArray; ///vetor de componente checkbox

int[] dados = new int[1344];//vetor de inteiros


Limpa Vetor

Arrays.fill(dados,0);///limpa vetor...

Mensagens

JOptionPane.showMessageDialog(this,"A opção escolhida foi: "+”o q mais vc colocar”);

Necessita a biblioteca

import javax.swing.JOptionPane;

String opcao[] = {"Sim","Não"};

int resposta = JOptionPane.showOptionDialog(null,

"Os seguintes dados não poderão ser carregados da memória:\n DEMANDA CONTRATADA,\n MULTIPLICADORES, \n COEFICIENTE.\n\n Deseja limpar os campos de texto?",

"LIMPAR CAMPOS?",

JOptionPane.YES_NO_OPTION,

JOptionPane.QUESTION_MESSAGE,

null,

opcao,

opcao[0]);

if (resposta == JOptionPane.YES_OPTION){

jTextField2.setText("");

jTextField3.setText("");

jTextField4.setText("");

jTextField5.setText("");

jTextField6.setText("");

}

jComboBox

jComboBox3.setSelectedIndex(1); - seleciona o item da lista

jComboBox3.addItem("teste1"); - adicionando novos itens ao combobox

(String)jComboBox3.getSelectedItem(); - retorna o texto do item selecionado no combobox

jComboBox3.getSelectedIndex(); - retorna o index selecionado c nenhum selecionado retorna -1

Cursor

Cursor cursor = Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR );

component.setCursor( cursor );

////////////////////////////////////////////////////////////////////////////////////////////////

cursor = Cursor.getDefaultCursor();

component.setCursor( cursor );

Bordas e Background

jButton1.setBorder(BorderFactory.createLineBorder(new java.awt.Color(255, 255, 255),1));

jButton1.setBackground(new java.awt.Color(255, 255, 255));

Hint

buttonAlterar.setToolTipText("Texto");

Converter STRING to INT

String.valueOf(teste); //escreve string e coloca o . ai da ctrl espaço e v as opções de converção...

Arredondando/truncando Float

Math.round (0.5);

hi = Math.trunc(1.5);

hi = (int)(aux/256);

Formatando float

DecimalFormat decimal = new DecimalFormat( "0.00" );
System.out.println( decimal.format( 3.7691231233 ) );
 
Math.rint();


ICONE

Image icon =Toolkit.getDefaultToolkit().getImage(getClass().getResource("/imagens/ico.gif"));

setIconImage(icon);

CENTRALIZAR FRAME NO MEIO DA TELA

“nome do frame criado” .setLocationRelativeTo(null);

Trabalhando com ARQUIVOS

Escrevendo

FileWriter out = new FileWriter("dados.cew");

PrintWriter saida = new PrintWriter(out,true);

saida.println(“teste”);

saida.close();

out.close();

Lendo

FileReader reader = new FileReader("dados.cew");

BufferedReader leitor = new BufferedReader(reader);

jTextField1.setText(leitor.readLine());

leitor.close();

reader.close();

Testando ERROS (TRY)

Passando erro para a classe mãe

public insereNome(String nome)  throws SQLException {
    Statatement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO Nomes(nome) VALUES('" + nome + "')");
    stmt.close();
 }

Passando erro para a classe mãe JÁ TRATADO.

public insereNome(String nome)  throws FalhaAoInserirNomeException {
    try {
         Statatement stmt = conn.createStatement();
         stmt.executeUpdate("INSERT INTO Nomes(nome) VALUES('" + nome + " ')");
         stmt.close();
    } catch (SQLException e) {
      throw new FalhaAoInserirNomeException("Não foi possível inserir o nome " + nome, e);
      //Note que o segundo parâmetro é a exceção lançada. 
      //É uma boa prática anexar a causa na exceção reescrita.
    }
 }

sexta-feira, 11 de janeiro de 2008

Finalmente online!!!

Pra começar bem vou colocar algumas imagens das minhas férias, foi na virada de ano em Bombinhas-SC. Férias são férias, sempre são ótimas!!!