jueves, mayo 09, 2013

El camino mas corto en un grafo no dirigido

En la actualidad los expertos indican que las bases de datos relacionales (modelo usado desde los años 80) están llegando a ciertos límites y nuevas tendencias están emergiendo, como las bases de datos NoSQL, producto de las necesidades de la Web, grandes volúmenes de datos (Big-Data), la computación en la nube, computación en paralelo (MapReduce), inteligencia de negocios (BI), machine learning muy útil en la minería de datos, entre otros.

Producto de un par de cursos interesantes en Coursera: Web Intelligence and Big Data e Introduction to Data Science he encontrado que muchas de las nuevas tendencias están basadas en teorías relativamente viejas, que parecían no tener un futuro muy marcado, ni amplio uso (al menos desde mi punto de vista personal tomando como base los trabajos y los proyectos en los que me ha tocado participar).

Una de estas teorías que tuve la oportunidad de conocer a nivel básico en la universidad, fue la teoría de grafos, la cual ahora se usa en las nuevas tendencias de bases de datos orientadas a grafos.

Al leer sobre este asunto, recordé que en la universidad realicé un proyecto relacionado con grafos, en conjunto con Marconi Poveda y Alam Romero para la clase de Matemáticas Discretas, razón por la cual me di a la tarea de desempolvar los archivos personales para compartir el programa y su código fuente, si le es útil a alguien allí está el link de descarga.


"GRAFOS 1.0  es un programa desarrollado en el lenguaje de programación Visual Basic 6.0; cuyo objetivo es resolver el problema de encontrar los caminos de menor peso entre todos los pares de vértices de un grafo no dirigido.

Presentado como proyecto de la clase de Matemáticas Discretas impartida por el profesor Ing. Marvin Castañeda en la Universidad Nacional de Ingeniería (UNI) de Managua, Nicaragua, y llevado a cabo por alumnos de segundo año de la carrera de Ingeniería en Computación durante el mes de Diciembre del 2002."





martes, enero 08, 2013

Cursos gratis "everywhere"!!!

Los cursos en línea y gratis sobre diversos temas abundan en Internet. Estos cursos aprovechan diferentes medios provistos por Internet como: blog, wikis y elementos multimedia como: podcast o vídeos, entre otros.

Hasta no mucho existían únicamente artículos simples que aclaraban dudas puntuales sobre un determinado tema, pero ahora están creciendo espacios con cursos muy formales, creados, organizados y administrados por empresas (que promueven el conocimiento de sus productos), comunidades (entusiastas de diversos temas) o hasta incluso por universidades (que desean compartir el conocimiento).

Las personas con deseos de conocimientos informáticos somos las más beneficiadas, ya que este tipo de materiales son los que más abundan.

A continuación comparto una pequeña lista de sitios Web en los cuales de forma gratuita se pueden aprender de diversos temas, la misma la he recopilado de conversaciones en diferentes listas de correo.

Open Knowledge Scrum: cursos gratis de Scrum (metodología de desarrollo de software), Métricas Agiles y Gestión Visual Kanban.
http://www.scrummanager.net/oks/

Aprende a programar interactivamente: ideal para estudiantes iniciales de programación. Además hay cursos interactivos de HTML, CSS,  JavaScript, jQuery, Python, Ruby.
http://www.codecademy.com

Coursera: un conjunto de universidades de alta calidad y categoría comparten en línea y de forma gratuita diferentes cursos, no sólo informáticos, sino también sobre matemáticas, física, humanidades, entre otros.
https://www.coursera.org/

Además de cursos variados y similares en:

http://www.udacity.com/

https://www.khanacademy.org/

Para complementar los cursos o para extender la investigación probablemente sea necesario conseguir un libro: http://www.flazx.us/

Y si no se sabe inglés estaremos renunciando a buena parte de los espacios mencionados anteriormente, por lo que un reforzamiento del inglés es muy recomendado: http://www.englishclub.com/

Y también están los cursos gratis de Microsoft: http://www.microsoftvirtualacademy.com/ 

Otros enlaces Interesantes:

Biblioteca Digital Mundial (de la UNESCO):
http://www.wdl.org/

UOC OpenCourseWare de la Universitat Oberta de Catalunya
http://ocw.uoc.edu/informatica-tecnologia-y-multimedia/

