feb
11

Lanzamiento de Canaima 3.0 GNU/Linux!

En su primera versión candidata, fué oficialmente lanzada la versión 3.0 de Canaima GNU/Linux este Jueves 10 de Febrero del 2011 !! ,entrando a la fase de pruebas según su ciclo de desarrollo. Que nos ofrece esta nueva versión basada en squeeze?

Optimizaciones de rendimiento:

  • Implementación de demonios de optimización de la experiencia de usuario (prelink, preload, readahead).
  • Reducción de los demonios que se activan durante el arranque del sistema.
  • Reducción del factor de swappiness.
  • Reducción del número de TTY’s a 2.
  • Implementación del parche de Lennart Poettering.
  • Añadiendo la opción de noatime a los discos donde sea pertinente en /etc/fstab.

Nuevas aplicaciones:

  • Deluge: Gestor de descargas torrent ligero basado en Python.
  • Emesene: Cliente de Mensajería instantánea MSN basado en Python.
  • Turpial: Cliente de twitter e identi.ca basado en Python, Desarrollado por comunidades venezolanas.
  • Exaile: Reproductor multimedia integral basado en Python.
  • LibreOffice: Suite ofimática basada en OpenOffice, libre de restricciones corporativas.
  • Canaima Notas: Aplicación propia desarrollada para facilitar el reporte de errores por parte de los usuarios. Publica características de hardware en la plataforma notas.canaima.softwarelibre.gob.ve.
  • Cunaguaro: Navegador web basado en Iceweasel, adaptado a la plataforma Canaima y con mejoras de rendimiento. Desarrollado por comunidades venezolanas.
  • Guácharo: Cliente de correo basado en Icedove, adaptado a la plataforma Canaima. Desarrollador por comunidades venezolanas.
  • Shotwell: Visor de imágenes con diversas funcionalidades.
    Simple Scan: Gestor de scáneres.
  • Canaima Desarrollador: Conjunto de ayudantes y herramientas que asisten en el proceso de creación de software.
  • Canaima Semilla: Herramienta para la creación de ISO’s basadas en sabores de Canaima.
  • Canaima Contraseña: Asistente de cambio de contraseña para los usuarios de las computadoras distribuídas por los fabricantes (VIT, CANTV, Siragon, etre otros).
  • Canaima Restaurar: Permite restaurar el Sistema Operativo a su estado inicial de Instalación.
  • Canaima Curiara: Visor HTML ligero y de alto rendimiento basado en Python-Webkit.

Agrupación de paquetes a través de metapaquetes temáticos (canaima-web, canaima-ofimatica, canaima-multimedia, entre otros).

Nuevo estilo visual:

  • Nuevo tema GTK para la decoración de las ventanas.
  • Nuevo tema Metacity para los bordes de las ventanas.
  • Nuevo set de íconos basados en el tema Faenza Dark.
  • Incluídos conjunto de 11 wallpapers hechos en comunidad.
  • Nuevo gestor de inicio Plymouth, con tema adaptado a Canaima.
  • Nuevo gestor de arranque BURG, con tema adaptado a Canaima.

Con todo estas mejoras te invito a que pruebes la primera versión candidata de Canaima 3.0 y contribuyas en la retroalimentación necesaria para generar la versión estable, reportando bugs y haciendo sugerencias.

A descargarla! :

Imagen ISO para la arquitectura i386 (~700MB)
canaima-3.0~VC1_i386.iso

Suma de comprobación md5
canaima-3.0~VC1_i386.iso.md5

Imagen ISO para la arquitectura amd64 (~700MB)
canaima-3.0~VC1_amd64.iso

Suma de comprobación md5
canaima-3.0~VC1_amd64.iso.md5

feb
01

Diseño de GUIs en GNOME (glib + glade)

Creacion de la interfaz gráfica de usuario (GUI) con ayuda de glade:

En mi caso prefiero usar la herramienta “glade” que me genera un xml posteriormente implementado en mi código python a través de una interfaz construida mendiante bien sea:

  • El objeto gtk.Builder  con tan solo 3 lineas creamos el constructor, añadimos el archivo xml generado con glade y conectamos las señales:
constructor = gtk.Builder()
constructor.add_from_file("archivo.glade")
constructor.connect_signals()

Nota: (las señales se especifican con glade, es decir están definidas en el archivo XML generado)

  • El objeto gtk.glade.XML  en este caso necesitaremos además de llamar al XML, crear un diccionario con los eventos y los métodos relacionados a los mismos, como se muestra a continuación:
