domingo, 25 de janeiro de 2009

Adicionar Servidor Tomcat 5.5 como serviço no Ubuntu

Esse post mostra como colocar o servidor web Tomcat 5.5 como serviço no sistema ubuntu linux.
Para isso basta:

Criar o script de inicialização em /etc/init.d/ arquivo: tomcat

# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid

case $1 in
start)
sh /opt/tomcat/bin/startup.sh
;;
stop)
sh /opt/tomcat/bin/shutdown.sh
;;
restart)
sh /opt/tomcat/bin/shutdown.sh
sh /opt/tomcat/bin/startup.sh
;;
esac

exit 0


Em seguida deve-se dar permissão de execução ao arquivo

sudo chmod 755 /etc/init.d/tomcat


O próximo passo é instalar o tomcat como um serviço sistema, o utilitário
update-rc.d é utilizado com esse fim da seguinte forma:

update-rc.d tomcat defaults


Resultado da execução e criação de links efetuado pelo update-rc.d:

Adding system startup for /etc/init.d/tomcat ...
/etc/rc0.d/K20tomcat -> ../init.d/tomcat
/etc/rc1.d/K20tomcat -> ../init.d/tomcat
/etc/rc6.d/K20tomcat -> ../init.d/tomcat
/etc/rc2.d/S20tomcat -> ../init.d/tomcat
/etc/rc3.d/S20tomcat -> ../init.d/tomcat
/etc/rc4.d/S20tomcat -> ../init.d/tomcat
/etc/rc5.d/S20tomcat -> ../init.d/tomcat



A próxima vez que o sistema for reiniciado, o arquivo tomcat (configurado acima) será executado inicializando o servidor tomcat como um serviço.

terça-feira, 20 de janeiro de 2009

JAVA: Criando Threads

Podemos fazer analogia a um processo como sendo um programa em execução. Já uma Thread é conhecida como "processo leve" (lightweight process), é considerada leve pelo fato de rodar dentro do contexto do processo, aproveitando-se do compartilhamento dos recursos alocados para o ambiente do programa.

Há casos em que dentro da execução de um processo, verifica-se a necessidade de "disparar" uma thread que irá executar paralelamente ao processo a que pertence. Dessa forma, pode-se executar instruções sem que o processo principal fique em estado de espera "lock" até que um trecho de código seja executado.

Em JAVA pode-se herdar a classe Thread ou implementar a interface Runnable para se utilizar threads em seus processos. Exemplo de uma thread simples:


/**
*
* @author João Paulo Eiti Kimura Classe que estende uma tread simples
*/
public class SimpleThread extends Thread {

public SimpleThread(String str) {
super(str);
}

public void run() {

// qualquer processamento ...

// faz a thread dormir um número aleatório em (ms)
long sleepTime = (long) (Math.random() * 1000);
System.out.println(getName() + " sleeping for " + sleepTime + " ms");

try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished: " + getName()); // finaliza a execuçao
}
}


No exemplo da classe SimpleThread, pode-se verificar que a classe herda características da classe Thread do java. Seu construtor default chama o construtor da classe mãe (Thread), no qual o parâmetro passado representa o nome da thread. O método principal da thread é o run, é nele que todo processamento é realizado. Com fins ilustrativos, o método run desse exemplo apenas aguarda um tempo em milissegundos.


Vejamos como executar a classe SimpleThread:

public class ExemploThread {

public static void main(String[] args) {

SimpleThread t1 = new SimpleThread("Thread 1");
SimpleThread t2 = new SimpleThread("Thread 2");
SimpleThread t3 = new SimpleThread("Thread 3");

t1.start();
t2.start();
t3.start();
}
}


Na classe ExamploThread, foram instanciados 3 objetos das classe SimpleThread. Para iniciar a execução da thread, fez-se a chamada ao método start() de cada objeto. Esse método executa o método run implementado na thread.
Resultado da execução da classe ExemploThread:


Thread 1 sleeping for 546 ms
Thread 3 sleeping for 580 ms
Thread 2 sleeping for 854 ms
finished: Thread 1
finished: Thread 3
finished: Thread 2



Dessa forma é possível executar tarefas em paralelo ao processo principal de um programa. Entretando, se sua classe já tiver herdado alguma outra classe não será possível herdar a classe Thread, ou qualquer outra, devido a natureza da linguagem que permite a herdar as características de apenas 1 classe. Especificamente para solucionar esse caso, faz-se uso da implementação da interface Runnable.

A classe que implementar a interface Runnable irá implementar o método run. Vamos a um exemplo de implementação desta interface:


public class ThreadInterface extends MyClass implements Runnable {

public void run() {

// qualquer processamento ...

// faz a thread dormir um número aleatório em (ms)
long sleepTime = (long) (Math.random() * 1000);
System.out.println(Thread.currentThread().getName() + "Thread sleeping for " + sleepTime + " ms");

try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished: " + Thread.currentThread().getName()); // finaliza a execuçao
}
}


Um exemplo de chamada e execução da classe que implementa a interface Runnable:


public class ExemploThreadInterface {

public static void main(String[] args) {

new Thread(new ThreadInterface(), "Thread1").start();
new Thread(new ThreadInterface(), "Thread2").start();
new Thread(new ThreadInterface(), "Thread3").start();
}
}


Resultado da execução:


Thread1Thread sleeping for 569 ms
Thread3Thread sleeping for 821 ms
Thread2Thread sleeping for 795 ms
finished: Thread1
finished: Thread2
finished: Thread3



Com a classe Thread e a interface Runnable é possível criar facilmente threads simples em Java, de forma a executar tarefas na execução de qualquer processo da aplicação.