[Nuevo] Un amigo me ha compartido este otro sitio de cursos de universidades iberoamericanas Miríada X:

http://miriadax.net/


[Nuevo 2]  Google Developers Academy

https://developers.google.com/academy/

[Nuevo 3]
Entorno de formación abierta de la UNED
https://unedcoma.es/

Proyecto Telescopio Universidad Galileo
http://telescopio.galileo.edu/


Walker, una película grabada a pocos metros de mi casa

Tenía tres años en 1987, y recuerdo que en esa fecha estuvieron grabando una película cerca a mi casa. Cortaban la energía eléctrica y encendían grandes faros de luz justo a escasos 50 metros de mi casa, hay varias escenas de la película Walker que se hicieron en la calle Arsenal y en la calle El Enredo en Granada, para aquella fecha habían muchas más casas viejas lo que les permitió tener un escenario bastante real conforme la historia que se contaba en la película.

¿Recuerdan al jefe de vuelo en Apollo 13? El actor Ed Harris, ese mismo hizo el papel de William Walker.

La película no tuvo mucho éxito internacional, pero si recuerdo el montón de gente y vehículos que estaban en la calle para hacer esa película.

¿Reconocen estos lugares de Granada? Todas son imágenes en la película:

Edificio Frente a la Casa de los Tres Mundos o Casa de los Leones - Plaza de la Independencia

Plaza junto a la Catedral y el Parque Central, inicio de la Calle La Calzada (Escena de Quema de Granada)

Final de la calle Arsenal, a la izquierda como a 100 metros mi casa :)

Calle El Enredo, entre las calles Arsenal y Libertad, al fondo el volcán Mombacho

Coche tradicional de Granada en una escena de la película

Plaza Central, al fondo la Catedral (de color blanco)

Plaza Central vista hacia Palacio Episcopal y actual edificio de compañía Claro

William Walker a caballo frente al convento/iglesia de San Francisco

Plaza Central de Granada, junto a Catedral, el Parque Central y el Palacio Episcopal

Antiguo Hospital San Juan de Dios (Hospital Viejo)

¿Y estos otros lugares de Nicaragua les son familiares?

Toma de la Laguna de Apoyo

Palacio Nacional en Managua


Créditos finales


domingo, enero 06, 2013

Ayúdame a respaldar los archivos de mi computadora

- "Ayúdame a respaldar y organizar los archivos de mi computadora...", contesté: si claro, nos conectamos en red, pasamos los archivos a mi computadora y los quemo en un DVD!

Y luego me enseñaron este Escritorio:

Y habían muchos más archivos en Mis Documentos. La meta era remover los archivos repetidos y organizar luego un poco las carpetas.

Primero copié los archivos usando Samba hacia mi computadora, para escanearlos con el antivirus libre ClamAV.

Luego para encontrar los archivos repetidos, encontré una utilidad muy buena en Linux llamada FSlinit - http://www.pixelbeat.org/fslint/

FSlinit está disponible por defecto en Ubuntu, es muy fácil de instalar desde el gestor de paquetes.


Una vez instalado, el programa se puede ejecutar desde el menú Aplicaciones > Herramientas del Sistema > FSlint.

FSlint permite encontrar archivos repetidos o duplicados sin importar su ruta, nombre, fecha de creación o modificación. Al inicio pensé que FSlint funciona como si obtuviera un hash (digamos MD5 o SHA1) del contenido de cada archivo y luego los compara.

Para ponerlo a funcionar, se pulsa el botón Añadir, lo cual permite indicar la o las rutas que examinará el FSlint en busca de archivos repetidos.

Lo que más me impresionó la primera vez que lo usé, fue la velocidad con la que entrega los resultados, supongo que realmente no revisa los archivos, ni calcula hashes sobre los mismos, sino más bien, toma la información que necesita directamente de las tablas de datos del sistema de archivos lo cual lo convierte en un software muy eficiente.



En la parte central de su pantalla muestra la lista de archivos duplicados, su nombre y ubicación. En la parte inferior derecha está el botón Eliminar para borrar el o los archivos seleccionados.

