Encadenamiento Hacia Delante (EHD)

El encadenamiento hacia delante aplicado a la lógica de predicados permite inferir conocimiento (o comprobarlo) mediante la utilización de varias reglas predefinidas. Aquí pueden encontrar un programa desarrollado completamente en JAVA bajo NetBeans.

El mismo se basa en un conjunto de hechos y reglas que son dados como entrada a partir de los cuales se realiza interacciones sucesivas hasta que no se pueda inferir más premisas.

Espero les resulte útil.

 

Saludos.

PD: El programa utiliza un Look&Feel de Substance, por tanto hay que importarlo primero, se encuentra en la misma carpeta del proyecto.

 

Encriptación MD5 – JAVA

Más de una vez se suele necesitar cifrar información sensible como contraseñas o códigos de aplicación. En esta ocasión realizaré la encriptación basada en MD5. Pero de forma recursiva 😉 De tal forma que tendremos la siguiente fórmula de encriptación:

MD5(MD5(MD5(PASSWORD) + MD5(SEMILLA)))

La que utiliza una semilla para garantizar más aún nuestros datos. Y como era de suponer JAVA posee una clase que nos permite aplicar MD5 a una cadena, la misma que es MessageDigest. Para ello:

Especificamos la Instancia del Algoritmo (también podemos hacerlo con SHA pero no es el caso)

MessageDigest md = MessageDigest.getInstance(“MD5”);

Indicamos los caracteres contenidos en la clave y su longitud.

md.update(clave.getBytes(“UTF-8”), 0, clave.length());

Debido a que la clase MessageDigest devuelve el valor como un vector de bytes, deberemos realizar el siguiente proceso para transformar bytes–>BigInteger–>String

byte[] bt = md.digest();

BigInteger bi = new BigInteger(1, bt);

String md5 = bi.toString(16);  //16 por hexadecimal.

Con este principio lo que se debe hacer es realizar las llamadas a un método en el orden correcto para conseguir nuestro objetivo del principio. Aquí pueden encontrar la implementación en un proyecto de NetBeans con una interfaz gráfica.
Saludos.

qmarqeva

Convertir Hexadecimal a Binario (hex to binary)

Más de una vez se presenta la necesidad de convertir un número de Hexadecimal a Binario, ya sea para cálculos o para extraer cada uno de los bits, como es mi caso y utilizando JAVA es tan sencillo como:

Transformar un String a Hexadecimal:

int numHex = Integer.parseInt("AA", 16);

Transformar el número Hexadecimal a Binario

String binary = Integer.toBinaryString(numHex);

y listo nuestra salida será similar a esto:

10101010

En el siguiente código(en NetBeans) pueden probarlo, además hay una función para completar el número de bits que necesitan en su número binario resultante.

Saludos.

INTELIGENCIA ARTIFICIAL

Desde tiempo atrás, el ser humano ha sido considerado como el último eslabón de la cadena evolutiva, debido a poseer cualidades notables como la inteligencia y el razonamiento, que lo convierten en un ser único.  Pero, y si se lograra ‘emular’ esa inteligencia y razonamiento en una máquina? Acaso sería este el punto de partida para generar una nueva clase de ‘vida’?

Es así, que el afán de la humanidad por comprender la inteligencia humana, ha llevado a generar una ciencia denominada “inteligencia artificial”, cuyos inicios más notables se remontan a poco después de la segunda guerra mundial y denominada así en el año de 1956.

Para determinar correctamente el fin perseguido por la IA, es importante definir lo que se concibe por inteligencia, argumentando así que es “una capacidad especial, y superior a la media de un determinado grupo humano, para realizar determinadas actividades. En ámbitos académicos estaría relacionada con una sobrecapacidad mental para almacenar y procesar información”. Llegando a definir el objetivo de la IA como el intentar simular las actividades cognitivas que posee un ser humano en un sistema informático.

Compuesta de dos enfoques, simbólico y subsimbólico, la IA a llegado a estar presente en gran multitud de campos, que van desde económicos hasta militares, muchas de las veces la IA mezcla el hardware y software para llegar a formar sistemas complejos (robots humanoides) que son la mayor expresión de IA materializada.

En su objetivo de imitar la capacidad humana, se utilizan varios mecanismos, como redes neurales que basadas en “nanochips” replican la corteza cerebral e imitan formas de aprendizaje aún primitivas.

