Cambio de blog

12 Diciembre 2006 at 16:58 | In Personal | No Comments

No he durado mucho tiempo aquí, aunque esta muy bien, me he pillado un plan de hosting en DreamHost, para poder alojar más cosas además del blog y tener más control (creo) sobre él.

Así que la nueva dirección del blog es:

http://blog.inbatu.com

Saludos

Combinaciones de GNU/Emacs

3 Noviembre 2006 at 20:45 | In GNU/Emacs | No Comments

Comandos básicos

Los comandos que pongo aquí son de la forma C-x, M-x, esto quiere decir, en el caso de C-x que debemos pulsar la tecla CONTROL y a la vez la tecla x. En el caso de M-x debemos pulsar la tecla META (ALT ó ESC) y a la vez la tecla x. Bueno, una vez aclarado esto paso a listar un resumen de los comandos básicos.

Nota: Entre paréntesis pondré el nombre largo del comando por ejemplo find-file, que se corresponde con el atajo C-x C-f, con lo cual podremos ejecutar este comando o bien mediante el atajo o bien haciendo M-x find-file RETURN.

Abrir, insertar y guardar ficheros

  • C-x C-f (find-file): Abre un fichero existente o si no abre uno nuevo.
  • C-x C-v (find-alternate-file): Carga un fichero diferente en ese mismo buffer, nos sirve si por ejemplo queriamos abrir un fichero y nos hemos equivocado al escribir el nombre.
  • C-x i (insert-file): Inserta el contenido de un fichero dentro del buffer actual (en la posición del cursor).
  • C-x C-s (save-buffer): Guarda el contenido del buffer en el fichero asociado (y si no lo tiene pregunta el nombre de fichero con el que guardarlo).
  • C-x C-w (write-file): Guarda el contenido del buffer preguntando el nombre del fichero en el que guardar.
  • C-x C-c : Sale de emacs, preguntando si guardar los cambios o no en caso de que hayan buffers modificados sin guardar.

Ayuda

  • C-h ? (help): Muestra las opciones de ayuda de Emacs.
  • C-h t (help-with-tutorial): Inicia un tutorial de introducción a Emacs.
  • C-h k (describe-key): Muestra información sobre una combinación de teclas. Por ejemplo C-h k C-x i muestra una descripción del comando insert-file.
  • C-h f (describe-function): Muestra información sobre un comando. La información mostrada es la misma que en el anterior pero en lugar de pasarle una combinación de teclas le pasamos el comando directamente.

Moviéndonos por los ficheros

  • C-f (forward-char): Mueve el cursor un carácter hacia adelante.
  • C-b (backward-char): Mueve el cursor un carácter hacia atrás.
  • C-p (previous-line): Mueve el cursor a la línea anterior.
  • C-n (next-line): Mueve el cursor a la línea siguiente.
  • M-f (forward-word): Mueve el cursor una palabra hacia adelante.
  • M-b (backward-word): Mueve el cursor una palabra hacia atrás.
  • C-a (beginning-of-line): Mueve el cursor al principio de la línea.
  • C-e (end-of-line): Mueve el cursor al final de la línea.
  • M-a (backward-sentece): Mueve el cursor una frase hacia atrás.
  • M-e (forward-sentece): Mueve el cursor una frase hacia adelante.
  • M-{ (backward-paragraph): Mueve el cursor un párrafo hacia atrás.
  • M-} (forward-paragraph): Mueve el cursor un párrafo hacia adelante.
  • C-x [ (backward-page): Mueve el cursor una página hacia atrás.
  • C-x ] (forward-page): Mueve el cursor una página hacia adelante.

    Nota: Emacs se mueve entre páginas usando un delimitador de página (que se define mediante la variable page-delimiter). En el modo texto el delimitador de página (no imprimible) se puede insertar mediante C-q C-l (L minúscula), que insertará ^L que aunque parezcan dos carácteres es uno solo.

  • C-v (scroll-up): Avanza una pantalla hacia adelante, mostrando dos líneas de la pantalla anterior.
  • M-v (scroll-down): Avanza una pantalla hacia atrás
  • M-> (end-of-buffer): Lleva el cursor al final del fichero.
  • M-< (beginning-of-buffer): Lleva el cursor al principio del fichero.
  • M-x goto-line n RETURN: Mueve el cursor a la línea n del fichero.
  • M-x goto-char n RETURN: Mueve el cursor al carácter n del fichero.

Repetir comandos

  • M n (digit-argument): Repite el comando escrito a continuación n veces.
  • C-u n (universal-argument): Hace exactamente lo mismo que la anterior.
  • C-u: Este comando sin argumentos repite el comando escrito a continuación 4 veces. Si hacemos C-u C-u lo repetiría 16 veces, C-u C-u C-u 64 veces, etc.

Redibujar la pantalla

  • C-l (recenter): Redibuja la pantalla, poniendo la línea actual en el centro.

    Este comando es útil cuando por ejemplo estamos editando en consola y el kernel nos tira mensajes, con este comando emacs redibuja la pantalla con la información del buffer. También nos es útil si estamos editando una porción de texto que nos aparece al final del display, usamos este comando y nos centra la línea actual, así vemos lo que tenemos por encima y por debajo.

Haciendo amigos en C++

3 Noviembre 2006 at 15:25 | In C++, Programación | No Comments

Mediante el uso de la palabra clave friend podemos permitir el acceso a miembros privados o protegidos de una clase a funciones que no pertenecen a esa clase o a permitir el acceso a otras clases. Veremos dos casos ejemplo, declarando una función como friend dentro de la interfaz pública de una clase y declarando una clase como amiga.

Funciones friend

Cuando declaramos una función como friend en una clase estamos indicando que esa función tendrá acceso a los miembros privados de la clase, pero la función en cuestión no forma parte del ámbito de la clase. Veamos un ejemplo:

Supongamos que tenemos una clase que representa un número racional como un par de números enteros. Queremos que este tipo nuevo se pueda usar de igual forma que int, double,… así:

Racional r(2,3);
cout << r << endl;

Para poder hacer esto necesitamos sobrecargar el operador de inserción binario operator<<:

class Racional
{
     friend ostream &operator<<(ostream &out, const Racional &r);
     public:

     Racional(int numerador, int denominador);
     ~Racional();
     // ...
};


De esta manera la función friend obtiene acceso completo a los miembros de Racional. La implementación de esta función se haría, fijándonos en que no pertenece al ámbito de la clase:

ostream &operator<<(ostream &out, const Racional &r)
{
     // Acceso a los miembros privados de Racional para mostrar r.
     // ...

     return out;
}


Podríamos haber declarado la función como no friend, entonces tendríamos que usar métodos públicos get(), set() para obtener los valores, usando friend podemos acceder directamente a los miembros, y además la función forma parte de la interfaz pública de la clase Racional.

Clases friend

Además de declarar una función no miembro como friend, podemos declarar funciones miembro de otras clases como friend, así como otras clases como clases amigas.

Las clases amigas se usan en casos donde una clase está íntimamente ligada a otra. Por ejemplo supongamos que tenemos una clase Punto que representa una coordenada, y una clase ColeccionPunto que guarda una lista de puntos. Como la colección quizá necesite manipular objetos Punto, podemos declarar ColeccionPunto como amiga de la clase Punto:

// Clase Punto
class Punto
{
     friend ColeccionPunto;

     public:
     Punto(double x, double y) :
     m_x(x),
     m_y(y)
     {
     }

     ~Punto();
     // ...

     private:
     double m_x;
     double m_y;
};


Como la clase ColeccionPunto esta declarada como friend, puede acceder a los datos internos de cualquier objeto Punto. Una cosa importante es que esta amistad no es mútua, aunque ColeccionPunto puede acceder a Punto no se da el caso inverso. Además la amistad no es heredable, las clases que deriven de ColeccionPunto no podrán acceder a Punto. El principio detrás de esto es que la amistad no se concede de forma implícita sino que cada clase debe especificar de forma explícita sus amigos.

Creación de un repositorio Debian (2ª parte)

15 Octubre 2006 at 14:25 | In Debian, GNU/Linux | No Comments

Conforme terminamos lo explicado en la primera parte nuestro repositorio no utiliza firmas. Para ello deberemos firmar los Release con gpg, para lo cual necesitamos habernos creado una clave.

Generación de una clave

Simplemente hemos de ejecutar el siguiente comando:

gpg --gen-key

Nos hará una serie de preguntas, entre ellas nos pedira un passphrase, que sera la clave privada.

Más adelante necesitaremos importar la clave pública para usar el repositorio, la exportamos con el siguiente comando:

gpg -a --export > clave_publica.gpg

Firma de los Release

Ahora que ya poseemos una clave para firmar el repositorio tenemos que firmar los Release de cada uno de los directorios:

cd dists/sarge
gpg -bao Release.gpg Release

cd main/binary-i386
gpg -bao Release.gpg Release

Esto nos pide el passphrase que introdujimos al generar la clave, y nos genera un fichero Release.gpg. Pues bien una vez hemos firmado todos los ficheros Release ya tenemos firmado el repositorio.

Importando la clave pública

Ahora lo único que nos falta es importar la clave pública exportada anteriormente en cada una de las máquinas que utilizan el repositorio:

apt-key add clave_publica.gpg

Si no hacemos este último paso el apt de cada máquina no reconocerá como firmados los Release

Creación de un repositorio Debian automático

14 Octubre 2006 at 17:59 | In Debian, GNU/Linux | 1 Comment

En este post voy a explicar cómo crear un repositorio para alojar nuestros propios paquetes .deb . Para ello necesitaremos tener instalado el paquete apt-utils que seguramente ya lo estará.

Preparando el repositorio

Antes que nada deberemos crear un directorio raíz donde se hallará el resto de directorios y ficheros. Por ejemplo creamos el directorio /var/repo.

Una vez creado el raíz habrá que crear dentro de el la estructura de directorios, por ejemplo para la distribución sarge creamos la siguiente estructura:


/dists
/dists/sarge
/dists/sarge/contrib
/dists/sarge/contrib/binary-i386
/dists/sarge/contrib/source
/dists/sarge/main
/dists/sarge/main/binary-i386
/dists/sarge/main/source
/dists/sarge/non-free
/dists/sarge/non-free/binary-i386
/dists/sarge/non-free/source

Donde vemos que primero se crea el directorio dists, donde luego habrá un directorio por cada distribución (en nuestro caso solo sarge). Dentro de la distribución (sarge) tendremos las diferentes secciones, main para paquetes libres, non-free para paquetes no libres, y contrib para paquetes libres que dependen de otros paquetes que no lo son.

Una vez creadas las secciones creamos un directorio para los binarios, binary-<arquitectura> en este caso como serán exclusivamente para arquitectura i386 solo necesitaremos binary-i386, y un directorio para los fuentes, source.

Llenando el repositorio

Una vez creada la estructura ya podemos alojar nuestros paquetes. Para ello tenemos que copiar los .deb correspondientes a paquetes binarios en los directorios binary-i386 de cada sección. Si además queremos distribuir los fuentes copiaremos los ficheros .dsc -diff.tar.gz .orig.tar.bz en los directorios source.

En cada directorio binary-i386 y source necesitamos un fichero Release cuyo contenido sería el siguiente:


Archive: stable
Component: main
Origin: <Tu nombre u organizacion>
Label: <Una etiqueta descriptiva>
Architecture: <Arquitectura de tu procesador o “source” para los directorios de fuentes>

Ficheros de configuración

Necesitamos dos ficheros de configuración:

  • apt-sarge-release.conf
  • apt-ftparchive.conf

Ambos ficheros los pondremos en el directorio raíz del repositorio. Y su contenido sería el siguiente:

apt-sarge-release.conf


APT::FTPArchive::Release::Origin “Tu nombre u organizacion”;
APT::FTPArchive::Release::Label “Etiqueta descriptiva”;
APT::FTPArchive::Release::Suite “stable”;
APT::FTPArchive::Release::Codename “sarge”;
APT::FTPArchive::Release::Architectures “i386 source”;
APT::FTPArchive::Release::Components “main contrib non-free”;
APT::FTPArchive::Release::Description “Descripcion detallada”;

apt-ftparchive.conf

Dir {
  ArchiveDir ".";
  CacheDir ".";
};

Default {
  Packages::Compress "gzip bzip2";
  Sources::Compress "gzip bzip2";
  Contents::Compress "gzip bzip2";
};

BinDirectory "dists/sarge/main/binary-i386" {
  Packages "dists/sarge/main/binary-i386/Packages";
  Contents "dists/sarge/Contents-i386";
  SrcPackages "dists/sarge/main/source/Sources";
};

BinDirectory "dists/sarge/contrib/binary-i386" {
  Packages "dists/sarge/contrib/binary-i386/Packages";
  Contents "dists/sarge/Contents-i386";
  SrcPackages "dists/sarge/contrib/source/Sources";
};

BinDirectory "dists/sarge/non-free/binary-i386" {
  Packages "dists/sarge/non-free/binary-i386/Packages";
  Contents "dists/sarge/Contents-i386";
  SrcPackages "dists/sarge/non-free/source/Sources";
};

Tree "dists/sarge" {
  Sections "main contrib non-free";
  Architectures "i386 source";
};

Default {
  Packages {
    Extensions ".deb";
  };
};

Una vez tenemos los ficheros de configuración adecuados a nuestras necesidades hemos de ejecutar un par de comandos, los cuales podemos meter en un script llamado por ejemplo update-archive.sh:


#!/bin/sh
apt-ftparchive generate apt-ftparchive.conf
apt-ftparchive -c apt-dapper-release.conf release dists/dapper/ >dists/dapper/Release

Actualizando el repositorio

Una vez hemos puesto los paquetes dentro de los directorios correspondientes de su sección ejecutamos el script update-archive.sh, obteniendo una salida como la siguiente:

$ ./update-archive.sh
 dists/sarge/main/binary-i386: 21 files 42.7MB 2s
 dists/sarge/contrib/binary-i386: 0 files 0B 0s
 dists/sarge/non-free/binary-i386: 4 files 114MB 5s
 dists/sarge/main/binary-i386/: 21 files 42.7MB 0s
 dists/sarge/contrib/binary-i386/: 0 files 0B 0s
 dists/sarge/non-free/binary-i386/: 4 files 114MB 0s
 dists/sarge/main/source/: 2 pkgs in 0s
 dists/sarge/contrib/source/: 0 pkgs in 0s
 dists/sarge/non-free/source/: 0 pkgs in 0s
Done Packages, Starting contents.
Done. 314MB in 50 archives. Took 7s

Usando el repositorio

Después de los pasos anteriores ya podemos utilizar el repositorio modificando el fichero /etc/apt/sources.list:

  • Para acceso localdeb file:///var/repo sarge main contrib non-free
  • Para acceso remoto (si por ejemplo hacemos un enlace simbólico a /var/svn dentro del direcorio de un servidor http):deb http://nuestro.servidor/repositorio sarge main contrib non-free

Nota

Este post es prácticamente una traducción de un howto cuyo link es este.

En un próximo post pondré como añadir nuestra firma al repositorio con gpg.

Probando con Flock

14 Junio 2006 at 21:26 | In Software Libre | No Comments

Pues estoy probando el nuevo navegador este. Es un firefox (calcado) con algunas funcionalidades interesantes. Como esta que estoy gastando ahora mismo, posteando en el blog directamente desde el navegador (File -> New Blog post…), también se pueden subir fotos a Flickr y Photobucket, compartir los marcadores con del.icio.us, notificaciones de technorati, y un agregador de feeds. Muy chulo la verdad.

Como curiosidad, lleva como buscador por defecto Yahoo! en lugar de Google.

technorati tags:, , ,

Blogged with Flock

Probando con Swing

24 Abril 2006 at 16:05 | In Java, Programación | No Comments

Pues ya que lo estoy dando en clase, me ha dado por probar un poco con swing. El resultado es un pequeño, sencillo y poco usable programa que me he hecho para gestionar libros, mediante una base de datos mysql.

En concreto usando JDBC con el driver de mysql. Tiene muchos fallos y no funciona demasiado bien, pero ahi esta.

Código fuente

Por fin tengo un portátil

24 Abril 2006 at 15:50 | In Personal | No Comments

Pues sí, me salio una oferta y no la pude dejar pasar. El cacharro en cuestión es un HP Pavilion ze4930ea (1.5Ghz, 512 RAM, 40 Gb de disco, tarjeta wireless Intel PRO Wireless 2200…).

Empecé poniendole una Ubuntu Breezy, pero la tarjeta inalámbrica me daba muchos fallos (kernel panic), despues probé una fedora core 5 y más de lo mismo. Compilando el driver a mano, con ndiswrapper y nada. Al final he puesto una Ubuntu Dapper y va a las mil maravillas.

Encontrar procesos zombi

23 Noviembre 2005 at 19:33 | In GNU/Linux | 1 Comment

Cuando tenemos una máquina que no funciona correctamente es posible que los procesos estén en estado zombi. Para poder ver los procesos en este estado usamos el comando siguiente:

ps -el | grep 'Z'

Con el comando ps -el se puede obtener una salida en la que la segunda columna indica el estado del proceso. Existen varios estados:

S : sleeping
R : running
D : waiting
T : gestopt (suspended)
Z : zombie (defunct)

Un ejemplo podría ser el siguiente:

# ps -el | grep 'Z'
F S UID  PID  PPID  C PRI NI ADDR  SZ WCHAN  TTY  TIME    CMD
1 Z   0 1213   589  0  75  0    -   0 funct> ?   00:00:00 dovecot-auth 

Donde vemos que el proceso dovecot-auth está en estado zombi.

Creación de paquetes

21 Noviembre 2005 at 21:32 | In Debian | No Comments

Hoy he descubierto un programa bastante interesante para generar paquetes para las distribuciones más usadas, entre ellas como no Debian. El programa en cuestión es Checkinstall. Nos permite generarnos debs a partir del código fuente de forma tan fácil como:

./configure

make

checkinstall

Al ejecutar el checkinstall este nos pregunta acerca de la descripción que queremos poner al paquete, el tipo de paquete(RPM, DEB o SLACKWARE TGZ), así como el maintainer, version, licencia… Y después de indicárselo tendremos en el directorio nuestro programa en forma de paquete deb/rpm/tgz. Además el programa nos permite poner documentación que luego se instalará en /usr/share/doc, también podemos ejecutar scripts preinstall/postinstall y preremove/postremove y puede que más cosas que no he mirado.

Entradas siguientes »

Blog de WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.