A blog about data, information and Tech by Mario Alberich

        

jun. 26
2014

PHP es lo suficientemente rápido

Desde hace aproximadamente unos dos años he estado flirteando con alternativas a PHP, en especial NodeJS.  El motivo principal ha sido conocer otras soluciones con una aproximación diferente a los problemas que plantea el entorno web en general, y la potencial mejora que supone compartir el mismo lenguaje de programación en el entorno cliente y el servidor. Python también está en la lista de flirteos, aunque debo decir que a cierta distancia.

El atractivo por NodeJS es (y en parte seguirá siendo) un enfoque diferente para la operativa en los cuellos de botella de las aplicaciones web. Al poder tratar las operaciones I/O de una forma asíncrona (eventos y callbacks), es un valor añadido en ciertos casos.  El enfoque asíncrono de NodeJS permite una ejecución más fluida, que a su vez permite combinar consultas exigentes con el trabajo paralelo mientras se espera a la finalización de estas tareas.  Además, una orientación a eventos, soluciones PubSub y otras características derivadas hacen pensar en NodeJS como una opción más que interesante para ciertas soluciones del entorno cloud.

Velocidad del código, velocidad del desarrollo


Pero quizá el enfoque que más aporta NodeJS, y por el cual también llegué a introducirme en el mundo del PHP fue la velocidad a la hora de desarrollar, y la agilidad para realizar cambios.  Hace unos meses leí el artículo PHP Performance: "fast enough" and improving, que pone énfasis en ese punto.

PHP tiene y tendrá infinidad de defectos, pero por alguna razón es el lenguaje más utilizado para aplicaciones web.  La razón es sencilla: es fácil empezar el desarrollo con PHP, no requiere una curva de aprendizaje como Java. En una palabra, funciona.

Pero la propia evolución de PHP no ha sido nada sencilla. El paso de la versión 4 a la 5 supuso un salto bastante difícil de seguir, y la introducción gradual de los Frameworks primero (empujado probablemente por actores como Ruby on Rails),  y en especial de los PSR, parece haber dividido una comunidad que debate entre la necesidad de estructurar y madurar el lenguaje, o mantenerlo en ese nivel de libertad que ha tenido desde sus inicios. Probablemente la aparición de lenguajes como Ruby (y RoR) como Python ha dado más empuje a la primera alternativa. Sinceramente lo desconozco.

Por último, la aparición de HipHop primero, y de HHVM después, han dado un empuje a la velocidad de carga de las aplicaciones PHP, con una integración completa (o casi) en muchas aplicaciones del ecosistema PHP,entre las cuales destacaría algunos casos clave, como Drupal, MediaWiki y Magento 2.

Es posible que las próximas versiones de PHP incorporen más mejoras en el rendimiento. ¿El mismo que Java? Probablemente no, pero seguro que a la par con NodeJS y mejor que otros lenguajes interpretados. Dependerá del uso que se le dé. En realidad, se puede descartar a PHP por varios motivos, pero en pocos casos ése será el de su rendimiento.

Los nuevos entornos


Es innegable que PHP no está pensado para ciertos otros entornos, como son las aplicaciones móviles (aunque sí parece teóricamente posible). Ahí es donde en parte entra un lenguaje como Javascript (vía AngularJS, Ionic Framework y/o similares).

No pienso en Javascript como algo que deba convertirse en un lenguaje de programación para todos los usos, pero sí para cualquiera. Si un lenguaje permite moverme en varios entornos a la vez (navegador, servidor, aplicación móvil o de escritorio con node-webkit), eso es algo de valorar si por un lado se quiere prototipar y producir un resultado sin detenerse en los detalles del tipado de datos, o en un requerimiento de un extremo rendimiento o de extrema fiabilidad en algunos procesos.

Cada proyecto es diferente, pero PHP, como afirma el artículo comentado más arriba, es lo suficientemente rápido y maduro para ser un gran candidato.

Read more »

jun. 22
2014

Enlaces de interés 2014-25

jun. 1
2014

Enlaces de interés, 2014-22

 

 

 

 
El humilde border-radius y lo que podemos dar de sí. Una presentación de de Lea Verou en la Fluent Conf 2014:

Read more »

may. 25
2014

Enlaces de interés 2014-21

may. 22
2014

Big data, desigualdad y desarrollo

Admito que de primeras este título puede parecer mezclar churras con merinas, pero no lo es en absoluto.  El análisis de datos en el ámbito de los negocios se centra en la optimización de los beneficios. Esa optimización a su vez hace rentable la recopilación de los datos dentro de un proceso, un flujo de actividad de sus clientes potenciales: si recopilando unos datos la empresa gana dinero, los seguirá recopilando.

Así pues, es posible que tu rango de actividades esté fuera de ese flujo de datos de interés para las empresas. Y en ese caso, corres el riesgo de ser excluído. Así lo comentaba Jonas Lerman en su artículo Big Data and Its Exclusions del Stanford Law Review del Septiembre de 2013 (el destacado es mío):

big data has the potential to solidify existing inequalities and stratifications and to create new ones. It could restructure societies so that the only people who matter—quite literally the only ones who count—are those who regularly contribute to the right data flows.


