Sistema de Puntuación y Opiniones Cinco Estrellas con MySQL

Lo que vamos a ver en este post es una manera de modelar en MySQL un sistema de puntuación y opiniones cinco estrellas, es decir, puntuaciones entre 1 – 5.

Todos hemos visto, e incluso hemos votado o aportado alguna opinión en multitud de sitios sobre algún producto, alguna app, hotel o restaurante, o alguna canción/álbum de nuestro artista favorito. Es típico pulsar sobre 5 pequeñas estrellas para valorar en el rango 1 a 5 (1 = malo, 5 = excelente), de manera que la contabilización de las votaciones de todos los usuarios nos dará una puntuación media de lo que opina la gente.

Opiniones en Google Play para Angry BirdsLo que vamos a ver en este post es una manera de modelar en base de datos un sistema de votaciones y opiniones, de manera que el código a escribir en la parte servidora (PHP, RoR, Java) sea el menor posible. Imaginemos un sistema en el que tenemos una colección de imágenes. Los usuarios autenticados que visitan la exposición virtual de dichas imágenes pueden valorar de 1 – 5 cada una de ellas. Opcionalmente pueden comentar algo sobre cada una, y para todas ellas se muestra la votación media así como el total de votos emitidos. Este ejemplo se ha desarrollado con MySQL.

En base de datos tendremos una tabla que llamaremos image para almacenar todas las imágenes, identificadas con un id único (image_id). Además almacenaremos su número de votos (num_votes), la puntuación total (total_score) y la puntuación media (rating), es decir, la puntuación total / número de votos:

drop table if exists image;
create table image
(
image_id int unsigned not null auto_increment primary key,
caption varchar(255) not null,
num_votes int unsigned not null default 0,
total_score int unsigned not null default 0,
rating decimal(8,2) not null default 0
)
engine = innodb;

Además, crearemos una tabla donde almacenaremos todas las votaciones y valoraciones de los usuarios. Para cada voto almacenaremos el id del usuario (user_id), el id de la imagen (image_id) y la puntuación personal de 1 a 5. Como opción podemos añadir una opinión (review) que explique su votación.

drop table if exists image_vote;
create table image_vote
(
image_id int unsigned not null,
user_id int unsigned not null,
score tinyint unsigned not null default 0,
review varchar(4000) null,
primary key (image_id, user_id)
) 
engine = innodb; 

Por último necesitamos que los campos num_votes, total_score y rating de la primera tabla (image) se actualicen cada vez que se reciba un voto y se almacene dentro de la tabla image_vote. Para ello generamos un trigger en BBDD que se ejecute tras una inserción en la tabla image_vote, aumentando en uno el número de votos, sumando la puntuación otorgada a la puntuación total, y finalmente recalculando la media.

create trigger image_vote_after_ins_trig after insert on image_vote
for each row
begin
 update image set 
    num_votes = num_votes + 1,
    total_score = total_score + new.score,
    rating = total_score / num_votes  
 where 
    image_id = new.image_id;
end

Con este modelo que hemos creado en base de datos, el procedimiento funcionará de la siguiente manera:

  1. El sistema recogerá la votación del usuario para la imagen visualizada, junto con sus comentarios.
  2. Se almacenará la puntuación para la imagen mostrada y el usuario autenticado en la tabla image_vote.
  3. Automáticamente se actualizará el registro de la imagen seleccionada en la tabla image. El número de votos se incrementará en uno, la puntuación total se incrementará con la puntuación otorgada. Asimismo se calculará la nueva puntuación media.
  4. Al consultar la imagen de nuevo mostraremos la nueva puntuación media junto con el número total de votos.

Me gusta esta solución por su sencillez, minimizando el código que tenemos que escribir en la parte servidora, delegando toda la lógica en la capa de Base de Datos. Se puede completar mostrando las opiniones de los usuarios, junto con la puntuación que aportaron, e incluso el número de votos agrupados por los distintos valores (1 – 5).

