Monthly Archive for Agosto, 2007

Más de un mapa con MyGMMS

  • english
  • spanish

El plugin MyGMMS del que hablaba en el post anterior sólo permite insertar un mapa por post, pero habréis visto que tengo dos. ¡Es que soy más chulo que un ocho! :-D

He modificado el plugin para poder insertar tantos mapas como queramos por post. Podéis descargar el parche aquí.

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Tarde de buceo sin mucha suerte…

Ésta tarde nos hemos ido a bucear unos amigos y yo. El fin de semana pasado nos quedamos con las ganas por culpa del temporal, y como a lo largo de la semana ha ido mejorando el estado del mar estábamos deseando mojarnos. Y además, ¡que se note que estoy de vacaciones, coño!
El plan inicial era ir a una cala que conocía Gabi poco antes de llegar a Villajoyosa, pero ya de camino nos temíamos lo peor porque el mar estaba un poco picado y había viento de Levante. Una vez en la cala en la orilla directamente se veía que la visibilidad era mala, con 10cm de agua a penas si se veía el fondo. Así que hemos dado media vuelta.

La verdad es que la calita al menos tenía buena pinta y el acceso es bastante bueno, llegas con el coche hasta la misma arena (bueno, piedras). Otra vez será.

El plan B ha sido ir a Cala Palmera, en el Cabo las Huertas. Ésta la conocíamos todos pues es un sitio típico donde te llevan a hacer las primeras inmersiones del Open Water. Bufff, un desastre. Ya desde fuera veíamos que la cosa no estaba muy bien, pero como somos unos cabezones nos hemos ido al agua. Visibilidad malísima, ¿un metro? ¿Metro y medio? Casi teníamos que ir de la manita para no perdernos, no exagero. Tenías que estar más pendiente del compañero que de ver el entorno submario, que de todas formas no se veía hasta que no te dabas de bruces con él. Así que hemos hecho el paripé media hora que a penas si hemos bajado de los 4m (¡qué triste!) y nos hemos vuelto para casa.

Por lo menos el día nos ha servido para:

  • convencernos de que si el mar está mal, no vale la pena ir a bucear. No ves nada, no lo pasas bien (vas preocupado por despistarte de los compañeros, etc.), y pierdes más tiempo entre coche, montar el equipo, ponértelo, y luego endulzarlo y demás que bajo el agua. Una retirada a tiempo es una victoria.
  • Víctor ha estrenado su nuevo ordenador de buceo. :D
  • yo he estrenado casi todo el equipo: gafas, escarpines, traje y aletas. Y me ha servido también para descubrir que no mola estrenar equipo si las condiciones del agua no son buenas: las he pasado putas con las gafas (se me empañaban, luego me entraba agua hasta que he conseguido ajustarlas bien…) y ¡¡se me ha salido una aleta!! Un agobio.

Y aparte éste post me sirve para probar un plugin que integra Google Maps en WordPress. :)

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Migrando a MacOS X

Ya comenté hace un tiempo que mi ordenador había pasado a mejor vida y estaba pensando comprarme un Mac. Pues finalmente “piqué” y hace algo más de un mes que soy un feliz propietario de un MacBook Pro. :-D

La migración no ha sido nada traumática ya que en el trabajo ya había trabajado con MacOS X. Eso sí, me había limitado a administrar la red, impresoras, etc. e instalar los programas que necesitaban mis compañeros, y poco más. Ahora es cuando estoy sacándole todo el jugo.

Voy a comentar algunos de los programas que uso. Todo es GPL o en su defecto “free as in free beer”.

Vayan las gracias por adelantado a mi amigo Ramses de Zelofan, que me echó una mano los primeros días con una versión inicial de ésta lista. :)

Ofimática

  • NeoOffice. Versión nativa para Mac del Open Office.
  • Abiword. Un procesador de texto más simple que el NeoOffice.

Internet

  • Firefox. Por supuesto. :) La verdad es que el Safari lo estoy ignorando bastante…
  • Adium. Un cliente IM con soporte de varios protocolos. No en vano usa las librerías del Pidgin (antiguamente GAIM).
  • Transmission. Cliente de bittorrent sin complicaciones.
  • Reader Notifier. Avisa de artículos nuevos en Google Reader.

Juegos

  • DOSBox. Emulador de MS-DOS, para todos los juegos del año la polca.
  • MAME OS X y MAME Library. El emulador de recreativas por excelencia y un front-end chulo.
  • ScummVM. Intérprete para las aventuras clásicas de Lucas y muchos más.

Sistema

  • Burn. “Tostador” cómodo y fácil de usar.
  • VirtueDesktops. Cuando no estoy en Linux siempre echo de menos tener varios escritorios virtuales. :)
  • ClamXav. Anti-virus GPL para Mac. Tiene un módulo que monitoriza todo lo que se deje en una carpeta.
  • InsomniaX. Para evitar que el sistema entre en ahorro de energía y tenerlo toda la noche con música, descargando cosas, etc.
  • OnyX. Permite configurar varias características ocultas del sistema.
  • The Unarchiver. Descompresor universal de todo lo que le echen.
  • QuickSilver. Tipo Google Desktop, permite buscar archivos, programas, etc. con una sencilla combinación de teclas.
  • Growl. Es un sistema para sacar pequeñas ventanas de sucesos que usan un montón de aplicaciones.
  • ExtFsManager. Permite montar particiones ext2 de Linux.
  • Fan Control. Importantísimo para que el equipo no se caliente más de la cuenta.
  • Fink. “fink install joe”. ’nuff said.
  • Q. Versión Mac del QEMU (si, el Parallels va más rápido, pero es de pago) P-)

Multimedia

  • VLC. Reproductor multimedia, me parece el más completo, con más codecs y demás.
  • mplayer. Hay una versión para OS X, pero no es tan bueno como en Linux.
  • Xee. Un visor de imágenes sencillote pero funcional. Si tienes instalado el Unarchiver abre cómics en formato .CBR y .CBZ.
  • MacTheRipper. Para hacer “copias de seguridad” de los DVDs. P-)
  • ScrobblePod. Envía a last.fm datos de lo que escuchamos con el iPod (tipo mi gtkpodscrobbler).

Desarrollo

  • Eclipse. Faltaría más.
  • MAMP. LAMP sustituyendo la L por M. :-D
  • Komodo Edit. Editor de código. Es parte de un IDE de pago, el editor sólo es gratis.

Y seguro que me he dejado alguno en el tintero, pero bueno, para el próximo post. ;)

Webs

Y ahora alguna web útil para ir entrando en el mundillo:

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Arquitecturas escalables en Google

  • english
  • spanish

Un compañero de trabajo me manda tres interesantes artículos de la web High Scalability, que no conocía aún y que ya he añadido a mi lista de RSSs en Google Reader. :) Los artículos tratan sobre las decisiones de diseño y arquitectura de computadores/redes tomadas en YouTube, Google y GTalk, para hacer frente a la altísima cantidad de visitas y datos que deben servir por segundo, comentando también más o menos la estructura actual y la evolución de la infraestructura de cada uno de ellos:

Algunas conclusiones a extraer de éstos artículos:

  • No intentar arreglarlo todo con una única arquitectura o una única herramienta. Dividir el problema en subproblemas, ver en cada caso si el límite es CPU, ancho de banda, IO y optimizarlo. Especializar servidores para cada caso y coordinar el trabajo de cada parte.
  • Cachear contenido siempre que sea posible. Pregenerar contenido siempre que sea posible. Utilizar las directivas HTTP para el control de caché. Usar squid como proxy inverso para aliviar a los servidores de aplicaciones.
  • Plantearse externalizar algún servicio, el hosting de imágenes o videos que puedan suponer más ancho de banda del que actualmente tenemos. Aunque sea como solución de compromiso mientras se contrata más ancho de banda. Lo importante es ofrecer el servicio en condiciones.
  • Simplicidad, dentro de lo que cabe. Permitirá hacer cambios y evoluciones sin cagarla demasiado.
  • Clusters basados en PCs normales. Maximizan la relación potencia/precio. Tener montado un sistema de redundancia para que una caída no afecte al servicio, y un sistema de instalación sencillo para poder añadir/sustituir equipos sin calentarse mucho la cabeza. Y empezar a planificar los problemas de alimentación y aire acondicionado. ;)
  • La programación hoy en día se basa en librerías y frameworks. No reinventar la rueda. Usar un framework común, propio o no, de forma que los programadores no tengan que hacer una y otra vez las mismas cosas y una actualización beneficie a todos nuestros productos de golpe.
  • Pensar en la arquitectura desde el principio. Estoy tristemente acostumbrado a que los desarrolladores no se preocupen de lo que hay por debajo de su código, ni si éste va a provocar problemas de red, disco, CPU, etc. Google enfoca todos los problemas desde la arquitectura necesaria para dar el servicio, y luego programa alrededor de ésa arquitectura. Es lo que diferencia a Google del resto.
  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Clusters de Asterisk con el foneBRIDGE2

  • english
  • spanish

En el trabajo tenemos un cluster Asterisk formado por dos servidores Proliant y un foneBRIDGE2 de Redfone que controla las líneas RDSI. El servicio heartbeat está instalado en ambos servidores, y se encarga de monitorizarlos y alternar el servicio en caso de que el nodo principal caiga, migrando la IP principal y levantando todos los procesos necesarios. Voy a explicar brevemente nuestra configuración como referencia para otros usuarios que se estén empezando a pelear ahora con el foneBRIDGE.

Visión general

Como he comentado tenemos dos servidores Asterisk, llamados asterisk00 y asterisk01.example.com, siendo el primero de ellos el master del servicio. Cada uno tiene su dirección IP (10.10.10.1 y .2) y aparte hay otra IP “virtual” (.3) que va a “saltar” de un nodo al otro si el principal se queda colgado.

Nuestro foneBRIDGE2 es un modelo “quad” para 4 líneas RDSI, pero sólo usamos dos: una al proveedor de telefonía y la otra a una centralita antigua. Aparte de los conectores para las RDSI, el foneBRIDGE tiene dos puertos ethernet para conectarlo a los servidores, pero sólo admite comandos de configuración para inicializarlo, cambiar de servidor, etc. en uno de ellos (el primero). Normalmente lo que se haría es poner un switch en éste puerto ethernet y conectar ahí todos los servidores del cluster, para que todos puedan configurar el FB en caso de necesidad, pero mi jefe se empeñó en ver éste switch como un punto de fallo y se negó a usarlo, una opinión que no comparto ya que tiene otras desventajas que vamos a ver. Así que nuestra configuración es un tanto peculiar, ya que asterisk01 (el backup) está conectado al puerto principal del FB mientras que asterisk00 está conectado al secundario. La lógica detrás de ésta decisión es: asterisk00 va a estar en marcha el 99% del tiempo, y cuando se cuelgue, será asterisk01 quien se deberá encargar de reconfigurar el FB, así que es asterisk01 quien realmente va a controlar las caídas y reconfiguraciones del FB y necesita acceso al puerto de configuración. Pero por supuesto, ahora quien es un punto de fallo en nuestra configuración es asterisk01: si el servidor de backup se nos cae por cualquier motivo, nos arriesgamos a perder el control del FB dejando el cluster inutilizable.

Usamos el interfaz web FreePBX, que a su vez utiliza una base de datos mySQL para almacenar toda la configuración. Si no usas FreePBX, puedes ignorar cualquier mención tanto al mySQL como al Apache.

Sincronización de mySQL

El clustering nativo ndb de mySQL nos va a resultar muy útil aquí. Se configura, se mantiene el servicio en marcha en todo momento en ambos nodos, y el sistema de BD se encarga de la sincronización de forma automática a través de todos los servidores.

La configuración de un cluster mySQL se sale del ámbito de éste documento. Te recomiendo consultar la documentación oficial aquí o bien buscar algún howto en el Google. :)

Sincronización de ficheros