Si  no se desea ir revisando uno por uno los archivos repetidos, se puede usar el botón Seleccionar todos los archivos más nuevos, los más viejos o los primeros de la lista y luego pulsar borrar.

La lista se limpia automáticamente a medida que los archivos duplicados son removidos.



domingo, diciembre 23, 2012

Experiencias Intentando Aprender a Tocar Piano (II)

Espero que en el 2013 si pueda dedicarle tiempo al teclado musical, sin apartarme del teclado de la computadora usando Midi Sheet Music (software libre).

Experiencias Intentando Aprender a Tocar Piano (I)

 

jueves, agosto 16, 2012

Gracias a Dios: Java Standard Edition 6 Programmer Certified Professional

El día de ayer en GueGue centro de pruebas autorizado por Pearson y Oracle puede realizar un examen para el cual estaba en preparación desde hace ya algún tiempo, gracias a Dios todo salió bien, mi primera certificación :)


Espero que esto anime a varios amigos, compañeros y conocidos a que también se preparen y que sientan que ellos también pueden. Gracias a todos por las felicitaciones.

domingo, enero 08, 2012

Contabilidad personal con jGnash

Contabilidad personal con jGnash


El año pasado junto con otros amigos (Hamer y Marconi) nos apuntamos a recibir un curso de Finanzas para no Financieros en la UPOLI.



En ese curso aprendimos un poco de contabilidad por partida doble, activo, pasivo, capital, etc. Luego intentando implementar los conocimientos recién adquiridos y llevar control de mis finanzas personales busqué un software libre que me asistiera, así encontré: jGnash.


jGnash según Wikipedia:

jGnash es una aplicación libre de gestión de finanzas personales programada en Java.

Entre sus principales características destaca:

- Está basado en transacciones de partida doble (debe y haber)
- Cuenta de ajuste o reconciliación
- Generación de informes o reportes en PDF
- Soporte para múltiples monedas
- Actualizaciones automáticas en línea de tasas de cambio de monedas
- Catálogo de cuentas personalizable
- Interfaz de usuario amigable
- Multiplataforma, es ejecutable en cualquier plataforma que soporte Java (linux y windows)

Su sitio Web, desde el cual se puede encontrar más información o desde el cual se puede descargar, es:

http://sourceforge.net/apps/mediawiki/jgnash/index.php?title=Main_Page

Instalar jGnash

1- Descargar la última versión de jGnash de su sitio Web.
2- Descomprimir el zip

Ejecutar jGnash y crear una nueva base de datos

Desde una consola ejecutar el jar de la siguiente manera (en windows se puede hacer doble clic sobre el ejecutable):

denis@host:~/jGnash$ java -jar jgnash2.jar

Seleccionar del menú Archivo, la opción Nuevo. Y en los siguientes pasos es necesario indicar la ruta y el nombre del archivo a crear, moneda por defecto, otras monedas a ser soportadas, aunque luego se puede ajustar esta configuración, al final se selecciona el catálogo de cuentas inicial que es posible también personalizar.

Ruta y nombre del archivo:


Moneda por defecto de las cuentas:



Seleccionar otras monedas a soportar:


Los catálogos de cuentas disponibles por defecto están en inglés, pero el usuario luego puede crear el suyo propio en español.



Al finalizar ya se tiene un archivo con el catálogo de cuentas inicial y sin ninguna transacción.

Ejercicio simple con jGnash

1. Suponer que a la fecha se tiene una cuenta de ahorro en un banco, con C$ 10,459.45 córdobas
2. En mi cartera del pantalón tengo C$ 350.00 córdobas
3. Suponer ingresos mensuales en concepto de salario de fin de mes por C$ 4,000.00 en 3 meses, estos son depositados al banco.
4. Cada 15 de mes retiro el 75% del salario y ahorro el 25%.
5.En el primer mes he gastado C$ 110.00 córdobas en recargas al celular, en el segundo mes C$ 55.00 y en el tercero C$ 20.00 los cuales pago con cash.
6. Suponer que en el primer mes fuí al cine y pagué C$ 65.00 córdobas con la tarjeta de débito de la cuenta bancaria
7. Generar los informes siguientes para el período registrado: patrimonio o capital neto, balance general, y el estado de resultados o pérdidas y ganancias.

