miércoles, 28 de abril de 2010

Compilar aplicaciones con glpk en Debian y windows7

Para los desarrolladores y usuarios que estan interesados en Programacion lineal, y software libre se tiene la opcion glpk para linux y glpk para windows

La idea del presente blog es explicar como consegui compilar mi primera aplicacion incluyendo la libreria glpk tanto en debian lenny como en Windows7.

para lenny la instalacion de glpk es sencilla, basta con usar Synaptic e instalar todo lo que tenga que ver con glpk (incluyendo libglpk-dev)

en windows se tiene que bajar el setup de gplk.

Ahora viene lo interesante con los programas compiladores y enlazadores, en mi caso usare Qdevelop tanto para windows como para linux.
antes de todo se debe instalar Qt4 en ambos sistemas, de eso nos ocuparemos en otro blog. Solo comentare que Qdevelop en linux se direcciona automaticamente al la instalacion de Qt realizada, mientras que en windows hay que compilar Qt y luego direccionar a las carpetas Qt creadas.

Si tenemos el mismo codigo siguiente para Lenny y Win

#include "stdio.h"
#include "stdlib.h"
#include "glpk.h"

int main(void)
{     glp_prob *lp;
int ia[1+1000], ja[1+1000];
double ar[1+1000], z, x1, x2, x3;
s1:   lp = glp_create_prob();
s2:   glp_set_prob_name(lp, "sample");
s3:   glp_set_obj_dir(lp, GLP_MAX);
s4:   glp_add_rows(lp, 3);
s5:   glp_set_row_name(lp, 1, "p");
s6:   glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0);
s7:   glp_set_row_name(lp, 2, "q");
s8:   glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0);
s9:   glp_set_row_name(lp, 3, "r");
s10: glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0);
s11: glp_add_cols(lp, 3);
s12: glp_set_col_name(lp, 1, "x1");
s13: glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
s14: glp_set_obj_coef(lp, 1, 10.0);
s15: glp_set_col_name(lp, 2, "x2");
s16: glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
s17: glp_set_obj_coef(lp, 2, 6.0);
s18: glp_set_col_name(lp, 3, "x3");
s19: glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0);
s20: glp_set_obj_coef(lp, 3, 4.0);
s21: ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1]  = 1 */
s22: ia[2] = 1, ja[2] = 2, ar[2] = 1.0; /* a[1,2]  = 1 */
s23: ia[3] = 1, ja[3] = 3, ar[3] = 1.0; /* a[1,3]  = 1 */
s24: ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */
s25: ia[5] = 3, ja[5] = 1, ar[5] = 2.0; /* a[3,1]  = 2 */
s26: ia[6] = 2, ja[6] = 2, ar[6] = 4.0; /* a[2,2]  = 4 */
s27: ia[7] = 3, ja[7] = 2, ar[7] = 2.0; /* a[3,2]  = 2 */
s28: ia[8] = 2, ja[8] = 3, ar[8] = 5.0; /* a[2,3]  = 5 */
s29: ia[9] = 3, ja[9] = 3, ar[9] = 6.0; /* a[3,3]  = 6 */
s30: glp_load_matrix(lp, 9, ia, ja, ar);
s31:  glp_simplex(lp, NULL);
s32:  z = glp_get_obj_val(lp);
s33:  x1 = glp_get_col_prim(lp, 1);
s34:  x2 = glp_get_col_prim(lp, 2);
s35:  x3 = glp_get_col_prim(lp, 3);
s36:  printf("\nz = %g; x1 = %g; x2 = %g; x3 = %g\n", z, x1, x2, x3);
s37:  glp_delete_prob(lp);
return 0;
}/* eof */


En ambos sistemas (Debian y Win) solo nos queda crear un nuevo proyecto vacio en Qdevelop, luego incluir un archivo sample.cpp con el codigo lineas arriba, glpk.h deberia ser llamado automaticamente, en ambos sistemas si esta instalado correctamente glpk, en todo caso se detalla la direccion donde esta instalado en propiedades del proyecto (en en otras palabras en el archivo Makefile en la seccion INCPATH = -I/C:\Program Files\GnuWin32\include).

luego para enlazar la libreria de manera implicita (esta manera pedira los *.dlls requeridos o los *.so en linux para correr la aplicacion, los cuales deben ir junto con el programa) en linux tuve que añadir en las propiedades del proyecto la libreria glpk entonces eso en Makefile.

LIBS          = $(SUBLIBS)  -L/usr/lib -lglpk -lm -lQtGui -lQtCore -lpthread



