The MyGMMS plugin I mentioned on the previous post only allows one map per post, but as you can see I inserted two. I rule!
I’ve modified the plugin so that you can insert as many maps as you want in a post. You can download the patch here.
Este es mi blog. Hay otros muchos pero este es el mío.
É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:
Y aparte éste post me sirve para probar un plugin que integra Google Maps en WordPress. ![]()
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.
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.
Y seguro que me he dejado alguno en el tintero, pero bueno, para el próximo post.
Y ahora alguna web útil para ir entrando en el mundillo:
A coworker has sent me three interesting articles from High Scalability, a site I still didn’t knew but which I’ve already added to my Google Reader list.
The articles talk about the design and computer/network architecture decisions taken at YouTube, Google and GTalk in order to handle the big load their services face. They also comment the current architecture in each site and their evolution over time:
Some lessons to learn from these articles:
At work we have an Asterisk cluster comprised of two Proliant servers and a Redfone’s foneBRIDGE2 that handles the ISDN lines. The heartbeat daemon is installed on both servers, monitors them and, in the event of a system failure on the master, switches the service to the backup server, migrating the main IP and activating all the needed daemons. I’ll briefly explain the whole setup here as a reference.
Our foneBRIDGE2 is a quad model, but we only use two ISDN lines: one to our telco, and the other to a legacy PBX. Besides the ISDN interfaces, the foneBRIDGE has two ethernet sockets to connect it to the servers, but only one of them (the first one) accepts configuration commands to set up the FB, switch servers, etc. You’d usually use a switch on that interface so that every server has access to it and can configure the FB, but my boss saw this switch as a single point of failure and refused to use one, a opinion I don’t share as it also has its drawbacks as we’ll see. So our setup is a little bit funny in that asterisk01 is connected to the primary FB interface and asterisk00 to the secondary one. The logic here is: asterisk00 is going to be running 99% of the time, and if it crashes, asterisk01 would have to re-configure the FB, so asterisk01 needs to have access to the config port. Of course, now asterisk01 is a SPOF: if our backup server goes down for any reason, we risk losing control of the FB rendering our cluster unusable!
We use the FreePBX web GUI, which in turn uses a mySQL DB to store all the settings. If you don’t use it, you can skip all instructions referring to mySQL and Apache.
mySQL’s native ndb clustering is quite useful here. Set it up, have the service up at all times on both nodes, and the DB system automatically handles the synchronization across the cluster.
Setting up a mySQL cluster is out of the scope of this document, check the official docs here or look for a howto on Google.
All of Asterisk’s config files, libraries, modules, the users’ voicemail dirs… need to be synchronized over the cluster’s nodes. There are several alternatives here:
Our csync2.conf file looks like this:
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;
}
We run the synchronization every five minutes. There’s no need to sync more frequently, as there won’t be that many changes in the configuration (it’s a stable system, maybe a new phone added every X weeks) and we seldom use the voicemail. The synchronization is launched from /etc/cron.d/FB-csync2:
This /tmp/.FB-master file is just a “flag” that marks the master server, so that the synchronization is only run there. On the section about heartbeat we’ll see how and when this file is created.
fonulator is Redfone’s utility to configure the foneBRIDGE. As I’ve explained before, only asterisk01 (the backup system) can configure the FB in our setup, and each server is connected to a different ethernet port on the FB. So in the event of a crash, we need to change the destination server AND the interface used to send it the TDMoE frames.
To this end, we have two different redfone.conf files (redfone_asterisk00.conf and redfone_asterisk01.conf). They look the same except for the “serverX” and “fbX” directives on the spans:
# 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
That was redfone_asterisk00.conf. It instructs the FB to send the ISDN traffic to asterisk00 (server1 here) over the second ethernet interface (fb2). The redfone_asterisk01.conf file uses server2 and fb1.
And now, the final piece that ties the rest together: heartbeat. Our haresources file looks like this:
Meaning that:
# 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
FB_master creates the /tmp/.FB-master “flag” file we talked about before, and forces a sync both on the start (to make sure both servers have the same data) and on the stop (to sync back to the primary server any changes after a takeover-and-back):
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
Finally, FB_asterisk starts the Asterisk service. We run Asterisk via daemontools using my scripts available here, so basically what this FB_asterisk script has to do is “svc -u/-d /service/asterisk”:
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
All the aforementioned scripts and config files are available here. Think of them as a base to make your own Asterisk/foneBRIDGE setup. And feel free to mail me back any improvements, errors you may find, etc.
Si te ha interesado, ¿me invitas a una cerveza? / If you liked the post, would you buy me a beer?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!)
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. ![]()
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.
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.
A co-worker and I have made a Spanish translation of the Sandbox theme for WordPress, following these instructions: Playing with Gettext in the Sandbox.
The translation is available here for download (direct links to the files I’m using right now):
In order to use it, just copy these files into wp-content/themes/sandbox.
Comentarios