Tenemos que mantener sincronizados en todos los servidores del cluster todos los ficheros de configuración del Asterisk, librerías, módulos, los buzones del voicemail… Hay varias alternativas.

  • Una SAN. Cara pero muy cómoda. Nosotros no tenemos una así que queda descartada. :)
  • DRBD. Si no lo conoces, piensa en él como un RAID1 a nivel de partición pero por red. Funciona de maravilla, lo usamos en clusters de otros servicios y no nos ha dado ningún problema, pero no aquí. La única pega del DRBD es que la partición a sincronizar sólo puede estar montada en uno de los dos servidores, el activo en un momento dado, y nosotros queríamos la comodidad de tener todos los ficheros accesibles en ambos servidores para poder usar el backup como “banco de pruebas” de nuevas configuraciones o actualizaciones del software.
  • csync2. Es un rsync con esteroides. Similar al unison, pero capaz de sincronizar ficheros entre más de dos servidores. Es la opción que usamos en nuestro cluster Asterisk.

Nuestro fichero csync2.conf tiene éste aspecto:

[code lang="bash"]

group asterisk
{
host asterisk00.example.com asterisk01.example.com;

key /etc/csync2.key_asterisk;

backup-directory /var/backups/csync2;
backup-generations 10;

auto none;

exclude *~ .* ok lock control;
include /etc/csync2.cfg;

include /etc/hosts;
include /etc/ha.d/ha.cf;
include /etc/ha.d/haresources;

include /etc/asterisk;
include /etc/redfone*;

include /var/www;
include /var/lib/asterisk;
include /var/spool/asterisk;
include /usr/lib/asterisk;
include /etc/amportal.conf;
include /var/log/asterisk;
}

[/code]

Lanzamos una sincronización cada cinco minutos. No hay necesidad de hacerlo tan a menudo, y de hecho podríamos lanzarla cada media hora o una hora, ya que en un sistema estable no va a haber tantos cambios (añadir alguna extensión cada X semanas) y rara vez usamos los buzones de voz. La sincronización se lanza desde un cron en /etc/cron.d/FB-csync2:

[code lang="bash"]

*/5 * * * * root [ -f /tmp/.FB-master ] && /usr/sbin/csync2 -xv

[/code]

Éste fichero /tmp/.FB-master es un fichero “centinela” que marca el servidor principal en cada momento, de forma que ésta sincronización sólo se lance desde ése nodo. En la sección del heartbeat veremos dónde y cómo se crea.

fonulator

fonulator es la utilidad de Redfone para configurar el foneBRIDGE. Como ya he comentado antes, en nuestra configuración sólo asterisk01 (el servidor de backup) tiene acceso al puerto de configuración del FB, y cada uno de los servidores está conectado a un puerto ethernet distinto. Así que cuando un servidor cae, tenemos que cambiar el servidor destino de las tramas TDMoE y TAMBIÉN el interfaz ethernet a través del cual las manda el FB.

Para ello tenemos preparados dos ficheros de configuración independientes, redfone_asterisk00.conf y redfone_asterisk01.conf. Son iguales salvo por los comandos “serverX” y “fbX” de cada “span”:

[code lang="bash"]

[globals]
fb1=00:50:C2:65:D0:68
fb2=00:50:C2:65:D0:69

# asterisk00.example.com
server1=00:80:5A:61:E7:FF
# asterisk01.example.com
server2=00:04:76:11:A3:EC

card=eth1,fb1

# Telco
[span1]
span=1,0,0,ccs,hdb3,crc4
server1
fb2
pri

# Legacy PBX
[span2]
span=2,0,0,ccs,hdb3,crc4
server1
fb2
pri

[/code]

Eso era redfone_asterisk00.conf. Configura el FB para mandar el tráfico RDSI a asterisk00 (server1) a través del segundo interfaz ethernet (fb2). El fichero redfone_asterisk01.conf usa server2 y fb1.

heartbeat

Sólo nos queda la pieza final que une al resto: heartbeat. Nuestro fichero haresources es así:

[code lang="bash"]

asterisk00.example.com MailTo::asterisk@example.com::Asterisk 10.10.10.3 FB_fonulator FB_master FB_asterisk apache2

[/code]

