Category Archives: Windows

Georreferenciando de manera fácil y simple con GeoNames utilizando C#/Mono

Introducción.

Últimamente he tenido ganas de desarrollar en C# para retomar este lenguaje que tengo un poco abandonado y al mismo tiempo probar los avances que ha tenido el proyecto Mono.  Que mejor inicio que desarrollar una aplicación muy simple para georreferenciar ciudades aprovechando el servicio web de Geonames, esta a su vez me servirá para complementarla y solucionar un problema de información que tengo para otro proyecto.

Como se podrá apreciar, el código es muy sencillo ya que no utilizo ninguna librería adicional a las estándar, sin embargo es interesante y puede serle de utilidad a alguien mas.

Cuál es la necesidad ?

El problema que se tiene es la necesidad de georreferenciar ubicaciones, es decir, conociendo su nombre obtener su ubicación en términos de latitud y longitud.

Si estoy en Manizales, Caldas, Colombia estaré realmente en latitud 5.07, longitud -75.52056.

Es necesario tener en cuenta que muchas veces el servicio de georreferenciación retorna múltiples resultados ya que pueden haberse referenciado varios sitios con el mismo nombre, haberse cambiado el nombre de la ubicación o tenerse varios hitos de diferente nivel administrativo.  En Geonames esto último se identifica mediante los campos de características.  Consulte el sitio web de Geonames para mas información acerca de los feature codes.

Cómo es el servicio web ?

El servicio web de búsquedas de Geonames recibe una cadena de texto con la ubicación que se desea georreferenciar y retorna una cadena de texto en formato XML (en este caso) con los resultados obtenidos.

Por ejemplo, la consulta de Manizales, Caldas, Colombia se realizaría a través del siguiente URL.

http://ws.geonames.org/search?lang=es&type=xml&style=FULL&q=Manizales,Caldas,Colombia

Retornará el siguiente resultado.

<geonames style="FULL">
    <totalResultsCount>2</totalResultsCount>
    <geoname>
        <toponymName>Manizales</toponymName>
        <name>Manizales</name>
        <lat>5.07</lat>
        <lng>-75.52056</lng>
        <geonameId>3675443</geonameId>
        <countryCode>CO</countryCode>
        <countryName>Colombia</countryName>
        <fcl>P</fcl>
        <fcode>PPLA</fcode>
        <fclName>city, village,...</fclName>
        <fcodeName>seat of a first-order administrative division</fcodeName>
        <population>357814</population>
        <alternateNames>Manisales,Manisalesas,Manizales,Манисалес</alternateNames>
        <elevation/>
        <continentCode>SA</continentCode>
        <adminCode1>37</adminCode1>
        <adminName1>Caldas</adminName1>
        <adminCode2/>
        <adminName2/>
        <alternateName lang="en">Manizales</alternateName>
        <alternateName lang="pl">Manizales</alternateName>
        <alternateName lang="lt">Manisalesas</alternateName>
        <alternateName lang="bg">Манисалес</alternateName>
        <alternateName lang="cs">Manizales</alternateName>
        <alternateName lang="link">http://en.wikipedia.org/wiki/Manizales</alternateName>
        <alternateName lang="de">Manizales</alternateName>
        <alternateName lang="sv">Manizales</alternateName>
        <alternateName lang="es">Manizales</alternateName>
        <alternateName lang="no">Manizales</alternateName>
        <alternateName lang="pt">Manizales</alternateName>
        <timezone dstOffset="-5.0" gmtOffset="-5.0">America/Bogota</timezone>
        <score>1.0</score>
    </geoname>
    <geoname>
        <toponymName>Manizales</toponymName>
        <name>Manizales</name>
        <lat>5.08333</lat>
        <lng>-75.5</lng>
        <geonameId>3675444</geonameId>
        <countryCode>CO</countryCode>
        <countryName>Colombia</countryName>
        <fcl>A</fcl>
        <fcode>ADM2</fcode>
        <fclName>country, state, region,...</fclName>
        <fcodeName>second-order administrative division</fcodeName>
        <population/>
        <alternateNames/>
        <elevation/>
        <continentCode>SA</continentCode>
        <adminCode1>37</adminCode1>
        <adminName1>Caldas</adminName1>
        <adminCode2>3675444</adminCode2>
        <adminName2>Manizales</adminName2>
        <timezone dstOffset="-5.0" gmtOffset="-5.0">America/Bogota</timezone>
        <score>0.3448537290096283</score>
    </geoname>
</geonames>

Finalmente la tarea de la aplicación que consuma el servicio será procesar el documento XML y obtener la información que necesite.

Cómo es la implementación ?

Las librerías (namespaces) utilizados son los siguientes.

using System;
using System.Net;
using System.Text;
using System.Xml;
using System.Collections.Generic;

Se prepara el URL para consumir el servicio con la ubicación a geocodificar.  En este caso, especifico una por defecto si no suministra una.

string location = (args.Length == 0) ? "Manizales, Caldas, Colombia" : args[0];
string url = "http://ws.geonames.org/search?lang=es&type=xml&style=FULL&q=" + location;

Se consume el servicio web y se obtiene la cadena de texto con la respuesta en formato XML.

WebClient client = new WebClient();
string xml = client.DownloadString(url);

Se crea un objeto para manipular el documento XML recién recibido, se obtienen los nodos relacionados con la respuesta de la georreferenciación (geoname)  y se verifica que haya registros, de lo contrario no habrá nada que hacer.

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNodeList geonames = doc.GetElementsByTagName("geoname");
if(geonames.Count == 0)
 throw new Exception("There is no geonames in the result!");
else
 Console.WriteLine("I found " + geonames.Count + " places!\n");

Se recorren los resultados obtenidos extrayéndoles la información georreferenciada que se requiera.

foreach(XmlElement place in geonames)
{
 Console.WriteLine("* LUGAR: " + place["name"].InnerText + "\n");
 Console.WriteLine("\tNombre: "          + place["name"].InnerText);
 Console.WriteLine("\tDepartamento: "    + place["adminName1"].InnerText);
 Console.WriteLine("\tLatitud: "         + place["lat"].InnerText);
 Console.WriteLine("\tLongitud: "        + place["lng"].InnerText);
 Console.WriteLine("\tPaís: "            + place["countryName"].InnerText +
                   " (" + place["countryCode"].InnerText + ")");
 Console.WriteLine("\tPoblación: "       + place["population"].InnerText + " habitantes");
 Console.WriteLine("\tPaís: "            + place["countryName"].InnerText +
                   " (" + place["countryCode"].InnerText + ")");
 Console.WriteLine("\tCaracterísticas: " + place["fcl"].InnerText + "/" + place["fcode"].InnerText +
                   "> " + place["fclName"].InnerText + " (" + place["fcodeName"].InnerText + ")");
 Console.WriteLine();
}

Cómo construyo el programa ?

Si se utiliza VisualStudio/MonoDevelop sólo es necesario abrir la solución (incluída en el paquete de demostración) y ejecutar el comando de Build o Run del menú.

Si se desea realizar manualmente deberá ejecutarse un comando como el siguiente.

$ gmcs "/out:GeoCoderSimple.exe" "/r:/usr/lib/mono/2.0/System.dll" "/r:/usr/lib/mono/2.0/System.Xml.dll" /t:exe "geonames_search_raw/Main.cs"

Donde geonames_search_raw/Main.cs es el código fuente de la aplicación y GeoCoderSimple.exe será el archivo binario resultante.

Cómo ejecuto el ejemplo ?

Ya sea invocándolo desde el IDE o desde línea de comando, el programa recibe un argumento.  En caso de obviarse este argumento se utilizará el valor por defecto.

$ ./GeoCoderSimple.exe

I found 2 places!
* LUGAR: Manizales
 Nombre: Manizales
 Departamento: Caldas
 Latitud: 5.07
 Longitud: -75.52056
 País: Colombia (CO)
 Población: 357814 habitantes
 País: Colombia (CO)
 Características: P/PPLA> city, village,... (seat of a first-order administrative division)
* LUGAR: Manizales
 Nombre: Manizales
 Departamento: Caldas
 Latitud: 5.08333
 Longitud: -75.5
 País: Colombia (CO)
 Población:  habitantes
 País: Colombia (CO)
 Características: A/ADM2> country, state, region,... (second-order administrative division)

Enlaces.

Acceder al escritorio remoto de GNU/Linux Ubuntu 10.04 utilizando FreeNX

Introducción.

Después de experimentar el acceso al escritorio remoto de GNU/Linux a través de XDMCP (con Xephyr y como una terminal) encontré que los resultados fueron satisfactorios pero con algunas desventajas: la seguridad y la velocidad.  En pocas palabras no es prudente utilizar XDMCP en un ambiente diferente a LAN ya que su tráfico no está encriptado y el puerto abierto puede convertirse en un problema de seguridad.

Por esta razón decidí probar un software muy conocido pero que nunca utilizado.  FreeNX es la versión libre del NXServer de NoMachine, el cual es descrito de la siguiente manera en su sitio de Launchpad.

NX technology is a computer program that handles remote X Window System connections, and attempts to greatly improve on the performance of the native X11 protocol to the point that it can be usable over a slow link such as a dial-up modem … The open source alternative to NoMachines's commercial NX Server.

