terça-feira, 2 de dezembro de 2008
Exemplo Xlet
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
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
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
- 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@gma
domingo, 16 de novembro de 2008
Criptografia Base64 em 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
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
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
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
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
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
Exemplo:
local string1 = 'Hello '
local string2 = 'World'
local stringConcatenada = string1..string2
print(stringConcatenada)
Pegando o tamanho de uma String em Lua
Exemplo:
local str = 'stringTeste'
local tamanho = string.len(str)
print(tamanho)
quinta-feira, 4 de setembro de 2008
Importando certificados SSL para a JVM
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.
quarta-feira, 3 de setembro de 2008
Criptografia com Sha-1 ou Base64
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
int i = 1 + (int)(Math.random() * n);
Usando XML para criar a GUI das aplicações java
Esta é da Universidade de Cambridge
sexta-feira, 29 de agosto de 2008
Gerando um certificado SSL
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.
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
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 (
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
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
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
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
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
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
Maiores informações no próprio site:
http://pastebin.com/
Developers Webdays 2008
* 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