About Manolo Arranz

Contento de estar cerca de los 50 y seguir tocando tecla, tanto en el trabajo como en el tiempo que me deja la familia. Casado, padre de parejita de mellis y padre adoptivo también de una chucha guapísima. Cuanto más sé, más me falta por aprender, qué estrés...

El gráfico de Minard: una infografía de casi siglo y medio

Charles_Joseph_Minard

Una imagen vale más que mil palabras y de ahí el valor de las infografías. Puestos frente a una imagen y un texto explicativo la mayoría miramos la imagen y sin embargo tenemos que hacer un esfuerzo consciente para leer el texto. Por eso es tan interesante el concepto de infografía: la imagen y el texto son un todo y no se entiende el uno sin la otra.

El gráfico de Charles Joseph Minard, que fue inspector general de Puentes y Carreteras, refleja sobre un mapa el trayecto del ejército napoleónico en su campaña de Rusia y está considerado la primera infografía moderna. El tramo de color rojo muestra sobre el mapa el camino de ida hacia Moscú desde la frontera con Polonia y el tramo negro el de vuelta. Cada milímetro de ancho representa 10.000 hombres. Además, un gráfico paralelo muestra las condiciones meteorológicas extremas que tuvieron que soportar los soldados derrotados en su camino de vuelta, combinándolo con las fechas más relevantes.

“El gráfico de Minard es el mejor gráfico estadístico que se haya dibujado nunca” (Edward Tufte)

Lo que el gráfico muestra de una forma brutal es que la campaña la empezaron 442.000 hombres, de los que sólo llegaron a Moscú 100.000 y, tras abandonar Moscú, sólo consiguieron regresar al punto de partida 10.000, que tuvieron que soportar unas temperaturas terribles en su viaje de vuelta, hasta de -30ºC el 6 de Diciembre de 1813.

Minard publicó este gráfico a los 88 años de edad y falleció un año después, el 24 de Octubre de 1870. Esta semana se cumplen 145 años de su fallecimiento. Sirva este post como homenaje a un hombre que se adelantó a su tiempo.

*Edward Tufte, experto en diseño de la información, autor también de la frase “Power corrupts, PowerPoint corrupts absolutely”.

Mi ábaco en la web de UCMAS

Screen Shot 2015-10-14 at 20.21.00

Los amigos de UCMAS España han publicado en su web una versión adaptada de mi ábaco. Si no conocéis el método UCMAS echadle un vistazo, yo empecé con esto del ábaco porque mis críos estaban apuntados y me enganché.

Esta versión incluye, además del modo “FlashCards”, en que hay que identificar el número que aparece en pantalla, un modo “Demo” que reproduce en el ábaco las operaciones (sumas y restas) que vamos introduciendo en el teclado.

 

 

 

 

 

Las metáforas, imprescindibles, pero qué peligro.

 

The_Wasa_from_the_Bow

By Nick Lott – Own work. Licensed under CC BY 2.0 via Wikimedia Commons

Una de las características más llamativas del desarrollo de software para las personas legas en la materia es que es un trabajo invisible. Cuando uno entra en una fábrica de piezas de motor, por ejemplo, puede ver tornos de control numérico, personas limando las rebabas y piezas en distintos niveles de acabado. En una fábrica de muebles veremos tableros, patas torneadas, mucho serrín, mesas a medio montar y percibiremos olor a barniz. Durante la construcción de una vivienda se ven perfectamente los cimientos, forjados, canalizaciones y tabiquería pero en una fábrica de software no hay más que personas delante de un monitor y es imposible tener una idea clara del progreso del trabajo simplemente observando a la gente trabajar.

Para muchos de los perfiles implicados en el desarrollo de una solución software el proceso es un poco más visible, pero no visible del todo. En un proyecto complejo con varias tecnologías implicadas no es raro que pocas personas entiendan cómo encaja cada pieza del puzzle. Surge, por tanto, la necesidad de utilizar metáforas para intentar simplificar la complejidad de lo que se está desarrollando y poder tomar decisiones.

El poder de las metáforas es asombroso. Se dice que el químico alemán August Kekulé estaba obsesionado con intentar entender la estructura del benceno pero por más vueltas que le daba le faltaban dos átomos de hidrógeno, hasta que un día se quedó dormido junto a la chimenea de su casa y soñó con una serpiente que se mordía la cola… acababa de descubrir las cadenas circulares de hidrocarburos.

Benzene Ouroboros

 By DMGualtieri (Own work) [CC BY-SA 3.0], via Wikimedia Commons