Gestión ágil de proyectos con la metodología SCRUM

Me han publicado en el blog corporativo de la empresa en la que trabajo, GFI Informática, “Gestión ágil de Proyectos con la metodología SCRUM”, en la que describo los conceptos básicos de esta metodología. SCRUM es una metodología de la que se ha escrito mucho, la más conocida (junto con Extreme Programming) dentro de las llamadas metodologías de desarrollo ágil, y que hemos podido poner en práctica.

Historia de mi Experiencia

A principios del año 2012 el cliente en el que me encuentro trabajando establece un calendario para el desarrollo e implantación de un sistema de gestión interna en varios centros, con la particularidad de que el sistema comience a utilizarse con unas funcionalidades básicas, completándose el desarrollo en base a los requisitos y feedback que cada uno de los centros nos fuera reportando. A esto debemos añadir la gestión y resolución de las incidencias que se fueran produciendo. La implantación comenzaría en el mes de Marzo (2012) en dos centros de manera simultánea y se iría completando cada 4 semanas hasta completar un total de 9 centros.

Establecimos junto con los usuarios los requisitos mínimos con los que debería implantarse en los primeros centros. También aquellos que no eran críticos para la puesta en producción pero que deberían ir acometiéndose en paralelo. Asimismo, se fueron creando versiones parciales del sistema el primer miércoles de cada mes, y tras las pruebas de usuario y calidad, el departamento de sistemas subía al entorno de producción, como muy tarde la tercera semana de cada mes.

Tras esta nueva versión nos reuníamos todos los implicados en el proyecto para evaluar los cambios desarrollados y establecer prioridades sobre las tareas a realizar en la siguiente versión, añadiendo los nuevos requisitos definidos por los centros que ya estaban trabajando con los nuevos módulos. A pesar de unos comienzos difíciles, ya que los primeros dos centros aseguraban que el sistema no contemplaba los requisitos mínimos para comenzar a utilizarlo, esta forma de trabajar fue un éxito, y ya en el mes de noviembre todos los centros estaban trabajando con el nuevo sistema, incluyendo los nuevos requisitos detectados y solucionadas las incidencias que hubieran ido apareciendo.

Si quieres profundizar más en los conceptos de la metodología SCRUM puedes seguir leyendo aquí.

Instalar Ruby on Rails en Windows

En este post te mostraré cómo instalar Ruby on Rails en Windows y preparar el entorno para comenzar a desarrollar en este sistema operativo, mediante RailsInstaller.

En este post te mostraré cómo instalar Ruby on Rails en Windows y preparar el entorno para comenzar a desarrollar en este sistema operativo. Yo personalmente recomiendo Linux, pero lo normal es que manejemos varios equipos, incluido el del trabajo en el que no tengo elección del sistema operativo a utilizar. Si estás en esta situación o simplemente tu equipo es Windows sigue leyendo.

Para esto vamos a utilizar RailsInstaller, un proyecto simple para proporcionar, de manera muy simple, el entorno de Ruby on Rails sobre Windows XP o superior. Tras una sola instalación guiada por un asistente o wizard, tendríamos Ruby 1.9.3, Rails 3.2, Git 1.7.6 y la base de datos SQLite 3.

Para empezar ejecutamos un navegador y abrimos la url railsinstaller.org, allí descargamos el Kit de instalación de los paquetes anteriormente descritos. Una vez descargado, abrimos la carpeta de descarga en la que se almacenó el archivo con nombre railsinstaller-versión.exe. Hacemos doble clic para ejecutarlo. Comenzará inmediatamente el asistente de instalación con un mensaje de bienvenida. Pulsamos Next. En el siguiente paso debemos aceptar los términos de la licencia. Para continuar debemos aceptar y pulsar Next. Tan sólo nos queda especificar la ruta en la que instalar. Una vez especificada pulsamos Install. El tamaño de la instalación suele ser aproximadamente 447 Mb.

