terça-feira, 16 de dezembro de 2008

Convertendo de long para String binária em java

// Para pegar a representação binária de um
// tipo long em java, use o código abaixo:

long x = "10"
String str = Long.toString(x, 2);
System.out.println(str);

// O mesmo código pode ser usado para inteiro.

quinta-feira, 4 de dezembro de 2008

Convertendo String Binária Para Inteiro em C#

// Abaixo metodo que pega um valor binario em
// uma string e devolve o inteiro correspondente.

// Exemplo:
// string str = "00001001";
// metodo retorna 9

public int ToDecimal(string bin)
{
long l = Convert.ToInt64(bin,2);
int i = (int)l;
return i;
}

segunda-feira, 1 de dezembro de 2008

Como funciona o SSL

Basicamente:

Digamos que uma mensagem é transmitida de A para B. Neste caso A usa a chave pública de B para criptografar a mensagem, tornando B a única pessoa que pode decodificar a mensagem, usando a sua chave privada. Nós não podemos entretanto ter certeza quanto a identidade de A.

Para resolver este problema utiliza-se os certificados digitais. O certificado é assinado usando a chave privada do emissor do certificado. Certificados são um meio padrão de ligar uma chave pública a um nome.

Por meio dessa tecnologia de certificado, todos podem examinar o certificado de A para ver se está sendo forjado. Assumindo que A tenha rígido controle sobre sua chave privada, e que seja realmente A quem obteve o certificado, então tudo está bem.


Referências:
www.gta.ufrj.br/grad/00_2/ssl/ssl.htm
publib.boulder.ibm.com/tividd/td/TRM/GC32-1323-00/pt_BR/HTML/admin231.htm

sábado, 29 de novembro de 2008

Software para Controle de Vendas e Estoque

Controle de Vendas & Estoque (Freeware em java)

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 de gráfico de barras com JFreeChart

//Requerido a Api JFreeChart

import java.awt.Dimension;
import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;


public class BarsGraphic extends JFrame{

public BarsGraphic(String title) {
super(title);
CategoryDataset dataset = BarsGraphic.createDataset();
JFreeChart chart = BarsGraphic.createBarChart(dataset);
ChartPanel panel = new ChartPanel(chart);
panel.setPreferredSize(new Dimension(400, 300));
setContentPane(panel);
}

private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(6, "Preto", "Corsa");
dataset.addValue(4, "Preto", "Fiesta");
dataset.addValue(3, "Preto", "Gol");
dataset.addValue(5, "Vermelho", "Corsa");
dataset.addValue(2, "Vermelho", "Fiesta");
dataset.addValue(3, "Vermelho", "Gol");
dataset.addValue(2, "Azul", "Corsa");
dataset.addValue(8, "Azul", "Fiesta");
dataset.addValue(1, "Azul", "Gol");
return dataset;
}

private static JFreeChart createBarChart(CategoryDataset dataset) {
JFreeChart chart = ChartFactory.createBarChart(
"Escolha de cor por veículo", //Titulo
"Veículo", // Eixo X
"Quantidade", //Eixo Y
dataset, // Dados para o grafico
PlotOrientation.VERTICAL, //Orientacao do grafico
true, false, false); // exibir: legendas, tooltips, url
return chart;
}

public static void main( String[] args ) {
BarsGraphic chart = new BarsGraphic("Teste Bar Chart");
chart.pack();
chart.setVisible(true);
}
}

// outra ferramenta mais leve pode ser encontrada em:
// http://www.java2s.com/Code/Java/Chart/CatalogChart.htm

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))

sexta-feira, 14 de novembro de 2008

Número de cartões de crédito para testes

Abaixo alguns número de cartões de crédito para testes em sistemas:

Credit Card Test Number
Visa 4111 1111 1111 1111
MasterCard 5500 0000 0000 0004
5424 0000 0000 0015
American Express 3782 8224 6310 005
3400 0000 0000 009
3700 0000 0000 002
Discover 6011 1111 1111 1117
6011 0000 0000 0004
6011 0000 0000 0012
Diner's Club / Carte Blanche 3000 0000 0000 04
en Route 2014 0000 0000 009
JCB 3088 0000 0000 0009
Special SendSafe Test Visa number 0111-1111-1111-1111