y en windows se tuvo que añadir la libreria se añade de igual manera solo que ahora se le dice glpk.lib, si no la encuentra poner la libreria en la direccion del codigo (Makefile-Release).

LIBS        =        -L"d:\Qt\4.3.2\lib" glpk.lib -lQtGui4 -lQtCore4


Luego de compilar y correr sin errrores se obtiene lo siguiente en la ventana de Depuracion o Salida.

Depurando...

(gdb) (gdb) (gdb) (gdb) (gdb) Starting program: /home/eangelino/glpkxxx/glpkxxx
[Thread debugging using libthread_db enabled]
* 0: objval = 0.000000000e+00 infeas = 0.000000000e+00 (0)
* 2: objval = 7.333333333e+02 infeas = 0.000000000e+00 (0)


OPTIMAL SOLUTION FOUND

z = 733.333; x1 = 33.3333; x2 = 66.6667; x3 = 0

Program exited normally.



Actualizacion: En windows luego de instalar el glkp solo ejecutables se debe incluir en el Qt, en propiedades del proyecto:

INCLUDEPATH : "C:\Program Files\GnuWin32\include"
LIB : "C:\Program Files\GnuWin32\lib\glpk.lib"

lunes, 1 de febrero de 2010

chm to pdf en debian lenny

Baje un libro en formato chm, el formato es bueno sin embargo para poder leerlo en pdf o en Mobipocket no funciona correctamente.
en fin enconre una solucion en Debian se llama chm2pdf

una herramienta de facil uso, en debian se tiene que instalar previamente.

apt-get install htmldoc libchm-bin python-chm


luego bajar el script chm2pdf-0.9.1.tar.gz

#Descomprimir
tar -xzvf chm2pdf-0.9.1.tar.gz

#Ubicarse en la carpeta.
$:cd chm2pdf-0.9.1.tar.gz

#Instalar
$:python setup.py install

#Finalmente se usa.
$chm2pdf --book ' o puedes usar --webpage


al inicio me daba problemas, yo creo por falta de las librerias, sin embargo lo que hice es crear
las carpetas /tmp/... que hacia referencia el script y funcionaba mediocremente.
al final con todas las librerias, si funciona correctamente.

Finalmente el script nos devuelve un pdf con la informacion.

martes, 12 de enero de 2010

jueves, 10 de septiembre de 2009

Configurar mi mouse G5 logitech en Debian Lenny

Primero que nada hay que revisar que si funciona el mouse al conectarlo al usb

$:lsusb
Bus 005 Device 005: ID 0ac8:c002 Z-Star Microelectronics Corp. Visual Communication Camera VGP-VCC1
Bus 005 Device 004: ID 148f:2573 Ralink Technology, Corp. RT2501USB Wireless Adapter
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 062a:0000 Creative Labs Optical mouse
Bus 001 Device 005: ID 046d:c049 Logitech, Inc. G5 Laser Mouse
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


ok si esta en el Bus001 Device 005

indagando un poco llegue a parar en la web de los linux gamers todo muy bueno mas aun el test que se le puede hacer al dispositivo sin haber instalado nada:


Test del mouse conectado solamente sin funcionar:
Primero ver que evento es el que usa el raton:

$: cat /proc/bus/input/device
..............
I: Bus=0003 Vendor=046d Product=c049 Version=0111
N: Name="Logitech USB Gaming Mouse"
P: Phys=usb-0000:00:1d.0-2/input0
S: Sysfs=/class/input/input2
U: Uniq=
H: Handlers=mouse1 event2
B: EV=17
B: KEY=ffff0000 0 0 0 0 0 0 0 0
B: REL=143
B: MSC=10
...............



luego hay que bajar "evdev-key-btn-test.c" googleando lo encuentras
despues compilarlo

$:gcc -o evdev-key-btn-test evdev-key-btn-test.c


despues probar...

$: evdev-key-btn-test /dev/input/event2
Supported Keys:
Key 0x110 (Left Button)
Key 0x111 (Right Button)
Key 0x112 (Middle Button)
Key 0x113 (Side Button)
Key 0x114 (Extra Button)
Key 0x115 (Forward Button)
Key 0x116 (Back Button)
Key 0x117 (Task Button)
Key 0x118 (Unknown key)
Key 0x119 (Unknown key)
Key 0x11a (Unknown key)
Key 0x11b (Unknown key)
Key 0x11c (Unknown key)
Key 0x11d (Unknown key)
Key 0x11e (Unknown key)
Key 0x11f (Unknown key)
Buttons/Keys: 16