Hay metáforas tremendamente llamativas que se han utilizado con frecuencia en la literatura de Ingeniería de Software. El buque Vasa, por ejemplo, construido por Suecia para la guerra que libraba con Polonia y Lituania en el siglo XVII, tenía los requisitos de ser el buque más rápido, más grande y mejor armado. Se construyó con una tremenda presión en fechas (al fin y al cabo había una guerra de por medio y era un proyecto personal del Rey Gustavo Adolfo, que había supervisado personalmente las especificaciones)… y se hundió en el viaje inaugural al primer soplo de viento fuerte, tras quince minutos de singladura. Su estructura, con un centro de gravedad muy alto, fue incapaz de soportar el peso de dos puentes de cañones, el navío se escoró a babor debido al fuerte viento y, al llevar la fila inferior de cañones abierta, entró agua, terminando de desequilibrarlo y hundiéndolo finalmente. Se habían planificado pruebas de estabilidad para el buque pero se cancelaron nada más empezarlas debido a la presión del plazo de entrega, aunque las pocas que se hicieron ya fueron preocupantes. El Vasa es un claro ejemplo de proyecto con requisitos imposibles y de cómo suelen acabar estos proyectos. En la construcción del Vasa se dieron también algunos de los problemas que podemos encontrar hoy en el desarrollo global de software: parece que la masa se distribuyó de forma irregular porque en diferentes fases de su construcción se utilizó el pie sueco y el pie holandés como unidad de medida.

 

El problema es que este poder innegable de las metáforas se puede volver contra nosotros cuando las elegimos incorrectamente o intentamos llevarlas más allá de donde llegan. Por ejemplo, es habitual comparar el desarrollo de software con una cadena de montaje de vehículos y tratar de extraer conclusiones sobre estimaciones y planificaciones de acuerdo con esta metáfora, como si las ventanas de una aplicación se fabricasen en serie como las de un vehículo y los interfaces fueran latiguillos. El problema radica en que la metáfora es incorrecta de raíz: desarrollar software es un proceso complejo y altamente cualificado que no tiene nada que ver con trabajos mecánicos y repetitivos como una cadena de montaje. Si buscamos una metáfora automovilística para la construcción de una solución software es mucho más aproximado el desarrollo de un nuevo modelo de vehículo desde la etapa de concepción hasta que está listo para la cadena de montaje. En este símil la cadena de montaje en realidad sería el equivalente de copiar CD’s (y en eso somos rapidísimos…)

640px-Renault_clay_model_-_front

By DineshAdvOwn work. Licensed under CC BY-SA 3.0 via Commons

Si observamos en detalle cómo es el proceso de diseño de un nuevo vehículo encontraremos numerosas analogías con el desarrollo de software, muchas más que en la cadena de montaje. El proceso automovilístico está resumido aquí: Cuánto se tarda en desarrollar un nuevo modelo de automóvil.

 

Automóvil
Software 
Las condiciones del proyecto Los requisitos
El diseño UML
Las primeras maquetas Mocks
Los prototipos Desarrollo versiones Alfa, Beta, Release Candidate
Pruebas de los prototipos FAT, UAT, …
La fabricación Copia de CD’s, publicación de descargable, etc.

Continue reading

Nuevas funcionalidades en el ábaco

 

El ábaco ha ido ganando funcionalidad y poco a poco se va usando en algunos coles e incluso hay visitas de otros países.

Ahora mismo las funcionalidades existentes son:

  • Normal : En este modo el ábaco simplemente simula un ábaco normal. Se pueden subir y bajar las fichas del mismo modo que se haría en un ábaco físico
  • Guess The Number: Este modo está pensado para practicar el reconocimiento de los números en el ábaco. Se selecciona un intervalo de números y el tiempo deseado en milisegundos y el ábaco muestra un número aleatorio en el rango deseado durante el tiempo indicado. Permite repetir el número y visualizar la solución
  • Abaclock; Si no entiendes cómo funciona un ábaco selecciona este modo. El ábaco muestra la hora actual en formato numérico y representado con las fichas del ábaco. En unos segundos entenderás el funcionamiento básico. También dispones de un cronómetro en el que las cuentas se mueven para mostrar el tiempo transcurrido.

La magia de Vagrant

Vagrant es una herramienta con la que me he topado últimamente mirando herramientas de atomatización relacionadas con el provisionamiento de entornos.

La idea de Vagrant es facilitar al máximo la creación de máquinas virtuales VirtualBox fácilmente distribuibles. Además se integra con Puppet y Chef. Con estas herramientas podemos construir un entorno virtual totalmente configurado para nuestras necesidades, empaquetarlo y distribuirlo. Este entorno puede, inmediatamente, ser arrancado y posteriormente destruido sin dejar rastro en el disco; tambien podemos suspenderlo y pararlo.

La web del proyecto es http://vagrantup.com y la documentación es muy buena, no como la de otros productos OpenSource.

Nuestra máquina virtual

Vamos a crearnos una máquina virtual que utilizaremos para cacharrear con distintas herramientas. Para ello partiremos de una máquina virtual base a la que vamos a instalarle puppet y luego la reempaquetaremos

Lo primero que necesitamos es tener instalado VirtualBox, que es un software gratuito de virtualización proporcionado por Oracle. Es importante resaltar que Vagrant necesita la versión 4.1.0 de VirtualBox o superior. La instalación de VirtualBox es trivial y no es el objetivo de este post.

Además para instalar Vagrant necesitamos tener instalado el software en que se basa: el lenguaje de programación Ruby y RubyGems, ya que Vagrant se distribuye como una gema. Tampoco vamos a hablar aquí de cómo instalar ruby y rubygems.

Instalación de vagrant

macnolo-pro:~ tocandotecla$ sudo gem install vagrant
Fetching: archive-tar-minitar-0.5.2.gem (100%)
Fetching: erubis-2.7.0.gem (100%)
Fetching: net-ssh-2.1.4.gem (100%)
Fetching: net-scp-1.0.4.gem (100%)
Fetching: i18n-0.6.0.gem (100%)
Successfully installed archive-tar-minitar-0.5.2
Successfully installed erubis-2.7.0
Successfully installed net-ssh-2.1.4
Successfully installed net-scp-1.0.4
Successfully installed i18n-0.6.0
Successfully installed vagrant-0.8.10
6 gems installed
Installing ri documentation for archive-tar-minitar-0.5.2...
Installing ri documentation for erubis-2.7.0...
Installing ri documentation for net-ssh-2.1.4...
Installing ri documentation for net-scp-1.0.4...
Installing ri documentation for i18n-0.6.0...
Installing ri documentation for vagrant-0.8.10...
Installing RDoc documentation for archive-tar-minitar-0.5.2...
Installing RDoc documentation for erubis-2.7.0...
Installing RDoc documentation for net-ssh-2.1.4...
Installing RDoc documentation for net-scp-1.0.4...
Installing RDoc documentation for i18n-0.6.0...
Installing RDoc documentation for vagrant-0.8.10...

(el usuario con el que estoy trabajando no tiene todos los permisos, por eso me veo obligado a hacer sudo)
Con esto ya tenemos instalado vagrant

Creación de nuestra máquina virtual

  1. Lo primero nos bajamos una máquina virtual de las que ya están empaquetadas, que nos servirá como base (ver enlaces al final del post). A esta máquina virtual la voy a llamar ttlucid32
    macnolo-pro:~ tocandotecla$ vagrant box add ttlucid32 http://files.vagrantup.com/lucid32.box
    [vagrant] Downloading with Vagrant::Downloaders::HTTP...
    [vagrant] Downloading box: http://files.vagrantup.com/lucid32.box
    [vagrant] Extracting box...
    [vagrant] Verifying box...
    [vagrant] Cleaning up downloaded box...
    


  2. Ahora inicializamos la máquina virtual

    macnolo-pro:vagrant tocandotecla$ vagrant init ttlucid32
    create Vagrantfile

    Con esto simplemente hemos creado el archivo Vagrantfile, que es el archivo de configuración de Vagrant para la máquina virtual que estamos creando. Este archivo tiene muchos comentarios con ejemplos de lo que podemos hacer pero si los eliminamos queda simplemente un trozo de código ruby que configura la máquina virtual con el nombre que le hemos puesto en el comando init (que debería coincidir con el que indicamos en el paso 1 al descargar la VM)

    Vagrant::Config.run do |config|
      # Every Vagrant virtual environment requires a box to build off of.
      config.vm.box = "ttlucid32"
    end
    
  3. En este momento ya tenemos descargada una máquina virtual base y un archivo de configuración que informa a vagrant de su nombre. Esta información es suficiente para arrancar la máquina virtual. Para ello lo único que tenemos que hacer es invocar vagrant up desde el directorio donde está el archivo Vagrantfile

    [default] Importing base box 'ttlucid32'...
    [default] The guest additions on this VM do not match the install version of
    VirtualBox! This may cause things such as forwarded ports, shared
    folders, and more to not work properly. If any of those things fail on
    this machine, please update the guest additions and repackage the
    box.
    
    Guest Additions Version: 4.1.0
    VirtualBox Version: 4.1.8
    [default] Matching MAC address for NAT networking...
    [default] Clearing any previously set forwarded ports...
    [default] Forwarding ports...
    [default] -- ssh: 22 => 2222 (adapter 1)
    [default] Creating shared folders metadata...
    [default] Running any VM customizations...
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Mounting shared folders...
    [default] -- v-root: /vagrant
    

    Vale, ha arrancado, ¿y ahora qué hacemos con ella? ¿Cómo nos conectamos?

  4. Para conectarnos a la máquina virtual debemos invocar el comando vagrant ssh, que nos abre una conexión ssh a la máquina utilizando el usuario vagrant

    macnolo-pro:vagrant tocandotecla$ vagrant ssh
    Linux lucid32 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux
    Ubuntu 10.04.3 LTS
    
    Welcome to Ubuntu!
     * Documentation:  https://help.ubuntu.com/
    Last login: Thu Jul 21 13:07:53 2011 from 10.0.2.2
    vagrant@lucid32:~$
    vagrant@lucid32:~$ who am i
    vagrant  pts/0        2011-12-30 09:22 (10.0.2.2)
    vagrant@lucid32:~$ uname -a
    Linux lucid32 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux
    
  5. Además nuestro directorio de partida en nuestra máquina, se ha convertido en una carpeta compartida en la máquina virtual, accesible en el directorio /vagrant

    vagrant@lucid32:~$ cd /vagrant
    vagrant@lucid32:/vagrant$ ls
    Vagrantfile
    
  6. El objetivo de nuestra máquina virtual es probar puppet y chef, que son softwares de provisionamiento, es decir instaladores con esteroides. La máquina virtual descargada ya trae instalados ambos, así que simplemente vamos a instalar apache. Esto se puede hacer desde el propio archivo Vagrantfile utilizando puppet o chef pero como aún no hemos trasteado con estas herramientas lo vamos a hacer por el método tradicional desde la propia máquina virtual

    vagrant@lucid32:~$ sudo apt-get install apache2
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following extra packages will be installed:
      apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    Suggested packages:
      apache2-doc apache2-suexec apache2-suexec-custom
    The following NEW packages will be installed:
      apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    0 upgraded, 10 newly installed, 0 to remove and 38 not upgraded.
    Need to get 3,086kB/3,352kB of archives.
    After this operation, 10.3MB of additional disk space will be used.
    Do you want to continue [Y/n]? Y
    Get:1 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2.2-bin 2.2.14-5ubuntu8.7 [2,631kB]
    Get:2 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2-utils 2.2.14-5ubuntu8.7 [160kB]
    Get:3 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2.2-common 2.2.14-5ubuntu8.7 [291kB]
    Get:4 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2-mpm-worker 2.2.14-5ubuntu8.7 [2,374B]
    Get:5 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2 2.2.14-5ubuntu8.7 [1,486B]
    Fetched 3,086kB in 2s (1,248kB/s)
    .............
    Setting up apache2-mpm-worker (2.2.14-5ubuntu8.7) ...
     * Starting web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
       ...done.
    
    Setting up apache2 (2.2.14-5ubuntu8.7) ...
    
    Setting up ssl-cert (1.0.23ubuntu2) ...
    
    Processing triggers for libc-bin ...
    ldconfig deferred processing now taking place
    vagrant@lucid32:~$
    

Empaquetando la máquina virtual

Empaquetar la máquina virtual es tan sencillo como ejecutar vagrant package

macnolo-pro:vagrant tocandotecla$ vagrant package
[default] Attempting graceful shutdown of linux...
[default] Clearing any previously set forwarded ports...
[default] Cleaning previously set shared folders...
[default] Creating temporary directory for export...
[default] Exporting VM...
Progress: 0%Progress: 14%Progress: 28%Progress: 31%Progress: 34%Progress: 36%Progress: 46%Progress: 57%Progress: 68%Progress: 74%Progress: 83%Progress: 86%Progress: 93%[default] Compressing package to: /Users/tocandotecla/vagrant/package.box

Nuestra nueva máquina está empaquetada como package.box, la renombramos a devops.box, ya que la vamos a utilizar para probar herramientas de devops

macnolo-pro:vagrant tocandotecla$ mv package.box devops.box

Entre bambalinas

  • ¿Dónde se descargan las máquinas virtuales? En mi máquina Mac todo se descarga a un directorio oculto en la raíz del usuario.vagrant.d

Enlaces relacionados

Colección de VM Vagrant ya preparadas
Virtual Box

Video de demo

Aquí dejo un video que da una idea bastante buena de lo que es capaz de hacer Vagrant

Vagrant – Getting Started from Mitchell Hashimoto on Vimeo.