martes, 17 de mayo de 2011

We make IT with Ubuntu

We programmers have, in a general way, a high ego. When we accomplish something that works, we congratulate ourselves and sometimes twit or put a Facebook status with a more sociable mask of our self-congratulation. We love challenges because we consider that too easy things can be done by anybody, even our 90 year old grandma. That’s why, when we all faced for the first time the discovery of Linux, when we concluded that Linux is definitely not Windows, we always had the need to keep exploring or move completely to a distribution.
I met Linux in Havana University, Cuba, during the Operating Systems course in Computer Science. I confess that then it didn’t cause me enough illusion to join “the dark side”, as a professor of mine said. Several years passed and the little itch of retaking the unconcluded journey never left me. Then 5 years ago somebody lent me an Ubuntu 6.06 CD. I installed it at work, then at home and I saw it with eyes of a curiosity felt never before. It was something magical, perhaps because of the most outstanding visual interface, comparing to other Linuxes five or more years before. I made the amateur mistake to believe that I could work successfully without having an Internet connection. Then, step by step with the hammer hitting my head I realized of the need of an offline repository or a direct connection. I was occurred to make an apt-get version for Windows, that were able to determine the dependencies among a list of packages with their versions, and then it would download the .deb files to take them to my disconnected Ubuntu. I abandoned the idea because of work matters, but the Ubuntu experience marked me as a TODO with several exclamation marks and asterisks in a source code.
Finally, 3 years ago, I changed to another project and since the beginning all pointed that part of what was initially done for Windows should move to Linux, either because of costs issues, either due to efficiency issues. We explored the WWW visiting forums, specialized sites, comparative pages and papers about the existing distributions. They all seemed to enlighten Ubuntu, since its desktop edition offers the most user friendly interface. Besides, the fact of being based on Debian, one of the most prestigious and stable distributions, give it a lot more favorable points, together with the always active and enthusiastic community, including its Cuban instance.
Most of the Cuban Linux lovers I know use Ubuntu or recognize its advantages. In my workgroup it is the distribution we use for development, internet, communications, mail, multimedia… and even solve a Sudoku from time to time!
Although the commercial application servers are in Debian, all programming and testing is done in Ubuntu. We use gcc, g++ and Eclipse for C/C++ development and Mono, C# and MonoDevelop for our services and web sites. It’s quite remarkable the speed of applications and services running with mod_mono in Apache compared to those hosted in Microsoft Internet Information Services, and even though it’s undeniably true that sometimes a bug of those who only bother appears, there are always tools like bugzilla.novell.com to scare them away.
I wouldn’t search for another distribution for desktop applications, since there’s no better than Ubuntu to offer a Moolight, Windows Forms or Gtk# interface, which makes me think of how they would look on a mobile device or tablet. This reminds me of how convenient it is the inclusion of Mono as part of the system, and applications like Tomboy and Banshee that directly depend on it.
It constitutes an exciting trek since we put the Live CD and we are allowed to select our language (a desired feature Windows lacks of), to then start gdm with that environment so well balanced in colors, text and accessibility. The installation process can’t be more intuitive, though aspects such as reservation for the swap partition or making changes in /home, / or /boot partitions always require a deeper knowledge in Linux architecture. Nevertheless, options of using the remaining space or handle space automatically can save a few rookies.
Once the process ends and the system restarts, we find a GRUB style menu, customizable to the minimal detail. If we then decide to enter Ubuntu, a 10 second process takes us to the start session screen, something that few or none other operating system has been able to accomplish. This just provokes hurrays from our bosses, especially because of productivity, since it gives no time to even drink a cup of coffee! Also, when we turn off the system, we wait just what takes to say “see you soon”. Ah! And there will be no programs hanging like in Windows, as if we get back to the office next day they’re still there, like if our shut down command expired.
The Ubuntu Software Center, Synaptic or Aptitude are very convenient alternatives to install or uninstall applications, even if the user were a secretary or a nerd. Mozilla Firefox, the most popular browser nowadays, comes by default in a basic system install, so it is a blessing to all we who live connected. Empathy, Evolution and Gwibber complement the collection of fundamental Internet tools, with features for instant messaging, email, social network interaction and news reading. Ubuntu is like a microuniverse with the essential to make our day bright and profitable.
It’s very likely that in the future, when our enterprise acquires more potent servers, we’ll see each other “in the clouds” and Ubuntu One seems to be a really high place.
I think collaboration around the front product of Canonical, free and easy to everyone, fast and reliable, with plausible philosophy, concepts and principles, there’s no other alternative. I’ll keep occupying several of my hard drive gigabytes with it. I’ll keep updating it with every 6-month version. I’ll keep reading news about it. I’ll keep cherishing and configuring it to make us both feel comfortable. I’ll keep making IT with Ubuntu.

