A blog about data, information and Tech by Mario Alberich

        

feb. 6
2014

mysqldump y gzip mostrando progreso

En un artículo anterior comentaba la posibilidad de generar un  archivo gzip a partir de un volcado de la base de datos MySQL con mysqldump. Ese proceso tenía un inconveniente, y es que desconocemos el estado del progreso de esa copia de seguridad. Para bases de datos pequeñas no es un problema, pero cuando  crece, nos podemos quedar esperando un rato largo, y sin información.

pv para mostrar el progreso de mysqldump


Esta es la novedad de hoy: una herramienta para mostrar el progreso dentro de una pipe de proceso. El funcionamiento es la mar de sencillo. Si tienes un archivo medianamente grande, prueba la instrucción:

cat file.txt | pv -cN cat > file2.txt

La instrucción anterior muestra información sobre la transferencia de bytes por la cañería del proceso. No está mal, ¿no?

Así que si tomamos el ejemplo del anterior artículo:

mysqldump -u [usuario] -p[clave] [base_de_datos] | gzip > [copiaseguridad.sql.gz]

Podemos modificarla para tener lo siguiente:

mysqldump -u [usuario] -p[clave] [base_de_datos] | gzip | pv -cN gzip > [copiaseguridad.sql.gz]

Progreso de mysqldump conociendo el tamaño del origen


Pero claro, lo anterior nos indica cuánto tamaño estamos procesando, pero cuánto nos falta (qué porcentaje queda pendiente). Así que vamos a intentarlo. Para conseguirlo, es obvio que necesitamos un dato clave: el total del archivo a procesar. Sí, estás en lo cierto: es un pequeño chasco porque a veces no tenemos ese dato. Pero tenemos algunas opciones. Por ejemplo, podríamos tener el tamaño del último backup, y con ello podríamos tener una aproximación suficiente. Por ejemplo, para el caso de un archivo sql llano, tenemos lo siguiente:

$ cat dump.sql | pv -cN cat -s $(du -sb dump.sql | awk '{print $1}') > dump2.sql
cat: 347MB 0:00:06 [27,7MB/s] [==================> ] 43% ETA 0:00:07

Vale bien, ¿y todo esto qué es? Pues desglosándolo por partes:

  • cat dump.sql: vuelca el contenido del archivo a la cañería.
  • pv
    • -cN cat -> muestra el progreso del comando cat.
    • -s $(du -sb dump.sql | awk '{print $1}') ->  Mira el tamaño del archivo dump.sql (du -sb) y se queda sólo con el primer dato de la primer file que sale en pantalla (print $1), que son los bytes del tamaño.




Con esto, estamos ejecutando algo equivalente a si lo indicáramos nosotros directamente, que en el caso del archivo que he utilizado es:

$ pv -cN cat -s 828997215

Trasladando esto a nuestra operación anterior, tenemos:

mysqldump -u [usuario] -p[clave] [base_de_datos] | gzip | pv -cN gzip -s $(gzip -l copiaseguridad-anterior.sql.gz | tail -n 1 | awk '{print $2}') > [copiaseguridad.sql.gz]

La diferencia respecto al caso anterior es que utilizamos la instrucción gzip -l, que nos indica la lista de archivos que hay en un archivo gz (en nuestro caso sólo hay uno), tras lo cual extraemos los bytes que ocupa descomprimido. Con esto no tenemos un dato exacto, pero sí aproximado, especialmente si la base de datos es grande (el incremento entre backups acaba siendo cada vez menor).

Así que nada, a partir de ahora tienes la información sobre en qué punto estás... en tus backups ;-)

Read more »

feb. 4
2014

En estado de flujo, no te relajes

¿Un día pesado en el trabajo? ¿Procrastinando? ¿Viviendo la vida de otra persona?

[caption id="" align="alignleft" width="510"] xkcd - photos[/caption]

 

A veces nos cuesta conectar nuestra mente con lo que estamos haciendo, y estamos como en otro lado. Pero eso no ayuda a acabar con las tareas, ni a ser más feliz.

