TL; DR

Cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería.

La variable que desaparecía

El otro día trabajando con un script en bash me volví un poco loco con una variable que modificaba dentro de un bucle while y que luego parecía no guardar su valor una vez terminado el bucle. Como era un comportamiento que para nada esperaba me costó lo mio dar con el problema. No era un problema del bucle, si no de que éste formaba parte de una tubería (pipe):

var1=0
echo $VARIABLE1 | 
while read task; do
  # cuerpo del bucle
  var1=2
  # ...
done
echo "$var1"


> 0

Efectivamente, cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería.

En esta web se puede leer una descripción detallada de este comportamiento, qué sucede en las diferentes versiones de shell, así como diferentes maneras de sortearlo.

De las propuestas, la solución que decidí adoptar en mi caso fue el agrupamiento de comandos (Command grouping) así:

var1=0
 
echo $VARIABLE1 |
{ 
  while read task; do
    # cuerpo del bucle
    var1=2
    # ...
  done
  echo "$var1"
}

> 2

Que, como explican en la página, no altera para nada el tema de la subshell, pero como en este caso no necesitaba reutilizar nada de lo que allí había en el resto del código, resulta una solución suficiente y rápida de aplicar.

De paso, he descubierto esta página que parece que va a ser una referencia útil a la que volver de vez en cuando.

Fuente:

BashFAQ

En un post de 20151 de su blog FlowingData, Nathan Yau nos da algunas de las reglas que debemos tener siempre en cuenta a la hora de realizar gráficos:

La línea base de los gráficos de barras debe empezar en cero

Los gráficos de barras se basan en la longitud de las barras para mostrar la información. Si se desplaza la línea base, se distorsiona el significado. Ejemplo:

plot of chunk graficoBarras

No pasarse haciendo trozos en los gráficos de tarta

De hecho hay quien considera que los gráficos de tarta no deben usarse en ningún caso. Ejemplo:

plot of chunk graficoTrozos

Respetar las partes de un todo

Los gráficos que representan partes de un todo (como los gráficos de tarta, mosaicos, etc.) deben comportarse como tales y cada sección de los mismos debe representar una proporción separada, que no se superpone con las otras.

plot of chunk partesTodo

Mostrar los datos

Esto parece algo obvio, ya que es la función principal del gráfico. Sin embargo, se suele fallar en este propósito cuando se muestran demasiados datos de una vez. Algunas soluciones sencillas que se pueden aplicar:

  • Cambiar el tamaño de los símbolos para que no ocupen tanto espacio. Se trata de incrementar el espacio en blanco.
  • Usar transparencias para que todos los símbolos se vean aun cuando tengan otros encima.
  • Separar la población en subgrupos, bien por muestreo o usando categorías.

Explicar lo que se muestra

Cuando realizamos gráficos, codificamos los datos a través de formas, colores y tamaños. Es necesario por tanto incluir siempre las claves que nos permitan entender el gráfico. Esto incluye ponerle título, etiquetar los ejes, añadir leyenda, etc.

Por último, os recomiendo leer el libro de Nathan Yau, Data Points (recomiendo éste porque es el único que he leído, pero los demás tienen muy buena pinta también) y visitar su página FlowingData.com que contiene multitud de información sobre estadística y visualización de datos, parte de ella de libre acceso y otra parte accesible mediante subscripción.

Fuente:

No puedes reproducirlo si no entiendes de dónde viene un número.
No puedes reproducir lo que no recuerdas. Y creéme: no lo recordarás.
No puedes reproducir lo que has perdido. ¿Y si necesitas acceder a cómo era un archivo hace 1, 10, 100 o 1000 dias?

Ben Bond-Lamberty @BenBondLamberty

Edward Tutfe no se anda por las ramas. Ya en la primera página de su excelente “The Visual Display of Quantitative Information” nos cuenta que los gráficos deben (la traducción es mía):

  • mostrar los datos,
  • inducir al observador a pensar sobre el contenido y sentido de los datos más que sobre la metodología, el diseño, la tecnología con que se ha construido el gráfico o cualquier otra cosa,
  • evitar deformar lo que los datos tienen que contar,
  • presentar muchos números en un espacio pequeño,
  • conseguir que los grandes conjuntos de datos sean coherentes,
  • animar al observador a comparar diferentes porciones de los datos,
  • revelar los datos a diferentes niveles de detalle, desde la vista general al detalle,
  • servir de forma clara a un propósito razonable: descripción, exploración, tabulado o decoración,
  • estar perfectamente integrado con la descripción estadística y verbal del conjunto de datos.

Aerobatic

Hasta ahora esta web se desplegaba usando Aerobatic. Aerobatic se instalaba como un complemento de Bitbucket. Se indicaba una rama del repo y con cada push, Aerobatic ejecutaba Jekyll de forma interna y volvía a construir el directorio _site y a servirlo en forma de página web. El plan gratuito permitía utilizarlo con un máximo de dos repositorios y utilizar un dominio personalizado.

Por desgracia, han avisado que para marzo (de 2017) se introducen cambios en el sistema de precios del producto, de forma que ahora, aunque el plan gratuito permite tener tantos proyectos como se quiera, no permite usar un dominio personalizado (sólo se pueden usar direcciones del tipo: https://nombre-del-sitio.aerobatic.io ), de forma que no podía seguir usando mi dominio dmts.es. El plan de pago más barato suponen 15$ al mes, lo que para un blog tan sencillo como este me parecía excesivo 1.

Buscando alojamiento

Había que buscar un substituto. El precio era importante. Buscaba una opción gratuita o de bajo coste. También un mínimo de calidad. El despliegue automático de Jekyll a partir de un repositorio git, aunque cómodo, no era necesario. Construir la página en local y después subir el directorio _site tampoco supone mucho trabajo.

En este momento, me era posible usar el servidor de Terrativa, donde estaban alojadas la web, la página de cursos y algunos otros servicios. Pero prefería una solución independiente.

Contemplé tres opciones:

  • La más obvia es la opción de usar Github Pages. Al igual que ocurria antes con Bitbucket+Aerobatic, Github Pages da la opción de construir automáticamente un sitio Jekyll a partir de un repositorio y servirlo a través de una URL tipo usuario.github.io o una URL personalizada. Los “peros” de esta opción son dos: por una lado este despliegue automático de sitios Jekyll, por motivos de seguridad sólo está disponible para sitios que no incorporen plugins de Jekyll; por otro, la versión gratuita de Github es sólo para proyectos de código abierto, por lo que todo el código tendría que ser público, incluyendo borradores y otra información que en principio no se pensara en compartir. Ambos problemas tienen fácil solución si lo que se utiliza como repositorio en Github es el directorio _site.

  • Amazon AWS. Nunca he usado el servicio de Amazon y me apetecía cacharrear con ello. Además tienen su plan gratuito durante el primer año precisamente para eso, para que cacharrees sin miedo.

  • Google Firebase. Es una plataforma en principio para diseño de app en la nube, pero que se ha convertido en una plataforma en la nube para todo tipo de desarrollos y almacenaje. En este caso el plan gratuito no parece tener más “peros” que sus menores capacidades, que desde luego dan más que de sobra para proyectos personales.

Finalmente, como ya estaba estudiando utilizar Firebase como medio para implementar los comentarios en el blog sin tener que recurrir a servicios de terceros (usar DISQUS o los comentarios de Facebook suele ser una opción habitual en los blogs con Jekyll), me he decantado por esta última opción.

En un próximo post contaré cómo utilizar Google Firebase para un blog Jekyll.

  1. No es el único cambio que implementaba Aerobatic. Lo más relevante es que pasa de ser un plugin para Bitbucket a una aplicación independiente, con opción de línea de comando o de panel web. Aquí está el post que detalla todos los cambios. Sigue siendo un servicio muy interesante, que incluye CDN, SSL, etc, pero queda un poco sobredimensionado para lo que yo necesito.