Lo hacemos con Ubuntu (versión Español)
Los programadores tenemos, por lo general, un ego bien alto. Cuando logramos que algo funcione, nos felicitamos a nosotros mismos y a veces twiteamos o ponemos un estado en Facebook con una máscara más sociable de nuestra auto-felicitación. Somos amantes de los retos porque consideramos que las cosas demasiado fáciles cualquiera las puede hacer, hasta nuestra abuelita de 90 años. Por eso, cuando muchos nos enfrentamos por primera vez a descubrir lo que es Linux, cuando concluimos que Linux definitivamente no es Windows, siempre nos quedan las ganas de seguir explorando o pasarnos por completo a alguna distribución.
Conocí Linux en la Universidad de La Habana, Cuba, en el curso de Sistemas Operativos de Ciencia de la Computación. Confieso que en aquél entonces no me causó tanta ilusión como para convertirme “al lado oscuro”, como diría un profesor. Varios años pasaron y el bichito de las ganas de retomar el viaje inconcluso nunca cejó. Entonces hace más o menos 5 años me prestaron un CD de Ubuntu 6.06. Lo instalé en el trabajo, en mi casa y lo vi con ojos de una curiosidad que antes no había sentido. Era algo mágico, quizá porque la interfaz visual era mucho más amigable que la de otros Linux cinco o más años atrás. Cometí el error de principiante de creer que podría trabajar bien con él SIN tener Internet. Luego, poco a poco con los golpes fui recurriendo en la necesidad de un repositorio offline o una conexión directa. Se me ocurrió hacer una versión de apt-get para Windows, que determinara las dependencias entre un listado de paquetes con sus versiones, y me descargara los archivos .deb para luego llevarlo a mi Ubuntu desconectado. Tuve que abandonar la idea por motivos de trabajo pero la experiencia de Ubuntu me marcó como un TODO con varios signos de admiración y asteriscos en un código fuente.
Finalmente, hace 3 años, cambié de proyecto y desde el principio todo apuntaba a que parte de lo que estaba hecho inicialmente en Windows pasaría a Linux, ya por cuestiones de costos, ya por cuestiones de eficiencia. Exploramos un poco la red de redes, visitando fórums, sitios especializados, páginas comparativas y artículos sobre las distribuciones existentes. Todas parecían apuntar a Ubuntu, pues esta ofrece, en su versión de escritorio, la interfaz más amigable. Además, el hecho de estar basada en Debian, una de las distribuciones existentes con mayor prestigio y estabilidad, le daba muchos más puntos a favor, junto a su siempre activa comunidad mundial y precisamente cubana.
La mayoría de los cubanos amantes de Linux que conozco usan Ubuntu o reconocen sus ventajas. En mi grupo de trabajo es la distribución que usamos para desarrollo, internet, comunicaciones, correo, multimedia… ¡y hasta para resolver un Sudoku de vez en cuando!
Aunque los servidores de aplicaciones comerciales están en Debian, toda la programación y las pruebas se realizan en Ubuntu. Empleamos gcc, g++ y Eclipse para el desarrollo en C/C++ y mono, C# y MonoDevelop para nuestros servicios y sitios web. Resulta muy significativa la velocidad con que se ejecutan las aplicaciones y servicios usando mod_mono en Apache, comparadas con las hospedadas en Microsoft Internet Information Services, y aunque es cierto que de vez en cuando aparece algún insecto de esos que solo molestan, siempre hay herramientas como bugzilla.novell.com para ahuyentarlos.
No buscaría otra distribución para las aplicaciones de escritorio, pues cuál mejor que Ubuntu para ofrecer una interfaz MoonLight, Windows Forms o Gtk#, lo que me hace pensar en cómo lucirían en un dispositivo móvil o una tableta. Esto me recuerda lo conveniente que resulta la inclusión de Mono como parte del sistema, y aplicaciones como Tomboy y Banshee que dependen directamente de ella.
Constituye un recorrido emocionante desde que ponemos el Live CD y se nos permite seleccionar el idioma (característica de la que Windows carece), para luego iniciar el gdm con ese ambiente tan bien balanceado en colores, textos y accesibilidad. El proceso de instalación no puede ser más intuitivo, aunque aspectos como la reserva de la partición de intercambio (swap) o hacer cambios en las particiones /home, / o /boot siempre requieren de un conocimiento más profundo sobre la arquitectura de Linux. Sin embargo, las opciones de usar el espacio restante o manejar el espacio automáticamente pueden salvar a algunos inexpertos.
Una vez que termina el proceso y se reinicia, nos encontramos con un menú al estilo GRUB, que puede personalizarse hasta el más mínimo detalle. Si decidimos entrar en Ubuntu, un proceso que dura 10 segundos nos lleva directamente a la pantalla para iniciar sesión, algo que pocos o ningún otro sistema ha logrado cumplir. Esto solo provoca hurras por parte de los jefes, sobre todo en cuanto a productividad, pues no da tiempo ¡ni para tomarse un café! También cuando decidimos apagar el sistema, podemos esperar el tiempo que toma decir “hasta pronto”. ¡Ah! Y sí que no se quedan programas colgando como en Windows, que si volvemos a la oficina al día siguiente todavía están ahí, como si la orden de terminar hubiera expirado.
El Centro de software de Ubuntu, Synaptic o Aptitude son alternativas muy convenientes para instalar o desinstalar aplicaciones, ya sea para una secretaria o para un nerd. Mozilla Firefox, el navegador más popular en los últimos tiempos, viene por defecto en una instalación básica del sistema, lo cual constituye una bendición para todos los que vivimos conectados. Empathy, Evolution y Gwibber complementan la colección de herramientas fundamentales de Internet, con sus capacidades para la mensajería instantánea, correo electrónico, interacción con redes sociales y seguimiento de noticias. Ubuntu es como un microuniverso con todo lo esencial para que nuestro día sea brillante y provechoso.
Es muy probable que en el futuro, cuando la empresa se haga de equipos de cómputo más potentes nos veamos todos “en las nubes” y Ubuntu One parece un lugar realmente alto.
Pienso que colaborar alrededor del producto insignia de Canonical, gratis y sencillo para todos, ágil y confiable, con una filosofía, conceptos y principios muy plausibles, no me queda otra alternativa. Seguiré ocupando algunos gigabytes de mi disco duro con él. Seguiré actualizándolo con cada nueva versión semestral. Seguiré pendiente de sus noticias. Seguiré mimándolo y configurándolo para que nos sintamos los dos más cómodos. Seguiré haciéndolo con Ubuntu.