En la actualidad se ha logrado crear sistemas capaces de simular comportamientos humanos, como una conversación, o el crear medios de ‘aprendizaje’ automático y simular ‘recuerdos’ (memoria). Lo que puede llevarnos a preguntar, como podremos medir si un sistema es cada vez más ‘humano’? Esto basado en su ‘inteligencia’ (artificial). Para responder a esto, en 1950 Alan  Turing propone un  tipo de prueba (que lleva su nombre) capaz de medir la capacidad de la máquina para ‘engañar’ a un evaluador humano en una conversación, llegando a superarla cuando el evaluador no logre diferenciar si las respuestas dadas son de una máquina o de un humano.

Si bien la prueba de Turing es ampliamente aceptada, existen argumentos que expresan, que aunque una máquina pase este test, no será inteligente mientras no tenga conciencia de que el conocimiento que genera es conocimiento para ella, como lo menciona el filósofo norteamericano John Searle en su contribución llamada “el argumento de la habitación china“. Aunque hasta ahora ninguna máquina ha superado la prueba, los esfuerzos por interpretar y generar lenguaje humano cada vez son mayores, puesto que la IA es un conjunto de ciencias, de ahí la complejidad de la inteligencia del ser humano para ser imitada.

Los avances que se han venido dando en este campo, han permitido que cada vez más sea posible contar con ‘agentes inteligentes’, que resultan beneficiosos en multitud de situaciones, pero, hasta que punto una máquina puede llegar a ser ‘inteligente’?, Es muchas de las veces la pregunta más común, pues siempre se ha creído que la inteligencia como tal radica solo en el ser humano, y el dilema de saber si el ser humano podrá ser capaz de crear un ser más inteligente que él, es concebida como general en el mundo de IA.

Se cree que esto es posible, pues en poco tiempo la cantidad de transistores en una máquina será igual(o mayor) a la cantidad de neuronas en nuestro cerebro y la velocidad de procesamiento de un computador es ya lo suficientemente rápida como para imaginar todo esto.

Lo que aún queda como pregunta en mí, es hasta que punto se podrá confiar en aquellos nuevos ‘agentes inteligentes’ que ahora realizarán las tareas que antes eran realizadas por seres humanos? Esto debido a que los sistemas de IA son construidos en base a código (programación), un mundo en donde es prácticamente imposible enfrentar todos los posibles casos.

Esto lleva a pensar, muchas de las veces, en aquellas obras cinematográficas con tono apocalíptico, en donde la IA alcanza el punto máximo (tal vez no estéticamente) sino que es común encontrar máquinas con conciencia propia, funcionando a su voluntad, dominando sistemas complejos que causan pánico en las poblaciones. Aunque todo esto no sea más que ciencia-ficción aún cabe la pregunta, hasta que punto se podrá llegar a crear una conciencia propia en una máquina? Y aunque la respuesta va más allá de la inteligencia, es uno de los fines a largo plazo de la IA.

En definitiva, durante ya algunos años, hemos estado interactuando con sistemas IA en varias formas (ej, un bot de charla) y resulta interesante observar como esto ha ayudado en múltiples campos a optimizar tareas antes tediosas, ahora realizadas por sistemas expertos e inteligentes, aunque a la fecha estos aún necesiten o son un apoyo para los seres humanos. La idea es atractiva siempre y cuando no se enfoque a un lado opuesto, dígase la creación de IA como armamento bélico o la creación de sistemas inteligentes capaces de ser inclinados en generar beneficios a cierto sector (como el reemplazo de un corredor de bolsa por un software inteligente)

Al día de hoy, si bien estos avances son notables (aunque aún no tanto como realmente se deseara), uno de los factores que implica su adopción en el mundo es su relación costo-beneficio, puesto que en economías con mano de obra barata la automatización de tareas (inteligentes) resulta ser demasiado lento, haciendo que en el medio, la investigación en esos campos sea prácticamente nula.

La IA es un mundo relativamente nuevo, donde las mayores avances aún estar por venir, dentro de algunos años la interacción con máquinas se volverá algo muy cotidiano y normal, y hasta algún punto necesario, solo espero que nuestro rol no cambie y seamos nosotros los que lleguemos a ser dependientes de las máquinas como ellas son de nosotros ahora.

Bibliografía

Russell, S. & Norvig P. (2008) Inteligencia Artificial: Un enfoque moderno (2ª ed.) Madrid: Pearson Education S.A.

(2008. agosto 22) Inteligencia artificial y computadoras capaces de especular. Extraído de sitio Ecuador Ciencia el 01 de octubre de 2010. http://www.ecuadorciencia.org/

Infante, M. & Lara J. Un nuevo paso evolutivo Perspectivas darwinianas de la Inteligencia Artificial. Recuperado del sitio de Red Científica el 30 de septiembre de 2010. http://www.redcientifica.com/doc/doc200503280600.html

