Cabeceras HTTP personalizadas en Apache2

Podemos modificar las cabeceras que devuelve el Apache usando el módulo mod_headers. Por ejemplo, añadiendo a nuestro virtualhost: Header set X-MyHeader "It took %D microseconds to serve this page." Se pueden modificar tanto las cabeceras que van a ser enviadas, con la directiva Header, como las que vienen con una petición, con la directiva RequestHeader. Las acciones que se pueden llevar a cabo son: set, especifica el valor de la cabecera, la crea si no existía o la modifica en caso contrario append, añade el valor al final de la cabecera existente, y separa los valores por comas add, añade una cabecera, duplicando la cabecera si ésta ya existía unset, elimina una cabecera echo, sólo en el caso de la directiva Header, y permite utilizar el valor de una cabecera en el `request` Este es el resultado: ...

February 28, 2011 · 2 min · 268 palabras · Nacho Cano

setuid y setgid

setuid y setgid son unos permisos especiales, también llamados los sticky bits, que se les pueden asignar a los programas ejecutables para que se ejecuten con los permisos del propietario y no del usuario que los ejecuta. Esto sirve para, por ejemplo, que cualquier usuario ejecute el comando ping aunque éste necesite privilegios de administrador, que es el propietario. En GNU/Linux, y en Unix, estos bits se ignoran cuando se aplican a directorios. ...

February 28, 2011 · 2 min · 415 palabras · Nacho Cano

html2pdf = html2ps + ps2pdf

Un buen comando para convertir una web a PDF, idóneo para sitios con documentación pero que ésta sólo está disponible online. Por ejemplo: $ html2ps -W b http://www.vala-project.org/doc/vala/ | ps2pdf - out.pdf Con la opción -W b le decimos a html2ps que siga sólo los enlaces que están en el mismo directorio, o a partir de él, respecto a la ruta proporcionada. Fuente: techpin.com Podemos crear un alias que reciba dos parámetros, la URL y el nombre que queremos ponerle al PDF: ...

February 28, 2011 · 1 min · 100 palabras · Nacho Cano

Mystery

Casi parece que está escrito en chino, o mejor dicho en brainfuck, o puede que no sea muy zen, pero no deja de ser elegante. def mystery(n): a = list(range(n)) [[(yield i) for a[::i] in [([0]*n)[::i]]] for i in a[2:] if a[i]] El nombre de la función pretende no dar pistas para que intentemos averiguar qué hace exactamente esta función. He aquí una pista: Fuente: numberspiral.com >>> f = mystery(20) >>> try: ... while True: ... print f.next() ... except StopIteration: ... pass 2 3 5 7 11 13 17 19

February 26, 2011 · 1 min · 91 palabras · Nacho Cano

Python Zen

Just to keep in mind… Author: euart >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than _right_ now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!

February 26, 2011 · 1 min · 154 palabras · Nacho Cano

Abusando del código de estado HTTP

function logged_in(id, txt) { document.getElementById(id).innerHTML = txt; } En el artículo original, de [Mark Cardwell][], se muestra como podemos saber si un visitante de nuestra página está conectado a diferentes servicios, como GMail, Facebook, Twitter, etc, aprovechando las diferencias de comportamiento que muestran estos servicios al acceder a enlaces concretos si el usuario está conectado o no. GMail ----- Conectado a GMail? __**...**__ Para comprobar si el visitante está conectado a GMail se intenta cargar una imagen de la siguiente manera: El src de la imagen hace referencia a la imagen del perfil de Mark, si no hemos iniciado sesión en GMail, la dirección del src no devolverá una imagen, sino que redireccionará a una página HTML. Con los atributos onload y onerror podremos distinguir si la imagen ha cargado o no, por lo que podremos saber si el usuario ha iniciado sesión o no. Esto parece que funciona en Firefox, Chrome, Opera, Safari y varias versiones de Internet Explorer. ...

February 22, 2011 · 4 min · 715 palabras · Nacho Cano

Solucionado el error "Tcl/Tk not found" al instalar OMNeT++ en Ubuntu

OMNeT++ es un entorno de desarrollo modular y extensible desarrollado en C++, y gratuito pasa uso no comercial, especialmente pensado para construir simuladores de redes de eventos discretos en el sentido más amplio: redes de comunicaciones alámbricas, inalámbricas, redes de colas, etc. El soporte para dominios específicos tales como redes de sensores, redes inalámbricas ad-hoc, protocolos de Internet, modelado del rendimiento, etc, viene dado por proyectos desarrollados de forma independiente. OMNeT++ ofrece un IDE basado en eclipse, un entorno de ejecución gráfico y otras herramientas. Hay extensiones para simulación en tiempo real, emulación de redes, lenguages de programación alternativos (Java, C#), integración con bases de datos, etc. ...

February 21, 2011 · 3 min · 531 palabras · Nacho Cano

Cambiar la contraseña de administrador en Django 1.2

A partir de Django 1.2 se ha añadido el comando manage.py changepassword. $ ./manage.py changepassword ['username'] Si no proporcionamos un nombre de usuario se intentará cambiar el nombre de usuario que concuerde con el del usuario que ha iniciado sesión. Este comando nos ahorra escribir lo siguiente: >>> from django.contrib.auth.models import User >>> u = User.objects.get(username__exact='john') >>> u.set_password('new password') >>> u.save() El usuario administrador es el primer usuario del sistema por lo que podemos escribir: ...

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

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