La contabilidad por partida doble, se basa en que el dinero que entra debe haber salido de algún lugar, y el dinero que sale debe entrar en algún lugar. "No hay deudor sin acreedor, ni acreedor sin deudor", entendiendo este principio es fácil usar jGnash.

Para este ejemplo, en el punto número 1 para que en el banco (cuenta Saving en jGnash) ingresen (o se depositen) los C$ 10,459.45 córdobas iniciales de este conteo, es necesario que ese mismo monto salga de otra cuenta (contracuenta), la contracuenta para este punto es básicamente lo que los contadores llaman el balance de apertura o capital inicial (cuenta Opening Balances en jGnash).

Con el botón Registro de la izquierda de la pantalla activada, seleccionar la cuenta Opening Balances, en la parte derecha hay 4 fichas Disminución, Aumento, Transferencia y Ajuste, evidentemente estamos aumentando el capital inicial por lo que es necesario seleccionar la ficha Aumento, el siguiente paso importante es seleccionar la contra cuenta, o sea donde se va depositar el dinero, en este ejemplo en la cuanta de bancos (Savings), luego colocar una breve descripción de la transacción, completar la fecha y el monto:



Dado que se utiliza partida doble, es posible seleccionar la cuenta Savings, para verificar que en efecto el banco tiene un depósito de C$ 10,459.45 córdobas.



Vale destacar que el registro de la transacción no necesariamente tenía que realizarse desde la cuenta Opening Balances, sino que también se pudo haber realizado desde la cuenta Saving y seleccionar como contra cuenta Opening Balances sin alterar el mismo resultado.

El punto número dos del ejemplo también corresponde con un balance de apertura de la caja chica, cash, o en finanzas personales mi cartera. Se puede registrar igual que antes, usando las cuentas Opening Balances y Cash:



Punto número 3, suponer ingresos mensuales en concepto de salario de fin de mes por C$ 4,000.00 en 3 meses, estos son depositados al banco.

Para este ejemplo suponer que cada fin de mes se depositan 4000 en la cuenta Saving, este dinero debe ingresar por algún lado, es evidente que debe ingresar por la cuenta Salary del grupo Income Accounts.



Es fácil usar jGnash como registrador de transacciones contables. En otro momento comparto el ejercicio resuelto completamente.

domingo, diciembre 11, 2011

78.57% en el simulador del examen SCJP - 1.6 de CertPal

78.57% en el simulador del examen SCJP - 1.6 de CertPal


Yupi!

Me tomó un poco más de dos horas, 70 preguntas. Resultado: 15 fallas. Lo que resulta en 78.57%, y según la web de Oracle se pasa con 61% con 60 preguntas [1] lo cual significa que ya casi estoy listo, ahora a dar los últimos retoques...



Esta es la web del simulador:

http://www.certpal.com/ExamWeb/content/logon.do


[1]
http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_851

jueves, diciembre 08, 2011

Ejecutar aplicaciones X-Windows en Microsoft Windows sobre SSH hacia GNU Linux

Ejecutar aplicaciones X-Windows en Microsoft Windows sobre SSH hacia GNU Linux


Para cualquier administrador de servidores GNU Linux, hacer administración remota vía SSH es básico para poder controlar de manera remota un servidor. El método más común para esto es usando un servidor SSH y un cliente SSH.

SSH en modo básico permite tener una terminal de comandos remota desde la cual se puede ejecutar cualquier orden (comando, o programa) en el servidor siempre y cuando no se requiera de modo gráfico (X-Windows).

Por ejemplo (de Linux a Linux) para conectarse como el usuario denis en el computador servidor.local se puede hacer:

denis@tamagastad:~$ ssh denis@servidor.local
denis@tamagastad's password:
Welcome to Ubuntu!
Last login: Sat Oct 29 19:30:32 2011
denis@servidor.local:~$

Pero si se requiere lanzar una aplicación en modo gráfico, por ejemplo gedit, se obtendrá un error como este:

denis@servidor.local:~$ gedit

(gedit:25468): Gtk-WARNING **: cannot open display:

Pero si del lado de nuestro cliente SSH ya tenemos un servidor X.Windows corriendo en nuestro Linux (nota: si ya tenemos Gnome o KDE, significa que ya tenemos un servidor X-Windows funcionando) al momento de realizar la conexión SSH con el servidor se puede habilitar X11 forwarding mediante el parámetro -X.

