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