La Aventura de Ruby on Rails (Parte 1): El inicio

viernes, diciembre 26, 2008

Este post es el inicio de una serie en la que pretendo ilustrar mis experiencias e impresiones en el mundo de Ruby on Rails. Debo decir que al momento de escribir esto conozco realmente poco (por no decir nada) sobre Ruby, Rails y afines, así que empezaré desde cero. Vamos con un poco de teoría

  • ¿Qué es Ruby?
    Ruby es un lenguaje de programación interpretado, reflexivo y orientado a objetos, creado por el programador japonés Yukihiro Matsumoto y distribuido bajo licencias libres. Combina una sintaxis inspirada en Python y Perl, con características de programación orientada a objetos similares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU

  • ¿Qué es Ruby on Rails?
    Ruby on Rails (RoR o Rails) es un entorno de desarrollo web de código abierto escrito en Ruby y optimizado para satisfacción de los programadores y de la productividad. Te permite escribir aplicaciones web siguiendo el paradigma de la arquitectura Modelo Vista Controlador (MVC) y su filosofía principal es: Favorecer la convención antes que la configuración

  • ¿Qué son las Gemas de Ruby o Ruby Gems?
    Las Gemas son paquetes autocontenidos utilizados por Ruby oficialmente para distribuir librerías y aplicaciones. Son empleadas por Rails para la instalación de su entorno

  • ¿En qué consiste la arquitectura MVC?
    En pocas palabras podemos decir que la arquitectura MVC separa una aplicación en 3 capas: el Modelo, la Vista y el Controlador. El Modelo trabaja directamente con las fuentes de datos (bases de datos, sockets, etc) y es el encargado de la integridad de la información. La Vista es la interfaz que usará la aplicación para interactuar con el usuario y la que se usará para mostrar los datos del modelo. La Vista debe ser "tonta" en el sentido de que no debe tener conocimiento alguno sobre las fuentes de datos, los eventos u otros, solo debe mostrar la información que se le indique. Por último, el controlador es quien maneja los eventos de la aplicación, digamos que es la "pega" entre el Modelo y la Vista; puede interactuar con las funciones del modelo y envía información a la Vista.

Dicho esto empecemos con la instalación del ambiente Ruby on Rails. Las siguientes instrucciones están hechas para Debian Lenny 5.0 e instalarán Ruby 1.8 y Rails 1.2.6.

Instalamos Ruby y todos los paquetes necesarios (como super usuario):
# aptitude update
# aptitude install build-essential ruby ruby1.8-dev ri ri1.8 rdoc rdoc1.8 irb irb1.8 ruby1.8-examples libreadline-ruby libopenssl-ruby libdbi-ruby libdbd-mysql-ruby libdbd-pg-ruby libdbd-odbc-ruby libdbd-sqlite3-ruby libpgsql-ruby libmysql-ruby mysql-server mysql-client


Descargamos los paquetes necesarios para Ruby si no los tenemos (ver la página de RubyForge para más información):
$ wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
$ wget http://rubyforge.org/frs/download.php/26547/activesupport-1.4.4.gem
$ wget http://rubyforge.org/frs/download.php/28328/actionpack-1.13.6.gem
$ wget http://rubyforge.org/frs/download.php/28331/actionmailer-1.3.6.gem
$ wget http://rubyforge.org/frs/download.php/28325/activerecord-1.15.6.gem
$ wget http://rubyforge.org/frs/download.php/28334/actionwebservice-1.2.6.gem
$ wget http://rubyforge.org/frs/download.php/19878/rake-0.7.3.gem
$ wget http://rubyforge.org/frs/download.php/28337/rails-1.2.6.gem


Instalamos el manejador de paquetes de Ruby (RubyGems):
# tar -xvzf rubygems-1.2.0.tgz
# cd rubygems-1.2.0
# ruby setup.rb
# ln -s /usr/bin/gem1.8 /usr/bin/gem


Y por último instalamos las gemas que acabamos de descargar:
# gem install activesupport-1.4.4.gem
# gem install actionpack-1.13.6.gem
# gem install actionmailer-1.3.6.gem
# gem install activerecord-1.15.6.gem
# gem install actionwebservice-1.2.6.gem
# gem install rake-0.7.3.gem
# gem install rails-1.2.6.gem


Es importante destacar que se deben instalar las versiones tal cual como aparecen aquí y en el mismo orden pues son las que funcionan correctamente entre sí.

Para comprobar que todo ha ido bien basta con hacer:
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
$ rails --version
Rails 1.2.6


Con esto ya podemos empezar a crear aplicaciones en Rails :D pero dejaremos esa parte para la próxima entrega.

Acá dejaré un script que se puede utilizar para instalar Ruby on Rails al toque, solo basta ejecutarlo como super usuario y él se encargará de hacer el resto ;)
#!/bin/bash
#===================================================
#
# ruby_instalacion.sh - Script en bash que permite instalar Ruby On Rails
# al vuelo
#
# Copyright (C) 2008: Wil Alvarez
#
#===================================================

# Instalar Ruby
aptitude update
aptitude install -y build-essential ruby ruby1.8-dev ri ri1.8 rdoc rdoc1.8 irb irb1.8 ruby1.8-examples libreadline-ruby libopenssl-ruby libdbi-ruby libdbd-mysql-ruby libdbd-pg-ruby libdbd-odbc-ruby libdbd-sqlite3-ruby libpgsql-ruby libmysql-ruby

# Instalar RubyGems
wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
tar -xvzf rubygems-1.2.0.tgz
cd rubygems-1.2.0
ruby setup.rb
GEM=/usr/bin/gem
if [ -n $GEM ]; then
rm -f /usr/bin/gem
fi
ln -s /usr/bin/gem1.8 /usr/bin/gem
cd ..
rm -rf rubygems-1.2.0/

# Instalar Rails
wget http://rubyforge.org/frs/download.php/26547/activesupport-1.4.4.gem
wget http://rubyforge.org/frs/download.php/28328/actionpack-1.13.6.gem
wget http://rubyforge.org/frs/download.php/28331/actionmailer-1.3.6.gem
wget http://rubyforge.org/frs/download.php/28325/activerecord-1.15.6.gem
wget http://rubyforge.org/frs/download.php/28334/actionwebservice-1.2.6.gem
wget http://rubyforge.org/frs/download.php/19878/rake-0.7.3.gem
wget http://rubyforge.org/frs/download.php/28337/rails-1.2.6.gem

gem install activesupport-1.4.4.gem
gem install actionpack-1.13.6.gem
gem install actionmailer-1.3.6.gem
gem install activerecord-1.15.6.gem
gem install actionwebservice-1.2.6.gem
gem install rake-0.7.3.gem
gem install rails-1.2.6.gem

rm activesupport-1.4.4.gem actionpack-1.13.6.gem actionmailer-1.3.6.gem activerecord-1.15.6.gem actionwebservice-1.2.6.gem rake-0.7.3.gem rails-1.2.6.gem


Primera Cayapa Tećnica de Canaima 2.0

Los días 05 y 06 de diciembre del presente año (2008 por si acaso :p) se celebró en la Península de Paraguaná el primer BSP (Bug Squash Party) sobre la distribución venezolana GNU/Linux Canaima 2.0; evento que fue bautizado como Cayapa Técnica. Para aquellos que no sean de Venezuela o no conozcan el significado, "Cayapa" es el nombre que le dan los campesinos venezolanos al trabajo mancomunado, realizado de manera cooperativa. Así que de ahí sale el nombre tan original ;)

La planta Venezolana de Industria Tecnológica (VIT) fue la sede anfitriona de tan importante evento al cual tuve la suerte ser invitado como miembro de la Comunidad de Software Libre y donde tuve el honor de compartir con otros compañeros de la comunidad y de instituciones gubernamentales como el Centro Nacional de Tecnologías de Información (CNTI), la Fundación para el Desarrollo de la Ciencia y la Tecnología (FUNDACITE) y el Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL), entre otros.

De más está decir que el evento fue netamente técnico (claro, con sus respectivos ratos de recreación y curda... ejmmm... perdón ocio xD) centrado en la búsqueda y resolución de errores en el proyecto Canaima. El equipo se dividió en 2 grupos; uno orientado a la parte técnica de la distribución y otro a la plataforma colaborativa. Al final de la jornada se reportaron 36 fallas y sugerencias sobre el sistema y la plataforma colaborativa, así como algunas ideas para su futura corrección.

El evento también sirvió para realizar pruebas de funcionamiento del sistema operativo sobre los equipos de escritorio y portátiles de VIT, por lo que se espera que para el 2009 estos equipos ya vengan con Canaima 2.0 pre-instalado y corriendo de la mejor manera posible.

A continuación dejo un álbum con unas pocas fotos de las instalaciones de la planta de VIT y del grupo de trabajo de la Cayapa :D

Canaima BSP 1

Instalar Compiz Fusion en Debian Lenny

