Tux Wifi Logo

Lo hice y lo entendí

El blog de Vicente Navarro Jover
29 Dic

sleep en scripts de Windows. Operaciones aritméticas en CMD. Comandos para scripting del ResKit.

En Ejemplos de scripting en Windows: Añadir la fecha y la hora al nombre de un fichero estuvimos viendo algunas indicaciones para hacer scripts en Windows algo más sofisticados de lo habitual.

Siguiendo un poco con la temática de hacer scripts o ficheros batch en Windows, hace unos días me encontré con el problema de que en Windows por defecto no hay un comando sleep como en los sistemas UNIX. Googleando, encontré la página Batch file SLEEP Command que explica que en las Windows Server 2003 Resource Kit Tools hay un sleep.exe. Sin embargo, es posible que queramos hacer un script portable que podamos ejecutar en cualquier sistema sin necesidad de tener que instalar o copiar nada adicional. Incluso puede haber situaciones en las que simplemente resulte imposible descargar el Resource Kit o copiarlo de otro sistema y realmente necesitemos una especie de sleep en nuestro script. Pues bien, la página Implementing the WAIT Command in a Batch File nos hace una sugerencia que me ha gustado mucho basada en el comando ping de Windows, que por defecto (y no se puede cambiar) manda un paquete ICMP por segundo.

Sigue leyendo »

26 Dic

¿Piensas en si un día te roban el portátil?

Los ordenadores portátiles, cada día más ligeros y móviles ellos, son un caramelo muy apetitoso para los “amigos de lo ajeno”. Y a menudo los solemos llevar con nosotros en lugares en los que éstos abundan: estaciones, aeropuertos, oficinas, hoteles, cafeterías… Conozco de primera mano casos de oficinas en los que el propio guardia de seguridad de la empresa se dedicaba a “tomar prestados” durante la noche los portátiles de los empleados que se los dejaban allí de un día a otro incluso con el Kesington lock puesto. Por la mañana los usuarios llegaban y sólo encontraban un trozo de cable de acero colgando de la mesa. Por supuesto, lo descubrieron, pero los portátiles ya no aparecieron. También conozco otro caso de alguien que se dejó el portátil con un importante trabajo de varios meses a punto de finalizar dentro de la caja fuerte de un hotel que fue fácilmente forzada en un rato que él se encontraba fuera de la habitación. Los casos de maletines de portátiles robados en aeropuertos o en coches aparcados ya ni siquiera son anécdota.

La motivación de un ladrón será mayormente económica y en la inmensa mayoría de los casos no buscará específicamente nuestro portátil, ya que muchas veces será un efecto colateral de un robo más amplio (robo en una vivienda, en un coche, del equipaje durante un viaje…). Sin embargo, también puede darse el caso de que nuestro portátil haya desaparecido por motivos relacionados con la información que contiene.

Sigue leyendo »

09 Dic

Compilar el kernel de Linux

La compilación del kernel es un tema sobre el que ya hay muchos tutoriales, pero puesto que alguna vez se ha pedido en los comentarios[1], voy a intentar hacer un resumen sobre cómo lo suelo hacer yo en mis Debian.

¿Por qué podemos querer compilar el kernel? Pues normalmente porque tengamos algún hardware que no esté soportado por el kernel estándar de la distribución (por ejemplo, en este blog, lo hemos usado mucho cuando hablábamos de compilar los drivers gráficos para los chipsets de las VIA EPIA) o porque haya alguna aplicación que necesite crear módulos del kernel para poder trabajar, como por ejemplo el VMWare o el kqemu. En Cómo mantener los acentos y las eñes al montar NTFS, FAT o smbfs y al compartir directorios con Samba también lo usamos para modificar el juego de caracteres a usar por defecto. Hace poco, en Probando la netconsole de Linux, también nos hizo falta recompilarlo, así como en Solucionando el error “attempt to access beyond end of device” con reglas de udev, hal y/o un parche del kernel y en Hibernación en Linux con TuxOnIce. Notas sobre los initrd y sobre cpio.

