Archivo de la categoría: Weyu

[postgreSQL] Una instalación de postgreSQL básica (¡pero mejor!)

PostgreSQL: Introducción

PostgreSQL es una de las grandes maravillas del software libre, robusto, potente, altamente funcional, distribuido en miles de formas posibles (greenplum=clusterizador masivo, postgres Plus=”imitador” de Oracle,deepgreen=granjas de datawarehousing con postgreSQL, etc) puede ser optimizado (como todo lo que es software libre) de maneras inimaginables para cada necesidad específica. Entonces, ¿por qué hay gente que denigra de él? …

El primer error que comete la gente, es pretender que un sistema tan necesario como la base de datos, sea utilizado “directamente” luego de su instalación; un detalle de distribuciones Linux como Debian, es no optimizar para ningún aspecto (ya que son meta-distribuciones genéricas sin una orientación específica).

Mientras Oracle saca libros de 900 páginas de cómo optimizar al máximo hardware, sistema de archivos, sistema operativo y la base de datos como tal, mucha gente piensa “migrar” a postgreSQL ejecutando un “aptitude install postgresql” y dejándolo así … nada más perdido y lejos de la realidad.

Acá, ejecutaremos una instalación que debería ser “básica”, la más básica, para un entorno pequeño de datos, para que sus sistemas “rindan”.

Preámbulo

Uno de los aspectos más importantes es que postgreSQL “no debería” compartir acceso a disco con el sistema operativo, esto es, si es posible que postgreSQL esté en una partición distinta a “root” (incluso un disco separado, de ser recomendable); por lo que la opción “instalar y usar” no debería ser para instalaciones en producción de postgreSQL 9.1.

Hay que tomar en cuenta que postgreSQL (como cualquier otra base de datos) debería ser optimizada posteriormente a su instalación de manera correcta, una de las optimizaciones más necesarias (pero que casi nadie sigue) es gestionar los espacios de datos y separarlos del tablespace pg_default (que gestiona la DB “postgres”, la DB de “information_schema” y demás información, por lo general en “/var/lib/postgresql/9.1/main”); además, ambos deberían estar separados de la partición raíz donde está el sistema operativo.

Las optimizaciones acá realizadas son de las más sencillas a nombrar para postgreSQL, se tomó una máquina virtual en Xen 4.1 en una portátil y se optimizó de lo más básico, para demostrar, que hasta en los cambios más sencillos, pueden afectar el “performance” de aplicaciones diseñadas con postgreSQL.

Preparación primaria

Si estamos instalando un servidor de datos, lo primero que debemos pensar es en separar el montaje de /var del resto del sistema, de hecho, si podemos incluso separar /var/log sería muy apropiado; también es bueno separar /tmp (más 1Gb es innecesario) ya que si no separamos /tmp, Debian GNU/Linux utilizará un tmpfs montado en RAM para gestionar /tmp (restándonos un poco de RAM para trabajar, además que postgreSQL no utiliza la partición /tmp).

Un esquema básico podría ser:

  • / (raiz) (Debian GNU/Linux no ocupa más de 5Gb en este modo)
  • /tmp (1Gb como máximo)
  • swap (Lo necesario, aunque no mayor a 2GB en sistemas con más de 4Gb de RAM)
  • /var (2~4GB ya que será un servidor en producción)

Y de resto, un volumen lógico (LVM) que podemos modificar de tamaño de acuerdo a nuestra necesidad.

Luego de instalado el sistema, procedemos a instalar PostgreSQL.

Instalación

La instalación de postgreSQL 9.1 en Debian GNU/Linux es bastante sencilla:

  • Instalamos postgreSQL 9.1 (pero así no se debería quedar):
    apt-get install postgresql-9.1

PostgreSQL por defecto, creará una carpeta de configuración en: /etc/postgresql/9.1/main/

Y creará un espacio de datos en: /var/lib/postgresql/9.1/main/

Que no utilizaremos para nuestra base de datos, ya que crearemos un espacio propio.

Configuración inicial

Siempre es recomendable dejar el usuario “postgres” (el super-usuario de PostgreSQL) como un usuario “para accesos de emergencia”, ya que este usuario tiene garantizado el acceso a todas partes(si eres root en el sistema), es recomendable que NINGUNA base de datos tenga como “owner” el usuario postgres (y evitar en lo posible utilizarlo como usuario de acceso desde sistemas, aunque esto, obviamente lo he visto más de una vez ocurrir hasta en sistemas web).

  • Creamos un super-usuario para nuestras necesidades, primero cambiamos al usuario postgres:
    su postgres
  • Creamos un usuario, que será nuestro “super-usuario” para “nuestros” accesos, evitando así el usuario postgres:
    createuser -sPl jesuslara
    
    -- ingresamos nuestra contraseña
    Enter password for new role: 
    Enter it again:
  • Ejecutamos la consola SQL de postgreSQL:
    psql
  • Garantizamos al usuario que creaste acceso irrestricto sobre el la DB postgres:
    psql (9.1.3)
    Type "help" for help.
    
    postgres=# grant all on database postgres to jesuslara;
    GRANT

Y salimos de la consola:

postgres=#\quit

Configuración de postgreSQL

  • Accedemos al directorio /etc/postgresql/9.1/main
    cd /etc/postgresql/9.1/main
  • Si vamos a acceder de manera remota a nuestro postgreSQL, agregamos la siguiente línea al archivo pg_hba.conf:
    # la forma es:
    # host -> database (all: todas las db) -> usuario (all: todos los usuarios) -> subnet (de nuestra red) -> modo de clave
    host    all     jesuslara       192.168.100.0/24        md5
  • Habilitamos el acceso remoto en nuestro postgreSQL:

archivo /etc/postgresql/9.1/main/postgresql.conf

listen_addresses = '*'

Optimización del archivo postgresql.conf

  • Y cambiamos algunas opciones básicas del archivo postgresql.conf:
    shared_buffers = 256MB

‘shared_buffers’: Es la memoria de trabajo compartida para todo el servidor postgreSQL, fíjese que por defecto en Debian GNU/Linux la opción es 24MB (y el valor por defecto si comentamos es 32MB), sin embargo, como esta es la memoria utilizada para trabajo de postgreSQL, es recomendable “al menos” el 25% de la RAM disponible (y jamás > 40%).

temp_buffers = 16MB

‘temp_buffers’: La memoria temporal utilizada por cada sesión para las tablas temporarias y para apertura de tablas en cada sesión de cada base de datos, tome en cuenta que este valor dependerá obviamente de la cantidad de datos que carga cada sesión y dependerá muchísimo del sistema que se utiliza.

work_mem = 16MB

‘work_mem’: uno de los valores más importantes y más despreciados, “work_mem” se refiere a la memoria temporal utilizada por cada sesión, para las operaciones de ordenamiento (ORDER BY) para las sesiones de diferenciación (GROUP … HAVING y DISTINCT) y para la gestión de hash (uniones HASH, indices HASH, hash_aggregations), si en nuestro sistema realizamos muchísimas consultas ordenadas, agrupadas, diferenciadas por cadenas, etc se crearán mucho de estos buffers de manera paralela, mientras más memoria asignemos, menos probabilidades hay que los ordenamientos y otras operaciones se hagan con archivos temporales en disco (más lentos que la memoria RAM).

max_stack_depth = 8MB

‘max_stack_depth’: define el tamaño del espacio utilizado para cómputo de operaciones complejas, su valor está asociado al límite máximo que un usuario (en este caso, “postgres”) tiene derecho a reservar un stack, el valor soportado por nuestra distribución se determina con “ulimit -s”.

shared_preload_libraries = '$libdir/plpython2.so'

‘shared_preload_libraries’: Permite cargar una librería específica cuando arranca el sistema, si utilizamos muchos procedimientos almacenados en un lenguaje específico (ej: python, perl, tcl, java, etc), es bueno pre-cargarla para que esté disponible cuando se utilice por primera vez. Nota: esta opción ralentiza un poco el reinicio del sistema.

bgwriter_delay = 500ms

‘bgwriter_delay’: El background-writer es un proceso del servidor que se encarga de escribir a disco todos los “shared_buffers” modificados, este proceso conlleva una carga de I/O sobre el disco, su modificación permite o reducir el valor para evitar en lo más posible pérdidas de datos en equipos que pueden fallar, o su incremento permite reducir el I/O al disco duro en sistemas perfectamente protegidos.

Modificados estos parámetros básicos, vamos a modificar nuestro sistema operativo.

Optimización de Linux para postgreSQL

Una de las cosas que olvidamos “optimizar” (tunning) es nuestro sistema operativo GNU/Linux, con grupo de valores en el sysctl ya podemos ayudar “mucho” a nuestro postgreSQL.

  • Agregamos al archivo sysctl.conf

archivo: /etc/sysctl.conf

kernel.sem = 100 32000 100 128
kernel.shmall = 3279547
kernel.shmmax = 289128448
kernel.shmmni = 8192
fs.file-max = 287573
vm.dirty_bytes = 67108864
vm.dirty_background_bytes = 134217728

Nota: observe el valor de shmmax, la cantidad de “memoria máxima reservada para un shared_buffer” que puede crear una aplicación debe ser igual o mayor al valor del shared_buffer de postgreSQL, este valor está en bytes y es ~ 275MB.

La cantidad máxima de archivos que pueden abrirse en un sistema, dependerá obviamente del nivel de trabajo de la DB, durante una operación regular, la gente puede ejecutar “lsof | wc” para obtener la cantidad de archivos abiertos.

  • Y luego, las aplicamos:
    sysctl -p
    
    --
    kernel.sem = 100 32000 100 128
    kernel.shmall = 3279547
    kernel.shmmax = 289128448
    kernel.shmmni = 8192
    fs.file-max = 287573
    vm.dirty_bytes = 67108864
    vm.dirty_background_bytes = 134217728

Ya, con estos sencillos cambios, podemos reiniciar el postresql:

/etc/init.d/postgresql restart
Restarting PostgreSQL 9.1 database server: main.

Y estamos listos para crear una partición y tablespace para nuestra DB.

Creación del espacio de tablas

Creamos una partición del tamaño necesario para contener “al menos” nuestra base de datos (esta es una guía básica, no hablaremos de particiones adicionales para metadatos, para índices y demás).

Nota: en nuestro caso, la partición es /dev/xvdb1 y mide 10GB.

El “journal”, para quien no lo conoce, es la razón por la cual no existe software de “desfragmentación” en Linux, todos los sistemas operativos que lo soportan (ext3, ext4, jfs, reiserfs, xfs, zfs, etc) tienen servicios que se encargan de ordenar, desfragmentar y gestionar tanto la data como los metadatos (información acerca de los archivos y carpetas en sí), pero además, los journal cumplen otras funciones, entre ellas, recuperar desde sus logs la data que pudiera “haberse perdido” luego de un fallo de energía y/o de sistema.

En sistemas de base de datos, la data es contenida en uno o más (y diversos) tablespaces, espacios de tablas donde la data, metadata e índices es contenida, como es la base de datos la encargada de gestionar la posición de los datos en ellos, el Sistema Operativo no requiere la presencia de un journal, o al menos, de un journal más relajado y menos estricto.

Formateando la partición

  • Se formatea la partición (disco):
    mkfs.ext4 -E stride=32 -m 0 -O extents,uninit_bg,dir_index,filetype,has_journal,sparse_super /dev/xvdb1

Utilizamos ext4, porque en modo “writeback” tiene un mayor performance que XFS para almacenar los tablespaces y tiene menor propensión a fallos.

  • Habilita el journal en modo writeback:
    tune2fs -o journal_data_writeback /dev/xvdb1
  • Si simplemente desea eliminar el journal, ejecute:
    tune2fs -O ^has_journal /dev/xvdb1
  • Nota: utilice esta opción a su propio riesgo, recuerde que no tener un journal afecta de 2 modos:
  • La data no es colocada en orden en el disco, fragmentando el mismo
  • Ante un fallo de energía, el FS no podrá recuperar desde el journal las últimas actividades para recuperar esos datos.
  • Se ejecuta un chequeo de archivo básico:
    e2fsck -f /dev/xvdb1
  • Creamos la carpeta de postgresql:
    mkdir /srv/postgresql
  • Y luego se monta con las opciones que describiremos más abajo:
    mount -t ext4 /dev/xvdb1 /srv/postgresql -o  noatime,nouser_xattr,noacl,discard,nodelalloc,data=writeback,barrier=0,commit=300,nobh,i_version,inode_readahead_blks=64,errors=remount-ro

Las opciones son:

Opciones de FS Linux:

noatime

No guardar la información del timestamp del último acceso a los archivos, esta información no es necesaria ya que postgreSQL gestiona apropiadamente el acceso a los tablespaces.

nouser_xattr

Deshabilita el uso de atributos extendidos de usuario, esto es seguro en postgreSQL ya que la carpeta donde se guardan los tablespaces no requiere ninguno de esos atributos.

noacl

No utilizar atributos extendidos ni ACLs POSIX, no son necesarias ya que solamente postgreSQL tendrá acceso a los archivos en esta partición.

Opciones específicas de ext4:

nobh

ext4 asocia buffers de datos con las páginas de datos, esos bloques de cache proveen garantía de ordenamiento de los datos; “nobh” evita el uso de estos buffers de ordenamiento de datos (sólo activable con “data=writeback”).

