Destinia busca un programador PHP y un coordinador de desarrollo. Por alguna razón extraña está costando mucho encontrar gente, por no hablar ya de encontrar gente capacitada.

Pagan bien y el ambiente mola :-)

 

Sabes que tienes un problema cuando tu única razón para no comprarte un reproductor de mp3 es que no quieres escuchar música sin que quede registrada en tu perfil de Last.fm porque eso invalidaría las estadísticas.

 

Is meow in the dictionary?

 

Cada vez que instalo Ubuntu también instalo Automatix y cada vez que instalo Automatix instalo el paquete Extra fonts y cada vez que hago eso se me jode la fuente Monospace y cada vez que se me jode me olvido de lo que hice la última vez para solucionarlo. Así que para futura referencia esto es lo que hay que hacer

sudo apt-get remove ttf-georgewilliams
 

Acabo de volver de mi primer entrenamiento de Ultimate en cinco meses (con los Quijotes). Siento como si tuviera agujas clavadas en las piernas y se que mañana y pasado van a ser peor, pero estoy feliz :-).

 

Anoche fuí al concierto de Babyshambles aquí en Madrid. Para verlo pagué 26 euros. Parte de ese dinero irá a parar a la cuenta de Pete Doherty. ¿Si muere de sobredosis en el futuro (cercano o no) debería sentirme culpable?

Que conste que en realidad Babyshambles no me viene ni me va y nunca había escuchado una canción de ellos a propósito. Fui porque mi compañera de piso no tenía con quien ir y yo no tenía mejor plan para un Jueves por la noche. Pero a pesar de que no me sabía ninguna canción el concierto estuvo divertido, bien metido en el barullo empujando y siendo empujado.

 

Si la vida empieza en el momento de concepción como insisten muchos religiosos, no deberíamos celebrar la Navidad alrededor de Abril, cuando el barbudo impregnó a la Mary?

defective yeti

Mientras tanto un servidor se encuentra en Santiago de Chile disfrutando de unas merecidas vacaciones, más noticias cuando vuelva el 7 de Enero.

 

I recently found myself with the need to get past the office firewall to listen to some last.fm tunage. To such end I created a ssh tunnel to my server and proceeded to configure the official last.fm player to work through the proxy. Imagine my surprise when it didn’t work! Shocked I was. Shocked and surprised. And cursing.

After much ngrep-ing I came to the conclusion that the last.fm player was not implementing the SOCKS protocol but was just doing straight-forward proxy. A quick google search revealed that Qt has a proxy connection managment class called QNetworkProxy which meant all the work was done for me. I copy-and-pasted the code and it worked. Proud of my deductive skills, programming ability and boyish good looks I sent them an email with my patch, expecting some sort of answer.

A ‘kay cool would have done.

But not only did those bastards* not hire me, they also ignore my emails.

So here goes the patch. It’s against 1.3.1.1 though, but I think it should work just fine against 1.3.2.13 which is the one I originally fixed. (I downgraded because 1.3.2.13 wasn’t working correctly and because it wasn’t on SVN at the time)

svn co svn://svn.audioscrobbler.net/client/Audioscrobbler/tags/1.3.1.1 lastfm
cd lastfm
patch -p0 < /path/to/socks.patch
./configure
make && make install

The patch is hard coded to work with SOCKS 5, I haven’t tested it with anything else.

* but in a good way. I like them. Really, I do.

 

A mi me encanta el queso… es lo mejor… pero le falta algo… que sea crujiente

Alex (compañero de piso) – mientras pone tres Pringles en un pedazo de queso

 

Estuve el domingo unas cuantas horas buscando por internet como hacer esto y me estaba frustrando. Mi nuevo mini-proyecto secreto requiere monitorizar unas imágenes regularmente para ir actualizándolas a medida que van cambiando mediante un cron script que se ejecuta cada 15 minutos. Hay dos opciones:

  1. Bajarnos las imágenes todas las veces y comparar el md5sum para ver si han cambiado
  2. o hacer un pedido HEAD en vez de GET y hacer uso de las cabeceras Last-Modified y ETag.

¿Que cuales son las ventajas del punto dos? Lo más importante es que nos ahorramos ancho de banda nosotros y a los que le estemos bajando las imágenes, tampoco es cuestión de abusar del servidor de otra persona. Ojo que esto no aplica sólo a las imágenes, cualquier servidor moderno de hoy en día tiene soporte para estas cabeceras y las devolverá con cualquier tipo de archivo, incluso los que estén generados dinámicamente. Nos ahorramos ancho de banda porque sólo pedimos la cabecera del archivo que exceptuando casos extremos será mucho más pequeño que el resto del documento. Esto es especialmente útil para el contenido estático (js, imagenes, css, etc) y contenido que se baja regularmente como feeds RSS. Además de ahorrar ancho de banda también hacemos que el script vaya más rápido ya que no tiene que procesar todo el documento.

La idea es que hacemos un pedido HEAD inicial y guardamos el Last-Modified y ETag, luego en los subsiguientes pedidos enviamos pedidos GET con las cabeceras If-Modified-Since y If-None-Match. If-Modified-Since se usa con la fecha que guardamos anteriormente y If-None-Match con el ETag. Si ambos campos son los mismos en el archivo actual del lado del servidor entonces este debe responder con un ‘304 Not Modified’

import StringIO
import pycurl

c = pycurl.Curl()
s = StringIO.StringIO()

c.setopt(pycurl.URL, 'http://theragingche.com/images/hand_made_cms.gif')
c.setopt(pycurl.HEADER, True) # estas dos lineas son las que importan
c.setopt(pycurl.NOBODY, True) # para hacer un pedido HEAD
c.setopt(pycurl.WRITEFUNCTION, s.write)

c.perform()
print s.getvalue()

Nos devuelve solo la cabecera:

$ python head.py
HTTP/1.1 200 OK
Date: Mon, 26 Nov 2007 12:29:50 GMT
Server: Apache/2.0.54 (Fedora)
Last-Modified: Thu, 16 Mar 2006 19:02:45 GMT
ETag: "303247c3-105-40f21566a7f40"
Accept-Ranges: bytes
Content-Length: 261
Connection: close
Content-Type: image/gif
X-Pad: avoid browser bug

Si luego hacemos:

import StringIO
import pycurl 

c = pycurl.Curl()
s = StringIO.StringIO()

c.setopt(pycurl.URL, 'http://theragingche.com/images/hand_made_cms.gif')

# especificamos las cabeceras
c.setopt(pycurl.HTTPHEADER,
    ['If-Modified-Since: Thu, 16 Mar 2006 19:02:45 GMT',
    'If-None-Match: "303247c3-105-40f21566a7f40"'])

c.setopt(pycurl.WRITEFUNCTION, s.write)
c.perform()

print c.getinfo(pycurl.RESPONSE_CODE)

Nos da:

$ python head.py
304
 
Set your Twitter account name in your settings to use the TwitterBar Section.