En esas ocasiones, intento encontrar una tarea con unos ingredientes muy concretos:

  • Un conjunto concreto de objetivos y con un sistema para medir mi progreso. Esto me da dirección y estructura.
  • Debe tener un feedback inmediato, lo cual me facilita ajustar el ritmo para mantener el estado de concentración.
  • Está a mi alcance, ligeramente más allá de mi zona de comfort. No es fácil ni difícil, he de poder sentir que conseguir el objetivo está en mis manos.


En ese momento estoy cerca del estado de flujo.

 

 

 

Para las próximas ocasiones, quizá te interese esta charla del autor original del concepto:

[ted id=366]

 

Read more »

ene. 30
2014

Participación, hackaton y "civic engagement"

Parece ser que la calidad democrática no (sólo) depende de la capacidad de la clase política, sino también del grado y la calidad de la participación de la población en el proceso, y por lo que estamos viendo, dista de de lo ideal.  Es por eso que uno se pregunta qué falla, o al menos qué nos falta para que funcione.
</p>

</p>

¿Por qué querremos la participación de otras personas?

</p>

Entonces, ¿por qué el engagement es importante? Hay varios motivos, según este interesante artículo People Powered Social Innovation: The Need for Citizen Engagement (PDF):
</p>

  • Las personas que se implican comprenden (y ayudan a comprender) lo que sucede: es una experiencia más cercana a la realidad y por ello ayuda a tener una visión global.
  • El grupo de personas que se implica acostumbra a ser diverso, y por ello ayuda a superar ciertos puntos de bloqueo que sucede cuando el grupo es más homogéneo.
  • Al implicarse y diversificarse, el grupo de personas implicadas legitima la acción.
  • Dar respuestas a situaciones complejas requiere esa implicación, porque así las personas se centran en el problema y aprovechan esa habilidad de nuestros cerebros para adaptarse a situaciones complejas.

  • </ul></p>

    También hay que considerar que los procesos de implicación a veces pueden resultar descorazonadores para los propios participantes, especialmente si toman conciencia del "largo camino" a recorrer, o bien cuando los propios procesos de implicación conllevan un proceso de exclusión o jerarquización de los miembros del grupo. Por ello, la implicación debe implicar horizontalidad, al menos durante el tiempo que dura ese primer contacto.
    </p>


    </div></p>

    ¿Cómo puedes conseguir participación e implicación?


    Amy Quipse en Google+ publicó una pequeña joya: cómo llevar a cabo un hackaton más inclusivo. Para quien no lo sepa, los hackatons son jornadas dedicadas a hackear, a sacar partido de los recursos disponibles para obtener algún objetivo más o menos concretos. Existe gran variedad de hackatons, que intentan atraer a un público más o menos tecnológico o al menos atraído por ello. Dicho así, si eres alguien con pocos o nulos conocimientos en programación e informática, es probable que no te atraiga. Amy expone los siguientes puntos para conseguir que el hackaton funcione:</p>

    • Explicar a la gente qué es un hackaton, y no el tipo de personas que esperamos ver ahí.
    • No es problema que sea tu primera vez.
    • No es una competición.
    • Presentarlo y cuidar la imagen con (cierto) esmero.
    • Es una oportunidad para aprender.
    • Es fácil hacer preguntas.
    • Es más que "brillantes webapps".
    • Asegurar que no serán los/as únicos/as
    • Abrieron preinscripciones para mujeres y chicos de edades inferiores. Ambos son públicos menos proclives a los hackatons.
    • Que sea tu primera vez, no significa que no puedas aportar nada.

    • </ul></p>

      Al fin y al cabo, ¿Por qué queremos hacer un hackaton?


      Y más allá de esto: ¿qué nos aportará? Clay Shirky, en su Keynote para la Code for America Summit del año pasado 2013 presentó algunos elementos clave:</p>

      </p>

      • Enfoque iterativo: la reformulación del problema permite ajustar la herramienta a la solución.
      • Los problemas de gestión son más complejos que los técnicos, porque requieren conocimiento y voluntad entre las partes.

        • A nivel político, no se trata de una cuestión de soluciones (qué ganamos) sino de dilemas (qué dejamos de ganar).
        • Algunos problemas sociales clásicos (ej. prostitución) son de solución difícil porque se resisten a una definición clara.

        • </ul>
          </li></p>

        • El primer paso para resolver el problema es darse cuenta que el problema técnico no es el verdadero problema.
        • El mejor recurso para encontrar esa solución es darse cuenta de nuestra propia capacidad para cambiar nuestra opinión, punto de vista o visión del problema.
        • No te guíes por el "No funcionará": En el fondo no se trata de si funciona o no. En primera instancia no funcionará casi seguro.
        • Buscar la crítica constructiva: Enfócalo a la persona tratando de resolver un problema, no al problema en sí mismo.
        • El objetivo de los hackatons no es obtener un código fuente funcional, sino conseguir un capital social que permita comprender y formular mejor los problemas a resolver.
        • Prácticamente ninguna solución que actualmente funcione, tiene la forma con la que se concebió: ha evolucionado/iterado.
        • Es importante asumir que nuestra primera formulación del problema es errónea, y que enfrentándola al exterior tendremos que redefinirla.
        • A veces creamos un prototipo para demostrar al cliente que está equivocado. Es importante que también lo construyamos para entender en qué estamos equivocados.

        • </ul></p>

          Read more »

ene. 28
2014

Liderazgo: el perdón de Alan Turing es la historia de un fracaso

Alan TuringHacía días que tenía pendiente el hacer un comentario y al final he encontrado el momento. El pasado 24 de Diciembre, Alan Turing recibía el perdón de la Reina de Inglaterra. El proceso había empezado el pasado 19 de Julio, aunque no era ni mucho menos la primera vez que se realizaba esta solicitud.

Mirándolo por el lado positivo, la noticia nos permite ver que es posible que la realeza cambie su opinión sobre algunos temas. Cierto, aceptemos la parte buena de la noticia.

Más allá de los motivos que llevaran a la condena del matemático que descifró Enigma; del desenlace final que llevó a Alan Turing al suicidio; más allá de todo eso, están las razones para decidirlo. Entre ellas, está la incapacidad para contraponer su homosexualidad (en aquel momento punible) al beneficio que proporcionó. ¿Y en qué contribuyó?

Turing contribuyó muy significativamente a romper el cifrado de las comunicaciones del bando nazi y de este modo dar una estocada final a la guerra.  Suponiendo que las cifras que se barajan sean ciertas, Turing salvó indirectamente varias decenas de millones de vidas (la Segunda Guerra Mundial suponía unos 11 millones de muertos anuales, y se estima que romper el código de Enigma acortó la guerra en 2 años). Hasta aquí ni siquiera he mencionado la máquina y el test te Turing. Casi nada.

Vemos que ha costado más de sesenta años, que los líderes de un país que se benefició de todo esto, lo hayan perdonado.

Cuesta encajar las palabras ecuanimidad, visión y liderazgo en toda esta historia.  En mi opinión, esta historia representa uno de los grandes fracasos en el liderazgo de un país.

 

Read more »

ene. 23
2014

Grafos en HTML5 con paperscape y sigma js

HTML5, canvas, SVG, webGL


La evolución que ha tenido la implantación del HTML5 en las últimas versiones de navegadores, juntamente con la creciente disponibilidad de datos que visualizar, ha proporcionado herramientas más que interesantes para representar datos en las páginas web y navegadores. HTML5, el canvas o webGL son tecnologías que nos permiten asistir a la aparición de grandes herramientas de visualización de datos en los navegadores. Sin embargo, sigue existiendo la sensación de que existe un límite en la capacidad de los navegadores para presentar grandes volúmenes de información.</p>

Si bien es cierto que los navegadores son, por definición, menos potentes que otras herramientas de escritorio (Gephi por ejemplo), estos límites cada vez resultan una restricción menor para nuestros objetivos.  Sirva el ejemplo de dos utilidades para  representar grafos con una gran cantidad (miles) de nodos, para ver que tenemos margen para sacar partido de las representaciones de datos en HTML5.

Grafos de papers con Paperscape


Grafos de ejemplo con paperscapeComo explican en la descripción de su blog, Se trata de una herramienta para visualizar y buscar contenidos en arXiv, el repositorio online de papers de investigación. Los datos se actualizan diariamente, e incluye todos los artículos que no han sido eliminados posteriormente. Cada paper está representado por un círculo, cuyo color viene dado por la categoría a la cual se asignó al darse de alta.