Supported Relative axes:
Relative axis 0x00 (X Axis)
Relative axis 0x01 (Y Axis)
Relative axis 0x06 (Horizontal Wheel)
Relative axis 0x08 (Vertical Wheel)


En fin bueno despues de romperme la cabeza pensando que faltaba instalar el driver evdev y buscando recompilar xorg con sdk y demas cosas, encontre buscando que ya tenia el bendito driver instalado... :) el genial Lenny ya lo tenia.

bueno siguiente paso solo modificar el archivo /etc/X11/xorg.conf

incluyendo las siguientes lineas.

Section "InputDevice"
Identifier "Configured Mouse"
Driver "evdev"
Option "CorePointer"
Option "Name" "Logitech USB Gaming Mouse"
Option "Device" "/dev/input/event2"
Option "ZAxisMapping" "4 5 6 7"
Option "Emulate3Buttons" "false"
EndSection


luego reiniciar el ordenador y ya esta funcionando... todos los botones.
bueno todavia me falta mapear a medida los botones del mouse lo cual incluire en el siguiente post.



otra solucion mucho mas simple es modificar este ultimo archivo /etx/X11/xorg.conf con lo siguiente

Section "InputDevice"
Identifier "Mouse0"
Driver "evdev"
Option "evBits" "+1-2"
Option "keyBits" "~272-287"
Option "relBits" "~0-2 ~6 ~8"
Option "Pass" "3"
EndSection


esto uiltimo lo obtuve aqui

sábado, 20 de junio de 2009

Ardour en DEBIAN Lenny con Audigy 2 ZS Notebook

Entre mis cosas pendientes tenia el configurar mi tarjeta de Sonido PC card Audigy 2 zs, siendo que mi primer intento de configurarla en Windows Vista fue infructuoso, pues no hay controlador adecuado. Al tener una partición dedicada enteramente a Debian. conecte la tarjeta y con sorpresa pude ver que Debian Lenny levanta esta tarjeta sin ningún problema tiene el controlador y todo.

Cuando quise escuchar no puede hacerlo apesar que se veia conectada se comprueba con

$ cat /proc/asound/cards
0 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0xb0000000 irq 20
1 [Audigy2 ]: Audigy2 - Audigy 2 ZS Notebook [SB0530]
Audigy 2 ZS Notebook [SB0530] (rev.0, serial:0x20011102) at 0x2400, irq 20

Investigando puede averiguar que ALSA utiliza el dispositivo que se le indica como por defaul, asi como alsamixergui (este te sirve para saber que dispositivo esta funcionando). en este caso el 0.
Buscando por Internet encontre que se debe poner alguna configuracion para que arranque la Audigy por defaul. consistia en crear un archivo asound.conf y ponerlo en /etc/
con el siguiente texto. (archivo /etc/asound.conf)

$ nano /etc/asound.conf
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
donde el 1 le indica que utlice la Audigy por default. De esta manera pude escuchar por primera vez por mi tarjeta Audigy sonido almacenado se escucha muy bien.

Bueno el paso siguiente era utilizar la tarjeta para por ejemplo capturar sonido externo... ejem Guitarra, sonido etc. buscando un manejar de sonido al estilo SONAR u otro di a para con "Ardour"
excelente programa para grabaciones multitrack y para modificar grabaciones.

Ejecute Ardour y no pude conseguir nada, ni siquiera escuchar algo, otra vez a buscar informacion, dia enterarme que Ardour usa para manejar sonido un programa (servidor de sonido), llamado JACK. Luego probando JACK bastante pues al inicio al igual que alsa este programa solo ejecuta con la tarjeta interna de la laptop y no con la Audigy. Finalmente di a parar con un archivo que configura JACK (este archivo se sobre escribe al ejecutar y modificar opciones en qjackctl) se llama .jackdrc (archivo oculto!)... por cierto todo lo hice en consola root.

$nano /root/.jackdrc
/usr/bin/jackd -dalsa -dhw:1 -r44100 -p1024 -n8

Asi al arrancar qjackctl JACK utiliza la Audigy.

Hasta ahi todo bien.. luego aprendi que para utilizar el servidor de sonido JACK por ejemplo con alsaplayer se necesita un comando en la consola.

$alsaplayer -o jack

le dice al programa que ejecute con jack como servidor de sonido, es decir utilice la Audigy para reproducir, bueno asimismo. Ya que ardour utliza jack para sonido, Ardour tambien puede ver lo que alsaplayer este

- Conecciones para utilizar la tarjeta con ALsaplayer, jack, ardour, microfono.
qjackctl
alsaplayer -o jack
ardour2 &