En términos generales me gustaron mucho los resultados, es rápido y aparentemente seguro (su tráfico se envía a través de SSH). El servidor inclusive puede servir de proxy para acceder a servidores RDP (Windows), VNC o de impresoras mediante los paquetes freenx-rdp, freenx-vnc y freenx-smb respectivamente.

En la instalación, a pesar de no ser compleja, encontré un par de bugs para Ubuntu 10.04 que fueron resueltos.  Este procedimiento se describe a continuación.

Instalar el servidor.

Instalar los paquetes.

$ sudo aptitude install python-software-properties

$ sudo add-apt-repository ppa:freenx-team

$ sudo aptitude update

$ sudo aptitude install freenx-server

Crear las llaves de acceso (opcional).

Como mencioné inicialmente, FreeNX utiliza el protocolo SSH para su transporte, por este motivo puede aprovechar la riqueza de opciones de autenticación que provee este servicio.  Por defecto el servidor instala una pareja de llaves por defecto, utilizarlas constituye un riesgo de seguridad.  Por este motivo se sugiere que se creen y popularicen las llaves propias.  Si la seguridad no es una preocupación, puede obviar este paso y continuar con la instalación del cliente.

Si recibe un mensaje de error al ejecutar nxsetup indicándole que el comando no fue encontrado, realice primero los pasos descritos en la sección de solución de problemas.

$ sudo sudo /usr/lib/nx/nxsetup –install

——> It is recommended that you use the NoMachine key for
easier setup. If you answer "y", FreeNX creates a custom
KeyPair and expects you to setup your clients manually.
"N" is default and uses the NoMachine key for installation.

Do you want to use your own custom KeyPair? [y/N] y
Setting up /etc/nxserver …done
Generating public/private dsa key pair.
Your identification has been saved in /etc/nxserver/users.id_dsa.
Your public key has been saved in /etc/nxserver/users.id_dsa.pub.
The key fingerprint is:
90:d2:6b:93:58:35:09:7b:e4:cd:43:db:83:9b:e2:bf root@jimezam-notebook
The key's randomart image is:
+–[ DSA 1024]—-+
|      ..+..      |
|     . *.= +     |
|    . * o * o    |
|     + =   + .   |
|    . = S o      |
|     . o .       |
|        .        |
|         .       |
|          E.     |
+—————–+
Setting up /var/lib/nxserver/db …done
Setting up /var/log/nxserver.log …done
Adding user "nx" to group "utmp" …done
Setting up known_hosts and authorized_keys2 …Unique key generated; your users must install

/var/lib/nxserver/home/.ssh/client.id_dsa.key

on their computers.
done
Setting up permissions …done
Setting up cups nxipp backend …
cp: `/usr/lib/cups/backend/ipp' and `/usr/lib/cups/backend/ipp' are the same file

Copie la llave a los equipos cliente, la cual posteriormente podrá ser importada desde el cliente de NX.

$ sudo scp /var/lib/nxserver/home/.ssh/client.id_dsa.key usuario@mi-cliente:~/client.id_dsa.key

Después de importada la llave en el cliente de NX de mi-cliente, se recomienda que remueva el archivo ~/client.id_dsa.key.

Crear nuevas llaves (Servidor)

Es posible que por motivos de seguridad posteriormente desee crear nuevas llaves para reemplazar las existentes después de una cierta cantidad de tiempo.  Para hacer esto ejecute el siguiente comando.

$ sudo dpkg-reconfigure freenx-server

Seleccione el tipo de llaves a utilizarse, utilice la opción Create new custom keys para crear un nuevo par.

Selección del tipo de llaves

Selección del tipo de llaves

Seleccione el tipo de autenticación a utilizarse, en este caso se utilizará el servicio SSH.

Selección del tipo de autenticación

Selección del tipo de autenticación

Finalmente transmita la nueva llave a los clientes para permitirles acceder nuevamente al servidor.

Instalar el cliente.

Instalar el paquete.

Descargue el paquete correspondiente a su sistema operativo de la siguiente dirección.

http://www.nomachine.com/select-package-client.php

Para este caso, Ubuntu 10.04 de 64 bits, se descargo el paquete NX Client DEB for Linux – x86_64.  A continuación se instala el paquete recién descargado.

$ sudo dpkg -i nxclient_3.4.0-7_x86_64.deb

CUPS Printing Backend

The NX Client set-up procedure detected that your "IPP CUPS" printing
backend doesn't allow printing from the NX session. In order to have
printing support in your NX system, you need to set proper permissions
on the IPP backend. Please execute:

chmod 755 /usr/lib/cups/backend/ipp

$ sudo chmod 755 /usr/lib/cups/backend/ipp

Ejecutar el cliente.

$ /usr/NX/bin/nxclient &

Crear una nueva cuenta de conexión con el asistente (cliente).