Cuando hayamos completado la instalación aparecerá un mensaje indicándolo con un botón Finish. Pulsamos el botón y aparecerá la consola para configurar git y ssh. Para configurar git debemos introducir un nombre de usuario y una dirección de correo. De momento no debes preocuparte por la clave ssh generada.

Una vez hecho esto cierra la ventana y abre una nueva ventana de línea de comandos pulsando Inicio, Ejecutar…, teclea cmd y pulsa Aceptar. Ya tienes preparado el entorno para comenzar a construir tus proyectos con Ruby on Rails. Puedes probar que se han instalado las versiones correspondiente ejecutando los comandos:

C:\>rails -v
 Rails 3.2.13

C:\>ruby -v
 ruby 1.9.3p392 (2013-02-22) [i386-mingw32]

Si eres nuevo en esto de la programación de aplicaciones con RoR (Ruby on Rails) te aconsejo no utilizar un IDE (entorno de desarrollo integrado). Aunque parezca sorprendente, la mayoría de los desarrolladores de Rails no utilizan un IDE, sino editores de texto plano con más o menos funcionalidades. Yo utilizo Sublime Text 2, un editor avanzado multiplataforma con multitud de añadidos como múltiples selecciones, reconocimiento de sintaxis, paleta de comandos, interfaz personalizable e incluso modo sin distracciones, entre otras. Sublime Text lo puedes descargar y usar de forma gratuita, pero cada cierto tiempo de uso te avisará que estás utilizando una versión gratuita y consideres la opción de comprar una licencia.

Tras la instalación del entorno revisa Rails Guides (en inglés) para obtener información sobre desarrollo de aplicaciones Ruby on Rails.

Cómo solucionar el problema con el micrófono en los portátiles HP con Ubuntu

Cómo solucionar el problema con el micrófono en los portátiles HP con Ubuntu

Hasta ahora no me había dado cuenta de que el micrófono integrado en el monitor de mi portátil (un HP Pavilion dv6) con Ubuntu no funcionaba. Al tener instalado en otra partición Windows 7, las veces que he requerido de dicho hardware (Skype o cualquier juego con mis hijos) lo he hecho desde ese sistema operativo. Fue a raíz de la última actualización del navegador Chrome cuando reparé en el mal funcionamiento. Google Chrome ha habilitado la búsqueda por voz, de modo que se pueden realizar consultas habladas como si tecleáramos, incluso en lenguaje natural del tipo: “El tiempo para hoy en Valencia” o “Traducir manzana al alemán“.

Para solucionarlo debemos editar el fichero /etc/modprobe.d/alsa-base.conf, teniendo en cuenta que necesitamos permisos de superadministrador:

sudo gedit /etc/modprobe.d/alsa-base.conf

En él añadimos al final las siguientes líneas:

options snd_hda_intel model=laptop
options snd-hda-intel position_fix=1 enable=yes

Grabamos los cambios y reiniciamos el equipo. Tras reiniciar podemos abrir la configuración del sistema y en la sección Hardware pulsamos sobre Sonido. En la pestaña Entrada, podemos ver los dispositivos de entrada detectados: la línea de entrada frontal y la del micrófono interno. Desde aquí también podemos ajustar los niveles de entrada.

Pantalla de configuración del sonido en Ubuntu

 

 

Gráficos Estadísticos con jqPlot

En aplicaciones en los que introducimos una gran cantidad de datos, lo más lógico será posteriormente explotar esos datos y obtener estadísticas e informes. En este post presento jqPlot, una librería jQuery para generar gráficos estadísticos interactivos.

En aplicaciones en los que introducimos una gran cantidad de datos, lo más lógico será posteriormente explotar esos datos y obtener estadísticas e informes. En estos casos los datos obtenidos se visualizan de una manera óptima en gráficas que nos ayudan representar visualmente la gran cantidad de datos que en muchos casos hemos obtenido. Una manera fácil de generar gráficos estadísticos en aplicaciones web es utilizar javascript para mostrarlas en tiempo de ejecución.