En estos días me dispuse a instalar de nuevo Compiz en mi Debian Lenny y me encontré con la sorpresa de que los repositorios que pululan por ahí en internet ya no estaban disponibles así que decidí hacer una búsqueda y publicar mis resultados. Acá está el enlace del repositorio que encontré y a continuación explico como hacer la instalación.

Compiz Fusion solo funcionará si tienes una tarjeta gráfica con soporte OpenGL y si tienes instalado correctamente el driver de vídeo. Si tu tarjeta gráfica es NVIDIA puedes leer este post para instalar el driver de vídeo correctamente.

Dicho esto, entonces procedamos... Primero agregamos las siguientes líneas a nuestro archivo /etc/apt/sources.list:
deb http://download.tuxfamily.org/osrdebian unstable compiz-fusion-git
deb-src http://download.tuxfamily.org/osrdebian unstable compiz-fusion-git


Agregamos la llave GPG ejecutando en la consola (como super usuario):
# wget http://download.tuxfamily.org/osrdebian/61B8DB62.gpg -O- | apt-key add -

Y actualizamos la lista de paquetes:
# aptitude update

Luego instalamos:
# aptitude install compiz compiz-gnome

Para ejecutarlo basta con correr en la consola:
$ compiz --replace &

Y para configurarlo vamos al menú Sistema->Preferencias->Administrador de Opciones CompizConfig



Si queremos añadirle más funcionalidad al asunto podemos instalar el decorador de ventanas emerald:
# aptitude install emerald emerald-themes

Y entonces ejecutar el compiz con la siguiente instrucción:
$ compiz --replace -c emerald &

Eso nos dará como resultado un escritorio muy cool xD


Montar carpeta compartida de Windows en Debian

jueves, diciembre 18, 2008

Para montar una carpeta compartida de Windows en Debian (o cualquier otra distro GNU/Linux basada en Debian) necesitamos instalar el sistema de archivos smbfs. El smbfs entiende el protocolo SMB/CIFS usado por Windows para el trabajo en grupo y nos permite usar el comando mount para montar dicho recurso compartido como un dispositivo común y corriente.

Instalamos el smbfs:
# aptitude install smbfs

Creamos el directorio en el cual queremos montar la carpeta compartida, por ejemplo /mnt/compartida:
# mkdir /mnt/compartida/

Ahora supongamos que el recurso se encuentra en la ruta //192.168.1.15/carpeta, que el usuario para acceder es usuario y la contraseña 123456. Usando el comando mount nos quedaría algo como:
mount -t smbfs -o username=usuario,password=123456 //192.168.1.15/carpeta /mnt/compartida

A partir de ahora podremos trabajar la información de la carpeta compartida en la ruta /mnt/compartida de forma transparente. Podríamos incluso agregar una línea al archivo /etc/fstab para que el recurso se monte automaticamente cada vez que iniciemos la PC pero lo dejaré como tarea para el lector =D

Cambiar zona horaria en Debian

martes, diciembre 16, 2008

Para ver o configurar la zona horaria establecida en nuestro sistema Debian basta con ejecutar:

# dpkg-reconfigure tzdata

Seleccionamos el Área Geográfica:


Y posteriormente el país:

Editar la configuración de GNOME desde la consola

sábado, noviembre 29, 2008

El escritorio GNOME y muchas aplicaciones utilizan GConf para almacenar las preferencias del usuario y los datos de configuración del sistema en un repositorio central que almacena los valores en forma de pares clave-valor, simplificando la administración de la configuración para los usuarios y administradores del sistema.

GNOME viene con un editor de preferencias llamado GConf Editor. Puede invocarse desde la consola ejecutando el comando:

$ gconf-editor

Desde allí podemos cambiar la mayoría de las preferencia del sistema.

Sin embargo, cuando necesitamos cambiar las preferencias de forma automática (digamos desde un script o algún programa) el editor NO será de gran ayuda. Para ello contamos con la herramienta gconftool. Usarla es realmente simple; mostraré con un ejemplo como hacerlo.

Supongamos que deseamos mostrar en nuestro escritorio el icono de la Papelera de Reciclaje. Desde el GConf Editor podemos ver que la ruta donde se encuentra esta preferencia es /app/nautilus/desktop/ y la clave es trash_icon_visible. Obviamente si la clave está en true se mostrará el icono de la papelera y si está en false no se mostrará.

El comando sería tan sencillo como:

$ gconftool -s --type=bool /apps/nautilus/desktop/trash_icon_visible true
donde:
  • -s indica que la variable será establecida (del inglés set)

  • --type indica el tipo de clave a editar. Hasta ahora he usado string para el texto y bool para los valores booleanos (verdaderos y falsos)

  • Luego se especifica la ruta completa de la clave, en este caso /apps/nautilus/desktop/trash_icon_visible

  • Y por último el valor que le queremos asignar a la clave, en este caso true.

Podemos usar el comando donde y cuando sea necesario para ajustar nuestras preferencias al gusto.

Agregar imágenes de fondo al GRUB

A continuación explicaré cómo agregar imágenes de fondo al GRUB en Debian Lenny.

Instalamos el paquete grub-splashimages:
# aptitude install grub-splashimages
Después de esto quedarán instaladas algunas imágenes de fondo en la ruta /boot/grub/splashimages.

Para colocar una de ellas de fondo basta con ejecutar el siguiente comando:
# ln -s /boot/grub/splashimages/nombre_imagen.xpm.gz splash.xpm.gz
donde nombre_imagen.xpm.gz es el nombre del archivo que queremos colocar como fondo.

Reiniciamos y veremos nuestra flamante imagen de fondo :)

Canaima la distribución GNU/Linux Venezolana

jueves, noviembre 27, 2008


Canaima es una distribución GNU/Linux Venezolana basada en Debian que está siendo desarrollada por el CNTI en conjunto con la comunidad de software libre de Venezuela.

Surge con la finalidad de cubrir las necesidades ofimáticas de los usuarios de la Administración Pública Nacional (APN) y para dar cumplimiento al decreto presidencial Nro. 3.390 sobre el uso de Tecnologías Libres en todos los entes gubernamentales.

Entre las principales características principales de Canaima tenemos:

  • Está desarrollada completamente bajo Software Libre.

  • No está limitada al uso en la APN, sino que puede ser usado por cualquier persona.

  • Es estable y segura, pues está basada en Debian, la cual pasa por una serie de procesos y pruebas rigurosas de calidad.

  • Realizada en Venezuela por talento nacional.

  • Posee una serie de herramientas (ofimáticas, diseño gráfico, planificación de proyectos, bases de datos, gestores de correo electrónico, aplicaciones para llamadas sobre VoIP, entre otros) que hacen de Canaima una distribución realmente completa "Out of the box".

  • Permite la estandarización de los procesos técnicos, de soporte y capacitación a nivel de Tecnologías de la Información

  • Promueve la industria nacional de Software Libre

  • Estimula el acercamiento de los usuarios al Software Libre para su uso personal

  • Brinda soberanía e independencia tecnológica


Hasta ahora Canaima anda sobre ruedas, la gente del CNTI está estimulando la participación de la comunidad en el desarrollo y crecimiento de la misma. La versión actual es la 2.0, se encuentra en perfecto estado de usabilidad y ya se está trabajando en la siguiente publicación.

Puede obtener el DVD de Canaima a través de cualquiera de estos medios:

* Canaima v2.0 i386 (ISO)
* Canaima v2.0 i386 (.jigdo)
* Canaima v2.0 i386 (.torrent)

Estaré al tanto de las novedades al respecto para hacerlas saber por este medio

Cambiar orden de arranque en GRUB2

miércoles, noviembre 26, 2008

GRUB (GRand Unified Bootloader) es un gestor de arranque múltiple que se usa para iniciar dos o más sistemas operativos instalados en un mismo equipo. Es el gestor de arranque usado por la mayoría de las distribuciones GNU/Linux, sin embargo su desarrollo ya no esta activo; solamente se corrigen errores mientras GRUB2 se estabiliza.

GRUB2 es un gestor de arranque derivado de PUPA y constituye la evolución del famoso GRUB. Ha sido reescrito desde cero con la finalidad de corregir todos los errores de GRUB e implementar nuevos esquemas de modularidad y portabilidad.

Los que venimos de GRUB estamos acostumbrados a cambiar todas las opciones de arranque desde el archivo /boot/grub/menu.lst, sin embargo en GRUB2 este archivo no se utiliza. Para cambiar las opciones de arranque (especificamente el orden de arranque) en GRUB2 debemos editar el archivo /etc/default/grub. En la línea:

GRUB_DEFAULT=0
Colocaremos la opción que queremos por defecto al momento de arrancar (0 para la primera opción, 1 para la segunda y así sucesivamente).

Luego ejecutamos (como super usuario):

# update-grub
Ese último comando regenera todos los archivos de configuración del GRUB2 para que los cambios surtan efecto.