Es complicado reaccionar con una insubordinación a esta tendencia, comenta este autor, si no es que se traslada a los Estados mediante un cuerpo legal consistente, y también al sector privado. Que la capacidad para tratar esos datos, no lleve a la exclusión a todos aquellos que se mantienen ajenos a la corriente principal.

Pero las exclusiones también pueden suceder dentro del flujo de datos. Es lo que expone el artículo Big Data’s Dangerous New Era of Discrimination, en el que comenta:

But the main source of concern won’t be privacy, per se — it will be whether and how companies and organizations like your own use Big Data analytics to justify their segmentation/personalization/discrimination strategies.

The more effective Big Data analytics are in profitably segmenting and serving customers, the more likely those algorithms will be audited by regulators or litigators.


Regulación de algoritmos, entonces. Bueno, quizás sí, aunque no tengo muy claro cómo se evitará que esos datos se procesen con ese algoritmo. Incluso se puede desglosar el algoritmo en sus diversas operaciones matemáticas para poder dar un rodeo a las restricciones.

Big Data para el desarrollo


He aquí la otra cara de la moneda: enfocar el Big Data no para optimizar los ingresos, sino para optimizar el número de beneficiarios de sus algoritmos. ¿Cómo se podría aplicar esta tecnología para el desarrollo? Un informe de las Naciones Unidas titulado Big Data for Development (2012, incluye un enlace a PDF en la página) trata de tipificar y reenfocar la terminología habitual de este tema.

El documento adolece de su relativa antigüedad y deja abiertos muchos puntos que quizá ahora se podrían concretar. Pero en todo caso, presenta una serie de posibilidades para la aplicación del Big Data a este contexto:

  • Disponibilidad de dispositivos de bajo coste y fácil mantenimiento para recopilar datos.
  • Crowdsourcing como modelo operativo en la recolección.
  • Estándares de privacidad para los datos personales.


Y sus aplicaciones:

  • Mejora de la capacidad de seguimiento y respuesta de sucesos inesperados (Outbreak).
  • Mejora de la comprensión del cambio de comportamiento en las crisis.
  • Mapeo más concreto de las necesidades de los servicios.
  • Habilidad para predecir los cambios en la la oferta y la demanda.


Todo ello depende de la participación, tanto en el crowdsourcing como en una actitud de cooperación que acoja este proceso de recopilación de datos.  Al fin y al cabo, el objetivo final es poder crear una base de evidencias que permitan afrontar el desarrollo, con unos recursos siempre escasos.

Read more »

may. 18
2014

Enlaces de interés 2014-20

may. 11
2014

Enlaces de interés 2014-19

may. 4
2014

Enlaces de interés 2014-18

may. 1
2014

El cuarteto de Anscombe, cuando la forma importa

Tómate un minutillo para hacer unos cálculos sobre estas dos muestras de datos:

  • 1, 2, 3, 4, 5
  • 1, 2, 3, 4, 100


¿Cuál es la media? ¿Y la mediana?

Si lo has calculado, habrás comprobado que la media se adapta al valor extremo (100), por lo que cambia de 3 a 22, pero que en cambio la mediana se mantiene impasible ante el cambio.

Lo primero que pasa por la mente de mucha gente es que han cometido un error al calcular. La segunda fase es que la fórmula o el sistema de cálculo está equivocado: ¿Para qué quiero que la mediana se mantenga inmóvil después de un cambio tan extremo? Y aquí es cuando llegamos al meollo del asunto: la media y la mediana se crearon para fines muy distintos.

Hormas, zapatos, árboles y bosques


Los métodos numéricos se comportan perfectamente para extraer porciones de información de cada individuo y luego ponerlas en común para toda la muestra, aplicando algún tipo de agregación. Sin embargo la potencia de estos procesos parece reducirse cuando entra nuestra capacidad humana de interpretar los datos mediante métodos menos lineales, como la forma de los datos en cuanto los representamos.

Porque eso es lo que sucede cuando representamos los datos en al menos dos dimensiones: lo que nuestro razonamiento sudará para encontrar, nuestro ojo lo procesa en décimas de segundo.

El cuarteto de anscombe: cuando las cifras no lo explican todo


[caption id="attachment_27850" align="alignleft" width="300"]anscombe quartet anscombe quartet[/caption]

La imagen lateral son cuatro gráficos, conocidos como el cuarteto de Anscombe, y son un ejemplo clave para entender la diferencia entre nuestra capacidad para procesar números y para identificar los gráficos.

En los cuatro gráficos, los valores para los principales indicadores estadísticos (media y varianza de x e y, correlación) y la recta de regresión, son idénticos (hasta el tercer decimal). Si tapáramos los gráficos anteriores y sólo mostráramos los indicadores anteriores, sería muy difícil deducir las grandes diferencias entre ellos.

Es en estas situaciones, especialmente cuando en un proceso de análisis pueden aparecer gráficos tan dispares (lo cierto es que no siempre es así), en el que el análisis exploratorio de datos y la representación gráfica nos ayuda a tener una idea de lo que los datos nos deparan.

Al fin y al cabo, el análisis y la representación gráfica pueden cooperar.

Read more »

abr. 29
2014

#MapReduce: probar en #linux antes de ejecutar en #Hadoop

Diez años de MapReduce


En Diciembre se cumplirán diez años desde que Google publicó el paper sobre MapReduce. El objetivo de ese artículo era exponer un algoritmo para procesar paralelamente grandes cantidades de datos utilizando una infraestructura basada en equipos informáticos modestos, y que por ello fuera más fácilmente escalable.</p>

Diez años más tarde MapReduce se encuentra en el núcleo del BigData, especialmente a través de Hadoop.  Todas o casi todas las grandes compañías que ofertan bigdata ofrecen algún tipo de implementación de Hadoop a sus clientes.

Pero Hadoop es una implementación que no sólo incluye un algoritmo, sino también un sistema de archivos (Hadoop Filesystem, HDFS, basado a su vez en el Google File System, GFS) y todos los mecanismos de control necesario para llevar a cabo el tratamiento de datos a gran escala.

Entonces, si lo que queremos es entender el cambio de paradigma que supone MapReduce para tratar datos, ¿Necesitamos instalar Hadoop o un similar para entender el funcionamiento de MapReduce? Si lo que quieres probar son tus scripts con un pequeño conjunto de datos, no.

Consola y pipes


MapReduce tiene como base de funcionamiento el traspaso de información entre los procesos mediante pipes, lo que permite evitar el almacenamiento de datos en la memoria del proceso. Por ello, los scripts deben basarse en capturar la información del STDIN, y retornar la información a través del STDOUT. Si por ejemplo los datos están en un archivo CSV, podemos volcar el contenido con el comando cat (o head, o tail para sólo enviar un subconjunto de datos), enviándolo con un pipe a nuestro script de mapeo:

cat archivo.csv | ./mapper.php

Entonces, el script mapper.php debería abrir el flujo de datos recibidos a través de STDIN para empezar a procesarlo:

#!/usr/bin/php
$stdin = fopen( 'php://stdin', 'r' );

while( $line = fgetcsv( $stdin, 10000) ) {
// Procesar/mapear los datos y ejecutar un echo sprintf:
echo sprintf("%s\n", $line[0]);
}
?>


No añado ningún tipo de control en el script anterior, para ponerlo lo más simple posible. El script anterior imprime el contenido de la primera columna del archivo CSV.

En el caso del script de reducer (reducer.php), lo que haremos es contar cuántas veces aparece cada cadena en el listado (es decir que ignoraremos el valor numérico).  El script es bastante similar al del mapper, pero ahora mantendremos un contador de las veces que aparece la clave, y cuando ésta cambie, la imprimiremos:

#!/usr/bin/php
$stdin = fopen( 'php://stdin', 'r' );
$currentKey = null;
$currentCount = 0;
while( $line = fgets( $stdin ) ) {
// Generas el proceso de 'reducción'
if ($line !== $currentKey) {
echo sprintf("%s\t%s\n", $currentKey, $currentCount);
$currentKey = $fields[0];
$currentCount = 0;
}
$currentCount++;
}
if ($currentKey !== null) {
echo sprintf("%s\t%s", $currentKey, $currentCount);
}
?>

Vale, entonces ya tienes mapper.php y reducer.php. Para simplificar mucho, sólo queda un paso intermedio entre el mapper y el reducer: la ordenación de los registros recibidos (la parte Sort de lo que se denomina el Shuffle and Sort del algoritmo). Para que el reducer pueda calcular las veces que aparece cada clave, debe recibir los datos ordenados según esta clave. Para el caso que nos ocupa, lo podemos conseguir con el comando sort de Linux, no hace falta que nos compliquemos más.

Ejecutando el proceso conjunto


Un paso más antes de probar: para poder ejecutar los dos scripts php desde la línea de comandos es necesario marcarlos como ejecutables:

chmod +x mapper.php reducer.php

Todo a punto.  Poniéndolo todo en orden, tenemos que el comando sería:

cat archivo.csv | ./mapper.php | sort | ./reducer.php

Y, reducer.php debería generar una salida con los datos procesados (en este caso, un contador de la frecuencia de cada clave). Así que a grandes rasgos, esto es lo que plantea MapReduce: un algoritmo que pueda recibir una entrada de datos y que pueda procesarla, de forma independiente al resto del dataset.

El resto de la implementación de MapReduce (replicación de datos, gestión de recursos, partición del dataset, etc.) es imprescindible para operar con un gran conjunto de datos, pero no para entender el concepto de base: procesar datos de forma paralela.

Nota final: Aunque Hadoop requiere el uso de Java para desarrollar trabajos MapReduce, incorpora también una funcionalidad llamada Hadoop Streaming que permite la ejecución de scripts MapReduce en prácticamente cualquier lenguaje de programación. La contrapartida es un mayor uso de recursos y mayor lentitud, pero desde luego ayuda a realizar pruebas sencillas con scripts de PHP, python o similares.

Read more »

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