Vea la página original del artículo participante en el concurso de Cult of Ubuntu.

viernes, 13 de mayo de 2011

Ubuntu 11.04: No apto para personas que padecen del corazón

En este post expondré mi "experiencia de usuario" con el instalador de Ubuntu 11.04 "Natty Narwhal". En cuanto el ISO cayó en mis manos, no importó que fuera de 32 bits, había que probarlo. Cargué el Ubuntu 10.10 de mi laptop Dell Studio 1536 (AMD Athlon X2 Dual Core 2 GHz, 3 GB RAM, 320 GB HD, ATI Radeon 3200 320 MB Video), fui a la opción Sistema / Administración / Crear disco de inicio, cargué el ISO, puse una flash de 4 GB y una vez terminada la copia y la configuración del sector de arranque del dispositivo, reinicié. Entonces...
Inconveniente #1:
Pantalla negra durante 5 minutos, sin indicación alguna de si se pudo o no iniciar desde la flash.
Reacción #1:
Inicio con Windows 7, ¡y qué casualidad! Cuando monto el ISO con Daemon Tools, hay una aplicación muy conveniente: usb-creator.exe, con la que vuelvo a realizar la misma operación de creación de flash de inicio (la cual demora casi ¡10 minutos!), y reinicio el sistema.
Inconveniente #2:
Sale el texto ISOLINUX v.4.02 debian-20101016 ETCD Copyright (C) 1994-2010 H. Peter Anvin et al, pero se congela la pantalla y no me queda otro remedio que apagar forzosamente por 2da vez para volver a encender.
Reacción #2:
Windows 7 + Nero, quemo la imagen en el disco regrabable que tengo por ahí porque, definitivamente, esto con flash no funciona. Reinicio. Aparece, como desde tiempos inmemoriales, el menú para escoger el idioma en que se verán los mensajes de instalación o prueba de Ubuntu y escojo la opción Probar Ubuntu sin instalar.
Inconveniente #3:
En efecto, pruebo una exquisita pantalla oscura durante 10 minutos, no tan negra porque es color vino tinto pero sin rastro de vida terrestre o alienígena. Esta clara incitación al desatino me recordó otra experiencia, digamos que similar a la mía, aunque con resultados satisfactorios. De ahí que seguí la sugerencia de Jack Wallen:
Reacción #3:
Apago y enciendo para esta vez optar por Instalar Ubuntu. Todo funciona con normalidad, hasta que el asistente me sugiere que escoja la distribución de teclado. La que ofrecía por defecto era la de España, pero mi teclado tiene la de Latinoamérica. Seleccioné por error la distribución de Irlanda, y cuando marco la correcta...
Inconveniente #4:
No hay cambios visibles en el listado de alternativas de la derecha. Pruebo con otras distribuciones, pero las alternativas siguen siendo las de la Irlanda. No hay manera de cambiar las alternativas.
Reacción #4:
Pensé que volviendo al paso anterior resolvería pero cuando pulso el botón Anterior...
Inconveniente #5:
El botón se desactiva, el puntero del ratón indica que debo esperar a que algún procesamiento termine, pero nada. Todo queda exactamente así, el proceso de instalación continúa como bien indica la barra de progreso, mientras la interfaz se ha quedado atascada en ese paso. Ambos botones, Siguiente y Anterior han quedado inutilizados, lo único que puedo hacer es escribir en el cuadro de texto que permite probar la distribución de teclado, y algunos caracteres raros salen cuando tecleo pues la distribución de Irlanda continúa seleccionada, pese a todos mis esfuerzos por cambiarla.
La instalación termina y el mensaje "Cuando usted quiera..." da fe de cuán confiado puede llegar a estar un software de sus propias acciones.
Reacción #5:
En la esquina superior derecha de la pantalla hay un panel que muestra si hay conexión y sonido, además de un botón para reiniciar, apagar o configurar. Selecciono la opción Configurar, asigno a la acción "Ejecutar una terminal" la combinación de teclas Ctrl + Alt + T y la realizo. De esa manera, compruebo mis sospechas: puedo realizar operaciones en bash y acceder al sistema de archivos como si estuviera en la sesión de Prueba. Reinicio el sistema por software y recomienzo el proceso de instalación, esta vez cuidadosamente seleccionando las opciones deseadas. Una vez terminado, el proceso reinicia la computadora por octava vez. De manera "inteligente" el menú de GRUB2 muestra las opciones para cargar Ubuntu 10.10, Windows 7 y Ubuntu 11.04. Escojo esta última, espero unos segundos y surge la pantalla de autenticación en la que selecciono mi cuenta, tecleo la contraseña y...
Inconveniente #6:
Otra hermosa pantalla vino tinto, sin indicadores, sin mensajes de error y en eterna soledad.
Reacción #6:
Pienso que ya es hora de escribir mi reseña sobre la nueva versión de Ubuntu. O quizá de ver algunos capítulos de la serie en la que estoy atrasado. O quizá de contar ovejas desde alguna onírica interfaz.
Después del infarto siempre llega la calma...
Al día siguiente, busco en el sitio de Ubuntu las nuevas características que ofrece Natty Narwhal, y me topo con un interesante FAQ, que contiene, entre otras, las siguientes preguntas:
  • Will it work with my hardware?
    Ubuntu 11.04 is built to take advantage of the very latest technologies, but it should work on a most desktops, laptops and netbooks too. If you don’t have the required hardware, Ubuntu will automatically start the classic desktop experience so you won’t have to worry about a thing.
  • Can I change my mind?
    No problem at all. You can choose to launch the classic desktop experience when you log in to your computer.
Nada sobre ATI Radeon o hardware no soportado, pensando que tal vez el problema estaba en la tarjeta de video, como un compañero me sugiriera al hablarle del tema. Al menos me quedó el consuelo de poder optar por Ubuntu Clásico (el viejo pero más elaborado Gnome) en caso de continuar con el "experimento". 

jueves, 28 de abril de 2011

Compilar e instalar MonoDevelop y ASP.NET desde código fuente en Ubuntu y Debian. Otros aspectos de interés

En este artículo continuaremos con la instalación de Mono desde código fuente en Ubuntu y Debian, ahora enfocando el ambiente de desarrollo MonoDevelop y ASP.NET. Posteriormente, veremos algunos aspectos de configuración que nos permitirán trabajar de forma cómoda con aplicaciones de Mono y hablaremos un poco sobre la portabilidad y compatibilidad de marcos de trabajo y aplicaciones.
Prerrequisitos
Vimos en el artículo anterior una descripción de las bibliotecas principales y paquetes de Mono, además de los vínculos desde donde pueden descargarse. Recomendamos, para realizar una instalación minimal, la descarga de los siguientes paquetes:
Por supuesto, antes de compilar debemos tener correctamente instalado Mono, versión 2.6.7 o superior, además de los prerrequisitos vistos en el artículo anterior. Para que cuando se configure la compilación no se produzcan errores en las dependencias de librerías de desarrollo, debemos ejecutar la siguiente línea desde bash:
sudo aptitude install xulrunner-dev libgtk2.0-dev libglade2-dev \
libgnome2-dev libgnomecanvas2-dev libgnomeui-dev librsvg2-dev \
libgtksourceview2.0-dev libgtkhtml3.14-dev libvte-dev \
libpanel-applet2-dev libwebkit-dev libwnck-dev apache2-threaded-dev
Tampoco debemos olvidar que, para el caso de ASP.NET, es necesario el servidor web Apache2:
sudo aptitude install apache2
Compruebe que la variable PKG_CONFIG_PATH incluye el directorio donde está la configuración de paquetes del último Mono instalado, por ejemplo /opt/mono/lib/pkgconfig, si no, incluya en .bashrc la línea siguiente:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/mono/lib/pkgconfig
Configuración, compilación e instalación
Los pasos ya los conocemos, normalmente no llevan variaciones, y deben realizarse en los correspondientes directorios después de descompactar los paquetes de código fuente. Ahora, el orden sí es importante, ya que, por ejemplo, el paquete monodevelop-2.4.2 depende de mono-addins-0.5. El orden ya lo definimos en el epígrafe de Prerrequisitos. Y como memento, esto es lo que debemos ejecutar:
./configure --prefix=/opt/mono
make -j 4
sudo make install
Es posible que alguno de los paquetes produzca algún error en la compilación. No se asuste, eso sucede en las mejores familias. He aquí un listado de los errores más comunes:
  • Faltan dependencian. Se produce a veces cuando se utiliza la opción -j n en el primer make.
    Solución: Ejecute make sin la opción mencionada.
  • Error, no encuentra el ensamblado Mono.GetOptions. Por lo general, se produce en códigos de pruebas o ejemplos que utilizan versiones más antiguas de Mono.
    Solución: Debe localizarse el archivo para la compilación automática, Makefile, en el directorio donde está el archivo .cs que provocó el error. Dentro de Makefile, buscar el nombre del fichero que dio problemas, y comentar consecuentemente con # las líneas en las que aparezca. Por último, vuelva a ejecutar make.
  • Error en PrintSample.cs. Este es un archivo de pruebas que utiliza una API vieja.
    Solución: Localice el archivo y comente todo el código con /* y */.
