domingo, 8 de mayo de 2011

Modificación básica del instalador de Ubuntu mediante Ubiquity

Ubuntu para su instalador utiliza el paquete ubiquity (basado en debian installer) el cual nos brinda la todas las opciones y vistas de instalación que se presentan en este proceso.


Obtención del paquete ubiquity


Ubuntu tiene una muy amplia gama de paquetes que proporcionan herramientas de software de todo tipo. Si se quiere obtener información sobre un paquete o descargarlos se puede recurrir al sitio web http://packages.ubuntu.com/.

Para buscar el paquete que se desea, en nuestro caso y como el nombre del artículo lo dice es ubuquity, se digita en la sección de búsqueda, previamente seleccionada la distribución respectiva, como lo vemos a continuación:



Esto nos genera una lista con los paquetes encontrados y seleccionamos el que buscamos, para este ejemplo:



Lo interesante de esto es que, en la gran mayoría de paquetes, se puede descargar el código fuente, normalmente a la derecha del sitio web, para su modificación, haciendo valer uno de los derechos fundamentales del software libre. En este paquete no es la excepción, por lo cual bajamos el archivo que tiene la extención "tar.bz2" (recordar descargarlo en un lugar donde se pueda accesar para modificar luego sus archivos):




Una vez descargado el archivo lo descomprimimos mediante el siguiente comando:

$ tar jvxf /ruta/archivo.tar.bz2

Lo mismo va para el paquete "ubiquity-slideshow-ubuntu" el cual descargamos siguiendo los pasos antes descritos. Y estamos listos para empezar a trabajar.


Modificación de los contenidos del paquete



Este punto es muy relevante, y me quiero detener un poco para recalcar la importancia de ser perseverantes y traviesos, como niños que desarman las cosas para saber como funcionan, pues eso exactamente es lo que hay que hacer, desarmar el paquete, que es ese conjunto de archivos y carpetas que a la hora de compilarse dan vida a uno o varios programas, y ver cada parte, estudiarla y aprender como funciona. Para esto está la documentación que los desarrolladores dejaron.

Paquete Ubiquity

Lo primero que hacemos es ver el árbol de directorios con que cuenta el paquete. esto mediante el comando:
$ ls /ruta/directorio_paquete
Este comando lo que hace es mostrar los elementos presentes en una carpeta, y nos ofrece el siguiente resultado:



(las letras azules representa que el elemento es una carpeta, y las verdes que son ejecutables) Entre las cosas que nos interesa cambiar, está el nombre de la distribución, agregar a los colaboradores que están modificando el paquete en la documentación (mérito a quien mérito merece), cambiar imágenes, etc. Por lo tanto describiré el contenido de algunas carpetas:

  • debian: En esta carpeta se encuentran los archivos de configuración donde se describen las rutas de instalación del paquete una vez que se compile, además de las traducciones según el idioma que se elija
  • d-i: En esta carpeta se encuentra el instalador de debian a modo texto, todos sus archivos de configuración y los archivos necesarios para su compilación
  • doc: Acá se encuentran los archivos de documentación del paquete ubiquity
  • gui: En ella se definen las pantallas de la interface gráfica de usuario, cada componente y texto que en ella se muestra.
  • pixmaps: Dentro están los íconos e imágenes que se utilizan en las pantallas de instalación.
  • po: En la carpeta se encuentran algunas opciones de traducción de la aplicación (cualquier carpeta con el nombre "po" nos da esas opciones en este paquete)
  • ubiquity: Acá es donde está el código fuente de la instalación mediante ubiquity.
Lo que se hace una vez se conoce la estructura de un paquete es empezar a modificarlo, para cambiar las imágenes se modificaría la carpeta pixmaps por ejemplo, si se quiere cambiar de posición de esta imágen nos iríamos al formulario descrito en la carpeta "gui".

Al confeccionar una distribución nueva se tiene que identificar en cada parte del código y documentación, pero dejando créditos a quien créditos merece, osea, dejar los créditos de las personas que han participado en el desarrollo del paquete con anterioridad.


Paquete ubiquity-slideshow-ubuntu



Al igual que con el paquete anterior se empieza por ver el contenido del paquete, para lo cual utilizamos el comando:
$ ls /ruta/directorio_paquete

lo cual nos muestra el siguiente resultado:


Este paquete es un poco más complicado, pues tiene ejemplos de slideshows (tiras de imágenes) de varias distribuciones, y nos brinda herramientas para probar como va quedando el trabajo realizado. En la raíz del paquete los elementos que nos interesan por ahora serían:

  • debian: Carpeta donde se encuentran todos los archivos necesarios para la compilación del paquete.
  • po: Carpeta donde se encuentran todos los archivos de traducciones según la distribución
  • slideshows: Carpeta que contiene los archivos de configuración, contenido e imágenes presentes en la instalación de la distribución.
  • AUTHORS: Archivo donde se encuentran los nombres de las personas que participaron en la modificación del paquete.
  • slideshow.ui: Archivo que establece la estructura de la ventana de slideshow
  • test-slideshow.sh : Archivo que nos permite ver el resultado de las modificaciones realizadas.
  • update-launchpad-translation.sh Archivo que refresca la carpeta build, que es la que tiene la compilación del paquete.


Haciendo los slideshows



Si observamos dentro de la carpeta slideshows, nos encontramos muchas carpetas con nombres de distribuciones. Estos son los slideshows que aparecen en cada distribución. Para nuestro caso, debemos crear una carpeta dentro, junto a las otras distribuciones, con el nombre de nuestro proyecto:
$ mkdir /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion


dentro de esta carpeta creamos un archivo llamado "slideshow.conf",donde se establece el tamaño de la tira de imágenes. Se puede hacer con un editor de texto y guardarlo dentro de la siguiente manera:
$ nano /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slideshow.conf
y dentro del archivo:
[Slideshow]
width:752
height:530


Luego creamos la carpeta "slides", que contendrá todos los archivos que se mostrarán al usuario final:
$ mkdir /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slides
Seguido a esto nos posicionamos en la recién creada carpeta:
$ cd /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slides
La estructura que debe tener la carpeta "slides" es la siguiente:
  • icons: Carpeta donde se guardan todos los iconos que se utilizaran en los slides.
  • link: Carpeta donde se guardan imagens y las hojas de estilo que se utilizan los slides
  • link-core: Carpeta donde se guardan los scripts que manejan la operabilidad de los slides
  • screenshots: Carpeta donde se guardan las capturas de pantalla que se muestran en cada slide.
  • index.html: archivo donde se establecen cuales slides se mostrarán durante la instalación, el tiempo que durará cada slide y los scripts utilizados y otras cosas. En resumen es el archivo que ordena que y como se verá.
  • _slides.html: representa los slides, tiene que haber un archivo html con una estructura determinada para cada slide que se quiera mostrar. Esta estructura será necesaria para que se muestren los slides en el pase de imágenes.



Para ahorrarnos el esfuerzo, podemos copiar copiar de los slideshows de otra distribución las carpetas: icons, link, link-core, y screenshots; además del archivo index.html. Con esto solo queda modificar cada elemento según nuestra necesidad.

Ahora haremos un slide, este recomiendo que sea la versión en inglés (más adelante en el tutorial se mostrará como crear la traducción), para ello creamos un archivo con un nombre descriptivo a lo que queramos mostrar, por ejemplo music.html:
$ nano music.html


Este es una simple página web que se muestra en el slideshow, y como toda página web su estructura se puede definir con una hoja de estilos (en nuestro caso la ubicamos en /link/general.css según lo copiado anteriormente). Es bueno definir bien la estructura que se desea seguir y hacerlo un estandar para el diseño de todas las slides. El slide que creamos queda así:
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title></title>
  <link href="link/general.css" rel="stylesheet" type="text/css">
</head>

<body>

<div class="header">
<h1 class="slidetitle">Make your sounds</h1>
</div>

<div class="main">

<div class="text">

<div>
<p>With Audacity you can edit audio like a professional. With a variety of
effects, versatility and intuitive way to work the audio editing is easy and
fun. </p>
</div>

<div class="featured">
<h2 class="subtitle">Included software</h2>
<ul>
  <li><img class="icon" src="icons/audacity.png">
    <p class="caption">Audacity Audio Editor</p>
  </li>
</ul>
</div>
</div>
<img class="screenshot" src="screenshots/music.jpeg"> </div>
</body>
</html>
Este paso se repite por cada slide que queramos mostrar en la instalación..


