2009
11.26

Python utiliza el sistema de complemento a 2 para almacenar los enteros en memoria, y generalmente no hay que preocuparse por ello. Sin embargo, a la hora de realizar ciertas operaciones, sí que hay que conocer cómo funciona internamente para comprender por qué muestra luego números negativos.

Este “problema” aparece cuando nuestro código utiliza el operador ~, que se utiliza para invertir de valor los bits de un número. Dicho operador suma 1 al número sobre el que opera, y luego aplica el complemento a 2 al resultado. Veamos cómo:

~192 -> -(1100 0000 + 1) -> 0011 1111 -> -193

Lo que ocurre ahora es que el intérprete pasa a considerar el resultado como un número negativo, y si lo mostramos en pantalla veremos un bonito -193. Esto es totalmente correcto, pero seguramente no lo que se pretendía, así que para conseguir la representación decimal del número hay que aplicar una máscara. Su longitud dependerá del número de bits originales (aquí sí que cuentan los ceros a la izquierda), y en este caso será 1111 1111, obteniendo finalmente 63.

Resumiendo:

>>> ~192
-193
>>> ~192 & 255
63

>>> ~64
-65
>>> ~64 & 255
191
2009
11.25
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (GNU/Linux)

mQINBEjpEp0BEAD7m/bbwXz52Kz8Tc0/FV2Jjpr5GR77LUdD11+W+KxZTjdCAbmr
e7HnqGB4+NAM+W+x2/0F3GimmRrTo+m2fFKfhOpP/mu5dB9r9AYgwyomIhEoLxC2
jawXl8nRi5UmTTJj6N7f4PeTKuuBTrscfJ39M+sW/D2T4z66E8YwRl/6rbvOfoRA
UkQPUq1G7vpq7tWTiNBjXr0bytlg/4/y1zzUvnAII5SaznQzHjpbADF9OB/jbR+r
l0U6eir8KcxeO7bSBPn8RL5n8Etx5mVLTk1Zk7WFh2owoyrpSp+0aigLE+0zjQWX
zm4KnSe4hufaScbW6pzuReAF1RIefZyOOaV5fNDC+jH4eGv9xaLvhlXY8OsH7jd3
Wez65re/ioTeFcyiv+Ha5zclE2h1zg86NAhFtX9ZqpH7v6fIvMfCm+SLgaDprFRd
guRry5B1x8oa4ulpqu+P0ldD1d6tnU8ycul+5mGOgycWTIs9pllvKlwbDWgBh5r2
oMOfuclpC4g+MFjM8ttaEoc7ibp3iT8QJDwzQarMUi1Kp7q5ZtwTOA7GoITH6gRV
EYRZK9BvPoTKNL/UWyxud/kRbZjZZkaKQ/ZjyHbX42FXfQi+Hg4R7dmvbAJo1Aef
bj3OjxcFJVVwxd6ujfPL+HrKh7OypnQiP/WaRzf+eKcBYudhjnGCIqqOuwARAQAB
tC5ZYWdvIE1vdXJpw7FvIE1lbmRhw7FhIDx5bW91cmlub0B5bW91cmluby5jb20+
iQI2BBMBAgAgBQJI6RKdAhsvBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQKlI+
RGMOZ4drvhAAz/N1k8laKt+bPty8RKKKGCW9irT4FYyaSGI859dlpZy+LPoVEdz8
VBW52f8E96JVXLtRKM6fscGVJclZNuW11Lqsr7R7+CSJm/r6MxFAtEIlLGMjr2DM
ThQyRgFQG2ttyLwiyW7XpPvxtLoMn+wu1ucx83O353hXW1NQRMIn2CtVk8dSq7wb
uoa46N6s4SRuDKD57zEYCFR1f3acN4tHYYVrLv+uWfPZtUJj+cCLDg38OdaQD9NI
n0aMR4xlvXBh7W760gzvjJYj3SVb8hKCgA2f1oB/uII83jseHuZUvvIJ0lzuzTmU
xVUdDsm6pu3vWPU3/WRVx90Uu7vs4lGJgAGcX+IcfpcV7ncy0PxROywAaNCaN9gA
bn0xYnfniOO0WQCot3eli0TrsiGTHuSOasuYjehosK8nSh1vaMzoKW5a96Ht7FQ/
PIDzttE6WsstSfsKVIGGAeID/mBYaMOIAb1y/4Jrf3Y9fsADKbV6HYYAbxmBDYFL
tuMSDfNTpPXak0fSURLTIo2n6ME5RppxpnfTR+qTDCgm91DtI2L2Rcg3QNYbLQAM
q2rIDWrXZgnRtA15tTlv+NS+xVRu4kvJEqzL/kqcYF0yJj483vm8tTGyLZKIVGRP
Qv0JJqbJFBbgVgDQ2g/msvAJpjsswZJIIRRB990TV28q2kPAYi1+5pA=
=uEtn
-----END PGP PUBLIC KEY BLOCK-----

Ahí queda, por si alguien quiere usarla.

2009
11.24

Ya he finalizado la restauración de los antiguos artículos del blog, cosa que finalmente no ha sido excesivamente complicada debido a su reducido número. También los he modificado ligeramente donde lo he considerado necesario y han sido eliminados aquellos que ya no tenía sentido conservar.

Por el momento estoy satisfecho con el comportamiento de WordPress, y ya solo queda añadir los pequeños detalles que harán más agradable la navegación. Con un poco de tiempo y paciencia la página volverá a tomar forma.

2009
11.24

Un trabajo difícil de realizar correctamente es, sin duda alguna, el de hacer copias de seguridad sin disponer de herramientas adecuadas. En el pasado he utilizado métodos poco ortodoxos, muy complicados y, sobre todo, nada recomendables de cara a la seguridad e integridad de los datos. Sin embargo, consciente de que debía modificar los procedimientos de la copia, investigué un poco en Internet hasta encontrar una potente herramienta que me ha facilitado enormemente esta labor. El programa rsync ofrece un amplio abanico a la hora de realizar copias de seguridad, y aunque no utilizo todo su potencial, consigo salvaguardar mis datos de una manera sencilla:

rsync -av --delete <origen> <destino>

Cuando finaliza la ejecución, los contenidos del destino son idénticos a los de origen, y gracias a los algoritmos utilizados por la herramienta, la transmisión se ha limitado a lo estrictamente imprescindible.

2009
11.24

A veces, en ciertas distribuciones basadas en Debian, para añadir nuevo software es necesario utilizar nuevos repositorios, y por el funcionamiento de las herramientas necesarias, también será necesario añadir las claves públicas de esos repositorios.

Para ello solo habrá que ejecutar los siguientes comandos:

gpg --keyserver <servidor de claves> --recv-keys <id clave>
sudo gpg --armor --export <id clave> | apt-key add -

El servidor de claves públicas debe contener la clave que queremos (en teoría las propagan, así que podría servir cualquiera). El identificador de la clave que necesitamos lo podemos averiguar escribiendo apt-get update en la consola del sistema (después de haber añadido los nuevos repositorios en el archivo sources.list). Como al ejecutar dicha orden la clave no se encuentra debidamente instalada nos informará de ello ofreciendo, entre otros datos, su identificador.