OpenArena con Ubuntu

OpenArena es la versión opensource (GPL) de Quake 3 Arena, con todos los recursos: gráficos, texturas, sonidos, etc. reemplazados por unos completamente libres.

Para probar OpenArena en Linux Ubuntu es necesario desactivar el Compiz, de lo contrario el ratón funciona incorrectamente con el rango de movimientos limitado.

Para solucionar se debe ejecutar a OA con el siguiente script que hace lo mencionado, desactivar Compiz, ejecutar la aplicación y activar Compiz nuevamente al terminar la ejecución.

#!/bin/bash
metacity --replace &
cd /{OPENARENA_PATH}/
./openarena.i386
compiz --replace &

Enlace: OpenArena FAQ.

Obtener lecturas de un GPS USB desde Java/C#

La tarea del día de hoy era obtener la posición actual desde un GPS utilizando Java o C#.  Para esto contaba con un GPS Garmin eTrex Summit HC que por supuesto cuenta con un puerto USB.

Extrañamente concluyo que no hay un método confiable ni portable para leer información desde los puertos USB para ninguno de los dos lenguajes.  Para Java encontré varias librerías pero aún inmaduras o con soporte para sólo un sistema operativo, prefiero el soporte para Windows y Linux por lo menos.  Para C# igual horizonte, nativamente aún no es soportado como si lo es el SerialPort y la mejor opción parece ser #usblib de los mismos creadores de SharpDevelop, sin embargo no pude encontrar un ejemplo que indicara su viabilidad.

Con este oscuro panorama terminé explorando un estilo de solución que no es de mi mayor agrado: el ejecutar aplicaciones de terceros para obtener y procesar su salida estándar.

Para esto instalé un software muy útil llamado GPSBabel el cual se puede descargar para Windows, Linux y Mac, incluyendo su código fuente escrito en lenguaje C.  La distribución de Linux está basada en RPM los cuales no fueron instalables en mi estación de trabajo basada en Ubuntu, sin embargo se encuentra disponible el paquete para instalarse desde la distribución de paquetes de Ubuntu.

El comando gpsbabel permite obtener desde línea de comando la información contenida en el GPS, incluyendo por supuesto, su ubicación actual.

$ sudo /usr/bin/gpsbabel.exe -i garmin,get_posn -f usb:

El resultado es algo de este estilo: (probado desde Armenia/Qundío)

4.536692N 75.669346W Position/Position

Extrañamente la distribución de Windows incluye además la fecha/hora de la ejecución, hecho que en Linux no sucede.

Wed Sep 10 22:42:46 2008
4.536692N 75.669346W Position/Position

La aplicación intermedia fue desarrollada en C# debido a la afinad de mi compañero de desarrollo con ese lenguaje.  Fue interesante para aprender algunos detalles particulares del lenguaje a los cuales nos vimos enfrentados durante el desarrollo.

Lo que hice fue crear un método estático (AccesoGPSBabel.obtUbicacionActual) que basado en la ubicación del comando gpsbabel retorna un Hashtable con la latitud/longitud actual o null en caso de suceder algún problema.

La ejecución del programa externo se realiza mediante un objeto System.Diagnostics.Process al cual se le indica la ubicación del archivo ejecutable, los argumentos de línea de comando y se le informa que estamos interesados en obtener su salida estándar.  La aplicación (o un enlace a) gpsbabel deberá estar ubicada en el mismo directorio del ejecutable de la aplicación principal, incluyendo el archivo libexpat.dll para la versión de Windows.

            System.Diagnostics.Process proc = new System.Diagnostics.Process();

            proc.EnableRaisingEvents = false;

            proc.StartInfo.FileName = aplicacion;

            proc.StartInfo.Arguments = "-i " + protocolo + ",get_posn -f usb:";

            proc.StartInfo.RedirectStandardOutput = true;

            proc.StartInfo.UseShellExecute = false;

            proc.Start();

Para recibir la información proveniente de la salida estándar se obtiene su StreamReader de la siguiente manera.

            String datos = proc.StandardOutput.ReadToEnd().Trim();

Su procesamiento no se aleja de la carpintería normal del manejo de cadenas con String.Split junto con un detalle adicional, la información aparece con el posfijo N/S, W/E; yo prefería que fuera un solo valor numérico siendo positivo o negativo según su ubicación con respecto a la referencia, tal y como lo maneja GoogleMaps y otros paquetes similares.

Para esto, al procesar las líneas recibidas de la salida estándar recorté la subcadena de manera que no tomara el último carácter de las coordenadas.

            latitud     = secciones[0].Trim().Substring(0, secciones[0].Length - 1);

            latitudDir  = secciones[0].Trim().Substring(secciones[0].Length - 1, 1);

            longitud    = secciones[1].Trim().Substring(0, secciones[1].Length - 1);

            longitudDir = secciones[1].Trim().Substring(secciones[1].Length - 1, 1);

Y después las multipliqué por su inverso aditivo en los casos en que correspondiera.

            Double Latitud = Double.Parse(latitud) * ((latitudDir.Equals("S")) ? -1 : 1);

            Double Longitud = Double.Parse(longitud) * ((longitudDir.Equals("W")) ? -1 : 1);

Sucedió un problema.  El método Double.Parse estaba convirtiendo erróneamente los valores porque el GPS los enviaba con el punto como separador decimal y la Configuración Regional de la máquina Windows que estabamos utilizando usaba la coma.

Como la intención era que la aplicación no sólo funcionara entre diferentes configuraciones regionales sino que lo hiciera también entre diferentes sistemas operativos (Linux con Mono) me dediqué a buscar una solución portable.

Para esto se obtiene al separador decimal basado en la configuración regional del sistema operativo.

            String separadorDecimal = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;

Se realiza la corrección de separadores (de punto al utilizado por la configuración regional local) antes de manipular los datos con el Double.parse.

            latitud = secciones[0].Trim().Substring(0, secciones[0].Length - 1).Replace('.', separadorDecimal[0]);
            longitud = secciones[1].Trim().Substring(0, secciones[1].Length - 1).Replace('.', separadorDecimal[0]);

Con esto se solucionó el problema.  Para terminar, se utilizó un Hashtable para almacenar la información y retornársela al objeto que la solicitó.

            resultado.Add("latitud", Latitud);
            resultado.Add("latitudDireccion", latitudDir);
            resultado.Add("longitud", Longitud);
            resultado.Add("longitudDireccion", longitudDir);

Esta no es la solución que pensaba darle al problema, sin embargo la implementación fue interesante y gracias a la flexibilidad que provee gpsbabel, espero que sea funcional con una amplia gama de dispositivos, no solamente con los de la marca Garmin.

De todas formas me queda pendiente la tarea de buscar la forma de acceder directamente al puerto USB para leer su informacion en forma de cadenas NMEA, la cual me parece la solución menos dependiente posible de su entorno.