Por haber hecho los slides lo siguiente es configurar el archivo "index.html", este a diferencia del anterior si tiene que tener una estructura, pues usaremos los scripts que copiamos en la carpeta "link-core". A continuación muestro un ejemplo, con resaltado sin negrita el donde ubicamos los slides que habíamos creado:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title>ubiquity-slideshow-innovaOS</title>
  <link href="link/general.css" rel="stylesheet" type="text/css">
  <base target="_blank">
  <script type="text/javascript" src="link-core/jquery.js">
 </script>
  <script type="text/javascript" src="link-core/jquery.cycle.all.js">
 </script>
  <script type="text/javascript" src="directory.js">
 </script>
  <script type="text/javascript">
                 SLIDESHOW_OPTIONS = {
                         timeout:50000,
                         speed:600,
                 }
  </script>
  <script type="text/javascript" src="link-core/slideshow.js">
 </script>
</head>

<body>

<div id="slideshow">

<div>
<a href="welcome.html"></a></div>

<div>
<a href="usc.html"></a></div>

<div>
<a href="photos.html"></a></div>

<div>
<a href="music.html"></a></div>

<div>
<a href="education.html"></a></div>

<div>
<a href="office.html"></a></div>

<div>
<a href="gethelp.html"></a></div>
</div>

<div id="controls">
<a class="control-arrow" id="prev-slide"></a> <a class="control-arrow"
id="next-slide"></a> <input type="hidden" id="current-slide"> </div>
</body>
</html>


Ahora que tenemos configurados los slides (hechos en inglés para nuestro ejemplo) nos dispondremos a traducir los slides. Para ello nos dirigimos al la carpeta ubicada en "/ruta/paquete/po":
$ cd /ruta/paquete/po


Dentro de ella encontramos carpetas con los nombres de varias distribuciones, entonces debemos crear una para la nuestra:
$ mkdir nombre_distribucion
Y nos posicionamos en ella:
$ cd nombre_distribucion


Dentro se crean archivos de traducción por cada idioma que se desee, nosotros solo haremos un archivo para el idioma español, Ahora bien, el nombre del archivo se define con la abreviatura en 2 letras del idioma más la extención "po".
$ nano es.po
Para más información y ver el funcionamiento de este tipo de archivos pueden consultar el blog de "120% linux" en el artículo: http://120linux.com/traduciendo-aplicaciones-editando-archivos-po/.


Con esto tenemos "casi" terminada esta pequeña travesía, para acabar debemos actualizar los archivos de contrucción. Ejecutamos el archivo "update-launchpad-translations.sh":
$ sh /ruta/paquete/update-launchpad-translations.sh



Para probar nuestro trabajo podemos utilizar el archivo "test-slideshow.sh", él nos dará una lista con las distribuciones y escojemos la nuestra.
y una vez escogido vemos nuestro resultado:

miércoles, 6 de abril de 2011

Configuarión de gnome desde consola con el comando gconftool-2


Para establecer por defecto siertos valores como el fondo de pantalla, iconos y themas del gdk, se utiliza el comando “gconftools-2″ de consola, lo cual afecta a cada usuario presente o nuevo usuario dependiendo del caso.

el comando se compone de varias partes:

  • gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory \  = Define el recurso que se quiera modificar, además si es por defecto o reglamentario
  • –type string \  = Define el tipo de la entrada
  • –set /desktop/gnome/background/picture_filename nombre-de-archivo.png  = define la entrada a modificar y el valor que se quiere modificar.

Así entonces, si se quiere definir por defecto un fondo de pantalla el comando en la consola, como super usuario, sería:

gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/background/picture_filename nombre-de-archivo.png

Si se quiere modificar el paquete de íconos por defecto en nuestra distro entonces pondríamos:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/icon_theme nombre-de-tema

O bien si se quiere modificar el thema del gtk:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/gtk_theme nombre-del-tema

Crear tema de Plymouth para el arranque del sistema

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal.


Antes de empezar se debe descargar el paquete simply_line que se encuentra en gnome-look.org, donde escogemos la versión de plymouth. Esto nos descargará un ".deb", el cual debemos abrir con el gestor de archivadores (como file-roller que es el que viene por defecto en Ubuntu). Nos posicionamos en de la ruta /lib/plymouth/themes/ dentro del paquete .deb y copiamos en el Escritorio (por cuestiones prácticas en este lugar es donde se realizarán los trabajos) la carpeta simply_line/, la cual es el tema que vamos a trabajar. Se procede seguido a cambiar el nombre de la carpeta por uno nuevo, el cual será el nombre del nuevo tema, en nuestro caso "innovaOS". Para esto utilizamos el comando mv desde la consola de comandos:
mv /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS

Entonces se debería tener una ruta como /home/usuario/Escritorio/innovaOS/ y dentro de ella unos archivos que en transcurso del manual se detallará para qué sirven.
Como se puede hacer notar el método de utilización para la creación del tema en este mini-manual es "La modificación" (gracias al software libre y sus libertades ;)). El tema a realizar se llamará InnovaOS.


Partes de un tema Plymouth

Un thema en plymouth es básicamente una serie de archivos en una carpeta, la carpeta tiene el nombre del tema que quiere crear. Esta carpeta se encuentra en una ruta específica que se verá más adelante, pero para su trabajo y modificación se puede hacer desde cualquier parte (como el escritorio /home/usuario/Escritorio). Para nuestro ejemplo del tema innovaOS la ruta sería: /home/usuario/Escritorio/innovaOS
Normalmente lleva el nombre del tema más la extensión "plymouth" (ejemplo simply_line.plymouth). En la configuración de un tema nuevo mediante el método de modificación, como es nuestro caso, se le cambiaría el nombre respetando la extensión (ejempo tu_tema.plymouth).
En el contenido de este archivo se establece el nombre, la descripción y las características de los archivos de script. Posee 2 características:


  • ImageDir: carpeta donde se encuentran las imágenes a utilizar en el tema
  • ScriptFile: se establece la ruta y nombre del archivo de script que tiene la programación del tema Plymouth.

El contenido del archivo sería:
[Plymouth Theme]
Name=Nombre del Tema
Description= Descripción que deseamos mostrar en el tema

ModuleName=script
[script]
ImageDir=/lib/plymouth/themes/nombre_del_tema
ScriptFile=/lib/plymouth/themes/nombre_del_tema/script.script


Archivos de imágenes.


Son todos los archivos de imágenes que se utilizarán para hacer nuestras animaciones, la ruta donde se encuentran se establece en el archivo de configuración. Pero a la hora de trabajar y modificar el thema lo trabajaremos en la carpeta que creamos al principio (en nuestro ejempo /home/usuario/Escritorio/innovaOS).


Archivo del script de programación.


El archivo que tiene todas las tareas y procedimientos que realizará plymouth según nosotros lo definamos. Este se encuentra en la ruta establecida en el archivo de configuración de plymouth, igual el nombre que debe tener
Antes de continuar se debe conocer un poco sobre el lenguaje de script utilizado por plymouth, para esto se debe leer el artículo publicado en freedesktop.org sobre el como programar en el lenguaje de script de plymouth.





Modificando nuestro tema



Primero cambiamos el nombre de la carpeta que anteriormente sacamos del paquete del tema de "simply_line" por "innovaOS". Esto se puede hacer en la linea de comandos con el comando mv:


# mv -R /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS




 nos posicionamos dentro de la carpeta del tema:



# cd /home/usuario/Escritorio/innovaOS



Editamos el archivo de configuración del plymouth, lo primero es cambiar el nombre del archivo por "innovaOS.plymouth". 


# mv simply_line.plymouth innovaOS.plymouth

Luego el contenido con un editor de texto (usaremos nano, pero pueden utilizar gedit, vi,kate o el que quieran):


# nano innovaOS.plymouth

quedando de la siguiente manera:

[Plymouth Theme]
Name=InnovaOS


Description= Innovando para vos


ModuleName=script



[script]

ImageDir=/lib/plymouth/themes/innovaOS

ScriptFile=/lib/plymouth/themes/innovaOS/script.script




Con respecto a las imágenes el tema que estamos modificando trae algunas interesantes, como las referentes a la barra de carga, estas imágenes se pueden sobrescribir por otras y así de fácil ya cambiamos un poco la apariencia de nuestra animación de arranque, eso sí, se debe respetar completamente el nombre que ya trae por defecto, caso contrario no aparecería y se tendría que modificar el script de programación. Para sobrescribir el archivo de imagen se puede hacer con un "cp" desde la línea de comandos:

# cp /ruta/imagen.png /home/usuario/Escritorio/innovaOS/progress_bar.png

Para agregar más imágenes en caso necesario se pueden también copiar dentro, por ejemplo:

# cp /ruta/logo.png /home/usuario/Escritorio/innovaOS/



Cuando agregamos una imagen nueva, o queremos hacer un cambio en la animación, se debe modificar el archivo de script que se encuentra dentro de la carpeta del tema que se está trabajando. Tomando el ejemplo anterior donde se agregó la imagen logo.png que no se encuentra dentro de la animación se puede agregar en el archivo (recordemos que el nombre del archivo es script.script y se establece en la propiedad ScriptFile del archivo de configuración), manteniendo cierta proporción entre el ancho y el alto, mediante el script:

#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);

Es muy importante tener orden, y documentar bien todos los cambios y partes del código, como son las buenas prácticas de cualquier lenguaje de programación, para su mantenimiento y que cualquier persona que quiera modificar luego el tema pueda hacerlo sin mayor inconveniente. Así el contenido del archivo script.script que agrega "logo.png" puede quedar:



# This is an example plymouth plugin script



Window.SetBackgroundTopColor(0.0, 0.0, 0.0);



#-------------------------------- Dialogue --------------------------------



status = "normal";



fun dialog_setup()

  {

    local.box;

    local.lock;

    local.entry;

    

    box.image = Image("box.png");

    lock.image = Image("lock.png");

    entry.image = Image("entry.png");
    
    box.sprite = Sprite(box.image);
    box.x = Window.GetX() + Window.GetWidth()  / 2 - box.image.GetWidth ()/2;
    box.y = Window.GetY() + Window.GetHeight() / 2 - box.image.GetHeight()/2;
    box.z = 10000;
    box.sprite.SetPosition(box.x, box.y, box.z);
    
    lock.sprite = Sprite(lock.image);
    lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2;
    lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2;
    lock.z = box.z + 1;
    lock.sprite.SetPosition(lock.x, lock.y, lock.z);
    
    entry.sprite = Sprite(entry.image);
    entry.x = lock.x + lock.image.GetWidth();
    entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2;
    entry.z = box.z + 1;
    entry.sprite.SetPosition(entry.x, entry.y, entry.z);
    
    global.dialog.box = box;
    global.dialog.lock = lock;
    global.dialog.entry = entry;
    global.dialog.bullet_image = Image("bullet.png");
    dialog_opacity (1);
  }
    
fun dialog_opacity(opacity)
  {
    dialog.box.sprite.SetOpacity (opacity);
    dialog.lock.sprite.SetOpacity (opacity);
    dialog.entry.sprite.SetOpacity (opacity);
    for (index = 0; dialog.bullet[index]; index++)
      {
        dialog.bullet[index].sprite.SetOpacity(opacity);
      }
  }

fun display_normal_callback ()
  {
    global.status = "normal";
    if (global.dialog)
      dialog_opacity (0);
  }

fun display_password_callback (prompt, bullets)
  {
    global.status = "password";
    if (!global.dialog)
dialog_setup();
    else
dialog_opacity(1);
    for (index = 0; dialog.bullet[index] || index < bullets; index++)
      {
        if (!dialog.bullet[index])
          {
            dialog.bullet[index].sprite = Sprite(dialog.bullet_image);
            dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth();
            dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2;
            dialog.bullet[index].z = dialog.entry.z + 1;
            dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z);
          }
        if (index < bullets)
          dialog.bullet[index].sprite.SetOpacity(1);
        else progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);
          dialog.bullet[index].sprite.SetOpacity(0);
      }
  }

Plymouth.SetDisplayNormalFunction(display_normal_callback);
Plymouth.SetDisplayPasswordFunction(display_password_callback);



#-------------------------------- Progress Bar --------------------------------

progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);

progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 100);

progress_bar.original_image = Image("progress_bar.png");
progress_bar.sprite = Sprite();

progress_bar.x = Window.GetX() + Window.GetWidth()  / 2 -        progress_bar.original_image.GetWidth() / 2;
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5  - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);

fun progress_callback (duration, progress)
  {
    if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
      {
        progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth(progress_bar.original_image) * progress, progress_bar.original_image.GetHeight());
        progress_bar.sprite.SetImage (progress_bar.image);
      }
  }