terça-feira, 11 de novembro de 2008

Instalando LuaSocket e LuaSQL

Para instalar o LuaSocket ou o LuaSQL no fedora,
abra uma conexão SSH como root e digite no console:

# yum install lua-sql
# yum install lua-socket

Depois confirme os pacotes e aguarde a instalação.

segunda-feira, 3 de novembro de 2008

Date para String em java

// Date para String em java.

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

Date today = new Date();

String stringDate = df.format(today);

System.out.println("Data em String: " + stringDate);

Criptografia MD5 em Lua

-- Implementação da 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

Convertendo java.util.Date para java.util.Calendar

Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date.getTime());

// Separando em dia, mês e ano.
int ano = calendar.get(Calendar.YEAR);
int mes = calendar.get(Calendar.MONTH)+1;
int dia = calendar.get(Calendar.DAY_OF_MONTH);

quarta-feira, 29 de outubro de 2008

Crivo de Eratóstenes em Lua

--O Crivo de Eratóstenes é um método simples de se achar
--os números primos em um intervalo de 1 a n.

--Ele consiste em montar uma tabela com os números que serão
--testados, e iterar do 2º ao n-ézimo elemento, invalidando
--todos os números da tabela que são divisíveis pelo contador
--da iteração (e que também são diferentes do contador).

--Abaixo segue uma implementação em linguagem Lua

-- Gera uma tabela contendo os números de 1 a n
function geraNumeros(n)
local arr = {}
for i = 1, n do
arr[i] = true
end
return arr
end

-- Deixa como true os índices primos
function filtraPrimos(arr)
local count = #arr
for c = 2, count do
if(arr[c]) then
for i = c + c, count, c do
arr[i] = false
end
end
end
return arr
end

local arr = geraNumeros(99999)

arr = filtraPrimos(arr)

-- Imprime os números primos de 1 a n
table.foreach(arr, function(i,v) if v then print(i) end end)

--FONTE: http://kknd.wordpress.com/

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 01

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

Qual é o sexto número?

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

a) 7886145
b) 194873
c) 1809
d) 3263442
e) 201349

...

Resposta:

Resolução 1:
Faz-se a multiplicação do número anterior(1806) por ele mesmo acrescido de um(1), ou seja: 1806* (1806+1). Resultado: 1806*1807 = 3263442, alternativa d.

Resolução 2:
Eleva-se o número ao quadrado e soma com ele mesmo: 1806*1806+1806. Resultado: 3263442, alternativa d.

sexta-feira, 10 de outubro de 2008

Tutorial Lua - Programa exemplo

-- 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);
}
}

sexta-feira, 12 de setembro de 2008