constructor = gtk.glade.XML("archivo.glade")
dic = { "on_b1_clicked" : b1_clicked,
          "on_b2_clicked" : b2_clicked,
          "on_b3_clicked" : b3_clicked,
          "on_MainWindow_destroy" : gtk.main_quit }
constructor.signal_autoconnect(dic)

Con cualquiera de estas dos opciones agilizamos el proceso de generación de una interfaz gráfica de usuario (GUI).  En mi caso me gusta mas usar gtk.Builder debido a que no necesito crear un diccionario y ya esto es un paso menos.

LLamadas externas en GNOME:

Si deseamos enlazar un evento a una llamada externa debemos considerar que se puede congelar el GUI y este comportamiento es indeseado si se requiere por ejemplo mostrar una barra de progreso mediante la ejecución de la llamada, o cualquier otro proceso.

Para las llamadas externas recomiendo usar la libreria glib (GNOME Library). También existe la posibilidad de usar hebras con el submodulo de python subprocess (debemos tener cuidado de usar funciones obsoletas como os.popen)

Para realizar entonces las llamadas externas uso el siguiente arsenal:
glib.spawn_async()
glib.io_add_watch()
glib.timeout_add()
glib.child_watch_add()

el procedimiento es el siguiente:

  1. crear gui
  2. esperar evento
  3. se ejecuta evento
  4. la función asociada al evento ejecuta un spawn (glib.spawn_async)
  5. glib.timeout_add() ejecuta periodicamente una función que será llamada en intervalos regulares (perfecto para mostrar una barra de progreso)
  6. glib.child_watch_add() ejecuta una función cuando el spawn ejecutado en el paso 4 termina (esto es determinado por el PID de la llamada y nos permite por ejemplo completar la barra de progreso)

Si quisieramos leer data de una llamada externa podemos usar la función:

  • glib.io_add_watch() Monitorea que un file-descriptor cumpla con una condición (que haya data para ser leida)

Ejemplo sencillo usando una barra de progreso y la libreria glib para hacer una llamada externa:

contenido del archivo ejemplo.py:

'''
Created on 17/01/2011
@author: reg3x
'''
import pygtk, gtk, gobject, glib, subprocess
pygtk.require('2.0')

class progress:
    def __init__(self):
        self.constructor= gtk.Builder()
        self.constructor.add_from_file("barraprogreso.glade")
        self.constructor.connect_signals(self)
        self.window1 = self.constructor.get_object("window1")
        self.barra = self.constructor.get_object("progressbar1")
        self.window1.connect('delete-event',gtk.main_quit)
        self.window1.show()

    def on_button1_clicked(self,widget):
        self.run_command(['/usr/bin/fdupes','-rS' ,'/home/'])
         #DEBEMOS COLOCAR UN DIRECTORIO CON LA PERMISOLOGIA ADECUADA

    def pulse(self):
        print "****************ejecutando pulse*************"
        self.barra.pulse() # progressbar variable
        return True

    def done(self, pid, condition, id):
        print "ejecutando done"
        glib.source_remove(id)
        self.barra.set_fraction(1)# progressbar variable

    def run_command(self,comando):
        pid, stdin, self.stdout, stderr = glib.spawn_async(comando , flags=glib.SPAWN_DO_NOT_REAP_CHILD)
        print "id del proceso es: "+str(pid)
        id = glib.timeout_add(50, self.pulse)
        glib.child_watch_add(pid, self.done, id)

if __name__ == '__main__':
    object =  progress()
    gtk.main()

Contenido del archivo barraprogreso.glade  (generado por glade):



  
  
  
    
      
True
        
          
button
76
30
True
True
True
            
          

65
37
          
        
        
          
196
24
True
          

6
6
          
        
      
    
  

dic
02

Dividir un directorio en múltiples isos/dirs

Muchas veces es necesario respaldar información y no contamos con un disco duro externo o un pen drive del tamaño suficiente ¿Que hacer?.

Existe una herramienta GNU que nos permite dividir el contenido de un directorio en directorios de igual tamaño de tal forma que podemos distribuirlo en diferentes medios por ejemplo DVDs, esta herramienta se llama  dirsplit. Herramienta que podemos decargar desde Canaima GNU Linux o Debian mediante el comando:

aptitude install dirsplit

Si por ejemplo contamos con un directorio /home/reg3x/musica cuyo tamaño es el siguiente:

$ du -ch


….
1.2 GB size