denis@tamagastad:~$ ssh -X denis@servidor.local

Y esto permitirá que se ejecute cualquier aplicación gráfica en el servidor, usando nuestro entorno gráfico local, se puede agregar al final de la invocación del programa un & para que la consola no quede capturada:

denis@servidor.local:~$ gedit &

Ok, todo esto muy bien, pero funciona de Linux a Linux, ¿qué hacer cuando queremos que un usuario con Microsoft Windows ejecute una aplicación con entorno gráfico en el servidor linux? Un cliente SSH no basta, ya que sólo permite acceso a aplicaciones de consola o terminal.

Para esto es necesario instalar un servidor X-Windows en Microsoft Windows y establecer una conexión SSH con X11 forwarding. De esta manera se puede usar MS Windows como una terminal tonta que sólo se encarga de la presentación de las aplicaciones que se ejecutan en un servidor Linux.

Xming es un Servidor X para Microsoft XP/2008/Windows7, yo bajé "Xming-6-9-0-31-setup.exe" gratis de la web oficial de Xming en:

http://www.straightrunning.com/XmingNotes/

PuTTY es un conjunto de programas que permiten entre otras cosas acceder por SSH desde Microsoft Windows a un servidor SSH, he bajado "putty.zip" de la web oficial de PuTTY en:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html


Proceder a instalar Xming:


Lanzar la aplicación:

O usar el menú Inicio > Todos los Programas > Xming > Xming y se observará en la barra de tareas un icono que dice Xming Server:0.0

Luego descomprimir putty.zip y ejecutar PUTTY.EXE, antes de realizar la conexión SSH con el servidor, asegurarse de habilitar en putty el redireccionamiento del X11, en el árbol de configuración de la parte izquierda Connection > SSH > X11:



Seleccionar la opción Enable X11 forwarding, y en el cuadro de texto X display location escribir localhost:0 el cual corresponde con la dirección del servidor X Windows XMing recién instalado en MS Windows.

Luego en el árbol de configuración, en la opciones Session es posible establecer una conexión SSH especificando el IP o el nombre de dominio del servidor junto a su puerto.



Putty pregunta el usuario y contraseña:



Si nos conectamos bien, desde la consola de putty es posible ejecutar programas como:

nautilus &
gedit &
evice &

O cualquier programa con interfaz gráfica y el X Server de Windows mostrará esa interfaz usando como Windows Manager el entorno de MS Windows.

martes, noviembre 29, 2011

PHP y Microsoft Access

PHP y Microsoft Access


No soy un fan de la base de datos MS Access, pero cuando en una oficina pequeña hay alguna aplicación legacy hecha en MS Access y se desea que esta sea consultada en una pequeña aplicación Web interna, es fácil usar PHP y ODBC para tal fin.

PHP no soporta de manera nativa el acceso a MS Access, pero si soporta ODBC.

ODBC (Open DataBase Connectivity) es un estándar de acceso a bases de datos que tiene como objetivo permitir acceder a cualquier base de datos desde cualquier aplicación, sin importar qué sistema de gestión de bases de datos está implementada.

Entonces desde PHP se puede acceder a cualquier base de datos soportada por ODBC sin importar que exista un driver nativo para PHP. Aunque OJO: es importante aclarar que si ya existe un driver nativo de PHP para alguna base de datos es mejor usarlo en lugar de usar ODBC.

Para acceder a la base de datos por ODBC desde PHP es posible utilizar un conjunto de funciones como odbc_connect que se puede ver en más detalle en la documentación de PHP:

http://www.php.net/manual/en/function.odbc-connect.php

