viernes, 2 de mayo de 2014

¿Cómo desinstalar el cliente SQL SQuirreL en Ubuntu 12.04?


Accidentalmente, acepté la instalación de las actualizaciones para mi cliente SQL SQuirreL v 3.4.0, y desde entonces que ya no funciona.

Para no perder tiempo, mejor instalar la última versión disponible (la 3.5.2). Pero para eso, mejor desinstalemos antes la vieja versión.

Los pasos son sencillos:

1º Abrir la consola.

2º Cambiarnos al directorio del desinstalador. Por ejemplo:
cd squirrel-sql-3.4.0/Uninstaller

3º Ejecutar el desinstalador:
java -jar uninstaller.jar



Con lo anterior, desaparece al menos tanto del sistema de archivos, como de la lista de aplicaciones de Ubuntu.

Y eso es todo. Luego podemos instalar la nueva versión, de modo semejante a lo sugerido acá.

***
Antes de desinstalar, notemos que opciones de la instalación previa existen en este archivo:


Que nos puede servir de guía al momento de instalar la nueva versión (los paquetes instalados).

***How to uninstall SQuirrel SQL Client?

domingo, 29 de julio de 2012

Instalar Yacy en Ubuntu

Problema


Al momento presente, la manera corriente de acceder a la información dispersa en internet es por medio de un motor de búsqueda. Una situación típica se da cuando iniciamos nuestro navegador y la página de inicio es, por ejemplo, Google, y entonces a través de ella accedemos incluso a la web del banco, de la universidad, etc., porque nos da flojera ingresar la URL manualmente, además de páginas web con información cuyas URLs no conozcamos previamente.

El problema se da porque unas pocas empresas (algunas de ellas controladas por dictaduras de corte totalitario, como el caso del buscador chino Baidu) ejercen un oligopolio de facto sobre qué información recibimos de vuelta cuando buscamos algo, cediendo muchas veces a presiones comerciales, políticas, entre otras, que sesgan negativamente nuestro acceso a la información.

Actualmente Google, seguido de Yahoo y Bing, concentran la mayor parte de las búsquedas en la web:



Una solución


Una de las posibles soluciones (no necesariamente la mejor) es emplear un buscador web descentralizado, que hace uso de la programación distribuida al estilo P2P. En este caso, probaremos Yacy.


Instalación y configuración básicas

Es sencillo; esto fue lo que yo hice:

Descargué el archivo comprimido desde la web de Yacy.

2º Descomprimí los archivos dentro de mi carpeta personal. En mi caso quedaron en /home/juan/yacy

3º Añadí el script que inicia Yacy (localizada en mi caso en /home/juan/yacy/startYACY.sh) como una aplicación que inicia con el sistema:


4º Configuré mi router para que los demás pares en la red puedan interactuar conmigo:


5º Finalmente compruebo acá si el puerto 8090 está funcionando:

Antes de configurar router Después de configurar router

6º Reiniciar el equipo; el demonio de Yacy entonces estará activo.


7º Configurar algunas características básicas de Yacy por medio del navegador: http://localhost:8090/ConfigBasic.html

8º Añadir a los marcadores de mi navegador la URL local del buscador web de Yacy: http://localhost:8090/index.html

Eso es todo por ahora.

jueves, 21 de junio de 2012

Solucionando un problema multi-objetivo usando un algoritmo genético

El problema

El problema abstracto

Un problema de optimización multi-objetivo a resolver empleando un algoritmo genético o una estrategia evolutiva.

El problema concreto

Hallar la mejor ruta para recorrer todas y cada una de 20 ciudades, pasando a lo más una vez por cada una y retornando a la ciudad de origen, minimizando:
  1. Distancia total recorrida.
  2. Riesgo total incurrido.

El problema en detalle

Pueden ver los detalles del problema a resolver en este enlace.


Solucionando el problema

Usamos un algoritmo genético, y lo siguiente:

Un nuevo enfoque de optimización multi-objetivo

Al menos para mí lo es, ya que en una simple inspección no encontré referencias al respecto en el ámbito de la computación evolutiva y la ideé por mi cuenta (sin embargo es muy probable que alguien más ya haya pensado esto en problemas de optimización en general...)

Una imagen vale más que mil palabras:


Hemos considerado la función objetivo g1 como el eje de las ordenadas, y la función objetivo g2 como el eje de las abscisas. En este plano vive la función r, que dependiendo del individuo x y la ponderación o importancia que damos a g1 o g2 para evaluarle, traza un arco de elipse.