Download dos códigos fonte dos exemplos: thread_src.zip

quinta-feira, 15 de janeiro de 2009

JAVA: Trabalhando com Data/Hora

Tive a necessidade de comparar datas em JAVA, uma forma rápida e fácil de fazer isso é usando classe Calendar.

A Calendar é uma classe abstrata, com ela pode-se modificar uma data/hora em dias, minutos, meses e etc. Segue um exemplo de como comparar duas datas usando a classe Calendar do java:

CalendarExemplo1.java

1 import java.util.Calendar;
2 import java.util.Date;
3
4 public class CalendarExemplo1 {
5
6 public static void main(String[] args) {
7
8 Calendar data1 = Calendar.getInstance();
9 data1.add(Calendar.DAY_OF_MONTH, 2);
10
11 Calendar data2 = Calendar.getInstance();
12 data2.add(Calendar.HOUR, 1);
13
14 int result = data1.compareTo(data2);
15 String msg = "";
16
17 if (result == 0)
18 {
19 msg = "Data 1 é igual que Data 2";
20 }
21 else if (result > 0)
22 msg = "Data1 é maior que Data 2";
23 else
24 msg = "Data 1 é menor que Data 2";
25
26 System.out.println("Data/Hora Atual: " + new Date());
27 System.out.println("Data 1 : " + data1.getTime());
28 System.out.println("Data 2 : " + data2.getTime());
29 System.out.println(msg);
30 }
31 }


Resultado:

Data/Hora Atual: Tue Sep 23 14:14:06 GMT-03:00 2008
Data 1 : Thu Sep 25 14:14:06 GMT-03:00 2008
Data 2 : Tue Sep 23 15:14:06 GMT-03:00 2008
Data1 é maior que Data 2


Os métodos mais utilizados da Calendar para modificar os valores das datas são o add e o roll.
Com método add pode-se somar ou subtrair unidades de tempo das datas. Exemplo:

CalendarExample2.java

1 import java.util.Calendar;
2 import java.util.Date;
3
4 public class CalendarExemplo2 {
5
6 public static void main(String[] args) {
7
8 //atrasa em 1 horas e 30 minutos a hora atual
9 Calendar cal = Calendar.getInstance();
10 cal.add(Calendar.HOUR, -1);
11 cal.add(Calendar.MINUTE, -30);
12
13 //obtem a data e hora em milisegundos
14 long d1= cal.getTimeInMillis();
15 long d2= new Date().getTime();
16
17 //calcula a diferença enter as datas
18 long diff = (d2-d1);
19
20 //converte de ms para min. (1ms/1000)/60
21 long minute = (long)(diff*1e-3)/60;
22
23 System.out.print("Dif. temporal (min): " + minute);
24 }
25 }


Observe que nas linhas 10 e 11 eu estou atrasando o horário atual em 1 hora e 30 minutos. O calculo da diferença temporal é feito em milisegundos (linha 18) e depois convertido em minutos para a exibição (linha 21).

Resultado:

Dif. temporal (min): 90


O resultado mostra a diferença entre as duas datas em minutos foi de 90 minutos.

O método roll faz a chamada "rolagem" da unidade de tempo, sem alterar as demais unidades. Por exemplo, pode-se pedir para que seja rolado 10 meses a frente, isso é feito alterando-se somente a unidade mês, o ano e o dia vão continuar os mesmos. Exemplo:

CalendarExample3.java


1 import java.util.Calendar;
2
3 public class CalendarExemplo3 {
4
5 public static void main(String[] args) {
6
7 Calendar cal = Calendar.getInstance();
8 System.out.println(cal.getTime());
9
10 //"rolagem" do mês em 5 unidades
11 cal.roll(Calendar.MONTH, 5);
12 System.out.print(cal.getTime());
13 }
14 }


Resultado:

Tue Sep 23 14:16:08 GMT-03:00 2008
Sat Feb 23 14:16:08 GMT-03:00 2008


A rolagem da unidade de tempo mês é feita na linha 11 do programa CalendarExample3.java. Perceba no resultado que a data iniciou no mês de setembro, contou-se 5 meses a frente, a data final foi para o mês de fevereiro, sem que o ano se modificasse.

Com a classe Calendar é possível fazer a diferenças entre datas e horas de forma fácil e intuitiva, bastando apenas indicar a unidade de tempo e o quando será adicionado ou retirado.

Download dos códigos fonte: calendar_src.zip

Para mais detalhes sobre as demais funcionalidades da classe Calendar, consulte o java doc no endereço: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html

quarta-feira, 7 de janeiro de 2009

Converter arquivos .UIF para ISO no Linux

O .UIF é um formato proprietário utilizado para gerar imagens de CD e DVD. MagicISO é um software proprietário que lê e converte esse tipo de arquivo em sistemas Windows. Entretanto, para o linux encontrei um utilitário que converte as imagens de .iuf para .iso, é o uif2iso.

A ferramenta pode ser baixada do seguinte endereço:
http://aluigi.altervista.org/mytoolz/uif2iso.zip

O programa tem a dependência dos pacotes: zlib e OpenSSL. Para instalar as dependências digite no console:

apt-get install zlib1g zlib1g-dev libssl-dev


Descompacte o arquivo uif2iso.zip e entre no diretório src. Para compilar e instalar:

cd uif2iso/src
make
sudo make install


Pronto, agora com a ferramenta instalada é possível converter o arquivo de imagem uif para iso usando:

# uif2iso imagem.uif imagem.iso


Referência:
http://aluigi.altervista.org/mytoolz/