Crónica de un hacker insatisfecho. El gran final.

Sandino Flores, "Tigrux"
Correo electrónico: tigrux arroba yahoo com
ICQ 45507615
http://www.geocities.com/sandino_flores/

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2005 Linux Para Todos. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales. c) Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Sumario

  1. Motivación.
  2. El equipo.
  3. El escenario.
  4. La crónica.
    1. La búsqueda.
    2. La compilación.
    3. El empaquetado.
    4. La traducción.
    5. La incoporación.
  5. Para concluir.
  6. Acerca del autor


Motivación.

A menudo hemos descubierto programas muy interesantes o útiles para nuestra labor, y generalmente su interfaz de usuario está en idioma inglés. Y seguro hemos deseado verlo traducido al español, pero no sabemos cómo traducirlo porque pensamos que es muy difícil hacerlo.

Así también, más de una vez encontramos programas muy interesantes pero que sólo se distribuyen como código fuente y nos sentimos intimidados, o bien quisiéramos hacer nuestros propios RPMs para facilitar el compartir esos programas o incluso programas nuestros.

Traducir software no es algo a la ligera. No podemos dar por hecho que todos leen inglés. Piensen en los países españoles cuyo idioma bien puede ser el euskero, vasco o catalán. Y no vayamos tan lejos, aquí mismo en México hay comunidades que sólo hablan náhuatl,la segunda lengua más hablada en México, con más de un millón de parlantes. En comunidades y municipios latinoamericanos donde no se habla español, ya no digo inglés, el software libre se reviste de sus virtudes y el software propietario exhibe sus deficiencias.

¿Cuánto cobraría una empresa monopólica por crear versiones en náhuatl, zapoteco o quechua de sus productos? ¿Cuánto tardaría en entregarlo? ¿Pueden estas pequeñas comunidades darse el lujo de pagar por éso? Coincidirán conmigo que la economía de nuestros países no está como para desperdiciarse en enriquecer monopolios. ¿Y con el software libre? En este caso veremos que con el software libre, gracias a que disponemos del código fuente, la traducción a cuanto idioma se nos ocurra es muy sencilla, y no necesita sofisticados conocimientos de informática.

A lo largo de este artículo seguiremos la senda típica de un hacker entusiasta, que partirá de evaluar un programa de su elección, y culminará con la incorporación de la traducción realizada al la versión oficial del programa en cuestión, de modo que todo el mundo se beneficie con nuestro esfuerzo.

El equipo

Las prácticas efectuadas para este artículo fueron llevadas fueron llevadas a cabo en la TigruXtatioN, la cual cuenta con Mandrake 8.1 con sus herramientas de desarrollo completas (gcc, autoconf, automake, make, etc) las cuales acompañan a una instalación típica de Mandrake, Ximian Gnome 1.4 con sus respectivas bibliotecas de desarrollo, y XFree 4.2 con sus respectivas bibliotecas de desarrollo.

El escenario.

Los pasos y situaciones se irán sucediendo en pasos, tal que cada uno de ellos representa una acción bien definida que nos vaya guiando en compilación o la traducción de algún programa GNU en particular. La fecha es febrero del año 2002. Asumiremos el papel de un hacker ordinario, apasionado de las computadoras y que vagabundea en la red en busca de material interesante. Nuestro hacker es muy amigo de estudiantes universitarios que cursan las típicas materias de química y física. Pero los amigos de nuestro amigo hacker saben muy poco de inglés y apenas se inician en linux. Nuestro hacker está deseoso de ayudarles a ellos y a su universidad, así que su búsqueda comienza, e inicia también nuestro camino a aprender a compilar, empaquetar, compartir y traducir aplicaciones. ¿Por qué he situado al hacker en un ámbito universitario? Por qué son las universidades las que más pueden beneficiarse de contribuciones como ésta, y el impacto de las universidades en la sociedad es enorme.