Por lo que ahora supongamos se desee quemar el contenido de la carpeta musica en cds de 700MB. como el tamaño de la carpeta es de 1.2GB, se necesita dividir en 2 archivos iso por lo que usamos el comando dirsplit de la siguiente forma:

1) Crear listas de los archivos

$ cd /home/reg3x/musica
$ dirsplit -s 700M -e2 /home/reg3x/musica
$ ls vol*

Salida por pantalla:

vol_1.list
vol_2.list

en donde
* -s 700M : 700M tamaño de un CDROM
* -eN : modos de exploración (N)

2) Crear ISOs tomando como entrada las listas generadas por dirsplit

Ahora podremos quemar todo el contenido de la carpeta música gracias a que los archivos .list son catalogos que interpreta otra herramienta GNU llamada mkisofs (la cual nos permite quemar imagenes).

$ mkisofs -o vol1.iso -D -r --joliet-long -graft-points -path-list vol_1.list
$ mkisofs -o vol2.iso -D -r --joliet-long -graft-points -path-list vol_2.list
$ ls -l *.iso

Salida por pantalla:

-rw-r–r– 1 reg3x reg3x 663M dic 2 16:18 vol1.iso
-rw-r–r– 1 reg3x reg3x 510M dic 2 16:19 vol2.iso

Luego de esto podemos quemar estas imagenes ISO utilizando cdrecord u otra herramienta como Brasero. en el caso de cdrecord

$ cdrecord -v -dev=ATA:1,0,0 speed=8 vo1.iso
$ cdrecord -v -dev=ATA:1,0,0 speed=8 vo2.iso

3) Mover archivos de un directorio fuente a directorios de igual tamaño (reorganización de archivos)

displit tiene mas opciones que podemos aprovechar.  por ejemplo si deseamos que en vez de crear archivos listas, se muevan los archivos dentro de un directorio grande a otros directorios de igual tamaño, ejecutamos lo siguiente:

dirsplit -m -s 700MB  directorio_fuente  -p  directorio_destino/prefijo- :

en donde:
* -s 700M : 700M tamaño de un CDROM
* -m : mover los archivos del directorio fuente
* -eN : modos de exploración (N)
* -p directorio_destino/prefijo- : directorios destino generados

En donde prefijo- se substituye automaticamente por prefijo-1 prefijo-2 prefijo -3 y así sucesivamente según sea el número de volumenes generados.

Esta forma de ejecutar dirsplit reorganiza los archivos de igual manera se especifíca el tamaño de cada directorio creado y con la opción -p podemos ver como colocar un prefijo para el nombre de los directorios

dic
02

Opciones en Perl para crear ShellScripts

Existen ciertas opciones que al incluirlas como argumentos al ejecutar perl permiten crear scripts idoneos para tareas en las que necesitemos ejecución ciclica de instrucciones sobre una entrada específica, bien sea un archivo, STDIN, un pipe , etc.

Para comenzar hablemos de las opciones -n y -p. Las cuales insertan su script dentro de bucles. Antes de que veamos ejemplos específicos veamos como se ven dichos bucles por dentro y como los mismos cambián mediante las opciones -a y -F.

La opción -n provoca que perl ejecute su escript dentro del siguiente bucle:

while (<>) {
# su script
}

La opción -p usa el mismo loop pero añade la sentencia CONTINUE al bloque de código de tal manera que la variable $_ se imprimirá cada vez que el bucle recorre un ciclo.
Si se usan ambas opciones (-n y -p) la opción -p se tomará como prioridad por lo que el bucle quedará de la siguiente forma:

while (<>) {
# su script
} continue {
print;
}

La opción -a añade una llamada la función split() al principio de cada iteración del bucle. Por lo que el bucle queda de la siguiente forma:

while (<>) {
@F = split(/ /);
# su script
}

La opción -F añade la función split para separar en algo mas que el caracter espacio. Si se usa la opción -F/i+/ como opción el bucle se verá de la siguiente forma:

while (<>) {
@F = split(/i+/);
# su script
}

Bloques BEGIN y END: pueden ser usados si llega a necesitar especificar código de inicialización o de limpieza. La sección de inicialización puede ser usada para crear objetos o para abrir archivos. La sección de limpieza puede ser usada para mostrar estadísticas o para cerrar archivos. Por ejemplo:

BEGIN {
# Sección de inicialización
$count = 0;
}
while (<>) {
# su script
}
END {
# Sección de limpieza
print("La variable count vale: $count.\n");
}