Validando cartão de crédito em java

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class CCUtils {
public static final int INVALID = -1;
public static final int VISA = 0;
public static final int MASTERCARD = 1;
public static final int AMERICAN_EXPRESS = 2;
public static final int EN_ROUTE = 3;
public static final int DINERS_CLUB = 4;

private static final String [] cardNames =
{ "Visa" ,
"Mastercard",
"American Express",
"En Route",
"Diner's CLub/Carte Blanche",
};

/**
* Valid a Credit Card number
*/
public static boolean validCC(String number)
throws Exception {
int CardID;
if ( (CardID = getCardID(number)) != -1)
return validCCNumber(number);
return false;
}

/**
* Get the Card type
* returns the credit card type
* INVALID = -1;
* VISA = 0;
* MASTERCARD = 1;
* AMERICAN_EXPRESS = 2;
* EN_ROUTE = 3;
* DINERS_CLUB = 4;
*/
public static int getCardID(String number) {
int valid = INVALID;

String digit1 = number.substring(0,1);
String digit2 = number.substring(0,2);
String digit3 = number.substring(0,3);
String digit4 = number.substring(0,4);

if (isNumber(number)) {
/* ----
** VISA prefix=4
** ---- length=13 or 16 (can be 15 too!?! maybe)
*/
if (digit1.equals("4")) {
if (number.length() == 13 || number.length() == 16)
valid = VISA;
}
/* ----------
** MASTERCARD prefix= 51 ... 55
** ---------- length= 16
*/
else if (digit2.compareTo("51")>=0 && digit2.compareTo("55")<=0) {
if (number.length() == 16)
valid = MASTERCARD;
}
/* ----
** AMEX prefix=34 or 37
** ---- length=15
*/
else if (digit2.equals("34") || digit2.equals("37")) {
if (number.length() == 15)
valid = AMERICAN_EXPRESS;
}
/* -----
** ENROU prefix=2014 or 2149
** ----- length=15
*/
else if (digit4.equals("2014") || digit4.equals("2149")) {
if (number.length() == 15)
valid = EN_ROUTE;
}
/* -----
** DCLUB prefix=300 ... 305 or 36 or 38
** ----- length=14
*/
else if (digit2.equals("36") || digit2.equals("38") ||
(digit3.compareTo("300")>=0 && digit3.compareTo("305")<=0)) {
if (number.length() == 14)
valid = DINERS_CLUB;
}
}
return valid;

/* ----
** DISCOVER card prefix = 60
** -------- lenght = 16
** left as an exercise ...
*/

}

public static boolean isNumber(String n) {
try {
double d = Double.valueOf(n).doubleValue();
return true;
}
catch (NumberFormatException e) {
e.printStackTrace();
return false;
}
}

public static String getCardName(int id) {
return (id > -1 && id < cardNames.length ? cardNames[id] : "");
}

public static boolean validCCNumber(String n) {
try {
/*
** known as the LUHN Formula (mod10)
*/
int j = n.length();

String [] s1 = new String[j];
for (int i=0; i < n.length(); i++) s1[i] = "" + n.charAt(i);

int checksum = 0;

for (int i=s1.length-1; i >= 0; i-= 2) {
int k = 0;

if (i > 0) {
k = Integer.valueOf(s1[i-1]).intValue() * 2;
if (k > 9) {
String s = "" + k;
k = Integer.valueOf(s.substring(0,1)).intValue() +
Integer.valueOf(s.substring(1)).intValue();
}
checksum += Integer.valueOf(s1[i]).intValue() + k;
}
else
checksum += Integer.valueOf(s1[0]).intValue();
}
return ((checksum % 10) == 0);
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}

/*
** For testing purpose
**
** java CCUtils [credit card number] or java CCUtils
**
*/
public static void main(String args[]) throws Exception {
String aCard = "";

if (args.length > 0)
aCard = args[0];
else {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("Card number : ");
aCard = input.readLine();
}
if (getCardID(aCard) > -1) {
System.out.println("This card is supported.");
System.out.println("This a " + getCardName(getCardID(aCard)));
System.out.println
("The card number " + aCard + " is "
+ (validCC(aCard)?" good.":" bad."));
}
else
System.out.println("This card is invalid or unsupported!");
}
}

quarta-feira, 10 de setembro de 2008

Operação de módulo

O módulo consiste no resto da divisão entre dois números.

Operadores de módulo em várias linguagens de programação
Linguagem Operador O resultado tem o sinal do
Ada mod Divisor
rem Dividendo
ASP Mod Indefinido
C (1989) % Indefinido
C (1999) % Dividendo
ColdFusion MOD Dividendo
Common Lisp mod Divisor
Eiffel \\ Dividendo
Fortran mod Dividendo
modulo Divisor
J |~ Divisor
Java % Dividendo
JavaScript
% Dividendo
Lua
%
Divisor
MATLAB mod Divisor
rem Dividendo
MySQL MOD
%
Dividendo
Objective Caml mod Indefinido
Pascal (Delphi) mod Dividendo
Perl % Indefinido
PHP % Dividendo
PL/I mod Divisor (ANSI PL/I)
Prolog (ISO 1995) mod Divisor
Python % Divisor
RPG %REM Dividendo
Ruby % Divisor
SenseTalk modulo Divisor
rem Dividendo
Verilog (2001) % Dividendo
VHDL mod Divisor
rem Dividendo
Visual Basic Mod Dividendo

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)

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)