La crónica

  1. La búsqueda
  2. Nuestro aventurero hacker encuentra un programa interesante. Se ha interesado por Gnome Crystal , un programa de edición de modelos moleculares creado por Jean Bréfort, y las capturas de pantalla le muestran que es justamente lo que necesita para sus amigos. Las capturas están en inglés y francés, sospechamos que la barrera del idioma está presente y es nuestra intención derribarla, al menos en este caso. Lo siguiente que hacemos es descargar el código fuente: http://jean.brefort.free.fr/info/gc/gnome-crystal-0.4.1.tar.gz

    gnome_crystal es la maquina del autor
    Gnome Crystal en acción, captado en la máquina de Jean Bréfort

  3. La compilación
  4. Revisamos a fondo la página de gnome-crystal, y no encontramos que halla rpm, así que nos conformamos con el código fuente empaquetado con tar gz. Una vez que hemos descargado el código fuente, lo descomprimimos:

    [tigrux@TigruXtatioN tigrux]$ tar xfvz gnome-crystal-0.4.1.tar.gz

    Entramos al directorio recién creado y miramos el contenido:


    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ ls

    ABOUT-NLS config.sub* gcrystal.desktop Makefile.am README
    acconfig.h configure* gnome-crystal.oaf Makefile.in sgmldocs.make
    aclocal.m4 configure.in gnome-crystal.png missing* src/
    AUTHORS COPYING INSTALL mkinstalldirs* stamp-h.in
    ChangeLog depcomp* install-sh* NEWS TODO
    config.guess* doc/ intl/ omf-install/ ui/
    config.h.in examples/ ltmain.sh po/
    [tigrux@TigruXtatioN tigrux]$

    El contenido del directorio es el típico de un programa GNU. Leemos el archivo README y allí se listan las dependencias que requiere:

      What is needed to install Gnome Crystal:
    • Gnome libraries http://www.gnome.org
    • libglade
    • libxml (libxml2 not supported)
    • OpenGL (Mesa or XFree86-4.0)
    • GtkGLArea (I use version 1.2.2)
    Las dependencias de gnome-crystal, tal como se lee en el README.

    Entonces nos aseguramos de instalar estas bibliotecas así como sus respectivos devel.

    Leemos también el archivo INSTALL y y allí leemos que la compilación es de la manera usual. Entonces simplemente seguimos los pasos que allí se indican.


    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ ./configure --prefix=/usr && make

    Dado que tenemos las bibliotecas de desarrollo necesarias, entonces esperamos una compilación satisfactoria y tras algunos minutos de compilación, estaremos ya listos para instalar. Pero en lugar de una instalación ordinaria, ejecutaremos una técnica que suele usarse en los programas GNU: redirigir la instalación. La finalidad de esta técnica aparentemente extraña es supervisar qué archivos son creados durante la instalación, a fin de que podamos crear un rpm como veremos más adelante.


    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ make DESTDIR=/tmp/gnome-crystal-root install

    Entramos al directorio donde redirigimos la instalación, y listamos su contenido íntegro de los archivos en ello contenidos, y enviamos la salida a un archivo para analizar posteriormente su contenido. Nota que al erchivo lo enviamos directamente al directorio anterior (/tmp en ste caso) para que no sea incluído dentro del listado.


    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ cd /tmp/gnome-crystal-root/
    [tigrux@TigruXtatioN gnome-crystal-root]$ find . -type f > ../files.list
    [tigrux@TigruXtatioN gnome-crystal-root]$

  5. El empaquetado
  6. Sin lugar a dudas, es más fácil para un usuario novel el instalar un paquete en rpm que seguir los pasos que vimos anteriormente. Pues bien, estamos cerca de crear un rpm. No pierdan de vista que la tarea de nuestro hacker es facilidar a sus compañeros químicos el usar este excelente programa. Y qué mejor manera de facilitar su distribución que distruibuírlo en forma de rpm. Sigamos entonces.

    Anteriormente creamos un archivo files.list, es hora de analizarlo. Mira dentro del contenido de este archivo y verás que contiene algo como lo siguiente:


    [tigrux@TigruXtatioN tigrux]# cd /tmp/gnome-crystal-root/
    [tigrux@TigruXtatioN gnome-crystal-root]$ cat ../files.list
    ./usr/bin/gcrystal
    ./usr/share/oaf/gnome-crystal.oaf
    ./usr/share/omf/gcrystal/gcrystal-C.omf
    ./usr/share/gnome/ui/gcrystal.xml
    ./usr/share/gnome/apps/Applications/gcrystal.desktop
    ./usr/share/gnome/help/gcrystal/C/mendeleiev.html
    ./usr/share/gnome/help/gcrystal/C/license.html
    ./usr/share/gnome/help/gcrystal/C/settings.html
    ·
    ·
    ·

    Como te habrás dado cuenta, cada línea del listado comienza ya sea con /usr/ o con /etc. Pero lo más correcto es que no demos por hecho la ubicación de estos archivos, de modo que el rpm que crearemos sea lo más general posible.

    Entonces, la lista de archivos que pondremos en el rpm debe ser relativa a ciertos directorios de referencias. Esos directorios de referencia se obtendrán dentro del rpm mediante las variables %{_prefix} y %{_sysconfdir} . En realidad hay muchas más variables pero son ésas las más elementales a conocer. La primera de estas variables, %{_prefix} , se refiere a la ruta a partir de la cual se instalarán los programas y sus datos (imagenes, manuales,etc), y en los sistema compatibles con RedHat generalmente apunta a /usr . La segunda de estas variables, %{_sysconfdir} , se refiere a la ruta a partir de la cual se instalarán las configuraciones de sólo lectura, y en los sistemas compatibles con RedHat generalmente apunta a /etc.

    Podemos hacer las sustituciones, de /usr/ por %{_prefix} y /etc/ por %{_sysconfdir}, de manera manual con un editor de texto pero los linuxeros nos distinguimos por contar con herramientas para casi todo y ésta no será la excepción. La herramienta a usar es sed . sed es un editor de flujos, y tiene características muy poderosas pero explicarlas todas daría material para otro artículo. La forma más sencilla de usar sed es de la forma: sed -e s/sustuir_esto/por_esto_otro/ donde tomará como flujo de entrada la entrada estándar y el flujo de salida será enviado a la salida estándar.

    Por ejemplo:


    [tigrux@TigruXtatioN tigrux]$ echo "windows beos solaris" | sed -e s/windows/linux/
    linux beos solaris
    [tigrux@TigruXtatioN tigrux]$
    Aquí, usamos echo para enviar a la salida estándar tres cadenas, ese flujo se redirige a la entrada de sed, y le indicamos a sed que sustituirá la cadena windows por la cadena linux, y el flujo ya procesado por sed se envía a la salida estándar.


    [tigrux@TigruXtatioN gnome-crystal-root]$ cd /tmp/gnome-crystal-root/
    [tigrux@TigruXtatioN gnome-crystal-root]$ \
    > find . -type f | \
    > sed -e s/".\/usr\/"../../../tmp//"%{_prefix}\/"/ | \
    > sed -e s/".\/etc\/"../../../tmp//"%{_sysconfdir}\/"/ > ../files.list

    Observen que tuve que separarlo en varias líneas para fines de presentación, pero pueden combinar las últimas tres líneas en una sola. Pueden leer más de sed en su respectiva página de manual con man sed.

    Revisamos de nuevo el archivo generado, y comprobamos que todo está en orden: los archivos están acomodados en rutas relativas a las variables que arriba quedaron explicadas.



    [tigrux@TigruXtatioN tigrux]# cd /tmp/gnome-crystal-root/
    [tigrux@TigruXtatioN gnome-crystal-root]$ cat ../files.list
    %{_prefix}/bin/gcrystal
    %{_prefix}/share/oaf/gnome-crystal.oaf
    %{_prefix}/share/omf/gcrystal/gcrystal-C.omf
    %{_prefix}/share/gnome/ui/gcrystal.xml
    %{_prefix}/share/gnome/apps/Applications/gcrystal.desktop
    %{_prefix}/share/gnome/help/gcrystal/C/mendeleiev.html
    %{_prefix}/share/gnome/help/gcrystal/C/license.html
    %{_prefix}/share/gnome/help/gcrystal/C/settings.html
    ·
    ·
    ·

    Tenemos la lista de archivos que instalará el rpm, ahora falta un archivo que lleve la specificación del rpm. A éstos archivos de especificación de le llama specs. A continuación se muestra el spec que usaremos, y explicaremos sus partes

    %define version 0.4.1
    %define release 1
    %define name gnome-crystal

    Name: %name
    Summary: Light model visualizer for crystal structures.
    Version: %version
    Release: %release
    Copyright: GPL
    Group: Applications/Productivity
    Source: %{name}-%{version}.tar.gz
    URL: http://jean.brefort.free.fr/info/en/gc/index.html
    BuildRoot: /var/tmp/%{name}-%{version}-root
    Requires: gtkglarea libglade libxml
    BuildRequires: gtkglarea-devel libglade-devel libxml-devel
    Packager: tigrux <tigrux at linuxparatodos dot com>
    %description
    Gnome Crystal is a light model visualizer for crystal structures.
    It uses Gtk+, Gnome, libglade, gettext, OpenGL (or Mesa) and GtkGLArea.

    %prep
    %setup -n %{name}-%{version}

    %build
    %ifarch alpha
    MYARCH_FLAGS="--host=alpha-linux"
    %endif

    CFLAGS="$RPM_OPT_FLAGS"
    ./configure --prefix=%{_prefix} $MYARCH_FLAGS
    make

    %install
    rm -rf $RPM_BUILD_ROOT
    make DESTDIR=$RPM_BUILD_ROOT install

    %clean
    rm -rf $RPM_BUILD_ROOT

    %files -f files.list
    %doc AUTHORS COPYING ChangeLog NEWS README TODO

    Ahora, la siguiente tabla explica términos del spec que tenemos tenemos que suministrar. En realidad un spec tiene muchísimos más términos que no usamos, pero la idea es mantener las cosas simples y nuestro hacker no es un gurú, es sólo un apasionado del software libre.

    %define version 0.4.1 Esta macro lleva la versión del programa, que para nuestro caso en la 0.4.1.
    Las macros se expanden con la sintaxis %{nombre_de_macro}
    %define release 1 Esta macro define la versión del rpm.
    Las macros son muy útiles para evitar escribir de más.
    %define name gnome-crystal Esta macro define el nombre del programa.
    Las tres macros anteriores sirven para construir otros términos.
    Summary: Light model visualizer for crystal structures. Una frase que resuma en pocas palabras la utilidad del programa, lo común es que esta información la tomemos del contenido del README que acompaña al fuente.
    Copyright: GPL Aquí va el tipo de licencia del programa, el tipo de licencia lo vemos también en el README y generalmente es GPL, LGPL o BSD.
    Group: Applications/Productivity Una clasificación del programa, de acuerdo a si es un juego, biblioteca del sistema, etc.
    URL: http://jean.brefort.free.fr/info/en/gc/index.html La página de donde bajamos eñ código fuente.
    BuildRoot: /var/tmp/%{name}-%{version}-root Este es el directorio dentro del cual se redirigirá la instalación del programa, tal como en la técnica que vimos antes. Observe que su nombre se contruye en base a las macros que previamente definimos.
    Requires: gtkglarea libglade libxml Los paquetes que son requeridos para poder ejecutar el programa, lo común es que el INSTALL los indique.
    BuildRequires: gtkglarea-devel libglade-devel libxml-devel Los paquetes necesarios para poder compilarlo.
    Packager: tigrux <tigrux at linuxparatodos dot com> El empaquetador y algún dato para contactarlo.
    %description Gnome Crystal is a light model visualizer for crystal structures. It uses Gtk+, Gnome, libglade, gettext, OpenGL (or Mesa) and GtkGLArea. La descripción completa del programa, también viene en el README
    %files -f files.list Los archivos que instalará el rpm, tal como los hemos determinado en un paso anterior.
    %doc AUTHORS COPYING ChangeLog NEWS README TODO Los archivos de documentación, éstos los vemos al mirar dentro del directorio con el código fuente y sus nombres casi siempre son los mismos.

    Ya tenemos el spec y lo guardamos como gnome-crystal.spec, y tenemos también el archivo files.list con los archivos que instala el rpm. Siendo superusuario, copiamos estos archivos dentro del directorio con el fuente del programa. Acto seguido comprimimos de nuevo el directorio del fuente. Una vez comprimido ya podemos proceder a generar el rpm con rpm -ta. Abajo ilustramos ésto.

    
    [tigrux@TigruXtatioN tigrux]$ su
    Password:
    [root@TigruXtatioN tigrux]# cp gnome-crystal.spec /tmp/gnome-crystal-root/files.list
    gnome-crystal-0.4.1/
    [root@TigruXtatioN tigrux]# tar cfvz gnome-crystal-0.4.1.tar.gz gnome-crystal-0.4.1/
    [root@TigruXtatioN tigrux]# rpm -ta gnome-crystal-0.4.1.tar.gz
    

    Al final, nos creará dos archivos rpms, uno es un rpm con el fuente y el otro es un binario que ya podemos redistribuir. La ruta donde los genera depende de la distribución. Pero éso no es problema porque las últimas líneas de la compilación mostrarán donde son guardados esos rpms que generamos. En particular, en un sistema mandrake:

    
    ·
    ·
    ·
    Wrote: /usr/src/RPM/SRPMS/gnome-crystal-0.4.1-1.src.rpm
    Wrote: /usr/src/RPM/RPMS/i686/gnome-crystal-0.4.1-1.i686.rpm
    Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.40997
    + umask 022
    + cd /usr/src/RPM/BUILD
    + cd gnome-crystal-0.4.1
    + rm -rf /var/tmp/gnome-crystal-0.4.2-root
    + exit 0
    [root@TigruXtatioN tigrux]#
    

    Hasta aquí, hemos creado el rpm del programa. Y aunque el método que usamos es muy sencillo, la verdad es que tiene algunas deficiencias:

    • Si modificamos alguna opción de compilación o modificamos el código fuente, entonces también tenemos que regenerar el archivo files.list dado que no sabemos si variará la lista de archivos que instalará.
    • Es un método intrusivo, porque nos obliga a tener que agregar un par de archivos al código fuente. éso es malo porque se supone que el fuente comprimido nunca debería tener que ser modificado.

    Luego, perfeccionaremos nuestro método para que deje de ser intrusivo. Lo que haremos será añadir un paso adicional en el que buscaremos expresar la lista de archivos usando comodines. Para ello, editamos el archivo files.list con algún editor de tu preferencia, por ejemplo gedit. Y simplificaremos su contenido usando comodines y nombres de directorio.

    El archivo original antes de hacer esas simplificaciones es el siguiente:

    %{_prefix}/bin/gcrystal
    %{_prefix}/share/oaf/gnome-crystal.oaf
    %{_prefix}/share/omf/gcrystal/gcrystal-C.omf
    %{_prefix}/share/gnome/ui/gcrystal.xml
    %{_prefix}/share/gnome/apps/Applications/gcrystal.desktop
    %{_prefix}/share/gnome/help/gcrystal/C/mendeleiev.html
    %{_prefix}/share/gnome/help/gcrystal/C/license.html
    %{_prefix}/share/gnome/help/gcrystal/C/settings.html
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/warning.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/toc_blank.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/note.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/toc_plus.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/important.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/tip.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/home.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/toc_minus.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/prev.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/up.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/next.gif
    %{_prefix}/share/gnome/help/gcrystal/C/stylesheet-images/caution.gif
    %{_prefix}/share/gnome/help/gcrystal/C/windows.html
    %{_prefix}/share/gnome/help/gcrystal/C/crystal.html
    %{_prefix}/share/gnome/help/gcrystal/C/gcrystal.sgml
    %{_prefix}/share/gnome/help/gcrystal/C/topic.dat
    %{_prefix}/share/gnome/help/gcrystal/C/index.html
    %{_prefix}/share/gnome/help/gcrystal/C/view.html
    %{_prefix}/share/gnome/help/gcrystal/C/docbook.css
    %{_prefix}/share/gnome/help/gcrystal/C/ln8.html
    %{_prefix}/share/gnome/help/gcrystal/C/file.html
    %{_prefix}/share/gnome/help/gcrystal/fr/mendeleiev.html
    %{_prefix}/share/gnome/help/gcrystal/fr/license.html
    %{_prefix}/share/gnome/help/gcrystal/fr/settings.html
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/warning.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/toc_blank.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/note.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/toc_plus.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/important.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/tip.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/home.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/toc_minus.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/prev.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/up.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/next.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/stylesheet-images/caution.gif
    %{_prefix}/share/gnome/help/gcrystal/fr/windows.html
    %{_prefix}/share/gnome/help/gcrystal/fr/crystal.html
    %{_prefix}/share/gnome/help/gcrystal/fr/gcrystal.sgml
    %{_prefix}/share/gnome/help/gcrystal/fr/topic.dat
    %{_prefix}/share/gnome/help/gcrystal/fr/index.html
    %{_prefix}/share/gnome/help/gcrystal/fr/view.html
    %{_prefix}/share/gnome/help/gcrystal/fr/docbook.css
    %{_prefix}/share/gnome/help/gcrystal/fr/ln8.html
    %{_prefix}/share/gnome/help/gcrystal/fr/file.html
    %{_prefix}/share/gcrystal/glade/gamma.xpm
    %{_prefix}/share/gcrystal/glade/gcrystal.glade
    %{_prefix}/share/gcrystal/glade/lattice.glade
    %{_prefix}/share/gcrystal/glade/application.glade
    %{_prefix}/share/gcrystal/glade/mendeleiev.glade
    %{_prefix}/share/gcrystal/glade/beta.xpm
    %{_prefix}/share/gcrystal/glade/prefs.glade
    %{_prefix}/share/gcrystal/glade/alpha.xpm
    %{_prefix}/share/gcrystal/glade/theta.xpm
    %{_prefix}/share/gcrystal/glade/phi.xpm
    %{_prefix}/share/gcrystal/glade/psi.xpm
    %{_prefix}/share/gcrystal/glade/view_settings.glade
    %{_prefix}/share/pixmaps/gnome-crystal.png

    Después de la simplificación usando comodines, el nuevo contenido es:

    %{_prefix}/bin/gcrystal
    %{_prefix}/share/*

    Se ha enfatizado el uso del comodín * para mostrar que todo lo que hay dentro de %{_prefix}/share/ se expresa simplemente como %{_prefix}/share/*.

    Ya que tenemos la lista simplificada, la ponemos directamente en el spec, de modo que ya no necesitaremos el archivo files.list, ésto se hace simplemente editando el archivo gnome-crystal.spec y sustituyendo la línea:

    %files -f files.list
    por lo siguiente:

    %files
    %{_prefix}/bin/gcrystal
    %{_prefix}/share/*
    e incluso estaríamos tentados a sustituírlo por:
    %files
    %{_prefix}/*
    pero ésto último no es recomendable porque es preferible tener los archivos binarios y los archivos de datos por separado.

    Compilar de esta manera es también muy sencillo. Primero tienes que localizar en dónde se localiza el directorio de fuentes de rpm para tu distribución. En mandrake la ruta está en /usr/src/RPM/SOURCES y en RedHat está ubicada en /usr/src/redhat/SOURCES . Darnos cuenta de ésto es muy sencillo. Simplemente entra al directorio donde está el spec ya corregido y trata de recompilar con rpm -ba , consulta la página de manual de rpm con man rpm para consultar más opciones. Asegúrate primero de que el propietario del spec y del fuente sea el usuario root, o de otro modo te marcará errores de propietario equivocado. Veamos ésto en detalle.

    [root@TigruXtatioN tigrux]# chown root:root gnome-crystal.spec
    [root@TigruXtatioN tigrux]# rpm -ba gnome-crystal.spec
    error: File /usr/src/RPM/SOURCES/gnome-crystal-0.4.1.tar.gz: No existe el fichero o el directorio
    [root@TigruXtatioN tigrux]#

    De ver el mensaje de error, entonces sabemos dónde copiar el archivo, y lo copiamos para luego compilar.

    Casi hemos concluído con el tema del empaquetado. Sólo resta recordarles que los rpms binarios se instalan con rpm -Uvh archivo.i686.rpm y los rpms de código fuente se recompilan con rpm --rebuild archivo.src.rpm.

    [root@TigruXtatioN i686]# pwd
    /usr/src/RPM/RPMS/i686
    [root@TigruXtatioN i686]# rpm -Uvh gnome-crystal-0.4.1-1.i686.rpm
    Preparing... ########################################### [100%]
    1:gnome-crystal ########################################### [100%]
    [root@TigruXtatioN i686]#

    Ya instalado, buscamos el ejecutable. Es fácil encontrarlo porque generalmente se instalan en el directorio de binarios. Ya identificado, simplemente lo ejecutamos y lo veremos en acción.

    [tigrux@TigruXtatioN tigrux]$ rpm -ql gnome-crystal | grep /usr/bin
    /usr/bin/gcrystal
    [tigrux@TigruXtatioN tigrux]$ gcrystal

    gnome_crystal en la maquina del Tigrux
    Gnome Crystal en acción, captado en la TigruXtatioN

    Si he escrito i686 es porque la máquina de las pruebas es un Pentium3. Lo más común es que los paquetes oficiales de RedHat estén compilados para i386 y que los de mandrake estén compilados para i586. Si algún paquete o biblioteca requerido no está instalado, entonces se le indicará. Por supuesto, no pueden instalar un rpm binario de una arquitectura que no sea compatible con otra; por ejemplo, no pueden instalar un paquete compilado para ia64 (Itanium) en un i586 (compatibles con Pentium). Algunas veces verán rpms para la arquitectura noarch , ésto es porque no son independientes de la arquiotectura. Es muy común que programas interpretados como los escritos en Perl, Java ó Python se presenten de esta manera. Pero no nos olvidemos del contexto. Nuestro hacker ya tiene los ansiados rpms que suministrará a sus amigos, y ya sabe cómo generarlos, recompilarlos e instalarlos. Pero aun está presente la barrera del idioma. Aun hay camino por recorrer.

    gnome_crystal aun no esta traducido
    Gnome Crystal no está traducido al español, éso incomoda al heróico hacker.

  7. La traducción
  8. El siguiente paso de nuestro amigo, que más que hacker ya parece fakir, es hacer la traducción. Ya vimos lo importante que son las traducciones, y ahora aprenderemos a realizarlas. Pero para ello necesitas saber exactamente qué es lo que vas a traducir. ¿Piensas que tendrás que sumergirte en un mar de código fuente y estar reemplazando, cadena por cadena del fuente, con paciencia de relojero? Te equivocas, y como verás, realizar una traducción es algo sumamente sencillo, y cualquiera puede hacerlo.

    Lo primero es localizar la plantilla o patrón de cadenas que vas a traducir, ésta se encuentra, generalmente, en el subdirectorio po/ del código fuente y lleva el mismo nombre que el programa y lleva la extensión .pot. Así, sabemos que debemos buscar gnome-crystal.pot.

    
    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ ls po/
    cat_id_tbl.c ChangeLog fr.gmo fr.po gnome-crystal.pot
    it.po Makefile.in.in POTFILES.in stamp-cat-id
    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$
    

    Si revisas este archivo con algún visor de texto, verás que es simple texto con un cierto formato: una cabecera con información del proyecto, autor y traductor(es) y después una larga suceción de identificadores y cadenas a manera de diccionario. Por ejemplo, un par de estas entradas son:


    #: ui/application.c:10
    msgid "O_pen in a new window..."
    msgstr ""

    #: ui/application.c:11
    msgid "Export data or graphics"
    msgstr ""

    Como te darás cuenta, la entrada msgid se refiere a la cadena que buscas traducir, mientras que la entrada msgstr se refiere a la cadena traducida al idioma en cuestión. Hay varias opciones para hacer estas traducciones:

    • La solución difícil (y muy difícil) es editar el archivo cual si fuese un archivo ordinario de texto y hacer las traducciones respetando el formato. Ni que decir que es sólo para gente que le gusta sufrir.
    • La otra solución es usar Emacs combinado con un script de lisp que hace la tarea un poco más fácil, pero no tiene las facilidades de una interfaz visual.
    • La última, más reciente y más fácil, es usar GTranslator

    Procedemos a descargar gtranslator y lo instalamos. En la página de descarga ya se suministran rpms o bien pueden contruir el suyo desde las fuente usando la técnica ya vista antes de empaquetado .

    Copiamos la plantilla a un archivo que tenga el mismo nombre que el código del idioma que deseamos y su extensión será .po, entonces para nuestro caso el archivo será es.po . Ahora ejecutamos gtranslator para editarlo.

    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ cd po
    [tigrux@TigruXtatioN po]$ cp gnome-crystal.pot es.po
    [tigrux@TigruXtatioN po]$ gtranslator es.po

    El resto es fácil, sólo tienes que rellenar los formularios y traducir los mensajes al español. Advertirás que gtranslator te muestra cuales son los mensajes sin traducir,

    edicion de informacion general de la traduccion
    El diálogo de informacion general de la traducción


    captura de gtranslator
    GTranslator en acción

    Al cabo de algunas consultas al diccionario, preguntarle a amigos, revisar foros, y algunos cientos de palabras traducidas, por fin habremos finalizado la traducción de todas las cadenas. Para un programa relativamente pequeño como gnome-crystal, esta traduccion se hace en cosa de unas 4 horas o menos si sabemos teclear muy rápido. Ahora hay que incorporar al programa estos cambios.

    Dentro del directorio con el fuente, edita el archivo configure.in y déjate guiar por el instinto para buscar una cadena que intuyas que contiene la lista de traducciones. Excelente, el instinto te ha guiado e identificas la cadena en la línea 29. Modifica esta cadena para que le añadas es. Entonces la cadena debe decir:

    configure.in:29 ALL_LINGUAS="fr it es"

    Hecho éso, ahora tienes que regenerar el configure, es muy fácil y sólo tienes que ejecutar autoconf. autoconf lee los archivos de especificación que distingue porque tienen extensión .in, esta información le sirve para construir el famoso configure, el cual lleva a cabo la comprobación de programas y bibliotecas necesarios para compilar, detección del tipo y configuración del sistema, sólo mencionar algo de lo mucho que puede hacer. Regenerar el configure es necesario porque has modificado uno de los archivos de configuración.

    Ahora puedes revisar que todo haya salido bien. Regenera el rpm como hemos visto y comprueba que la traducción está bien realizada. No es de extrañar que tengas que revisar algunas cadenas porque algunas cosas no siempre quedan bien al disponerse en la interfaz de usuario.

    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ autoconf
    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$

    Una vez que estés conforme con la traducción, aun hay un detalle desagradable: hemos modificado el árbol con código fuente, lo cual sabemos que no es correcto. Por lo general, las modificaciones a los códigos fuentes se almacenan en archivos a los que se denomina parches.

    Un parche no es otra cosa que un archivo conteniendo listas de cambios al código fuente, su contenido se puede expresar coloquialamente con la siguiente frase:

    De este archivo, quítale estas línea y ponle estas otras; y así para cada archivo que hallas modificado.
    Puede parecer graciosa esta metáfora, pero un parche realmente contiene la informacion en una forma muy parecida a la expresión coloquial anterior.

    Procedamos a contruir el parche. El código fuente que has modificado yace en un directorio, entonces muévelo a otro directorio con un nombre parecido. Ahora, nuevamente descomprime el fuente original tal que ambos directorios de fuentes estén en el mismo directorio padre. La utilería que usaremos para este caso se llama diff. diff , como indica su nombre, analiza las diferencias entre archivos o directorios y envía las diferencias a la salida estándar. Como todo programa GNU, tiene muchas opciones pero nosotros sólo ocuparemos-r que es para buscar diferencias recursivamente dentro de directorios, -u que presenta la salida en un formato común a otros programas similares, y -N para que además considere diferencias en la estructura de directorios. Es común comprimir los parches con el habitual gzip porque éstos suelen ser muy grandes pero fáciles de comprimir. Menos palabras y más acción:

    [tigrux@TigruXtatioN tmp]$ ls
    gnome-crystal-0.4.1/ gnome-crystal-0.4.1-es/
    [tigrux@TigruXtatioN tmp]$ diff -urN gnome-crystal-0.4.1 gnome-crystal-0.4.1-es > es-translation.patch
    [tigrux@TigruXtatioN tmp]$ gzip es-translation.patch

    Ya tenemos el parche, aplicar un parche es muy sencillo. Basta con colocarte en el directorio con el fuente original, ejecutar un simple comando y con éso tendrás dos directorios idénticos. En el siguiente ejemplo, parcharemos el directorio fuente original para hacer que tome nuestros cambios. Consulta la documentación de patch para saber qué opciones tiene y cómo usarlas.

    [tigrux@TigruXtatioN tmp]$ ls
    es-translation.patch.gz gnome-crystal-0.4.1/ gnome-crystal-0.4.1-es/
    [tigrux@TigruXtatioN tmp]$ cd gnome-crystal-0.4.1/
    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$ gzip -dc ../es-translation.patch.gz | patch -p1
    patching file configure
    patching file configure.in
    patching file po/es.po
    [tigrux@TigruXtatioN gnome-crystal-0.4.1]$

    Ya sabemos usar parches. Ahora tenemos que modificar un poco el spec para adecuarlo a los nuevos cambios. Como te darás cuenta, ahora nuestro spec depende de dos archivos fuente: uno con el fuente original y otro con el parche nuestras modificaciones.

    %define version 0.4.1
    %define release 1.es
    %define name gnome-crystal

    Name: %name
    Summary: Light model visualizer for crystal structures.
    Version: %version
    Release: %release
    Copyright: GPL
    Group: Applications/Productivity
    Source: %{name}-%{version}.tar.gz
    Patch1: es-translation.patch.gz
    BuildRoot: /var/tmp/%{name}-%{version}-root
    Requires: gtkglarea libglade
    %description
    Gnome Crystal is a light model visualizer for crystal structures.
    It uses Gtk+, Gnome, libglade, gettext, OpenGL(or Mesa) and GtkGLArea.
    I develop it for pedagogical purpose. License is GPL

    %prep
    %setup -n %{name}-%{version}
    %patch1 -p1

    %build
    %ifarch alpha
    MYARCH_FLAGS="--host=alpha-linux"
    %endif

    CFLAGS="$RPM_OPT_FLAGS"
    ./configure --prefix=%{_prefix} $MYARCH_FLAGS
    make

    %install
    rm -rf $RPM_BUILD_ROOT
    make DESTDIR=$RPM_BUILD_ROOT install

    %clean
    rm -rf $RPM_BUILD_ROOT

    %files
    %{_prefix}/bin/gcrystal
    %{_prefix}/share/*

    %doc AUTHORS COPYING ChangeLog NEWS README TODO

    Hubo cambios, en la siguiente tabla los explicamos:.

    %define release 1.es Modificamos esta macro para indicar los cambios hechos.
    Es arbitrario pero debe ser algo entendible.
    Patch1: es-translation.patch.gz Agregamos este término para indicar que el fuente del rpm consta también de un parche.
    Los parches se numeran en el orden en que deben ser aplicados.
    %patch1 -p1 Este indica que el parche debe aplicarse antes de compilar.
    En este caso, está aplicando el parche #1.

    Regeneramos el rpm como ya sabemos, y obtendremos:

    Wrote: /usr/src/RPM/SRPMS/gnome-crystal-0.4.1-1.es.src.rpm
    Wrote: /usr/src/RPM/RPMS/i686/gnome-crystal-0.4.1-1.es.i686.rpm

    Lo instalamos y ejecutamos:

    gnome_crystal finalmente traducido
    Gnome Crystal está ya traducido al español, casi hemos terminado.

    La aplicación está ya compilada, traducida y empaquetada en rpm. ¿Entonces qué es lo que molesta a nuestro valiente amigo? Le incomoda pensar que su trabajo sea en vano, y desea compartirlo con el mundo para que así sucesivas versiones de gnome-crystal incorporen su contribución.

  9. La incorporación.
  10. Respiren tranquilos, esto es muy breve. Tenemos los frutos de nuestro trabajo: un spec para hacer el rpm y el parche. El resto es sencillamente contactar a los autores. Los programas GNU más grandes constan de una estructura de desarrollo concurrente de versiones, y en esos casos lo que debe hacerse es entrar a la página del proyecto, suscribirse a la lista de desarrolladores y enviar a esa lista el parche y demás contribuciones que hayamos hecho. Dependiendo de la ocupación de los jefes de proyecto y del tráfico de la lista, ésto puede demorar desde unas cuantas horas hasta varios días. Y en los programas más pequeños como gnome-crystal, basta con contactar directamente al autor por correo, avisarle de los cambios y hacerle llegar los parches de algún modo acordado.

Para concluir

ésto que les he narrado fue escrito por su servidor El Tigrux. Todo transcurrió en algunos días de febrero y en realidad el trabajo duro fue la traducción, pues el resto de los puntos explicados son muy fáciles y rápidos de llevarse a cabo. En esos días de febrero, la versión actual de gnome-crystal era la 0.4.1, y al momento de escribir este artículo va ya en la versión 0.4.3. La traducción al español ha sido ya incorporada al código fuente oficial y felizmente ya tenemos gnome-crystal en español para todo aquel que lo descargue.

Realmente aprendimos muchas cosas en este artículo. Vimos desde la elemental compilación, pasando por utilerías GNU hasta la traducción, que realmente siempre fue el fin. Concluímos que si bien modificar programas GNU es muy fácil, en realidad hay un gran acervo de conocimiento necesario, pero es bastante fácil de adquirir, recurriendo a las páginas de manual, foros de desarrolladores e incluso husmeando en el código fuente de tantos programas GNU de que disponemos.

gnome-crystal fue elegido para ser traducido porque su código fuente es pequeño y aun tiene todas las características de un buen programa GNU y sobre todo de un buen programa Gnome. Además de ser enormemente útil para fines didácticos. Pero en realidad lo visto aplica a cualquier programa GNU/Gnome y el escenario es por supuesto a libre elección. Como habrán advertido, no programamos ni una sola línea de código. Ésto demuestra que no es necesario ser experto programador para hacer importantes contribuciones.

Acerca del autor

El Tigrux es editor de LinuxParaTodos y pueden contactarle en <tigrux arroba linuxparatodos punto com> ó directamente en ICQ 45507615


Mexternet banner Powered by White Box Linux Web site powered by Geeklog
 Derechos de autor © 2005 Linux Para Todos
 Todas las marcas y derechos en esta página son de sus respectivos dueños.
 Puede sindicar nuestros titulares a través de nuestro fichero RSS.