A blog about data, information and Tech by Mario Alberich

        

mar. 25
2014

Data sense con Fusion Tables

Análogamente al curso de Analytics Platform Principles que comentaba hace unos días, Google ha publicado otro curso centrado en el análisis de datos. En este caso la herramienta central es Fusion Tables, a partir de la cual podemos entrar más a fondo en conceptos básicos para extraer conclusiones a partir de datos.

Desde luego recomendable para quien crea que le fallen los conceptos básicos, y quiera ponerse a prueba, siempre desde la práctica y las explicaciones amenas.

Quizá la diferencia más remarcable entre este curso y el de Analytics es que en este caso hay mas ejercicios, más texto y menos videos, por lo que es necesario prestar más atención para marcar el ritmo de progreso del curso.

Read more »

mar. 24
2014

Enlaces de interés 2014-12

Más tarde de lo previsto, pero aquí dejo los enlaces de esta semana (pasada).


El vídeo de hoy, utilizando la danza para explicar conceptos estadísticos:

Read more »

mar. 20
2014

Google Analytics Platform Principles, para entender mejor analytics

Ceritificado Google Analytics Platform Principles

Aprender analytics de forma amena


Pues aquí estamos, refrescando los conocimientos de Google Analytics con este curso de Google Analytics Platform Principles. El curso es en cierto modo una continuación del Digital Analytics Fundamentals, y repasa los conceptos básicos de la recopilación de datos que realiza esta plataforma, las opciones de configuración, procesado y la integración desde otras fuentes.

Funcionamiento interno de Analytics según el dispositivo


También comenta las diferencias en los sistemas de recopilación de los datos (Javascript / SDK / Measurement Protocol) y algunas de las posibilidades que ofrece en la integración con otras herramientas, ya sea vía cuentas de Google como con la conexión vía API de Analytics.

Al final del curso hay una prueba de capacitación en la que hay que conseguir al menos un 80% de la valoración. Todo gratis, aunque no hay que confundir este curso que el de certificación Google Analytics IQ. Tómatelo como algo para repasar y principalmente entender.

Vale la pena echarle un vistazo a Google Analytics, como lo es ponerse al día sobre cualquier sistema que permita medir el funcionamiento de nuestras apps, tiendas, blogs.

Por cierto, que la prueba de certificación está disponible hasta el 27 de Marzo de 2014 (te queda una semanita).

Read more »

mar. 18
2014

NodeJS y el tipo de valores retornados por la función require

Programar para NodeJS implica casi por definición utilizar su gestor de paquetes, NPM, y por ello utilizar la instrucción require() para utilizar las funcionalidades de esos paquetes en nuestro código.

Por el grado de madurez en el que está actualmente NodeJS (aunque en principio la versión 0.12 será la staging version para la 1.0), hay ciertos patrones y directrices en la estructura de los módulos que quedan abiertos por ahora. Uno de ellos es el funcionamiento de require() y de lo que retorna esta función.

Retornando valores en nodeJS con require()


En principio la función require es fácil de usar:

var elementoRetornado = require('/ruta/a/archivo.js');


Para que el módulo de nodeJS retorne algo, debe existir una instrucción del tipo:

module.exports = ;


Pero claro, ¿Qué contiene la variable elementoRetornado? Pues depende de cada módulo. Esto afecta a la estandarización de la operativa, pero también abre un campo de posibilidades para encapsular funcionalidades en los paquetes de NodeJS.

En el blog de goodegs han explicado los principales casos de elementos a retornar con require() y algunos ejemplos. Sólo para resumir brevemente, los casos que comenta son los siguientes.

Namespace


Es un caso interesante para un conjunto de prototipos que están incluidos en un paquete. Así, el valor retornado por require da acceso a una serie de propiedades de un objeto, que a su vez son prototipos que pueden ser instanciados. Este es el ejemplo más habitual de las bibliotecas del núcleo de NodeJS, como por ejemplo filesystem (fs).

Un patrón del require para este caso es:

var ns = require('/ruta/a/namespace.js');
var utilidadDelNamespace = ns.Utilidad;

Función


Se puede facilitar una función que actúe como intermediario con el resto de funciones del módulo.

El patrón para require es:

var proxyFunction = require('modulo.js');
var modulo = proxyFunction();


En cierto sentido guarda similitud con un constructor, aunque no es exactamente lo mismo.

Función de orden superior


Se trata de retornar una función que adapta su comportamiento a otra función de entrada. Este patrón permite flexibilizar el comportamiento de un módulo.

var functor = require('modulo.js'); // Retorna la función
var adaptador = require('modulo2.js');
var item = functor(adaptador);

Constructor


Es el caso más clásico, el módulo retorna un constructor a un prototipo, por lo que el retorno del require puede instanciarse para crear un objeto a usar en el código de la aplicación de nodeJS.

var Blog = require('blog.js');
var miBlog = new Blog('sopadebits.com');

Singleton