En este ejemplo, se ha instalado en el equipo MS Windows que contiene la base de datos MS Access, un servidor AppServ (http://www.appservnetwork.com) el cual en un sólo instalador y con un par de clics instala Apache, MySQL y PHP sobre MS Windows.

Luego para acceder a la base de datos de MS Access, primero se creará un Origen de Datos (aka DSN) llamado bd1 desde el Panel de Control de MS Windows, a como se muestra a continuación:


Agregar nuevo DSN de sistema.


Seleccionar el driver MS Access.


Pulsar el botón Seleccionar Base de datos y especificar la ruta a la base de datos.


Finalmente se pueden usar las funciones odbc_connect, odbc_exec, odbc_fetch_array, odbc_close para tener acceso a la base de datos, a continuación un ejemplo simple:

echo "Ejemplo sencillo conexión con acess";


$enlace = odbc_connect('bd1', '', '');

if (!$enlace) {

  print "Error al intentar conectar con BD.";

  exit();

}


$sql = "SELECT * FROM nombre";

$resultado = odbc_exec($enlace,$sql);


while($fila = odbc_fetch_array($resultado)){

echo "Id: {$fila['id']}";

echo "Nombre: {$fila['nombre']}";

}


odbc_close($enlace);

Al ejecutarlo, si todo sale bien se podrá ver algo similar a esto:


El código de ejemplo y la base de datos se puede descargar de aquí.

viernes, octubre 28, 2011

En honor a John McCarthy creador de LISP

En honor a John McCarthy creador de LISP


Este es el único archivo que poseeo de la clase en la que estudiamos un poco de LISP en la universidad, el archivo data de: vie 19 oct 2001 15:56:10 CST

> (DEFUN MAYOR (A B C) (PRINT "EL MAYOR ES")

1>                     ( IF (> A B)  (IF (> A C) (PRINT A)

3>                                               (PRINT C)

3>                                   )

2>                                   (IF (> B C) (PRINT B)

3>                                               (PRINT C)

3>                                   )

2>                     )

1> )


Que descanse en paz!

sábado, agosto 27, 2011

Sistema de Comunicación para Redes Internas (SISCORI) hecho en Java

Sistema de Comunicación para Redes Internas (SISCORI) hecho en Java


En Febrero del 2009 publiqué un artículo sobre un proyectito de java hecho en para una materia en la universidad: Simulador del procesador DLX (jbz) hecho en Java, resultando ser uno de los temas más leídos del foro, entonces aquí les va otro proyecto java del tiempo de la universidad: SISCORI.

Prácticamente, SISCORI, es un sistema de mensajería instantánea hecho en java (tipo jabber, pero muy, muy simple), con un protocolo de comunicación simple basado en texto, la interfaz de usuario es awt, allá por el 2004 estaba aprendiendo java, casi no habían libros al respecto y aún no tenía documentación de swing, de hecho usamos un IDE que ya no existe, se llamaba Bluette. SISCORI se compone de dos grupos de programas, los servidores y los clientes, se usa el API estándar de Socketes de java para la transmisión y recepción de datos.

La segunda versión de SISCORI si está hecha en swing, en el tiempo en que JBuilder era lo último!, mucho antes que NetBeans. Esta segunda versión usa el java sound API para capturar el audio del sistema y luego transmitir los bytes de audio sobre una red IP y permitir comunicación oral entre dos personas.

Los proyectos a futuro era integrar ambos programas y hacer una tercera versión que permitiera transmitir video, pero eso nunca sucedió, otros proyectos personales y académicos llegaron a ser prioridad.

Aquí hay más información, he desempolvado el viejo sitio que hicimos para aquel proyecto, también a partir de ahora queda liberado como software libre conforme la GPL v3.


Este es un resumen de una presentación en una feria de tecnología del CONICYT y AIN en el hotel Crowne Plaza en Nicaragua, donde como miembros de ANETIC (Asociación de Estudiantes TIC) presentamos a SISCORI, en el video se puede ver a Janet Wheelock (QEPD) quien era la presidenta de ANETIC en esa fecha.











sábado, agosto 13, 2011

Operador residuo (módulo %) en java con decimales



#java #ocjp #scjp some one tell me why?

double a = -1.1;
double b = -0.7;
System.out.println(a%b); // resultado -0.4

Pasos para resolver el ejercicio, una calculadora no ayuda...



Hay que hacerlo a mano:

- Multiplicar por 10 para eliminar el decimal
- Hacer la operación de división normal tomando en cuenta los signos, y calcular el residuo de los enteros
- Dividir el resultado entre los 10 que originalmente multiplicamos



El ejercicio lo vi en este simulador del examen:

http://www.santis.ch/training/java/jcp/selftester/indexe.php