Solo queda reiniciar y verificar que todo está en el orden que deseamos :)

Clonar un CD/DVD desde la consola

martes, noviembre 25, 2008

Si tenemos una sola unidad óptica (CD-RW o DVD-RW) y queremos duplicar un disco desde la consola entonces la siguiente receta nos será de mucha utilidad.

Primero colocamos el CD/DVD original (el que se desea duplicar) en la unidad para crear la réplica exacta en nuestro disco duro (es decir una imagen). Para ello necesitamos saber en que dispositivo se encuentra el CD-RW/DVD-RW, eso lo obtenemos con el comando ls:

$ ls /dev/cd*
/dev/cdrom /dev/cdrw

En nuestro caso se encuentra bajo el dispositivo /dev/cdrw.

Ahora con el comando dd realizamos la imagen:

$ dd if=/dev/cdrw of=nombre_imagen.iso
El argumento if nos indica el archivo (o dispositivo) de entrada, mientras que el of se refiere al archivo de salida, en nuestro caso el archivo de imagen .iso.

Luego de unos minutos tendremos un archivo idéntico al CD/DVD (con los mismos pelos y señales) en nuestro disco duro. Ahora para grabarlo en otro disco usaremos el comando wodim. Si no lo tenemos instalado lo hacemos con aptitude:

# aptitude install wodim

Para usar el wodim debemos especificar el nombre del dispositivo grabador. Por alguna extraña razón wodim no emplea la misma terminología para los dispositivos que dd, así que es necesario ejecutar el comando wodim para saber en que dispositivo grabaremos.

$ wodim --devices
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/hdb' rwrw-- : 'TSSTcorp' 'CD/DVDW SH-S182F'
-------------------------------------------------------------------------

Como podemos observar wodim nos arroja que el dispositivo es el /dev/hdb. Con esa información procedemos a grabar. Insertamos entonces un disco en blanco en la unidad y ejecutamos la siguiente orden:

$ wodim -v -fs=128M -eject -dev=/dev/hdb nombre_imagen.iso

Al finalizar podremos disfrutar de una copia exacta de nuestro CD/DVD

Desordenar arreglos en Python

lunes, noviembre 24, 2008

Hace algún tiempo publiqué un pequeño algoritmo para desordenar arreglos en C++. Esta vez escribiré el mismo algoritmo pero en Python; veamos:

import random

arreglo = []

for i in range(44):
arreglo.append(i)

# Esta línea realiza todo el trabajo sucio de desordenar el arreglo y lo
# guarda en la misma variable :D
random.shuffle(arreglo)

Con eso ya tenemos nuestro arreglo desordenado... A lo Python! xD

Ejecutar comandos del shell en Python y capturar su salida

miércoles, noviembre 19, 2008

A veces cuando escribimos un programa necesitamos ejecutar algún comando en la consola y tomar su salida para realizar una acción o tomar una decisión.

La mayoría de los lenguajes de programación incorporan funciones que nos permiten ejecutar órdenes en la consola del sistema operativo y Python no es la excepción. Además lo hace realmente fácil ;)

Para ello haremos uso del módulo subprocess, que a diferencia del os.system() o del os.popen() es mucho más intuitivo y sencillo de usar.

El módulo define una función conveniente llamada call que ejecuta un comando y espera hasta que termine su ejecución. Recibe una gran cantidad de parámetros, pero solo nos interesan el comando a ejecutar, el descriptor de archivo de la salida estándar (stdout) y el descriptor de archivo de la salida de errores (stderr). Estos descriptores son importantes porque allí es donde se almacenará la salida del programa (lo que normalmente imprime en la consola) y los mensajes de error (que también se imprimen en la consola).

El comando debe ser una lista de cádenas de caracteres, el primer elemento a ejecutar es el comando y los elementos siguientes son cada uno de los argumentos que recibe dicho comando. Los descriptores de archivos son eso... vulgares descriptores de archivos :D

Pero es suficiente de preámbulos... Show me the code!

# importamos el módulo
import subprocess

# Creamos los descriptores de archivos como dos vulgares archivos
# con permisos de escritura llamados 'archivo_out' y 'archivo_err'
outfd = open('archivo_out', 'w+')
errfd = open('archivo_err', 'w+')

# Supongamos que queremos ejecutamos el comando: ls -l -a
subprocess.call(['ls', '-l', '-a'], stdout=outfd, stderr=errfd)

# Cerramos los archivos para que se escriban los cambios y se liberen
# los buffers de I/O
outfd.close()
errfd.close()

# Ahora leemos todo lo que tengan los archivos y guardamos en la variable
# output la salida estándar y en err la salida de error.
fd = open('archivo_out', 'r')
output = fd.read()
fd.close()

fd = open('archivo_err', 'r')
err = fd.read()
fd.close()

# Por último mostramos lo que tienen las variables
print 'stdout: %s\n' % output
print 'stderr: %s' % err

Con eso ya podemos ejecutar cualquier comando en la shell usando Python, esperar su salida y además guardarla en una variable para procesarla más adelante

Instalar Enlightenment E17 en Debian Lenny

domingo, noviembre 09, 2008


Para aquellos que no lo conocen, Enlightenment o simplemente E es un gestor de ventanas para Unix y GNU/Linux muy atractivo y con efectos visuales alucinantes.

La DR17 es la versión en desarrollo de Enlightenment pero ofrece una gran estabilidad y una buena integración con el entorno, todo con una arquitectura gráficamente espectacular y flexible. Para más detalles de Enlightenment visita la página oficial

Bueno, ahora a lo que vinimos; en este post explicaré como instalar la versión DR17 (E17) en Debian Lenny.

Primero agregamos los repositorios de desarrollo de Enlightenment a nuestro /etc/apt/sources.list:
deb http://debian.alphagemini.org/ unstable main
deb-src http://debian.alphagemini.org/ unstable main


Luego agregamos la clave gpg ejecutando estas instrucciones en la consola:
# gpg --keyserver pgp.rediris.es --recv-keys 7E5D69A103CA4243
# gpg --armor --export 7E5D69A103CA4243 | apt-key add -


Hacemos una actualización de la lista de paquetes:
# aptitude update

Y por último instalamos el gestor de ventanas:
# aptitude install e17

El resultado está a la vista, las imágenes corresponden a los distintos temas que probé en mi escritorio.









Seguiré jugando con el E17 y postearé cualquier otra novedad que consiga

Instalar impresora HP3745 en Debian Lenny

martes, noviembre 04, 2008

El procedimiento descrito a continuación se realizó para el modelo de impresora HP Deskjet 3745, sin embargo es idéntico para otra gama amplia de modelos HP.

Lo primero que debemos hacer es asegurarnos que nuestro sistema esté al día:
# aptitude update
# aptitude safe-upgrade


Posteriormente instalamos los paquetes necesarios para la puesta a punto de la impresora.
# aptitude install hplip hpijs foomatic-db-hpijs

Ahora basta con abrir una nueva ventana/pestaña del navegador y cargar la URL http://localhost:631. Inmediatamente le aparecerá la página de bienvenida del sistema CUPS


Hacemos click en Añadir impresora y veremos algo como:


Llenamos los campos con la información requerida y hacemos click en Siguiente. Ahora nos sale una pantalla donde es necesario seleccionar el tipo de conexión con la impresora.


En este caso la impresora está conectada por cable USB, así que tomaremos la opción que dice USB y que además contiene la palabra HPLIP y el serial de la misma.

Por último el CUPS nos pregunta sobre el modelo de la impresora


Seleccionamos el modelo de nuestra impresora y hacemos click en Añadir impresora y con eso tenemos la impresora instalada y funcionando a la perfección.



Luego de eso solo queda probar la impresión con nuestro programa favorito o llamar desde la consola al toolbox de HP con el comando:
$ hp-toolbox

Instalar driver NVIDIA a la Debian-Way

miércoles, octubre 29, 2008

El procedimiento descrito a continuación fue probado en Debian Lenny pero debería funcionar para la mayoría de las distribuciones derivadas de Debian sin mucho problema. Usaremos el paquete module-assistant para llevar a cabo la tarea

Lo primero es instalar el module-assistant:
# aptitude install module-assistant
Posteriormente instalarmos los headers del kernel que estamos usando:
# aptitude install linux-headers-$(uname -r)
Después de esto ejecutamos los siguientes pasos:
# module-assistant update
# module-assistant prepare
# module-assistant auto-install nvidia

O lo que es lo mismo:
# m-a update
# m-a prepare
# m-a a-i nvidia

Con eso le decimos al module assistant que se encargue de descargar, compilar, empaquetar e instalar el driver NVIDIA correspondiente a nuestra tarjeta de video.

Pero ahora nos falta configurar el servidor X.Org para que haga uso del driver. Para ello instalamos el paquete nvidia-xconfig:
# aptitude install nvidia-xconfig
Y luego lo ejecutamos:
# nvidia-xconfig
Con eso tendremos el archivo /etc/X11/xorg.conf configurado y listo para la acción.

Finalmente, reiniciamos las X's presionando Ctrl + Alt + Backspace o ejecutando el siguiente comando:
# /etc/init.d/gdm restart
Si todo ha salido bien deberíamos ver el logo de NVIDIA en nuestra pantalla y un driver completamente funcional

Formatear Pen Drive USB en GNU/Linux

sábado, septiembre 27, 2008

Para formatear un pen drive USB desde un terminal GNU/Linux solo necesitamos seguir estos sencillos pasos:

Primero conectamos el dispositivo a la PC y hacemos un tail para ver en que parte ha quedado:
$ tail /var/log/messages
Sep 27 03:12:30 desktop kernel: [27939.999977] usb 1-7: configuration #1 chosen from 1 choice
Sep 27 03:12:30 desktop kernel: [27940.002680] scsi8 : SCSI emulation for USB Mass Storage devices
Sep 27 03:12:35 desktop kernel: [27944.996927] scsi 8:0:0:0: Direct-Access Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 2
Sep 27 03:12:35 desktop kernel: [27945.007031] sd 8:0:0:0: [sdc] 15769600 512-byte hardware sectors (8074 MB)
Sep 27 03:12:35 desktop kernel: [27945.007768] sd 8:0:0:0: [sdc] Write Protect is off
Sep 27 03:12:35 desktop kernel: [27945.010384] sd 8:0:0:0: [sdc] 15769600 512-byte hardware sectors (8074 MB)
Sep 27 03:12:35 desktop kernel: [27945.011009] sd 8:0:0:0: [sdc] Write Protect is off
Sep 27 03:12:35 desktop kernel: [27945.011019] sdc: sdc1
Sep 27 03:12:35 desktop kernel: [27945.127126] sd 8:0:0:0: [sdc] Attached SCSI removable disk
Sep 27 03:12:35 desktop kernel: [27945.127165] sd 8:0:0:0: Attached scsi generic sg3 type 0

La salida nos proporciona bastante información sobre el pen drive (marca, modelo, tamaño, etc) pero lo que nos interesa en este momento es el dispositivo al que ha sido asociado; en este caso es sdc, más especificamente sdc1.

Procedemos entonces (como root de ahora en adelante) a desmontar el volúmen:
# umount /dev/sdc1
Con fdisk vamos a eliminar las particiones (no es necesario pero es recomendable si el pen drive tiene algunas fallas lógicas)
# fdisk /dev/sdc1
Esto nos abrirá una consola, y al escribir m y presionar Enter nos debe salir un menú de ayuda similar al siguiente:
Orden (m para obtener ayuda): m
Orden Acción
a Conmuta el indicador de iniciable
b Modifica la etiqueta de disco bsd
c Conmuta el indicador de compatibilidad con DOS
d Suprime una partición
l Lista los tipos de particiones conocidos
m Imprime este menú
n Añade una nueva partición
o Crea una nueva tabla de particiones DOS vacía
p Imprime la tabla de particiones
q Sale sin guardar los cambios
s Crea una nueva etiqueta de disco Sun
t Cambia el identificador de sistema de una partición
u Cambia las unidades de visualización/entrada
v Verifica la tabla de particiones
w Escribe la tabla en el disco y sale
x Funciones adicionales (sólo para usuarios avanzados)

Para eliminar la partición escribimos d y presionamos Enter. Si hay una sola partición se borrará automáticamente, sino preguntará el número de la partición y debemos ir borrando una a una hasta que no quede ninguna.

Con la orden n se creará una nueva partición, escribimos p para que sea primaria y 1 para que sea la primera partición.

Esto nos crea una partición de tipo Linux, pero el pen drive debe tener formato FAT para que pueda ser reconocido tanto en máquinas Windows como Linux así que ingresamos la orden t para cambiar el tipo de la partición y escribimos posteriormente 6 para que tome el tipo FAT16.

Cuando todo esto se haya completado entonces damos la orden w para que se escriban los cambios al disco.

Por último, usamos la herramienta mkfs.vfat para darle el formato FAT16 y colocarle la etiqueta "USB" al pen drive:
# mkfs.vfat -F 16 -n USB /dev/sdb1
Eso es todo, siguiendo estos sencillos pasos tendremos un pen drive como nuevo, completamente funcional.

Respaldar y restaurar una base de datos MySQL

lunes, septiembre 22, 2008

Supongamos que tenemos un servidor de bases de datos MySQL con las siguientes características:

Host: 127.0.0.1
Usuario: admin
Password: 123456
Base de datos: Database

Si queremos hacer un respaldo instantáneo de la base de datos, basta con usar el comando mysqldump como se muestra a continuación:

$ mysqldump --quick -h127.0.0.1 -uadmin -p123456 Database > respaldo.sql

--quick: permite que el volcado de la información se haga fila por fila para evitar problemas de desempeño con bases de datos muy grandes.
-h: especifíca la dirección IP del servidor MySQL (se puede omitir este parametro si el equipo donde se hará el respaldo es el mismo donde se encuentra la base de datos).
-u: permite indicar el nombre del usuario con el que se desea conectar a la base de datos
-p: si se coloca sin ningún argumento pedirá la contraseña del usuario al ejecutar el comando. Si especificamos la contraseña seguidamente del -p entonces entrará directamente a la base de datos a realizar la operación solicitada.

El comando mysqldump volcará el contenido de la base datos Database en el archivo respaldo.sql (usando los parametros de conexión indicados en los argumentos)

Para restaurar la base de datos debemos primero debemos entrar en la consola del mysql y posteriormente ejecutamos el archivo respaldo.sql:

$ mysql -h127.0.0.1 -uadmin -p123456 Database
mysql> source respaldo.sql

Más adelante explicaré cómo realizar respaldos automáticos (usando bash y cron) de una base de datos.

¿Qué se puede hacer con un set de 6 CD's de Visual Studio .NET?

lunes, septiembre 08, 2008

Así como lo leen. Tenía en mis manos un set nuevecito con 6 CD's de instalación del Visual Studio .NET y me dijé... ¡Hey! Debería poder hacer algo con esto... Aquí está el resultado, disfrútenlo









Toda una obra maestra xD

Instalar Flash Player para Iceweasel en Debian Etch

jueves, septiembre 04, 2008

En Debian Etch debemos seguir algunos pasos _extras_ para configurar y poner a punto el plugin de flash para Iceweasel.

Primero descargamos el plugin desde la página de Adobe:
http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash.

Podemos hacerlo también desde una consola usando:
$ wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_9_linux.tar.gz

Actualizo:
La ruta anterior era para la versión 9 del plugin, pero al parecer la gente de adobe ya ha descontinuado esa versión. Para descargar el nuevo plugin usamos la siguiente ruta:

$ wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_10_linux.tar.gz

Nos ubicamos en la carpeta donde fue descargado el paquete y lo descomprimimos usando:
$ tar -xvzf install_flash_player_10_linux.tar.gz

Esto nos crea un directorio install_flash_player_10_linux donde se encuentran los archivos flashplayer-installer y libflashplayer.so

El flashplayer-installer es un script que instala "automaticamente" el plugin pero no funciona en Debian Etch (porque algunas rutas son diferentes). Procedemos entonces a instalar manualmente el plugin en una consola con privilegios de root:

Para Iceweasel:
# cp install_flash_player_10_linux/libflashplayer.so /usr/lib/iceweasel/plugins/

Para Firefox:
# cp install_flash_player_10_linux/libflashplayer.so /usr/lib/mozilla-firefox/plugins/

Para Konqueror:
# cp install_flash_player_10_linux/libflashplayer.so /usr/lib/netscape/plugins-libc6/

Si ninguna de las opciones anteriores funciona podemos instalarlo en nuestro directorio personal; solo estará disponible para nosotros y si agregamos un usuario nuevo debemos repetir el procedimiento con ese usuario pero es una solución viable:
# cp install_flash_player_10_linux/libflashplayer.so /home/mi_usuario/.mozilla/plugins/

Ahora solo queda cerrar todas las ventanas del navegador y abrir nuevamente para que los cambios surtan efecto. Si deseas verificar que el plugin está instalado abre cualquier página que contenga un script en flash como por ejemplo:
http://www.adobe.com/es/support/flashplayer/ts/documents/tn_15507.htm

¿Te ha funcionado? Deja tu comentario

Timidity y Guitar Pro 5 en Debian Lenny

viernes, agosto 01, 2008

Guitar Pro es un editor de tablaturas multipistas para guitarra, bajo, percusión y otros instrumentos musicales. Por los momentos es uno de los mejores (si no el mejor) editor de tablaturas pero es propietario y de paso solo disponible solo para Windows y Mac. A pesar del creciente auge del software libre es difícil encontrar un reemplazo con las mismas funcionalidades. Existen algunas alternativas libres, como kguitar o dguitar pero aún les falta madurar un poco para hacer frente a guitar pro como verdaderos contendientes.

He visto que algunas amigos no se pasan por completo a GNU/Linux porque no pueden usar Guitar Pro, así que decidí instalarlo y configurar todas las herramientas necesarias para obtener un rendimiento similar al que puede obtenerse en Windows y es lo que pretendo enseñarles a continuación. Sin embargo, hago la aclaración de que el RSE (Real Sound Engine) no funcionará muy bien (aún no he logrado corregirlo), pero el soporte MIDI funcionará al 100%. Para aquellos que no tengan Guitar Pro y deseen probarlo pueden descargar una versión de prueba de 15 días aquí

Los pasos siguientes son válidos para Debian y Ubuntu, pero la base debería ser la misma para otras distribuciones. También se supone que el sistema tiene instalado y configurado ALSA como manejador de sonidos.

Primero instalaremos Wine y Timidity.

$ sudo apt-get install wine timidity
Para explicarlo con pocas palabras, Wine es una reimplementación de la API de Windows para sistemas operativos basados en Unix (o sea, nos permitirá instalar el Guitar Pro para Windows) y Timidity es un software sintetizador que permite reproducir archivos MIDI.

Necesitamos descargar la librería de sonidos Fluid y la aplicación sfarkxtc para descomprimirla. Adicionalmente debemos instalar otra librería para que el sfarkxtc funcione correctamente:

$ sudo apt-get install libstdc++5
Mientras se descarga el Fluid instalaremos Guitar Pro en nuestro flamante sistema GNU/Linux (el método descrito también funciona para la versión completa de Guitar Pro). Para ello debemos abrir un terminal y ubicarnos en el directorio donde se encuentra el instalador y escribir:

$ wine GP5DEMO.exe
o simplemente haciendo clic derecho sobre el instalador y seleccionando la opción "Abrir con <<wine>>".


Si ésta opción no aparece entonces seleccionamos "Abrir con otra aplicación..." y en comando personalizado escribimos wine.

Lo siguiente es ejecutar en un terminal:

$ winecfg



En la versión del sistema operativo escogemos Windows XP y en la pestaña Audio seleccionamos la casilla ALSA Driver.



Vamos ahora con la configuración del Timidity. Lo primero es editar el archivo /etc/default/timidity y ubicamos la línea:
#TIM_ALSASEQ=true
y la descomentamos. Quedaría así:
TIM_ALSASEQ=true

También buscamos la línea:
TIM_ALSASEQPARAMS="-Os"
y la reemplazamos por:
TIM_ALSASEQPARAMS="-iAr -B2,8 -Os1l -s 44100 -EFreverb=0"

Posteriormente creamos la carpeta .timidity en nuestro directorio home (si es que no existe):
mkdir ~/.timidity

Cuando tengamos la librería Fluid descargada la descomprimimos junto con el sfarkxtc, en la misma ubicación (archivos FluidR3122501.zip y sfarkxtc_lx86.tar.gz respectivamente). Desde el terminal, nos colocamos en la carpeta donde fueron descomprimidos los archivos y ejecutamos:

$ ./sfarkxtc FluidR3\ GM.sfArk
$ ./sfarkxtc FluidR3\ GS.sfArk
$ mv FluidR3\ GM.SF2 ~/.timidity/FluidR3GM.SF2
$ mv FluidR3\ GS.SF2 ~/.timidity/FluidR3GS.SF2

Y con eso tendremos sendos archivos .SF2 listos para usarse. A continuación editamos el archivo /etc/timidity/timidity.cfg (también con privilegios de root) y buscamos la línea:

source /etc/timidity/freepats.cfg
y la reemplazamos por:

soundfont "~/.timidity/FluidR3GM.SF2"
soundfont "~/.timidity/FluidR3GS.SF2"

Por último, reiniciamos Timidity:

$ sudo /etc/init.d/timidity restart
En este punto ya disponemos de un Timidity con esteroides, correctamente configurado y listo para trabajar con Guitar Pro.

Si te aparece un error similar a este:
Starting TiMidity++ ALSA midi emulation...ALSA lib seq_hw.c:457:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory
error in snd_seq_open


Entonces necesitas cargar el módulo snd_seq, para ello ejecutas:
# modprobe snd_seq

Y para que se cargue cada vez que iniciamos el equipo editas el archivo /etc/modules y agregas una nueva línea con la palabra snd_seq

Nos queda configurar el Guitar Pro para que use Timidity como dispositivo de salida MIDI. Ejecutamos Guitar Pro bien sea desde el menú Aplicaciones->Wine->Programas->Guitar Pro 5 o tecleando en el terminal:

$ cd ~/.wine/drive_c/Archivos\ de\ programa/Guitar\ Pro\ 5
$ wine GP5.exe

Allí vamos al menú Opciones->Ajuste de Audio (MIDI/RSE)... seleccionamos Timidity como dispositivo de salida MIDI y General MIDI como juego de instrumentos. Podemos jugar también con la Capacidad de los Buffers poniéndolos en un valor más alto (yo lo tengo en 2048) si notamos un sonido cortado o un poco laggeado. Para más información puedes visitar la página de soporte de Wine para Guitar Pro. Solo queda empezar a usarlo y disfrutar de secuencias MIDI con una excelente calidad xD

¿Y a tí, te sirvió esta receta?

Algoritmo para desordenar un arreglo en C/C++

jueves, julio 31, 2008

Imagina que deseas implementar un algoritmo en C++ donde necesites desordenar aleatoriamente un arreglo; por ejemplo: en un juego donde utilices un mazo de cartas y debas barajarlo. El siguiente código puede ayudarte en esa tarea:

int mazo_ordenado[44];
int mazo_barajado[44];
bool usado[44];

for (int i=0; i < 44; i++)
usado[i]=false;

int index=0;
for (int i=0; i < 44; i++){
do{
index = (rand() % 44);
while (usado[index]);
mazo[i] = mazo_ordenado[index];
usado[index]=true;
}

Ahora, explicaré el código paso a paso. La intención es desordenar un arreglo de 44 elementos (puede ser de cualquier tamaño, solo basta reemplazar el 44 por el número de su elección). El arreglo ordenado lo tenemos en la variable mazo_ordenado. Luego creamos otros dos arreglo con la misma cantidad de elementos, uno llamado mazo_barajado donde almacenaremos el arreglo desordenado y otro llamado usado en donde guardaremos el estado de cada elemento del mazo original.

int mazo_ordenado[44];
int mazo_barajado[44];
bool usado[44];

La idea es recorrer en orden creciente el arreglo desordenado y depositar en cada uno de sus elementos un elemento aleatorio del arreglo ordenado. Con el arreglo de booleanos usado llevaremos la cuenta de cuáles elementos del arreglo original se han usado y cuáles no (con la finalidad de no duplicar elementos), por eso debemos inicializar todos sus elementos en false

for (int i=0; i < 44; i++)
usado[i]=false;

Usando la función rand() generamos índices aleatorios para obtener los elementos del arreglo original; pero debemos comprobar el valor de usado[indice] para saber si el elemento ha sido usado o no. Si el elemento ya está usado, el valor de usado[indice] será true y tendremos que generar otro índice hasta que consigamos uno no usado.

do{
index = (rand() % 44);
while (usado[index]);

Si no hemos usado el elemento apuntado por indice, el valor de usado[indice] será false y entonces procedemos a almacenar el elemento en el arreglo desordenado y cambiamos el valor de usado[indice] a true.

mazo[i] = mazo_ordenado[index];
usado[index]=true;

Esto debemos hacerlo para los 44 elementos del arreglo desordenado así que debe ir dentro de un for y con la respectiva inicialización de la variables:

int index=0;
for (int i=0; i < 44; i++){
do{
index = (rand() % 44);
while (usado[index]);
mazo[i] = mazo_ordenado[index];
usado[index]=true;
}

A la salida del for tendremos un arreglo desordenado listo para usar :D.

Prueben el código, agreguen unos cuantos printf para imprimir los valores de los mazos antes y después del for y comenten sus resultados. Si tienen alguna sugerencia o corrección posteenla también que será bien recibida. Espero que les haya sido de utilidad.

Instalar plugin Atlantis para Compiz en Hardy Heron

miércoles, julio 30, 2008


Este nuevo plugin de compiz permite poner tu escritorio como una pecera y es muy fácil de instalar.

  1. Descarga el plugin desde aquí

  2. Instala las depencias:
    $ sudo apt-get install compiz-dev compiz-bcop libtool

  3. Compila e instala el plugin
    $ make clean
    $ make
    $ make install

Ahora puedes ir al menú Sistema->Preferencias->Configuración avanzada de los efectos de escritorio para activar y configurar tu nuevo y flamante plugin Cube Atlantis

SciTE: Mi editor de texto favorito

domingo, julio 27, 2008




SciTE es un excelente editor de texto que fue desarrollado en un principio para demostrar el poder de Scintilla (un componente/librería para la edición de texto). Sin embargo ha crecido tanto que ha llegado a opacar un poco a la propia librería.

¿Y qué tiene de grandioso el SciTE? se preguntarán. Pues quizás no sea nada del otro mundo, pero es que su sencillez, su funcionalidad y su alto grado de personalización lo hacen (al menos para mi) el editor de texto perfecto. Al momento de escribir este post SciTE está disponible en las arquitecturas de 32 bits para sistemas GNU/Linux y Windows.

En la lista que sigue trataré de describir las funcionalidades básicas del SciTE:
  • Edición de Texto: Estándar y con resaltado de sintaxis. Soporta gran cantidad de lenguajes de programación y puede expandirse para lenguajes que aún no estén soportados

  • Subsistema de comandos: Permite ejecutar herramientas (compiladores, interpretes, etc) dentro de la misma interfaz del SciTE

  • Pestañas: Permite abrir entre 1-100 documentos al mismo tiempo, visualizando uno a la vez y los demás en memoria. Además se puede guardar el estado de las pestañas en archivos de sesiones y recuperarlas cuando se desee

  • Atajos de teclado: Facilitan la interacción entre el usuario y el editor (siguen las convenciones más comunes de GNU/Linux y Windows)

  • Abreviaturas: Una función poderosa constituida por pares abrev = texto definidos por el usuario. Al escribir abrev en el editor y presionar Ctrl+B, se reemplaza abrev por texto

  • Plegado: Una de mis funciones favoritas. Permite plegar o expandir fragmentos de código basados en identación (en el caso de Python) o en llaves de apertura y cierre (en el caso de otros lenguajes). Muestra símbolos al margen izquierdo del editor para expandir o contraer los fragmentos

  • Archivos de propiedades: Permiten definir el comportamiento y la configuración general del editor

Luego de mencionar algunas de las características del SciTE veamos como personalizarlo. SciTE posee 4 tipos de archivos de configuración:
  • "SciTE.properties" (propiedades locales)

  • "SciTEDirectory.properties" (propiedades de directorio)

  • ".SciTEUser.properties" en GNU/Linux o "SciTEUser.properties" en Windows (propiedades de usuario)

  • "SciTEGlobal.properties" (propiedades globales)

El archivo de propiedades locales debe estar presente en el mismo directorio donde se encuentra el archivo que estamos editando.

El archivo de propiedades de directorio se usa para definir el comportamiento del editor (o de sus herramientas) sobre todos los archivos contenidos dentro de un directorio.

El archivo de propiedades de usuario define el comportamiento del editor para cada usuario del equipo y se encuentra en el directorio home del usuario en los sistemas GNU/Linux o en el directorio de perfil de usuario definido en la variable USERPROFILE de Windows (si la variable USERPROFILE no está definida se ubica en el directorio del ejecutable)

El archivo de propiedades globales define el comportamiento por defecto del editor y se encuentra en /usr/share/scite para los sistemas GNU/Linux y en el directorio del ejecutable para Windows.

Las propiedades locales anulan a las propiedades de usuario que a su vez anulan a las propiedades globales.

Ahora voy a comentar la configuración que he realizado del SciTE usando el archivo de propiedades de usuario (".SciTEUser.properties" en mi caso):

# Se define el ancho de una tabulación equivalente a 4 espacios en blanco, se
# establece el ancho de la identación a 4 caracteres y se indica que se usarán
# espacios en lugar de tabulaciones para la identación
tabsize=4
indent.size=4
use.tabs=0

# Define la cantidad de pestañas simultáneas
buffers=15

# Permite visualizar una línea en el borde derecho del editor con un ancho de
# 100 caracteres y de color #C0DCC0
edge.column=100
edge.mode=1
edge.colour=#C0DCC0

# Muestra una lista de autocompletado cuando se escriben palabras que ya se
# encuentran dentro del texto
autocompleteword.automatic=1

# Visualiza el número de línea en el márgen izquierdo
line.margin.visible=1

Para una descripción detallada de cada una de las propiedades del SciTE visite la página de documentación oficial


Actualización: 13/11/2008

Acá les dejo mi archivo personal de configuración del SciTE; allí, además de lo mencionado arriba, configuro el editor para que use fuentes monospace y uno que otro truquillo :D

# Se define el ancho de una tabulación equivalente a 4 espacios en blanco, se
# establece el ancho de la identación a 4 caracteres y se indica que se usarán
# espacios en lugar de tabulaciones para la identación
tabsize=4
indent.size=4
use.tabs=0

# Define la cantidad de pestañas simultáneas
buffers=15

# Permite visualizar una línea en el borde derecho del editor con un ancho de
# 100 caracteres y de color #C0DCC0
edge.column=80
edge.mode=1
edge.colour=#C0DCC0

# Muestra una lista de autocompletado cuando se escriben palabras que ya se
# encuentran dentro del texto
autocompleteword.automatic=1

# Visualiza el número de línea en el márgen izquierdo
line.margin.visible=1

# Default
style.*.32=$(font.monospace)
style.cpp.32=$(font.monospace)
style.python.32=$(font.monospace)
# Line number
#style.*.33=back:#C0C0C0,$(fontmonospace)
# Brace highlight
#style.*.34=fore:#0000FF,bold
# Brace incomplete highlight
#style.*.35=fore:#FF0000,bold
# Control characters
#style.*.36=
# Indentation guides
#style.*.37=fore:#C0C0C0,back:#FFFFFF

font.base=font:!Bitstream Vera Sans Mono,size:9
font.small=font:!Bitstream Vera Sans Mono,size:8
font.comment=font:!Bitstream Vera Sans Mono,size:9
font.code.comment.box=$(font.comment)
font.code.comment.line=$(font.comment)
font.code.comment.doc=$(font.comment)
font.code.comment.nested=$(font.comment)
font.text=font:!Bitstream Charter Mono,size:9
font.text.comment=font:!Bitstream Vera Sans Mono,size:9
font.embedded.base=font:!Bitstream Vera Sans Mono,size:9
font.embedded.comment=font:!Bitstream Vera Sans Mono,size:9
font.monospace=font:!Bitstream Vera Sans Mono,size:9
font.vbs=font:!Bitstream Vera Sans Mono,size:9


Los invito a que lo prueben y digan que les parece... para mi es el mejor y ¿para ti?

Problemas instalando GRUB en Debian Lenny

miércoles, julio 23, 2008

Estuve instalando Debian Lenny en un pentium II ~ 300MHz con 128MB de memoria RAM y par de discos de 4.3GB cada uno y resulta que cada vez que llegaba al paso de Configurar gestor de arranque GRUB me saltaba el error Grub package failed to install into /target/ y no podía terminar la instalación.

Al principio pensaba que se trataba de algún daño en los discos, intenté instalar Debian con distintas opciones de HW, probando cada disco por separado, usando diferentes sistemas de archivos y nada.

Me puse a buscar en google y me topé con esta excelente guía de instalación de Red Hat y allí encontré la respuesta. Resulta que los BIOS de las máquinas viejas no pueden acceder más allá del cilindro 1024 de los discos duros y esto equivale aproximadamente a 528MB (la cifra exacta depende del BIOS y del disco duro).

¿Pero que significa esto? Pues muy sencillo, que al momento de crear la tabla de particiones del disco debemos reservar un espacio en los primeros 1024 cilindros del disco duro (<= 528MB) para la partición /boot y así permitir que la data del GRUB e incluso el kernel Linux se ubiquen en esa zona. Con esto nos aseguramos de que el BIOS puede acceder a la data y bootear correctamente.

Configurar sonido 5.1 en Ubuntu Hardy Heron

martes, julio 22, 2008

Desde hace algún tiempo tenía este tópico pendiente y hoy me decidí a resolverlo y publicar mis resultados. Trataré de explicar paso a paso lo que hice para lograr el tan anhelado sonido 5.1 en Ubuntu Hardy Heron.

Ubuntu Hardy Heron ya incluye PulseAudio así que no hace falta instalarlo (para ver una lista de todas las distribuciones haga clic aquí), sin embargo a simple vista no es posible notar su presencia porque no se incluyen las herramientas auxiliares. Lo que haremos será usar PulseAudio como reemplazo del ESD y configurar ALSA para que use PulseAudio.

La configuración de ALSA se guarda en un par de archivos ocultos en nuestro directorio home, ellos son .asoundrc y .asoundrc.asoundconf. Si estos archivos existen debemos borrarlos/renombrarlos a fin de evitar cualquier error por una configuración residual. Para lograr esto escribimos en el terminal:

$ cd ~
$ mv .asoundrc .asoundrc_old
$ mv .asoundrc.asoundconf .asoundrc.asoundconf_old


Las instrucciones anteriores nos posicionan en nuestro home y renombran los archivos .asoundrc y .asoundrc.asoundconf a .asoundrc_old y .asoundrc.asoundconf_old respectivamente. La instrucción cd ~ puede reemplazarse por cd /home/mi_directorio.

Ahora hacemos que ALSA genere estos archivos automáticamente. Primero listamos el nombre de nuestra tarjeta de sonido:

$ asoundconf list

Y el nombre que nos muestre el comando anterior lo usaremos en:

$ asoundconf set-default-card nombre_de_la_tarjeta

Posteriormente procedemos a editar el archivo de configuración del PulseAudio:

$ sudo gedit /etc/pulse/daemon.conf

Allí ubicaremos la siguiente línea:

;default-sample-channels = 2

y la reemplazaremos por:

default-sample-channels = 6

Lo que hacemos es quitar el ; para que la línea sea tomada en cuenta y cambiamos la cantidad de canales de 2 a 6.

Ahora hay que asegurarse que PulseAudio no intentará abrir el dispositivo por "defecto" para su propia salida de audio. Para ello abrimos el archivo:

$ sudo gedit /etc/pulse/default.pa

Y buscamos el siguiente fragmento de texto:

### Automatically load driver modules depending on the hardware available
.ifexists module-hal-detect.so
load-module module-hal-detect
.else
### Alternatively use the static hardware detection module (for systems that
### lack HAL support)
load-module module-detect
.endif


Debemos comentar todas estas líneas, para dejarlo así:

### Automatically load driver modules depending on the hardware available
#.ifexists module-hal-detect.so
#load-module module-hal-detect
#.else
### Alternatively use the static hardware detection module (for systems that
### lack HAL support)
#load-module module-detect
#.endif


E inmediatamente después de ese fragmento de texto agregamos la línea:

load-module module-alsa-sink device=hw:0

Una cosa importante que se debe aclarar es que PulseAudio crea sus propios grupos y todos los usuarios que quieran usar este servidor de sonidos deben pertenecer a ellos. Para que el usuario pertenezca a estos grupos ejecutamos las siguientes instrucciones:

$ sudo adduser nombre_usuario pulse
$ sudo adduser nombre_usuario pulse-access
$ sudo adduser nombre_usuario pulse-rt


Luego vamos hasta el menú Sistema->Preferencias->Sonido, en la pestaña Dispositivos seleccionamos PulseAudio Sound Server para todas las opciones y como dispositivo mezclador seleccionamos el nombre de nuestra tarjeta de sonido.



En la pestaña Sonidos nos aseguramos que la opción Activar mezcla de sonidos por software (ESD) esté activada.



Sólo nos resta reiniciar el ALSA y el PulseAudio, para esto escribimos en el terminal:

$ sudo /etc/init.d/pulseaudio restart
$ sudo /sbin/alsa reload


Con esto ya deberíamos tener todos nuestros altavoces funcionando. Recuerda verificar que el volumen está en el nivel adecuado (que no está muy bajo o silenciado), para ello cuentas con:

$ alsamixer

¿Te ha funcionado ésta configuración? Deja tu comentario y cuenta cuáles han sido tus resultados

Eventos de ratón en el QGraphicsView

miércoles, julio 16, 2008

El QGraphicsView es una clase de Qt4 que proporciona un widget para mostrar una escena QGraphicsScene. La escena es una superficie que nos permite manejar un montón de elementos 2D, sin embargo ninguno de estos controles trae habilitado por defecto la captura de eventos de ratón.

Para interceptar (y manejar) estos eventos debemos hacer una subclase, bien sea, de QGraphicsScene o de QGraphicsView y redefinir el método mousePressEvent. Pero como QGraphicsView contiene a la escena (digamos que es el widget padre) entonces lo tomaremos como base para esta explicación.

Vamos a definir una subclase válida de un QGraphicsView llamada GraphicsView y que tenga una señal llamada mousePressed con dos argumentos enteros:
#include <QGraphicsView>
#include <QObject>

class GraphicsView : public QGraphicsView{
Q_OBJECT
public:
GraphicsView(QWidget *parent = 0);
void mousePressEvent(QMouseEvent *event);
signals:
void mousePressed(int x, int y);
};

El método mousePressEvent se llamará cada vez que el usuario haga clic en un botón del ratón encima del GraphicsView. Para implementar otros eventos de ratón podemos redefinir (de la misma manera) las funciones mouseMoveEvent, mouseReleaseEvent, mouseDoubleClickEvent o wheelEvent.

La reimplementación de la clase quedaría de la siguiente forma:
GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent) {
/* Aquí se coloca todo el código necesario para la creación e
inicialización del widget */
}

/* Redefinición del método mousePressEvent para tomar las coordenadas x e y del
ratón y almacenarlas en las variables enteras xRaton y yRaton respectivamente */

void GraphicsView::mousePressEvent(QMouseEvent *event){
int xRaton = event->pos().x();
int yRaton = event->pos().y();

//emitir la señal mousePressed
emit mousePressed(xRaton, yRaton);
}

Para utilizar esta subclase solo debemos instanciarla y conectar la señal mousePressed a un slot de nuestra preferencia, por ejemplo:
GraphicsView *visor; //Instanciamos un puntero a un elemento GraphicsView
visor = new GraphicsView(this);

connect(visor, SIGNAL(mousePressed(int, int)), this, SLOT(slot_prara_manejar_raton(int, int)));

Con esto tendremos un QGraphicsView que soporta eventos de ratón :D

NetBeans con C++ y Qt

NetBeans es un IDE que aparte de ser gratuito y open-source es muy completo. Lo he usado para varios proyectos que he desarrollado en Java y nunca me ha dejado mal.

Pero ¿qué pasa si queremos esa funcionalidad para programar en C++ usando las librerías gráficas de Qt? Pues solo hace falta seguir estos sencillos pasos y tendremos a NetBeans configurado como IDE para C++/Qt. Esta explicación se hará bajo un sistema operativo GNU/Linux y suponiendo que ya tenemos el NetBeans instalado (sino puede visitar la página de NetBeans, descargarlo e instalarlo).

Configuración del Editor
  1. Instalar el plugin para C/C++: Vamos al menú Tools->Plugins, en la pestaña Available Plugins buscamos el de C/C++, lo marcamos y hacemos clic en instalar.



    Luego hacemos clic en Next, aceptamos la licencia y comenzará la descarga del plugin



  2. Incluir las librerias de C++ y Qt: Para esto vamos al menú principal, en Tools->Options y nos ubicamos en la pestaña Code Assistance.



    Aquí debemos agregar las siguientes rutas para que el editor reconozca las librerias de C++

    /usr/include/c++/4.2
    /usr/include/c++/4.2/i486-linux-gnu
    /usr/include/c++/4.2/backward
    /usr/local/include
    /usr/lib/gcc/i486-linux-gnu/4.2.3/include
    /usr/include

    Y estas otras para que reconozca las librerias de Qt

    /usr/include/qt4
    /usr/include/qt4/Qt
    /usr/include/qt4/QtCore
    /usr/include/qt4/QtGui
    /usr/include/qt4/QtSql
    /usr/include/qt4/QtNetwork

    Si está usando un sistema operativo distinto de GNU/Linux debe buscar el equivalente de estas rutas.

Si todo ha salido bien al hacer clic en el menú File->New Project deberíamos tener una ventana como la que se muestra a continuación, donde se observa claramente la nueva opción de C/C++ en las categorías de proyectos.



Configuración del Proyecto

Con lo que hemos hecho hasta ahora NetBeans sabe como crear, compilar y ejecutar un proyecto en C/C++ e incluso sabe dónde están las librerías estándar de C/C++ y Qt, pero aún no tiene idea de cómo compilar y ejecutar una aplicación para Qt.

NetBeans usa un archivo Makefile para cada proyecto (generado automáticamente) donde se encuentran las reglas para la compilación. Las aplicaciones Qt no usan las mismas reglas que las aplicaciones C/C++ estándares, así que la solución para esto la tenemos en estos sencillos pasos

  1. Generar el Makefile: Debemos generar nuestro propio Makefile indicándole a NetBeans las reglas para compilar nuestros proyectos Qt. Las aplicaciones Qt se compilan de la siguiente forma:

    qmake -project (para generar el proyecto, es decir el archivo .pro)
    qmake (para generar el Makefile)
    make (para compilar la aplicación usando el Makefile de arriba)


    Es decir, solo tenemos que agregar las dos instrucciones con qmake antes del make correspondiente. Sin embargo aquí se presenta un problema, NetBeans trabaja con un archivo Makefile y qmake trabaja con otro archivo Makefile, ambos son diferentes pero con el mismo nombre. Si compilamos el proyecto de esta forma el Makefile generado por qmake sobreescribirá al Makefile del NetBeans y tendremos que estar reescribiendo este archivo cada vez que queramos generar el proyecto. Para evitar eso basta con hacer que qmake genere su archivo con otro nombre, eso lo logramos agregando la opción -o al qmake. El nuevo Makefile del Netbeans (el único Makefile que debería queda a este punto) podría ser algo como:

    # build
    build: QMake
    make -f QMakefile

    # clean
    clean: QMake
    make distclean -f QMakefile
    rm *.pro -f
    rm QMakefile -f

    # all
    all: build

    QMake:
    qmake -project
    qmake -o QMakefile

    Nota: Antes de cada instrucción DEBE ir un tabulador.

    En el código anterior se nota claramente la definición de la regla QMake, que se encargará de manejar todo lo referente al qmake, además pasamos el parámetro -o al qmake para que genere un archivo de nombre QMakefile y no sobreescriba el Makefile de NetBeans. En el build se llama a la regla QMake (para que qmake genere el .pro y el QMakefile) y luego se hace el make del QMakefile, en el clean llamamos a la regla QMake (para que qmake limpie todo), hacemos la limpieza con make y luego borramos el .pro y el QMakefile para asegurarnos de que se crearan nuevamente la próxima vez que generemos el proyecto

  2. Especificar la ruta del ejecutable: NetBeans ubica los ejecutables en una ruta que depende de la forma en la que generamos el proyecto (Debug o Release) pero qmake coloca el ejecutable en la misma ruta donde se encuentra el proyecto (.pro). Para lograr que NetBeans pueda ejecutar nuestra aplicación debemos especificar la ruta en la que se encuentra nuestro ejecutable. Para ello vamos a las propiedades del proyecto (en la ventana de proyectos hacemos clic sobre el nombre de nuestro proyecto y luego clic derecho -> Properties). Acá buscamos la opción Linker->General y editamos el atributo Output; solo debemos colocar el nombre de la carpeta del proyecto (con mayúsculas y minúsculas)


Con esto ya pueden disfrutar de un completo IDE para C/C++ y Qt.

Guia Básica HTML + PHP

sábado, julio 12, 2008

Esta guía de HTML+PHP la he desarrollado para un curso que dicté hace un mes aproximadamente y hoy he decidido publicarla. Es una guía rápida para todos los que deseen iniciarse en el mundo de la programación web y por ser básica no profundiza mucho en algunos tópicos; es por esto que recomiendo complementarla con otras fuentes de información más detalladas y especificas según sea el caso.

La guía consta de una primera parte basada en HTML (o mejor dicho XHTML, pues se sigue ese estándar rigurosamente), una segunda parte introductoria a PHP y una tercera parte donde se explica como interactuar con ambos, HTML y PHP.

Puede descargar la guía en formato PDF aquí

Cualquier correción, comentario o sugerencia será bien recibido

Anunciando oficialmente Diablo 3

domingo, junio 29, 2008

Sin duda una de las mejores noticias de esta semana. Me ha alegrado el corazón y ha despejado todas las dudas sobre un rumor que estaba latente desde hace algún tiempo... ¡Diablo 3 está en producción!

Han pasado 8 años desde que apareció Diablo 2, sin embargo la gente de Blizzard nos ha demostrado una vez más que ha valido la pena esperar. El nuevo Diablo trae un montón de mejoras, pero lo más importante es que el gameplay aún conserva su esencia.

Entre las cosas más resaltantes que dijo el vocero de Blizzard, Rob Pardo (vice-presidente de Diseño de Juego), durante la presentación oficial de Diablo 3 están:

  • El juego aún contará con luchas PvP en línea y con los modos Pesadilla

  • Por los momentos solo se se han revelado la clase Bárbaro y la clase de Doctor Brujo

  • La cantidad total de clases en Diablo 3 será igual a la de Diablo 2 (en su versión original)

  • Contará con modo multijugador a través de battle.net

  • Será por encima de todo un juego cooperativo

  • El jugador ahora contará con unos globos rojos que son soltados por los enemigos y permiten llenar la energía sin tener que usar otros items

  • Una característica muy importante según Blizzard es que el entorno será completamente interactivo

  • La interfaz sigue la misma línea de Diablo 2 pero ahora dispondrá de una Barra de Habilidades para acceder a ellas fácilmente usando la rueda del ratón o la tecla Tab

Aquí tenemos la página oficial de Diablo 3, unas capturas de pantalla publicadas por IGN y la noticia completa desde IGN

Video del Gameplay después del salto.



Entrevista a Richard Stallman desde Chile


Esta vez me topé con una excelente entrevista que le hizo el amigo Eduardo Águila de http://www.tecnologiaslibres.net/ a Richard Stallman desde Chile.

Para mí, Stallman es un ejemplo a seguir. Si no fuera por él, el Software Libre no estaría donde está. Su idealismo (considerado extremismo por algunos), su entrega y su abnegación por la causa es lo que le ha dado vida a este grandioso movimiento y personalmente me siento más motivado cada vez que leo una declaración, una entrevista o algún artículo de Stallman.

A continuación la entrevista.
Eduardo: ¿Hola, como estás :)?

RMS: Tengo un calor insoportable aquí.

Eduardo: ¿Cuando viajaras de nuevo a Chile?

RMS: No tengo un plan de volver a Chile, pero me gustaría ir, cuando haya una invitación con fondos para los costes, y un hueco en mi agenda.

Eduardo: Como lo prefieres ¿”Free Software” o “Software Libre”?

RMS: “Software libre” es más claro, porque no se toma por “software gratuito”. El software libre es el software que respeta la libertad del usuario y la solidaridad social de su comunidad. No es asunto de precio. Por lo tanto, en español no digas nunca “free software”, sino siempre “software libre”. Incluso en inglés digo a veces “libre”.

Peor aun es decir “open source”. Ese término fue inventado para hacer caso omiso de los asuntos éticos. Si comparas la palabra de los activistas de software libre, como yo, y los promovidores de open source, verás una gran diferencia al nivel el más profundo, el de los valores.


Eduardo: ¿Que Sistema Operativo estas usando?

RMS: Uso el sistema GNU con Linux. Básicamente es el sistema operativo GNU, cuyo desarrollo lanc é en 1984, combinado con el kernel Linux, lanzado en 1991 por el Sr. Torvalds.

Pero no uso su versión de Linux, porque contiene programas privativos. Son los “blobs” de firmware que son presientes en los archivos “fuente” de varias pilotas, en la forma de largas listas de números. Es decir, estos archivos no realmente son de código fuente; no obstante, los desarrolladores de Linux los ponen en sus archivos.

Ahora tenemos que mantener otra versión de Linux, llamada Linux Libre, para usar en las versiones libres del sistema GNU/Linux.

Esto nos demuestra que ser libres hoy no garantiza que seremos libres en un año. Mantener la libertad exige defenderla, en todos los aspectos de la vida, incluso la informática.


Eduardo: Cuentanos ¿Como es un día promedio de Richard Stallman, desde que te levantas hasta que te duermes?

RMS: No me gusta tener rutinas, por lo tanto cada día es diferente en los detalles. Lo que puedo decir es que paso mucho tiempo leyendo y contestando mis correos. Mi trabajo se hace usualmente en comunicación, y usualmente por correo. A parte esto, leo mucho excepto el trabajo no me deja tiempo.

Eduardo: ¿Estas desarrollando algún proyecto que nos puedas contar?

RMS: Mi trabajo de hoy en día no es programar, es difundir la filosofía ética de software libre. Por lo tanto, mayormente no tiene la forma de proyectos.

Eduardo: ¿Has pensado en tener hijos?

RMS: La idea de unirse con otro en amor para crear una mezcla es muy romántica, pero las consecuencias son muchas molestias. Por ejemplo, las peleas arruinan el mismo amor, y hay que dedicar la vida al ganar dinero.

El crecimiento de población es también muy malo para el mundo. La población actual parece más que la tierra puede soportar. Estamos estropeando nuestro mundo. El no tener hijos es un acto muy importante para protegerlo.


Eduardo: ¿Deseas agregar algo más?

RMS: La libertad no se defiende sola; tú tienes que defenderla.

Si aprecias el trabajo del movimiento de software libre, y del Proyecto GNU, la mejor manera de agradecernos es contribuir. Programar no es la única manera de contribuir: gnu.org/help sugiere
muchas más.

Para defender tu libertad, tienes que organizar. Si tu país propone firmar un tratado de comercio con los EEUU, casi seguro que es injusto. Organiza para que no se firme, o si ya se firmó, para
anularlo. (El Presidente Correa de Ecuador ha rechazado firmar un tratado; es un muy buen ejemplo.)

Últimamente tienes que resistir la tentación de ceder tu libertad. Por lo tanto, nunca compres ningún producto que implemente la Gestión Digital de Restricciones (es decir, DRM) sin tener acceso personal a las medidas necesarias para superarla.


Esa fue la entrevista, si quieres incluirla en tu website por favor asegurarte de incluir también estos 3 links:

http://gnu.org/help
http://www.tecnologiaslibres.net
http://www.tecnologiaslibres.net/2008/06/29/entrevista-a-richard-stallman-desde-chile/