terça-feira, 2 de dezembro de 2008

Exemplo Xlet

public class ExemploXlet implements Xlet, KeyListener {
private XletContext context;
private HScene scene;
private HStaticText label1, label2;
public ExemploXlet() { }
public void initXlet(XletContext xletContext)
throws XletStateChangeException {
this.context = xletContext;
}
public void startXlet()
throws XletStateChangeException {
HSceneFactory hsceneFactory = HSceneFactory.getInstance();
scene = hsceneFactory.getFullScreenScene(HScreen.getDefaultHScreen().
getDefaultHGraphicsDevice());
scene.setSize(640, 480);
scene.setLayout(null);
scene.addKeyListener(this);
label1 = new HStaticText("Al\u00F4 MundoJava!", 35, 45, 660, 50,
new Font("Tiresias", 1, 36),
Color.red, Color.white,
new HDefaultTextLayoutManager());
label2 = new HStaticText("Controle Remoto", 100, 135, 500, 30,
new Font("Tiresias", 1, 36),
Color.red, Color.white,
new HDefaultTextLayoutManager());
scene.add(label1);
scene.add(label2);
scene.setVisible(true);
scene.requestFocus();
}
public void pauseXlet() { }
public void destroyXlet(boolean unconditional)
throws XletStateChangeException {
if (scene!=null) {
scene.setVisible(false);
scene.removeAll();
scene = null;
}
context.notifyDestroyed();
}
/* Método de java.awt.event.KeyListener */
public void keyTyped(KeyEvent keyevent) { }
/* Método de java.awt.event.KeyListener */
public void keyReleased(KeyEvent keyevent) {}
/* Método de java.awt.event.KeyListener */
public void keyPressed(KeyEvent e) {
String mensagem = "";
int codigo = e.getKeyCode();
switch (codigo) {
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
mensagem += "Bot\u00E3o num\u00E9rico: "+(codigo-48);
break;
case 403:
mensagem += "Bot\u00E3o Vermelho";
break;
case 404:
mensagem += "Bot\u00E3o Verde";
break;
case 405:
mensagem += "Bot\u00E3o Amarelo";
break;
case 406:
mensagem += "Bot\u00E3o Azul";
break;
case 27:
mensagem += "Bot\u00E3o EXIT";
break;
case 10:
mensagem += "Bot\u00E3o OK";
break;
case 151:
mensagem += "Bot\u00E3o Asterisco (*)";
break;
case 520:
mensagem += "Bot\u00E3o grade (#)";
break;
case 38:
mensagem += "Seta para cima";
break;
case 40:
mensagem += "Seta para baixo";
break;
case 37:
mensagem += "Seta para esquerda";
break;
case 39:
mensagem += "Seta para direita";
break;
default:
mensagem += "Al\u00F4 MundoJava!";
}
label2 = new HStaticText(mensagem, 100, 135, 500, 30,
new Font("Tiresias", 1, 36),
Color.blue, Color.white,
new HDefaultTextLayoutManager());
scene.removeAll();
scene.add(label1);
scene.add(label2);
label2.repaint();
scene.repaint();
}
}


// Retirado da revista MundoJava
// www.mundojava.com.br

sábado, 29 de novembro de 2008

Controle de Vendas e Estoque

Vendas&EstoqueDL (Freeware)

Este é um programa para controle de vendas e estoque em um estabelecimento comercial. É feito em Java e todo o código está dísponível. O programa está em desenvolvimento e novas funcionalidades estão sendo criadas. O código é facilmente adaptável à outras aplicações, para importar o código use Ecliple IDE 3.2 ou posterior.

Download:
https://sourceforge.net/projects/vendasestoquedl

terça-feira, 25 de novembro de 2008

Exemplo gráfico de pizza no JFreeChart

//Requirido a API do JFreeChart

import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

public class ChartFrame extends JFrame
{
private static final long serialVersionUID = 1L;
private DefaultPieDataset dataset;
private JFreeChart jfc;
public ChartFrame()

{
dataset = new DefaultPieDataset();
}

public void setValue(String title, Double numDouble)
{
dataset.setValue(title, numDouble);
}

public void setChar(String title)
{

jfc = ChartFactory.createPieChart(title, dataset, true, true, false);
PiePlot pp = (PiePlot) jfc.getPlot();
pp.setSectionOutlinesVisible(false);
pp.setLabelFont(new Font("SansSerif", Font.PLAIN, 12));
pp.setNoDataMessage("Nessun Dato Inserito");
pp.setCircular(false);
pp.setLabelGap(0.02);
}

private JPanel createPanel()
{
return new ChartPanel(jfc);
}

public void Show()
{
setContentPane(createPanel());
setVisible(true);
}

public static void main(String[] args)
{
ChartFrame j = new ChartFrame();
j.setTitle("Example Chart...");
j.setSize(640, 430);
j.setValue("UNO", new Double(20.0));
j.setValue("DUE", new Double(10.0));
j.setValue("TRE", new Double(20.0));
j.setValue("QUATTRO", new Double(30.0));
j.setValue("CINQUE", new Double(20.0));
j.setChar("Example Chart...");
j.Show();
}

}

Instalando e configurando o Archiva no Tomcat

Primeiramente você terá que fazer o download do Apache Tomcat e do Archiva e do Java. A versões usadas nesse tutorial foram:
- Java 1.6;
- Tomcat 5.27;
- Archiva 1.2-M1.

Faça o download do War e do Standalone do Archiva pois iremos precisar dos dois.
- Java: http://java.sun.com/javase/downloads/index.jsp
- Tomcat: http://tomcat.apache.org/download-55.cgi
- Archiva: http://archiva.apache.org/download.html

Agora vamos as instalações:
• Instale o Java em sua máquina e crie uma variável de ambiente chamada JAVA_HOME, e aponte ela para o local que foi instalado o Java;
• Depois descompacte o Tomcat no C:\ da sua máquina e crie uma variável de ambiente chamada CATALINA_HOME, e aponte para o local que você descompactou o Tomcat;
• Agora crie uma pasta chamada ‘archiva’ dentro do Tomcat, no mesmo nível que as pastas bin, conf, logs e outras;
• Copie o arquivo War do Archiva para dentro desta pasta que você acabou de criar;
• Crie um arquivo chamado ‘archiva.xml’ e coloque dentro da pasta
tomcat_home/conf/Catalina/localhost/ com o seguinte conteúdo:

link para o contéudo

Observação: Na tag Resource, a propriedade url é o caminho do banco de dados que o Archiva irá usar. Você pode definir qualquer caminho.

• Agora descompacte o Archiva Standalone que você baixou. Acesse a pasta descompactada e abra a pasta lib. Dentro desta pasta copie esses 3 arquivos:
- derby-10.1.3.1.jar (or later);
- activation-1.1.jar;
- mail-1.4.jar.
Abra a pasta tomcat_home\common\lib e cole esses 3 arquivos.

• Agora crie mais uma variável de ambiente chamada CATALINA_OPTS com o seguinte valor:
CATALINA_OPTS="-Dappserver.home=$CATALINA_HOME -Dappserver.base=$CATALINA_HOME"


Pronto! Agora é só acessar http://localhost:8080/archiva e começar a usar. A primeira página que o Archiva irá lhe mostrar será uma página pedindo para você cadastrar um Administrador.

Configurando o Maven com o Archiva

Para usar o Archiva como repositório para o Maven você precisa criar um arquivo chamado settings.xml e colocar dentro da pasta user_home/.m2. O conteúdo desse arquivo será:

link para conteúdo

Para que você consiga fazer o deploy de sua aplicação você precisa inserir o seguinte código no seu pom.xml:

link para conteúdo

Agora é só usar!

Tutorial elaborado por Rodrigo Luís de Faria.
Email: rodrigolfsi@gmail.com

domingo, 16 de novembro de 2008

Criptografia Base64 em Lua

--implementacao de criptografia Base64 em linguagem Lua.

local bin = { }

function bin.imod(a, b)
return a - math.floor(a / b) * b
end

function bin.rshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a / (2 ^ b))
end

function bin.lshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a * (2 ^ b))
end

function bin.band(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) and (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) or (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bxor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1 ~= b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bnot(a)
local i, v, r, b

if (a < 0) then
a = 4294967296 + a
end

a = bin.imod(a, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b = a >= v

if (b) then
a = a - v
else
r = r + v
end
end

return r
end

local cb64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

b64 = {}

local function istr(p)
return string.sub(cb64, p + 1, p + 1)
end

function b64.encodeblock(in_tab, len)
local s1, s2, s3, s4

in_tab[0] = in_tab[1] or 0
in_tab[1] = in_tab[2] or 0
in_tab[2] = in_tab[3] or 0

s1 = istr(bin.rshift(in_tab[0], 2))
s2 = istr(bin.bor(bin.lshift(bin.band(in_tab[0], 3), 4), bin.rshift(bin.band(in_tab[1], 240), 4)))
s3 = (len > 1 and istr(bin.bor(bin.lshift(bin.band(in_tab[1], 15), 2), bin.rshift(bin.band(in_tab[2], 192), 6))) or "=")
s4 = (len > 2 and istr( bin.band(in_tab[2], 63)) or "=")

return s1..s2..s3..s4
end

function b64.encode(stream, stream_size)
local encoded = ""
local e_block
local in_tab, len, i, s_pos

s_pos = 0

while stream_size > 0 do
in_tab = {}

len = stream_size >= 3 and 3 or stream_size

for i = 1, len do
in_tab[i] = stream[s_pos + i]
end

e_block = b64.encodeblock(in_tab, len)

encoded = encoded .. e_block

s_pos = s_pos + 3
stream_size = stream_size - 3
end

return encoded
end

local function stri(s)
return s == "=" and -1 or (string.find(cb64, s) - 1)
end

function b64.decodeblock(s1, s2, s3, s4)
local b1, b2, b3, len

len = s3 == "=" and 1 or s4 == "=" and 2 or 3

s3 = s3 == "=" and "A" or s3
s4 = s4 == "=" and "A" or s4

s1 = stri(s1)
s2 = stri(s2)
s3 = stri(s3)
s4 = stri(s4)

b1 = bin.bor(bin.lshift(s1, 2), bin.rshift(s2, 4))
b2 = bin.bor(bin.band(bin.lshift(s2, 4), 255), bin.rshift(s3, 2))
b3 = bin.bor(bin.band(bin.lshift(s3, 6), 240), s4)

return {b1, b2, b3}, len
end

function b64.decode(str_in)
local s_len = string.len(str_in) / 4
local out, len, i, j, t_out, s1, s2, s3, s4, t_len = {}, 0

for i = 1, s_len do
s1 = string.sub(str_in, i * 4 - 3, i * 4 - 3)
s2 = string.sub(str_in, i * 4 - 2, i * 4 - 2)
s3 = string.sub(str_in, i * 4 - 1, i * 4 - 1)
s4 = string.sub(str_in, i * 4 - 0, i * 4 - 0)
t_out, t_len = b64.decodeblock(s1, s2, s3, s4)

for j = 1, t_len do
out[i * 3 - 3 + j] = t_out[j]
end

len = len + t_len
end

return out, len
end



b64_test_in = {
48, 49, 50, 51, 52, 53, 54, 55, 56, 57
}

b64_test_enc = "MDEyMzQ1Njc4OQ=="

function test_b64()
local enc, dec, i, len

enc = b64.encode(b64_test_in, 10)
assert(enc == b64_test_enc)
dec, len = b64.decode(enc)
assert(len == 10)
for i = 1, len do
assert(b64_test_in[i] == dec[i])
end
end

test_b64()
print(b64.encode(b64_test_in, 10))

terça-feira, 4 de novembro de 2008

Pesquisa por ano e mês em sql

Em uma tabela com um campo do tipo date, para fazer uma consulta apenas por mês ou apenas por ano é comum se utilizar as funções MONTH e YEAR:

select * from tabela where MONTH(campo)=2;

select * from tabela where YEAR(campo)=2008;

Porém este tipo de pesquisa sempre gera um TABLE SCAN (uma varredura em toda a tabela), ignorando os índices que por ventura existam e retardando em muito o tempo de resposta.

Uma maneira de fazer a mesma coisa e de forma mais eficiente segue abaixo:

WHERE campo BETWEEN '2008-01-01' AND '2008-01-31'

WHERE campo BETWEEN '2008-01-01' AND '2008-12-31'

segunda-feira, 3 de novembro de 2008

Criptografia MD5 em Lua

-- Código em Lua para criptografia MD5

local bin = { }

function bin.imod(a, b)
return a - math.floor(a / b) * b
end

function bin.rshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a / (2 ^ b))
end

function bin.lshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a * (2 ^ b))
end

function bin.band(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) and (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) or (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bxor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1 ~= b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bnot(a)
local i, v, r, b

if (a < 0) then
a = 4294967296 + a
end

a = bin.imod(a, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b = a >= v

if (b) then
a = a - v
else
r = r + v
end
end

return r
end

local X
local md5={ff=tonumber('ffffffff',16),consts={}}

string.gsub([[
d76aa478 e8c7b756 242070db c1bdceee
f57c0faf 4787c62a a8304613 fd469501
698098d8 8b44f7af ffff5bb1 895cd7be
6b901122 fd987193 a679438e 49b40821
f61e2562 c040b340 265e5a51 e9b6c7aa
d62f105d 02441453 d8a1e681 e7d3fbc8
21e1cde6 c33707d6 f4d50d87 455a14ed
a9e3e905 fcefa3f8 676f02d9 8d2a4c8a
fffa3942 8771f681 6d9d6122 fde5380c
a4beea44 4bdecfa9 f6bb4b60 bebfbc70
289b7ec6 eaa127fa d4ef3085 04881d05
d9d4d039 e6db99e5 1fa27cf8 c4ac5665
f4292244 432aff97 ab9423a7 fc93a039
655b59c3 8f0ccc92 ffeff47d 85845dd1
6fa87e4f fe2ce6e0 a3014314 4e0811a1
f7537e82 bd3af235 2ad7d2bb eb86d391
67452301 efcdab89 98badcfe 10325476 ]],
'(%w+)', function (s) table.insert(md5.consts,tonumber(s,16)) end)

function md5.transform(A,B,C,D)
local f=function (x,y,z) return bin.bor(bin.band(x,y),bin.band(-x-1,z)) end
local g=function (x,y,z) return bin.bor(bin.band(x,z),bin.band(y,-z-1)) end
local h=function (x,y,z) return bin.bxor(x,bin.bxor(y,z)) end
local i=function (x,y,z) return bin.bxor(y,bin.bor(x,-z-1)) end
local z=function (f,a,b,c,d,x,s,ac)
a=bin.band(a+f(b,c,d)+x+ac,md5.ff)
-- be *very* careful that left shift does not cause rounding!
return bin.bor(bin.lshift(bin.band(a,bin.rshift(md5.ff,s)),s),bin.rshift(a,32-s))+b
end
local a,b,c,d=A,B,C,D
local t=md5.consts

a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
d=z(f,d,a,b,c,X[ 1],12,t[ 2])
c=z(f,c,d,a,b,X[ 2],17,t[ 3])
b=z(f,b,c,d,a,X[ 3],22,t[ 4])
a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
d=z(f,d,a,b,c,X[ 5],12,t[ 6])
c=z(f,c,d,a,b,X[ 6],17,t[ 7])
b=z(f,b,c,d,a,X[ 7],22,t[ 8])
a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
d=z(f,d,a,b,c,X[ 9],12,t[10])
c=z(f,c,d,a,b,X[10],17,t[11])
b=z(f,b,c,d,a,X[11],22,t[12])
a=z(f,a,b,c,d,X[12], 7,t[13])
d=z(f,d,a,b,c,X[13],12,t[14])
c=z(f,c,d,a,b,X[14],17,t[15])
b=z(f,b,c,d,a,X[15],22,t[16])

a=z(g,a,b,c,d,X[ 1], 5,t[17])
d=z(g,d,a,b,c,X[ 6], 9,t[18])
c=z(g,c,d,a,b,X[11],14,t[19])
b=z(g,b,c,d,a,X[ 0],20,t[20])
a=z(g,a,b,c,d,X[ 5], 5,t[21])
d=z(g,d,a,b,c,X[10], 9,t[22])
c=z(g,c,d,a,b,X[15],14,t[23])
b=z(g,b,c,d,a,X[ 4],20,t[24])
a=z(g,a,b,c,d,X[ 9], 5,t[25])
d=z(g,d,a,b,c,X[14], 9,t[26])
c=z(g,c,d,a,b,X[ 3],14,t[27])
b=z(g,b,c,d,a,X[ 8],20,t[28])
a=z(g,a,b,c,d,X[13], 5,t[29])
d=z(g,d,a,b,c,X[ 2], 9,t[30])
c=z(g,c,d,a,b,X[ 7],14,t[31])
b=z(g,b,c,d,a,X[12],20,t[32])

a=z(h,a,b,c,d,X[ 5], 4,t[33])
d=z(h,d,a,b,c,X[ 8],11,t[34])
c=z(h,c,d,a,b,X[11],16,t[35])
b=z(h,b,c,d,a,X[14],23,t[36])
a=z(h,a,b,c,d,X[ 1], 4,t[37])
d=z(h,d,a,b,c,X[ 4],11,t[38])
c=z(h,c,d,a,b,X[ 7],16,t[39])
b=z(h,b,c,d,a,X[10],23,t[40])
a=z(h,a,b,c,d,X[13], 4,t[41])
d=z(h,d,a,b,c,X[ 0],11,t[42])
c=z(h,c,d,a,b,X[ 3],16,t[43])
b=z(h,b,c,d,a,X[ 6],23,t[44])
a=z(h,a,b,c,d,X[ 9], 4,t[45])
d=z(h,d,a,b,c,X[12],11,t[46])
c=z(h,c,d,a,b,X[15],16,t[47])
b=z(h,b,c,d,a,X[ 2],23,t[48])

a=z(i,a,b,c,d,X[ 0], 6,t[49])
d=z(i,d,a,b,c,X[ 7],10,t[50])
c=z(i,c,d,a,b,X[14],15,t[51])
b=z(i,b,c,d,a,X[ 5],21,t[52])
a=z(i,a,b,c,d,X[12], 6,t[53])
d=z(i,d,a,b,c,X[ 3],10,t[54])
c=z(i,c,d,a,b,X[10],15,t[55])
b=z(i,b,c,d,a,X[ 1],21,t[56])
a=z(i,a,b,c,d,X[ 8], 6,t[57])
d=z(i,d,a,b,c,X[15],10,t[58])
c=z(i,c,d,a,b,X[ 6],15,t[59])
b=z(i,b,c,d,a,X[13],21,t[60])
a=z(i,a,b,c,d,X[ 4], 6,t[61])
d=z(i,d,a,b,c,X[11],10,t[62])
c=z(i,c,d,a,b,X[ 2],15,t[63])
b=z(i,b,c,d,a,X[ 9],21,t[64])

return A+a,B+b,C+c,D+d
end

function md5.Calc(s)
local msgLen=string.len(s)
local padLen=56-bin.imod(msgLen,64)
if bin.imod(msgLen,64)>56 then padLen=padLen+64 end
if padLen==0 then padLen=64 end
s=s..string.char(128)..string.rep(string.char(0),padLen-1)
s=s..leIstr(8*msgLen)..leIstr(0)
assert(bin.imod(string.len(s),64)==0)
local t=md5.consts
local a,b,c,d=t[65],t[66],t[67],t[68]
for i=1,string.len(s),64 do
X=leStrCuts(string.sub(s,i,i+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
assert(table.getn(X)==16)
X[0]=table.remove(X,1) -- zero based!
a,b,c,d=md5.transform(a,b,c,d)
end
local swap=function (w) return beInt(leIstr(w)) end
return string.format("%08x%08x%08x%08x",swap(a),swap(b),swap(c),swap(d))
end

-- convert little-endian 32-bit int to a 4-char string
function leIstr(i)
local f=function (s) return string.char(bin.band(bin.rshift(i,s),255)) end
return f(0)..f(8)..f(16)..f(24)
end

-- convert raw string to big-endian int
function beInt(s)
local v=0
for i=1,string.len(s) do v=v*256+string.byte(s,i) end
return v
end
-- convert raw string to little-endian int
function leInt(s)
local v=0
for i=string.len(s),1,-1 do v=v*256+string.byte(s,i) end
return v
end
-- cut up a string in little-endian ints of given size
function leStrCuts(s,...)
local o,r=1,{}
for i=1,table.getn(arg) do
table.insert(r,leInt(string.sub(s,o,o+arg[i]-1)))
o=o+arg[i]
end
return r
end

function md5.dochecks()
s0='message digest'
s1='abcdefghijklmnopqrstuvwxyz'
s2='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
s3='1234567890123456789012345678901234567890'
..'1234567890123456789012345678901234567890'

assert(md5.Calc('')=='d41d8cd98f00b204e9800998ecf8427e')
assert(md5.Calc('a')=='0cc175b9c0f1b6a831c399e269772661')
assert(md5.Calc('abc')=='900150983cd24fb0d6963f7d28e17f72')
assert(md5.Calc(s0)=='f96b697d7cb7938d525a2f31aaf161d0')
assert(md5.Calc(s1)=='c3fcd3d76192e4007dfb496cca67e13b')
assert(md5.Calc(s2)=='d174ab98d277d9f5a5611c2c9f419d9f')
assert(md5.Calc(s3)=='57edf4a22be3c955ac49da2e2107b67a')
end

--md5.dochecks()
--print(md5.Calc('abc')) --900150983cd24fb0d6963f7d28e17f72
--print(md5.Calc('luis')) --502ff82f7f1f8218dd41201fe4353687

sexta-feira, 24 de outubro de 2008

Formatos de imagens

Abaixo segue uma relação de informações sobre alguns formatos de imagens. Dos formatos apresentados abaixo o jpeg e o png talvez sejam os que apresentam as maiores vantagens, mas cada situação exige um formato que atende melhor as necessidades (tamanho, qualidade, etc).

JPEG

Seu nome vem do grupo que definiu o formato, Join Photographic Experts Group. Normalmente este tipo de arquivo tem a extensão jpg. O arquivo é comprimido e codificado com todas as cores, assim este formato é eficiente para fotografias e outras imagens que possuem muitas cores.

A desvantagem é que ele usa um tipo de compressão que provoca uma perda de qualidade a cada modificação do arquivo e regravação no disco. Isto é conhecido como lossy. Então, não use JPEG se você pretende editar o arquivo várias vezes. Esta perda de qualidade não acontece quando você apenas copia o arquivo de um lugar para o outro, só quando há alguma modificação a nível de edição do arquivo.

GIF

O GIF, Graphics Interchange Format, é um formato indexado. Isto significa que ele usa uma lista de cores em vez de codificar cada cor separadamente. Este formato é muito eficiente para imagens com poucas cores, como o logotipo de uma empresa com apenas cinco cores.

GIF pode representar no máximo 256 cores. Como 256 é igual a 2 elevado a 8, este tipo de imagem também é conhecido como 8-bit color. Normalemente as fotografias tem muito mais que 256 cores, assim salvar uma fotografica como GIF produzirá um arquivo com baixa qualidade. Apesar disso o arquivo GIF ficará muito maior que a versão JPEG da mesma imagem. Conclusão: não use GIF para fotos, apenas para ícones e logotipos.

O formato GIF oferece dois recursos úteis: transparência e animação. Com a transparência você pode criar um ícone cujo fundo é completamente transparente e isto é útil em páginas web ou em botões de interfaces gráficas. GIF não trabalha com transparência parcial; o pixel é completamente transparente ou completamente opaco.

O recurso da animação permite a criação de GIFs animados, que são muito usados em páginas web.

PNG

Pronunciado "ping", seu nome vem de PNG's Not Gif (PNG não é GIF), embora hoje em dia também usem Portable Network Graphics como significado da sigla. É um formato relativamente novo cuja intenção inicial era ser um substituto do GIF devido a problemas legais, normalmente de copyright do formato GIF.

PNG pode ser usado para imagens com muitas cores, como JPEG, ou com imagens indexadas, como GIF. Quando trabalhando com imagens com muitas cores ele não é tão eficiente quanto o JPEG; a versão PNG de uma imagem será bem maior que sua versão JPEG. Porém PNG não trabalha com lossy: se você editar um arquivo PNG e salvá-lo, a qualidade será a mesma. Isto torna o formato PNG ideal para guardar imagens com muitas cores que serão editadas posteriormente.

Imagens PNG indexadas com poucas cores, como ícones e logotipos, são tão boas ou até melhores que as versões GIF e podem suportar mais que 256 cores. A maioria dos navegadores suportam PNG, assim é seguro usar imagens PNG em suas páginas de internet. PNG suporta transparência, inclusive transparência parcial. Assim, você pode criar áreas translúcidas. Porém, alguns navegadores não suportam a transparência PNG, neste caso suas imagens podem não ser exibidas corretamente.

PNG não suporta animação. Existe um formato chamado MNG que adiciona animação a uma imagem PNG mas, ainda não é suportado por nenhum navegador. Para imagens animadas, GIF ainda é a melhor opção.

XCF

Este é o formato do GIMP (um eficiente progama para manipulação de imagens). Quando você estiver editando uma imagem com muitas camadas (layers) e configurações, este é o formato ideal a ser usado. Arquivos XCF são muito grandes e só podem ser lidos pelo GIMP. Você pode comprimir os arquivo usando o GZIP ou o BZIP2 (arquivo.xcf.gz ou arquivo.xcf.bz2) e o GIMP manipulará a compressão quando ler ou gravar o arquivo.

TIFF

A sigla vem de Tagged Image File Format e sua extensão pode ser .tif ou .tiff. Este é outro formato a ser usado com imagens de muitas cores. Ele também não trabalha com lossy. Como o PNG, este formato não produz arquivos tão pequenos mas, pode ser usado para guardar imagens que serão editadas futuramente. Não use este tipo de arquivo em páginas web, pois muitos navegadores podem não exibir corretamente. Apesar da semelhança com o formato PNG, o formato TIFF não possui um padrão único, mas sim diferentes padrões com diferentes interpretações. Isto significa que um arquivo TIFF escrito por um programa pode não ser lido em outro. Por isso é altemente recomendado o uso de PNG em vez de TIFF.

Uma vantagem do TIFF é que ele manipula um maior número de cores (16 bits para cada canal de cor). Isto é importante para alguns profissionais como designers e artistas gráficos.

RAW

Não necessariamente um formato, RAW é um termo que abrange todos os formatos usados por fabricantes de câmeras. O suporte a alguns destes formatos acontece através do uso de plug-ins; outros são mantidos "em segredo" pelos fabricantes. Neste último caso, sua única opção é usar algum programa para converter a imagem antes de editá-la.

BMP

Este é o formato de bitmap da Microsoft. Arquivos BMP são muito grandes e não apresentam nenhuma vantagem em comparação com os formatos PNG ou TIFF. Salve em BMP se realmente for necessário, como por exemplo ao criar um ícone para o Windows. Caso contrário é melhor escolher outro formato.

PCD

Este é o formato proprietário Photo CD da Kodac. Ele inclui muitas resoluções dentro de um arquivo e por isso os arquivos tendem a ser muito grandes. Existe plug-in para ler arquivos PCD, mas uma melhor opção é converter o arquivo PCD para outro formato.

PSD

Este é o formato proprietário Photoshop da Adobe. Ele salva camadas e outras informações da mesma maneira que o XCF faz no GIMP. Na verdade existem dois formatos PSD, a versão mais nova é um padrão fechado que não pode ser lido por qualquer outro programa além do próprio Photoshop.

ICO

Este é o formato para ícones do Windows. Ele pode conter várias resoluções num arquivo. Este formato é útil não só para ícones do Windows, mas também para criar favicons para seu site web. Este tipo de ícone é aquele mostrado à esquerda do endereço do seu site na barra de endereços do navegador ou à esquerda do nome do site quando este é adicionado aos favoritos. A exibição do favicon depende do navegador. Nem todos os exibem o favicon nas duas posições.

PDF e PostScript

Estes são formatos gráficos vetoriais e não rasterizados (que utilizam pixels) como os outros formatos abordados até agora. Em vez de representar a imagem como uma coleção de pixels, utilizam uma imagem vetorial, que é uma coleção de instruções de desenho envolvendo pontos, linhas e curvas. Se você planeja salvar sua imagem como PostScrip ou PDF é melhor usar um programa que edite imagens vetoriais.

SVG

A sigla vem de Scalable Vector Graphics. Este formato vem crescendo em popularidade na web.


Para manipulação de imagens recomento o GIMP (GNU Image Manipulation Program) que é um software livre, possui versões para windows e linux, e é compátivel com vários formatos de imagens.


quarta-feira, 22 de outubro de 2008

Desafio lógico matemático

Para quem gosta de desafio lógico-matemático:

Qual é o sexto número?

1, 2, 6, 42,1806, ___ ???

...

Resposta:

Tente resolver antes de continuar a ler esta resposta.

O resultado é a multiplicação do número anterior(1806) por ele mesmo mais 1 (1806+1), ou seja, 1806*1807=3263442.

terça-feira, 14 de outubro de 2008

Exemplo de programa em Lua

-- Classe(tabela) Pessoa com variaveis inicializadas.
local Pessoa = {nome = 'João', idade = 30, nacionalidade = 'brasileira'}

-- Construtor de Pessoa.
function Pessoa:new(pessoa)
pessoa = pessoa or {}
pessoa.nome = pessoa.nome or self.nome
pessoa.idade = pessoa.idade or self.idade
pessoa.nacionalidade = pessoa.nacionalidade or self.nacionalidade
setmetatable(pessoa, self) ; self.__index = self
return pessoa
end

-- Criando dois objetos de Pessoa usando o construtor,
-- o primeiro sem passagem de parametro para o construtor
-- e o segundo com passagem de parâmetros.
local cliente = Pessoa:new()

local fornecedor = Pessoa:new{nome = 'Luis', idade = 21}

-- Criando um objeto similar mas sem usar a classe.
local funcionario = {nome = 'Robert', nacionalidade = 'americana',
idade = 42, cargo = 'gerente',
filho = {
{nome = 'Fernando', idade = 18, nacionalidade = 'mexicana'},
{nome = 'Mônica', idade = 13, nacionalidade = 'japonesa'}
}
}

-- Criando um cachorro, nao e uma pessoa mas possui
-- alguns atributos iguais.
local cachorro = {dono = 'Fernando', nome = 'Rex', idade = '5',
nacionalidade = 'brasileira'}

-- Tabela sociedade vai armazenar todas as pessoas e o cachorro.
local sociedade = {fornecedor, funcionario, cliente, funcionario.filho[1],
funcionario.filho[2], cachorro}

-- Imprime dados dos objetos(tabelas) criados. Observe que
-- este metodo tambem e usado para apresentar as informacoes
-- do cachorro, que apesar de nao ser uma pessoa, possui
-- todos os atributos tratados neste metodo.
function showPessoa(pessoa)
print('--------------------------------------')
print('Nome: '..pessoa.nome)
print('Idade: '..pessoa.idade)
print('Nacionalidade: '..pessoa.nacionalidade)
end

function initialize() -- Varre a tabela sociedade.
for i=1, table.getn(sociedade), 1 do
showPessoa(sociedade[i])
end
end

initialize() -- Inicia a aplicação.

-- Lua e uma linguagem orientada a tabelas. Tabela e o termo
-- mais correto para os “objetos” criados nesta aplicação.
-- Todas as informacoes em uma tabela sao indexadas e
-- facilmente manipuladas.

segunda-feira, 22 de setembro de 2008

Convertendo String para Date em java

Exemplo que mostra como converter uma String para Date em java:

import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Data {

public static void main(String[] args) {
DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
Date data = null;
try {
data = new Date(fmt.parse("05/08/1987").getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(data);
}
}

quarta-feira, 10 de setembro de 2008

Concatenando Strings em Lua

Para concatenar Strings em Lua usamos o operador ..

Exemplo:

local string1 = 'Hello '
local string2 = 'World'
local stringConcatenada = string1..string2
print(stringConcatenada)

Pegando o tamanho de uma String em Lua

Para sabermos o tamanho de uma String em script Lua usamos o string.len(stringParametro) passando a String desejada como parâmetro e recebendo de retorno seu tamanho.

Exemplo:

local str = 'stringTeste'
local tamanho = string.len(str)
print(tamanho)

quinta-feira, 4 de setembro de 2008

Importando certificados SSL para a JVM

Ao se abrir uma conexão https (SSL) em uma aplicação desktop precisamos que a aplicação cliente reconheça o certificado SSL que a aplicação servidor está usando. Em uma aplicação web, é o próprio browser que importa o certificado. Mas quando não utilizamos o browser temos de trabalhar com a api java.security.cert ou então podemos importar estes certificados para a Java Virtual Machine (JVM) através da ferramenta keytool.
Importar os certificados para JVM é útil quando por exemplo queremos trabalhar com web services atráves de uma conexão segura, pois utilizar um web service não requer browser, mas uma conexão https requer que o certificado seja reconhecido.
A seguir deixo algumas informações sobre certificados, logo depois deixo as linhas de comando para se importar certificados para a JVM.

Certificados gerados pelo keytool (ferramenta que vem na JDK) ou OpenSSL são chamados de auto-assinados, ou seja não são assinados por uma "CA" (Certificate Authority), que são as empresas que emitem certificados "de verdade". Ou seja, não tem ninguem "garantindo" que este certificado é verdadeiro. O browser ao acessar um site seguro, recebe do servidor o certificado e verifica se o mesmo tem "garantia" de uma "CA". Caso não tenha esta "garantia" (assinatura da CA), o browser irá exibir a mensagem perguntando se você quer mesmo acessar este site. Se você disser que sim e ainda instalar este certificado no seu browser, as próximas vezes que você acessar o site ele irá considerar "com garantia". Não é possível bular este esquema. Somente comprando um certificado "de verdade" é que a mensagem não irá aparecer.

Lembrando que se optar por importar o certificado "auto-assinado", isto só irá valer para aquele computador e para o browser que está importando o certificado. Mesmo o certificado sendo auto-assinado, a conexão será criptografada, apenas não há garantia de que o site é confiável.

Certificados válidos para a JVM:

A JVM possui alguns certificados reconhecidos por ela, armazenados dentro do arquivo:

%JAVA_HOME%/jre/lib/security/cacerts

Utilizando esse comando tem como você verificar quais os certificados que ela considera válidos:

keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

A partir daí basta importar o seu certificado para dentro deste arquivo e colocar uma cópia dele dentro deste diretório. Para importar o certificado para este arquivo e auto assina-lo como confiável utilize este comando:

keytool -import -v -trustcacerts -file seu certificado -keystore cacerts -keypass changeit -storepass changeit

Pronto, seu certificado foi importado pela JVM.

mais informações

quarta-feira, 3 de setembro de 2008

Criptografia com Sha-1 ou Base64

Usando Sha-1 ou MD5, uma vez obtida a String criptografada não será possível reverter o processo (uso o termo criptografia embora este termo nao seja o mais correto para este caso). No caso de uma senha por exemplo, o que se faz é criptografar a entrada do usuário e comparar com a senha já criptografada no banco. De modo que nem mesmo pelo dado armazenado no banco se pode saber a senha do usuário, pois o que está armazenado no banco de dados é o resultado da criptografia da senha e não a senha.
Já com o Base64 é possível criptografar um dado e com a chave correta descriptografar o mesmo.
É comum utilizar algoritmos como o MD5 e o Sha-1 para a criptografia de senha, porque não convém deixar a própria senha armazenada em um banco. Já o Base64 é usado quando há a necessidade de se conhecer o dado criptografado, não apenas saber se é válido.
A seguir deixo duas classes, a primeira pode ser utilizada tanto com MD5 como com Sha-1, e a segunda classe utiliza o Base64.

Classe para MD5 e Sha-1:


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
*
* Essa classe pode ser usada tanto com o algoritmo MD5 como
* com o Sha-1. Uma vez criptografado um dado, nao sera possivel
* conhecer o valor original. Para saber se este dado corresponde
* a algum outro, voce deve comparar a string resultante da
* criptografia de ambos.
*
*/
public class CriptografiaMD5 {

private static MessageDigest md = null;

static {
try {
// Pode-se usar o algoritmo Sha-1 tambem,
// basta bustituir na linha abaixo.
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
}

private static char[] hexCodes(byte[] text) {
char[] hexOutput = new char[text.length * 2];
String hexString;
for (int i = 0; i < text.length; i++) {
hexString = "00" + Integer.toHexString(text[i]);
hexString.toUpperCase().getChars(hexString.length() - 2,
hexString.length(), hexOutput, i * 2);
}
return hexOutput;
}

public static String criptografar(String pwd) {
if (md != null) {
return new String(hexCodes(md.digest(pwd.getBytes())));
}
return null;
}


public static void main(String[] args){
String senha = "123456";
System.out.println(CriptografiaMD5.criptografar(senha));

senha = "132546";
System.out.println(CriptografiaMD5.criptografar(senha));
}
}


Classe para Base64:

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.KeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
*
* Essa classe usa Base64 e permite a descriptografia, usando-se a
* chave correta.
*
*/
public final class CriptografiaBase64 {
private static SecretKey skey;
private static KeySpec ks;
private static PBEParameterSpec ps;
private static final String algorithm = "PBEWithMD5AndDES";
private static BASE64Encoder enc = new BASE64Encoder();
private static BASE64Decoder dec = new BASE64Decoder();
static {
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);

ps = new PBEParameterSpec (new byte[]{3,1,4,1,5,9,2,6}, 20);

// Esta e a chave que voce quer manter secreta.
ks = new PBEKeySpec ("EAlGeEen3/m8/YkO".toCharArray());

skey = skf.generateSecret (ks);
} catch (java.security.NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (java.security.spec.InvalidKeySpecException ex) {
ex.printStackTrace();
}
}

public static final String encrypt(final String text)
throws
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException,
InvalidAlgorithmParameterException {

final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, skey, ps);
return enc.encode (cipher.doFinal(text.getBytes()));
}

public static final String decrypt(final String text)
throws
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException,
InvalidAlgorithmParameterException {

final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, skey, ps);
String ret = null;
try {
ret = new String(cipher.doFinal(dec.decodeBuffer (text)));
} catch (Exception ex) {
}
return ret;
}

public static void main(String[] args) throws Exception {
String password = "123456";
String encoded = CriptografiaBase64.encrypt (password);
System.out.println ("\nString: " + password);
System.out.println ("String criptografada: " + encoded);
System.out.println ("String descriptografada: " +
CriptografiaBase64.decrypt(encoded));

password = "123459";
encoded = CriptografiaBase64.encrypt (password);
System.out.println ("\nString: " + password);
System.out.println ("String criptografada: " + encoded);
System.out.println ("String descriptografada: " +
CriptografiaBase64.decrypt(encoded));
}
}

segunda-feira, 1 de setembro de 2008

Gerando um número aleatório (random) em java

Para gerar um número aleatório em java, usamos o random da biblioteca Math. A seguir segue um exemplo de chamada para este método que neste caso retornará um número aleatório entre 1 e n. Se você deseja um número aleatório entre 1 e 100, basta trocar o n por 100 na linha de código a seguir:

int i = 1 + (int)(Math.random() * n);

Usando XML para criar a GUI das aplicações java

Thinlet é uma ferramenta usada para criar o visual de suas aplicações java através de arquivos xml com uma estrutura simples, parecida com html. O thinlet tem um visual próprio, utiliza awt, e para você utilizar essa ferramenta, tudo o que precisará é de um jar de 38 Kb. Para maiores informações e download visite o site do thinlet, junto com thinlet virá exemplos onde você poderá entender o uso dessa ferramenta.

Esta é da Universidade de Cambridge

Só pssaoes epsertas cnsoeugem ler itso. Eu não cnogseui acreidatr que relmanet pidoa etndeer o que etvsaa lndeno. O pdoer fnemoeanl da mntee huamna, de aorcdo com uma psqueisa da Unvireisadde de Cmabrigde, não ipmrota a odrem em que as lteras em uma plavara etsão, a úcina cisoa ipmotratne é que a piremira e a útimla ltreas etseajm no lguar ctreo. O rseto pdoe etasr uma ttaol bnauguça e vcoê adnia pdoreá ler sem perolbmea. Itso pruqoe a mtene haunma não lê cdaa lreta idnvidailuemtne, mas a pvrlaaa cmoo um tdoo. Ipessrinaonte hien? É e eu smrepe pnenesi que slortaerr era ipmorantte! Se vcoê pdoe ler itso pssae aidntae !!

sexta-feira, 29 de agosto de 2008

Gerando um certificado SSL

Este tutorial demonstra como criar um certificado SSL (certificado de conexão segura) usando a ferramenta OpenSSL e como configurará-lo no Tomcat.

Requerido:
- Tomcat instalado
- OpenSSL instalado
(ao fim da página deixo os links)

Para gerar o certificado e configurar o Tomcat para rodar suas páginas através do protocolo https, siga as etapas abaixo (clique nas imagens para ver detalhes):

1 - Abra o prompt de comando e vá até a pasta bin que fica dentro do diretório de instalação do OpenSSL.

2 - Digite:

openssl req –config openssl.cnf –new –out <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.csr


3 - Digite uma senha de sua preferência e logo depois a confirme.

4 - Logo depois será requerida uma série de informações que serão inseridas no seu certificado. Veja a seguir um exemplo para essas entradas (estarão em inglês):

-País: BR
-Estado: Minas Gerais
-Cidade: Pouso Alegre
-Nome da Organização: Luis LTDA
-Nome da Unidade Organizacional: Software
-Common Name: l-u-i-s.blogspot.com (ele pede outra informação, mas aqui costuma-se colocar o domínio)
-Email: luis@reborn.com
-Challenge password: pass
-Nome opcional da empresa: Luis&Luis

5 - Digite:

openssl rsa -in privkey.pem -out <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.key

Ao pedir a senha, informe a senha que você criou no passo 3.

6 - Digite:

openssl x509 -in <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.csr -out <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.crt -req -signkey <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.key -days 730

Observe as informações apresentadas na tela.

Obs: 730 é a validade do certificado (730 dias).

7 - Digite:

openssl pkcs12 -export -in <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.crt -inkey <pasta_onde_sera_colocado_o_certificado>\nomeCertificado.key -out <pasta_onde_sera_colocado_o_certificado_invertendo_barra>/nomeCertificado.p12 -name seu.dominio.com –CAfile <pasta_onde_sera_colocado_o_certificado_invertendo_barra>/nomeCertificado.crt -caname seu.dominio.com –chain

Depois entre com a senha e a confirme.


Obs: Observe bem o espaçamento e as barras (em alguns pontos usa-se contra-barra em outros usa-se barra normal).

Pronto! O certificado foi gerado e está dentro da pasta que você definiu.

8 - Agora vamos configurar o Tomcat. Vá até TOMCAT_HOME\conf\server.xml e remova a tag do conector da porta 8080, remova todo o conteúdo do bloco (a tag segue abaixo, no arquivo ela está entre <>):

Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="true" redirectPort="8443"
acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"/

e adicione no mesmo local a seguinte a seguinte tag (
o trecho abaixo deve ser colocado entre <>):

Connector port="443" maxhttpheader maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" disableuploadtimeout="true" acceptcount="100" keystorefile="C:\pasta\nomeCertificado.p12" keystoretype="PKCS12" keystorepass="suaSenha" debug="0" scheme="https" secure="true" sslenabled="true" clientauth="false" sslprotocol="TLS"/

Não se esqueça de adicionar as informações de seu certificado dentro desta tag.

Pronto, o Tomcat está configurado para rodar pelo https.


9
- Digite o novo endereço de sua aplicação, lembrando que agora ele foi modificado. Por exemplo, se antes você acessava em http://localhost:8080/SuaApp , agora você acessa em https://localhost:443/SuaApp.

Agora ao acessar sua aplicação irá aparecer uma mensagem informando que você está iniciando uma conexão segura.



10
- Para instalar o certificado, ao aparecer a mensagem clique em View Certificate, depois em install certificate.


Pronto, o certificado foi criado, configurado no Tomcat e instalado.

Links:
site Tomcat
site OpenSSL

quarta-feira, 27 de agosto de 2008

Java - Diferença em dias entre duas datas

O método abaixo recebe duas datas no formato Date (java.util ou java.sql) e retorna a diferença em dias entre essas duas datas:


private long
getDateDifference(Date date1, Date date2) {
return ((date1.getTime()-date2.getTime())/86400000);
}

terça-feira, 19 de agosto de 2008

Configurando o autocompletar do eclipse

Estava utilizando o eclipse e de repente percebi que o autocompletar tinha perdido a funcionalidade. Procurei na internet e nada de achar uma solução. Então um amigo conseguiu solucionar o problema e resolvi postar a solução aqui.

1 - Para configurar o autocompletar vá em:
Window - Preferences

2 - Nessa janela selecione a opção:
Java - Editor - Advanced

3 - Marque os quatro primeiros checkboxes das duas áreas que aparecerão na tela (parte superior e inferior) e clique em OK.


A imagem acima mostra a área de configuração. Clique nela para ver detalhes.

Pronto, o autocompletar está funcionando!

segunda-feira, 11 de agosto de 2008

Mudando idioma do netbeans 6.1 para inglês

Para mudar o idioma do seu netbeans para inglês siga os seguintes passos:

1. Acessar o local onde está instalado o Netbeans. (Padrão--> C:\Arquivos de programas\NetBeans 6.1)

2. Abrir a pasta etc, localizada dentro do diretório acima.

3. Adicionar ao fim do documento netbeans.conf a seguinte linha:

netbeans_default_options="-J-Duser.language=en -J-Duser.country=US"

Pronto, seu netbeans está configurado com o idioma inglês.

segunda-feira, 4 de agosto de 2008

Tutorial - Web Services Com Java

Bem pessoal, quando fui tentar estudar web services por conta própria, de cara, encontrei um forum que me desanimou, dizendo que aprender web service sozinho era uma tarefa meio impossível. Estudei um tutorial com axis (framework da apache), e realmente vi que com aquela ferramenta ir ser difícil, pois para fazer um web service simples de cálculos matemáticos, levei horas.
Mas eu continuei procurando conteúdos e tutoriais, não podia ser tão difícil assim, afinal eu só precisava de um web service para uma consulta simples a um banco de dados. Então pude ver que a coisa era extremamente simples, encontrei o que eu queria.
O jdk 6 já vem com uma api para web services, chamada JAX-WS. Usei essa api no eclipse, e não foi necessário nem servidor de aplicação para testar o web service. Utilizá-la no netbeans é ainda mais simples, você cria seu web service no "clica e arrasta".
Ainda no netbeans, você pode criar web services, sem ficar perdendo muito tempo em arquivos de configuração e comandos via prompt, utilizando o RESTful, que é uma tecnologia que não usa o SOAP.

A seguir coloquei as etapas resumidas para criação de web services usando JAX-WS:

Requerido:
- JDK 6 instalado.

Etapas:
1 – Com o java 6, para criar um web service deve-se usar as anotações @WebService e @WebMethod na sua classe, pois o jdk 6 já vem com a tecnologia jax-ws implementada. Crie a seguinte classe exemplo:

@WebService
public class HelloWeb {

@WebMethod
public String hello(String nome) {
return "Hello " + nome;
}
}

2 – Você deve utilizar a ferramente apt (annotation processing tool) que encontra-se na pasta bin do jdk para gerar as classes do web service. Para isso, dentro do diretório src do seu projeto, use a seguinte linha de comando:

apt pacote\HelloWeb.java

Gera um pacote pacote.javaws com duas classes, uma classe Hello.java para os parâmetros do WebService (no nosso caso String nome do método hello) e outra HelloResponse.java que representa o retorno.

3 - Para publicar o serviço/endpoint e iniciá-lo, use a classe seguinte:

public class PublicaService {

public static void main(String[] args){
HelloWeb service = new HelloWeb();
Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", service);
}
}

Pronto, o WebService está rodando sem servidor de aplicação nem web container. Tudo isso com javaSE 6 jdk. Para acessar a wsdl dele, usa-se o URL:

http://localhost:8080/hello?wsdl

4 - Para criar o cliente do serviço, o javaSE 6 já vem com as ferramentas necessárias. Precisamos usar o wsimport (na pasta bin do jdk) para gerar as classes do cliente. Com o serviço rodando, fazemos na linha de comando (dentro da pasta src do projeto):

wsimport -keep -p pacote.cliente http://localhost:8080/hello?wsdl

A opção keep não apaga os arquivos fontes e p gera as classes dentro do pacote especificado.

5 - Para chamar o serviço pelas classes geradas, escreva a seguinte classe:

public class TesteServico {

public static void main(String[] args) {
pacote.cliente.HelloWeb port = new HelloWebService().getHelloWebPort();
System.out.println(port.hello("Luis"));
}
}

Repare que a classe HelloWeb que foi gerada pelo wsimport é uma interface, não confundir com o serviço HelloWeb que é uma implementação.

Pronto! Seu web service está funcionando.

Abaixo deixo links de outros tutoriais:

Web Services RESTful no netbeans
Tutorial Axis 1.3 (GUJ)

sábado, 2 de agosto de 2008

Tutorial - Programação para TV Digital

Muita gente interessada em começar a programar para tv digital me pergutava por onde começar, então resolvi elaborar este pequeno texto para nortear o caminho de quem está começando a estudar programação para tv digital.
Vou começar por alguns conceitos:

- Middleware: Middleware é uma camada de software posicionada entre o código das aplicações e a infra-estrutura de execução (plataforma de hardware e sistema operacional). Um middleware para aplicações de TV digital consiste de máquinas de execução das linguagens oferecidas, e bibliotecas de funções, que permitem o desenvolvimento rápido e fácil de aplicações.
- Ginga: Ginga é o nome do middleware do Sistema Brasileiro de Tv Digital Terrestre (SBTVD).
- javatv: Api da sun para programação java para tv.
- xletview: Ferramenta para simular aplicações em java para tv (projeto parado desde 2005).
- Lua: Linguagem de script criada pela PUC-Rio em 93, muito usada para jogos e para web, conhecida internacionalmente.
- Ginga-NCL: Linguagem declarativa também criado pela PUC-Rio, permite a criação de programas interativos para tv.
- Ginga-J: É a api java para programação na tv digital brasileira.
- Composer: Ambiente onde se pode criar aplicações utilizando NCL sem necessitar de um conhecimento prévio de programação.
- NCL-Emulator: Simulador para rodar suas aplicações NCL e NCLua.
- NCL-Eclipse: Plugin para você criar seus programas NCL no eclipse. (recomendo)

Por onde começar?

Comece pelos tutoriais, a seguir deixo uma relação de links onde você poderá encontrar material:

comunidade ginga
emulador xletview
linguagem Lua
tutorial NCL
tutorial Lua
clube ncl
api javatv da sun
exemplo de código java
tutorial instalação xletview

Espero que tenha sido útil.

sexta-feira, 1 de agosto de 2008

Pastebin - Poste seus códigos na internet

O pastebin - collaborative debugging tool - é um site muito útil, onde você pode postar seu código de programação e compartilhá-lo pela internet, o código ficará disposto de acordo com a sintaxe da linguagem usada, com cores identificando as palavras reservadas da linguagem. Despois de postar, você vai obter uma url onde ele ficará acessível.

Maiores informações no próprio site:

http://pastebin.com/

Developers Webdays 2008

Dias 22 e 23 de Agosto em São Paulo, com 100% de aproveitamento!

* Conheça as principais novidades das tecnologias Java e .NET
* Palestras sobre Boas práticas e Arquitetura
* Certificado de Participação
* 100% de aproveitamento - Apesar das palestras acontecerem simultaneamente, não haverá perda de conteúdo. No dia do evento você receberá um DVD com o conteúdo completo de todas as palestras em formato de vídeo-aula!

Principais Temas:

- Java: Ajax, Java FX, Grails, Android, Groovy, Jboss Seam, JSF, RIA (Flex, etc), Best practices em java;
- .NET: Linq, WPF, Silverlight 2.0, ASP.NET 3.5, Ajax, ASP.NET MVC, Visual Studio 2008, Novidades C# 3.0 e VB.NET 9.0, Best practices em .NET;
- Extras: SOA, WEB 2.0, WEB 3.0, Arquitetura Web, Scrum, Microsoft XNA, Ruby on Rails, Domain Driven Design, Mashups.

São 46 horas de conteúdo, apenas 300 lugares. Maiores informações:
www.devmedia.com.br/webdays2008
evento@devmedia.com.br