jun. 26
2014
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.
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.
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
[ted id=1933]
Feliz verbena!
Read more »
jun. 1
2014
El humilde border-radius y lo que podemos dar de sí. Una presentación de de Lea Verou en la Fluent Conf 2014:
may. 25
2014
may. 22
2014
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.
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.
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:
may. 18
2014
may. 11
2014
may. 4
2014
may. 1
2014
Tómate un minutillo para hacer unos cálculos sobre estas dos muestras de datos:
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.
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.
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
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.
cat archivo.csv | ./mapper.php
#!/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]);
}
?>
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);
}
?>
chmod +x mapper.php reducer.php
cat archivo.csv | ./mapper.php | sort | ./reducer.php
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.