Una “innovación” más de Sun Microsystems. Este nuevo lenguaje de scripting lleva la frase “write once, run everywhere” a un nuevo nivel y a un nuevo segmento de usuarios: el de creadores de contenidos de alto impacto. A continuación se muestra la arquitectura de JavaFX de manera muy gráfica.
Pongo innovación entre comillas porque la idea en sí no es demasiado original. Productos con un ligero parecido ya se habían anunciado antes; como Silverlight de Microsoft. Pero creo que el que realmente fue original y ya tiene algún tiempo funcionando es OpenLazslo, que a partir de su lenguaje (una mezcla de XML y Javascript, y que aparte es orientado a objetos) se genera un clip de Flash y que a partir de su reciente versión 4 también genera DHTML.

Un script de JavaFX podrá correr sobre cualquiera de los dispositivos descritos en la imagen de arriba; lo cual resulta muy conveniente a la hora de distribuir aplicaciones en varias plataformas.
Decimos que pretende abarcar un segmento de usuarios más grande porque al tratarse de un lenguaje de scripting, no se necesitan grandes conocimientos de programación para usarlo; de esta forma el creador de contenidos se enfoca en lo que mejor hace: diseñar una experiencia con un nivel alto de atractivo visual.
JavaFX no es un producto terminado, pero existe una versión funcional para irlo probando. Si JavaFX todavía no te convence o quieres más información sobre sus bondades, puedes visitar esta página con información de mercadeo; o si estás impaciente por poner tu manos sobre este lenguaje visita la página del proyecto, en la cual encontrarás las herramientas necesarias para comenzar a probarlo, un par de tutoriales y algunos demos chidos (se necesita Java JRE para correrlos).
Posted in java, programación, scripting | No Comments »
Un juego muy chido de gotmilk.com hecho en Flash. Es como un juego de mesa con “miniretos” que van apareciendo dependiendo de la casilla en la que te encuentres.
El juego se trata de que tienes que ayudar a la familia Adachi (que se ha quedado sin leche) a irrumpir dentro de un fuerte que resguarda El Vaso.

Lo que más me gustó fueron las animaciones que contiene y la forma de interacción con el dado. Simplemente impresionante.
Para jugarlo haz click aquí o en la imagen.
Posted in juegos | No Comments »
Aunque hace un buen tiempo que salió el proyecto RainbowCrack y estas (y otras) tablas están disponibles en algunos otros sitios, siempre es bueno tener una fuente más en caso de que se nos olvide nuestro propio password. 
Las tablas solo cubren un espacio muestral de contraseñas con una longitud de entre 1 y 7 caracteres alfanuméricos con una efectividad de 99.04%. Cada tabla mide 283 MB (comprimida).
lm_alpha-numeric_0_2400×40000000_table
lm_alpha-numeric_1_2400×40000000_table
lm_alpha-numeric_2_2400×40000000_table
lm_alpha-numeric_3_2400×40000000_table
lm_alpha-numeric_4_2400×40000000_table
Nota: Para mantenerme fuera de líos. No me hago responsable de cuantacosa crean que pueden hacer con esta información. Los archivos aquí publicados tienen un propósito puramente educacional y no deben ser utilizados para fines ilegales.
Posted in chale | No Comments »
El algoritmo de Dijkstra sin duda es el más popular entre los algoritmos de caminos mínimos en un grafo. Este algoritmo se enfrenta a un problema complejo. La complejidad del problema radica en el tamaño del espacio de búsqueda.
Ciertamente los grafos son de las estructuras de datos que tienden a hacer explotar combinatoriamente la complejidad de los algoritmos que intentan trabajar sobre ellos. Con una cantidad creciente de nodos, los problemas de grafos tienden rápidamente a ser intratables
Algoritmo básico: Calcula la longitud del camino mínimo desde el nodo especificado hasta todos los demás nodos.
Dijkstra(Nodo root) {
if (!root.hasChildren()) {
return;
}
else {
for (Edge e : root.getEdges()) {
int dist = root.getTotalDistance() + e.getDistance();
if (e.getTargetNode().getTotalDistance() > dist) {
e.getTargetNode().setTotalDistance(dist);
}
}
}
}
Posted in algoritmos | No Comments »
QuickSort es un algoritmo de ordenamiento muy eficiente. Es de naturaleza recursiva y utiliza la filosofía divide y vencerás.
La idea principal de QuickSort es hacer que el conjunto de elementos que se desea ordenar cuente con una característica especial: El arreglo debe tener un elemento δ que se encuentre en su posición final. Todos los elementos menores a δ están a su izquierda y todos los elementos mayores a δ están a su derecha.
Este elemento δ servirá como pivote que indica donde debe ser realizada la división del arreglo.
Sin embargo, es muy improbable encontrar dicha característica en todos los arreglos. Peor aún, resulta muy costoso comprobar si un arreglo dado posee la propiedad. Por lo tanto, en lugar de buscar un pivote natural, elegimos un elemento al azar (para evitar mayores complejidades al elegir un pivote) y reordenamos el arreglo alrededor de dicho elemento de forma tal que cumpla con nuestras necesidades.
Algoritmo básico:
QuickSort(arr[], int left, int right) {
if ((right - left) >= 1) {
int i = split(arr, left, right);
QuickSort(arr, left, i - 1);
QuickSort(arr, i + 1, right);
}
}
split(arr[], int left, int right) {
int i = left;
int v = random();
swap(arr, left, v);
for (int j = left; j <= right; j++) {
if (arr[j] < arr[i]) {
swap(arr, i, j);
i++;
swap(arr, i, j);
}
}
return i;
}
Nota: Algunas funciones están omitidas debido a que son muy sencillas de implementar y no son centrales para el funcionamiento del algoritmo QuickSort.
Actualización: Código funcional en Java. Esta pequeña aplicación implementa el algoritmo antes descrito y contiene una comparación de desempeño con la implementación del API. Sorprendentemente nuestro algoritmo tan básico solo es 4 veces más lento que el de Java 5.
Posted in algoritmos | No Comments »