Ahora veamos la siguiente imagen:






  • Hemos trazado los arcos de elipse completos de varios individuos, obteniendo las elipses respectivas.
    • En verde la del mejor individuo hipotético, rojo la del peor individuo hipotético, amarillo y café para individuos buenos en un objetivo y malos para el otro, y en azul la de un individuo que es bueno en ambos objetivos.
    • Mientras mejor cumpla un individuo ambos objetivos, más circular será el arco trazado (asumiendo que los objetivos están a la misma escala).
  • Ninguna elipse puede salir del círculo de radio 1, por la forma en que construimos las funciones g1 y g2.
  • Toda elipse de cualquier individuo:
    • Está circunscrita por la elipse del peor individuo hipotético.
    • Circunscribe la elipse del mejor individuo hipotético.
  • ¿Qué caracteriza la elipse del mejor individuo respecto a la del peor individuo?
    • Su área es muchísimo menor (inicialmente se me vino a la cabeza la longitud del arco, pero no existe una fórmula simple para calcularla como sí la hay del área.)
      • Se puede, pues, extender la idea, y establecer que un individuo es mejor que otro si el área de su elipse es menor que el área de la elipse del otro.

El área de una elipse de semiejes a y b es PI * a * b, en nuestro caso dado un individuo cualquiera, PI * g1(x) * g2(x). Despreciando la constante a la hora de comparar individuos distintos, nos quedamos con g1(x) * g2(x), que geométricamente es el área del cuadrado formado por los semiejes de la elipse, y sería nuestra función objetivo.
Todo el análisis anterior puede extenderse a más dimensiones: si fueran 3 objetivos, pensaríamos en el volumen de las elipsoides, y con 4+ dimensiones, en el hiper-volumen de las hiper-elipses.


Problema: al implementar esta función objetivo, notamos que los individuos evolucionan haciendo que g2 → 0 en muy pocas generaciones. Entonces la evolución deja de ocurrir porque g(x) = 0 sin importar si el individuo x se acerca o no a 0 en g1.
Solución: Una solución simple es modificar la función objetivo de la siguiente manera

g(x) = (g1(x) + 1)(g2(x) + 1)

Ahora cuando un x llega a 0 por g2, se puede seguir evolucionando.
Esta función tiene como recorrido los reales del 1 al 4.
El efecto geométrico es que la más pequeña de las elipses de un individuo (cuando g1(x) y g2(x) es 0) es un círculo de radio 1, y la optimización consistiría en que elipses de semiejes con valores entre 1 y 2 tratan de acercarse a este círculo ideal.

Las ventajas de este enfoque son:

  • No hay que efectuar modificaciones adicionales a un algoritmo genético estándar.
  • Es simple y fácil de calcular.
  • No hay que preocuparse de las ponderaciones, ya que implícitamente considera todas las ponderaciones posibles.
  • Se puede escalar a más dimensiones.

Para mayores detalles de cómo solucionamos este problema, pueden abrir este enlace.

La solución

La solución es un programa en Java.
He aquí el código y un manual de usuario.

Evaluación de la solución

Nos alegra haber nuevamente generado la mejor solución (he borrado los apellidos de mis compañeros para preservar su privacidad):


Estoy consultando porqué nos bajaron una décima en la sección parámetros de ejecución, que es en esencia lo mismo de este otro problema en donde sacamos máxima calificación.
...
Se corrigió el malentendido, así que nos subieron a un 7,0.







***
Esperando que a alguien le sirva esta información, saluda cordialmente,

Juan Carlos San Martín

miércoles, 13 de junio de 2012

Solucionando el clásico problema del vendedor viajero paralelizando usando paso de mensajes

Resumen


Se resuelve el problema del vendedor viajero, en su versión asimétrica (Asymmetric TSP) mediante la técnica de paso de mensajes asíncronos, la cual, junto con el paso de mensajes sincrónicos, llamadas a procedimientos remotos (RPC) y rendezvous son los cuatro mecanismos básicos para comunicación y sincronización de programas distribuidos.

El problema se paralelizó no mediante programas distribuidos, sino que mediante hilos de una misma aplicación Java, para lo cual tuvimos que simular el paso de mensajes asíncronos entre ellos.

Problema


Se trata del problema del vendedor viajero en su versión asimétrica, cuya mayor diferencia respecto del problema del vendedor viajero clásico es que las distancias de ida y de vuelta entre ciudades pueden tener valores distintos.

