Descifrando al César en Bash

Después de ver cómo se descifra al César en Python, me he encontrado con un par de maneras elegantes de hacerlo desde Bash. Cifrado César Con tr: $ echo "lorem ipsum dolor sit amet" | tr 'a-z' 'd-za-c' oruhp lsvxp groru vlw dphw $ echo "oruhp lsvxp groru vlw dphw" | tr 'd-za-c' 'a-z' lorem ipsum dolor sit amet Con sed también se puede conseguir, aunque es bastante más laborioso: $ echo "lorem ipsum dolor sit amet" | sed -e "y/abcdefghijklmnopqrstuvwxyz/defghijklmnopqrstuvwxyzabc/" oruhp lsvxp groru vlw dphw $ echo "oruhp lsvxp groru vlw dphw" | sed -e "y/abcdefghijklmnopqrstuvwxyz/defghijklmnopqrstuvwxyzabc/" lorem ipsum dolor sit amet ROT13 Con tr: ...

February 16, 2011 · 1 min · 205 palabras · Nacho Cano

Descifrando al César en Python

Si lo que pretendemos es, dada una cadena, sustituir una serie de caracteres por otra, en Python es tan sencillo como pasarle al método maketrans una cadena con los caracteres que queremos cambiar y otra con los caracteres a utilizar en su lugar. Ambas cadenas deberán tener la misma longitud. Este método devuelve una tabla de traducción, un objeto susceptible de ser usado por el método translate el cual se aplica sobre un string, como veremos. ...

February 16, 2011 · 5 min · 935 palabras · Nacho Cano

Póster casero

Si tenemos una imagen y queremos crear un póster impreso (y montado a base de folios) por nosotros mismos podemos utilizar un servicio como Block posters. También podemos utilizar los comandos convert y pdfposter para conseguir lo mismo. Primero creamos un PDF a partir de la imagen, en este caso del mapa del software libre: $ convert mapa-del-software-libre.png mapa-del-software-libre.pdf Ahora ya podemos crear el póster: ...

December 11, 2010 · 1 min · 136 palabras · Nacho Cano

Intercambio de los valores de dos variables

En algunos lenguajes, intercambiar el valor de la variable a por el de la variable b implica, explícitamente, utilizar una variable temporal: t = a; a = b; b = t; En Python: a, b = b, a Pero esperen, aún hay más: a, b, c, d = d, c, b, a Actualizado el 31 de julio de 2011 En Bash: $ read a b c <<< $(echo $c $b $a) Otra manera: ...

December 3, 2010 · 1 min · 174 palabras · Nacho Cano

Buscar en todos los campos de un modelo en Django

Una acción típica que se va a repetir en, prácticamente, cada listado que mostremos, es la de añadir un buscador [1]. Un buscador típico incluirá un pequeño formulario en la misma página de listado: <form method="get" action=""> <input type="text" name="q" value="{{ q }}" /> <input type="submit" value="Search" /> Nos interesaría no tener que ir copiando y pengando este código en cada listado. Aunque sea un código que no vaya a cambiar, viola el principio de DRY. ...

November 19, 2010 · 3 min · 580 palabras · Nacho Cano

Control de concurrencia optimista en Django

Si tenemos una aplicación multiusuario, podría darse el caso de que dos usuarios accediesen simultáneamente al mismo registro para editarlo. Si no controlamos este evento, sucederá que el primero que guarde, que no tiene porqué ser el primero que comenzó a editar, perderá los cambios, y lo que es peor, sin enterarse. Una solución sería utilizar transacciones [1], pero éstas deberían abarcar varias peticiones HTTP, desde que se empieza a editar hasta que se guarda satisfactoriamente (o no), con lo que la solución idónea se complica. Una solución más sencilla, pero efectiva en la inmensa mayoría de casos, es utilizar el control de concurrencia optimista (también comentado en slashdot). ...

November 5, 2010 · 3 min · 527 palabras · Nacho Cano

Actualización recursiva de un diccionario en Python

Cuando actualizamos un diccionario con otro en Pyhton, el método update copia las entradas del diccionario fuente en el diccionario destino, sobreescribiendo las de éste si la entrada existe en ambos diccionarios. En particular, si un diccionario contiene una entrada que es a su vez otro diccionario, no se realiza una actualización sobre ésta, por lo que se pierden los valores que no estuvieran en el diccionario fuente. Ilustremos este comportamiento con un ejemplo: ...

September 28, 2010 · 3 min · 529 palabras · Nacho Cano

Memento en Bash

No me acuerdo de olvidarte. Si lo primero que haces nada más iniciar una sesión es abrir el terminal. Varias ventanas, varias pestañas. screen, terminator o byobu. Es posible que, alguna vez, se te haya pasado por la cabeza que sería interesante guardar una nota sobre algo que estamos haciendo, algo que quisiéramos recordar más tarde, algo que quisiéramos no olvidar, algo que está relacionado con el directorio en el que estamos. ...

September 26, 2010 · 3 min · 434 palabras · Nacho Cano

Random Bash

“Los números aleatorios no deberían ser generados por un método elegido aleatoriamente”. Donald E. Knuth En Bash, podemos obtener números enteros aleatorios: $ echo $RANDOM 20684 Cada vez que se referencia el parámetro RANDOM, éste devuelve un valor entre 0 y 32767, es decir, 2^15^-1. Podemos inicializar la secuencia de números aleatorios asignando un valor a RANDOM. Debemos tener en cuenta que si le asignamos un valor vacío a RANDOM se pierden sus propiedades especiales, aunque después lo inicialicemos. ...

September 25, 2010 · 6 min · 1192 palabras · Nacho Cano

JABH - Just Another Bash Hacker

Se le llama JAPH a un programa en Perl que escribe “Just another Perl hacker,”. JABH vendría a ser algo parecido, en Bash: $ s="Jaescunrhkso ettBhr haa,";for y in {0..4};do for x in {0..4};do echo -n "${s:$((5*x+y)):1}";done;done Just another Bash hacker, Otra versión, algo más críptica: $ s="Jaescunrhkso ettBhr haa,";t=4;f(){ eval "for $1 in {0..$t};do eval $2;done;";};f x ';f y "echo -n \"'\''\${s:\$(((t+1)*y+x)):1}'\''\""' Just another Bash hacker,

July 28, 2010 · 1 min · 67 palabras · Nacho Cano