En algunos casos interesa que todos los elementos del módulo compartan el mismo estado y datos de un módulo externo. Si es así, hablamos de un Singleton. En resumen el módulo retorna una clase ya instanciada.

var singleton = require('singleton-module.js');
singleton.method(arg);

Como extensión de un objeto Global


En algunos casos (los mínimos posibles ya que a menudo esto no es un buen patrón de diseño) nos interesará extender algunos objetos globales (o incluso Object). Esto permite que algunos elementos incorporen métodos inexistentes. Por ejemplo, es el caso de should.

Aunque el patrón puede variar sensiblemente, el ejemplo de uso sería:

require('should');
var user = {
name: 'Juan'
};

user.name.should.equal('Juan');



El método should ha sido generado al importar el módulo should.js.

Monkey Patch


Como simplificación del caso anterior, se refiere a modificaciones que se hacen de forma dinámica para corregir (patching) alguna funcionalidad defectuosa. En esos casos el patrón de require pasa por:

  • Require de la clase/módulo a parchear.
  • Require del parche.



El primer require devolverá alguno de los casos anteriores.

Y hasta aquí los patrones de require que podemos encontrar más habitualmente. No descartes leer el artículo en inglés, que es el que realmente tiene el mérito, y más detalles.

Read more »

mar. 16
2014

Enlaces de interés 2014-11

mar. 13
2014

Una recomendación: Her

HerUna entrada en parte off-topic sobre la película Her, de Spike Jonze. Recomiendo la película, además de para pasar un buen rato, también para reflexionar en base a una serie de hipótesis que pueden convertirse en realidad en un futuro más o menos lejano.

Me ha recordado en muchos momentos a las reflexiones de Alone Together (esta es la parte On topic) sobre la cada vez mayor dependencia de los humanos respecto de los sistemas (cada vez más) inteligentes ya sean vía móvil, ordenadores o todo a la vez. Así empezaba el libro Alone Together:

La tecnología se propone a sí misma como el arquitecto de nuestras intimidades.


Todo esto sin entrar en el aspecto puramente técnico (cinematográfico) de la película, de lo cual no sé casi nada, y tampoco en el guión. Me pareció una película àgil, con momentos muy brillantes y con historias que me parecieron que se entrelazaban lo suficiente para que los personajes (y los espectadores) tomaran conciencia de lo que estaban viviendo. La película abrió el camino de una conversación interesante sobre el escenario que plantea.

Y lo dejo aquí, porque seguro que se me acaba escapando algún spoiler ;-).

Read more »

mar. 11
2014

Javascript - Refactorizar y buscar estructuras de sintaxis

GraspJS es una utilidad que se posiciona como una mejora respecto al tándem grep/sed para la refactorización de código. Su propuesta de valor es sencilla: no ejecuta un análisis textual, sino estructural del código.

Análisis textual del código javascript y sus limitaciones


Durante el desarrollo aplicaciones en cualquier lenguaje podemos estar utilizando ciertos patrones en la estructura del código que posteriormente queremos localizar, ya sea porque no resultan óptimos, porque hayan quedado encapsulados en una biblioteca o utilidad diferente, o simplemente porque no cumplen los estándares y nomenclaturas que deseamos. O simplemente porque escribimos código imperfecto ya sea en javascript o cualquier otro caso, y en un momento determinado queremos corregirlo. En esa situación, ¿Cómo podemos encontrar y/o remplazar esos fragmentos?

La primera solución que nos surge es la de grep/sed: Esto es especialmente útil si ya hay un mínimo criterio en la estructura de código, o bien estamos buscando elementos que por sus características textuales ya son lo suficientemente específicos. El problema es que eso cubre un número determinado de casos, y además tiene limitaciones a la hora de aislarse del ruido que pueda tener el código: desde uso ambiguos de la nomenclatura, hasta código comentado y similares. En otras palabras, esta aproximación no se aprovecha de la sintaxis del código, lo que abriría la opción de la búsqueda estructural.

Búsqueda en Javascript por sintaxis y la refactorización


Para dar un paso más en una búsqueda estructural en código Javascript, podemos utilizar graspJS, utilizando varios sistemas de búsqueda en el código, basados en lo que el autor denomina motores:

  • Búsqueda con selectores del estilo CSS con el motor squery.
  • Búsqueda por ejemplos y wildcards con el motor equery.
  • Remplazar las coincidencias con la utilidad de remplazo, que incorpora filtros y opciones para modificar las coincidencias más allá de un remplazo literal.


En el propio blog del proyecto se pueden encontrar ejemplos más teóricos y propuestas de la vida real para aprovechar el potencial de graspJS en nuestro día a día. Vale la pena decir que la sintaxis es algo compleja y requiere de cierto tiempo de pruebas (y quizá de algo más de documentación sobre los operadores), pero es una más que interesante utilidad para seguir y aplicar en nuestros desarrollos javascript (y en el futuro a otros lenguajes).

Read more »

mar. 9
2014

Enlaces de interés 2014-10

mar. 6
2014

PHP: Cuál es la versión mínima de para mi aplicación