López-Ruiz, R. El Reto de la Inteligencia Artificial. Extraido del sitio de Red Científica el 01 de octubre de 2010. http://www.redcientifica.com/doc/doc200505170600.html

Moriello, S. Las máquinas del futuro, ¿podrán llegar a ser conscientes?. Consultado del sitio de Red Científica el 03 de octubre de 2010 http://www.redcientifica.com/doc/doc200302140312.html

Montes, H. & Álvarez, F. ¿Inteligencia artificial (IA) o razonamiento simulado? Extraído de Red Científica el 03 de octubre de 2010. http://www.redcientifica.com/doc/doc200206190001.html

Herrán Gascón, M. Ciencia-ficción, vida e inteligencia artificial: Buscando las grandes respuestas por el camino de la imaginación. Consultado en Red Científica el 01 de octubre de 2010.  http://www.redcientifica.com/doc/doc200106170001.html

Herrán Gascón, M. Inteligencia Artificial: Simbólico versus Subsimbólico. Extraído de Red Científica el 02 de Octubre de 2010. http://www.redcientifica.com/doc/doc199903130005.html

Ordoñez Servín, M. Inteligencia Artificial. Extraído del sitio de la Unam el 01 de octubre de 2010. http://www.tuobra.unam.mx/publicadas/020821090354.html

Inteligencia artificial en humanos para 2029. Extraído del sitio del diario el  informador de México. http://informador.com.mx

CONEXIONES PHP – MYSQL & PHP-ACCESS

Siempre es común (indispensable diría yo ;-)) en el desarrollo de aplicaciones bajo php el conectarse a una BD. A continuación algunos ejemplos con dos Bases de Datos distintas:

PHP – MYSQL.

Para la conexión con una base MYSQL lo hacemos de la siguiente manera:

mysql_connect($dbhost, $dbusuario, $dbpassword) or die (“Error al Conectar!”);

Especificamos el nombre de la BD en la que vamos a trabajar:

mysql_select_db($db) or die (“Verifique la Base de Datos”);

Armamos la consulta y extraemos los datos:

$consulta = “SELECT titulo, latitud, longitud, descrip, icono FROM posicion”;

$respuesta = mysql_query ($consulta);

Verificamos si existió algún error o no:

if (!$respuesta) {

$message  = ‘Error en la consulta: ‘ . mysql_error() . “\n”;

$message .= ‘Busqueda: ‘ . $consulta;

die($message);

}

Presentamos la información que acabamos de extraer:

while ($row = mysql_fetch_array($respuesta))

{

$x = $row[1];

$y = $row[2];

$title = $row[0];

$desc = $row[3];

$icon = $row[4];

$info = “$y,$x” . “<br>” . “$title” . “<br>” . “$desc” .” <br>” .”$icon”.”<br>”;

print($info);

}

PHP – ACCESS

La conexión anterior con MySql es muy fácil puesto que php presenta funciones nativas que permiten realizar operaciones con esta, pero en el caso de ACCESS se deberá hacer uso de una librería llamada ADODB que permite conexión con múltiples BD’s:

Creamos el tipo de conexión:

$db_connection = new COM(“ADODB.Connection”);

Cargamos el Drive:

Especificamos aquí la dirección de la Base ACCESS en este caso es el archivo datos.mdb.

$db_connstr = “DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=”. realpath(“d:/datos.mdb”) .” ;UID=;PWD=1234;DefaultDir=”. realpath(“d:/datos.mdb”);

Realizamos la conexión:

$db_connection->open($db_connstr);

Consultamos a la Base:

$rs = $db_connection->execute(“SELECT * FROM posicion”);

Recuperamos la diferentes columnas que posee la consulta que acabamos de ejecutar:

$rs_fld0 = $rs->Fields(“titulo”);

$rs_fld1 = $rs->Fields(“latitud”);

$rs_fld2 = $rs->Fields(“longitud”);

$rs_fld3 = $rs->Fields(“descripcion”);

$rs_fld4 = $rs->Fields(“icono”);

Recorremos las columnas hasta el final y las presentamos:

while (!$rs->EOF) {

$titulo = $rs_fld0->value;

$lat = $rs_fld1->value;

$lon = $rs_fld2->value;

$des = $rs_fld3->value;

$ico = $rs_fld4->value;

$info = “$lon,$lat” . “<br>” . “$titulo” . “<br>” . “$des” .” <br>” .”$ico”.”<br>”;

print($info);

//Avanzamos un registro

$rs->MoveNext();

}

