Grandes frases

Hoy me encontré con esto, ¿quien no lo pensó alguna vez?... ¿quien no lo pone en práctica todos los días :P?

Calvin y Hobbes

Hobbes: Pensé que íbamos a hacer la cama.

Calvin: ¿!¿ Y Hacer todo ese trabajo ?!? ¡No, vamos a inventar un robot que haga la cama por nosotros!

Hobbes: ¿Inventar un robot no es más trabajo que hacer la cama?

Calvin: Solo es trabajo si alguien te obliga a que lo hagas.

Sobre el `branching prediction` en x86

En cierto tablón de discusión, de cuyo nombre no quiero acordarme se hablaba sobre la optimización de switches en SBCL (un intérprete/compilador de common lisp), que hacía una serie de CMP, JMP en vez de usar una table, alguien daba como motivo el "branch prediction", parecía poco probable pero algo entretenido de probar.

Nota: mi experiencia con ensamblador es bastante limitada, así que lo que resulte de esto creételo lo justo ;)

Recuperando un archivo eliminado pero abierto por otro proceso

Hoy, hace escasos 10 minutos estaba limpiando el disco, así que me dirijí a la carpeta de vídeos y... ¡raaaaca!, 20 archivos a alimentar la bestia del espacio libre. Pero al ver los archivos que habían sobrevivído a la limpieza sobrevino la preocupación sobre el paradero de uno de ellos, y es que quizá al fin y al cabo saltarse el paso de la papelera de reciclaje no fuera buena idea.

El problema era que me había cargado una película que tenía pensado compartir y con más bien pocos seeders, así que tocaba recuperarlo. Por suerte el transmission seguía abierto y seedeando, así que aún había esperanza, al fin y al cabo aún contaría con la información del archivo.

Los pasos a seguir fueron localizar primero el proceso

1
2
3
$ ps aux|grep transmission
1000      8546  0.0  0.0  12956   920 pts/5    S+   16:33   0:00 grep --color=auto transmission
1000     26127  5.6  2.3 402320 23784 ?        Ssl  11:54  15:40 transmission-gtk

Escribiendo un salvapantallas para Gnu/Linux [C]

Los salvapantallas son algo que siempre me llamó poderosamente la antención pero hasta hace poco no sabía como se escribían, hoy aprenderemos a hacer uno para el XScreensaver de Gnu/Linux.

El primer paso es hacernos con el archivo vroot.h del xscreensaver (si hacemos apt-get source xscreensaver nos lo encontraremos en el directorio utils/ [o aquí]), y meterlo en el mismo directorio en el que desarrollaremos el resto del código. vroot.h es un archivo (bajo licencia de estilo BSD) usado comunmente para tomar al ventana_raíz, en la que tenemos que escribir si, por ejemplo, queremos hacer un salvapantallas.

Empezamos entonces con nuestro archivo, lo llamaremos salvapantallas.c y empezamos con el código, si bien va todo junto los comentarios hacen las "presentaciones":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

Activando los logs generales de MySQL sobre la marcha [tip]

Suponed que estamos programando algo que hace uso de una base de datos MySQL y que de repente comienza a comportarse de forma extraña, como podemos saber que peticiones hace, pues activando los logs generales así:

1
2
3
set global general_log_file = '/var/log/mysql/mysql.log';
-- El archivo puede ser cualquiera, no?
set global general_log = 1;

Lo malo es que hace falta ser root para poder hacerlo (y que el rendimiento cae, claro, no es algo que deba estar siempre activo).

Happy debugging.

Llevando la contraria sobre la sintaxis de arrays en C

Hola, hoy quería mostrar una pequeña ida de olla, hechadle un vistazo al siguiente código:

1
2
3
4
5
6
7
8
int main(int argc, char  **argv){ 
    char *x = "Hola, mundo!\n";
    int i;
    for (i = 0; i[x] != '\0';i++){
         putchar(i[x]);
    }
    return 0;
}

Compila, y hace lo que parece, pero tiene algo extraño... el orden variable [posición] está invertido, por que sigue funcionando.

Lo que pasa es que la posición de memoria se calcula como <dirección a la que apunta 'variable'> + (<posición> * <tamaño de una unidad de la variable>). Para los strings, el "tamaño de una unidad" es 1, así que queda como: <dirección a la que apunta variable> + <posición>, la suma es conmutativa, así que las posiciónes se pueden intercambiar.

ps: Obviamente esto no se debería hacer en código "real", por lo que pueda pasar si cambian los tipos de datos ;)

Saludos

ARC4 en Lisp

Últimamente he estado trasteando con Common Lisp, y ya que tengo la constumbre de escribir una implementación de ARC4 como prueba de un lenguaje, ahí va una (está comentada de más precisamente para servir como ejemplo):

Eliminar el 'Compressed Header' de los vídeos MKV [tip]

El formato matroska tiene una característica (opcional) 'Compressed_Header' que puede traer problemas si intentamos convertir un vídeo desde este formato con mencoder, la forma de crear un archivo sin esta característica es sencilla:

1
mkvmerge -o archivo_para_convertir.mkv archivo_original.mkv

mkvmerge forma parte del paquete mkvtoolnix, así que se puede instalar en los derivados de debian con

1
sudo apt-get install mkvtoolnix
Newer posts Older posts