Así luce MonoDevelop:

Configuración de mod_mono
mod_mono es el paquete de código fuente que genera el módulo de Apache mod_mono.mod, el cual se ejecuta cuando los sitios web se marcan como manejados por Mono. Una vez compilado e instalado, se coloca en el directorio /etc/apache2 un archivo mod_mono.conf, que contiene la configuración básica para las aplicaciones ASP.NET, carga el módulo y registra las extensiones de los archivos a manejar. Para estar a tono con el modo en que se configura Apache en Ubuntu o Debian,  podemos ejecutar este pequeño script, que registrará automáticamente el módulo:
sudo mv /etc/apache2/mod_mono.conf /etc/apache2/mods-available
sudo ln -s /etc/apache2/mods-available/mod_mono.conf \
  /etc/apache2/mods-enabled/mod_mono.conf
sudo /etc/init.d/apache2 restart
Luego, en el archivo /etc/apache2/httpd.conf podemos registrar tantos sitios de ASP.NET como queramos usando un fragmento similar al siguiente:
Alias /demo "/opt/mono/lib/xsp/test"
AddMonoApplications "/demo:/opt/mono/lib/xsp/test"
<Location /demo>
         SetHandler mono
</Location>
En este caso, hemos registrado un sitio de ejemplos de ASP.NET que viene con XSP una vez que este último se ha instalado. En el sitio de Mono, hay una página dedicada a la configuración de mod_mono que ofrece muchos más detalles.

Ejecutar aplicaciones de Mono como archivos ejecutables
Primeramente, debemos colocar un archivo run_mono.sh como el siguiente en /etc/rc.local:
#!/bin/bash
/usr/sbin/update-binfmts --disable cli
/usr/sbin/update-binfmts --disable CLR
if [ ! -e /proc/sys/fs/binfmt_misc/register ]; then
        /sbin/modprobe binfmt_misc
        mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
fi

if [ -e /proc/sys/fs/binfmt_misc/register ]; then
        echo ':CLR:M::MZ::/opt/mono/bin/mono:' \
             > /proc/sys/fs/binfmt_misc/register
else
        echo "No binfmt_misc support"
        exit 1
fi
Después comprobamos, como se indica a continuación, que el enlace suave /etc/alternatives/cli apunta a la última aplicación mono instalada:
ls -l /etc/alternatives/cli
lrwxrwxrwx 1 root root 13 2010-11-19 07:58 /etc/alternatives/cli 
  -> /opt/mono/bin/mono
Si no es así, ejecutamos lo siguiente:
sudo ln -s /opt/mono/bin/mono /etc/alternatives/cli
Por último, cambiamos los permisos de la aplicación Mono para permitir la ejecución y la corremos:
chmod a+x App.exe
./App.exe
Portabilidad y compatibilidad
Para comprobar que un ensamblado compilado con Microsoft .NET Framework es compatible con Mono, determinando en qué estado de implementación se hallan las dependencias, puede usarse la herramienta Mono Migration Analyzer MoMA. También en http://go-mono.com/status/ podemos encontrar de manera exhaustiva e intuitiva el estado en la implementación de las clases de la BCL.

Estas son algunas de las bibliotecas que he comprobado que funcionan:

martes, 19 de abril de 2011

Compilar e instalar Mono desde código fuente en Ubuntu y Debian

Introducción
Mono es la alternativa libre y de código abierto del marco de trabajo .NET de Microsoft, una iniciativa de Miguel de Icaza conjuntamente con la empresa Novell, la creadora de la distribución Suse Linux. Su sitio web oficial es http://www.mono-project.com, en el cual se puede encontrar información general, descargas, tutoriales, documentación e intercambiar con la activa comunidad.
En este artículo se abordará el tema de la instalación de Mono a partir del código fuente en Ubuntu o Debian y antes de comenzar, debemos aclarar algunos aspectos particulares:
  • Este tutorial se probó con la versión 2.10 de Mono, aunque también puede aplicarse para versiones posteriores a la 2.6.7. 
  • En mi grupo de desarrollo trabajamos además de Windows con las distribuciones Ubuntu (área de desarrollo) y Debian (área de producción) para abaratar los costos de los servidores de aplicaciones, además de que ofrecen alta disponibilidad, eficiencia y flexibilidad de configuración, mantenimiento, despliegue y compatibilidad. Esto, con el valor agregado de que son sistemas bajo la GPL.
  • Aunque los repositorios oficiales de las distribuciones Debian y Ubuntu contienen la última versión con soporte de larga duración (LTS) de Mono (2.6.7 en la actualidad), siempre preferimos usar la última versión liberada, de manera que podamos aprovechar las últimas tecnologías incorporadas y las correcciones de bugs que se realizan con cada release.