Cerramos tanto el ResulSet como la Conexión:

$rs->Close();

$db_connection->Close();

Como podemos ver los métodos de extracción de datos son diferentes pero útiles, los archivos de ejemplo utilizados puedes encontrarlos en la parte izquierda del blog o aquí.

Saludos.

Recuperar GRUB – Después de Instalar Windows

Pues resulta que como la mayoría por ahí, en mi computador tengo conviviendo a los dos sistemas guindows y linux. Y hace algunos días uno de ellos ha estado dando lío con tantos bichos que se propagan por ahí que no quedó más remedio que formatear su partición.

Pues bien, resulta que volví a reinstalar mi guindows y cuando pensaba que todo volvía a la normalidad, resulta que esta instalación ha sobre-escribo mi grub y ahora solo reconoce guindows (que egoísta… ).

Pues bien en los foros siempre recomiendan instalar primero guindows y luego linux, pues este último maneja mucho mejor los sistemas de arranque existentes lo que evita este problema. Pero en un caso como el mío la solución es la siguiente:

  • Cargamos el live-cd de la distribución (ubuntu 9.04  ese es el q tengo)
  • Una vez dentro detectamos la partición en donde esta instalado linux, tan fácil como hacer un fdisk -l.
  • En mi caso indica que la partición es sda6
  • Ahora cargamos esa partición en un directorio cualquiera. 
  • En un terminal tecleamos lo siguiente:
    1. sudo grub
    2. root (hdL,N)
    3. setup (hdL)
    4. quit

En donde L representa la letra que se encuentra antes del número cuándo detectamos la partición (sda6) en este caso a que viene a ser 0. Y N que es el número del final menos uno. En este caso 5. Así los comandos me quedan como:

    1. sudo grub
    2. root (hd0,5)
    3. setup (hd0)
    4. quit

Y listo, solo queda reiniciar el equipo y nuestro GRUB estará de vuelta como nuevo. 

Saludos.

Publicado en linux. Etiquetas: , , , . Leave a Comment »

Consultas Dinámicas SQL – ORACLE

Más de una vez se utilizan dentro de las bases de Datos consultas un poco parecidas o se necesita armar una consulta con determinados datos, algo que puede ser simplificado dentro de Oracle, con la utilización de el paquete DBMS_SQL.

Aquí un ejemplo:

Si poseemos la siguiente estructura de una tabla (muy sencilla solo para ejemplo):

create table registro (cliente  varchar2 (50),
compras  number (10,3),
ventas   number (10,3),
estado   varchar2 (25));

En donde se guardará información de ventas o compras de un cliente, tomando en cuenta que por cada transacción solo puede haber un valor en compras o ventas, pero no los dos, los datos son ingresados de la siguiente manera:

insert into registro ( cliente, compras, estado)
values ( 'Perez Juan', 123.4, 'CANCELADO');
insert into registro ( cliente, ventas, estado)
values ( 'Perez Juan', 452.8, 'PENDIENTE');

Como podemos ver la única diferencia entre estas sentencias de INSERT es la columna a la cual hacen referencia, ahora bien, que tal si creamos un pequeño procedimiento y lo almacenamos en un paquete de utilidad que luego podremos utilizar.

El procedimiento quedaría algo como esto:

PROCEDURE grabar_datos( nm_cliente     varchar2 (50),

columna        varchar2(50),

val_columna    number (10,3),

estado         number (10,3))

is

n_cursor INTEGER;

consulta VARCHAR2(250);

aux      number;

begin

consulta := 'insert into registro (cliente,:v1,estado)

values (:v2 , :v3 , v4)';

n_cursor := DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(n_cursor, consulta , DBMS_SQL.NATIVE );

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v1', columna);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v2', nm_cliente);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v3', val_columna);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v4', estado);

aux := DBMS_SQL.EXECUTE (n_cursor);

DBMS_SQL.CLOSE_CURSOR(n_cursor);

end grabar_datos;

En este caso el parámetro val_columna podrá solo recibir dos valores “compras”  o “ventas” que son las columnas de la tabla. Podemos observar que para crear la consulta dinámica reemplazos los valores a utilizar por un expresión del tipo :nombre (similar a las variables host en oracle) para luego reemplazarlas con los valores originales mediante la instrucción:

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v1',columna);

Se pudiera también formar la consulta dinámica de forma directa concatenando las expresiones que necesitamos, pero por algún motivo esto no es lo más óptimo pues puede presentar errores al concatener expresiones entre ‘ ‘ y números reales (12.3) .

Con esto habremos reemplazado los dos insert por un solo procedimiento.

Saludos ,