La opción que utilizo para generar gráficas pasa por jQuery junto con jqPlot. Se trata de un plugin jQuery que genera gráficos estadísticos en el navegador dentro de tus páginas web. Soporta gráficas lineales, de barras y circulares (en forma de tarta). Tiene numerosas opciones de configuración como la inclusión de sombras y la interacción con eventos drag&drop. jqPlot ha sido probado en IE7, IE8 o superior, Firefox, Chrome, Safari y Opera. La licencia de uso es MIT y GPL versión 2, por lo que podemos utilizarlo libremente de forma gratuita en nuestros proyectos. Requiere jQuery (1.4.3 o superior para algunas características), la cual está incluida en la distribución.

Uso de la librería

Antes de nada debemos descargar jqPlot y lo podemos hacer desde la sección de descargas de la página del proyecto: http://www.bitbucket.org/cleonello/jqplot/

Para usar jqPlot debes incluir en tu página web: jquery, jqPlot, el fichero css de jqPlot y opcionalmente, el script excanvas para que tu página soporte canvas en Internet Explorer (esta característica HTML5 no la soportan las versiones de IE anteriores a la versión 9. Si es superior no es necesario incluir excanvas):

<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
<script language="javascript" type="text/javascript" src="jquery.min.js"></script>
<script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
<link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />

Lo siguiente es añadir el contenedor de la gráfica. Se trata de una capa a la que podemos darle si deseamos un ancho y un alto. Lo que es obligatorio es indicar un id.

<div id="chartdiv" style="height:400px;width:300px; "></div>

Creamos la gráfica llamando a la función jqplot, con dos parámetros obligatorios, el id de la capa contenedora y un array con los datos, normalmente enviados por el servidor y obtenidos desde base de datos. La invocación al método suele realizarse cuando la página está preparada:

<script type="text/javascript">
  <!--
  $(document).ready(function() {
    $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);
  });
  -->
</script>

Esto generará una gráfica como la siguiente:

Gráfica lineal

Opciones de jqPlot

Podemos personalizar la gráfica pasando parámetros a la función como tercer parámetro, de la forma:

$.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
{ title:'Exponential Line',
  axes:{yaxis:{min:-10, max:240}},
  series:[{color:'#5FAB78'}]
});

Todas las opciones disponibles están descritas en el fichero jqPlotOptions.txt de la distribución.

Dependiendo de las características y de lo complejo que queramos que sea nuestra gráfica es posible que necesitemos incluir en nuestra página enlaces a otros plugins que se incluyen el la distribución jqPlot. Hay plugins para personalizar el renderizado de gráficas de barras con varias series, para personalizar la leyenda, las etiquetas en los ejes, etc:

<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="js/jqplot/excanvas.min.js"></script><![endif]-->
<script type="text/javascript" src="js/jqplot/jquery.jqplot.min.js"></script>

<script type="text/javascript" src="js/jqplot/jqplot.pieRenderer.min.js"></script>    
<script type="text/javascript" src="js/jqplot/jqplot.barRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/jqplot.categoryAxisRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/jqplot.pointLabels.min.js"></script>
<script type="text/javascript" src="js/jqplot/jqplot.enhancedLegendRenderer.min.js"></script>

<link rel="stylesheet" type="text/css" href="css/jqplot/jquery.jqplot.css" />

Ejemplos

En el siguiente enlace se puede ver la librería en funcionamiento con varios ejemplos. A continuación algunas imágenes con diferentes tipos de gráficas:

Gráficas lineales: http://www.jqplot.com/tests/line-charts.php Gráfica lineal

Gráficas circulares: http://www.jqplot.com/tests/pie-donut-charts.phppiechart

Gráficas de barras: http://www.jqplot.com/tests/bar-charts.phpbarchart

Ni que decir tiene que jqPlot no es la única librería jQuery para la generación de gráficos estadísticos. A continuación os dejo dos enlaces a páginas dónde se enumeran varias alternativas: