2014

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2013

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

más...

2011

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2010

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2009

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2008

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2007

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2006

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2005

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2004

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

2003

EneFebMarAbr
MayJunJulAgo
SepOctNovDic

Fotolog

A través del espejo
2010-10-12: A través del espejo
¡La radio habla en binario!
2010-10-10: ¡La radio habla en binario!
Gigaminx (regalo por mi cumple)
2010-09-16: Gigaminx (regalo por mi cumple)
Trini en bici
2010-09-05: Trini en bici
Valporquero
2010-08-28: Valporquero
Mi bici nueva
2010-08-22: Mi bici nueva
Boda de Mario y Ana
2010-08-13: Boda de Mario y Ana
De cañones en Guara
2010-08-07: De cañones en Guara
Trini y Mari en Marbella
2010-08-05: Trini y Mari en Marbella
Trini y Chelo en Tabarca
2010-08-03: Trini y Chelo en Tabarca
Valid XHTML 1.1
Acceder
Etiquetas: venti scripts cómo

Digamos que tienes un servidor venti y quieres hacer un mirror (espejo) de su contenido, copiando sus datos a otro servidor, ¿cómo podría hacerse?

Primero, hace falta tener otro servidor venti configurado. Echa un vistazo a la página de manual venti(8) para saber cómo hacerlo, o mira mi entrada acerca de cómo configurar un servidor venti. Ten en cuenta que, si los dos servidores se van a ejecutár simultáneamente en la misma máquina, deben escuchar en puertos TCP diferentes.

Hay varias maneras de copiar el contenido de un servidor venti en otro:

  • venti-copy

    Con venti-copy se puede copiar un árbol completo de bloques de un servidor a otro. Ambos servidores deben estar en ejecución para poder copiar los bloques.

    Si tienes los scores de todos los árboles a copiar en el fichero scores.txt, puedes usar la siguiente orden para copiarlos:

    cat scores.txt | while read score ; do venti-copy $venti1 $venti2 $a ; done

    Ventajas: no necesitas parar ninguno de los servidores; las particiones arena de cada servidor pueden tener distinta geometría.

    Desventajas: es muy lento, y necesitas saber a priori la lista de los scores de los VtRoot que quieres copiar.

  • venti-mirrorarenas

    Esta orden se puede usar para copiar cada arena de una partición a otra. Los servidores venti deben estar parados.

    Ventajas: es muy rápido, y se hacen comprobaciones para asegurarse de que las geometrías son idénticas.

    Desventajas: solo funciona si el origen y el destino tienen exactamente el mismo número de arenas del mismo tamaño; después de terminar la copia, debes usar venti-buildarenas en el servidor destino.

  • venti-rdarena y venti-wrarena

    venti-rdarena lee una arena de un servidor venti y la escribe por la salida estándar; venti-wrarena escribe una arena de un fichero a un servidor venti. arena from a file to a venti server.

    Para poder copiar un servidor venti, es necesario leer todas las arenas con venti-rdarena, una a una, para luego escribirlas en otro servidor con venti-wrarena. Ambos servidores deben estar parados para esto.

    Ventajas: funciona incluso si el origen y el destino tienen distinto número de arenas; es más rápido que venti-copy.

    Desventajas: solo funciona si el origen y el destino tienen arenas del mismo tamaño; es muy lento si los servidores venti tienen muchas arenas (cada invocación de estos programas leen todo el mapa de arenas); después de terminar la copia, debes usar venti-buildindex en el servidor destino.

  • Copiar todas las arenas a mano

    Si puedes averiguar la posición de cada arena dentro de la partición, y su tamaño, puedes copiar las arenas simplemente con dd. Ambos servidores deben estar parados para esto.

    Por ejemplo, si has formateado las particiones arena con el tamaño de arena y tamaño de bloque por defecto, las arenas tendrán 512MB (536870912 bytes), y estarán situadas en la posición 794624 + 536870912*n. Por lo tanto, podría ejecutar el siguiente bucle para copiar de la arena $start a la $end, del fichero $orig al $dest:

    for i in $( seq $start $end )
    do
      echo "Copying arena $i from $start to $end..."
      skip=$(( 97 + $i * 65536 ))
      dd if="$orig" bs=8192 skip=$skip count=65536 seek=$skip of="$dest"
    done

    Ventajas: es muy rápido.

    Desventajas: solo funciona si el origen y el destino tienen arenas del mismo tamaño; debes asegurarte de que las arenas están situadas exactamente donde las estás leyendo y escribiendo; después de terminada la copia, debes usar venti-buildindex en el servidor destino.

En ocasiones, tenemos un fichero PDF que queremos reducir en tamaño, sin alterar su contenido y sin poder regenerarlo.

Para ello, podemos utilizar gs de la siguiente manera:

     gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
       -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

La opción -dPDFSETTINGS=/screen indica que queremos optimizar el PDF para mostrarlo por pantalla: máxima compresión, a costa de una peor calidad en las imágenes.

En lugar de /screen se puede especificar /ebook para seguir reduciendo el tamaño, pero aumentando algo la calidad.

Desde hace unos años, es habitual ver cientos de intentos de conexión al puerto SSH, intentando usuarios y passwords habituales.

Esto tiene varios inconvenientes: los logs se pueden llenar, el servicio SSH puede dejar de responder de manera adecuada y, lo que es peor, es posible que alguno de los ataques tenga éxito si algún usuario tiene una password poco segura.

Para evitarlo, se pueden usar estas simples reglas de iptables que impiden que desde una misma dirección IP se puedan establecer más de 6 conexiones SSH por minuto:

iptables -N SSH_CHECK
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_CHECK
iptables -A SSH_CHECK -m recent --set --name SSH
iptables -A SSH_CHECK -m recent --update --seconds 60 --hitcount 6 --name SSH -j DROP
Etiquetas: LaTeX cómo

In LaTeX hay 10 caracteres especiales:

# $ % & \ ^ _ { } ~

La mayor parte de ellos se pueden escapar con una barra invertida delante (\), pero \, ^ y ~ necesitan algo más:

  • para la barra invertida (\) hay que usar \textbackslash{}
  • para el acento circunflejo (^) hay que usar \^{} o \textasciicircum{}
  • y para la virgulilla (~) hay que usar \~{} o \textasciitilde{}

Resumiendo:

Para conseguirHay que usar
#\#
$\$
%\%
&\&
\\textbackslash{}
^\textasciicircum{}
_\_
{\{
}\}
~\textasciitilde{}
Etiquetas: emacs cómo

Si quieres poner un GNU Emacs en pantalla completa, hay 3 cosas que deberías hacer:

  • Desactiva la barra de botones
    Esto se puede hacer ejecutando (desde dentro de Emacs) (tool-bar-mode -1)
  • Desactiva el menú
    Para hacerlo, ejecuta (menu-bar-mode -1)
  • Pasar a modo pantalla de completa
    Hay que ejecutar (set-frame-parameter nil 'fullscreen 'fullboth)

Si quieres tener siempre deshabilitada la barra de botones y el menú, como yo, y quieres poder pasar a pantalla completa con una tecla (por ejemplo, F11), añade esto a tu .emacs:

;; F11 = Full Screen
(defun toggle-fullscreen (&optional f)
  (interactive)
  (let ((current-value (frame-parameter nil 'fullscreen)))
    (set-frame-parameter nil 'fullscreen
      (if (equal 'fullboth current-value)
        (if (boundp 'old-fullscreen) old-fullscreen nil)
        (progn (setq old-fullscreen current-value)
          'fullboth)))))
(global-set-key [f11] 'toggle-fullscreen)

;; Disable tool-bar
(tool-bar-mode -1)

;; Disable Menu Bar
(menu-bar-mode -1)
Etiquetas: SQL cómo
Para aprender cómo implementar búsquedas sencillas en campos de texto de una base de datos PostgreSQL hay que utilizar dos funciones: to_tsvector() y plainto_tsquery(), y un operador binario, @@.
  • to_tsvector() convierte una lista de palabras en una lista de lexemas significativos con las que poder hacer operaciones de búsqueda. Ejemplo:
    postgres=> SELECT to_tsvector('spanish','cómo cazar un león');
           to_tsvector
    --------------------------
     'caz':2 'com':1 'leon':4
    (1 row)
    

    Para evitar tener que estar poniendo 'spanish' continuamente, si nuestra base de datos tiene información únicamente en español, podemos cambiar el lenguaje de búsquedas por defecto de la base de datos, con:

    ALTER DATABASE cuevasysimas set default_text_search_config = 'spanish';
    

  • plainto_tsquery() se utiliza para convertir una cadena en un patrón de búsqueda
  • @@ se usa para comprobar si se encuentra un patrón de búsqueda en una lista de lexemas:
    postgres=> SELECT to_tsvector('cómo cazar un león') @@ plainto_tsquery('cazando leones');
     ?column?
    ----------
     t
    (1 row)
    
Por ejemplo, si tenemos una tabla de libros, con las columnas 'titulo' y 'resumen', y queremos mostrar el título de los libros que concuerdan con una búsqueda en el resumen, podemos hacer:
postgres=> SELECT titulo FROM libro WHERE to_tsvector(resumen) @@ plainto_tsquery('palabra');
Etiquetas: seguridad scripts cómo

Si quieres tener un fichero cifrado, de manera que nadie pueda ver su contenido a no ser que sepa la contraseña, puedes usar "gpg" para cifrarlo y descifrarlo. Sin embardo, su uso es un poco complicado.

Por lo tanto, he escrito un pequeño script, llamado "gpg-vi", que pregunta una contraseña, y permite editar un fichero cifrado simétricamente usando GnuPG con esa contraseña.

El script no permite que nadie más en la máquina pueda ver el contenido del fichero, pero atención: el script escribe el contenido del fichero en claro en un fichero temporal, de manera que alguien más que use tu UID, o root, podría ver el contenido mientras la edición no haya terminado (o incluso después, porque el contenido puede estar aún en algún lugar del disco después de borrar el fichero).

Etiquetas: SQL Perl cómo

(o cómo usar Tablas de Historia en PostgreSQL)

Si quieres guardar en algún lugar la historia completa de todas las inserciones, modificaciones y eliminaciones de columnas en tus tablas (para mantener una base de datos estilo wiki), no hay ninguna manera directa de hacerlo... pero aquí puedes ver cómo hacerlo, en un artículo escrito por Thomas Liske.

Funciona con PostgreSQL, creando un trigger escrito en PL/Perl llamado log_history() que añade una línea a una tabla llamada history.<SCHEMA>_<TABLENAME> con un instante de tiempo (hist_ts), la operación realizada (hist_op) y el contenido de todas las columnas, cada vez que se ejecuta un INSERT, UPDATE o DELETE. Esto realmente almacena toda la historia de las tablas en las que se use este trigger.

Aquí puedes ver el trigger log_history, y una función sencilla que activa el trigger en todas las tablas de un schema, history_create_triggers. Puedes llamar a esta función para el schema "public" usando SELECT history_create_triggers('public');

Estas dos funciones están escritas en PL/Perl y PL/pgSQL, respectivamente, así que tendrás que añadir esos dos lenguajes a tu base de datos PostgreSQL, si no lo has hecho ya, con CREATE LANGUAGE plperl; y CREATE LANGUAGE plpgsql;

Etiquetas: divertido Rubik cómo
  1. Coloca las aristas blancas. El cubo resultante debería quedar así:
  2. Coloca las esquinas blancas:
  3. Segunda capa: dale la vuelta al cubo, de manera que la cara blanca esté abajo. Ahora, para acabar las dos primeras capas, hay que colocar las cuatro aristas restantes que tienen ningún lado amarillo:
    U R U R' U' F' U' F U' L' U' L U F U F'
  4. Orienta las aristas amarillas:
    F U R U' R' F' F R U R' U' F'
  5. Coloca las esquinas amarillas:
    L U' R' U L' U' R U2
  6. Orienta las esquinas amarillas:
    R U R' U R U2 R' U2 R' U' R U' R' U2 R U2
  7. Coloca las aristas amarillas:
    R2 U F B' R2 F' B U R2 R2 U' F B' R2 F' B U' R2
Etiquetas: LaTeX cómo

De vez en cuando, al escribir un documento en LaTeX, nos encontramos con líneas demasiado largas, las llamadas "overfull", porque LaTeX no separa las palabras correctamente. Para corregir esto, hay tres parámetros que se pueden cambiar: \pretolerance, \tolerance y \emergencystretch.

\pretolerance se usa para indicar cuándo hay demasiado espacio entre palabras para que haga falta intentar separarlas con guiones; \tolerance indica cuándo hay demasiado espacio entre palabras después de haberlas separado.

Si lo que queremos es que nunca se separen palabras con guiones, y que nunca haya líneas demasiado largas, basta con poner un valor para \pretolerance suficientemente elevado. El valor 10000 indice "infinito".

Para poner este valor, hay que hacer:

\pretolerance=10000