Que significa que:

  • asterisk00.example.com es el master
  • cada vez que se intercambie el servicio, se mandará un mail a asterisk@example.com
  • la IP virtual del servicio es la 10.10.10.3
  • arrancar (parar) los servicios FB_fonulator, FB_master, FB_asterisk y apache2 (recuerda eliminar el enlace al apache2 en /etc/rc2.d, no queremos que se lance en el inicio del sistema si no que heartbeat se encargará de manejarlo)

Veamos ahora los scripts. FB_fonulator ejecuta el programa fonulator para configurar el foneBRIDGE y dirigir el tráfico TDMoE al servidor que toque. Un detalle importante es que, aunque el script se lance en ambos servidores, sólo tendrá efecto cuando se lanza desde asterisk01 que es quien está conectado al puerto de configuración del FB:

[code lang="bash"]

#!/bin/sh

# Chech who I am and who the other host is
THISHOST="`hostname|cut -d. -f1`"
if [ "$THISHOST" == "asterisk00" ]
then
OTHERHOST="asterisk01"
else
OTHERHOST="asterisk00"
fi

# Bail out if there is no config file
F="/etc/redfone_$THISHOST.conf"
[ ! -f "$F" ] && exit 0
# Guess the appropiate interface card
export ETH=`grep -E "^card=" "$F" | cut -d= -f2 | cut -d, -f1`

case "$1" in
start)
echo "Fonulating..."
/usr/local/bin/fonulator -s -t 1 "/etc/redfone_$THISHOST.conf"
;;
stop)
/usr/local/bin/fonulator -s -t 1 "/etc/redfone_$OTHERHOST.conf"
;;
restart|status)
echo "Fonulator $1"
exit 0
;;
esac
exit 0

[/code]

FB_master crea el fichero “centinela” /tmp/.FB-master que ya habíamos mencionado, y fuerza una sincronización tanto en el arranque (para asegurarnos que ambos servidores están sincronizados en el inicio) como en la parada (para devolver al master cualquier cambio que haya podido haber mientras el servicio estaba en el backup):

[code lang="bash"]

#!/bin/sh

F=/tmp/.FB-master

case "$1" in
start)
touch "$F"
# Activate log rotation
ln -sf /etc/asterisk/asterisk.logrotate /etc/logrotate.d/asterisk
# Force sync of these dirs
csync2 -fr /var/
csync2 -fr /etc/asterisk/
csync2 -xv
;;
stop)
if [ -f "$F" ]
then
# De-activate log rotation
rm -f /etc/logrotate.d/asterisk
# Force a last minute sync to the new master
csync2 -fr /var/
csync2 -fr /etc/asterisk/
csync2 -xv
rm -f "$F"
fi
;;
esac
exit 0

[/code]

Por último, FB_asterisk lanza el servicio Asterisk en sí. Usamos mis scripts para manejar Asterisk con daemontools, así que básicamente lo único que tiene que hacer éste script es un “svc -u/-d /service/asterisk”:

[code lang="bash"]

#!/bin/sh

