A blog about data, information and Tech by Mario Alberich

        

mar. 2
2014

Enlaces de interés 2014-9

feb. 27
2014

Apache: Añadir el tiempo de respuesta en los logs

Apache es una de esas herramientas tan complejas para las que todos utilizamos un porcentaje ínfimo de las opciones que incorpora (y tampoco necesitamos más). Esa complejidad probablemente será una de las razones por las que otros proyectos hayan apostado por alternativas más ligeras como nginx. Pero bueno, eso es otro tema. Aquí vamos a sacarle partido de esa complejidad.

Los logs de Apache tienen un formato predefinido en la configuración por defecto.  En el caso de Apache 2 en Ubuntu (y derivados de Debian), puedes encontrar una lista de los formatos de log dentro del archivo /etc/apache2/apache2.conf, con la directiva LogFormat:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Con lo anterior (en concreto con el formato combined) es perfectamente posible salir a la calle muy dignamente en la mayoría de casos. Eso ya nos aporta información sobre fechas, accesos, navegadores (incluyendo buscadores), respuestas y tamaños en bytes.

Crear un formato propio de log de Apache


Como puedes comprobar en los ejemplos por defecto, todas las variables vienen indicadas con un signo % y una lectra, o bien un %{nombre-entre-llaves} y una letra al final (para las variables de entorno la letra es la e, para las cabeceras de la petición es una i, etc.)

Para añadir un nuevo formato puedes partir de alguno de los casos anteriores (combined por ejemplo) y añadir tu variable:

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %I" sopadebits_combined

Puedes ver que hemos añadido el parámetro %I (número de bytes recibidos). Las dobles comillas puede que pasen desapercibidas pero son importantes: el formato de log va indicado dentro de comillas dobles, y si quieres añadir esas comillas dobles al log, es necesario escaparlas (\").

Con el log anterior, podemos acceder a nuestra configuración de host y modificar el formato del log que queremos:

CustomLog /var/log/apache2/localhost.log sopadebits_common

Añadir el tiempo de respuesta al log de Apache


Ahora sí, ya estamos a punto. Vamos a añadir el tiempo. Pues vaya, resulta que tenemos dos variables:

  • %T proporciona el tiempo en segundos.
  • %D lo proporciona en microsegundos


Pues ya puestos podríamos incluir las dos variables ¿verdad? Las añadiremos al final, después de user agent:

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %T %D" time_combined

Y como hemos hecho anteriormente, ya sólo debemos modificar la directiva CustomLog del virtualhost que queremos configurar con ese formato. Después de esto sólo queda utilizar un sistema para rastrear la información de los logs y detectar las peticiones más lentas. Pero eso queda para otra ocasión.

Otros casos podrían ser, por ejemplo, incluir el contenido de una cabecera de HTTP (por ejemplo generada por la propia aplicación) por ejemplo para llevar un control de las operaciones internas.

Read more »

feb. 25
2014

Javascript: Promises y eventos

Si has desarrollado una buena temporada con Javascript y has requerido de la gestión intensiva de eventos y callbacks, sabrás que es fácil que el flujo de ejecución de la aplicación sea muy difícil de seguir, incluso utilizando profusamente la consola de javascript del navegador y el debugging: salta de un lado a otro y no sabes de dónde viene.

Bienvenido al callback hell.  éste es el escenario en el que una caracerística a priori ventajosa del lenguaje de programación (programación asíncrona de javascript) se vuelve en contra. ¿Y ahora qué?

Javascript y las promesas


Para intentar sincronizar las operaciones asíncronas, se introdujo el concepto de promises.  En palabras llanas es una forma de evitar que la finalización impredecible de los eventos interfiera en el flujo general de la aplicación, consiguiendo un cierto nivel de sincronización que se pierde con los eventos y callbacks. Esto salva la aplicación del callback hell. Vittorio Zaccaria presentó un ejemplo visual para entender las promises de javascript utilizando las redes de Petri.

Pero hay más: aparte de la simplificación que supone la agregación de callbacks en un solo promise, existe un motivo más profundo que no hay que perder de vista: al utilizar las promesas, podemos lanzar excepciones desde las funciones llamadas y esperar que la promesa los capture. Y eso sí marca la diferencia, porque permite recuperar el control sobre los errores. Al recuperar ese control, podemos testear y depurar las aplicaciones con más facilidad.

En el fondo las promesas permiten combinar lo mejor de ambos mundos:

  • Comportamiento asíncrono para aprovechar al máximo la CPU y evitar el bloqueo de operaciones I/O.
  • Comportamiento síncrono sobre el control general del flujo de ejecución, y posibilidad de captura de excepciones.


Como nota al margen: parece ser que jQuery implementó las promesas con un criterio diferente al de CommonJS, y no se plantea modificarlo. Bajo su criterio serán sustituidos por los DOM Futures que son aparentemente mejores (yo no sabría valorarlo ahora mismo), y por ello prefieren mantener la compatibilidad de versiones anteriores. Por ello, si usas las promesas de jQuery, es importante que sepas que su funcionamiento es diferente.

Read more »

feb. 20
2014

grep: contexto de resultado y cantidad de ítems

Conjuntamente con diff, grep es la otra gran utilidad de referencia. En el momento de buscar textos simples o expresiones regulares, la familia de utilidades grep están en mi navaja suiza de utilidades. échale un vistazo al manual de esta utilidad.

Grep mostrando N filas antes y después de la coincidencia


En algunas ocasiones es necesario reconocer el contexto de una coincidencia. Para el caso del código fuente, el archivo donde se ha localizado la coincidencia puede no ser un indicador lo suficientemente detallado. Es por eso que greo proporciona las opcines -An y -Bn para mostrar las líneas posteries y anteriores a la coincidencia, respectivamente.

Así, el comando siguiente:

grep -B2 -A3 hola file.txt

Mostraría las líneas de file.txt que contienen el texto "hola", junto con las dos líneas anteriores y las tres posteriores. Vale la pena no abusar de las líneas de contexto, porque tienden a añadir ruido al resultado.  Encontrando la cantidad de líneas mínimas para ayudarnos a identificar el contexto, ganaremos tiempo. Más allá de ese mínimo, lo estaremos perdiendo.

Grep sólo hasta la enésima coincidencia


En ocasiones no es necesario buscar hasta los confines del mundo. Grep funciona muy bien pero en ciertos casos puede generar una cantidad de resultados que nos desbordan.  En otros casos simplemente necesitamos detectar una cantidad concreta de resultados, o incluso localizar exactamente la coincidencia que está en una posición determinada. Con grep, puedes conseguir ese resultado con la opción -m:

grep -m 3 hola file.txt

Esta llamada va a mostrar las tres primeras líneas que tienen coincidencias del texto hola dentro del archivo file.txt, lo que en el fondo vendría a ser el equivalente (pero mucho más óptimo porque nos evita procesar todo el archivo) que un grep + head:

grep hola file.txt | head -n 3

Sin embargo quizá en alguna ocasión sólo querremos localizar la coincidencia que se encuentra exactamente en la tercera posición. ¿Qué podemos hacer? Una primera solución es: combinar grep y tail de la siguiente manera:

grep -m 3 hola file.txt | tail -n 1

La primera instrucción devuelve los tres primeros resultados, y la segunda devuelve sólo la última fila del resultado anterior (por lo tanto el tercero).

Read more »

feb. 18
2014

Veracidad de la información: Verification handbook

Hacía mucho, muchísimo tiempo que no trataba el tema de la veracidad de la información en internet, y desde entonces este entorno ha evolucionado, y mucho.  En ese proceso de evolución hemos tomado conciencia de la mayor complejidad de las estructuras de red, reflejados no sólo en los aspectos algorítmicos de su análisis sino también en sus implicaciones para las relaciones sociales.

En esa evolución del medio, la profesión periodística se intenta (y puede conseguir) reinventarse, migrando de un contexto de comunicación unidireccional a otro del estilo cluetrain. Escenario: Muchos canales, fragmentación de la audiencia, métricas de rendimiento del servicio para tener ingresos por una publicidad cada vez menos pagada. Opción 1: copia-pega a toda mecha, redacción de contenidos de consumo rápido, competir con contenido amateur. Opcion 2: llegar al modelo de pago por suscripción o por lectura, partiendo de la creación de contenidos de calidad, contrastados, que requieren de su tiempo y esfuerzo (labor periodística, vamos), relación uno-a-uno con el lector...

Volviendo al contexto de Internet, la creación de contenidos de calidad pasa por contrastar las fuentes y su veracidad, pero ese proceso sigue siendo un problema en la Red. Lo es, al menos hasta que la multitud de fuentes se convierta en una ventaja, y el filtrado de esas fuentes sea ágil. Y eso es lo que trata de exponer el Verification Handbook, un recurso totalmente gratuito, y que yo pondría al lado del Data Journalism Handbook (también en castellano) en cuanto a recursos que pueden ayudar a relanzar esta profesión.

 

Read more »

feb. 13
2014

diff con resultados side by side

El comando diff es para mí una de esas pocas herramientas clave en la consola de linux, necesarias en mi día a día, en mis tareas de programación y en general para buscar y comparar archivos de texto. Esta utilidad salva muchas vidas en cuanto a errores y seguimiento de la tarea hecha, además que localiza detalles imposibles de encontrar navegando por el código. Estas son tareas clave cuando se trata de un equipo de programación, y no es uno mismo quien programa.

En ese hábito de uso de diff, me he descubierto centrándome en utilizar una pequeña serie de opciones de la utilidad, sin entrar en su manual y ver otras opciones aplicables. Voy a comentar algunas utilidades en diversos artículos para quien pueda resultar útil.

Diff en vista lateral


Esta utilidad muestra por defecto el resultado de las diferencias en una vista vertical. Para diferencias concretas es fácil de analizar, pero si el archivo es largo y hay varios cambios, resulta complicado seguir la lista de cambios sin perderse.

diff archivo1.txt archivo2.txt

Solución: si utilizas la opción "-y", podrás ver el resultado del diff a un lado y a otro de la pantalla:

diff -y archivo1.txt archivo2.txt

El tamaño de ancho por defecto para esta función es de 130 caracteres (unas 60 columnas de texto y algunos centrales usados para dar formato a la salida de diff). En los tiempos actuales es posible que dispongamos de una pantalla panorámica que permita mostrar un mayor ancho. Si quieres ampliar este tamaño, puedes utilizar la opción --width=NUM:

diff -y --width=180 archivo1.txt archivo2.txt

Con este formato es posible ver de una forma más lineal las diferencias. En la parte central del listado se puede distinguir una columna con los caracteres < (hay añadido en el archivo izquierdo), | (contenido idéntico), y > (añadido en la parte derecha).

Read more »

feb. 11
2014

Cuatro aprendizajes de las habilidades sociales

Entro en ese terreno que es el offtopic. Me apetece, a pesar del SEO, hacer este pequeño ejercicio para cambiar un poco de tercio. Cuatro aprendizajes sobre las habilidades sociales que recuerdo a menudo (aunque no siempre sepa aplicar):

  • Detrás de la queja hay un elogio: Ese elogio toma diversas formas, pero en esencia significa creo que puedes ayudarme, podemos colaborar, o al menos vale la pena el esfuerzo de comunicarme contigo. De otro modo, ¿Por qué gastaríamos energía?
  • Los rumores y las críticas hablan de sus autores y del camino a seguir: Los rumores, como los tests the Rorschach, son pruebas proyectivas. Proyectan las dudas. El rumor expone lo que puedes aportar de diferente a los demás, pero que éstos no saben aún cómo encajar: si encuentras el camino para madurar esa diferencia, no sólo te acogerán sino que te copiarán.
  • El único gran secreto es aprender a mantener la calma: Como las dietas, el deporte y cualquier actividad que implique disciplina, aplicar un método al principio lo es todo. En las habilidades sociales, mantener la calma implica mantener el riego sanguíneo en tu neocortex y evitar que se dirija a tus músculos. Esa irrigación de tu cerebro racional facilitará la toma de decisiones, la empatía y el autocontrol. No he encontrado ninguna técnica que consiga mejores resultados, si no es precisamente para conseguir relajarme.
  • Por adversa que pueda parecer la situación, estamos preparados: A veces tropezamos, nos mareamos o perdemos el norte. Pero no hemos olvidado cómo se camina. Eso sucede también cuando sufrimos un golpe emocional. Nos desmoronamos porque sufrimos una pérdida, pero nuestra capacidad para superarla sigue intacta. Quizá necesitaremos que alguien nos ayude desde fuera a encontrar la forma, pero en breve seremos capaces de seguir adelante.


 

 

 

 

Read more »

feb. 9
2014

Enlaces de interés 2014-6

Lecturas

</p>

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.