Presione el botón Next para iniciar el asistente de creación de cuentas.

Iniciar el asistente de creación de cuentas

Iniciar el asistente de creación de cuentas

Especifique la siguiente información relacionada con la conexión al servidor.

  • Session: nombre de la sesión (a gusto del usuario).
  • Host: dirección IP o nombre del servidor FreeNX.
  • Port: puerto donde se está ejecutando el servicio SSH.
  • Connection Type: tipo de acceso a la red, en este caso es una red LAN.
Información de conexión al sevidor

Información de conexión al sevidor

Especifique la siguiente información relacionada con el administrador de ventanas a ejecutarse en el servidor.

  • Tipo: en este caso será una conexión nativa (Unix) y se ejecutará GNOME.
  • Size: se permite utilizar el máximo tamaño disponible.
Información del escritorio

Información del escritorio

Presione el botón Finish para terminar el asistente.

Finalizar la instalación

Finalizar la instalación

Realizar una conexión con el servidor.

Registro de usuarios

Registro de usuarios

Seleccione el tipo de sesión (Session) que se creó anteriormente a través del asistente y especifique su información de autenticación (Login y Password) para acceder al servidor.  Presione el botón Login para iniciar la sesión.

Si el servidor cuenta con sus propias llaves personalizadas (ver proceso de instalación) será necesario importarlas en el cliente para poder registrarse exitosamente (ver siguiente apartado).

Importar las llaves del servidor en el cliente.

Si el servidor cuenta con sus propias llaves personalizadas (que es lo mas conveniente) es necesario importarlas en el cliente para que se realice exitosamente la conexión al mismo.  Para esto es necesario transferir la llave (client.id_dsa.key) de manera segura desde el servidor hasta el cliente (ver comando scp en la instalación del servidor).

Para importar el archivo de llave seleccione editar la configuración de la sesión presionando el botón Configure del diálogo de registro (ver anterior).

Configuración de sesión

Configuración de sesión

Presione el botón Key… e importe o pegue la llave proveniente del archivo client.id_dsa.key traído desde el servidor.  Después de importado se recomienda que remueva de manera segura este archivo.

Importar llave

Importar llave

Solución de problemas.

No existe la aplicación nxsetup.

Si obtiene el siguiente mensaje de error, el paquete de freenx-server no incluyó erróneamente la aplicación nxsetup la cual es necesaria para realizar su instalación completa.

nxsetup: command not found

Para corregir este problema realice los pasos descritos a continuación.

$ cd /usr/lib/nx

$ sudo wget "https://help.ubuntu.com/community/FreeNX?action=AttachFile&amp;do=get&amp;target=nxsetup.tar.gz"

$ sudo mv "FreeNX?action=AttachFile&amp;do=get&amp;target=nxsetup.tar.gz" nxsetup.tar.gz

$ sudo tar zxvf nxsetup.tar.gz

$ sudo rm nxsetup.tar.gz

Enlaces.

Charla introducción a Processing en 2010/09

La semana anterior tuve una charla con algunos ingenieros de sistemas de la ciudad de Armenia (Quindío) en la cual los introduje al lenguaje de programación Processing.

La charla se dividió en dos sesiones cortas cuya finalidad era explicar el lenguaje desde la perspectiva de los usuarios (para qué sirve) como desde la perspectiva de los desarrolladores (cómo se usa).  En la primera sesión se trataron las siguientes preguntas básicas.

  1. Qué es ?
  2. Qué se puede hacer con él ?
  3. Cómo se obtiene ?
  4. Cómo se instala ?
  5. Cómo es su ambiente de desarrollo ?
  6. Hola Mundo Processing.
  7. Cómo se exporta el sketch ?

Para esto preparé una presentación estilo documento muy resumido con la información mas importante del lenguaje y vínculos para ampliar estos conocimientos.

En la segunda sesión de la charla se realizó una rápida introducción al API del lenguaje de programación y se realizó paso a paso un ejemplo práctico básico para ejemplificar parte de la funcionalidad mas utilizada del lenguaje: el sketch Laberinto.

Ejemplo práctico de demostración del lenguaje Processing

El ejemplo práctico quedó documentado en dos versiones: una versión procedimental que es mas simple, fácil de entender pero menos elegante y una versión orientada a objetos un poco mas elaborada, ambas con la misma funcionalidad.

El applet del laberinto puede ser accedido mediante el siguiente enlace.

http://demo.jorgeivanmeza.com/Processing/Laberinto/0.1/applet/

Las teclas que deben utilizarse en el sketch son las siguientes.

  • Flechas del cursor: mover al jugador.
  • R: reiniciar el juego.
  • Espacio: teletransportar al jugador.

El código fuente del sketch, tanto de la versión prcedimiental como el de la orientada a objetos, puede ser descargado de la siguiente ubicación.

http://demo.jorgeivanmeza.com/Processing/Laberinto

Recuperar el GRUB de GNU/Linux Ubuntu 10.04 después de instalar Windows

Introducción.

Después de instalar Windows sucedió lo que se esperaba, el MBR del disco duro fue sobreescrito por el instalador y el GRUB fue removido.  Como consecuencia de esto ya no es posible acceder a Linux, únicamente a Windows.

Este es el procedimiento necesario para recuperar el GRUB de un GNU/Linux Ubuntu 10.04 instalado previamente a la instalación de Windows 7.

Recuperar el GRUB.

Para hacer esto es necesario iniciar el equipo con una versión en vivo de GNU/Linux Ubuntu 10.04, esto se logra con el CD de instalación o con su respectiva LiveUSB.  Se debe especificar durante su inicio que la intención es la de probar el sistema operativo mas no de instalarlo nuevamente.

A continuación es necsario identificar cual es el disco y la partición raíz (donde se encuentre /boot) de GNU/Linux. La forma mas simple de hacer esto es utilizando el administrador de unidades y medios (Disk Utility) ejecutando el siguiente comando o seleccionando el menú System > Administration > Disk Utility.

$ /usr/bin/palimpsest

Particiones del disco duro

Particiones del disco duro

En este caso, el directorio raíz se encuentra en la partición 5 del primer disco duro, es decir, su dispositivo es /dev/sda5.

Desde una terminal se procede a montar la partición mencionada anteriormente con mediante als siguientes instrucciones.

$ mkdir /tmp/raiz

$ sudo mount /dev/sda5 /tmp/raiz

Finalmente se solicita que se recree el GRUB en el MBR basado en la información encontrada.

$ sudo grub-install –root-directory=/tmp/raiz /dev/sda

Importante: es necesario tener en cuenta que el GRUB se crea sobre el disco duro elegido (sda), no sobre una partición específica (sda5).

Al reiniciar el sistema operativo ya deberá aparecer el GRUB permitiéndole elegir cual de los sitemas operativos registrados iniciar.

Agregar Windows a la lista de selección.

En este caso primero instalé Ubuntu y después instalé Windows lo que motivó en primera instancia que se perdiera el MBR.  Esto trae consigo un problema secundario: al recuperar el GRUB este no contiene una referencia a Windows ya que cuando fue creado aún no se había instalado el segundo sistema operativo.

Para solucionar este problema se deben instalar las herramientas del GRUB de la siguiente manera.

$ sudo aptitude install grub-pc

Con ellas, cada vez que se actualice su información se revisarán las particiones existentes en búsqueda de nuevos sistemas operativos que se configurarán automáticamente para aparecer en el GRUB la próxima vez que se reinicie el sistema.

$ sudo update-grub2

Para este caso específico, la partición de Windows 7 (NTFS) corresponde con el dispositivo /dev/sda2 motivo por el cual se agrega automáticamente la siguiente opción en el archivo /boot/grub/grub.cfg.

menuentry "Windows 7 (loader) (on /dev/sda2)" {
insmod ntfs
set root='(hd0,2)'
search –no-floppy –fs-uuid –set 4a3c22f43c22db29
chainloader +1
}

Preparar una unidad USB de instalación de Windows 7 utilizando GNU/Linux

Introducción.

En algunos casos se necesita instalar Windows como sistema operativo en máquinas que no disponen de una unidad lectora de CD/DVD, tal es el caso de los netbooks actuales.  Windows a diferencia de algunas versiones de Linux como Ubuntu, no incluye una herramienta para crear instaladores del sistema operativo en memorias USB, sin embargo los pasos que se deben seguir para crearlas no son complejos.

A continuación se detalla el procedimiento necesario para crear unidades USB con los instaladores de Windows utilizando un equipo con GNU/Linux Ubuntu 10.04 (en general, cualquier distribución de Linux servirá).

Requerimientos.

  • Un computador con GNU/Linux.
  • Una unidad de DVD.
  • Una memoria USB de por lo menos 3GB.
  • Un DVD de instalación de Windows 7 (probablemente funcionen también otras versiones).

Procedimiento.

Determinar el dispositivo que corresponde a la memoria USB.

Insertar la memoria en un puerto USB libre y ejecutar el siguiente comando.

$ dmesg | tail -20

[16590.915054] scsi10 : SCSI emulation for USB Mass Storage devices
[16590.915460] usb-storage: device found at 7
[16590.915466] usb-storage: waiting for device to settle before scanning
[16592.371732] usb 2-1: USB disconnect, address 7
[16603.750099] usb 2-2: new high speed USB device using ehci_hcd and address 8
[16603.902794] usb 2-2: configuration #1 chosen from 1 choice
[16603.913861] scsi11 : SCSI emulation for USB Mass Storage devices
[16603.922229] usb-storage: device found at 8
[16603.922232] usb-storage: waiting for device to settle before scanning
[16608.923049] usb-storage: device scan complete
[16608.923986] scsi 11:0:0:0: Direct-Access              MIMOBOT          0.00 PQ: 0 ANSI: 2
[16608.927668] sd 11:0:0:0: Attached scsi generic sg2 type 0
[16608.929715] sd 11:0:0:0: [sdb] 7892087 512-byte logical blocks: (4.04 GB/3.76 GiB)
[16608.936095] sd 11:0:0:0: [sdb] Write Protect is off
[16608.936106] sd 11:0:0:0: [sdb] Mode Sense: 00 00 00 00
[16608.936113] sd 11:0:0:0: [sdb] Assuming drive cache: write through
[16608.941652] sd 11:0:0:0: [sdb] Assuming drive cache: write through
[16608.941659]  sdb: sdb1
[16609.210304] sd 11:0:0:0: [sdb] Assuming drive cache: write through
[16609.210316] sd 11:0:0:0: [sdb] Attached SCSI removable disk

Desomntar el dispositivo que referencia a la unidad USB.

$ umount /dev/sdb1

Crear una partición para los archivos de instalación.

$ sudo fdisk /dev/sdb

Verificar si existen particiones previas en la unidad.

Command (m for help): p

Disk /dev/sdb: 4040 MB, 4040748544 bytes
125 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 7750 * 512 = 3968000 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006a77a

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            1        1018     3944719   83  Linux

En este caso existe una partición previa (sdb1), se procede a removerla.

Remover las particiones existentes.

Command (m for help): d
Selected partition 1

Crear una nueva partición para los archivos de instalación.

Se procede a crear una nueva partición que ocupe la totalidad del espacio de la unidad USB, en este caso 4GB.

Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1018, default 1): [Enter]
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1018, default 1018):
[Enter]
Using default value 1018

Cambiar el tipo de la partición a NTFS.

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 7
Changed system type of partition 1 to 7 (HPFS/NTFS)

Permitir que la partición sea activa (bootable).

Command (m for help): a
Partition number (1-4): 1

Guardar los cambios y salir de fdisk.

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Limpiar la información del MBR.

$ sudo dd if=/dev/zero of=/dev/sdb bs=446 count=1

1+0 records in
1+0 records out
446 bytes (446 B) copied, 0.00288829 s, 154 kB/s

Crear el sistema de archivos en la unidad con NTFS.

$ sudo mkfs.ntfs /dev/sdb1

Cluster size has been automatically set to 4096 bytes.
Initializing device with zeroes: 100% – Done.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.

Modificar la etiqueta de la unidad (opcional).

$ sudo ntfslabel /dev/sdb1 "JimezamLabs"

Copiar los archivos de instalación.

Retirar y volver a conectar la unidad USB para que el sistema operativo la reconozca nuevamente, ahora vacía y con la etiqueta que se eligió en el paso anterior.

$ cp -rf /media/Windows7/* /media/JimezamLabs/

Deben actualizarse los nombres de los puntos de montaje según su propio contexto.  /media/Windows7 representa el punto de montaje del DVD de Windows mientras que /media/JimezamLabs representa al punto de montaje de la unidad USB que se está preparando.

Instalación de Windows.

Para instalar Windows en un equipo a partir de la memoria USB recién preparada, inserte esta en un puerto USB libre y reinicie el computador.  Configure la BIOS del equipo para que inicie a partir del dispositivo USB y prosiga con la instalación normalmente.

The falling things: jugando con Processing

Introducción.

Processing es en muy pocas palabras un lenguaje multiplataforma (Linux, MacOS y Windows) basado en Java muy interesante que permite desarrollar rápida y fácilmente pequeñas aplicaciones (o sketches) que incluso personas con pocos conocimientos en desarrollo de software pueden implementar.

Por ahora mi experiencia con el lenguaje es muy limitada, sin embargo después de instalarlo he estado un poco con él.  Para esto decidí hacer un sketch muy sencillo en el que se controla mediante el teclado una base que tiene como misión recoger las cosas que caen.

Sketch.

The Falling Things, versión 0.1

Enlaces.

Habilitar en Word el control de cambios de un documento de texto generado con OpenOffice

Introducción.

Extrañamente los documentos de texto generados con OpenOffice (3.2.0 m12 en mi caso) y exportados en el formato doc aparecen con la opción de control de cambios deshabilitada cuando son abiertos con Microsoft Word lo cual me parece extraño ya que durante su edición en OpenOffice esta característica parece estar siempre habilitada.  Supongo entonces que sucede por un malentendido en la exportación del documento.

A continuación se enuncian los pasos necesarios para habilitar el control de cambios en un documento utilizando Word 2007.

Procedimiento.

Abra el documento utilizando Word 2007.

Seleccione el panel Revisar.  Note como el ícono de Control de cambios aparece deshabilitado.

Bajo la opción Proteger documento seleccione el item Restringir formato y edición.

En el panel que aparece en el lado derecho presione el botón Suspender la protección.

Grabe el archivo y listo!

Crear un tunel SSH para la conexión a un servidor MySQL detrás de un firewall con Windows utilizando Putty

Introducción.

De manera análoga a como se realizó el tunel SSH utilizando Linux, también es posible implementarlo en Windows gracias al uso de herramientas de terceros como Putty.

Para la verificación de la conexión a la base de datos en lugar de la herramienta básica de línea de comando (que también debe funcionar normalmente) se utilizará MySQL Workbench que es la herramienta de administración gráfica que provee el motor de bases de datos.

Implementación de la solución.

Crear la especificación del tunel en Putty.

Este paso sólo es necesario realizarlo una única vez mientras se configura el perfil en Putty, en ocasiones posteriores sólo será necesario invocarlo.

Ejecute Putty.exe.

Session en Putty.exe

Session en Putty.exe

En la Session (lado izquierdo) especifique la siguiente información.

1. Nombre del servidor SSH.  desarrollo.com para este ejemplo.

2. Puerto del servicio SSH.  Es el puerto 22 por defecto.  Elija además el tipo de conexión (Connection type) SSH.

3. Especifique un nombre para almacenar la sesión (Saved Sessions).  MiTunel para este ejemplo.

4. Presione el botón guardar (Save) para almacenar la configuración recién especificada.

Connection > SSH en Putty.exe

Connection > SSH en Putty.exe

En las opciones de Connection > SSH elija la casilla de verificación Don't start a shell para evitar que se cree una consola de comandos interactiva ya que sólo se desea crear el tunel.

Connection > SSH > Tunnels en Putty.exe

Connection > SSH > Tunnels en Putty.exe

Determine la información relacionada con los lados del tunel.

5. Especifique el puerto local desde el cual se iniciará el tunel.  3307 en este caso.

6. Especifique el destino y su puerto donde terminará el tunel.  localhost:3306 para este ejemplo.

Presione el botón agregar (Add) para almacenar los extremos del tunel.

Finalmente almacena la configuración establecida regresando a la sección de Session y presionando el botón de guardar (Save).

Establecer un tunel previamente especificado.

Esto se puede hacer de dos maneras, una desde la interfaz gráfica de Putty seleccionando MiTunel en la lista de las sesiones guardadas (Saved Sessions), presionando el botón cargar (Load) y abriendo la sesión presionando el botón (Open).

Una segunda alternativa es desde la línea de comando ejecutando la siguiente instrucción.

C:\ruta\a\putty.exe -load MiTunel

En ambos casos el resultado es el mismo, aparecerá una ventana de login para realizar la autenticación con el servidor remoto (6).

Autenticación de usuario con SSH.

Autenticación de usuario con SSH.

Realizar la conexión a MySQL a través del tunel SSH.

Como se mencionó inicialmente para la verificación de la conexión se utilizará MySQL Workbench.

Connect to database

Connect to database

Debe tenerse muy en cuenta que gracias al tunel recién creado, la aplicación cliente de la base de datos interpretará que el motor de base de datos se encuentra ubicado localmente (9) y que su puerto es el 3307 (10) -ver 5 y 6-.

Integrar el ServicePack 3 en Windows XP y crear un CDROM de instalación a partir de él utilizando Linux Ubuntu 9.10

Introducción.

Windows XP después de 8 años de su introducción es la versión mas utilizada de este sistema operativo.  Con la liberación de sus service packs que solucionan problemas de seguridad y errores del sistema, es bastante estable e incluye todo lo que un usuario realmente necesita para utilizar su computador día a día.  Su sucesor Windows Vista no nos agradó mucho que digamos y Windows 7, la versión que salió a finales del año pasado promete bastante.

Como decía, aún es muy frecuente encontrarnos con equipos basados en Windows XP en empresas y en nuestras casas, incluyendo a los ahora en apogeo netbooks.

Las actualizaciones de Windows XP, mientras el producto se encuentre aún bajo soporte de Microsoft, se pueden descargar de manera individual para ser instaladas manualmente o pueden ser instaladas en línea mediante el sitio de WindowsUpdate.  A medida que estas actualizaciones crecen y se generalizan son agrupadas en grupos llamados paquetes de servicios (o service packs), estos son incluídos en los CDROMs del sistema operativo para los equipos nuevos.

El problema radica cuando el CDROM de instalación del sistema operativo que venía con el equipo que se va a instalar es muy antígüo y no incluye los service packs mas recientes.  En este caso es necesario descargarlos o instalarlos en línea como se mencionó anteriormente, sin embargo esta es una tarea tediosa debido a los tamaños de los archivos y a que si se utiliza WU aparentemente es necesario instalar el SP2 antes del SP3 a pesar de que estos son acumulativos y uno incluye al otro.  Lo dispendioso de las instalaciones en estas condiciones se hacen mas visibles si es necesario instalar varios computadores y frecuentemente.

Lo ideal es obtener un CDROM de distribución de Windows XP que ya incluya el service pack mas reciente (SP3), el cual en caso de no encontrarse es posible construírlo, es decir, basados en uno antígüo (SP1 en mi caso) es posible crear un CDROM con los instaladores de Windows XP y SP3, este procedimiento es conocido como slipstreaming.  Supuestamente esto sólo es posible hacerlo a partir del SP1 y no desde la versión inicial.

A continuación se exponen los pasos necesarios para la integración del SP3 en disco de instalación de Windows XP SP1 utilizando las herramientas disponibles en Linux Ubuntu 9.10.

Integración del SP3.

Requisitos.

  • Disco de instalación de Windows XP SP1 (o posterior).
  • Un equipo con Linux Ubuntu 9.10.
    • wine 1.1.31 o posterior.
    • cabextract 1.2 o posterior.

Instalación del software requerido.

$ sudo aptitude install cabextract

$ sudo aptitude install wine

Copia de los archivos de Windows.

Crear el directorio donde se almacenarán los archivos necesarios para el proceso de slipstreaming.

$ mkdir ~/slipstream/

Insertar el CDROM de Windows XP SP1.

Desmontar el CDROM recién instalado tan pronto como el sistema operativo lo monte automáticamente.

$ umount /media/X1AHOEM_ES

Montar el CDROM con opciones que preserven el estilo original de los nombres de archivo (mayúsculas).

$ mkdir /tmp/xp

$ sudo mount -t iso9660 -o map=off /dev/cdrom /tmp/xp

Copiar los archivos del CDROM al disco duro.

$ mkdir ~/slipstream/WindowsXP

$ cp -afr /tmp/xp/* ~/slipstream/WindowsXP/

$ chmod -R 777 ~/slipstream/WindowsXP

Desmontar el CDROM y remover el punto de montaje temporal.

$ sudo umount /tmp/xp

$ rmdir /tmp/xp

Obtener el Service Pack 3 de la siguiente ubicación.

http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=5b33b5a8-5e76-401f-be08-1e1555d4f3d4

Descomprimir los archivos del SP3.

$ mkdir ~/slipstream/SP3 && cd ~/slipstream/SP3

$ cabextract ~/slipstream/WindowsXP-KB936929-SP3-x86-ESN.exe

$ chmod -R 777 ~/slipstream/SP3

Integrar el contenido del SP3 al árbol de la distribución antígüa.

$ cd ~/slipstream/SP3/i386/update

$ wine update.exe /integrate:Z:/home/jimezam/slipstream/WindowsXP

Generación de la nueva imagen del CDROM.

Obtener la imagen del sector de inicio.

$ geteltorito -o ~/slipstream/bootsect.img /dev/cdrom

$ cp ~/slipstream/bootsect.img ~/slipstream/WindowsXP/

Generar la imagen ISO.

$ genisoimage -b ~/slipstream/bootsect.img -no-emul-boot -c BOOT.CAT -D –max-iso9660-filenames -relaxed-filenames -o ~/slipstream/WindowsXP_SP3.iso ~/slipstream/WindowsXP

Enlaces.

Configurar una cuenta de GoogleApps for Domains con Pidgin

Introducción.

Las cuentas de Google Apps for Domains proveen además del correo electrónico (GMail) otros servicios de Google como la mensajería instantánea (GTalk).  El problema surge al intentar configurar estas cuentas en un cliente de mensajería múltiple como Pidgin ya que estas no funcionan con las configuraciones por defecto de GTalk o de XMPP.

Procedimiento.

Abra el diálogo de administración de cuentas: Accounts > Manage Accounts o presione CTRL+A.

Presione el botón Add … para crear una nueva cuenta.

Ingrese la siguiente información requerida.

  • Protocolo: XMPP.
  • Nombre de usuario.
  • Dominio: su dominio de Google Apps for Domains.
  • Alias local: el nombre que desee que se muestre para su usuario.

Seleccione la pestaña Advanced y provea la siguiente información.

  • Requiere SSL/TLS: seleccionado.
  • Puerto de conexión: 5222.
  • Conectar al servidor: talk.google.com.

Presione el botón Guardar.

Enlaces.