case "$1" in
start)
echo "Starting Asterisk..."
# Check if Asterisk is already running
if /usr/sbin/asterisk -r -x "quit"
then
echo "Already running"
exit 0
fi
# Just in case...
rm -f /service/*
# Link services and start them up
ln -sf /etc/asterisk/services/asterisk/ /service/asterisk
ln -sf /etc/asterisk/services/fopserver/ /service/fopserver
svc -u /service/*
;;
stop)
echo "Stopping Asterisk ..."
svc -d /service/*
rm -f /service/*
;;
restart)
echo "Restarting Astarisk ..."
svc -t /service/*
;;
reload)
echo "Reloading Asterisk ..."
/usr/sbin/asterisk -r -x "reload"
;;
status)
echo "Checking Asterisk's status ..."
/usr/sbin/asterisk -r -x "quit" && exit 0 || exit 1
;;
esac
exit 0

[/code]

Descargas

Todos los scripts y ficheros de configuración comentados están disponibles aquí. Piensa en ellos como una base sobre la que empezar a hacer pruebas y construir tu propia configuración. Y agradeceré si alguien me envía mejoras, errores que hayáis podido encontrar, etc. :)

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Ya tengo la licencia de buceo

Me he pasado por Aquaventura a ver qué inmersiones había planificadas para éste fin de semana (está chungo porque llevan dos cursos a corro) y ¡ya había llegado mi certificación!

Mi nº de certificación es el S034071827, donde resulta que S es España, 034 Aquaventura, 07 el año y el 1827 del final ¡soy yo!

(A lo que me viene a la cabeza lo de I’m not a number, I’m a free man!)

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Tiempos de cambio

Creo que en todo el tiempo que hace que reconvertí la página en un blog no he escrito ni un comentario de carácter estrictamente personal. Si que ha habido algún comentario de noticias, algún chiste, alguna chorrada, algo que he hecho o me ha pasado… pero puras anécdotas, nada… personal en el sentido de… ¿íntimo? ¿Lo que me pasa por dentro?

Ha llegado la hora. Estoy en un momento bastante chungo y necesito poner cosas por escrito para aclararme las ideas. En estos casos hablar ayuda, acudir a los amigos y familia, y yo siempre he creído que escribir también. Conversar con uno mismo, por así decirlo. Pero si esa conversación con uno mismo se queda sólo en la cabeza suele ser malo y sólo lleva a hacer “la pelota” cada vez más grande y a radicalizarte en tus opiniones o sentimientos. Al poner tus pensamientos por escrito, igual que al hablar con alguien, te obligas a darles forma, a expresarlos de manera que tu interlocutor los entienda y pueda captar cada pequeño detalle o sutileza de la situación. Y al esforzarte, hablando o escribiendo, a poner en orden tus pensamientos, pues eso, los pones en orden y tal vez acabas por entenderlos tú mismo un poco mejor.

En cuestión de semanas me he llevado dos golpes muy fuertes: uno, hace un mes y por sorpresa, la separación de mi mujer; otro, el pasado sábado y de alguna forma esperado, la muerte de mi madre.

Mi madre tenía Alzheimer: hace diez años que se lo diagnosticaron, tres que estaba ingresada en una residencia y dos que ya estaba terminal, vegetal como se suele decir. Es una enfermedad muy mala, tanto para quien la sufre, durante los primeros años que es consciente de que empieza a olvidar cosas y a no ser capaz de llevar a cabo tareas que ha hecho durante toda la vida; como para la familia, que ve a esa persona apagarse poco a poco, cómo le cambia el humor y carácter, cómo va desapareciendo hasta que finalmente sólo queda el cuerpo, la “carcasa” que alguna vez contuvo a un ser querido pero que, aunque viva, ha quedado hueca, sin voluntad ni sentimientos ni vida propia.

Ingresarla fue duro, pero llega un momento en esta enfermedad en el que tienes que tomar esa decisión, porque la situación llega a ser tan complicada que las personas que la cuidan están al borde de enfermar o incluso enfrentarse entre ellas a causa del estrés. Sin lugar a dudas fue el día más difícil de toda mi vida: mi padre, a regañadientes y después de mucho tiempo discutiéndolo, admitió que la situación era insostenible y había que ingresarla, pero era incapaz de decírselo a mi madre, que por aquel entonces aunque ya casi no hablaba (alguna palabra suelta, casi todo monosílabos) si que entendía. Y yo era incapaz de meterla en el coche sin más, no podía llevarme engañada a la mujer que me crió y me ha hecho lo que soy. Así que tuve que hacer acopio de valor y, con lágrimas en los ojos (igual que ahora mientras lo recuerdo) decirle a mi madre que íbamos a ingresarla en una residencia. No le deseo a nadie tener que pasar por algo así. Estas cosas no tendrían que suceder, pero resulta que la vida a veces es así de dura.

En los tres años que ha estado ingresada mi padre y yo hemos ido todas las semanas a verla. Los primeros días era una tortura. Pero el tiempo lo cura todo y poco a poco te acostumbras, sobre todo porque al ir a verla tan a menudo no percibes el cambio igual. Si echas la vista atrás si que piensas “mira lo que ha empeorado desde hace tres meses”, pero esos tres meses te los has ido administrando en pequeñas dosis de siete días. Otros familiares que han ido a verla cada dos o tres meses, o un par de veces al año, muchas veces han salido llorando nada más verla porque si que apreciaban el cambio, en parte también porque mantenían más vivo el recuerdo que tenían de ella de cuando estaba bien que el de la última visita.

Llega un momento, cuando lleva ya tiempo terminal, que asumes que cualquier día se va a ir. Cualquier pequeña cosa se complica y se la lleva por delante, un constipado o lo que sea. Eres consciente de que algún día que suene el teléfono van a ser las chicas de la residencia para decirte que ha fallecido, y estás preparado, pero aún así cuando llega ese día el golpe te lo llevas. Ese día fue la noche del sábado al domingo sobre las dos menos cuarto. La enterramos ayer.

Y lo de la separación de mi mujer… pues no sé qué decir. A lo largo de éstas semanas he llegado a aceptarlo, aunque todavía no lo entiendo porque aparentemente todo nos iba bien. Mucho estrés, eso sí, mucho trabajo, horarios que hacían que coincidiéramos poco, muchas preocupaciones y obligaciones familiares por parte de unos y otros, la hipoteca, y creo que por encima de todo, el haber estado más de un año buscando tener niños y que no llegaran (por culpa del mismo estrés), mientras que mucha gente de nuestro entorno se quedó embarazada casi sin buscarlo. Un montón de pequeñas cosas que han ido apagando la llama de la relación hasta que se ha enrarecido y ha sido necesario ¿cortar? ¿darnos un tiempo? No lo sé. Al menos sigue habiendo respeto, cariño y aprecio: Lidia ha estado a mi lado éstos dos días en el tanatorio, el funeral y el entierro. La necesitaba, necesitaba que me abrazara, y ha estado ahí. Nunca se lo podré agradecer suficiente.

Lo cierto es que en cuestión de días las he perdido a las dos: la mujer que me enseñó a ser como soy; y la mujer con la que he compartido los últimos cuatro años, sin lugar a dudas y pese a los malos momentos y los altibajos, los más felices y plenos de mi vida. Y ayer durante el entierro no podía quitarme de la cabeza la idea de que iba a decirle adiós a las dos el mismo día.

Estoy en un punto de inflexión en mi vida y tengo que decidir qué hacer. Hay que ser positivo, y pese a todo ver el lado bueno de las cosas (como cantarían los Python, “Always look on the bright side of life“). Aceptar el cambio, afrontarlo y aprovecharlo para renacer más fuerte que nunca: ya no tengo una serie de responsabilidades y obligaciones que antes tenía; tengo más tiempo libre para dedicarme a mí mismo, a hacer a cosas como el buceo que llevaba años queriendo hacer y nunca tenía tiempo, a retomar proyectos que dejé a medias o nunca llegué a empezar; retomar los idiomas, perfeccionar el inglés o refrescar el alemán que lo tengo medio olvidado… ¿Cambiar de trabajo? Pues tal vez, porque aunque ahora tengo un buen puesto, estabilidad y un buen sueldo (para lo que es Alicante) hace mucho que no estoy realmente a gusto con cómo se hacen las cosas y cómo se toman decisiones, pero en Alicante no podía aspirar a mucho más y tenía una hipoteca que pagar y una familia que mantener. Ahora de un plumazo se han ido las dos personas por las que estaba atado a ésta ciudad, con lo que se abre para mí todo un nuevo abanico de oportunidades.

Ya veremos, porque tampoco es un buen momento para precipitarse. Pero si para reflexionar y preparar la actualización a Vicente 2.0. ;-)

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

¿Cuánto ralentizan los Ad Servers la web?

Slashdot trae un interesante artículo sobre cuánto ralentizan los Ad Servers la carga de las páginas web.

Muchas veces que una página tarda en cargar, o “se queda a mitad”, no es problema de los servidores propios de ésa web si no de algún elemento externo, como (muy comunmente) publicidad, algún script p.ej. para generar estadísticas, algún efecto chorra tipo contador/reloj el flash, etc. Por muy optimizado que esté nuestro código y muy bueno que sea el rendimiento de nuestras infraestructuras, muchas veces no nos damos cuenta de que estamos en manos del rendimiento del código e infraestructuras de terceros, por recurrir a éste tipo de servicios.

Batallita del abuelo, que aunque no es al 100% sobre lo que estamos hablando sirve para ilustrarlo: hace un tiempo uno de los diarios del grupo se quejó de mal rendimiento. Como siempre, la queja es simplemente “no va” o “va mal”, no “vemos que a ciertos usuarios les pasa ésto”. Bien, conseguimos ponernos en contacto con uno de los usuarios que tenía el problema. Desde casa la página le cargaba bien, pero desde el trabajo sólo salía la cabecera, y a los cinco minutos el resto (¡¡algo descabellado!!).  Nos ponemos en contacto con el dpto. de informática (era una institución oficial) y tras algún tira y afloja descubrimos que su proxy/firewall bloqueaba el puerto 8080, y por aquel entonces uno de nuestros servidores de AdServing usaba ese puerto. ¿Resultado? Cuando el navegador encontraba el primer iframe a éste servidor de AdServing, se quedaba bloqueado hasta que se cumplía un determinado timeout, tras el cual se acababa de renderizar la página. Imaginaros ahora que en vez de ser un proxy que estuviera filtrando ese puerto, simplemente el problema fuera de rendimiento por falta de CPU o ancho de banda en un servicio externo. El resultado sería el mismo, ya que muchas veces los navegadores detienen el renderizado de la página cuando tienen problemas al cargar un iframe o cargar/ejecutar algún código JavaScript.

En resumen: nos podemos matar a optimizar nuestros servidores y nuestros programas, pero mientras que dependamos de terceros, estamos en sus manos.

¿Soluciones? Un cron que se baje cualquier JavaScript externo, de forma que lo sirvamos en local. Proxies inversos para servir el contenido. Usar las cabeceras de control de caché del protocolo HTTP para dar caducidades muy altas a los banners, para así aprovechar mejor las cachés de los navegadores y de cualquier proxy que pueda haber por enmedio.

Otra solución que lleva tiempo rondándome la cabeza es ésta: en lugar de cargar directamente cualquier JavaScript/iframe externo, registrarlos con una función JavaScript que vaya recopilándolos en un array, y en el onLoad del body html llamar a una función que recorra ese array y vaya activando uno a uno los recursos externos, una vez que todo el contenido “real” del sitio ya se ha cargado y renderizado. Estuve una vez haciendo probatinas a éste respecto y más o menos funcionaba, aunque según el código a adaptar (algunos adServings) podía dar problemas o ser más o menos complicado. Pero el efecto era el deseado: el contenido se cargaba “de pantallazo”, y luego iban apareciendo todos los recursos externos. Es una forma de que nuestro producto se vea sin ningún retraso, aunque alguno de los servidores de terceros no de el rendimiento que debería, salvaguardando así nuestro servicio y nuestra imagen.

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Titulares vía Google Reader

Llevo una temporada usando Google Reader como lector de RSS. La verdad es que resulta bastante cómodo y fácil de usar, y además al ser una aplicación web puedes acceder desde casa, desde el trabajo, etc. y se va guardando los artículos que lees estés donde estés.

Una opción muy interesante que tiene es la de compartir las noticias que consideres interesantes, con las que te genera una página y un feed RSS. Acabo de añadir éste feed con un widget a la barra de la derecha, bajo el título de “Noticias”. Así irán apareciendo por aquí enlaces a noticias que me parecen curiosas/interesantes/divertidas, independientemente de que me dé por comentarlas en más detalle en algún artículo.

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS

Traducción al español de Sandbox

  • english
  • spanish

Un compañero de trabajo y yo hemos traducido el tema Sandbox de WordPress al español, siguiendo éstas instrucciones: Playing with Gettext in the Sandbox.

La traducción está disponible aquí (enlaces directos a los ficheros que tengo en producción ahora mismo):

Para usarla tan sólo hay que copiar éstos ficheros en el directorio wp-content/themes/sandbox.

  • Twitter
  • Facebook
  • Meneame
  • email
  • Print
  • PDF
  • RSS



Bear
Creative Commons Attribution-NonCommercial 2.5 Spain
This work is licensed under a Creative Commons Attribution-NonCommercial 2.5 Spain.