terça-feira, 9 de setembro de 2008

A história do salário mínimo brasileiro

Encontrei essa tabela em uma página do portalbrasil e achei interessante e curiosa a história do nosso batalhado salário mínimo. Note as constantes mudanças que ocorreram desde os anos 40, as maiores foram em períodos de grande inflação.

VIGÊNCIA

FUNDAMENTO LEGAL

VALOR

04/07/40 DL 2.162/40 240 mil réis
01/01/43 DL 5.670/43 Cr$300,00
01/12/43 DL 5.977/43 Cr$380,00
01/01/52 D 30.342/51 Cr$1.200,00
04/07/54 D 35.450/54 Cr$2.400,00
01/08/56 D 39.604/56 Cr$3.800,00
01/01/59 D 45.106-A/58 Cr$6.000,00
18/10/60 D 49.119-A/60 Cr$9.600,00
16/10/61 D 51.336/61 Cr$13.440,00
01/01/63 D 51.631/62 Cr$21.000,00
24/02/64 D 53.578/64 Cr$42.000,00
01/02/65 D 55.803/65 CR$66.000,00
01/03/66 D 57.900/66 Cr$84.000,00
01/03/67 D 60.231/67 NCr$105,00
26/03/68 D 62.461/68 NCr$129,60
01/05/69 D 64.442/69 NCr$156,00
01/05/70 D 66.523/70 NCr$187.20
01/05/71 D 68.576/71 Cr$225,60
01/05/72 D 70.465/72 Cr$268,80
01/05/73 D 72.148/73 Cr$312,00
01/05/74 D 73.995/74 Cr$376,80
01/12/74 Lei 6.147/74 Cr$415,20
01/05/75 D 75.679/75 Cr$532,80
01/05/76 D 77.510/76 Cr$768,00
01/05/77 D 79.610/77 Cr$1.106,40
01/05/78 D 81.615/78 Cr$1.560,00
01/05/79 D 84.135/79 Cr$2.268,00
01/11/79 D 84.135/79 Cr$2.932,80
01/05/80 D 84.674/80 Cr$4.149,60
01/11/80 D 85.310/80 Cr$5.788,80
01/05/81 D 85.950/81 Cr$8.464,80
01/11/81 D 86.514/81 Cr$11.928,00
01/05/82 D 87.139/82 Cr$16.608,00
01/11/82 D 87.743/82 Cr$23.568,00
01/05/83 D 88.267/83 Cr$34.776,00
01/11/83 D 88.930/83 Cr$57.120,00
01/05/84 D 89.589/84 Cr$97.176,00
01/11/84 D 90.301/84 Cr$166.560,00
01/05/85 D 91.213/85 Cr$333.120,00
01/11/85 D 91.861/85 Cr$600.000,00
01/03/86 DL 2.284/86 Cz$804,00
01/01/87 Portaria 3.019/87 Cz$964,80
01/03/87 D 94.062/87 Czr1.368,00
01/05/87 Portaria 3.149/87 Cz$1.641,60
01/06/87 Portaria 3.175/87 Cz$1.969,92
10/08/87 DL 2.351/87 Cz$1.970,00
01/09/87 D 94.815/87 Cz$2.400,00
01/10/87 D 94.989/87 Cz$2.640,00
01/11/87 D 95.092/87 Cz$3.000,00
01/12/87 D 95.307/87 Cz$3.600,00
01/01/88 D 95.479/87 Cz$4.500,00
01/02/88 D 95.686/88 Cz$5.280,00
01/03/88 D 95.758/88 Cz$6.240,00
01/04/88 D 95.884/88 Cz$7.260,00
01/05/88 D 95.987/88 Cz$8.712,00
01/06/88 D 96.107/88 Cz$10.368,00
01/07/88 D 96.235/88 Cz$12.444,00
01/08/88 D 96.442/88 Cz$15.552,00
01/09/88 D 96.625/88 Cz$18.960,00
01/10/88 D 96.857/88 Cz$23.700,00
01/11/88 D 97.024/88 Cz$30.800,00
01/12/88 D 97.151/88 Cz$40.425,00
01/01/89 D 97.385/88 NCz$63,90
01/05/89 D 97.696/89 NCz$81,40
01/06/89 Lei 7.789/89 NCz$120,00
03/07/89 D 97.915/89 NCz$149,80
01/08/89 D 98.003/89 NCz$192,88
01/09/89 D 98.108/89 NCz$249,48
01/10/89 D 98.211/89 NCz$381,73
01/11/89 D 98.346/89 NCz$557,31
01/12/89 D 98.456/89 NCz$788,12
01/01/90 D 98.783/89 NCz$1.283,95
01/02/90 D 98.900/90 NCz$2.004,37
01/03/90 D 98.985/90 NCz$3.674,06
01/04/90 Portaria 191-A/90 Cr$3.674,06
01/05/90 Portaria 289/90 Cr$3.674,06
01/06/90 Portaria 308/90 Cr$3.857,66
01/07/90 Portaria 415/90 Cr$4.904,76
01/08/90 Portaria 429/90 e 3.557/90 Cr$5.203,46
01/09/90 Portaria 512/90 Cr$6.056,31
01/10/90 Portaria 561/90 Cr$6.425,14
01/11/90 Portaria 631/90 Cr$8.329,55
01/12/90 Portaria 729/90 Cr$8.836,82
01/01/91 Portaria 854/90 Cr$12.325,60
01/02/91 MP 295/91 (Lei 8.178/91) Cr$15.895,46
01/03/91 Lei 8.178/91 Cr$17.000,00
01/09/91 Lei 8.222/91 Cr$42.000,00
01/01/92 Lei 8.222/91 e Port. 42/92 - MEFP Cr$96.037,33
01/05/92 Lei 8.419/92 Cr$230.000,00
01/09/92 Lei 8.419/92 e Port. 601/92 - MEFP Cr$522.186,94
01/01/93 Lei 8.542/92 Cr$1.250.700,00
01/03/93 Port. Interministerial 04/93 Cr$1.709.400,00
01/05/93 Port. Interministerial 07/93 Cr$3.303.300,00
01/07/93 Port. Interministerial 11/93 Cr$4.639.800,00
01/08/93 Port. Interministerial 12/93 CR$5.534,00
01/09/93 Port. Interministerial 14/94 CR$9.606,00
01/10/93 Port. Interministerial 15/93 CR$12.024,00
01/11/93 Port. Interministerial 17/93 CR$15.021,00
01/12/93 Port. Interministerial 19/93 CR$18.760,00
01/01/94 Port. Interministerial 20/93 CR$32.882,00
01/02/94 Port. Interministerial 02/94 CR$42.829,00
01/03/94 Port. Interministerial 04/94 URV 64,79 = R$64,79
01/07/94 MP 566/94 R$64,79
01/09/94 MP 637/94 R$70,00
01/05/95 Lei 9.032/95 R$100,00
01/05/96
R$112,00
01/05/97
R$120,00
01/05/98
R$130,00
01/05/99
R$136,00
03/04/00

MP 2019 de 23/03/00 e 2019-1 de 20/04/00 Convertidas na Lei nº 9971, de 18/05/2000.

R$151,00
01/04/01
R$180,00
01/04/02 Medida Provisória n° 35
publicada no D.O.U. em 28.03.2002
R$ 200,00
01/04/03 Lei n° 10.699,
de 09.07.2003
-
Clique aqui -
R$ 240,00
01/05/04 Lei n° 10.888,
de 24.06.2004
-
Clique aqui -
R$ 260,00
01/05/05 Lei nº 11.164,
de
18.08.2005
-
Clique aqui -
R$ 300,00
01/04/2006 Lei nº 11.321,
de
07.07.2006
- Clique aqui -

Leia matéria aqui
R$ 350,00
01/04/2007 Lei nº 11.498,
de 28.06.2007
- Clique aqui -
R$ 380,00
01/03/2008 Medida Provisória nº 421/2008, de 29.02.2008
- Clique aqui -
R$ 415,00

fonte: www.portalbrasil.net