Copiado vilmente de mi mesa cojea.
It’s no secret that I really like DJB’s software. I think that qmail and djbdns are rock-solid pieces of software, something you can really rely on. But some people just don’t get them and bash them for whatever reasons.
Case in point, djbdns. Many a time I’ve heard the argument that having all tinydns’ domains in a single data file is a PITA. Well, that proves those people don’t get the point in DJB configuration files: you can edit them by hand, but their real power is that they’re easily scriptable! You don’t want having all the domains in a single file? Ok, split them and join them before compiling!
You can do this with the following makefile: split the domains, one per file on the “domains” directory, and work with those files, don’t ever touch the original “data” file again. And if you have a backup server put it’s IP address or FQDN on an env/BACKUP file. Then when you run “make” it will join all the files, compile them and sync the results with the backup server. Easy as pie, don’t you think?
all: data.cdb
data: domains/*[^bB][^aA][^kK~]
cat $+ > data
data.cdb: data
/usr/bin/tinydns-data
[ -f ../env/BACKUP ] && rsync -azv * root@`cat ../env/BACKUP`:`pwd`
clean:
-rm -f *~ domains/*~

Hoy esto va de trailers. :-) Esta no sé si tengo más ganas o miedo de que la saquen. :-/
http://myspacetv.com/index.cfm?fuseaction=vids.individual&videoid=103461823Cuando me compré el MacBook Pro hace dos años y medio me hice también con un Mighty Mouse Wireless. Qué le vamos a hacer, los touchpad no me acaban de gustar y el ordenador lo uso sobre todo como equipo de sobremesa, así que el ratón me viene bien.
De vez en cuando he tenido los típicos problemas de “roña” que se amontona en la bola del scroll y deja de ir en alguna dirección, pero siguiendo las instrucciones de Apple (frotar la bola con un paño húmedo, con fuerza, con el ratón boca abajo) se había solucionado. Hasta ahora. Desde hace un par de semanas el scroll hacia abajo no iba de ninguna manera, y con los procedimientos de limpieza habituales no conseguía nada. Parece mentira que hasta hace unos años los ratones no tuvieran rueda para el scroll (coño, ni botón central) y sobreviviéramos así, es que estas pequeñas cosas no te das cuenta de lo que ayudan hasta que las pierdes. Estas dos semanas tener que usar la tecla de “Av. Pág.” me sacaba de quicio. Así que había que “operar”, a vida o muerte.
Abrir un chisme de Apple siempre tiene su gracia. Con esos diseños tan cuidados y redondeados, sin un sólo tornillo a la vista, muchas piezas van a presión o pegadas con lo que desmontarlas es cuestión de paciencia y mucho tacto.
El siguiente vídeo que he encontrado en ésta página explica el proceso. Es con un Mighty Mouse “Wired”, pero con el Wireless es todo igual. No hace falta la mariconada de palanca que se construye el tío con el “clip” de encuadernar folios, con un destornillador de precisión suficientemente fino (y mucho, mucho cuidado) vale. Inevitablemente van a quedar algunas marcas, pero … mejor eso que gastarse otros 60€ en un ratón nuevo, ¿no? ;-)
Desmontar, limpiar, volver a montar y pegar de nuevo el aro de abajo del ratón. A penas media hora, ratón como nuevo y scroll funcionando.
Por cierto, un componente dentro del bicho tiene un código QR encima, pero el Android no ha sido capaz de leerlo. :-? Curioso.
Last week I’ve been debugging a problem I had with this site’s nginx server: from time to time it hanged and I had to restart the process. Some time ago I wrote a little script that checked if it was running OK and restarted it otherwise, but anyway that wasn’t a real solution.
So I spent some days really looking into it and asking for support and reporting my findings to the nginx mailing list. One useful tip I got there was enabling the “debug” mode on the error log, which shows full traces of the processes (including their PID) as they’re processing the request, the rewrites, upstreams, etc.
error_log /var/log/nginx/$host-error.log debug;
With this extended log and the PID of the process malfunctioning, it’s quite easy finding out what that process was doing right before hanging. In order to find out the PID of the hanged processes, I extended my check-reboot script to log some generic system metrics right before restarting nginx: netstat -nap (which shows the PID), ps, vmstat, etc.
#!/bin/sh TIMEOUT=20 CHECK=http://localhost/wp-admin/ LOG=/var/log/checkWeb/checkWeb-$(date +%Y%m%d).log LOGR=/var/log/checkWeb/restart-$(date +%Y%m%d).log TMP=/tmp/checkWeb-$RANDOM if ! wget -t 1 -o /dev/null -O /dev/nul -T $TIMEOUT $CHECK then echo "ERROR, restarting nginx" echo "** RESTARTING **" >> $TMP date >> $TMP echo "- CLOSE_WAIT:" >> $TMP netstat -nap | grep -c CLOSE_WAIT >> $TMP echo "- vmstat" >> $TMP vmstat 1 5 >> $TMP echo "- free" >> $TMP free >> $TMP echo "- ps" >> $TMP ps aux >> $TMP echo "- netstat" >> $TMP netstat -nap >> $TMP echo "" >> $TMP echo "" >> $TMP # pkill -9 -f php-cgi pkill -9 -f nginx sleep 1s /etc/init.d/nginx start cat $TMP cat $TMP >> $LOG date >> $LOGR fi rm -rf $TMP
This way, each time localhost/wp-admin was unresponsive (I was debugging a WP site), besides restarting nginx I was getting a lot of system info. With time I got to realize that nginx processes were not actually hanging, but some of their sockets got on the CLOSE_WAIT state forever until the process was restarted. Looking for the PID of those processes according to netstat on the error log, the last request they were processing before getting to the CLOSE_WAIT state was always the same: on my blog I have some examples of how running servers with daemontools; daemontools uses named pipes (FIFOs), which can become kind of black holes if there’s no process feeding them; when nginx hit one of these FIFOs, it hanged.
Funny thing is that I never had this problem with either Apache nor lighttpd. But anyway the problem is not nginx but those FIFOs which shouldn’t really be there. I removed them and have had no hanged processes in five days, while before this nginx was restarting 3-4 times a day.
The find command has an -empty option which detects empty directories of files (0bytes). This is useful if you need to locate or remove empty directories or files from a directory structure:
find /path/ -type d -empty -exec rmdir {} \;
find /path/ -type f -empty
With nginx and its embedded Perl module it is possible to automatically rewrite/redirect every incoming request to a lowercase URL with something like this:
http {
...
perl_modules perl/lib;
perl_set $uri_lowercase 'sub {
my $r = shift;
my $uri = $r->uri;
$uri = lc($uri);
return $uri;
}';
...
}
server {
...
location / {
if ( $uri != $uri_lowercase ) {
rewrite . http://$host$uri_lowercase;
}
# or just:
# rewrite . $uri_lowercase;
}
...
}
The first option (with the if and http://$host) sends an HTTP redirect to the lowercase URL if the requested URL is not completely in lowercase. I like this approach better as it kind of normalizes all URL to a canonical form. The second option (without if nor http://) just accepts any URL and internally rewrites them to lowercase: if you rename all your directories and files to lowercase, this will imitate Windows’ case-insensitive behaviour.
Kudos to the following post on the nginx users list were I draw the “inspiration” :D from to get this done. The embedded perl doc and examples are indeed scarce. :-(
http://forum.nginx.org/read.php?2,39425,39944
Anyway I see two problems in this approach:
- you need the embedded perl module which according to the docs is experimental and can lead to memory leaks.
- the actual redirection is done with the rewrite, which you can put on the location you need. But the URL lowercase calculation, being on the “http” section of the config, is done for each and every request arriving to your server. Say you have a virtual server with 10 domains and you only need this on one particular location of one of them. The lowercase URL is going to be calculated for every request of every domain.
I guess that by defining a perl function the URL calculation could be restricted to a particular location, have to look into it further. Another option is writing a C module.
And why would anybody want to rewrite every URL to lowercase? We’re migrating a legacy Tomcat-based application from Windows to Linux, and it seems the original developers were not “case-aware” at all, they mixed upper and lowercase in the filenames without regarding how the actual files were named. On Windows this is not a problem but when moving the app to Linux it is. So we have renamed every file and directory to lowercase and used the previous configuration on the nginx servers that load-balance our Tomcat farm. Some corner-cases remain (includes in JSP files, which don’t route back to the nginx server and are dealt internally by Tomcat) and have been dealt with one by one, but the bulk of wrongly addressed images, videos, links to HTML files, etc. now works.
Amazon EC2 virtual servers’ internal clock is synchronized with that of their host server. But some host servers seems to be off-date: I’m working on a four-server cluster (will grow to eight when we go into production) and while three of them were perfectly synchronized, the fourth one lagged behind a couple of minutes.
By default you can’t adjust the date with either date nor ntp, the commands execute but do nothing. In order to decouple the VM’s clock from the host’s one and being able to set the time on your system you need to run the following command:
echo 1 > /proc/sys/xen/independent_wallclock
Bear in mind that, as pointed out here, after decoupling your clock from the host’s you can’t go back, you’ll be on your own forever.






Comentarios