Cómo obtener el código fuente de Mono
Para obtener la última versión estable de Mono puede accederse al sitio http://ftp.novell.com/pub/mono/sources/. Las páginas tienen vínculos al estilo FTP y existen más de 50 carpetas con proyectos relacionados con Mono. A continuación veremos una breve descripción de los principales:
Carpeta Descripción
libgdiplus/ Librería nativa que funciona como wrapper del GDI+ de Windows.
mono/ Marco de trabajo Mono, que incluye las librerías nativas del CLR, aplicaciones básicas del framework, más la Base Class Library (BCL) junto a varias librerías de clases específicas de Mono.
mono-debugger/ Debugger de Mono.
mono-basic/ Extensión de Mono para el soporte de proyectos Visual Basic .NET.
monodevelop/ IDE similar a Visual Studio para desarrollo de aplicaciones Mono.
monodevelop-database/ Extensión para conectarse a varios tipos de base de datos desde MonoDevelop.
monodevelop-debugger-gdb/ Debugger para MonoDevelop versión GNU que genera archivos gdb con información de depuración.
monodevelop-debugger-mdb/ Debugger para MonoDevelop que genera archivos MDB (Managed Debugging Engine) de Visual Studio.
monodoc/ Documentación de Mono.
mono-tools/ Herramientas comunes de desarrollo y pruebas para Mono.
mod_mono/ Módulo de Apache2 para el hospedaje de aplicaciones ASP.NET.
ikvm/ Puerto de Mono para aplicaciones que interactúan con el byte code de Java.
gtk-sharp/ Wrapper de las librerías del GTK para Mono.
gnome-sharp2/ Wrapper de las librerías de Gnome para Mono.
gnome-desktop-sharp2/ Wrapper de las librerías del escritorio Gnome para Mono.
gluezilla/ Puerto para Mono de las librerías de Mozilla.
gtksourceview-sharp-2.0/ Wrapper de las librerías de GTK para la visualización de código fuente.
monodevelop-java/  Add-in de MonoDevelop para proyectos de Java.
monodevelop-python/  Add-in de MonoDevelop para proyectos de Python.
webkit-sharp/ Librerías con herramientas de internet para Mono.
xsp/ Servidor web para desarrollo que permite hospedar aplicaciones ASP.NET.
moon/ Librerías y binarios de MoonLight, versión libre de Silverlight.
Cada carpeta contiene los paquetes de código fuente como archivos compactados (generalmente de extensión .tar.bz2) con el número de la versión. Una vez descargados, se pueden descompactar desde bash con la línea siguiente:
tar -xvf nombreDeArchivo.tar.bz2
Prerrequisitos para la compilación
Antes de comenzar los procesos de compilación, debemos instalar los paquetes de desarrollo que constituyen requerimientos y que normalmente están incluidos en los repositorios. Para ello, podemos ejecutar el siguiente comando desde una terminal bash:
sudo aptitude install build-essential libglib2.0-dev libtiff4-dev \
libgif-dev libpng12-dev libx11-dev libcairo-dev bison gettext
Crearemos el directorio mono dentro la carpeta /opt, la cual se usa normalmente para instalar software que no procede del repositorio. Esto nos traerá dos ventajas:
  1. La instalación posterior a la compilación se hará completamente dentro del directorio,  lo cual nos permitirá copiarla a cualquier otra máquina para usarla sin necesidad de recompilar.
  2. Podrán convivir varias versiones de Mono, por ejemplo, la 2.6.7 instalada por defecto desde Ubuntu 9.04, y la que compilaremos.