Pueden echar un vistazo a los detalles del problema y cómo tendremos que solucionarlo aquí.

Generando una solución 


En resumidas cuentas, la clave de la solución fue la creación de la clase de objetos Canal que implementa la funcionalidad esperada de un canal, en particular los métodos send y receive dispuestos de manera de contar con paso de mensajes asíncronos.

Con lo anterior, el hilo principal de la aplicación echa a correr a 1 hilo administrador más cierta cantidad de hilos trabajadores (cantidad que en nuestro caso definimos como igual a la cantidad de ciudades del problema), que resuelven el problema comunicándose y sincronizándose por medio del envío y recepción de mensajes (algunos de ellos nulos) a través de un par de canales.

Finalmente el hilo administrador manda mensajes nulos que terminan con la vida de los hilos trabajadores, muere a su vez el hilo administrador, y recién entonces el hilo principal exhibe la solución al problema concreto.

Mayores detalles se hallan en la bitácora.

Solución 


La solución al problema es una aplicación en Java 6: pueden consultar el código y probarlo por Uds. mismos; además está el manual de usuario de la aplicación.

Evaluando la solución


La mejor manera de evaluar la solución presentada es comparándola con la solución generada por otros alumnos, que debía resolver este mismo problema.

Debido a que cumplía su propósito de manera estable, fue una de las mejores:



martes, 22 de mayo de 2012

Reducir colores de un video usando k-means en una GPU NVIDIA usando OpenCL sobre CUDA

El problema

Aprovechar las capacidades de procesamiento paralelo de los múltiples unidades de procesamiento de la GPU de la tarjetas de video o los varios núcleos de la CPU de un computador portátil o de escritorio típicos para una aplicación sencilla.

La aplicación sencilla es la reducción de colores de un video, empleando para ello el algoritmo k-means. En la ejecución de este algoritmo debemos aprovechar las capacidades antes mencionadas.

K-means se emplea para determinar los colores con los que se reduce el video. Así, si un video queremos reducirlo a 16 colores, k-means deberá encontrar 16 clusters: el centro de cada cluster es uno de los 16 colores buscados.

Los detalles y especificaciones del problema pueden verse aquí.

El video de prueba que usamos fue un clip de 30 segundos del cortometraje Big Buck Bunny:



La solución

Aprovechamos los 8 núcleos de la GPU de la tarjeta gráfica NVIDIA GeForce 8400 GS instalada en nuestro computador de escritorio. Estos núcleos sirvieron para paralelizar el cómputo de la asignación de cada pixel al cluster más cercano en cuanto a su color RGB, cómputo que es parte de la aplicación del algoritmo k-means para resolver el problema.

En cuanto a la implementación, instalamos CUDA y empleamos el lenguaje C++, trabajando con el IDE Eclipse 3.7.2 sobre Linux 2.6. Se utiliza además OpenCL para la paralelización en la GPU de parte del algoritmo k-means usado en su desarrollo, y las librerías libavcodec, libavformat y libswscale para la decodificación, y llamadas al sistema a la aplicación ffmpeg para la codificación.

He aquí un video de salida reducido a 8 colores:



Y acá un video de salida reducido a 8 colores, pero que luce mejor aprovechando lo que sabemos del frame anterior (iniciamos k-means inicializando los 8 clusters con los 8 colores del frame anterior):



Pueden ver el código acá, un manual de uso aquí, y una bitácora que registró el avance hacia la solución.

Evaluación de la solución

De las 11 personas que tenían que desarrollar una solución, la nuestra fue la mejor:

Valió la pena el esfuerzo. Saludos.

domingo, 13 de mayo de 2012

Solución de un problema de asignación de recursos usando un algoritmo genético

El problema

En abstracto, se trata de un problema de asignación de tiempos de uso de un conjunto de recursos a usuarios de los que sabemos el momento en que llegarán a emplear alguno de los recursos y el tiempo que lo mantendrán ocupado.

En concreto:


 

La solución

La solución al problema anterior debe apegarse a las siguientes especificaciones:




Nuestra solución se implementó con el lenguaje Java.

Archivos

Pueden hallar tanto el enunciado con el problema como los archivos del código que desarrolla la solución en el siguiente vínculo:

https://docs.google.com/open?id=0B9CVXuEYM86qbnBEN0xGcnh4WG8

Evaluación de la solución

La mejor (junto a otras 2) de un total de 16: