Instalación de Windows XP en un netbook desde una unidad USB

Introducción.

Instalar Windows XP en una netbook (portátil liviano sin unidad de DVD) desde una memoria USB no fue tan fácil y placentero como fue la instalación de Windows 7.  Después de algunas pruebas estos fueron los pasos que se siguieron.

Crear la unidad USB de instalación.

Para crear la unidad USB de instalación se utilizó WinToFlash.  Este procedimiento es muy simple, sólo se debe especificar cual es la unidad en la que se encuentran los archivos (CDROM) de instalación de Windows y cual es la unidad (USB) hacia la cual se realizará la copia.

Instalación del sistema operativo.

Una vez creada la unidad USB de instalación se debe iniciar el sistema desde ella y realizar normalmente los pasos de instalación de Windows XP.

Corregir el inicio de la unidad USB.

Finalizada la instalación del sistema operativo se intenta reiniciar y falla mostrando un error relacionado con la falta de archivos del sistema, comúnmente hal.dll.  Esto aparentemente se debe a que el instalador consideró a la unidad USB  como primer disco y al disco duro real como segundo, generando estas referencias incorrectas en el archivo boot.ini.

Para corregir esto es necesario editar este archivo y modificar la referencia a la partición en la que buscará al sistema operativo durante su inicio.  Por facilidad (para mi) utilicé un Linux (Peppermint) que inicia desde LiveUSB que casualmente tenía preparado para otra prueba.  En el ambiente Windows  imagino que se requerirá de un disco de arranque que permita acceder a través de la consola de texto a los comandos básicos del DOS.

Este es un ejemplo de boot.ini en el que se supone que hay un Windows XP Home Edition instalado en la primera partición del primer disco duro del equipo (como habitualmente sucede).

[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS=”Microsoft Windows XP Home Edition” /fastdetect

El parámetro rdisk (marcado en rojo) es el que se genera incorrectamente y aparece inicialmente con el valor de 1 (segundo disco duro).

Cambiar la ruta de los archivos de instalación.

Una vez superado el problema anterior el sistema operativo deberá iniciar sin problemas.  De manera opcional elegí copiar los archivos del sistema operativo al disco duro del netbook para que estén disponibles si se hace necesaria la instalación de algún componente adicional sin que se necesite insertar nuevamente la unidad USB preparada al comienzo de este procedimiento.

Para lograr esto además de copiar físicamente los archivos del CDROM de instalación al un directorio del disco duro, es necesario actualizar la referencia que tiene el sistema operativo de esta ruta.  Para hacer esto se debe ejecutar el programa regedit (hágalo como Administrador si obtiene problemas de permisos) y acceda a la siguiente rama en el panel izquierdo.

HKEY_LOCAL_MACHINE > Software > Microsoft > Windows > CurrentVersion > Setup.

Ubicado en esa rama identifique la variable SourcePath en el panel derecho y modifique su valor a la ruta absoluta donde se encuentra el directorio i386 de los archivos de instalación de Windows: c:instaladoreswindowsxpi386 en mi caso específico.

Google Chrome y los puertos inseguros: ERR_UNSAFE_PORT

Introducción.

Aparentemente Google Chrome incluye características de seguridad obligatorias como esta que impide que el usuario acceda a servidores a través de ciertos puertos considerados inseguros aunque eso sea realmente lo que se desea.

Error puertos inseguros de Google Chrome
Error puertos inseguros de Google Chrome

A continuación se define el procedimiento necesario para indicarle a Chrome que efectivamente se desea acceder a esos puertos.

Procedimiento.

La única opción es indicarle a Chrome desde el momento de su ejecución cuales son los puertos que se consideran seguros para permitir conexiones mas allá de los estándar.  Para hacer esto es necesario indicar el parámetro –explicitly-allowed-ports seguido por la lista de puertos separados por comas.  Por ejemplo:

$ /usr/bin/google-chrome –explicitly-allowed-ports=4444,5555,6666

Por facilidad, especialmente en la plataforma Windows, se recomienda modificar el acceso directo a la aplicación para que la modificación perdure.

Modificar la contraseña del usuario root de MySQL 5

Introducción.

El procedimiento que se describe a continuación permite modificar la contraseña del usuario administrador (root)  de MySQL 5.  Es útil para los casos en que esta se olvida y por lo tanto ya no es posible acceder a sus funciones de administración.

Procedimiento.

Detener el servicio si se está ejecutando actualmente.

# service mysql5 stop

Iniciar el servicio con el modificador de skip-grant-tables.

# mysqld_safe –skip-grant-tables &

Realizar una conexión al motor de base de datos a través de la herramienta de línea de comando.

# mysql -u root

Realizar la actualización de la contraseña.  Téngase en cuenta que se deberá modificar la palabra NUEVO_PASSWORD por la nueva contarseña que se desee asignar al usuario root.

mysql> use mysql;
mysql> update user set password=PASSWORD(“NUEVO_PASSWORD”) where User=’root’;
mysql> flush privileges;
mysql> quit

Detener el servicio

# service mysql5 stop

Iniciarlo normalmente.

# service mysql5 start

Instalar Eclipse y el plugin ADT en GNU/Linux

Introducción.

Para el desarrollo de aplicaciones en Android además de la instalación del SDK es necesario instalar Eclipse como ambiente de desarrollo -oficial- y el plugin ADT para su interacción con Android.

Obtener Eclipse.

Distribuciones de Eclipse
Distribuciones de Eclipse

Descargar de la siguiente ubicación una distribución de Eclipse que corresponda con el sistema operativo y arquitectura donde se desee instalar.  Para el desarrollo de aplicaciones con Android se recomienda utilizar la distribución clásica o la de Java, sin que esto aparentemente sea obligatorio.

http://eclipse.org/downloads/

Instalar Eclipse.

La instalación de Eclipse consiste únicamente en desempaquetarlo y ubicarlo en la ruta donde finalmente residirá.

$ tar zxvf eclipse-java-helios-SR2-linux-gtk.tar.gz

$ mv eclipse ~/

Instalar el plugin ADT.

Iniciar Eclipse y seleccionar la opción Install new software… del menú Help.

Presionar el botón Add… (esquina superior derecha) y especificar los siguientes valorses.

  • ADT Plugin como Name.
  • https://dl-ssl.google.com/android/eclipse/ como Location.
Agregar un repositorio a Eclipse
Agregar un repositorio a Eclipse

Seleccionar la casilla de verificación de la rama Developer Tools.

Paquete Developer Tools del plugin ADT de Eclipse.
Paquete Developer Tools del plugin ADT de Eclipse.

Presione el botón Next en los dos diálogos siguientes.  Seleccione la opción I accept the terms of the license agreements y presione el botón Finish para terminar el procedimiento.  Reinicie Eclipse cuando este lo solicite.

Configurar el plugin ADT.

En Eclipse acceda al diálogo de preferencias a través del menú Window > Preferences.

Seleccione la opción Android en el árbol del lado izquierdo.

Presione el botón Browse… y ubique el directorio de instalación del Android SDK si este no aparece correctamente.  Presione el botón Apply y finalmente Ok.

Preferencias del plugin ADT
Preferencias del plugin ADT

Enlaces.

Recuperar la sesión de Firefox

Introducción.

Firefox tiene una característica que permite recuperar el conetenido de su sesión (las pestañas abiertas) aún después de que ha ocurrido un problema grave de ejecución como es el caso cuando el proceso termina abruptamente o el equipo se apaga sin cerrarse convenientemente.

La siguiente vez que se utiliza Firefox, este permite elegir si se desea iniciar una nueva sesión o si por el contrario se desea restaurar la versión anterior.

Yo acostumbro aprovechar esta característica para trabajar en ciertas páginas web durante varias sesiones sin tomar nota de sus URLs, confiando en que la restauración de sesión las abrirá nuevamente.  Esto ha sido confiable salvo algunas pocas oportunidades en las cuales he perdido la sesión, especialmente molesto cuando por error propio presiono el botón de iniciar una nueva sesión en lugar del de restaurar.

Por suerte Firefox permite recuperar la copia de seguridad de la sesión aún si se ha decidido iniciar una nueva.  El procedimiento es muy simple y se explica a continuación.

Procedimiento.

Tan pronto como se desee recuperar la copia de seguridad de la sesión anterior escribir en la barra de direcciones la siguiente instrucción.

about:sessionrestore

La última sesión disponible se recuperará inmediatamente restaurando las pestañas que se tenía abiertas.

La configuración de la restauración de sesión permite ajustar otros comportamientos relacionados como el forzar a que siempre se restaure la sesión si hay una disponible, restaure automáticamente la siguiente sesión únicamente o desactivar esta característica.

Enlaces.

Descubrir equipos cercanos con Processing y bluetoothDesktop

Introducción.

En el presente artículo se describe el proceso de instalación de la librería bluetoothDesktop en GNU/Linux (para Windows es similar) que permite manipular el módulo de Bluetooth del dispositivo donde se ejecuta el sketch y con ella se implementa el procedimiento para detectar dispositivos cercanos que utilicen este protocolo de comunicaciones.

Obtener la librería.

Descargar la versión disponible mas reciente en el sitio web del proveedor.

http://www.extrapixel.ch/processing/bluetoothDesktop/download.html

Instalación de la librería.

Descomprimir el paquete recién descargado.

Mover el directorio bluetoothDesktop/ al directorio de librerías de Processing en ~/sketchbook/libraries/.  El resultado se deberá apreciar de la siguiente manera.
$ ls -l ~/sketchbook/libraries/bluetoothDesktop/

drwxr-xr-x 5 jimezam jimezam 4096 2010-12-08 22:47 examples
-rw-r–r– 1 jimezam jimezam  910 2007-12-17 21:25 howto.txt
drwxr-xr-x 3 jimezam jimezam 4096 2010-12-08 23:09 library
drwxr-xr-x 2 jimezam jimezam 4096 2010-12-08 22:47 src

Remover los siguientes archivos ubicados bajo el directorio ~/sketchbook/libraries/library/.

  • libavetanaBT.so
  • export.txt
  • bluecove-2.0.2-snapshot.jar
  • avetanaBT_readme.txt
  • avetanaBT.jar

Copiar en es mismo directorio los siguientes archivos que pueden obtenerse del sitio web de Bluecove.

  • bluecove-x.x.x.jar
  • bluecove-gpl-x.x.x.jar (requerido para Linux).

El contenido final de ese directorio se aprecia de la siguiente manera.

$ ls -l ~/sketchbook/libraries/bluetoothDesktop/library/

-rw-r–r– 1 jimezam jimezam 547156 2010-12-08 21:27 bluecove-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  89022 2010-12-08 21:26 bluecove-gpl-2.1.0.jar
-rw-r–r– 1 jimezam jimezam   9409 2007-11-14 19:01 bluetoothDesktop.jar

Implementación.

Importar el paquete principal de la librería.

import bluetoothDesktop.*;

Crear un objeto para hacer referencia al dispositivo de Bluetooth.

Bluetooth bluetoothInstance = new Bluetooth(this);

Iniciar el proceso de descubrimiento de dispositivos cercanos.

bluetoothInstance.discover();

Implementar el método deviceDiscoverEvent el cual es llamado cada vez que un nuevo dispositivo Bluetooth es detectado.

void deviceDiscoverEvent(Device dev)
{
    println("Discovering ... name=" + dev.name + "; address=" + dev.address);
}

Implementar el método deviceDiscoveryCompleteEvent el cual es llamado una única vez al terminarse el proceso de descubrimiento.

void deviceDiscoveryCompleteEvent(Device[] devices)
{
  println("I Found " + devices.length+ " devices.");

  for(int i=0; i<devices.length; i++)
  {
    println(i + "# name=" + devices[i].name + "; address=" + devices[i].address);
  }
}

Aplicación de demostración.

Aplicación de demostración - Descubrir dispositivos Bluetooth cercanos
Aplicación de demostración - Descubrir dispositivos Bluetooth cercanos

Enlaces.

Laberinto 0.2 controlado por wiimote

Introducción.

Preparando un mejor ejemplo para el uso del wiimote con Processing decidí actualizar la versión procedimiental del Laberinto que utilicé como demostración en una charla hace un par de meses.

Con esta mejora es posible conectar el wiimote al sketch y controlar con él al caballero en busca de su tesoro mas preciado: la princesa 🙂  Adicionalmente el wiimote vibrará cuando el caballero se encuentre con ella.

El movimiento del caballero es controlado por el d-pad mientras que el botón de inicio (home) lo teletransporta y el botón #1 reinicia el juego.

Implementación.

Como primera instancia es necesario tener instaladas las librerías requeridas para el uso del wiimote con Processing.

A continuación se realizan las siguientes modificaciones al código base del sketch.

Se importa el paquete de las clases relacionadas con el wiimote.

import lll.wrj4P5.*;

Se establece una referencia global al control.

Wrj4P5 wii;

En el setup se establece la conexión con el wiimote.

void setup()
{
    // ...
    wii = new Wrj4P5(this);
    wii.connect();
}
Se implementa el método buttonPressed para manejar los eventos provenientes del control con la lógica que se mencionó anteriormente: d-pad controla la dirección, home teletransporta al jugador y el botón #1 reinicia el juego.
void buttonPressed(RimokonEvent evt, int rid)
{
  if (evt.wasPressed(RimokonEvent.LEFT))
    moverJugador(LEFT);

  if (evt.wasPressed(RimokonEvent.RIGHT))
    moverJugador(RIGHT);

  if (evt.wasPressed(RimokonEvent.DOWN))
    moverJugador(DOWN);

  if (evt.wasPressed(RimokonEvent.UP))
    moverJugador(UP);

  if (evt.wasPressed(RimokonEvent.ONE))
    reset();

  if (evt.wasPressed(RimokonEvent.HOME))
    teletransportarJugador();
}

La verificación del encuentro entre la princesa y el caballero se realiza en el método moverJugador y sucede cuando la nueva ubicación del caballero no es una pared && es un tesoro, en ese momento se ejecuta la siguiente instrucción para hacer vibrar el control.

wii.rimokon.vibrateFor(400);

Enlaces.

Utilizar el wiimote con Processing en Ubuntu 10.10

Introducción.

En el presente artículo se describen las librerías necesarias para acceder a la información proveniente de un wiimote desde sketches desarrollados en Processing y se implementa un sketch simple para verificar su funcionamiento.

Obtener e instalar las librerías requeridas.

Obtener los siguientes archivos.

wrj4P5 (alpha-011) http://sourceforge.jp/projects/wrj4p5/releases/ wrj4P5.jar
Loc (beta-005) http://sourceforge.jp/projects/wrj4p5/releases/ Loc.jar
WiiRemoteJ (1.6) http://www.world-of-cha0s.hostrocket.com/WiiRemoteJ/ WiiRemoteJ v1.6.zip.gz
BlueCove (2.1.0) http://code.google.com/p/bluecove/downloads/list bluecove-gpl-2.1.0.jar
bluecove-2.1.0.jar

Crear el directorio libraries/wrj4P5/library bajo el directorio de los sketches del usuario.  En mi caso, bajo ~/sketchbook.

$ mkdir ~/sketchbook/libraries/wrj4P5/library

Copiar los siguientes archivos a la ruta recién creada.

  1. bluecove-2.1.0.jar
  2. bluecove-gpl-2.1.0.jar (requerido para Linux)
  3. Loc.jar
  4. WiiRemoteJ.jar
  5. wrj4P5.jar

Con las versiones utilizadas el contenido del directorio queda de la siguiente manera.

$ ls -l ~/sketchbook/libraries/wrj4P5/library

-rw-r–r– 1 jimezam jimezam 547156 2010-12-08 21:27 bluecove-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  89022 2010-12-08 21:26 bluecove-gpl-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  34765 2010-12-08 21:44 Loc.jar
-rw-r–r– 1 jimezam jimezam  91091 2009-03-12 12:00 WiiRemoteJ.jar
-rw-r–r– 1 jimezam jimezam  39825 2010-12-08 21:40 wrj4P5.jar

Además es necesario contar (en mi caso) con las siguientes librerías del repositorio de Ubuntu.

  • bluez
  • libbluetooth3
  • libbluetooth3-dev

Crear un sketch de demostración.

Para esto se utiliza el código fuente del sketch MyFirstWii.

Sketch de demostración
Sketch de demostración

Crear un nuevo sketch en el PDE (File > New) y copie el código fuente de demostración.  Ejecute el sketch para probar el código (Sketch > Run).

Para conectar el wiimote al sketch presione al tiempo los botones 1 y 2 del wiimote por un momento.

Conclusiones iniciales.

  • Sería interesante tener mas control e información acerca del proceso de conexión con el wiimote.
  • La lectura de los botones del wiimote funciona muy bien.
  • La lectura del acelerómetro parece ser incorrecta y el cubo de la demostración gira sin control.
  • Será necesario hacer mas pruebas con estas librerías, incluyendo otras versiones de las mismas.

Enlaces.

Manejar los errores fatales en PHP

Introducción.

Los errores fatales son problemas críticos de los cuales no es posible recuperar la ejecución del programa, por esta misma razón no pueden ser manejados como excepciones con bloques try/catch.

A pesar de que no es posible recuperar un programa después de un error fatal, si es posible realizar ciertas acciones de cierre que pueden ser útiles para mostrar un mensaje de error mas amigable y realizar el registro del error para su futura revisión, evitando que el lenguaje o el framework que se esté utilizando muestre un error difícil de comprender para el usuario final.

Ejemplo.

Un caso de error fatal es el producido por la recursión infinita.

function f($i)
{
 return f($i+1);
}

f(1);

El código anterior generará el siguiente mensaje de error de PHP.

Fatal error: Maximum function nesting level of '100' reached, aborting! in php shell code on line 3

Call Stack:
 12.0763      62388   1. {main}() php shell code:0
 12.0764      62548   2. f() php shell code:1
 12.0904      62772   3. f() php shell code:3
 12.0905      62996   4. f() php shell code:3
 12.0905      63220   5. f() php shell code:3
 12.0905      63444   6. f() php shell code:3
 12.0905      63668   7. f() php shell code:3
 ...

Implementación del manejo.

Desactivar la funcionalidad de PHP para mostrar los errores al usuario.

ini_set('display_errors', 0);

Registrar la función que se va a ejecutar durante el cierre de la ejecución de la aplicación.

register_shutdown_function('shutdown');

Realizar la implementación de la función de cierre.  En ella se filtran los diferentes tipos de error y se implementan, en este caso, únicamente los errores fatales.

function shutdown()
{
 if(!is_null($e = error_get_last()))
 {
  if($e['type'] == E_ERROR)
  {
    // ... implementación ...
  }
 }
}

Enlaces.

Transformaciones gráficas con Processing

Introducción.

Este fin de semana me tomé un rato para jugar con Processing, esta vez con las transformaciones gráficas que hacía tiempo estaba postergando por mis múltiples actividades pereza.

Como en todos los demás lenguajes, en Processing es posible trasladar un objeto sumando valores a sus respectivas coordenadas.  Processing además facilita esto con un método mas elegante, en lugar de trasladar las coordenadas del objeto se traslada el orígen del plano y se grafica con referencia a este orígen.  Esta técnica no sólo es útil para trasladar sino que también puede utilizarse para rotar y escalar los graficos.

Estas modificaciones alteran la matriz de transformación actual, esto quiere decir que afectarán igualmente a las invocaciones posteriores.  Para limitar esto se utilizan las funciones pushMatrix y popMatrix que permiten almacenar y posteriormente recuperar las matrices de transformaaciones originales.

Implementación.

Traslación.

Como mencioné, la técnica consiste en trasladar el orígen del plano a la nueva coordenada.

translate(nuevoX, nuevoY);

Y desde allí generar el grafico con coordenadas respecto al orígen.

rect(-ancho/2, -alto/2, ancho, alto);

Con este ejemplo se obtendrá un rectángulo cuyo centro será (nuevoX, nuevoY).

Rotación.

El ángulo de rotación se indica en radianes (ver radians) y su rango de valores va desde 0 hasta 2*PI.

rotate(angulo);

La rotación realiza el traslado del orígen así que se hace necesario ubicarla en su posición final como se mencionó antes.

Escalamiento.

El índice de escalamiento se indica como un número real (1.5 = 150%) y sus valores van desde 0 hasta infinito.

scale(nivel);

Igual que con la rotación, con el escalamiento se hará necesario ajustar la ubicación del grafico trasladándolo como se mencionó inicialmente.

Demostración.

Demostración de transformaciones con Procesing
Demostración de transformaciones con Processing

En este sketch de demostración se pueden utilizar las transformaciones mencionadas mediante las siguientes teclas.

Flechas del cursor
Ubicación del puntero del ratón
Movimiento del carro
q Terminar el sketch (aplicación)
r Reiniciar el sketch
s, d Girar la imagen
a, z Manipular el nivel de acercamiento
w Mostrar el rectángulo de la imagen
e Mostrar el grafico de la imagen

Enlaces.