En el desarrollo y evolución de aplicaciones es muy habitual que se mezclen funcionalidades de las últimas versiones del lenguaje con otras más antiguas o incluso arcaicas. Es entonces cuando llega el momento en el que alguien (el cliente, el administrador de sistemas o la oferta de hosting) que nos plantea la duda: ¿Cuál es la versión mínima de PHP que necesita mi aplicación?

En ese momento puedes empezar a repasar todo tu código y experimentar un sudor frío... o quizá puedes pensar que alguien ha pasado por esto y comprobar si ha hecho algo para resolverlo.

PHP Compatibility


El proyecto PHP Compatibility (disponible en GitHub), que se ejecuta como estándar PHP CodeSniffer, aunque en el momento de escribir esto es necesario hacerlo desde la rama master del repositorio de GitHub, ya que la ejecución de la compatibilidad exige utilizar un parámetro de CodeSniffer aún no disponible en la versión estable.

Para llevar a cabo la prueba, puedes empezar por clonar el repositorio de PHP_CodeSniffer:

git clone https://github.com/squizlabs/PHP_CodeSniffer.git

Después, accede al directorio de CodeSniffer, hasta el directorio CodeSniffer/Standards:

cd PHP_Codesniffer/CodeSniffer/Standards

Allí podrás encontrar algunos de los estándares que ya vienen instalados con CodeSniffer. Para añadir PHPCompatibility, puedes clonar el repositorio en esta carpeta:

git clone https://github.com/wimg/PHPCompatibility.git

Ahora ya tienes el estándar instalado. Para comprovar que CodeSniffer lo detecta, dirígete al directorio scripts...

cd ../../scripts

Y lista los estándares disponibles:

./phpcs -i

Tras lo cual debería aparecerte PHPCompatibility en la lista:

The installed coding standards are PSR2, PHPCompatibility, Zend, Squiz, PEAR, PHPCS, MySource and PSR1

Ahora ya está todo a punto para ejecutar PHPCompatiblity. Para ejecutarlo utilizaremos el siguiente comando:

./phpcs --standard=PHPCompatibility --runtime-set testVersion 5.2 /ruta/a/codigo/php/que/quiero/analizar

Con esto puedo comprobar si mi código fuente funcionará con la versión 5.2.

Sólo me queda añadir dos comentarios antes de acabar:

  • Como en otros procesos relacionados con CodeSniffer, el análisis de compatibilidad se toma su tiempo. Por eso vale la pena que este tipo de procesos se realicen en background de forma automática (mediante phing o similares), para por ejemplo tener un control a cada commit/push realizado.
  • Todo el proceso anterior se puede simplificar en el momento en que CodeSniffer acepte el argumento --runtime-set, que actualmente no acepta. Si estás leyendo este artículo, no estaría de más comprovar que la versión de PEAR incorpora ya este parámetro.

Read more »

mar. 4
2014

#java, #nodejs, #paypal y la escalabilidad de la web

A finales del pasado mes de Noviembre Paypal publicaba un extenso post en su blog de Paypal Engineering, explicando su migración de Java a Javascript y NodeJS (y poco más tarde también Groupon se sumó a la idea), con cierto nivel de detalle sobre la tecnología utilizada, el proceso hasta su paso a producción, las diferencias en la productividad para el desarrollo, y... ahí está el tema clave: el rendimiento.

A nadie se le escapa que el tiempo de respuesta en las aplicaciones web es clave en el presente, ya sea por los rankings en buscadores, o por los propios usuarios. Así que abogar por el rendimiento es cada vez más sinónimo de abogar por los beneficios, algo que alinea rápidamente intereses en una empresa. Pero ¿realmente es así? ¿NodeJS aporta tanta mejora?

Escalabilidad y arquitecturas de NodeJS y Java


Poco más tarde aparecía en vividcortex un artículo un análisis sobre los datos facilitados por Paypal en sus pruebas de rendimiento, comentando la ley universal de la escalabilidad, y llegando al elemento clave:

This means that Java is bottlenecked less on serialization, and Node.js is bottlenecked less on coherency delays. This is exactly what one should expect from their architectures (multi-threaded versus single-threaded with event loop)


Así que en ese punto nos encontramos, y llegan a la conclusión (el subrayado es mío):

The takeaway, as I'd state it: PayPal was able to get better results from Node.js than Java. I am not doubting either Java's or Node's performance capabilities, or arguing that one system is/ought to be higher performance than another. I'm just saying PayPal's blog post is glossing over a subject with a lot of unanswered questions, and therefore their assertions about Node.js being better are unqualified and unsupported in my opinion.


En ese diálogo, StrongLoop publicó otro artículo hace unas semanas en el que intentaba responder a la pregunta sobre por qué es más rápido NodeJS que Java.

Todas ellas son lecturas interesantes, y siempre entendiendo que además de un debate sobre arquitecturas y paradigmas, hay también una pugna por atraer la atención y el dinero de los presupuestos de IT. Disfruten de la lectura, creo que valen la pena.

Read more »

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