La posición de los papers se basa en las citas / referencias, así que un paper está más cerca de los artículos que ha citado o de los que le citan. El modelo utilizado para medir las distancias es el de muelle (Spring) basado en la ley de Hooke (la clásica de los muelles). Las referencias se obtienen procesando las fuentes LaTeX / PDF de los artículos cargados en el repositorio

Se puede aplicar zoom sobre el mapa (con la ruedecita del ratón, y arrastrando), tras lo cual empezarán a aparecer etiquetas y los nombres de autores de los artículos. Por lo que se desprende de la información que hay en el sitio web y en su blog, el código fuente no parece libremente disponible para descarga, pero sí proporcionan una utilidad llamada My Paperscape, en la que se puede cargar una propia versión de datos de gráficos.

Grafos con Sigma.js


Grafos de ejemplo con sigma.jsCon un esquema similar en mente, la búsqueda se dirige hacia otro lado. Y así topé con Sigma.js, un proyecto open source (licencia MIT) y hospedado en GitHub en la cuenta de su autor Alexis Jacomy.  Entre las funcionalidades que llaman la atención están la de incluir um importador de grafos con archivos en formato de intercambio de grafos (GEXF) desde una fuente remota, con lo que resulta relativamente fácil embeber un grafo en un contenido HTML si se dispone de un archivo con ese formato.

Además de lo anterior, llama la atención lo ligera que resulta la carga, y los tiempos de respuesta de las interacciones. Aunque vemos ejemplos de sigma.js con muchos menos nodos que en el caso de paperscape, las sensaciones son muy buenas e invita a trabajar con él para sacarle el jugo.

Por lo que respecta a esta biblioteca javascript para la visualización de grafos, sólo hay un detalle importante en el momento de escribir este post: su autor anunción hace algo más de un mes que realizaría un reinicio de esta biblioteca de código, con el objetivo de hacerla más extensible y mantenible, por lo que lanzó la rama 1.0.0, incluyendo allí los detalles del cambio.

La fecha de lanzamiento que se ha planteado el autor para esta revisión es el 14 de Febrero próximo, pero para los impacientes que no teman perder el tiempo por los cambios que pueda tener, se pueden descargar esta rama. Se espera que incluya soporte para webGL y para dispositivos táctiles.

Así pues, dos opciones interesantes, con enfoques muy distintos, y con aplicaciones variadas.  Personalmente me quedo con sigma.js porque se ajusta más a lo que yo necesito (una herramienta que pueda adaptar a mis objetivos), pero em ambos casos hay que reconocer el esfuerzo y la calidad del resultado final.

Read more »

ene. 21
2014

Electricidad: intentando entender la subhasta del mercado espa&ntilde;ol

ElectricidadEntender la subasta de electricidad para analizar


Desde que en 1.997 se liberalizara el sector de la electricidad en España y hasta hoy, el sistema de fijación de precios había tenido sus dudas y polémicas, pero no tantas como lo ha sido las últimas semanas. Y es así que he decidido echar un vistazo a lo que se comenta por ahí sobre el tema, a ver si entiendo mejor cómo nos roban cobran los suministros.</p>

Por un lado, empiezo mi paseo por wikipedia, leyendo el artículo sobre el mercado de la electricidad de España (seguido del artículo Energía eléctrica en España, donde hay un resumen de la historia de este sector). Resulta interesante descubrir que las primeras fuentes de electricidad incluídas en el MIBEL (Mercado Ibérico de la Electricidad, el llamado pool) que venden son las nucleares (por su coste de parada) y las renovables (por normativa legal). Lo hacen a coste cero (para obtener el precio más bajo y por ello entrar siempre entrar en las subhastas).

Eso no significa que se vendan a coste cero, sino al precio (precio marginal en términos económicos) al que se acaba cubriendo la demanda proyectada. Es decir, que después de cubrir parte de la demanda con estas dos fuentes, se sigue subhastando hasta cubrir lo que se espera que sea la demanda total. El precio que cobran todos es el mismo al que lo cobra el último. Nucleares y renovables cobran a ese precio final, a pesar de haberse ofrecido a cero. En resumen, intenta

Para el el caso que nos ocupa, el meollo de la cuestión se encuentra en dos aspectos combinados:

  • Asumamos que la energía suministrada por las nucleares es fijo.
  • Los suministros por renovables varían según las condiciones meteorológicas.
  • La demanda (el barril de energía que hay que llenar) varía a lo largo del año (calefacciones en invierno, aires acondicionados en verano, etc).


Todo esto provoca que la cantidad de energía a subhastar varíe en cada subhasta, y por ello también el precio final. Tema al margen es del del déficit tarifario, que ha merecido atención más que sobrada últimamente, con análisis causas y posibles soluciones. Aunque es clave para entender el conjunto, queda fuera del foco de atención de lo que me he propuesto aquí.

Subhasta y oligopolio


Bien, con esto ya puedo empezar a leer artículos y tener una mínima idea de lo que sucede: hay que llenar el barril de la energía, se realiza una subhasta inversa, y todos los suministradores pagan al precio que se ha pagado la última gota que ha llenado el barril. Desde luego esto no es todo: hay peajes cobrados por el Estado, subvenciones y un número enorme de variables a considerar en el coste final. Lo anterior define la base económica del problema: oferta, demanda y mecanismo de establecimiento del precio.

Sin embargo todo lo anterior no parece tener relación con la situación actual. Esto es debido a que los conceptos de oferta y demanda y demanda se asocian a un mercado de competencia perfecta o casi perfecta, con un gran número de proveedores ofreciendo un producto o servicio no diferenciable.  Y éste no es el caso del mercado eléctrico español. Aquí encontramos un oligopolio, que para el caso, me atrevería a calificar de la versión capitalista del feudalismo. La generación de electricidad es algo que requiere una infraestructura cuya inversión inicial es costosa, y eso genera una barrera de entrada enorme (y si no es lo suficientemente alta, no hay problema: la elevamos un poco más).

En esas circunstancias, es posible que uno o más de los actores más significativos realicen acciones para distorsionar el precio. Por ejemplo, parando centrales. Esta operación sería impensable en un mercado con competencia perfecta, principalmente porque los costes fijos (estructura, personal, etc.) no compensarían el aumento en el precio marginal en la subhasta: alguien podría ofrecer un precio más bajo que generaría pérdidas.

¿Hay motivaciones para hacer eso? Por supuesto, en los mercados de futuros de Wall Street trabajan muy motivados. Así que por ese lado, hay poco que decir: el mecanismo de fijación de precio permite la especulación debido a su estructura de oligopolio en el contexto económico, y a las puertas giratorias en el contexto legal/político.

En este sentido, la intervención de Laia Ortiz el pasado 16 de Enero de 2014 en la comisión energética del congreso, recoge algunos de los puntos clave comentados:

Repercusión sobre el coste final


Y entonces, ¿Qué parte de lo que se paga en nuestra factura se corresponde con esta alteración? Aquí empieza una campaña de difusión de las grandes eléctricas que compañías renovables independientes intentan desmontar desde el sitio de la UNEF. La polémica está servida. Así que ahora mismo la respuesta sobre el funcionamiento de la subhasta energética viene a ser es lo que hay, y sobre cómo afecta esto al coste final, las fuentes difieren.

Read more »

ene. 13
2014

Magento: la clase Mage - Mage::app, Mage::run y otros métodos

Desde el punto de vista de una tienda de e-commerce, cada negocio es distinto y también sus políticas de distribución, métodos de pago, combinación de productos, ofertas, etc. No hay dos tiendas idénticas hasta en el más mínimo detalle, y para que una herramienta como Magento se pueda adaptar a cada a caso, es necesario proporcionar una base sólida y a la vez extensible.

Con ese objetivo, Magento trabaja con una estructura de módulos/extensiones que es en gran medida la clave del éxito para su adaptabilidad (y también es un riesgo, para qué negarlo). Combinado con esta flexibilidad, Magento también incorpora la clase Mage, que proporciona una serie de métodos estáticos que actúan como punto de acceso y ejecución de la aplicación.

Mage::app, Mage::init,Mage::run y Mage::reset

Mage::app($code = '', $type = 'store', $options = array())


En esencia retorna el objeto Mage_Core_Model_App, después de haber establecido el directorio raíz de Magento (Mage::setRoot()), y de haber ejecutado el método ::init() con los parámetros de contexto (código de sitio/tienda, tipo y opciones).

Mage::init($code = '', $type = 'store', $options = array(), $modules = array())


Permite inicializar la aplicación con las opciones facilitadas por ::app(), o bien añadir una lista de módulos que queremos inicializar específicamente. Esta segunda opción sólo tendrá propósitos de testeo o bien para ejecutarse en un contexto controlado. Para el resto de casos, es interesante delegar en ::app() o ::run()

Mage::run($code = '', $type = 'store', $options = array())


Esta es la llamada que puedes ver en el archivo index.php (el punto de acceso único a la aplicación), por lo que eso probablemente ya te dará una pista. Mage::run, a diferencia de los anteriores inicializa todo el contexto de frontend, con los objetos RequestResponse. Este método incluye las operaciones necesarias para que Magento empiece a procesar una petición

Si en algún momento quieres simular una petición a la aplicación, este método (junto con el contenido de index.php) te será de ayuda.

Mage::reset()


Devuelve todos los valores anteriores a su estado inicial. Para ser más concretos, el código de la función es:

    /**
* Set all my static data to defaults
*
*/
public static function reset()
{
self::$_registry = array();
self::$_appRoot = null;
self::$_app = null;
self::$_config = null;
self::$_events = null;
self::$_objects = null;
self::$_isDownloader = false;
self::$_isDeveloperMode = false;
self::$_isInstalled = null;
// do not reset $headersSentThrowsException
}

Es decir que tras un ::reset(), puedes empezar a ejecutar de nuevo una nueva petición a Magento. Este método es interesante para, por ejemplo, el testeo unitario (con PHPUnit, el método tearDown para limpiar el objeto Mage y lanzar la siguiente petición).

get/setRoot, getBaseDir y getModuleDir

Mage::getRoot() y Mage::setRoot($appRoot = '')


Son los métodos getter y setter para la propiedad estática Mage::$appRoot, que almacena el path hacia el directorio app de Magento. Si no se indica un valor en el caso del setter, se recoge el directorio real (utiliza la función realpath de PHP) en el que se encuentra el archivo Mage.php (que contiene la clase Mage).

El valor de Mage::$appRoot no será modificable via setter después de haber sido inicializado. No al menos utilizando el método setter.

Mage::getBaseDir($type='base')


Función de utilidad de acceso para obtener las rutas a los distintos directorios de Magento.  La función por sí misma llama a otras funciones dentro de la clase Mage_Core_Model_Config_Options, y lo que hace básicamente es:

  • Recoger el valor de $type, poner la primera letra en mayúscula y el resto en minúsculas (ucwords).
  • Comprobar si existe el método $this->get{Type}Dir() en la instancia de Mage_Core_Model_Config_Options.
  • En caso afirmativo, llama a esa función y devuelve el directorio solicitado. En caso contrario, lanza una excepción.


Echando un vistazo a esta clase, podemos ver la lista de tipos de directorios que podemos recuperar realizando una llamada a este método (getBaseDir, getCodeDir, getEtcDir, y hasta más de 15 métodos).

Mage::getModuleDir($type, $moduleName)


Análogo a Mage::getBaseDir() pero dirigida al módulo $moduleName, permite obtener la ruta completa hacia el subdirectorio $type (que puede tomar los valores 'etc', 'controllers', 'sql', 'data', o 'locale') de un módulo específico. A juzgar por el código del método, no se tiene en cuenta posibles reescrituras de componentes, ni si el módulo está activo o inactivo.

Mage::getVersionInfo, Mage::getVersion, Mage::getEdition


Ambas funciones proporcionan la información sobre la versión y edición de Magento. Esto es de especial interés para módulos que incorporen funcionalidades introducidas en versiones específicas de cada una de las ediciones (Community, Enterprise, Professional, o Go).

Read more »

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