A continuación veamos algunos ejemplos de estas opciones:
Comencemos con una linea de comando que simplemente muestra por pantalla cada linea de un archivo:
asumamos que el archivo test.dat contiene lo siguiente:

David Veterinarian
John Orthopedist
Jeff Dentist

Luego la linea de comando se forma de la siguiente manera:

perl -p -e "1;" test.dat

Ésta linea de comando será entonces equivalente a :

while (<>) {
1;
} continue {
print;
}

NOTESE la sentencia 1; usada para darle a perl algo que procesar, de otra manera perl no tendrá ninguna sentencia que ejecutar

La salida por pantalla será:

David Veterinarian
John Orthopedist
Jeff Dentist

¿Que tal si imprimimos las primeras palabras de cada linea?, se pudiese entonces usar la siguiente línea de comando: perl -p -e “s/\s*(\w+).*/$1/;” test.dat

La cual será equivalente a :

while (<>) {
s/\s*(\w+).*/$1/;
} continue {
print;
}

La sálida por pantalla será:

David
John
Jeff

Si usted tiene archivos de datos que guarden información en columnas, puede extraer la segunda columna de información de la siguiente forma:

perl -p -e "s/\s*.+\s(.+)\s*/$1\n/;" test.datpar

La salida por pantalla será:

Veterinarian
Orthopedist
Dentist

La opción -a permite acceder a la información guardada en columnas. Por ejemplo usted podría incluso mostrar por pantalla la segunda columna del archivo de la siguiente forma:

perl -p -a -e "$_ = \"$F[1]\n\";" test.dat

linea de comando que es equivalente a :

while (<>) {
@F = split(/ /);
$_ = \"$F[1]\n\";
} continue {
print;
}

Es importante notar que necesita escapar las comillas dobles en la sentencia anterior, en caso contrario se presentará un error.

dic
01

Como usar *args y **kwargs en Python

Usar *args y **kwargs al definir funciones

Las sentencias especiales *args y **kwargs en las definiciones de funciones son usadas para pasar un número variable de argumentos a una función. La forma con un solo asterisco (*args) es usada para pasar como argumento una lista “keyworded” de longitud variable, mientras que la forma con doble asterisco es usada para pasar una lista “non-keyworded” de longitud variable.

A continuación se muestra un ejemplo de como usar la forma “non-keyworded”. En este ejemplo se pasa un argumento formal (posicional) y dos mas de longitud variable:

    def probar_argumentos(farg, *args):
        print "argumento formal:", farg
            for arg in args:
            print "otro argumento:", arg
    probar_argumentos(1, "dos", 3)

Resultados:

argumento formal: 1
otro argumento: dos
otro argumento: 3

A continuación un ejemplo de como usar la forma keyworded, nuevamente se pasa un argumento formal y dos keyworded de longitud variable

    def probar_var_kwargs(farg, **kwargs):
        print "argumento formal:", farg
        for key in kwargs:
            print "otro argumento keyworded: %s: %s" % (key, kwargs[key])

    probar_var_kwargs(farg=1, myarg2="dos", myarg3=3)

Resultados:

argumento formal: 1
otro argumento keyworded: myarg2: dos
otro argumento keyworded: myarg3: 3

Usar *args y **kwargs al llamar funciones

Esta sentencias especiales se pueden usar no solo en la definicion de funciones sino también al llamarlas. por ejemplo:

    def probar_var_args_call(arg1, arg2, arg3):
        print "argumento1:", arg1
        print "argumento2:", arg2
        print "argumento3:", arg3

    args = ("dos", 3)
    probar_var_args_call(1, *args)

Resultados:

argumento1: 1
argumento2: dos
argumento3: 3

Si queremos usar la forma keyworded al llamar una funcion lo hacemos de la siguiente forma:

    def probar_var_args_call(arg1, arg2, arg3):
        print "argumento1:", arg1
        print "argumento2:", arg2
        print "argumento3:", arg3

    kwargs = {"arg3": 3, "arg2": "dos"}
    probar_var_args_call(1, **kwargs)

Resultados:

argumento1: 1
argumento2: dos
argumento3: 3

Articulo parafraseado de:                        SaltyCrane Blog

dic
01

Inaugurando

Artículos de tecnología, software y hardware libre.  Es lo que encontraras en este sitio web que inicia hoy 1ero de diciembre con optimismo, solo falta sacar el tiempo diario para tipear un montón de información valiosa, en su mayoría relacionada con linux , shell scripting, herramientas GNU, python|bash|perl.