Para crear el directorio podemos hacerlo así:
sudo mkdir /opt/mono
Compilación básica de Mono
Mono requiere de la librería nativa libgdiplus.so para funcionar, fundamentalmente porque es la que usa el ensamblado System.Drawing.dll, por tanto la debemos compilar primero. A continuación, podemos repetir el mismo procedimiento para el código de Mono.
Tres procesos secuenciales definen la compilación.
Configuración
Dentro de las carpetas de los paquetes de código fuente descompactados, se encuentra un archivo con permiso de ejecución denominado configure. A través de él, se realiza la configuración y verificación de los prerrequisitos de manera automática. Aunque su empleo más simple es:
./configure
no usaremos esta alternativa, pues creará las condiciones para que la instalación se realice por defecto en el directorio /usr/local, que no es el que creamos para esos fines. En cambio, utilizaremos la siguiente alternativa, que sí realiza la configuración deseada:
./configure --prefix=/opt/mono
La configuración verifica cada una de las versiones de los encabezados C/C++ que existen en el sistema, comprueba los paquetes instalados y se detiene en caso de algún error o ausencia de algún prerrequisito. Es posible que los mensajes de error no sean muy descriptivos, por lo que incorporamos con anterioridad un epígrafe de prerrequisitos. Además, prepara la compilación e instalación para que se realicen con las opciones especificadas. Puede hacerse lo siguiente para ver una ayuda completa de las opciones de configuración:
./configure --help
Compilación
La compilación se realiza mediante la herramienta make, que se instala con el paquete build-essential. Este último también contiene los compiladores de C (gcc) y C++ (g++) que son utilizados por make para realizar compilaciones consecutivas y diferenciadas. make ofrece la opción -j n la cual usaremos para indicar que la compilación se hará con el máximo uso del CPU (si la computadora tiene procesador Dual Core, Core 2 Duo, Quad Core, etc. será mucho más rápido); en este caso, n indica la cantidad de jobs o procesos paralelos que realizarán la compilación.
El comando para compilar tanto el CLR (código C/C++) como la BCL (código C#), puede ser entonces:
make -j 4
Esto puede demorar, así que sin pena puede levantarse de su asiento, estirarse, tomarse un café o ir al baño. Le aseguro que sin la opción -j podría tranquilamente resolver un Sudoku de dificultad media. Esto me recuerda la primera vez que compilé un código fuente en Linux: se trataba del emulador de Super Nintendo ZSNES, en cuyo README, al final, tenía un mensaje de aliento algo así: "type make, then return, cross your fingers and start praying" (teclee make, luego enter, cruce sus dedos y comience a rezar).
Instalación
Una vez que compruebe que la compilación no terminó con un mensaje en rojo con alguna excepción .NET o un error precedido de varios asteriscos (en cuyo caso tendrá que arreglárselas googleando o con sus propios conocimientos), puede ejecutar el comando para instalar:
sudo make install
La ejecución de este es mucho más rápida y el resultado lo podrá ver dentro de la carpeta /opt/mono, que contendrá las siguientes subcarpetas:
  • bin: Archivos binarios y ejecutables de Mono, como el intérprete mono o el compilador de C# gmcs.
  • lib: Librerías nativas y ensamblados, junto con la Global Assembly Cache (GAC).
  • share: Documentación básica.
  • include: Encabezados de C/C++ para el trabajo con librerías nativas del CLR.
  • etc: Archivos de configuración.
¿Es todo?
No. Falta reconfigurar la caché de librerías nativas, especificar convenientemente las variables de entorno y probar que el intérprete funciona. El primer paso lo logramos ejecutando como root lo siguiente en bash:
echo /opt/mono/lib >/etc/ld.so.conf.d/mono.conf
ldconfig
El primer comando crea el archivo mono.conf en el directorio /etc/ld.so.conf.d/ con el texto "/opt/mono/lib", que es el directorio donde se encuentran las librerías nativas de Mono. El segundo comando actualiza la caché de librerías nativas del sistema, de manera que cuando alguna se solicite, se pueda encontrar sin problemas.
Luego, incluimos las siguientes líneas en el archivo .bashrc de nuestra carpeta home o base :
export PATH=/opt/mono/bin:$PATH
export MONO_GAC_PREFIX=/opt/mono/lib/mono/gac:$MONO_GAC_PREFIX
Incluimos el camino /opt/mono/bin en la variable de entorno PATH para poder ejecutar el intérprete mono directamente. También agregamos el nuevo directorio base del GAC a través de la variable MONO_GAC_PREFIX para que las aplicaciones ejecuten con las últimas versiones de los ensamblados. Por último creamos un archivo HelloWorld.cs con el código siguiente:
using System;
namespace HelloWorld {
 public class MainClass {
  public static void Main (string[] args) {
   Console.WriteLine("Hello world!");
  }
 }
}
ejecutamos el comando para compilar:
gmcs -r:System.dll -out:HelloWorld.exe HelloWorld.cs
Finalmente ejecutamos:
mono HelloWorld.exe
y obtendremos un amistoso "Hello world!" en la consola.
En otro artículo veremos cómo instalar desde código y configurar MonoDevelop y ASP.NET, así como ejecutar las aplicaciones de Mono sin usar el intérprete y otros aspectos importantes o interesantes.

jueves, 14 de abril de 2011

Un clúster de Oracle es más que una base de datos

Imaginemos que tenemos una tabla de un esquema de Oracle (o base de datos en cualquier otro SGBD) a la que dos instancias P1 y P2 de una aplicación acceden simultáneamente, pero queremos que las filas que se procesen en P1, no se procesen en P2, y viceversa. Un mecanismo válido para evitar la repetición es mediante el bloqueo de filas, ya sea a través de una tabla auxiliar o de una columna especial en la tabla original. Nos concentraremos en el primer caso.
Tenemos la tabla A con llave primaria A1 y tabla LOCK_A con llave primaria LOCK_A1 del mismo tipo que A1. Además, LOCK_A contará con una columna de tipo fecha/hora (DATE o TIMESTAMP, por ejemplo) llamada LAST_DATE. Se bloqueará una cantidad N de filas, pues los datos serán procesados por lotes. La tabla R contendrá las filas de A que se procesarán.
  1. Obtenemos un cursor resultado de la consulta:
    SELECT A1 FROM A WHERE A1 NOT IN (SELECT LOCK_A1 FROM LOCK_A)
  2. Comenzamos un ciclo que recorre cada fila del cursor.
  3. Comenzamos una transacción. BEGIN
  4. Con la fila actual, insertamos A1 en la columna LOCK_A1 en LOCK_A, más la fecha y hora actual (SYSDATE).
  5. Confirmamos la transacción. COMMIT
  6. Si no se produjo un error (llave primaria violada), guardamos la fila en R.
  7. Terminamos la transacción.
  8. Devolver R.
Pero también necesitamos que si ha pasado un tiempo dado, las filas se desbloqueen, por si falló alguna de las aplicaciones y otra las pueda procesar. Para ello, antes de bloquearlas, ejecutamos un comando similar al siguiente:
DELETE FROM LOCK_A WHERE SYSDATE - LAST_DATE > TIMEOUT
En este caso, TIMEOUT es un parámetro numérico (ver aritmética de fechas en Oracle).
Dos cosas a tener en cuenta:
  • LOCK_A debe tener activada la restricción (constraint) de llave primaria sobre la columna LOCK_A1, para que en caso de insertar la fila con una llave existente se produzca un error.
  • Notar en el paso 5, COMMIT deberá hacerse justo después de INSERT, pues si se hace al final del ciclo, puede que alguna de las inserciones provoque un error que impida que las demás se puedan realizar.
Visto así, todo debería funcionar correctamente. Pues no. Puede suceder que las aplicaciones procesen las mismas filas.
¿Cómo? Si la instancia de Oracle está configurada en clúster, tenemos más de una computadora que gestiona los comandos sobre la base de datos. Si, por casualidad, un nodo del clúster tiene una fecha u hora distinta a los otros nodos, o está en una zona horaria diferente, SYSDATE dará fechas diferentes según el nodo que procese la solicitud de Oracle. Por lo que una operación como SYSDATE - LAST_DATE u otra semejante puede dar números alterados, hasta valores negativos, algo que en el sentido común puede parecer imposible. Este ligero cambio, bastante difícil de detectar, puede provocar que las filas se desbloqueen en menos o más tiempo del esperado.
Solución:
  • Mantenga siempre las computadoras de un ambiente distribuido con la configuración de hora, fecha y zona horaria sincronizada. 
  • Cree una herramienta para determinar automáticamente que todas las condiciones estén creadas para que su sistema funcione con eficacia.

Cada artículo tendrá clasificación y etiquetas

En el blog optaré por clasificar los artículos en tres categorías principales:
  • Up (Arriba) : Artículos sobre logros, retos rebasados y creaciones interesantes.
  • Down (Abajo) : Artículos sobre reveses, corrección de errores y experiencias negativas que han servido para coleccionar aspectos que no deben faltar en soluciones integrales, eficaces y eficientes.
  • Go (Ir) : Artículos sobre novedades, noticias o de carácter tutorial o informativo.
 Cada artículo tendrá otras categorías o etiquetas, como:
  • Temáticas
  • Tecnologías
  • Autores
  • Sitios
Las categorías o etiquetas aparecen en el panel derecho del blog, además de los artículos publicados por año, mes y día.

Up, down, go!

Hay momentos en los que estamos "arriba", todo está bien, todo funciona. Otros momentos nos recuerdan cuán equivocados podemos estar, cuán lejos de la realidad nos hallamos, por lo que quedamos "abajo". Pero si realmente valoramos nuestro esfuerzo, nuestra capacidad para crecer y superarnos, entonces continuamos, seguimos, avanzamos. Es una cadena de eventos que se suceden uno tras de otro, o incluso a veces simultáneamente, y nos lleva de un estado superior a uno inferior o viceversa. No se detiene, por lo que a veces es difícil mantener el ritmo y recepcionar cada evento. Unos se derrumban en el camino, tienden a claudicar fácilmente y dejarse llevar por la corriente. Otros, desafían los abismos y las cumbres, nunca se detienen a esperar lo que vendrá después.
En este blog pretendo acercarme de manera muy particular a algunos de esos sucesos en la programación y las tecnologías en los que me vea involucrado o perciba a mi alrededor, para transmitir las experiencias por si a otros sirven. No se tratará de un fórum de discusión, sino más bien de un punto de referencia.
Quiero dedicar el estreno de Up, down, go! a Sain Salazar Martínez, quien en el día de ayer falleció víctima de leucemia. Contaba apenas con 30 años. Fue querido, admirado y respetado en su colectivo de trabajo. Me considero muy afortunado de haber estado bajo su guía en el grupo de desarrollo, de haber compartido con él varias veces en las buenas y las malas y, sobre todo, de haber sido su amigo. 
¡Hasta siempre!