Fliuva, o como crear un servicio de analíticas

Ya hemos visto los motivos que tengo para diseñar un servicio de analíticas desde 0. Ahora veremos como lo he hecho.
Fliuva

No he tocado ningún CSS.

La base de datos

En un servicio de analíticas lo más importante son los datos, así que debemos de definir como almacenaremos la información. En principio Fliuva iba a estar centrado en analizar una única aplicación. Más tarde he pensado en un soporte multiaplicaciones pero no lo voy a desarrollar de momento. Usaría un espacio de nombres delante de todas las tablas y las peticiones GET.

Usuarios = Sesiones

En ciertos servicios de analíticas los usuarios y las sesiones son dos conceptos diferentes. En Fliuva sin embargo, y por razones de simplificar la estructura, ambos conceptos son idénticos y hablaremos de ellos como sesiones.

Tablas

Será necesario tener una tabla de eventos.

Events

  • CATEGORY: Categoría del evento
  • SUBCATEGORY: Subcategoría del evento
  • NAME: Nombre del evento
  • DESCRIPTION: Descripción del evento
  • DATA: Datos del evento
  • ID: Identificador
  • TIME: Hora en que se produjo
  • SESSION: Sesión a la que pertenece el evento

[sql]

CREATE TABLE IF NOT EXISTS EVENTS(ID INT NOT NULL AUTO_INCREMENT, CATEGORY TEXT, SUBCATEGORY TEXT, NAME TEXT, DESCRIPTION TEXT, DATA TEXT, TIME DATETIME, SESSION TEXT, PRIMARY KEY (ID) )

[/sql]

Y ya con esta tabla tendremos para almacenar muchos datos. Los campos CATEGORY, SUBCATEGORY, NAME, DESCRIPTION y DATA sirven unicamente para organizar eventos y subeventos en categorías. Los nombres de los campos son triviales. DESCRIPTION no guarda realmente la descripción sino que podemos definir otro subevento. Con 5 campos para categorizar eventos superamos a Google Analytics que tiene CATEGORY, ACTION, LABEL y VALUE. Además VALUE debe ser numérico mientras que en Fliuva todos son de tipo texto (en la práctica, cualquier cosa).

Código de seguimiento

¿Cómo introducir datos en la base de datos desde nuestra aplicación? Con una pequeña llamada GET a /collect. Yo la he definido en un fichero llamado collect.js

Y se llama muy fácilmente

Si estamos en HTML5, necesitaremos una librería de cliente para poder realizar las llamadas

Así, simplemente hay que llamar a sendEvent. Llamar a login no es necesario siempre que rellenes el valor de sessionStorage.__fliuvaSession correctamente.

Análisis de datos

Ahora debemos analizar los datos. Primero debemos obtener los valores a analizar. La llamada a /get devuelve un fichero JSON con la información completa. En un futuro lo ideal sería espeficicar intervalos de fechas.

Y en el cliente tratamos los datos. Aquí es donde debemos nosotros mismos crear las estadísticas según las métricas que hayamos definido. Yo solo voy a poner una métrica universal, usuarios por día.

Que se corresponde a este pequeño HTML

Visualizar cada sesión por separado es posible con la llamada a /session/NOMBRE_DE_SESION

Y para un rápido procesamiento he decidido usar Jade con JavaScript en el servidor. Y entonces session.jade queda

Juntando piezas

Por último, la aplicación se tiene que iniciar en algún lado. Server.js contiene el arranque

Y así en un pis pas hemos hecho una aplicación de seguimiento y analíticas en JavaScript. Ahora toca empezar a diseñar estadísticas con los datos que tenemos a nuestra disposición y por supuesto cuando tengamos los datos a obrar en consecuencia.

La información es poder

La información es poder. La frase suele atribuirse a Francis Bacon y creo que en estos tiempos cada vez se vuelve más cierta. Términos como Big Data, políticas de privacidad y similares son términos para hablar del gran poder que nos ofrece la información, si la sabemos interpretar y usar en consecuencia.

Obteniendo la información

Esto venía para explicar que finalmente y después de pensarlo un rato he decidido crear mi propio sistema de analíticas para Secta Sectarium. Las analíticas pueden ofrecerme valiosa información pero no encontré ningún servicio que me gustase. Muchos sistemas de analíticas están centrados en blogs (como Google Analytics o New Relic Browser) o en aplicaciones móviles (Google Analytics, Flurry). ¿Había algún servicio dedicado solo a juegos? Sí, GameAnalytics es específico pero no tiene API para HTML5 (y las APIs REST no se pueden llamar entre dominios en HTML5, CORS se llama la idea). Google Analytics se puede modificar lo suficiente para funcionar pero ya que tenía que trabajarmelo he preferido crear mi propia solución.

LaGenteSeInventaEstadisticas

Fliuva