Plymouth.SetBootProgressFunction(progress_callback);




#--------------------------------- Background ---------------------------------

background.image = Image("background.png").Scale(Window.GetWidth() , Window.GetHeight());
background.sprite = Sprite(background.image);
background.x = Window.GetX() + Window.GetWidth() / 2 - background.image.GetWidth() / 2;
background.y = Window.GetY() + Window.GetHeight() / 2 - background.image.GetHeight() / 2;
background.sprite.SetPosition(background.x, background.y, 0);



#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);



#---------------------------------------- Quit --------------------------------

fun quit_callback ()
{
  logo.sprite.SetOpacity (1);
}

Plymouth.SetQuitFunction(quit_callback);

#----------------------------------- Message --------------------------------

message_sprite = Sprite();
message_sprite.SetPosition(10, 10, 10000);

fun message_callback (text)
{
  my_image = Image.Text(text, 1, 1, 1).Scale(Window.GetWidth() * 0.75, Window.GetHeight() * 0.035);
  message_sprite.SetImage(my_image);
}

Plymouth.SetMessageFunction(message_callback);
Una vez terminado de modificar el script procedemos a mostrarlo en el arranque de nuestro ordenador para ver el resultado. Nos posicionamos en la ruta que contiene la carpeta del tema:
# cd /home/usuario/Escritorio

Se copia la carpeta del tema en la ruta por defecto para temas de plymouth (en el caso de ubuntu lucid/Maverick sería):
# cp -R innovaOS/ /lib/plymouth/themes/
Ahora se establecerá nuestro tema innovaOS como tema predeterminado, el que aparecerá cada vez que se inicie la máquina. Esto  mediante el comando update-alternatives, que es un script que nos permite definir las aplicaciones por defecto. primero se instala el tema en las opciones de plymouth:
# update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/InnovaOS/InnovaOS.plymouth 100
Se configura las opciones de plymouth para establecer la opción predeterminada a la hora del arranque:

# update-alternatives --config default.plymouth
lo cual genera la siguiente salida:

Hay 2 opciones para la alternativa default.plymouth (proporcionando /lib/plymouth/themes/default.plymouth)

  Selección   Ruta                                                   Prioridad  Estado
------------------------------------------------------------
  0            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo automático
  1            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo manual
  *2            /lib/plymouth/themes/ubuntu-logo/ubuntu-logo.plymouth   100       modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 


Se escoge en este caso la opción 1 que es la de nuestro tema.

# update-initramfs -u





Como hacer un buen tema en plymouth



Plymouth es un programa configurable por medio de scripting. Lo cual quiere decir que se tiene que, como se diría en mi tierra, programar. y la única forma de aprender a programar en cualquier lenguaje, es programando, así que ha hecharce la soga al cuello y practicar.
>
Entonces, para poder hacer un buen tema en plymouth se necesita:

  • Un editor de texto
  • Un editor de imágenes
  • Constancia
  • Perseverancia
  • Paciencia
  • Ingenio
  • Innovación
  • Imaginación
  • demás cosas que se te ocurra
  • y más paciencia ;)



Para un poco más de información se puede consultar:

miércoles, 23 de marzo de 2011

Modificación de la ventana Login del nuevo GDM de Ubuntu

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal.


Configuración de la apariencia


Lo mejor es antes de empezar guardar la imágen de fondo que desamos utilizar en una zona neutral, como la ruta /usr/share/backgrounds que es donde se guardan los fondos de escritorio por defecto en Ubuntu, esto lo podemos hacer mediante el comando "cp" de la siguiente manera:
# cp /ruta/imagen_a_copiar.png /usr/share/backgrounds

El GDM funciona totalmente bajo gnome, siendo una pequeña instancia de este. Por tanto utiliza muchos de los sistemas de modificación como el gnome-appearance-properties. El usuario que maneja esta instancia se llama "gdm". Se puede sin embargo utilizar y hacer configuraciones desde nuestro usuario de escritorio, para poder hacer estas configuraciones que utilizan una sesión X (como gnome-appearance-properties) se le debe asignar permiso al usuario "gdm" de utilizarla. Esto se hace digitando desde la línea de comandos:
# xhost +SI:localuser:gdm

y se lanza el editor de propiedades de apariencia como si fuera el usuario gdm con el siguiente comando:
$ gksu -u gdm dbus-launch gnome-appearance-properties



una vez aparece la venta de configuraciones se procede modificar las propiedades de la apariencia, como el fondo, tipografías, temas, etc.







Cambiar la imágen del logo en la ventana de autenticación

Antes de hacer las configuraciones del caso debemos tener una imagen para reemplazar la que viene por defecto en la ventana de login. Esta imagen por defecto está en formato SVG y  tiene un tamaño de 64x64 px, sin envargo más adelante veremos como configurar la ventana para que acepte una imagen del tamaño que se desee, pero siempre se debe respetar el tipo de archivo.

Una vez tenemos la imagen del tamaño deseado, se procede a reemplazar la imagen que aparece en el la ventana de login mediante el siguiene comando:
# cp /ruta/imagen_a_reemplazar.svg /usr/share/icons/LoginIcons/apps/64/computer.svg



En este momento, si nuestra imagen es más grande que el valor por defecto de 64x64 px,  esta se reescalará a este tamaño. Para ello configuramos el archivo correspondiente a la ventana de login, ubicada en la ruta "/usr/share/gdm/", y el archivo lleva por nombre gdm-greeter-login-window.ui, el cual está basado en un lenguaje de marcado extensible (XML) , buscamos la línea del objeto "logo-image" y se modifica la propiedad "pixel_size" con el valor numérico deseado. En el caso de nuestro ejemplo se cambia a 300. Si lo notan, este valor solo influye en el ancho, dejando el alto del tamaño que tiene que ser . Para realizar estas configuraciones pueden utilizar cualquier editor de texto, para usos prácticos usaremos "nano" mediante los comandos:



nano /usr/share/gdm/gdm-greeter-login-window.ui





Se guarda el archivo, y si se desea se cierra sesión para ver los resultados. Siendo el resultado final de nuestra travesía por la modificación del GDM el siguiente:





martes, 8 de marzo de 2011

Autenticarse mediante una pasarela (proxy) en la red corporativa


En el trabajo se me presentó el inconveniente del proxy ISAServer 2006 para la navegación por internet, actualización de paquetes y otras cosillas en mis estaciones de trabajo con GNU/Linux (Ubuntu 10.04)..

Buscando por ahí en la red de redes me encontre con varias opciones, que nmaps y otras... pero al final me quedé con cntlm, (ntlm es el conjunto de protocolos que utiliza Microsoft para la autenticación y otras suertes en su ISAServer), el cual se instala en cada estación de trabajo GNU/Linux que requiera autenticación para el acceso a internet con ISAServer.

La instalación del paquete en mi caso fue muy facil por las herramientas de la distribución, en línea de comandos sería:
# apt-get install cntlm

Si les gusta más la parte gráfica pueden recurrir al gestor de paquetes Synaptic.

Para configurarlo se edita el respectivo archivo en la ruta /etc/cntlm.conf cambiando los siguientes parámetros.

Primero hacemos un respaldo por si el caso de cometer un errorsillo común.
# cp /etc/cntlm.conf /etc/cntlm.conf.back

Empezamos a configurar el archivo sustituyendo con nuestros respectivos valores
nano /etc/cntlm.conf


Dentro del mismo cambiamos los siguientes parámetros por los nuestros:
Username  nombre_usuario_ISAServer_o_ActiveDirectory
Domain  sudominio.com
Password   SuClave

Proxy  direccion:puerto

NoProxy   localhost, 127.0.0.*, 10.*, 192.168.*

Listen 3128 #este es el puerto de escucha.. recomiendo dejar el mismo.
y listo ... nos queda la configuración del proxy

La configuración de proxy del sistema, para los que utilizan gnome como gestor de ventanas acceden al programa gnome-network-properties. En el llenamos los siguientes parámetros:

  • Proxy: 127.0.0.1 (localhost... es la misma máquina)
  • Puerto: 3128 (el mismo del Listen del cntlm)


Con estas configuraciones no se debe poner más el nombre de usuario y contraseña del proxy para hacer cosas por internet, en caso de querer cambiarlos se debe configurar de nuevo el archivo del cntlm.

Gracias a los amigos desarrolladores y todos los participantes de la comunidad de cntlm... para mayor información sobre el paquete pueden visitar http://cntlm.sourceforge.net/