La mayoría de las distribuciones esperan que se compile e instale el kernel con sus herramientas específicas. En el caso de Debian y Ubuntu, normalmente con la herramienta make-kpkg del paquete kernel-package, como podemos leer en:

Y de hecho, las distribuciones ya suelen llevar sus fuentes del kernel preparadas a su medida:

# apt-cache search linux-source
linux-patch-debian-2.6.22 - Debian patches to version 2.6.22 of the Linux kernel
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Debian patches
linux-tree-2.6.22 - Linux kernel source tree for building Debian kernel images

Sin embargo yo, como buen abuelo cebolleta de Linux, sigo haciéndolo como lo he hecho toda la vida, de una forma totalmente independientemente de la distribución usada.

Lo primero es descargar el kernel deseado de www.kernel.org. Los kernels disponibles en este sitio son denominados vanilla kernels, indicando con este nombre que son puros en el sentido de que son tal cual los desarrolladores del kernel los han liberado. Posteriormente las distribuciones suelen distribuir kernels parcheados para añadir funcionalidades que no existen en el kernel vanilla (por ejemplo, el bootsplash o la hibernación con TuxOnIce) o para añadir soporte a hardware que no está aún soportado. No es raro ver en las listas de distribución de proyectos que incluyen parches del kernel que antes de permitirte abrir un bug te pidan que pruebes con un parche vanilla para descartar que los parches de tu distribución estén causando el comportamiento indeseado.

Sigue leyendo »

09 Dic

Configurar una Hauppauge WinTV-HVR-3000 en Linux

Hace unos meses contaba en Configuración de una Hauppauge WinTV-HVR-1100 en Linux cómo configurar una Hauuppauge WinTV-HVR-1100. En aquella entrada mencionaba que la WinTV-HVR-3000 es similar a la HVR1100 pero soportando adicionalmente DVB-S, por lo que es capaz de sintonizar el trío TV analógica/TDT/Satélite.

Por haber nombrado a la HVR3000 comenzaron a llegar bastantes visitantes que buscaban cómo configurarla en Linux. Dos de ellos, Alberto y Sergio, comenzaron a tratar el tema en los comentarios y posteriormente se les unió X04n 2.0 que con las pistas previas dio con la solución definitiva, que documentó de forma excelente. Yo no tengo una HVR3000, por lo que no puedo probar personalmente si realmente funciona, pero como creo que sí, he pensado que no está de más dedicarle una entrada.

El problema de la HVR3000 es que, aunque aparece en el Documentation/video4linux/CARDLIST.cx88 de las fuentes de un kernel 2.6.22.10:

 53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T  [0070:1404,0070:1400,0070:1401,0070:1402]

y está definida en el fichero drivers/media/video/cx88/cx88-cards.c:

        [CX88_BOARD_HAUPPAUGE_HVR3000] = {
                /* FIXME: Add dvb & radio support */
                .name           = “Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T”,
                .tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .tda9887_conf   = TDA9887_PRESENT,
                .input          = {{
                        .type   = CX88_VMUX_TELEVISION,
                        .vmux   = 0,
                        .gpio0  = 0×84bf,
                },{
                        .type   = CX88_VMUX_COMPOSITE1,
                        .vmux   = 1,
                        .gpio0  = 0×84bf,
                },{
                        .type   = CX88_VMUX_SVIDEO,
                        .vmux   = 2,
                        .gpio0  = 0×84bf,
                }},
                .mpeg           = CX88_MPEG_DVB,
        },

vemos la nota “/* FIXME: Add dvb & radio support */“, indicando que aún no hay soporte de la mayor parte de funciones de la tarjeta.

El desarrollador del proyecto V4L Steve Toth (por la dirección de correo parece que es empleado de Hauppauge) estuvo trabajando hasta Octubre de 2006 en el soporte de esta tarjeta: hvr3000 development repository. En la lista de distribución de DVB de linuxtv.org, Steve contó que sus drivers son, de momento, una proof of concept ([linux-dvb] Hauppauge WinTV HVR 3000 Questions):

they are not ready for merging into the mainline and are proof of
concept patches to handle multiple DVB frontends on a single shared
transport bus. They worked fairly reliably last I tried, although they
need to cleanup and sanity checks before any merge could occur.

Pero claro, por aquellas fechas el último kernel disponible era el 2.6.18 y desafortunadamente estos drivers no funcionan en kernels posteriores ([linux-dvb] HVR-3000: fixed by downgrading kernel, any ~stoth/hvr3000 patches for >2.6.18 kernels?):

> Does anyone know if any *working* patches exist to get Steve Toth’s HVR-3000
> driver (currently in hg under ~stoth/hvr3000) working on newer kernels? I got
> it to compile fairly well, it just didn’t do much after it was compiled…

The best bet is to compile steven’s branch (~stoth/hvr3000) with vanilla
kernel 2.6.18. Changes introduced in this branch include support for
multiple exclusive frontends on a single bus, it’s somehow experimental
and it will need several changes prior to include in the main branch.

Analog works ok, DVB-T ok, DVB-S working with some troubles with diseq.

En un mensaje a la lista más reciente (Jul/07) nos enteramos de que la inclusión de drivers para esta tarjeta está a la espera de la inclusión de multi-protocol code en el V4L. ¿Tal vez porque tiene que soportar a la vez DVB-T y DVB-S como decía Steve (”handle multiple DVB frontends on a single shared transport bus“)? ([linux-dvb] [Fwd: Re: OHauppauge WinTV HVR-3000 or 4000]):

The HVR-3000 is “supported” by a branch created by Steven Toth. It’s
not seen any updates in a while, and currently (as far as I know)
doesn’t compile with kernels after 2.6.18. It’s working ok for me here
though. I think the reason for no updates / lack of inclusion in
mainline dvb is that he is waiting for some sort of multi-protocol code
to be implemented into the mainline dvb code.

La Hauppauge WinTV-HVR-4000 es una tarjeta que además de soportar TV analógica, DVB-T y DVB-S como la HVR3000, soporta DVB-S2 (emisiones por satélite en alta definición) y TDT en alta definición (a España aún no ha llegado). Pues bien, en la lista de distribución hablan a menudo también de la HVR4000 relacionándola con la HVR3000 porque el soporte de ambas parece que va relacionado. En ese contexto, me temo que es totalmente desalentador para los propietarios de una HVR3000 oir de boca de Steve hace menos de un mes (11/11/07) que mejor olvidar la HVR3000 y comprar una HVR4000 en eBay ([linux-dvb] Future of HVR3000?):

James A R Brown wrote:
> I guess this email is more for Steve and Manu.
>
> It is very pleasing to see the work going on for the HVR4000 and pushing
> the multiproto tree back into the main tree.
>
> Infact its a breath of fresh air as I have sadly watched the HVR3000
> branch be stripped to DVB-T and merged in without the DVB-S Support and
> was actually wondering if the card would be simply passed over by
> LinuxTV. It probably almost has by the HVR4000, but then again HVR3000
> is becoming a cheap card in the UK. (1/2 price of HVR4000)
>
> So my question is, once HVR4000 and multiproto are back in the main
> tree, are there any plans to also merge in the HVR3000 tree with
> multiproto support or should I stick them on ebay and look to the HVR4000?

Use ebay.

- Steve

Sigue leyendo »

08 Dic

Probando la netconsole de Linux

Trabajando en la entrada Configurar Linux para permitir el acceso remoto por módem a la consola y por RAS/PPP, descubrí en el fichero Documentation/kernel-parameters.txt de las fuentes del kernel el fichero Documentation/networking/netconsole.txt que cuenta cómo configurar el kernel para poder monitorizar sus mensajes remotamente a través de una red Ethernet y usando paquetes UDP. No se puede hacer exactamente desde el primer momento del arranque como hacíamos con la consola serie, claro, sino que es únicamente a partir del punto en el que los drivers de la tarjeta de red sean cargados. Esto es porque mientras que el puerto serie es único y se puede configurar de forma muy sencilla desde el primer momento, las tarjetas de red posibles se cuentan por cientos.

It can be used either built-in or as a module. As a built-in,
netconsole initializes immediately after NIC cards and will bring up
the specified interface as soon as possible. While this doesn’t allow
capture of early kernel panics, it does capture most of the boot
process.

No confundamos la netconsole de Linux con la “LAN Console” de los grandes sistemas UNIX, que es simplemente un chip independiente del sistema que redirige la salida de la consola serie típica a un pequeño servidor de telnet, por ejemplo, y que nos permite interactuar con la consola por la red pero exactamente igual que si estuviéramos conectados con cualquier tipo de terminal serie. La netconsole de Linux es más bien un netlogging o un “kernel-level network logging via UDP packets” tal y como se referían a ella cuando sacaron el primer parche que lo permitía: [patch] netconsole - log kernel messages over the network. 2.4.10.

La forma de usarla es:

It takes a string configuration parameter "netconsole" in the
following format:

 netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]

   where
        src-port      source for UDP packets (defaults to 6665)
        src-ip        source IP to use (interface address)
        dev           network interface (eth0)
        tgt-port      port for logging agent (6666)
        tgt-ip        IP address for logging agent
        tgt-macaddr   ethernet MAC address for logging agent (broadcast)

Examples:

 linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc

  or

 insmod netconsole netconsole=@/,@10.0.0.2/

Built-in netconsole starts immediately after the TCP stack is
initialized and attempts to bring up the supplied dev at the supplied
address.

The remote host can run either ‘netcat -u -l -p <port>’ or syslogd.

En el kernel por defecto de Debian el netconsole viene como módulo, no integrado en el kernel:

# grep -i netconsole /boot/config-2.6.18-5-686
CONFIG_NETCONSOLE=m

Sigue leyendo »

08 Dic

Configurar el syslogd para que acepte mensajes de sistemas remotos

Ya he comendao alguna vez que el router que uso para conectar a Internet es un Zyxel 660HW-61. Este router permite enviar sus mensajes al syslog de una máquina UNIX remota:

Zyxel syslog

El puerto de red asignado al syslog es el 514/UDP:

# grep syslog /etc/services
syslog          514/udp

Sin embargo, el proceso syslogd de Debian no se conecta a ese puerto porque no escucha mensajes de la red por defecto. Si queremos que lo haga, tenemos que editar el fichero /etc/default/syslogd, que en la configuración estándar no contiene ninguna opción:

# For remote UDP logging use SYSLOGD="-r"
#
SYSLOGD=""

Si queremos que escuche de la red, hemos de especificar la opción -r:

# For remote UDP logging use SYSLOGD="-r"
#
SYSLOGD="-r"

que sirve precisamente para esto:

       -r     This option will enable the facility to receive message from the
              network using an internet domain socket with the syslog  service
              (see  services(5)).   The default is to not receive any messages
              from the network.

y reiniciar el proceso con “/etc/init.d/sysklogd restart“. Tras esto, podremos comprobar que el demonio funciona con la opción deseada

# ps -ef | grep syslog
root      4547     1  0 17:35 ?        00:00:00 /sbin/syslogd -r

y que el proceso está escuchando en el puerto 514/UDP:

# netstat -a | grep syslog
udp        0      0 *:syslog                *:*

Puesto que los mensajes del Zyxel van a llegar por la facility local2, podemos querer establecer un fichero de log específico para él en el /etc/syslog.conf (para que se relea después de modificarlo, haremos un “/etc/init.d/sysklogd reload“):

local2.* /var/log/zyxel.log

Si quisiéramos que fuera un sistema Linux (por ejemplo, una Debian) el que mandara ciertos mensajes a un syslog remoto, podríamos hacerlo simplemente poniendo en el syslog.conf una línea como:

local3.* @sistemaremoto.dominio

Tras releer la configuración, con una sencilla prueba con el comando logger:

logger -p local3.info "Mensaje de prueba"

veremos que, efectivamente, el mensaje aparece en el sistema remoto en varios logs configurados para recibir mensajes de la prioridad formada por la pareja facility/level que hemos especificado:

# grep "Mensaje de prueba" /var/log/*
/var/log/messages:Dec  8 18:18:15 ordenador logger: Mensaje de prueba
/var/log/syslog:Dec  8 18:18:15 ordenador logger: Mensaje de prueba

Recordemos que las facilities son:

  • auth, security 1
  • authpriv
  • cron
  • daemon
  • ftp
  • kern
  • lpr
  • mail
  • mark (sólo para uso interno)
  • news
  • sys-log
  • user
  • uucp
  • local0 → local7

y los levels:

  • debug
  • info
  • notice
  • warning, warn 1
  • error, err 1
  • crit
  • alert
  • emerg, panic 1

1. En los casos en que aparecen dos etiquetas juntas, la segunda es equivalente a la primera y está obsoleta.

Si tomamos una traza de red vemos que el protocolo (BSD syslog Protocol) es extraordinariamente sencillo (RFC 3164):

wireshark syslog trace

Podemos ver que la prioridad es un byte que contiene la facility (5bits) y el level (3bits).

Con un simple netcat también podemos mandar mensajes a un syslogd remoto que esté escuchando la red, aunque no pongamos la cabecera con la prioridad y la fecha del evento:

# echo "Nuevo mensaje de prueba con el netcat" | netcat -q 0 -u 192.168.1.20 514

y en el /var/log/syslog remoto encontramos el mensaje:

Dec  8 18:39:15 ordenador Nuevo mensaje de prueba con el netcat

:wq

08 Dic

Monitorizando los mensajes del sistema en la consola y en las X

Si queremos tener una ventana mostrándonos en todo momento los mensajes del sistema, el xconsole es la aplicación que necesitamos:

xconsole

En los escritorios moderno, es fácil configurar la ventana para mantener el xconsole en primer plano.

Aunque la documentación de xconsole diga que accede a /dev/console, en muchas distribuciones (Make xconsole work), para evitar multitud de problemas que ocasiona engancharlo al /dev/console relacionados con la no posibilidad de teclear en las ventanas (sólo con hacer un “xconsole -file /dev/console“, se puede comprobar inmediatamente), normalmente las distribuciones crean una named pipe en /dev/xconsole:

# ll /dev/xconsole
prw-r----- 1 root adm 0 2007-12-08 12:27 /dev/xconsole|

en la que el syslogd escribe, como vemos en el /etc/syslog.conf de Debian:

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you’ll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole

Si queremos que algún usuario distinto de root pueda usar el xconsole, habrá que asignarlo al grupo adm (al menos en Debian), pero parece más conveniente simplemente crear un acceso directo usando kdesu o gksu para que nos pregunte el password de root antes de ejecutar el xconsole:

kdesu

Para limpiar los mensajes actuales de la ventana del xconsole, podemos hacer un CONTROL+C sobre ella, como descubrimos en el fichero /etc/X11/app-defaults/XConsole:

*text.baseTranslations:         #override\
        Ctrl<KeyPress>C:        Clear() \n\
        <KeyPress>Clear:        Clear()

Si queremos una especie de equivalente al xconsole en la consola de texto, el syslog.conf estándar de Debian ya nos ofrece una configuración perfectamente válida. Descomentando estas las líneas que envían varias áreas de syslog al /dev/tty8 podremos verlos simplemente pulsando ALT+8 o ALT+CONTROL+8 si estamos en las X:

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
daemon,mail.*;\
        news.=crit;news.=err;news.=notice;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       /dev/tty8

Tras los cambios al syslog.conf, podemos hacer un /etc/init.d/sysklogd reload para que el cambio tenga efecto.

Hay que tener en cuenta que cualquiera con acceso físico a la máquina (incluso sin usuario válido) podrá ver estos mensajes que pueden llevar información sensible, de forma que hay que usarlo con mucha precaución. Por eso está deshabilitado por defecto.

:wq

06 Dic

Configurar Linux para permitir el acceso remoto por módem a la consola y por RAS/PPP

En los PCs, la entrada estándar siempre ha sido el teclado, y la salida estándar, el monitor a través de la tarjeta de vídeo. Sin embargo, en los grandes sistemas UNIX, la entrada/salida estándar ha sido tradicionalmente a través de un terminal o un módem serie. Incluso en workstations UNIX enfocadas a CAD con monitor y teclado, siempre ha existido la posibilidad de gestionar la máquina desde el arranque por el puerto serie. En ocasiones, los fabricantes han redirigido esa conexión serie a un servidor de telnet para tener una “LAN Console” y en otras, a un servidor web, para tener una “Web Console”, pero en definitiva, los que hacen es facilitarnos el acceso a lo que sigue siendo internamente una consola serie estándar.

Los PCs no están bien preparados para tener como única posibilidad de entrada/salida un terminal serie. Al menos no durante el arranque y para configurar la BIOS. Una vez que el sistema operativo o el GRUB toma el control ya sí que podemos usar el puerto serie para gestionar el ordenador. Pero es precisamente en circunstancias muy dramáticas cuando nos puede interesar especialmente controlar el arranque remotamente. Por eso hay fabricantes de servidores x86 cuyos sistemas permiten redirigir la salida de la BIOS a un puerto serie, como por ejemplo la HP BIOS Serial Console. Para ampliar información sobre servidores con esta posibilidad, podemos leer sobre IPMI y sobre Out-of-band management o Lights-out management. En la web en japonés sobre la tarjeta Lights-Out 100 de HP podemos ver capturas de una BIOS por el puerto serie.

En cualquier caso, en PCs normales no tenemos esta posibilidad. El primer momento en el que podemos comenzar a redirigir la salida estándar es en el GRUB. El segundo momento es al arrancar el kernel de Linux. El tercero es cuando el sistema operativo ya está totalmente arriba.

Veamos cómo acceder a la consola por el puerto serie una vez que el sistema está arriba y luego veremos qué dificultades presentan los otros casos.

Sigue leyendo »

05 Dic

Chivándome a Google de enlaces pagados que no he pagado

Los más fieles seguidores del blog recordaréis la poca gracia que me hizo la bajada de PageRank de Octubre: ¡Mamá, mamá! ¡Google me tiene manía!. En la entrada y en los comentarios ya decía que pensaba que era porque había webs de venta de enlaces que ponían enlaces a este blog para mezclar sitios inocentes con sitios que sí compran enlaces para evitar que Google los detecte correctamente. También lo trató Bytecoders en Cuánto blogohipócrita y lo hablamos en sus comentarios.

Pues bien, aunque sabía que eso ocurría, le había perdido la pista a todos los ejemplos con los que me había encontrado, pero hoy he encontrado un caso flagrante, así que me he decidido a reportarlo a Google usando el formulario del enlace Report paid links de las Webmaster Tools, tal como pide Matt Cutts en How to report paid links.

No pongo un enlace directo a la página para no darle más publicidad, pero esto es lo que le he contado a Google. En el texto podréis encontrar el enlace:

Dear Google

I run a normal Wordpress blog mainly about Linux and Open Source products:

http://www.vicente-navarro.com/blog/

and I try to adhere strictly to the Google Quality Guidelines, AFAIK.

In despite of that, on October the Pagerank of my main page dropped from 5 to 1.

In the past I found by chance some sites linking to my site that were without any doubt paid link farms that included links to “innocent” sites like mine. The Technorati “blog reactions” page used to show those sites, but they are no longer there:

http://technorati.com/blogs/www.vicente-navarro.com%2Fblog?reactions

But today I was searching in Google the title of one of my posts: “Los Linux de mi vida”

http://www.google.es/search?&q=%22los+linux+de+mi+vida%22

and I have found this post in a forum:

http://paseodireccion.webcindario.com/modules.php?name=Forums&file=viewtopic&p=689

At the bottom of it, you can find a lot of links in a really tiny font:

font-size: 1px;

and among those links there’s a link to the post that I was searching in Google:

http://www.vicente-navarro.com/blog/2007/08/29/los-linux-de-mi-vida/

As you can verify by yourselves, I don’t have ads nor hidden content in my blog, and I don’t earn any money with it. I run it only for personal satisfaction. I don’t have any reason for buying links, but a lot of link selling sites are using pages from my blog to insert “innocent” sites among the paid ones.

I like to think that a lot of people really enjoy what I write about Linux in my blog and that a lot of people find solutions for their technical problems in my posts. Why should my blog (and my readers, indeed) be so badly punished when I’m not buying any link?

I follow Matt Cutts’ blog and I know that Google is really interested in maintaining a very high quality in web searches. So, please try to detect all the sites that are using “innocent” pages like mine to hide their bad practices in link selling.

Thank you very much :-)

Regards

Vicente

:wq

02 Dic

Comprimir y cachear las páginas generadas por Wordpress

Las dos entradas anteriores:

trataban de conseguir optimizar el ancho de banda de nuestro servidor web comprimiendo el documento para que ocupara menos y de cómo lograr que el mismo contenido no se tenga que comprimir una y otra vez malgastando inútilmente ciclos de CPU. Sin embargo, aquella teoría estaba orientada a páginas estáticas… ¿Cómo podemos hacer lo mismo para contenido creado dinámicamente como es el generado por Wordpress? ¿Es aplicable?

El contenido generado por Wordpress se puede enviar comprimido a través de varios mecanismos. Por un lado, podemos simplemente señalar la opción “WordPress debería comprimir las entradas (gzip) si los navegadores lo requieren” del panel de “Opciones de lectura” de Wordpress. Por otro, podemos habilitar la opción zlib.output_compression del php.ini (en /etc/php5/apache2/php.ini en Debian):

; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
; Note: Resulting chunk size may vary due to nature of compression. PHP
;       outputs chunks that are few hundreds bytes each as a result of
;       compression. If you prefer a larger chunk size for better
;       performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
;       output_handler, or otherwise the output will be corrupted.
zlib.output_compression = On

Y por supuesto, podemos usar el mod_deflate, que nos comprime la salida generada por Wordpress sin problemas si lo tenemos configurado para que nos comprima los ficheros text/html:

AddOutputFilterByType DEFLATE text/html

Es recomendable no usar más de un método de compresión porque pueden chocar entre ellos.

Sin embargo, todos estos métodos necesitan estar comprimiendo una y otra vez las mismas páginas. ¿Podríamos usar el mod_cache con alguno de estos métodos de compresión como hacíamos con contenidos estáticos y el mod_deflate? Pues desafortunadamente la respuesta es un no.

Si tomamos una traza de red para ver qué cabeceras devuelve una petición enviada a un servidor de Wordpress:

HTTP/1.1 200 OK
Date: Sun, 02 Dec 2007 10:05:43 GMT
Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch7
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Last-Modified: Sun, 02 Dec 2007 10:05:44 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Keep-Alive: timeout=15, max=97
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

vemos que entre otras cosas, una respuesta con “Cache-Control: no-cache” no es cacheada por defecto en ningún caso, tal y como leemos en la Apache HTTP Server Version 2.2: Caching Guide:

Likewise, if the response includes the “no-store” option in a “Cache-Control:” header, it will not be stored unless the CacheStoreNoStore has been used.

Sin embargo, el contenido de Wordpress, aunque se genera dinámicamente, es bastante estático. Una entrada se escribe y a menos que se generen nuevos comentarios o el autor corrija algo, va a permanecer inalterable durante mucho tiempo. Debería de ser fácilmente cacheable… y en realidad así lo es gracias a distintos plugins.

Sigue leyendo »

Tema LHYLE08, creado por Vicente Navarro a partir del tema Fluid Index de 2yi