data=writeback

No se preserva el ordenamiento de los datos, la data será escrita en el sistema de archivos solo después que la metadata ha sido guardada en el journal. Aunque hay personas que recomiendan desactivar el “journaling” del disco, esto no es recomendable pues, aunque postgreSQL gestiona correctamente los datos, los metadatos (información de los archivos y carpetas en el FS) es responsabilidad de mantenerla consistente el FS.

commit=seconds

Los datos y metadatos son escritos a disco cada “n” cantidad de segundos, el valor por defecto son 5 segundos (commit=0 es igual a dejar el valor por defecto), un valor más bajo puede mejorar la seguridad de los datos, un valor muy alto mejora el performance pero ante un fallo podría perderse datos.

barrier=0

Deshabilita el uso de barreras de escritura, las barreras de escritura fuerzan el uso de ordenamiento on-disk de los commits al journal, haciendo las caché de disco seguras de usar, pero un daño en el performance del disco.

inode_readahead_blks=n

Cantidad de inodes que el sistema de pre-lectura de ext4 lee al buffer caché, el valor por defecto de n es 32, pero un valor de 64 es normal para optimizar las lecturas.

discard

Permite decidir que realiza con los bloques que son liberados, por lo general ext4 ejecuta una operación de trim (limpieza), con esta opción, ellos simplemente son marcados como descartados, evitando la escritura innecesaria de bloques.

i_version

Permite indicar que los inodes serán de 64-bits, solo disponible si se está en un sistema a 64 bits.

  • Luego de montada de esta manera, lo fijamos en el /etc/fstab
# particion para postgresql
/dev/xvdb1 /srv/postgresql ext4 rw,noatime,errors=remount-ro,nouser_xattr,noacl,commit=300,barrier=0,i_version,nodelalloc,data=writeback,inode_readahead_blks=64,discard 0 0
  • Comprobamos:
    mount -a

Y ya estamos listos para crear el espacio de datos para nuestra DB!.

El espacio de tablas (tablespace)

Crearemos un simple espacio de tablas en nuestro optimizado sistema de archivos ext4 para contener nuestra base de datos:

  • cambiamos el propietario a la carpeta /srv/postgresql
    chown postgres.postgres /srv/postgresql
  • cambiamos al usuario “postgres” y abrimos la consola ‘psql’:
    su postgres
    psql
  • En la consola, ejecutamos el comando para crear un espacio de tablas:
    postgres=# CREATE TABLESPACE db_sistema OWNER jesuslara LOCATION '/srv/postgresql';

Y listo!, ya tenemos un espacio de tablas disponible para crear bases de datos y optimizado!

Usando el espacio de datos optimizado

Para crear una DB que no esté asociada al espacio “por defecto” (pg_default) ejecutamos:

  • Crear una DB:
CREATE DATABASE sistema WITH ENCODING='UTF8' OWNER=jesuslara TEMPLATE=template0 TABLESPACE=db_sistema;

Y como verán, le pasamos el tablespace “db_sistema” que hemos creado anteriormente.

¿Alguna prueba de la eficiencia?

La configuración siguiente no se hizo en un sistema dedicado para tal, se realizó en una portátil, corriendo Xen 4.1 y en una VM con 1GB de RAM se instaló el postgreSQL con las opciones nombradas, sin embargo, es posible notar una mejora en el performance general de las consultas (y eso que son solamente optimizaciones básicas).

Para ello, creamos una DB adicional, de un sistema administrativo (migrado desde Oracle hasta postgreSQL) que un amigo amablemente me facilitó para esta prueba.

Para ello, se movieron algunas funciones de código “Visual Basic” a código PL/Python y PL/pgSQL y se creó una consulta semi-compleja, de unas 26 líneas de extensión, que unifica unas 6 tablas del sistema para calcular una simple pre-nómina (ivss, paro forzoso, caja de ahorros, faov, isrl, etc); hay que notar que en la versión “cliente-servidor” de la aplicación, la nómina de 13 mil empleados dura varias minutos hasta horas con múltiples conceptos; para nuestra versión “simplificada” (5 asignaciones y 3 deducciones y cálculo de salario integral); la consulta se ejecutó en: 33068ms Para 13674 registros.

Pero, lo mejor ocurre si lo ejecutas por segunda vez!, ya que los buffers de trabajo mantienen en cache las operaciones de hash_aggregate (necesarias para algunos de los cómputos de agregado realizados), la segunda ejecución fué: 3107 milisegundos (3 segundos)

¿13 mil cómputos de empleados en 3 segundos?, ¡Nada mal para ser una portátil!

Conclusiones

Estas optimizaciones no son ni la décima parte de las que podemos optimizar de postgreSQL, pero es un comienzo, esta guía surge de la necesidad de orientar a las personas, que creen que pueden poner un sistema en producción de un postgreSQL recién instalado, estas optimizaciones mínimas, que cualquiera puede seguir, son un ejemplo y un comienzo.

No se dejen engañar con esas personas que dicen que “postgreSQL no rinde como Oracle” y un largo etcétera de excusas baratas, si alguien en su sano juicio instala Oracle cambiando parámetros en el sysctl, modificando los valores de tunning del sistema operativo o del sistema de archivos, clusterizar al máximo e incluso hace cosas más “malandras” como generar índices “al vuelo” por aquellos DBA vagos que jamás piensan bien sus bases de datos; ¿por qué la gente no hace lo mismo con postgreSQL?, tal vez porque ser un DBA “certificado postgreSQL” es más difícil y hacer entender a la gente, cuando crean un sistema conectado a datos, que su principal preocupación no debería ser “si usar PHP o Python” sino ver de qué formas optimizarás el S.O, el sistema de archivos, las consultas, el planificador, el acceso a disco y la gestión de índices para lograr que te sea “inocuo” si la gente utiliza perl o Visual Basic como Front-End.

Al final, postgreSQL debe tener el mando de los datos de la aplicación, y aprender a “verdaderamente” instalarlo, es el primer paso!.

¡Happy Hacking!

[Trac] Instalando SCM Trac en Debian Wheezy y derivados (Ubuntu, Mint, Canaima)

Preámbulo

Un amigo me solicitó la bitácora de instalación de Trac en Debian Wheezy, había tenido algunos detalles utilizando Trac y postgreSQL 9, por lo que decidí publicarla para que más personas pudieran aprovecharla, sin embargo, como el Wiki de GNU de Venezuela no está operativo (donde estaba la versión Squeeze) entonces publicaré toda la guía por acá.

Instalación de Trac

Trac funciona en el modo “instancia”, cada instancia requiere de su propia base de datos y de su propia carpeta (instancia), pero comparten un único punto en el servidor web, aunque Trac utiliza por defecto sqlite para la base de datos, utilizaremos postgreSQL.

La instalación se realiza en una distribución Debian-based pero puede ser realizada en cualquier distribución GNU/Linux que posea python-setuptools y el comando easy_install (o pip).

Instalación de dependencias

  • Instalar las dependencias en Debian Wheezy (o distribución compatible con aptitude | apt-get):
aptitude install apache2 python2.7-setuptools python-genshi python-pybabel python-psycopg2 python2.7-psycopg2 libapache2-mod-wsgi python-babel babel-1.4.0 postgresql-8.4 subversion git mercurial bzr

Nota: si utiliza postgresql-9.1 con Trac < 0.12.2 tendrá que realizar una correción en el código fuente de Trac para poder crear instancias en schemas de postgreSQL 9.

Nota: Si se instala babel posterior a la instalación de Trac, deberá reinstalar trac y actualizar sus instancias.

  • Opcionalmente, podemos actualizar setuptools (requiere conexión a Internet)
easy_install -U setuptools

Instalación de Trac

  • Vía apt-get:
    apt-get install trac trac-bzr trac-git trac-graphviz trac-mercurial trac-odtexport trac-wikiprint
  • ó via easy_install:
easy_install Babel==0.9.5 Genshi==0.6
easy_install Trac
  • También podemos descargar el fuente e instalarlo manualmente:
    wget -c http://ftp.edgewall.com/pub/trac/Trac-0.12.2.tar.gz
    tar xvf Trac-0.12.2.tar.gz
    cd Trac-0.12.2
    python ./setup.py install

Nota: si deseamos instalar (o descargar) la versión de pruebas ejecutamos:

  • Usando easy_install:
easy_install Trac==dev
  • Descargando:
    svn co http://svn.edgewall.org/repos/trac/trunk trac
    cd trac
    python ./setup.py install

Por ultimo, luego de instalado, verificamos que tenemos la última versión:

trac-admin --version

Luego de instalado Trac, procedemos a configurar una instancia.

Configuración de una instancia

Preparación de la DB de postgreSQL

Agregar las siguientes líneas al archivo pg_hba.conf:

archivo: /etc/postgresql/{version}/main/pg_hba.conf

local tracdb tracuser password
host tracdb tracuser 127.0.0.1/32 md5
host tracdb tracuser [subnet]/24 md5
#para poder iniciar sesion en red:
host all all [subnet]/24 md5

Donde [subnet] se reemplaza por la subnet de la red local; ejemplo:

local tracdb tracuser password
host tracdb tracuser 127.0.0.1/32 md5
host tracdb tracuser 192.168.1.0/24 md5
#para poder iniciar sesion en red:
host all all 192.168.1.0/24 md5

Y en postgresql.conf modificamos:

listen_addresses = '*'

Nota: solo necesario si el postgreSQL y el Trac estarán en diferentes equipos.

  • Iniciar una consola y ejecutar:
su postgres
  • E iniciar una consola de postgreSQL:
    >psql
  • En la consola de postgreSQL, crear la DB:
  • Para crear una DB en > 8.4 ejecutar:
    CREATE DATABASE tracdb
      WITH ENCODING='UTF8'
           TEMPLATE=template0
           LC_COLLATE='C'
           LC_CTYPE='C'
           CONNECTION LIMIT=-1;
  • para 8.3 o inferior:
    CREATE DATABASE tracdb 
    WITH ENCODING='UTF8' 
    TEMPLATE=template0 
    LC_COLLATE 'C' 
    LC_CTYPE 'C';
  • Crear el usuario necesario para gestionar la DB:
create user tracuser password 'clavesecreta';
  • Y garantizar los permisos necesarios sobre la DB de trac:
    grant all on database tracdb to tracuser;
  • Salimos del postgresql:
postgres=# \q

Y reiniciamos el postgreSQL:

/etc/init.d/postgresql restart

Ya estamos listos para crear una instancia de Trac.

(Opcional) Preparación de Trac con postgreSQL 9.1

Nota: cambios iniciales para Trac 0.12 y postgreSQL 9.1

Si se intenta crear una instancia de Trac en postgreSQL 9.1 utilizando un schema personalizado (no “public”), Trac devolverá un error por un detalle en el uso de psycopg (la librería python para conectarse a Trac), dicho error se ve así:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/trac/admin/console.py", line 422, in do_initenv
    options=options)
  File "/usr/lib/python2.7/dist-packages/trac/env.py", line 213, in __init__
    self.create(options)
  File "/usr/lib/python2.7/dist-packages/trac/env.py", line 401, in create
    DatabaseManager(self).init_db()
  File "/usr/lib/python2.7/dist-packages/trac/db/api.py", line 146, in init_db
    connector.init_db(**args)
  File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 98, in init_db
    params)
  File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 87, in get_connection
    params)
  File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 212, in __init__
    cnx.cursor().execute('SET search_path TO %s', (self.schema,))
DataError: invalid value for parameter "search_path": "weyu"
DETAIL:  schema "weyu" does not exist

Es un error en el archivo /usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py, dicho error ya está corregido en versiones posteriores de Trac y existe un patch para dicho archivo:

  • Parche que está en la incidencia #10406 de Trac:

 http://trac.edgewall.org/attachment/ticket/10406/10406-search-path-r10830.patch

Si desean hacer los cambios ustedes mismos, las líneas a cambiar son:

Línea 34:

34	 	    from psycopg2 import ProgrammingError as PGSchemaError <- eliminar esta
 	34	    from psycopg2 import DataError, ProgrammingError <- agregar esta

Línea 214:

214	 	        except PGSchemaError: <- eliminar esta
 	214	        except (DataError, ProgrammingError): <- agregar esta

Con esta correción podrán crear instancias en postgreSQL 9.1.

Creando un ambiente base (environment Trac)

  • Creamos el árbol de proyectos:
mkdir /srv/{repositorios,trac,proyectos} -p
  • Nos dirigimos a la carpeta de proyectos:
cd /srv/proyectos
  • Inicializamos la primera instancia de trac (se llamará documentacion)
trac-admin /srv/proyectos/documentacion initenv
  • Se inicia un script que realliza una serie de preguntas:
Project Name [My Project]> Documentacion GNU/Linux
  • Conexión a la DB:
Database connection string [sqlite:db/trac.db]>
  • forma del database connection string
    ''{database}://{usuario}:{contraseña}@{host}:{port}/{database}?schema={schema}''

Ejemplo:

postgres://tracuser:clavesecreta@localhost:5432/tracdb?schema=documentacion

Nota: de usar el schema “public”, simplemente no pasar la opcion schema: ejemplo:

postgres://tracuser:clavesecreta@localhost/tracdb
  • Si deseamos usar unix-sockets:

postgres://user:pass@/dbname?host=/path/to/unix/socket/dir&schema=schemaname

Ejemplo:

postgres://tracuser:clavesecreta@/tracdb?host=/var/run/postgresql/.s.PGSQL.5432/dir&schema=documentacion

— Al terminar la configuración de trac, podemos iniciar las pruebas:

  • ejecutamos:

tracd –port 8000 /srv/proyectos/documentacion

Y apuntamos nuestro navegador a:

 http://host:8000/documentacion

Luego de chequeado, procedemos a configurar nuestra instancia de Trac.

Configuración de Apache y Trac

Debemos crear un ambiente web (www) con WSGI del Trac para apache, para ello desplegamos en la carpeta web (/srv/trac/www’) el sitio web:

trac-admin /srv/proyectos/weyu deploy /srv/trac/www/

Creamos el virtualHost para multiples proyectos de trac, creamos un archivo en:

/etc/apache2/sites-availables/trac.site

<VirtualHost *:80>
# administrador del servidor
ServerAdmin jesuslara@DOMINIO
# nombre del vhost
ServerName proyectos.DOMINIO
# alias del servidor
ServerAlias trac.DOMINIO
DocumentRoot /srv/trac/www/htdocs/

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

WSGIScriptAlias / /srv/trac/www/cgi-bin/trac.wsgi

    <Directory /srv/trac/www>
        WSGIApplicationGroup %{GLOBAL}
        SetEnv trac.env_parent_dir /srv/proyectos
        Order deny,allow
        Allow from all
    </Directory>

    ErrorLog /srv/trac/www/log/apache-error.log
    CustomLog /srv/trac/www/log/access.log combined

</VirtualHost>
  • Creamos el directorio para los logs de apache:
mkdir /srv/trac/www/log && chown www-data.www-data /srv/trac/www/ -R
  • Modificamos el archivo trac.wsgi /srv/trac/www/cgi-bin/trac.wsgi:

Este queda:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
sys.stdout = sys.stderr

import os
import trac.db.postgres_backend
trac.db.postgres_backend.PostgreSQLConnection.poolable = False

os.environ['TRAC_ENV_PARENT_DIR'] = '/srv/proyectos/'

def application(environ, start_request):
    if not 'trac.env_parent_dir' in environ:
        environ.setdefault('trac.env_path', '/srv/proyectos/documentacion')
    if 'PYTHON_EGG_CACHE' in environ:
        os.environ['PYTHON_EGG_CACHE'] = environ['PYTHON_EGG_CACHE']
    elif 'trac.env_path' in environ:
        os.environ['PYTHON_EGG_CACHE'] = \
            os.path.join(environ['trac.env_path'], '.egg-cache')
    elif 'trac.env_parent_dir' in environ:
        os.environ['PYTHON_EGG_CACHE'] = \
            os.path.join(environ['trac.env_parent_dir'], '.egg-cache')
    from trac.web.main import dispatch_request
    return dispatch_request(environ, start_request)

Apache debe acceder al directorio de proyectos:

chown www-data.www-data /srv/proyectos -R
  • Y al directorio trac/htdocs:
chown www-data.www-data /srv/trac -R
  • Reiniciamos apache:
/etc/init.d/apache2 restart
  • Y ya podemos acceder a nuestra instancia vía la ruta del  virtualhost:

 http://host/documentacion

Quedando el directorio así:

.
|-- proyectos
|   `-- documentacion
|       |-- attachments
|       |-- conf
|       |-- htdocs
|       |-- log
|       |-- plugins
|       `-- templates
|-- repositorio
|   `-- documentacion
`-- trac
    `-- www
        |-- cgi-bin
        |-- htdocs
        |   |-- common
        |   |   |-- css
        |   |   |-- guide
        |   |   `-- js
        |   `-- site
        `-- log

(opcional) Configuración de múltiples ambientes (instancias)

Aunque se puede crear una base de datos para cada instancia, utilizaremos una única base de datos postgreSQL y schemas por cada instancia de Trac.

  • Inicializamos una nueva instancia:
trac-admin /srv/proyectos/lyx-book/ initenv
  • Configuramos la instancia:
Project Name [My Project]> Lyx Book

Database connection string [sqlite:db/trac.db]> postgres://tracuser:clavesecreta@localhost:5432/tracdb?schema=lyx
  • Propietario www-data a la carpeta del proyecto:
chown www-data.www-data /srv/proyectos -R
  • reiniciamos apache:
/etc/init.d/apache2 restart
  • Y ya podemos ver la nueva instancia en la lista de instancias:
  • al acceder al vhost, veremos la lista de instancias:

 http://host/

— Lista de instancias:

—————————————-

Available Projects

—————————————-

Autenticación inicial del Trac

La autenticación inicial se realizará vía htpasswd (en próximo artículo, agregaré la autenticación openldap).

  • Agregamos un usuario de sistema, para administrar el trac
useradd administrador
  • Creamos el archivo inicial para autenticar los usuarios con Trac
htpasswd -c /srv/trac/www/.htpasswd administrador
  • nota: inicialmente autenticamos con el usuario administrador, con la contraseña que le asignemos.
  • Y agregamos la entrada de autenticación al vhost del trac:
        <Location />
                AuthType Basic
                AuthName "Trac"
                AuthUserFile /srv/trac/www/.htpasswd
                Require valid-user
        </Location>
  • Luego, agregamos la info de autenticación via HTPASSWD al archivo de configuración de la instancia:
  • nota: el archivo de configuración de la instancia está en /srv/proyectos/{instancia}/conf/trac.ini, ejemplo:

archivo: /srv/proyectos/documentacion/conf/trac.ini

  • Agregamos la autenticación vía htpasswd:
[account-manager]
account_changes_notify_addresses =
password_file = /srv/trac/www/.htpasswd
password_format = htpasswd
password_store = HtPasswdStore
  • Le damos privilegios de TRAC_ADMIN al usuario administrador:
trac-admin /srv/proyectos/documentacion
  • Aparece la consola de la instancia de Trac:
-
Welcome to trac-admin 0.12.2
Interactive Trac administration console.
Copyright (C) 2003-2011 Edgewall Software

Type:  '?' or 'help' for help on commands.

Trac [/srv/proyectos/documentacion]>
  • Y en la consola ejecutamos el siguiente comando:
permission add administrador TRAC_ADMIN
  • Salimos de la consola:
>exit
  • Ejecutamos el upgrade de la instancia:
trac-admin /srv/proyectos/weyu upgrade
  • Y reiniciamos apache:
/etc/init.d/apache2 restart

Y ya podemos entrar al trac como el usuario administrador:

 http://host/documentacion/admin/

Ahora podemos personalizar ciertas opciones como incorporar plugins o agregar temas.

Incorporar un Tema a Trac

Para incorporar un tema a Trac, se debe primeramente incorporar el  http://trac-hacks.org/wiki/ThemeEnginePlugin Theme Engine Plugin

Instalación del Theme Engine Plugin

  • Descargamos el gestor de temas:
svn co http://trac-hacks.org/svn/themeengineplugin/0.11/ theme-engine
  • compilamos e instalamos:
cd theme-engine
python setup.py install
  • Habilitamos el theme engine plugin en el archivo conf/trac.ini
[components]
themeengine.* = enabled
  • Y reiniciamos el apache:
    /etc/init.d/apache2 restart

Ya podemos instalar un nuevo tema.

Instalar un Tema

  • Descargamos el tema que necesitamos:
svn co http://trac-hacks.org/svn/pydotorgtheme/0.11/ pydotorgtheme
  • Habilitamos el tema como plugin en el archivo conf/trac.ini
  • Se agregan a la sección ![components] del archivo trac.ini:
    pydotorgtheme.* = enabled
  • Habilitamos el tema en la sección ![theme] del archivo conf/trac.ini
[theme]
theme = PyDotOrg
  • Reiniciamos apache:
/etc/init.d/apache2 restart

Y ya contamos con un nuevo tema instalado.

Instalando un plugin de Trac

Para instalar un plugin de trac por la vía de la descarga, primero, ubicamos y descargamos la fuente;

  • Descargamos, el plugin de Mercurial
svn co http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin
  • Nos movemos a la carpeta:
    cd mercurial-plugin
  • Ejecutamos la instalación del plugin:
python setup.py install
  • Y luego incorporamos dicho plugin al ‘conf/trac.ini’
[components]
tracext.hg.backend.*
  • Nota: podremos saber el nombre del componente a agregar en el archivo “setup.py > packages”.

Algunos plugins solicitarán actualizar (upgrade) de la instancia, para ello:

  • Ejecutamos en una cónsola:
trac-admin /srv/proyectos/documentacion upgrade
  • Y reiniciamos apache:
    /etc/init.d/apache2 restart

Configuración de repositorios

La configuración de repositorios (directorios donde se almacena código fuente versionado gracias a un VCS) depende de cada software de VCS utilizado, por defecto Trac gestiona Subversion, pero puede habilitarse para otros VCS.

Subversion

  • Instalamos subversion
aptitude install subversion libapache2-svn
  • Creamos la carpeta para el proyecto que deseamos versionar:
mkdir /srv/repositorio/proyecto-svn
  • Creamos el ambiente del proyecto SVN:
svnadmin create /srv/repositorio/proyecto-svn
  • Y le damos privilegio a apache para leerlo:
chown www-data.www-data /srv/repositorio -R
  • Entramos en el environment del trac:
trac-admin /srv/proyectos/documentacion
  • Agregamos el repositorio:
repository add proyecto-svn /srv/repositorio/proyecto-svn svn
  • nota: la sintaxis es: repository add {nombre} {ruta} {tipo}
  • Y ejecutamos la sincronización:
Trac> repository resync proyecto-svn 

Resyncing repository history for proyecto-svn ... 
0 revisions cached. 
Done.
  • Podemos ejecutar la resincronización de todos los repositorios existentes ejecutando:
repository resync '*'

Mercurial (Hg)

  • Instalamos el soporte a mercurial en nuestra distribución:
aptitude install mercurial
  • Descargamos el plugin
svn co http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin
  • E instalamos el plugin de mercurial:
    cd mercurial-plugin
    python setup.py install
  • Configuramos el plugin de mercurial (hg) en el trac.ini
[components]
tracext.hg.backend.*
  • agregamos la configuración del plugin mercurial
    [hg]
    # -- Show revision number in addition to the changeset hash (defaults to yes)
    show_rev = yes
    # -- Changeset hash format
    node_format = short
  • Reiniciamos el environment de trac y apache:
trac-admin /srv/proyectos/documentacion upgrade && /etc/init.d/apache2 restart

Y ya tenemos configurado el soporte para Mercurial en Trac, ahora procedemos a agregar un repositorio:

  • Para agregar un repositorio Hg (Mercurial) creamos:
mkdir /srv/repositorio/hg/gnu
  • Nos movemos al directorio:
cd /srv/repositorio/hg/gnu/
  • Iniciamos Mercurial en la carpeta
    hg init
  • Y actualizamos:
    hg update
    0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  • Entramos en el environment del trac:
trac-admin /srv/proyectos/documentacion
  • Agregamos el repositorio:
>repository add gnu-hg /srv/repositorio/hg/gnu hg
  • Y ejecutamos la re-sincronización:
    Trac [/srv/proyectos/documentacion]> repository resync gnu-hg
    Resyncing repository history for gnu... 
    0 revisions cached.
    Done.

GIT

Configurando Git

  • Instalamos lo necesario para git:
    aptitude install git git-core git-daemon-run
  • instalamos el plugin de GIT
    easy_install http://github.com/hvr/trac-git-plugin/tarball/master
  • Reiniciamos apache:
    /etc/init.d/apache2 restart
  • Agregamos la sección GIT al trac.ini
    [git]
    cached_repository = false
    persistent_cache = false
    shortrev_len = 7
    wiki_shortrev_len = 7
    git_bin = /usr/bin/git
    trac_user_rlookup = true
    use_committer_id = false
    use_committer_time = false
  • Y habilitamos el plugin (trac.ini)
    [components]
    tracext.git.* = enabled
  • Tambien agregamos la posibilidad de tener GIT post-commit hooks:
    [components]
    tracopt.ticket.commit_updater.committicketreferencemacro = enabled
    tracopt.ticket.commit_updater.committicketupdater = enabled
  • Y cambiamos esto (en el trac.ini):
    repository_sync_per_request = (default)

    — por esto:

    repository_sync_per_request =

Ya configurado GIT, creamos un repositorio.

Creación de un repositorio GIT

  • Creamos la carpeta:
mkdir /srv/repositorios/lyx-book
  • La convertimos en un repositorio git vacio:
    git --bare init
  • Nota: el directorio debe ser de tipo “bare”, ya que Trac debe tener acceso a los archivos de control (HEAD y config) de GIT y no solo el directorio .git/
  • Incorporamos los archivos necesarios, ejecutamos su adhesión al GIT:
    git add .
  • Ejecutamos el primer commit del repositorio:
    git commit -a -m 'first commit'
  • Verificamos su estado:
    git status
    # On branch master
    nothing to commit (working directory clean)
  • Cargamos la consola de la instancia:
    trac-admin /srv/proyectos/documentacion
    
    Welcome to trac-admin 0.12.2
    Interactive Trac administration console.
    Copyright (C) 2003-2011 Edgewall Software
    
    Type:  '?' or 'help' for help on commands.
    
    Trac [/srv/proyectos/documentacion]>
  • Incorporamos el repositorio:
repository add lyx-book /srv/repositorio/lyx-book git
  • Ejecutamos la sincronización:
    repository resync lyx-book

Conclusiones

Trac es una excelente herramienta  de SCM (Source Code Management) ya que combina Wiki, Gestión de incidencias (ticket, bug-tracking), gestión de código VCS y se le pueden incorporar plugins de terceros que incluyen desde un foro hasta un blog.

… Y Dios quiso hacerse un Sistema Operativo

La semana pasada dos grandes de la industria de la computación han dejado nuestro mundo, me refiero a Steve Jobs, co-fundador de Apple y co-inventor (con Stephen “woz” Wozniak) del PC y no menos importante Dennis “drm” Ritchie, el co-creador de Unix y del lenguaje de programación C.

Sorprende la cantidad de gente afanada y la cantidad de comentarios “sin razón” que he leído por allí para defender la importancia de uno u otro personaje, aunque para mi “cariño” personal no hay ser mas importante para la tecnología como Dennis Ritchie (pasaré a explicar luego), considero que cada uno tiene su mérito e importancia … como en un mundo inter-relacionado, nadie es más importante que nadie sin el aporte de los demás, aunque esos “demás” sean menos conocidos …

El mundo desde un diseñador ….

Estando joven Steve Jobs y trabajando para Atari (como científico computacional y programador) le encomendaron un trabajo “especial”; reducir el consumo de chips para la fabricación de una tableta de juegos para la consola, ya que Steve jamás fué ingeniero ni electrónico, llamó a su amigo Wozniak para que “picaran la cochina” (dividieran la recompensa), Wozniak haría el trabajo y como Steve era el trabajador en Atari, cobraría y dividirían el botín.

De estos capitales, nació Apple …

Este era Steve Jobs, un “oportunista” (en el buen sentido de la palabra) un hombre que sabía estar en el lugar y momento indicado, tenía las ideas y las unía con las personas que podían hacer realidad esa idea ¿su contribución?, lograr que las ideas (suyas o de terceros) cobraran vida de manera sorprendente …

Steve Jobs ha pensado en la idea de un “asistente virtual” desde principios de los 80, desde que mejoraba la interfaz de Apple Lisa y desarrollaba Macintosh ¿inventó el asistente virtual?, no, simplemente compró SIRI, la empresa que podría llevarlo a cabo y lo incorporó a su sistema operativo iOS recientemente en la versión 5.

Por ende, ¿inventó Steve el ipad, el iphone o el iMac?, ciertamente no inventó el hardware, pero si inventó la idea y mucho mejor explicado como él mismo lo afirma, ¿qué hace diferente el Ipod de cualquier reproductor de música MP3?, ¿el diseño?, ¿la ergonomía?, ¿la capacidad de batería?, ¿los Apple-fan boys?, no; y aunque la gente no lo quiera admitir, como el propio Jobs lo indicó una vez “Todo es cosa de Software”, el software del ipod (posteriormente evolucionado en iOS) logró que todas estas preguntas anteriores tuvieran respuesta …

… eppur si muove …

Leía un artículo sobre la muerte de Jobs comparada con la de Ritchie y en un comentario típico “apple-fan boy” la persona indicaba “De no ser por Apple I y Jobs, estaría escribiendo este artículo en un Windows”, muy muy lejos de la realidad, de no ser por Wozniak (el co-creador del hardware) y Jobs (co-diseñador del software), Bill Gates no hubiera tenido interfaz que imitar, ratón que usar, hardware PC que mejorar ni ninguna idea sobre un computador portátil, que lo llevaran a “inventar” BASIC, MS-DOS y luego, Windows.

Recordemos además que las interfaces “modernas” de computación nacieron de la visión de Jobs con NextStep (razón por la cual fue re-enganchado de Apple en 1996), ya en 1988 se contaba con un Unix-Like moderno y las interfaces “mosaic” que dieron vida a la mayoría de las ideas sobre “cómo debía ser un Sistema Operativo Gráfico” …

Trivia: ¿sabían que el computador que Tim Berners-Lee (el creador del hipertexto y del Worl Wide Web) usaba era un NeXT Cube?.

Y siempre me gusta recordar la anécdota de las fuentes tipográficas, como típico “geek” que odia las universidades, Jobs decidió salirse de los cursos “regulares” y tomar solo aquellas clases que le interesaban, tomó una clase complementaria de caligrafía y tipografía y le encantó tanto, que pensó “alguna vez lo incorporaré al sistema”, gracias a esta idea (y al apoyo del diseñador Sampo Kaasilia) desarrollan “True Type Font” (TTF) que es incorporada al sistema operativo Mac OS 7 en 1991; además las 3 primeras “fuentes” tipográficas (Times New Roman, Courier y Helvética) eran las favoritas de Jobs en sus clases de diseño …

¿Podrían usar la horrenda “Comic Sans” en Windows de no existir TTF? …

Y acaso, ¿podríamos imprimir decentemente?;  aunque CUPS fué inventado por Michael Sweet, es gracias a que Apple en 2002 decide adoptar el proyecto que todo Unix-Like (desde BSD a Linux) goza de un excelente gestor de impresoras …

¿Ven como siempre Steve estaba en el momento y lugar indicados? …

No discutas con fanáticos …

Alguien me hizo un comentario molesto por twitter que decía algo como esto “nadie recuerda quien inventó el cemento o la cúpula, pero todos recuerdan a Brunellesci o a Miguel Angel”, sin llegar al exceso de Apple-fan boy de comparar a Jobs con los grandes artistas del renacimiento (ya vimos que no pinta sus propias pinturas, pero siempre es amigo de los mejores pintores), hay  que tomar en cuenta que no recordar al inventor del cemento o el concreto con más devoción que a Miguel Ángel es que nos hace seres vanidosos y mediáticos, que no nos interesa quien inventará la cura contra el cancer, pero sí el modista del proximo traje ridículo de Lady Gaga.

Otro comentario (leído en ALT-1040) molesto decía que el único “Unix certificado” del mundo era MacOSX (típico comentario Apple-Fan boy) , recordemos que el actual núcleo de MacOSX no tiene más de Unix System V que de BSD, pues su padre fué Darwin, una evolución “natural” de NextStep, combinándola con freeBSD para llenar “los espacios que le  faltaban a NextStep para convertirse en Copland”; es por eso que a partir de 2001, Apple descarta a Macintosh y se orienta exclusivamente a Mac OS X.

Luego, dicen que no usan software libre pero Darwin BSD (el núcleo de OSX) es Apple Public Source License, una licencia compatible con Creative Commons 3.0 y posee copyleft parcial (compatible OSI).

El “papá” de todo esto …

Hay que medir la importancia del inventor del “cemento” del mundo actual, tal vez para personas “mundanas” la humildad de Dennis Ritchie haya sido tan “insólita” que pidió que ocultaran su muerte de los medios y que fuera “modesta y privada”; que Steve Jobs haya sido un hombre mediático no lo hace más importante que Dennis Ritchie y eso es lo que los medios nos quieren vender …

Dirigido a los “Apple-Fan boys”, ya sabemos que el núcleo OSX es fuente abierta y además, un nieto de Unix (Darwin BSD > FreeBSD > BSD 4.4 > UNIX), pero ¿con qué diseñais tus aplicaciones?, ¿Cocoa?, ¿Objective-C?, ¿QTkit?, Dennis Ritchie es padre del lenguaje C, lenguaje “casado” con Unix y que por su portabilidad y robustez ha sido el padre y cuna de TODAS las tecnologías modernas del presente siglo.

Desde Cocoa (la API de desarrollo de aplicaciones de MacOSX) hasta QT, desde Linux (Kernel Unix-Like Libre) hasta Microsoft NT-Kernel (núcleo de todo Windows desde Windows NT hasta Windows 8), desde microcontroladores hasta aplicaciones embebidas, desde GPS hasta satélites, desde scripting bash hasta otros lenguajes de programación (python, PHP, ruby, visual C, C# .NET, Java), casi TODO lo que tenga una computadora por centro (y no importa la arquitectura) tiene o está enlazado con algo escrito o hecho en lenguaje C.

No hay que ser un genio para entender la magnitud de ambos inventos, sistema UNIX está en el corazón de *casi* todo sistema operativo que se respete (BSD, nextStep, Solaris, Linux, etc) y sus hijos (freeBSD, Solaris, macOSX, Android, iOS, etc) y lenguaje C está en la programación de *casi* todo lo que usamos, además de obviamente sus hijos …

El hombre que siempre FUE el lugar y tiempo indicado …

A diferencia de Jobs, Ritchie no necesitaba estar en el momento indicado, ÉL era el momento indicado, gracias al desarrollo de su sistema operativo (UNIX) en la universidad de Berkeley en 1971, fué que en 1976 Wosniak y Jobs contaron con un sistema operativo modular y fácil de portar para el hardware de su computador personal Apple I.

A Dennis Ritchie no solamente le debemos muchísimo, sino que le debemos “la jerga computacional”, cada vez que expreses “el chequeador de discos está revisando los inodes”, recuerda a Dennis Ritchie quien lo expresada en la primera edición de Unix, lo que dió origen a la palabra “inode”:

“Si un disco es un gran indice (index), entonces un arreglo de datos extraído de ese índice sería un *index-array* (i-array) y cada nodo (elemento) de ese índice, sería un *index-node* (i-node)” …

Con el tiempo, el guión desapareció, quedando “inode”.

La historia: un gran espaguetti de dependencias …

Como verán, todos son importantes en un momento específico del tiempo, aportando las ideas necesarias para que nuestro mundo se mueva y evolucione; hay que recordar la gran discusión en la IEEE entre desarrolladores UNIX (incluyendo Ritchie) sobre la posibilidad de crear un estándar ISO para la portabilidad de las interfaces de operación de UNIX, fué nuestro gran amigo Richard Stallman quien en 1988 aportó el tan famoso acrónimo POSIX que todo ingeniero y computista conoce.

Imaginen, ¿cuántos caminos se podrían recorrer en la historia desde la invención de Unix hasta ahora?, ¿o desde lenguaje C hasta ahora?, imaginen, si Adobe hubiera “liberado” los estándares de comunicación postscript en 1980 Richard Stallman no hubiera necesitado re-escribir Unix de manera libre pero a su vez, Jobs no hubiera re-escrito postscript en forma de TTF y no habría fuentes tipográficas en ningún sistema operativo, de no ser por UNIX, Jobs no hubiera tenido base para escribir Apple Macintosh o NextStep, a su vez, gracias a las ideas de Jobs y Ellen Hancock en Copland, se construyó un “clon” basado en el kernel BSD, que se llamó Darwin y que *volvió a casa* con el nombre de macOS X para cumplir el sueño de Jobs …

Dennis Ritchie es nuestro santo, Steve Jobs es el santo para el resto de los mortales que les importa un pepino lo que mueve su teléfono, enruta sus llamadas por los satélites, enciende su televisor o gestiona sus cuentas bancarias, hay dos santos para ambos …

Tal vez Dios se los llevó, porque necesitaba hacerse un sistema operativo, con Steve Jobs en el diseño visual y Dennis Ritchie programándole su corazón (UNIX) …

[Hacking Canaimita] incorporando un Modem 3G interno a la Canaimita

Una de las cosas más importantes que conlleva el proyecto Canaima Educativo, no es que se tenga un “equipo adoctrinador del gobierno comunista venecubano” como algunas personas tratan de mostrarlo; si el proyecto fuera llamado “Intel te regala una compu” o “Microsoft lleva Windows gratis a tu casa” la cosa ciertamente cambiaría y sería vista con buenos ojos por algunos alienados … pero en fin, a mi me encanta experimentar con mi Canaimita y la educación liberadora, las posibilidades de contar con un equipo las 24 horas en tu casa para aprender a hacer todo lo que desees (programar, dibujar, escribir poesía, escuchar y/o escribir música, etc) es algo que sinceramente es invaluable y espero que perdure en el tiempo.

Luego de este preámbulo, discutiremos la posibilidad de incorporar a las Canaimitas segundo grado de conectarse a Internet gracias a un secreto oculto en su corazón … veamos!

ALERTA:

Ojo!, artículo ALTAMENTE TECNICO!, requiere desarmar el equipo y conocimientos de computación, HÁGALO SOLAMENTE BAJO SUPERVISIÓN ESPECIALIZADA y nunca dañe el equipo de su hijo, está quemando sus libros y su futuro …

Canamita, te veo el corazón …

Cuando quitamos el forro y la tapa trasera, nos encontraremos con este panorama:

  • * Abajo, disco duro de 160 GB
  • Lado izquierdo: zócalo de la tarjeta inalámbrica
  • Centro: bahía mini PCI-Express de 16x con un cable-antena 2.4 Ghz
  • Derecha: Memoria RAM SO-DIMM DDR2 de 1Gb

Lo que nos interesa está en el centro, un zócalo de tipo mini-PCI express:

Tarjeta mini-PCI express

Esta bahía es de 52-pines y sirve para muchos dispositivos (tarjetas inalámbricas, modems 3G, etc); adicionalmente, viene pegado con una cinta un cable muy delgado:

Con un conector de tipo mini-SMA:

mini-SMA

Este cable es un tesoro, si al abrir lo ven (solo si tienes una canaimita N270 o N450), entonces tienen una Antena útil para muchos dispositivos (entre ellos, modems HSDPA de 3.5 Ghz  -7.2MBps-), de no contar con ello, igual puede hacer alguna “magia” para pegar la antena a la carcaza de la portátil.

Proceso de adquisición

En mercadolibre y otros centros de venta, he visto pocos modems internos mini-pciE de 3 ó 3.5 Ghz HSDPA, pero este tipo de equipo es realmente barato (muy barato), en tiendas on-line como Ebay, el mio, lo compré directo en China, con envío marítimo de bajo coste (llego como en mes y medio) y no gasté más de 30 US$ (unos 129 Bs. al cambio oficial).

Si están acostumbrados a las compras por Internet, busquen en Ebay o en Amazon (o en Alibaba) por “WWAN Card” y sorprendanse de la variedad y precios, solamente tengan en cuenta 3 cosas:

  • Que el modem sea HSDPA (3 ó 3.5G) para que le saquen el provecho máximo
  • Que venga “unlocked” (desbloqueado para cualquier operadora)
  • Que traiga su antena (o comprenla aparte, antena para WWAN card)
  • Que sea cuatribanda (si lo quieren usar con cualquier operadora)

Aunque no importa la marca, a mí me gustó este:

http://www.ebay.com/itm/DELL-Wireless-5530-F3507g-3G-HSDPA-WWAN-GPS-Card-C687R-/220820418427?pt=LH_DefaultDomain_0&hash=item3369ec2f7b#ht_3415wt_1074

Una de las razones, es porque el Sony Ericsson FG3507 trae GPS y es barato.

Instalando …

En mi caso procedí a hacer 2 cambios fundamentales, primero, decidí dejar la antena inalámbrica con una sola antena (trae 2, una principal y una auxiliar) para conectar ambas al modem 3G (que necesita una para el modem y otra para el GPS), luego compré la antena para el GPS y devolví todo como estaba antes:

Conecté el cable suelto mini-SMA al puerto con flecha roja que decía “MAIN” y en “AUX” puse el cable negro auxiliar de la antena inalámbrica (que vemos desmontada a la izquierda en la figura).

La cosa queda así:

El dispositivo calza igual que las memorias RAM SO-DIMM, se mete con una leve inclinación en la bahía y luego se presiona suavemente hacia adentro y abajo, posteriormente se fija con tornillos (inicialmente le robé uno a la inalámbrica, después conseguí tornillos de estria de 1mm para fijarla fuertemente), quedando así:

Y ustedes se preguntarán, si es un modem GSM 3G, ¿dónde meto el chip SIM GSM?, pues muy fácil, retiren la batería de la portátil y verán (si la ven de frente) a su lado derecho una leve ranura, como esta:

Coloquen allí el chip SIM de la operadora de su preferencia, cierren todo, coloquen la batería y enciendan el equipo.

¿Qué necesito para navegar?

Además de (obvio 😉 ) meterle saldo a la línea, necesitan algunas cosas dependiendo de la versión de Canaima que tengan instalada:

Canaima 2.1 (vieja versión): wvdial, la última versión de network-manager, mobile-broadband-provider-info y reiniciar luego de instalar.

Canaima 3.0 (nueva versión): simplemente buscan en el administrador de paquetes a “mobile-broadband-provider-info” y listo.

¿Cómo me conecto?

Para usarlo es muy fácil, simplemente hacen click derecho sobre el ícono de conectividad (se llama network-manager y está en la esquina superior derecha de su escritorio), este indicará:

  • Activar Red
  • Activar Inalámbrico
  • Activar Red inalámbrica movil
La última estará desmarcada, hagan click y luego, podrán seleccionar la conexión de su modem, que podrán configurar según sea su operadora, al final, su network-manager se verá así:

Network Manager mostrando las operadoras venezolanas

y listo!, disfruten de una conectividad 3G móvil en cualquier parte gracias a proyecto Canaima! ….

¿y quien dijo que eran un juguete? 😉

Happy Hacking Canaimita! ❤

Linux Debian/Canaima en Soneview N110 mini-Laptop (classmate)

Preámbulo

Este equipo es una tipo classmate diseñada por la gente de Soneview (no sabía que armaban laptops); como “hardware” es bastante decente:

Características notables:
* 2 Gb de RAM
* CPU atom 455 (doble procesador, arquitectura 64 bits)
* Pantalla Touchscreen
* Disco Duro 300 Gb

He decidido instalarle una forma optimizada (tunning) y modificada de Debian GNU/Linux (con temática Canaima) para aprovechar al máximo el equipo.

NOTA: La mayoría de estos trucos de “tunning” pueden ser aplicados a las diversas versiones de mini-laptops, incluyendo la Classmate PC Magallanes (Canaimita).

ADVERTENCIA

La mayoría de estas opciones de “Tunning” son modificaciones agresivas del sistema GNU/Linux, ameritan un conocimiento exhaustivo de GNU/Linux, de cónsola, de modificación de archivos de configuración, de reinicio de servicios y de revisión de errores (syslog, dmesg).

EXCEPCION DE RESPONSABILIDAD: aún cuando esta guía ha sido probada de manera intensiva en diversidad de equipos Atom (Canaimitas, HP-Mini, Acer Aspire One, Soneview, Asus EE-PC, etc), no me hago responsable si por omisión de pasos o desconocimiento de algunas herramientas, terminas por dañar tu equipo, queda bajo tu expresa responsabilidad la aplicación de estas modificaciones.

Responderé cualquier tipo de dudas, salvo cosas como “¿como guardo y salgo de vim?” (para ello, escriben “:x” y no lo volveré a repetir!).

Instalación de Debian GNU/Linux

Se instaló inicialmente, una base mínima del sistema GNU/Linux Debian (arquitectura de 64 bits *amd64*) esto con el fin de reducir al mínimo el tiempo de instalación y comenzar desde un sistema estable mínimo de pruebas.
Se usó: Debian Squeeze (stable)
Arquitectura: amd64

Distribución de disco duro

Al ser un equipo que se usará para actividades de usuario final y sobre todo niños, se distribuyó el espacio en su mayoría para /home (HOME de los usuarios) y 2 GB de SWAP.

/boot (tipo: ext2, 256MB de espacio, primaria, marcada activa, flags: nodev)
/ (tipo: ext4, 20Gb de espacio, extendida, flags: noatime)
/home (tipo: xfs, resto del espacio, extendida)
swap (tipo: swap, 2GB)

En este caso particular, no conectaré a la red, para que netinstall instale solamente lo básico (así, podré actualizar después).

Actualización de repositorios

Debian Squeeze puede ser convertido en un GNU/Linux Canaima simplemente con colocar los repositorios correctos de ambas versiones, Debian y Canaima:

Editamos el archivo:

vim.tiny /etc/apt/sources.list

Agregamos los repositorios:

#debian (squeeze)
deb http://debian.cantv.net/debian/ squeeze main contrib non-free

# canaima (roraima)
deb http://repositorio.canaima.softwarelibre.gob.ve/ roraima usuarios

# multimedia (codecs privativos, codecs de mplayer, otros)
deb ftp://ftp.debian-multimedia.org squeeze main non-free

Se ejecutó la actualización del repositorio:

aptitude update

Y se instalaron las respectivas llaves de los 3:

aptitude install debian-multimedia-keyring debian-keyring canaima-llaves

Y luego se actualizó el equipo (versión minimal de Debian)

aptitude full-upgrade

Actualicé los identificadores de hardware:

update-pciids
update-usbids

Y verifico que ya describe mejor los dispositivos:

lsusb 
lspci

Instalando Canaima

Para evitar inconvenientes, he instalado Canaima en 2 pasos, primero, la versión “segura” de Canaima:

 aptitude install base-files canaima-base canaima-llaves

Cuando la base de Canaima está completamente lista, ejecuto “tasksel” para instalar:

  • * Entorno de Escritorio Gnome
  • * Equipo Portátil

Claro, podemos instalar esto vía aptitude con:

aptitude install ~t^laptop ~t^desktop

Cuando esto termine, instalamos el resto de Canaima:

aptitude install canaima-escritorio-gnome canaima-estilo-visual

Modificamos BURG, para que utilice el Tema de Canaima:

 vim.tiny /etc/default/burg
THEME=”radiance”

 Actualizamos burg:

update-burg

Y reiniciamos el equipo, al finalizar, tendremos un sistema Canaima GNU/Linux.

Sistema de Archivos

Se cambiaron directivas del sistema de archivos y se agregaron opciones de performance a cada partición.

Cambiamos a modo init 1

 init 1

Colocamos la clave de root:

(root password for maintenance)

Modificamos el journal de “root” (/) para que sea en modo writeback:

tune2fs -o journal_data_writeback /dev/sda2

Luego, desmontamos temporariamente root (/)

 umount /

Y chequeamos la partición por errores:

e2fsck -fp /dev/sda2

También desactivamos por completo el journal de /boot

tune2fs -O ^has_journal /dev/sda1

Y chequeamos:

e2fsck -fp /dev/sda1

Montamos /

mount -a

Y editamos el fstab:

vim.tiny /etc/fstab

Y agregamos las opciones nuevas de montaje a “/”:

 / ext4 noatime,journal_async_commit,data=writeback,barrier=0,nobh,commit=60,nouser_xattr,errors=remount-ro

Tambien a /home:

 /home relatime,nodiratime,errors=remount-ro

 Guardamos los cambios y reiniciamos el equipo.

 reboot

Performance del Disco

Instalamos hdparm:

 aptitude install hdparm

Luego de mejorar el performance de los sistemas de archivos, habilitamos 2 cosas importantes al disco duro (/dev/sda):

-W1 habilita el caché del disco duro

-M254 deshabilita la acústica del disco duro (hace más ruido, pero va más rápido)

agregamos la siguiente información al /etc/hdparm.conf

 /dev/sda {
 lookahead = on
 write_cache = on
 acoustic_management = 254
}

Y ejecutamos con el comando, para que se active:

hdparm -q -W1 -M254 -A1 /dev/sda

Kernel Linux

Se instaló un kernel pre-compilado para Intel AMD64 que soporta Core, Xeon y Atom, no he tenido tiempo de crear un kernel monolítico más rápido exclusivo para Atom, espero publicarlo a futuro.

Se instaló (como requerimiento del rápido algoritmo de compresión-descompresión del Kernel Linux):

aptitude install lzop

Entre las caraterísticas importantes habilitadas:

CONFIG_CGROUPS=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_RD_LZO=y
CONFIG_NO_HZ=y # tickless system
CONFIG_X86_CPU=y
CONFIG_MATOM=y
CONFIG_HPET_TIMER=y
CONFIG_PREEMPT=y
CONFIG_MICROCODE_INTEL=y # requiere instalar intel-microcode
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_MTRR=y
CONFIG_HZ_1000=y
CONFIG_HZ=1000
CONFIG_BKL=n #desactivamos el Big Kernel Lock
# CONFIG_DEBUG_KERNEL is not set
# desactivamos cualquier tipo de “debug” del kernel.

Luego de compilado y generado el paquete .deb, se instaló en el equipo:

* Primero: los headers del kernel

dpkg -i linux-headers-2.6.38.2-10.00.atom_amd64.deb

* Segundo, el kernel en si

dpkg -i linux-image-2.6.38.2-10.00.atom_amd64.deb

* Modificamos la línea de arranque del grub, Esto con el fin de corregir ciertos detalles del MTRR del video y habilitar el gfxpayload correcto de la consola entre otros:

Editamos:

vim.tiny /etc/default/burg

Y modificamos:

GRUB_CMDLINE_LINUX=”numa=on acpi=on lapic mtrr_spare_reg_nr=1 enable_mtrr_cleanup clocksource=hpet gfxpayload=1024×600 video=intel:1024x600x16″

Actualizamos el grub:

update-grub2

Y reiniciamos el equipo (para iniciar con el kernel 2.6.38 y las mejoras añadidas).

 Reglas del SysCTL

Sysctl permite cambiar dinámicamente opciones del sistema (en general), de módulos y del kernel en sí mismo, las opciones a habilitar tienen que ver con la reducción del impacto general sobre la memoria virtual del kernel, la reducción de uso de SWAP, entre otras.

Editamos:

vim.tiny /etc/sysctl.conf

Incorporamos al archivo:

# —-
#disminuir el uso de swap
vm.swappiness=1

 

#shared buffers
kernel.shmmni = 4096
kernel.shmall = 536870912
kernel.shmmax = 2147483648

 

#cantidad de hilos maximos
kernel.threads-max = 98006

 

#cantidad de archivos máximos abiertos
fs.file-max = 307615
fs.aio-max-nr = 1048576

 

# frecuencia de flush del demonio writeback
vm.dirty_background_ratio = 10
# porcentaje de RAM que será usada para memoria paginada (dirty memory)
vm.dirty_ratio=25
# para equipos con poca RAM, se usará solamente el 40% de la RAM como cache
vm.vfs_cache_pressure = 40
# wine, qemu y otras aplicaciones, requieren mapear Low-memory
vm.mmap_min_addr=4096 # una aplicacion no podrá usar más de 4096Kb de memoria baja

 

# Habilitamos el schedule autogroup y su velocidad de respuesta
kernel.sched_autogroup_enabled=1
kernel.sched_rt_runtime_us = 960000

 

# —

* ejecutamos:

sysctl -p

Para aplicar los cambios.

CGROUPS

Es una técnica del Kernel Linux para aislar, solapar, limitar o distribuir (incluído priorizar) todos los recursos hardware de la máquina (CPU, Memoria RAM, Disk I/O) en forma de contenedores de procesos aislados, con el fin de mejorar la eficiencia del kernel Linux, al paralelizar de manera óptima los procesos.

Esta técnica permite priorizar tareas y organizarlas jerárquicamente por criterios definidos, mejorando notablemente el performance general del sistema.
(Sirvase a buscar información sobre “el milagroso parche de 200 líneas” y “el script alternativo de Lennart Poettering”, ambos eran versiones preliminares de lo que ahora se puede hacer en Debian vía aplicaciones).

Instalaramos lo que necesitamos para administrarlos en GNU/Linux (> 2.6.32)

 aptitude install cgroup-bin libcgroup1 libpam-cgroup

* editamos el archivo cgconfig e indicamos donde se encuentra la ruta donde se montarán los CGROUPS:

 vim.tiny /etc/cgconfig.conf

En Debian esa ruta es:

/sys/fs/cgroup/

Quedando:

mount {
 all = /sys/fs/cgroup;
}

Y se ve así después de “montado” el fs:

tree -d /sys/fs/cgroup/

/sys/fs/cgroup/
├── realtime
├── srv
│   ├── server
│   ├── spool
│   └── X
├── sys
│   ├── cmn
│   ├── ctl
│   └── sys
└── usr
├── batch
└── inter

Editamos el cgrules:

vim.tiny /etc/cgrules.conf

Y creamos un grupo “especial”, llamado default, donde se agregarán los procesos de todos los usuarios (procesos no de sistema):

*   *   default/

 Editamos:

vim.tiny /etc/pam.d/common-session

Y agregamos el pam_cgroup, esto con el fin de que las tareas de usuario, sean agrupadas y gestionadas por el control CGROUP:

 session optional pam_cgroup.so

 libpam-cgroup clasifica los trabajos interactivos que implican inicio de sesión, de cada usuario.

Luego de esto, procedemos a cambiar la configuración del security/limits del audio:

 vim.tiny /etc/security/limits.conf

Y agregamos al final:

# acceso del grupo audio a privilegios especiales
@audio – rtprio 99
@audio – memlock unlimited
# acceso de grupo users a privilegios especiales
@users soft cpu $TIMEOUT
@users – rtprio $RT_PRIORITY
@users – nice $NICE
@users – memlock $MEMLOCK

Por ultimo, y para que libpam-cgroup y las modificaciones de audio funcionen, agregamos nuestro usuario a los grupos correspondientes:

adduser <mi usuario> users
adduser <mi usuario> audio

Y reiniciamos el equipo, para que todos los cambios acumulados se apliquen:

reboot

Verificaciones varias

Verificar MTRR:

cat /proc/mtrr

Para verificar que hay una región de memoria en “write-combining” (de la memoria de Video)

Verificar que se ha llenado el CGROUP:

ls -l /sys/fs/cgroup/

Y que está creando grupos (por usuario, etc)

 lscgroup
cpuset,ns,cpu,cpuacct,devices,freezer,net_cls:/
cpuset,ns,cpu,cpuacct,devices,freezer,net_cls:/3223
cpuset,ns,cpu,cpuacct,devices,freezer,net_cls:/3221
cpuset,ns,cpu,cpuacct,devices,freezer,net_cls:/default
cpuset,ns,cpu,cpuacct,devices,freezer,net_cls:/default/4387

Carga del touchscreen de la portatil

Instalamos el módulo evtouch del Xorg:

 aptitude install xserver-xorg-input-evtouch

La portatil tiene un touchscreen, modelo:

Bus 001 Device 006: ID 1bfd:1688 TouchPack Resistive Touch Screen

* Creamos el archivo:

vim.tiny /etc/modprobe.d/usbhid.conf

Y agregamos:

options usbhid quirks=0x1bfd:0x1688:0x40

– Esto corregirá y activará el touchscreen del equipo.

Aceleración de Video Intel

Instalamos lo necesario:

aptitude install mesa-utils libgl1-mesa-glx

La portatil posee una tarjeta de video Intel que soporta el driver 915 (intel)

Se ha creado el siguiente archivo:

vim.tiny /usr/share/X11/xorg.conf.d/10-scree

Que contiene:

Section “Device”
Identifier “Configured Video Device”
Driver “intel”
Option “VideoRam” “262144”
Option “AccelMethod” “UXA”
Option “EXAOptimizeMigration” “true”
Option “MigrationHeuristic” “smart”
Option “Tiling” “true”
Option “NoDDC”
Option “BackingStore” “True”
Option “MTRR” “on”
Option “LinearAlloc” “6144”
Option “MonitorLayout” “CRT,LFP”
Option “DRI” “true”
Option “XvMC” “on”
Option “TripleBuffer” “true”
Option “CacheLines” “1980”
EndSection

Y un archivo serverflags:

 vim.tiny /usr/share/X11/xorg.conf.d/30-serverflags.conf

Que contiene:

Section “Extensions”
Option “Composite” “Enable”
Option “RENDER” “Enable”
Option “DAMAGE” “Enable”
EndSection

 

Section “ServerFlags”
Option “AllowGLXWithComposite” “true”
Option “XAANoOffscreenPixmaps” “true”
Option “AddARGBGLXVisuals” “True”
Option “RandR” “on”
Option “RENDER” “on”
Option “AIGLX” “True”
Option “DRI2” “True”
Option “GlxVisuals” “all”
Option “AutoAddDevices” “True”
Option “AutoEnableDevices” “True”
Option “AllowEmptyInput” “False”
EndSection

Editamos el archivo:

vim.tiny /etc/environment

Y agregamos:

INTEL_BATCH=”1″

Dimensiones de pantalla y fuente (DPI)

Editamos el archivo:

vim.tiny /etc/X11/xinit/xserverrc

Y cambiamos de esto:

exec /usr/bin/X -nolisten tcp "$@"

a esto:

exec /usr/bin/X -nolisten -dpi 75 tcp "$@"

Con esto, podremos contar con unas fuentes “más pequeñas” para que podamos disfrutar cómodamente de las dimensiones de pantalla del equipo.

Reiniciamos el equipo para aplicar los cambios.

Aceleración de Firefox 4 (iceweasel)

Aunque Canaima viene con Cunaguaro, e instalado firefox 4 (iceweasel 4 de Debian)

Agregué lo siguiente repositorio (source.list):

deb http://mozilla.debian.net/ squeeze-backports iceweasel-4.0

Actualicé:

aptitude update

e Instalé:

aptitude install iceweasel libosmesa6

Para aprovechar al máximo Iceweasel 4, agregamos al /etc/environment las siguientes lineas:

MOZ_DISABLE_PANGO=”1″
MOZ_GLX_IGNORE_BLACKLIST=”1″

Cerramos sesión y volvemos a entrar.

Cargamos Iceweasel y lo forzamos a utilizar aceleración por hardware, escribimos la dirección:

about:config

Y cambiamos las siguientes opciones (escribirlas en la línea de búsqueda):

layers.acceleration.force-enabled=true
webgl.force-enabled=true
webgl.prefer-native-gl=true
webgl.osmesalib=/usr/lib/libOSMesa.so.6

Cerramos el Iceweasel y lo volvemos a cargar para probar la aceleración:

The Planetarium:

http://mozillademos.org/demos/planetarium/demo.html

Asteroides Game:

http://www.ambiera.at/copperlicht/demos/asteroid/

Fractal de Mandelbrot (peligro, extremadamente pesado, puede tardar unos 60 segundos en renderizarse)

http://fractal.io/

 Aceleración de Video y XvMC

No solamente la aceleración de video, el rendering openGL y el mejoramiento del frame-rate hacen que podamos disfrutar de videos a buena calidad y pantalla completa, sino que hemos habilitado XvMC (X-Video Motion Compensation), esto hace que porciones del renderizado de video sean realizados directamente por la GPU (tarjeta de video) mejorando el performance (y la suavidad general del sistema).

Reproductores de video como Xine y Mplayer ya usan XvMC para la reproducción de video (VLC es medio “buggy” al respecto).

Instalamos:

aptitude install libxvmc1 libxcb-xvmc0

Y ejecutamos:

echo /usr/lib/libIntelXvMC.so > /etc/X11/XvMCConfig

Como VLC da algunos problemas con XvMC, es preferible usar el Xine Plugin (o el mozilla-mplayer) para Firefox, instalamos:

aptitude install xine-plugin mozilla-mplayer

Nota: deben tener activo el repositorio “multimedia” para acceder a ellos.

Al cerrar y volver a entrar a Firefox, podemos ejecutar:

about:plugins

Y ver que los plugins ya están activos.

Probaremos la velocidad de los videos a pantalla completa.

Nota: esta portatil específicamente tiene una resolución máxima de 1024×600, no se pueden ver videos (ej. youtube) de más de 360p.

Y volvemos a reiniciar el equipo, para tener los cambios fijados y estables.

Tarjeta inalámbrica

El equipo cuenta con una tarjeta realtek inalámbrica (que necesita un firmware privativo), para hacerla funcionar debemos:

* Instalamos el firmware privativo:

aptitude install firmware-ralink
cd /etc/modprobe.d
* creamos los siguientes archivos:
touch rt2800lib.conf rt2800pci.conf rt2800usb.conf \
rt2x00lib.conf rt2x00pci.conf rt2x00usb.conf rt61pci.conf

Editamos el archivo:

vim.tiny rt2800lib.conf

Y agregamos:

blacklist rt2800lib
blacklist rt2800pci
blacklist rt2800lib
blacklist rt2x00pci
blacklist rt2x00lib
blacklist rt2x00usb

Y agregamos al /etc/modules:

rt2860sta
rt2870sta

Desmontamos los módulos:

modprobe -r rt2800pci
modprobe -r rt2800lib

Y montamos:

modprobe rt2860sta

Nota: la versión 2860sta es de la Realtek Soneview, la versión 2870sta de la Canaimita.

Luego, presionamos el rfkill-switch (Fn+F5) para encender la inalámbrica.

Ejecutamos:

ifconfig wlan0 up

Y luego:

iwlist wlan0 scan

Para verificar el funcionamiento de la Inalámbrica.

Soporte a modems 3G

Se deberán instalar los siguientes paquetes:

aptitude install network-manager network-manager-gnome \
 modem-manager mobile-broadband-provider-info usb-modeswitc

Nota: la mayoría de los paquetes vienen por defecto en Debian Squeeze.

Conecte su equipo 3G, presione botón derecho sobre el ícono de network-manager, seleccione “Activar Banda Ancha Móvil” y luego, seleccione la opción de su proveedor.

Y listo!.

Bluetooth

Instalamos:

aptitude install bluez-util blueman bluez-firmware

Para habilitar el dispositivo bluetooth ejecutamos:

echo 1 > /sys/class/rfkill/rfkill1/state

Para gestionar (y probar) nuestro dispositivo bluetooth.

Compiz

Los conocidos efectos gráficos de escritorio, se instalan con los siguientes paquetes:

aptitude install compiz compiz-fusion fusion-icon \
compiz-fusion-plugins-main compiz-fusion-plugins-unsupported \
compiz-fusion-bcop compiz-fusion-plugins-extra \
compizconfig-backend-gconf compizconfig-settings-manager

Nota: fusion-icon es la aplicación que permite cargar Compiz desde la bandeja de sistema.

Cargamos “fusion-icon” entre las aplicaciones en Sistema > Preferencias > “Aplicaciones al inicio”

Nota: si no vemos las barras de titulo y bordes de nuestras ventanas, en el Compiz-Manager habilitar “Decoraciones de ventanas”.

Prelink, Preload, Readahead

Prelink, preload y readahead, insserv, son 4 aplicaciones que mejoran notablemente el performance general del equipo:

Prelink: Modifica las librerías, para que carguen más rápido (pre-binding)

Preload: Carga en RAM las aplicaciones y librerías más usadas, para un inicio más rápido.

Readahead-Fedora,Insserv: Re-organizan los servicios para mejorar el arranque inicial del equipo.

Instalamos:

aptitude install prelink preload readahead-fedora insserv

Editamos:

vim.tiny /etc/default/readahead-fedora

Cambiamos:

# enable readahead at system startup
READAHEAD=”yes”

Y modificamos el IO:

IO_PRIORITY=”real-time”

Editamos:

vim.tiny /etc/default/prelink

Modificamos:

PRELINKING=yes

Luego, ejecutamos:

prelink --all

Para que haga un análisis de todos los ejecutables y librerías (puede tardar unos minutos).

Luego, editamos:

vim.tiny /etc/init.d/rc

Y cambiamos el nivel de concurrency a:

CONCURRENCY=makefile

Número de Terminales

Cada terminal virtual consume recursos (las TTY virtuales están asignadas en CTRL+ALT+F1 al F6), pero por lo general, en equipos de este tipo, uno no está cargando terminales virtuales, así que las limitaremos solo a 2 (F1 y F2); para ello:

Abrimos el archivo:

vim.tiny /etc/inittab

Y cambiamos de esto:

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

A esto:

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

Comentando las consolas del 3 al 6.

Reiniciamos por última vez para verificar que todo funciona correctamente.

Conclusiones

Es interesante explorar las capacidades de estos equipos, inicialmente dudaba de las propias capacidades de los equipos Canaima Magallanes, pero GNU/Linux ha demostrado que funciona bien (muy bien) en equipos de esta gama (mini-laptops, netbooks, etc).

Disfruten de un equipo optimizado y acelerado.

[Linux] El parche milagroso de Mike Galbraith en acción

En la página de Phoronix esta mañana leí un artículo sobre un “fascinante parche” para el kernel Linux que permite agregar “grupos de tareas” para una mejor respuesta del kernel ante eventos, haciendo que aplicaciones de escritorio sean agrupadas por TTY aumentando la interactividad del escritorio en alta carga.

La noticia fué replicada por la gente de muyLinux bajo el nombre de “El milagro de las 200 líneas de código” …

El parche …

Este parche fué creado por Mike Galbraith, un eterno colaborador del Kernel Linux (nick: efault) y su finalidad principal es otorgar la posibilidad de “agrupar tareas” en las TTY para que el CPU pueda “procesar en lote” todo ese grupo de tareas de una manera más rápida, aprovechando el procesamiento “en paralelo” *casí* todas las tareas relativas al uso de escritorio (sobre todo en el rendering de video) se ven beneficiadas.

¿Cómo funciona?

Cuando una tarea se ejecuta, esta genera un “GROUP” de manera automática donde todos los childs (hijos) comparten el “task group” y este un único tty. El parche de hecho es una “prueba de concepto” de una idea que Linus Torvalds había propuesto sobre el comportamiento de los task groups y queda abierta a mejoras de todo tipo.

Para ser una prueba de concepto (sólo 200 líneas de código) se desempeña bastante bien.

¿Dónde y cómo implementarlo?

El parche aún se encuentra en pruebas y no ha sido empaquetado en ningún lado, se encuentra como respuesta a un correo de discusión de Linus Torvalds acá, y sólo puede ser implementado en kernels donde la gestión de carga de trabajo de las TTY existe (> 2.6.37), yo he descargado y copiado el parche acá:

http://anyhub.net/file/W_n-rfc-rft-v3-sched-automated-per-tty-task-groups.patch.tar.bz2

De donde lo pueden bajar limpio y sin inconvenientes.

He descargado el kernel 2.6.37-rc2 de la página de kernel.org, lo descomprimo para compilarlo “de la manera habitual”, sin embargo:

Ejecutamos:

make mrproper

Y la copia de las opciones “por defecto”

make oldconfig

Ahora aplicaremos el kernel, para ello lo descomprimimos en la raíz de /usr/src, nos movemos a la carpeta del kernel:

cd linux-2.6.37-rc2/

Y ejecutamos el parche:

patch -p1 --dry-run < ../RFC-RFT-v3-sched-automated-per-tty-task-groups.patch

Opciones habilitadas en el Kernel:

Ejecutando make menuconfig o make gconfig (si están en gnome) activaremos las siguientes opciones del Kernel Linux:

En “General Setup”:

Kernel compression mode:
LZO (el más rápido en descomprimir)

Para que el kernel se descomprima rápidamente pueden activar el modo de compresión LZO, pero requieren instalar el siguiente paquete:

aptitude install lzop
Enable Block Layer > IO Schedulers > CFQ I/O Scheduler > CONFIG_CFQ_GROUP_IOSCHED

Esto habilita el I/O scheduler por grupos (CFQ_GROUP_IOSCHED)

Control Group Support (CONFIG_CGROUPS):
Namespace cgroup subsystemFreezer cgroup subsystemDevice Controller for cgroups
CPUset support > include legacy

Precisamente la opción que incorpora el parche, los CGROUPS y su control.

Resource counters > Memory Resource controller > MRC for Swap Extension
Group CPU Scheduler (CONFIG_CGROUP_SCHED)
Group Scheduling for SCHED_OTHER
Group Scheduling for SCHED_RR/FIFO

Con esto, habilitamos todos los tipos de sheduler basado en grupos.

Block IO Controller
Default I/O scheduler
CFQ

Opciones que colaboran con el parche.

Processor type and features > Preemption Model > Preemptible Kernel (low-latency desktop)

Requerido, para que podamos contar con un kernel Preemtivo. (de baja latencia).

MTRR support > MTRR Cleanup support
Timer Frequency > 1000 Hz

Otras opciones que colaboran con el performance del kernel Linux.

Compilando

Compilamos de la manera usual:

  • make all
  • make modules
  • make modules install
  • make install
  • mkinitramfs -o /boot/initrd.img-2.6.37-rc2-amd64 /lib/modules/2.6.37-rc2-amd64

Y actualizamos nuestro grub para que agregue la entrada del kernel:

update-grub2

y Listo, ahora, a probar el kernel.

Pruebas

Aun cuando hay pruebas más especializadas (como el interbench diseñado por Con Kolivas) yo he hecho una simple prueba (repetible por cualquiera) y que demuestra los beneficios directos del tunning; en este caso, he comprobado con 3 Kernel Linux y diversos modos.

Como nota adicional, mi equipo es:

Linux lexotanil 2.6.37-rc2amd64 #2 SMP PREEMPT Tue Nov 16 16:32:42 VET 2010 x86_64 GNU/Linux

Es un Debian Squeeze, tiene servicios cargados (openldap, postgresql, mysql) y utilidades de escritorio (compiz-fusion, gnome-applets, metacity como gestor, rendering habilitado según guía en este mismo blog) por lo que este parche *podría* en teoría, ser muchisimo más beneficioso para gente con equipos basados en distribuciones Desktop (Ubuntu, Trisquel), que mi equipo que es un servidor, sin embargo, el incremento de rendimiento fue brutal!.

A este equipo se le han realizado los siguientes cambios, con el fin de mejorar su performance:

En la primera prueba, se probó en un Kernel “genérico Debian” sin ninguna modificación al equipo:

Kernel genérico, sin 3D ni MTRR:

glxgears -info
GL_RENDERER   = Software Rasterizer
GL_VERSION    = 2.1 Mesa 7.7.1
GL_VENDOR     = Mesa Project
1494 frames in 5.0 seconds = 298.796 FPS
1582 frames in 5.0 seconds = 316.213 FPS
1616 frames in 5.0 seconds = 323.090 FPS

Los tiempos en promedio, son unos 300 FPS.

Kernel genérico, sin aceleración 3D (pero corrección MTRR activa):

glxgears -info
GL_RENDERER   = Software Rasterizer
GL_VERSION    = 2.1 Mesa 7.7.1
GL_VENDOR     = Mesa Project
2277 frames in 5.0 seconds = 455.288FPS
2314 frames in 5.0 seconds = 462.779 FPS
2251 frames in 5.0 seconds = 450.191 FPS

Mismo kernel, pero con el MTRR corregido (mejora del 10%).

Con aceleración 3D, sin parche de Mike:
glxgears -info
GL_RENDERER   = Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4
GL_VERSION    = 2.1 Mesa 7.7.1
GL_VENDOR     = Tungsten Graphics, Inc
3618 frames in 5.0 seconds = 723.600 FPS
3448 frames in 5.0 seconds = 689.600 FPS
3511 frames in 5.0 seconds = 702.200 FPS

Con 3D y MTRR corregido, el rendimiento en el kernel “genérico” es notable (promedio: 700 FPS).

Kernel con parche realtime (RT Linux): 2.6.33.7-rt29-amd64

GL_RENDERER   = Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4
GL_VERSION    = 2.1 Mesa 7.7.1
GL_VENDOR     = Tungsten Graphics, Inc
3418 frames in 5.0 seconds = 683.600 FPS
3483 frames in 5.0 seconds = 696.600 FPS
3498 frames in 5.0 seconds = 699.460 FPS

Este Kernel (2.6.33-7 con parche RT de RT-Linux) lo uso para transmitir por radioGNU en modo tiempo-real.

Parche de Mike Galbraith; Kernel 2.6.37-rc2-amd64 con parche:

glxgears -info
GL_RENDERER   = Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4
GL_VERSION    = 2.1 Mesa 7.7.1
GL_VENDOR     = Tungsten Graphics, Inc
5707 frames in 5.0 seconds = 1141.172 FPS
6153 frames in 5.0 seconds = 1230.600 FPS
6280 frames in 5.0 seconds = 1255.749 FPS

Como vemos, este parche incrementa en más del 70% la respuesta del Kernel a eventos como dibujado de pantalla, scroll, renderizado de video, etc.

Un screenshot acá:

En el screenshot se ve:

  • Chromium browser: con un video de youtube y otro con el FishIE Tank de HTML5
  • Firefox con unas 15 pestañas abiertas
  • Icedove con mis 3 buzones IMAP abiertos
  • GLXGears
  • Mplayer mostrando otro video
  • Una consola de gnome-terminal con 5 pestañas
  • un editor de texto (mi bitácora)
  • Gnome con Compiz-Fusion activado
  • Varias ventanas de nautilus

Como verán, la respuesta del kernel nunca fué poner el CPU en on-demand (1.6 Ghz) no fué necesario, ya que la carga paralelizada en Debian hizo que el CPU nunca llegara a más del 90% de su carga.

Nota: no hagan caso de la temperatura, vivo en la ciudad de Barquisimeto y hoy fué un día extremadamente caluroso (por encima de 32 grados centígrados). =P

Conclusiones

Hice pruebas y benchmarks también con el interbench de Con Kolivas, que aunque confirman los resultados acá expuestos, sería muy largo explicar el test cuando un glxgears reportaría iguales resultados (una mejora notable en la respuesta del equipo).

Espero hagan sus propias pruebas y permitan dar por sentado que este parche representa el futuro del alto rendimiento en Linux PREEMPT para usuarios comunes y corrientes de escritorio.

[weyu] Actualización bitácora openLDAP para Debian Squeeze (y similares)

He incorporado las últimas modificaciones de mis bitácoras acerca de como instalar y configurar openLDAP 2.4 en GNU/Linux Debian Squeeze utilizando backend dinámico(cn=config) en la sección del Wiki de GNU dedicado a openLDAP:

http://phenobarbital.gnu.org.ve/doku.php/weyu:openldap

Hay capítulos especiales sobre:

  • indexación y búsquedas
  • overlays y backends
  • Seguridad
  • Replicación

Y no faltaban algunos consejos (que se irán extendiendo) sobre árboles DIT (Directory Information Tree).

Luego incluiré (como parte de la documentación del proyecto Weyú) una sección completa sobre optimización de servidores openLDAP.

Está abierta a comentarios, críticas y sobre todo a ampliaciones para hacerla más funcional y útil para todos.

Gnome Dia: creando un set de iconos personalizado para diagramar

Preámbulo

Gnome Dia, es una aplicación de diseño, orientada a esquemas y diagramas, es una de las herramientas que a primera vista parecen “sencillas” pero llega a ser tan poderosa que incluso tiene interpretadores de diagramas ER a bases de datos y diagramas de objetos a código funcional en C++ o PHP, Python.

Como vemos la descripción de la Wikipedia, es un “sustituto” de Microsoft Visio u otros modeladores de diagramas y esquemas y en muchos casos sobrepasa en las capacidades a otros diagramadores comerciales. Es parte del proyecto Gnome.

Los Set de iconos en Gnome Dia

Dia tiene una enorme cantidad de iconos para diversas actividades, desde redes, pasando por ingeniería eléctrica o electrónica, hasta diagramas de flujo o Entidad-Relación, se pueden encontrar páginas para descargar otros sets, etc.

Gnome tiene muy buenos set de íconos, aunque algunos de ellos son tan simplistas, que contrastan con los hechos por herramientas comerciales como Visio, pero, ¿podemos cambiar eso?.

En la mayoría de los casos, la ingeniería reversa, las capacidades de generar código y demás, quedan “opacadas” porque la gente en busca de “eyecandy” se encuentran con unos iconos horrendos para representar las cosas por lo que terminan usando herramientas o propietarias o diseñandolos gráficamente en Inkscape.

Pero eso se acabó, aprenderemos a hacer nuestros propios íconos!

¿Cómo son los Set de Iconos en Gnome Dia?

Cada ícono en DIA es una SHAPE que realmente es una figura SVG (versión 1.0, importante decir esto) diseñable en Inkscape, con algunos cambios como por ejemplo:

  • Cada SHAPE es un XML que “contiene” dentro al SVG
  • Cada SHAPE declara su nombre, su icono (para representarlo en la paleta de herramientas) y sus puntos de conexión (por donde las líneas se unirán al objeto para unirse a otros objetos).

Todas las SHAPES son agrupadas en una “sheet” (hoja) que representa el set completo de shapes (iconos) y le dice a DIA cuales debe cargar. el archivo SHEET también es un XML bastante simple.

¿Como se crea el archivo SHEET?

Cada SHEET es un archivo XML con un namespace específico (de Dia, el dia-sheet-ns) y posee la siguiente estructura:

<?xml version="1.0" encoding="UTF-8"?>
<sheet xmlns="http://www.lysator.liu.se/~alla/dia/dia-sheet-ns">
<name>Pheno-Icons</name>
<created_by>Jesus Lara - jesuslarag@gmail.com</created_by>
<description>Collection of SVG icons convert to Gnome Dia</description>
<contents>

Donde:

NAME: es el nombre que presentará nuestro set de iconos dentro de la paleta de herramientas de DIA

DESCRIPTION: Contiene una descripción informativa del set

CONTENTS: Contendrá la definición de cada icono

Los íconos se definen de la siguiente manera:

<object name="internet">
<description>Internet Cloud</description>
</object>

Donde:

name: Es el nombre del ícono (como se llama el archivo en el filesystem, la regla es que se llame {name}.shape para el icono y {name}.png al botón que lo representará en la barra de herramientas.

El archivo sheet que generemos debe estar guardado en el directorio de sheets de DIA, esto es en:

/usr/share/dia/sheets

¿Cómo son las SHAPES en DIA?

Una SHAPE representa un ícono, es un XML con “al menos” dos namespaces, uno representa la forma SVG (imagen) y otro es la metadata informativa para DIA. Se guardan en Linux con extensión “.shape” y deben ir en una carpeta llamada “exactamente igual” que el nombre del set de iconos (sheet) en la siguiente ruta:

/usr/share/dia/shapes/{nombre del sheet}/

El XML que lo representa tiene la siguiente forma:

<?xml version="1.0"?>
<shape xmlns="http://www.daa.com.au/~james/dia-shape-ns" xmlns:svg="http://www.w3.org/2000/svg" xmlns:math="http://exslt.org/math" xmlns:dia="http://www.daa.com.au/~james/dia-shape-ns" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
  <name>Printer</name>
  <icon>Printer</icon>
  <connections>
	<point x="0" y="0"/>
	<point x="0" y="21"/>
	<point x="41" y="41"/>
	<point x="20.5" y="21" main="yes"/>
  </connections>
  <textbox align="center" resize="no" x1="105.20242" y1="619.06097" x2="107.20242" y2="621.06097"/>
  <aspectratio type="fixed"/>
  <svg:svg version="1.1" width="100.603" height="118.54186" id="svg2"></svg:svg>
</shape> 

Donde:

<shape>: representa el nodo raíz del XML de la forma

<name>: representa el nombre del ícono, como está en el sistema operativo (name.shape)

<icon>: representa el ícono (formato png, 22×22 pixeles) que mostrará esta shape en la barra de herramientas

<connections>: representa los nodos (x,y) de cada “punto” donde esta shape se conectará a otras vía flechas, líneas u otros conectores, por defecto es en el centro, aunque la coordenada (0,0) representa la esquina superior izquierda del ícono.

<textbox>: la shape puede tener una (o más) área de texto donde escribir información, esa área de texto posee alineación de texto y posición X1, Y1 (parte superior) y X2, Y2 (parte inferior).

<aspect_ratio>: significa si el ícono pierde su proporción al ser escalado, si aspect_ratio = fixed, este no perderá su proporción (alto y ancho), si aspect_ratio = flow (o simplemente no se declara) entonces se podrá cambiar el alto y ancho a voluntad.

<svg:svg>: es el nodo raíz del gráfico SVG, nótese bien que viene en la forma de nodo:namespace, como sucede cuándo mezclas más de una sintáxis XML.

Como nota informativa, el tamaño “por defecto” de una shape, si no se especifica en SVG, es en píxeles, aunque podría usar cualquiera de las siguientes unidades de medida:

  • centímentros (cm)
  • Puntos (pt)
  • Pulgadas (inch)
  • Pixeles (px)

Ideas para un buen ícono para DIA

NO NECESARIAMENTE se puede llevar directamente un ícono de SVG (Inkscape, por ejemplo) a DIA, DIA solo reconoce una parte del sub-set de SVG 1.0; por lo que no todas las formas son “renderizadas” en DIA, esto como parte de simplificar tanto el tamaño como el renderizado de diagramas complejos, entre algunos consejos se cuenta:

  • Cuando creen un icono en Inkscape apagar la opcion:

Archivo > Preferencias de Inkscape > Salida SVG > usar Colores por nombre; Esto es porque Dia no reconoce colores por nombre (ejemplo: black) sino unicamente por valor hexa (#000000)

  • No debe tener capas (los “grupos” o layers en DIA no son reconocidos)
  • No usar gradientes en las formas, ni para los bordes ni para el relleno, si necesita un gradiente “emúlelo” con muchas formas separadas de colores en degradado.
  • nunca usar “STROKE” o bordeado de una figura, si necesitas un borde, usa otra forma mas grande, o rectangulos rellenos para simular líneas.
  • NO USAR LINEAS, si requiere líneas, use cuadrados (paths) rellenos muy finos.
  • No usar cuadrados con bordes redondeados (conviertalos a trayectos)
  • Convierte todas las formas a trayectos (sobre todo los circulos y cuadrados redondeados)
  • Si hay grupos de formas, desagruparlas, DIA no trabaja bien con grupos
  • Simplifique los vectores, aunque queremos “vistosidad” recordemos que a final de cuentas es un diagrama “serio” y DIA tardaría muchísimo en renderizar SVG muy complejos.

Si ya tenemos esto claro, podemos hacer un ícono.

Creando un ícono para DIA

  1. Abrimos Inkscape
  2. Creamos un documento nuevo … > No layers (sin capas)
  3. En Archivo > Propiedades del documento: redimensione el ícono para que sea “al menos” 50×55 pixeles, más grande es innecesario para DIA (recuerde, es un SVG, NUNCA perderá definición por muy grande o pequeño que lo pongan).
  4. Creen el ícono como indican los consejos arriba
  5. Tomen alguna de las figuras, y en el menú OBJETO > Propiedades del Objeto … le colocarán un “ID”, esta figura se llamará “nombre”, en etiqueta pondrán “#nombre” y en title pondrán el nombre que quieren que lleve este ícono.
  6. Este nombre, deberá ser único en TODO DIA así que preferentemente sea de la forma “set de iconos” – “nombre del icono”, para asi evitar confusión.
  7. En lo que hayan terminado se verá así:

Guarden y cierren el Inkscape.

Convirtiendo este SVG a Shape

Inicialmente, debemos “convertir” el SVG “de Inkscape” en un SVG “plano” sin más etiquetas XML que las oficiales, aunque en el propio InkScape podemos decir en “Archivo > Guardar como … > SVG plano“, yo lo he hecho por la consola:

inkscape printer.svg --export-plain-svg=printer1.svg

Esto genera a partir de printer.svg un archivo llamado printer1.svg que es una versión “plain” del SVG.

No he encontrado una “forma” de convertir a SVG a DIA, la única que encontré es de Thiago Ribeiro de Gnome, en la cual habla que “se hizo” un script en PHP que transforma (me imagino usando DOM) el archivo SVG a SHAPE, pero dicho script no lo he encontrado en ningún lado.

Yo he usado XSLT (Xtensible Style Sheet Transformations), una forma de transformar archivos XML de un formato a otro (incluso a otros formatos no-XML), con XSLT transformo el SVG en un SHAPE y leo la capa “#nombre” para darle nombre al ícono, es automática y simplemente pide el nombre del archivo.

Para hacer la transformación en consola, he usado XSLTPROC, que es un procesador XSLT 1.0 que viene nativo en todas las distribuciones de GNU/Linux.

Se ejecuta así:

xsltproc -o {nombre icono}.shape svg2dia.xslt {archivo.svg}

La hoja de transformación XSLT pueden descargarla de acá SVG2DIA.XSLT y es GPL v.3

TODO:

  • La hoja debería computar el alto, ancho y centro del ícono, para así computar “al vuelo” los conectores
  • Debería computar “de alguna parte” la posición del textbox, para personalizarlo de manera sencilla

Posteriormente, tenemos que crear el ícono PNG (22×22) a partir del SVG, eso también es fácil usando inkscape en la consola:

inkscape -h 22 -w 22 --export-png=printer.png printer.svg

Esto genera un ícono PNG de 22px por 22px a partir del archivo printer.svg

Cuándo ambos archivos (el .shape y el .png) están listos, los copiamos en el directorio de shapes de nuestro set de íconos (o lo agregamos a un set existente editando el archivo .sheet), agregamos la shape al archivo .sheet y verificamos que funciona en Gnome Dia.

Gnome Dia:

Simplemente abrimos Dia (Gráficos > editor de Diagramas), si nuestro set de iconos está bien y fué reconocido, lo encontraremos en la lista:

Desplegamos la lista, lo buscamos y veremos todos los iconos creados en la barra de herramientas, ya solo nos queda probar los íconos y hacerlos interactuar con otros íconos en un diagrama, he acá un ejemplo:

Automatizando el proceso:

Si ya tenemos todos los íconos SVG para crear las shapes, en el archivo comprimido encontrarán un script bash “muy simple” que simplemente toma todos los SVG de un directorio, los convierte a shapes y genera el icono PNG respectivo.

Así, solamente faltaría que te creara la carpeta del set de iconos y te generara el archivo .sheet!

Pero pronto, pronto!

Conclusiones

Podemos ampliar las capacidades de Gnome Dia simplemente con agregar nuevos íconos para nuestras necesidades de diagramación, también recordemos que Dia tiene módulos que se le pueden adaptar (en python) como por ejemplo dia2code, que genera código (perl, Python, PHP, C++) a partir de la definición de objetos, asi que las capacidades de DIA son ilimitadas!.

Disfruten su nuevo set de íconos!

[python] usando gammu para enviar SMS

Continuando con el artículo “Enviando SMS usando bluetooth, un celular GSM y python”, voy a mostrar el uso de un toolkit bastante interesante para hacer más cosas con nuestro celular.

Gammu/gWammu es un proyecto que se ha fijado como meta manejar toda la información  de tu celular, cuando este está conectado a tu PC, sea via bluetooth o vía modem (USB, rs-232, etc).

Instalación:

En Debian y derivados es de lo más fácil:

aptitude install gammu gammu-smsd python-gammu

El primero es la aplicación GTK+ (fork de gnokii) para conectar celulares (no solo nokia como en gnokii) y administrar datos, contactos, etc.

La “phone database” es un compendio de todos los teléfonos donde ha sido probado gammu (si logras probar en algún otro, agrégalo como contribución.

Conectándose con Python

Para conectarnos a el teléfono, tenemos primero que configurarlo:

Para ello, creamos un archivo (por defecto, .gammurc  en la raíz del usuario):

[gammu]
port = 00:25:47:BC:8B:7F
connection = blueat

Pueden instalar wammu, y aprovechan el asistente de conexión a teléfonos, para que este descubra el tipo más válido de conexión para el suyo.

En mi caso, ha servido at115200 (USB) Para mi Motorola Rokr E8, para Nokia 5800 XpressMusic, aún no soporta comunicación para SMS.

Luego de conectados al teléfono (por USB, bluetooth), ejecutamos el script:

#!/usr/bin/env python
# Ejemplo de como enviar SMS usando gammu y python

import gammu
import sys

# crea un objeto stateMachine, para hablar con el telefono
sm = gammu.StateMachine()

# Leer la configuracion desde (~/.gammurc)
sm.ReadConfig()

# Iniciamos la conexión con el telefono
sm.Init()

# Preparamos el paquete de mensaje SMS
# SMSC es un numero que se puede obtener interrogando el telefono
message = {
 'Text': 'test SMS',
 'SMSC': {'Location': +584264568828},
 'Number': '+584264568828',
}

# Enviar el mensaje
sm.SendSMS(message)

Usando wammu

Para los que no deseen conectarse programáticamente, sino simplemente deseen conectarse a su teléfono, respaldar contactos o agenda, sms, enviar y recibir sms y demás, pueden usar la interfaz gráfica de gammu, llamada wammu; para instalarla:

aptitude install wammu

Con wammu (y dependiendo de marca, modelo, serie del sistema operativo, etc) podrán hacer “más o menos cosas”, cada vez están agregando más dispositivos a la “phone database”, en mi caso, el Nokia 5800 XpressMusic aún no dialoga muy bien con wammu (pero puedes aún enviar SMS usando py-bluez).

Instalando Debian Squeeze en una Lemote Yeeloong netbook

La lemote Yeeloong China:

Es un equipo Chino basado enteramente en especificaciones abiertas, usando un microprocesador de arquitectura MIPS-sel llamado Loongson-2F.

El equipo está diseñado para correr sistemas operativos libres como Linux, ya que ninguno de los dispositivos de hardware que lo componen requiere binarios privativos para su uso.

Ya mucha gente ha logrado correr varias versiones de Linux:

Una Linux Lemote con GNU/Linux Canaima cortesía de Nerissa Aguilera

Correr un Linux inestable (ejemplo, un Debian Squeeze) es ya otra historia.

Estoy colocando en mi Wiki HOWTO para varias versiones de Linux:

  • GNU/Linux Debian Squeeze (testing)
  • GNU/Linux Canaima (venezolana)
  • Google Android
  • FSF GNU gNewSense

Así como cualquier otra distro que podamos montar usando arquitectura MIPSEL; además agrego una sección de trucos para la Lemote Yeeloong, espero les guste y tengan comentarios para mejorar esta ayuda.

El enlace al Wiki acá: http://phenobarbital.gnu.org.ve/doku.php/linux:lemote

A %d blogueros les gusta esto: