miércoles, 2 de julio de 2008

Clasificación LIGA JAVACUP 2008

El torneo de la JavaCup 2008 fue todo un éxito.

Dejo el enlace de la clasificación de la Liga:
http://www.javahispano.org/forum/javacup/es/resultado_de_la_liga_/

El torneo con cruces lo ganó 1A con una táctica muy diferente a las de la JavaCup 2007.

Yo, con mi equipo Los Javatos quedé el #42 con 42 victorias de 79 partidos disputados. Creo que no está nada mal para ser el primer año que me presento.

A ver si en este verano me pongo las pilas y hago un mostruo del fútbol. Me encantaaaa!!!!!!!!

lunes, 2 de junio de 2008

Ingeniería del Software

URL recomendada: http://www.ingenierosoftware.com/

Algoritmos de encriptación en JAVA

Trabajando en estos temas en programación JAVA he tenido la necesidad de encriptar datos que no podían guardarse planamente en ninguna base de datos, como por ejemplo, passwords.

He trabajado con SHA-1 (irreversible) y DES (reversible con clave).

SHA-1 (Secure Hash Algorithm - 1)

Web: http://es.wikipedia.org/wiki/SHA

Muy útil para funciones de login y guardar los passwords de los usuarios encriptados.

Estas funciones hash tienen la particularidad de que son de una sola vía: a partir de un texto puedes obtener el código hash, pero no a la inversa (no es posible obtener el texto a partir del código hash).
Además, es virtualmente imposible conseguir dos textos que generen el mismo código hash.
Otra peculiaridad de este sistema es que los códigos hash generados no son texto plano, sino un conjunto arbitrario de bits, eso sí, de longitud fija.
El sistema sería el siguiente:



  1. En la base de datos guardas no las contraseñas, sino sus códigos MD5 o SHA1 traducidos a hexadecimal.

  2. Cuando quieres comprobar un par nombre de usuario - contraseña, obtienes el código MD5 o SHA1 de la contraseña, lo pasas a hexadecimal y lo comparas con el que tienes almacenado para ese nombre de usuario.

  3. Si coincide, hasta la cocina: la contraseña es correcta.

  4. Si no coincide, aire.


La llamada se hará de esta manera:

String encriptado = "";

encriptado = SHA1.encriptarHexadecimal("SILVANO");

y retornará encriptado = "37b418aea1bafd89ab9cdca29f2b3b0ba64b73e3";

Ésta sería la clase Java de SHA-1:






DES (DATA ENCRYPTION STANDARD)

Web: http://en.wikipedia.org/wiki/Data_Encryption_Standard


Este algoritmo es reversible mediante una clave, tanto para encriptar como para descencriptar.
Será útil para datos económicos, los cuales el usuario puede verlos (desencriptado mediante programa) si tiene acceso pero en base de datos se guardan encriptados.

Mejoras: TRIPLE DES y AES (ADVANCED ENCRYPTION STANDARD)


La llamada sería la siguiente:

try {


// Create encrypter/decrypter class

String clave = "ricardo";

System.out.println("CLAVE: "+clave);

DES encrypter = new DES(clave);

String original = "SILVANO";

System.out.println("ORIGINAL: "+original);

// Encrypt

String encrypted = encrypter.encrypt(original);

System.out.println("ENCRIPTADO: "+encrypted);

// Decrypt

String decrypted = encrypter.decrypt(encrypted);

System.out.println("DESENCRIPTADO: "+decrypted);

} catch (Exception e) {



}


Ésta sería la clase Java de DES:


import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;

import javax.crypto.*;
import javax.crypto.spec.*;

import sun.misc.CEStreamExhausted;
import sun.misc.CharacterEncoder;
import sun.misc.HexDumpEncoder;

import java.io.*;

public class DES {

Cipher ecipher;
Cipher dcipher;

// 8-byte Salt
byte[] salt = {
(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
};

// Iteration count
int iterationCount = 19;

DES(String passPhrase) {
try {
// Create the key
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());

// Prepare the parameter to the ciphers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

// Create the ciphers
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (java.security.InvalidAlgorithmParameterException e) {
} catch (java.security.spec.InvalidKeySpecException e) {
} catch (javax.crypto.NoSuchPaddingException e) {
} catch (java.security.NoSuchAlgorithmException e) {
} catch (java.security.InvalidKeyException e) {
}
}

public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");

// Encrypt
byte[] enc = ecipher.doFinal(utf8);

// Encode bytes to base64 to get a string
return new sun.misc.BASE64Encoder().encode(enc);

} catch (javax.crypto.BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
} catch (java.io.IOException e) {
}
return null;
}

public String decrypt(String str) {
try {
// Decode base64 to get bytes
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

// Decrypt
byte[] utf8 = dcipher.doFinal(dec);

// Decode using utf-8
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
} catch (java.io.IOException e) {
}
return null;
}


}

viernes, 23 de mayo de 2008

Coeficiente de Correlación

La correlación es una técnica estadística usada para determinar la relación entre dos o más variables.

El coeficiente de correlación es un valor cuantitativo de la relación entres dos o más variables y puede variar desde -1 hasta 1.

La correlación de proporcionalidad directa o positiva se establece con los valores +1 y de proporcionalidad inversa o negativa con los valores de -1. No existe relación entre las variables cuando el coeficiente es de 0.



Para calcular el coeficiente de correlación en EXCEL podemos utilizar las siguientes funciones: COEF.DE.CORREL o PEARSON (http://es.wikipedia.org/wiki/Coeficiente_de_correlaci%C3%B3n_de_Pearson)

Una aplicación práctica sería la siguiente figura. Muestra los aforos de vehículos de dos días diferentes durante 24 horas. (N=24; X=valores día 24/01/2007; Y=valores día 12/01/2005).

Se puede apreciar la alta correlación entre ambos días mirando el coeficiente de correlación (r = 98.01%) y gráficamente consultando las líneas describiendo casi los mismos trazos.


lunes, 12 de mayo de 2008

TRUCOS JAVACUP 2008

Bueno, referente a la táctica del concurso JavaCup 2008, voy a explicar algún truquillo que puede ser interesante.

El framework de Javacup, por cada movimiento de balón itera cada una de las tácticas que están en juego, por lo que sería lógico, dentro de cada táctica, iterar todos y cada uno de los 11 jugadores con sus comandos (movimientos, pases o tiros a puerta) correspondientes.

Otro y si cabe, más interesante, sería anticiparse a las acciones del contrario, calculando previamente la posición futura del balón. Esto se haría más o menos:


distanciaRecorridaBalonEjeX = bola.getX() - posicionBalonAnterior.getX();
distanciaRecorridaBalonEjeY = bola.getY() - posicionBalonAnterior.getY();

posicionBalonSiguiente.setLocation(bola.getX() + distanciaRecorridaBalonEjeX, bola.getY() + distanciaRecorridaBalonEjeY);

bola = posicionBalonSiguiente;

Con el nuevo objeto bola y sus nuevas coordenadas ya podemos seguir con nuestra táctica; movimientos de los jugadores, siempre respecto a la nueva posición de la bola.
Una vez se haya acabado nuestra táctica en el enésimo movimiento del balón según el framework, hay que actualizar la posición del balón anterior con la posición de la bola utilizada de la siguiente manera:

this.posicionBalonAnterior.setLocation(sj.getBola());

Para rematar la faena, nos interesa cubrir al contrario o mejor dicho, anteponernos entre el balón y el contrario.
Para ello podemos utilizar el siguiente código:


//nCon en el índice del vector contrarios, es decir, el contrario a cubrir

double x = sj.getBola().getX() - sj.getContrario()[nCon].getX();
double y = sj.getBola().getY() - sj.getContrario()[nCon].getY();

//Distancia del contrario a la bola
double n = Math.sqrt(Math.pow(x,2) + Math.pow(y,2));

//Posiciona al jugador en un punto intermedio de la recta que une el contrario y la bola
double nx = sj.getContrario()[nCon].getX() + (x/n)*20;

double ny = sj.getContrario()[nCon].getY() + (y/n)*20;

lunes, 5 de mayo de 2008

Baila el Javascripy

Para los que alguna vez han programado en el magnífico lenguaje JavaScript y ahora que se acerca Eurovisión 2008 con la canción del Chiki Chiki, aquí va una versión de lo más currada.

Baila el Javascripy

(la música ya la conocéis)

¡¡¡Teclea, teclea!!!
El javascripy mola mogollón,
funciona en Explorer y también en Firefox.
Ponle javascripy a esa paginita,
que el javascripy la deja muy bonita.
Abre ventanas,
muestra mensajes,
valida formularios,
mi amol ya tu sabes!
Programan los seniors,
Programan los juniors,
Programa mi jefe con acentos en el function!
Y el javascripy se programa asi:
1 - el tag "script"
2 - el function vars
3 - el alert-confirm
4 - el return trú
Programa el javascripy,
Programa el javascripy,
programan los heavys también los frikis
Programan en la offis, programan en la uni,
Programan los fruittis y también los lunnis.
Programa Maradona esnifando una raya,
y Juan Carlos le dice: ¿Porque no usas ajax?
En el formulario de un triste portal,
pusieron javascripy y ya pudo validar
¡¡¡Validar!! ¡¡Validar, validarr, validarrr!!!
Y el javascripy se programa asi:
1 - el tag "script"
2 - el function vars
3 - el alert-confirm
4 - el return trú.

JAVACUP 2008

Ya hace un año leí en la revista "Sólo Programadores" un artículo sobre un torneo de fútbol para programadores Java. Ahora vuelve la segunda edición (http://javacup.javahispano.org/) con mucha más fuerza y mejores premios.
Entre las empresas involucradas está Sun Microsystems Ibérica, lo que indica del alto prestigio del torneo.

Se trata de hacer una táctica (una clase Java) sobre un framework programado por Jorge Rubira que ofrece todo lo referente a la posición del balón, de los jugadores, pases, chutes, etc. Esta táctica puede ser lo más sofisticada que se pueda para auparse al número 1 del podio, aunque creo que es muy difícil por lo ya visto en el 2007. El vídeo de la final de 2007 lo puedes encontrar en : http://mx.youtube.com/watch?v=IcC-Pg34Wa4&feature=related.

¿ Te atreves?.