Enlace: Distribución con las fuentes del proyecto (C# basado en MonoDevelop).

Cliente para MSSQL desde Linux

Uno de los proyectos que estoy desarrollando requiere de la conexión a una base de datos Microsoft SQL Server 7 cuya instancia de desarrollo se encuentra instalada en un equipo Windows XP.  Solucionado anteriormente la conexión desde el servidor web con OpenSuse, ahora el problema es como administrar la base de datos sin utilizar la consola que obviamente se ejecuta en Windows unicamente.

Para esto encontré la aplicación SQuirrel SQL que se encuentra desarrollada en Java y soporta por supuesto, conexiones con cualquier base de datos que tenga soporte por un controlador JDBC.

Después de instalada en mi escritorio, descargué al controlador JDBC para MSSQL y lo copié bajo el directorio /lib de la aplicación.  Para mi caso: /home/jimezam/SQuirreL SQL Client/lib.  Los controladores JDBC para MSSQL pueden obtenerse desde la siguiente ubicación.

http://msdn.microsoft.com/en-us/data/aa937724.aspx

Al ejecutar la aplicación aparece activo el Driver Microsoft MSSQL Server JDBC Driver con un chulito azul.  Con esto, se crea la conexión a la base de datos: Aliases > New Alias.

Name Nombre de la conexión o alias a la base de datos.
Driver Microsoft MSSQL Server JDBC Driver
URL jdbc:sqlserver://HOST;databaseName=NAME;
User Name Nombre del usuario de la conexión
Password Contraseña de conexión
Auto logon [seleccionado]
Connect at Startup [seleccionado]

Otra aplicación Java/JDBC que instalé fue ThinkUI SQL Client (free for personal) la cual me había funcionado bien hasta que empecé a notarle pequeños detalles que desenamoran como el hecho de no mostrarme todos los registros retornados por una consulta sino los primeros x.  Espero tener una mejor experiencia con este nuevo cliente.

Sincronización de Pidgin con Twitter

Para sincronizar el mensaje de estado del Pidgin con la última actualización del Twitter estoy utilizando el plugin TwitterStatus de aaronds109.

La instalación es muy sencilla y se encuentra bien documentada en su Wiki.

1. Verificar que Pidgin tenga activo el soporte para Perl.

En Pidgin desplegar el menú Help > About y buscar la cadena Perl: Enabled.

2. Instalar la librería XML/XPath de Perl.

$ sudo perl -MCPAN -e shell

(Utilizar las opciones por defecto o las que se consideren necesarias)

get XML::XPath

make XML::XPath

test XML::XPath

install XML::XPath

3. Copiar el plugin al directorio de plugins de Pidgin en la cuenta del usuario.

$ mkdir ~/.purple/plugins/

$ cp twitter.pl ~/.purple/plugins/

4. Activar el plugin en Pidgin.

Acceda al menú Tools > Plugins y active a Twitter Status.

Presione el botón Configure Plugin y especifique en el campo Twitter Username su nombre de usuario Twitter.

Enlaces:

Instalando XUbuntu

En la Fundación no sólo cambiaron mi puesto de trabajo sino que formatearon mi equipo debido a un terrible virus que les atacó en mi ausencia, así que decidí instalar XUbuntu en mi estación de trabajo.  Decisión difícil ya que OpenSUSE 11 ya está en las calles y yo estoy que lo instalo.

Después de un par de horas de  instalado me ha parecido funcional.  Siempre he cosiderado que menos es mas y prefiero tener justamente lo que necesito a tener un montón de cosas que ni sabía que estaban instaladas y por ende nunca utilicé.

Hasta ahora he extrañado el seleccionar múltiples íconos del escritorio con el ratón.  El escritorio de XFCE no me deja hacerlo 😛

Otro problema que tuve fue con la resolución de la pantalla.  Después de activar los controladores de la tarjeta NVidia serie 7 y reiniciar la resolución máxima que podía seleccionar era de 1024×768.  Arreglé este problemita ejecutando gksudo displayconfig-gtk, seleccionando un monitor adecuado (LCD Panel 1280×1024)  y reiniciando el equipo.

Actualizacion del driver de NVidia despues de actualizar a Ubuntu 8.04

Al actualizar el Linux Ubuntu de uno de mis equipos a la version 8.04 el controlador de NVidia dejó de funcionar.  Después de algunas pruebas en la manaña logré instalarlo nuevamente.

La actualización de Ubuntu instaló dos kernels diferentes que se seleccionan al inicio del sistema operativo con el GRUB: uno de servidor (server) y otro de estación de trabajo (generic).  Algo para hacer notar es que el controlador sólo pudo ser instalado al iniciarse el sistema operativo utilizando el kernel de estación de trabajo, ya que de lo contrario el paquete de NVidia terminaba siempre fallando diciendo que el kernel tiene soporte para Xen y que por ese motivo no podía continuar.

Para instalar el controlador se siguieron los pasos descritos a continuación.

1. Utilizando Synaptic (System > Administration > Synaptic Package Manager) se desinstaló cualquier paquete anterior relacionado con NVidia.  Especialmente nvidia-glx, nvidia-settings y nvidia-kernel-common.

2. Del sitio de controladores de NVidia se descargó la distribución adecuada para mi estación de trabajo:

Tipo de producto: GeForce.
Serie de producto: GeForce 7 series.
Sistema operativo: Linux 32-bit.
Idioma: English (US).

3. Para la instalación del controlador es necesario que se detenga el sistema de ventanas.

# sudo /etc/init.d/gdm stop

4. El paquete se descomprime y se ejecuta como root.  Se responde afirmativamente a las preguntas formuladas por el instalador.

# sudo chmod +x ./NVIDIA-Linux-x86-173.14.05-pkg1.run

# sudo ./NVIDIA-Linux-x86-173.14.05-pkg1.run

5. Se reinicia la máquina para tomar en cuenta las modificaciones realizadas.  Recuérdese que se debe inciar el sistema operativo utilizando el kernel generic.

# sudo reboot

6. Se utiliza el módulo de Screen Resolution (System > Preferences > Screen Resolution) para especificar la resolución que se desee.  Para mi caso se utilizaron los siguientes valores.

Resolution: 1280 x 1024.
Refresh Rate: 64 Hz.
Rotation: Normal.

Para la instalación del paquete de controladores de NVidia es posible que se requiera la instalación del servidor de módulos restringidos, para esto ejecute el siguiente comando.

# sudo apt-get install linux-restricted-modules-server

Otro método que se puede intentar en caso de tener problemas con el descrito anteriormente es el de utilizar el paquete EnvyNG el cual permite descargar, instalar y desinstalar los controladores para las tarjetas marca NVidia y ATI.

Como listar los paquetes instalados

Operating system Main command List installed packages
Linux (RedHat like distribution) rpm rpm -qa
Linux Debian dpkg dpkg -l
Linux (Slackware distribution) pkgtool pkgtool
ls -l /var/log/packages/
Cygwin Graphic installer (“setup.exe”) cygcheck -c
Solaris pkginfo pkginfo
grep xxx /var/sadm/install/contents
Irix versions versions
Compaq (Digital) Unix setld setld -i
AIX lslpp lslpp -l
HP-UX swlist swlist

Tomado de http://www.fortran-2000.com/ArnaudRecipes/Version.html.

Ver información adicional en Rosetta Stone for Unix.

Cambiar las contraseñas del sistema operativo y Samba a través de web

Otro problema que surge al intentar hacer en las empresas lo que mencioné en el post anterior con Samba, es que se manejan dos tipos de contraseñas que deben administrarse por separado: /etc/passwd y /etc/samba/smbpasswd; además su actualización debe hacerse desde la consola, hecho que para los usuarios, incluyendo a la mayoría de personajes de sistemas, es difícil o tedioso. Por eso busqué que software libre me permite actualizar estas contraseñas de manera unificada, simple y desde web.

Extrañamente sólo encontré una solución: ChangePassword alojada en http://changepassword.sourceforge.net/.

ChangePassword permite actualizar las contraseñas de Linux, Samba y Squid (en la Fundación no se utiliza) a través de una interfaz web generada por un CGI.

Su instalación es muy simple.

1. Descargue y descomprima el archivo changepassword-xx.tar.gz. En este momento la versión actual es la 0,9.

2. Edite el archivo conf.h con la información relacionada con la presentación: color de fondo, tipo de fuente, etc.

3. Ejecute el comando configure especificando la información de idioma, el logo, la ubicación del directorio de CGIs, la ubicación del archivo smbpasswd y del archivo de contraseñas de Squid.

./configure –enable-cgidir=/srv/www/cgi-bin
–enable-language=Spanish
–enable-smbpasswd=/etc/samba/smbpasswd
–disable-squidpasswd
–enable-logo=imagenes/logo_fdq.png

La ubicación del logo se referencia desde la raíz del sitio web.

El idioma se toma según los archivos contenidos en el directorio /languages de la distribución.

Después se dan los consabidos make y make install.

El archivo que se debe consultar para actualizar las contraseñas se ubica en:

http://SERVIDOR/cgi-bin/changepassword.cgi

Actualmente estoy recibiendo el mensaje: “No pude renombrar el archivo de contraseñas temporal.” (“Could not rename the temporary password file“), del cual no he podido encontrar su solución 🙁 Le escribí un mensaje al desarrollador a ver si me ayuda con su significado.

La dirección de correo electrónico del desarro

Controlando la máscara con Samba 3

Samba es uno de mis servicios preferidos en *NIX. Sirve para casi todo 😉

Hoy instalé y configuré en 10 minutos el servicio DHCP en el servidor UNO de la Fundación, para probar los equipos con direccionamiento dinámico ya que hasta ahora lo han manejado estático, configurando equipo por equipo. Esto porque dicen, lo cual es extrañamente muy cierto, que la red de Windows algunas veces no responde por nombre y por ello requieren conocer la IP específica de los equipos para poder acceder a los recursos compartidos.

El experimento es pasar las máquinas a direcciones dinámicas (con DHCP) y dentro de sus parámetros se especifica al servidor UNO como servidor de WINS, el cual es provisto por Samba.

Otro servicio que intento que los usuarios de Sistemas utilicen es el acceder a sus directorios HOME para que almacenen allí archivos importantes, incluyendo al directorio public_html donde puedan publicar documentos directamente en la web. En especial, que lo utilicen para el desarrollo de los proyectos y no utilicen versiones desactualizadas en sus equipos o sin los parámetros necesarios, como pasó hace poco, con el register_globals en on :-s.

Activar el servicio de WINS es muy sencillo:

wins support = yes

Con esto me surgió un pequeño problema, los archivos y directorios creados por los usuarios a través de las carpetas compartidas no quedaban con los permisos apropiados para poder ser consultados a través de web.

Una búsqueda rápida en la documentación de Samba me ayudó a encontrar las siguientes líneas que añadidas a la sección global del archivo /etc/samba/smb.conf asignan los permisos apropiados (al menos para mi caso).

force create mode = 0755
force directory mode = 0755

Mas información acerca de las opciones de control de acceso a los archivos, directorios y recursos compartidos se pueden consultar en en capítulo 16 del HOWTO oficial.