Así que he decidido gastar una gear de OpenShift para una aplicación Node.js 0.12 y MySQL 5.5. Entre SQL y NoSQL he elegido SQL porque para introducir datos de eventos que luego, posteriormente, van a ser tratados, SQL da un mejor rendimiento y el esquema de tabla es más común. Las analíticas las podré ver desde la propia aplicación, que usa Vis.js para la visualización.

LaPersonaMasPoderosa

En próximas entradas veremos como se puede crear Fliuva y que métricas son más importantes.

Crea tu primer paquete para Haiku

Hoy vamos a crear nuestro propio paquete para Haiku. Se trata de mi juego SuperFreeCell que diseñé para el Google Code-In 2014.

SuperFreeCell-1

Nuestra propia rama de desarrollo

Si queremos publicar nuestros cambios a Haikuports, debemos hacernos una cuenta en BitBucket y hacer un fork del repositorio. Esto se hace desde http://github.com/haikuports/haikuports y dándole al botón de fork o dividir. En mi caso creé el repositorio https://bitbucket.org/AdrianArroyoCalle/haikuports-superfreecell. Añadimos el repositorio a nuestra lista de orígenes en Git.

Ubicando el juego en Haikuports

Nada más empezar tenemos que encontrar la categoría a la que pertenecerá el paquete. Cada carpeta dentro de la carpeta haikuports representa una categoría, que siguen el esquema de Gentoo. En mi caso creo que lo conveniente es “haiku-games”. Dentro de esta carpeta creamos una con el nombre de nuestro paquete y allí almacenaremos la información sobre nuestro paquete. Estas carpetas deben tener al menos un archivo .recipe y pueden incluir las carpetas licenses y patches con licencias y parches adicionales respectivamente. En mi caso no usaremos ninguna de estas dos carpetas, así que creamos el archivo superfreecell-0.1.0.recipe . Es importante esta estructura para encontrar la versión fácilmente.

El archivo .recipe

El archivo .recipe contiene la información necesaria de metadatos e instrucciones para compilar e instalar el programa en cuestión.

Y este sería el caso más básico de receta que podemos hacer. Si empaquetamos librerías la cosa se complica un poco más ya que tenemos que distinguir la parte de ejecución de la parte de desarrollo y entonces tendremos secciones como PROVIDES_devel que es especifico al paquete de desarrollo. Hay otra manera de aplicar parches que es con patchsets. Nosotros editamos la aplicación hasta que funcione y Haikuporter nos generará un archivo con los cambios que hay que aplicar a las fuentes. Es el mejor método para software un poco más complejo.

SuperFreeCell-Recipe

Publicar cambios

Una vez hayamos comprobado que funciona, lo subimos a nuestra copia de Git.

Y desde BitBucket hacemos una pull request o solicitud de integración

Instala programas en Haiku con HaikuPorts y HaikuPorter

Haiku introdujo recientemente su nuevo sistema de paquetería. Este dispone de varios métodos para obtener los programas. El método más sencillo es HaikuDepot, la aplicación gráfica con paquetes ya compilados listos para descargar e instalar con un click. Sin embargo hay mucho más software disponible en el árbol de recetas de Haiku, conocido como HaikuPorts, que usa un programa propio para su gestión llamado HaikuPorter. HaikuPorter no gestiona la instalación, sino la creación de los paquetes desde la fuentes originales.

haiku-depot

Haikuports y Haikuporter

Haikuports es una colección se software en forma de recetas que dicen como se deben de compilar los programas pero no los almacena. Un sistema similar al de Gentoo y FreeBSD. Haikuports usa Haikuporter para construir los paquetes así que debemos instalar antes de nada Haikuports y Haikuporter.

Instalando Haikuporter

Instalar Haikuporter requiere que abras la terminal y obtengamos su código fuente

Ahora debemos configurarlo con nuestros datos

Tendremos que editar un archivo. Os pongo como tengo el mío

Aunque en vuestro caso podeis poner “no” en ALLOW_UNTESTED y ALLOW_UNSAFE_SOURCES.

Instalando Haikuports

Volvemos a nuestra carpeta y obtenemos el código

Usando Haikuporter y Haikuports

Ya estamos listo para construir cualquier paquete con Haikuporter, no solo los nuestros. Con esto podemos acceder a gran cantidad de software. El uso básico de haikuporter es

Aunque si las dependencias nos abruman podemos saltarnoslo

Los paquetes no se instalan automáticamente, se guardan en /boot/home/haikuports/packages y para instalarlos los debemos copiar a /boot/home/config/packages. También podemos compilar con GCC4 en vez de GCC2 si el programa lo soporta. Hay que añadir _x86 al final. Comprobemos que todo funciona con un paquete al azar

Tardará en actualizar la base de datos y pueden que nos salten errores de arquitecturas pero no hay que preocuparse. En mi caso, Haikuporter quería instalar paquetes del sistema ya que había versiones nuevas en haikuports. Sin embargo, como se que iba a tardar mucho cancelé y ejecuté

Convendría ahora instalar todo lo compilado