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

sexta-feira, 5 de setembro de 2008

A bandeira brasileira com legenda (Meet the World)

A versão da bandeira Brasileira abaixo foi uma criação de um jornal Português que lançou uma série chamada “Meet the world” em 2004. Nessa série eles usaram as cores das bandeiras de diversos países para fazer uma crítica relacionada aos problemas políticos e sociais de cada um deles. A campanha publicitária é muito interessante. Vale a pena para uma reflexão!


Fonte: www.englishexperts.com.br

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